From d8c82ad3a25ad12a75e7505d65ffc86cac5f0fb4 Mon Sep 17 00:00:00 2001 From: Eiji Date: Thu, 5 Sep 2024 10:40:40 +0900 Subject: [PATCH 001/459] Fix to accept volume status with no ARC connection Now initiated ARC connection is required to accept volume status of AVR, but accepting it should not depend on audio output path; ARC nor eARC Remove dependency on ARC. Bug: 364806355 Change-Id: I1244991319dfc0d24c0c874a5bdcbc3b61b460a7 --- .../core/java/com/android/server/hdmi/HdmiControlService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java index d5f8eadcf805..0aab6b3b11a1 100644 --- a/services/core/java/com/android/server/hdmi/HdmiControlService.java +++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java @@ -1890,7 +1890,6 @@ public class HdmiControlService extends SystemService { void setAudioStatus(boolean mute, int volume) { if (!isTvDeviceEnabled() || !tv().isSystemAudioActivated() - || !tv().isArcEstablished() // Don't update TV volume when SAM is on and ARC is off || getHdmiCecVolumeControl() == HdmiControlManager.VOLUME_CONTROL_DISABLED) { return; -- GitLab From 1bd4403fd895a03c9033aa5743dc8b77c6887727 Mon Sep 17 00:00:00 2001 From: Azhara Assanova Date: Thu, 26 Sep 2024 16:34:38 +0000 Subject: [PATCH 002/459] Update exemptAidlInterfaces There were two new AIDL interfaces added between updating the set and the prebuilt. Bug: 366207898 Test: treehugger Change-Id: Iaa57517821bc4355b77696724deaad7b00979644 --- .../java/com/google/android/lint/aidl/ExemptAidlInterfaces.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/ExemptAidlInterfaces.kt b/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/ExemptAidlInterfaces.kt index caa018d8c013..e163ef470355 100644 --- a/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/ExemptAidlInterfaces.kt +++ b/tools/lint/global/checks/src/main/java/com/google/android/lint/aidl/ExemptAidlInterfaces.kt @@ -485,6 +485,7 @@ val exemptAidlInterfaces = setOf( "android.net.thread.IConfigurationReceiver", "android.net.thread.IOperationalDatasetCallback", "android.net.thread.IOperationReceiver", + "android.net.thread.IOutputReceiver", "android.net.thread.IStateCallback", "android.net.thread.IThreadNetworkController", "android.net.thread.IThreadNetworkManager", @@ -757,6 +758,7 @@ val exemptAidlInterfaces = setOf( "com.android.server.thread.openthread.IChannelMasksReceiver", "com.android.server.thread.openthread.INsdPublisher", "com.android.server.thread.openthread.IOtDaemonCallback", + "com.android.server.thread.openthread.IOtOutputReceiver", "com.android.server.thread.openthread.IOtStatusReceiver", "com.google.android.clockwork.ambient.offload.IDisplayOffloadService", "com.google.android.clockwork.ambient.offload.IDisplayOffloadTransitionFinishedCallbacks", -- GitLab From 4bd85691bcd7a687be67874860f695c538f649b6 Mon Sep 17 00:00:00 2001 From: Ahmad Khalil Date: Sat, 28 Sep 2024 21:18:16 +0000 Subject: [PATCH 003/459] Update envelope effects dependencies To support envelope effects, the device will now need to support both frequency control and PWLE V2 effects. Bug: 347034419 Flag: android.os.vibrator.normalized_pwle_effects Test: atest VibratorInfoTest Change-Id: I226d2f43ab09baea470cf95d9ecbc6c3ea05105f --- core/java/android/os/VibratorInfo.java | 7 +++---- core/tests/vibrator/src/android/os/VibratorInfoTest.java | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/core/java/android/os/VibratorInfo.java b/core/java/android/os/VibratorInfo.java index 5378295e3720..4f03ac999c7e 100644 --- a/core/java/android/os/VibratorInfo.java +++ b/core/java/android/os/VibratorInfo.java @@ -291,9 +291,7 @@ public class VibratorInfo implements Parcelable { * @return True if the hardware can control the frequency of the vibrations, otherwise false. */ public boolean hasFrequencyControl() { - // We currently can only control frequency of the vibration using the compose PWLE method. - return hasCapability( - IVibrator.CAP_FREQUENCY_CONTROL | IVibrator.CAP_COMPOSE_PWLE_EFFECTS); + return hasCapability(IVibrator.CAP_FREQUENCY_CONTROL); } /** @@ -456,7 +454,8 @@ public class VibratorInfo implements Parcelable { * @return True if the hardware supports creating envelope effects, false otherwise. */ public boolean areEnvelopeEffectsSupported() { - return hasCapability(IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2); + return hasCapability( + IVibrator.CAP_FREQUENCY_CONTROL | IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2); } /** diff --git a/core/tests/vibrator/src/android/os/VibratorInfoTest.java b/core/tests/vibrator/src/android/os/VibratorInfoTest.java index c81081075859..79faf15f1312 100644 --- a/core/tests/vibrator/src/android/os/VibratorInfoTest.java +++ b/core/tests/vibrator/src/android/os/VibratorInfoTest.java @@ -61,8 +61,7 @@ public class VibratorInfoTest { VibratorInfo noCapabilities = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build(); assertFalse(noCapabilities.hasFrequencyControl()); VibratorInfo composeAndFrequencyControl = new VibratorInfo.Builder(TEST_VIBRATOR_ID) - .setCapabilities( - IVibrator.CAP_FREQUENCY_CONTROL | IVibrator.CAP_COMPOSE_PWLE_EFFECTS) + .setCapabilities(IVibrator.CAP_FREQUENCY_CONTROL) .build(); assertTrue(composeAndFrequencyControl.hasFrequencyControl()); } @@ -143,7 +142,8 @@ public class VibratorInfoTest { VibratorInfo noCapabilities = new VibratorInfo.Builder(TEST_VIBRATOR_ID).build(); assertFalse(noCapabilities.areEnvelopeEffectsSupported()); VibratorInfo envelopeEffectCapability = new VibratorInfo.Builder(TEST_VIBRATOR_ID) - .setCapabilities(IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2) + .setCapabilities( + IVibrator.CAP_FREQUENCY_CONTROL | IVibrator.CAP_COMPOSE_PWLE_EFFECTS_V2) .build(); assertTrue(envelopeEffectCapability.areEnvelopeEffectsSupported()); } -- GitLab From 7d6e19ba095bbd67555218bf039634e883e91439 Mon Sep 17 00:00:00 2001 From: grekit1024 Date: Wed, 25 Sep 2024 17:10:50 +0800 Subject: [PATCH 004/459] [gps] add debug log when package reset add debug log with registration information when package reset Test: done bug:369508236 Change-Id: Ife087e0010777d6c6d98733751e322d8f519dc1a Signed-off-by: grekit1024 --- .../server/location/provider/LocationProviderManager.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/location/provider/LocationProviderManager.java b/services/core/java/com/android/server/location/provider/LocationProviderManager.java index 542a29ae4172..4a9bf88aae33 100644 --- a/services/core/java/com/android/server/location/provider/LocationProviderManager.java +++ b/services/core/java/com/android/server/location/provider/LocationProviderManager.java @@ -2584,6 +2584,9 @@ public class LocationProviderManager extends registration -> { if (registration.getIdentity().getPackageName().equals( packageName)) { + if (D) { + Log.d(TAG, "package reset remove registration " + registration); + } registration.remove(); } -- GitLab From e685cf0a2a0684a7c6ff4cc76c6ba7d39fd45058 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 23 Nov 2023 07:35:46 +0000 Subject: [PATCH 005/459] Add the ability to adjust the timing animation end listener No behavior change unless someone enables this. Originally, when calling onAnimationEnd, the listeners are called before drawing the last animation frame. If the listener is slow, there may have jank at the end of animation. If setPostNotifyEndListenerEnabled is enabled, the most common animators: ValueAnimator and AnimatorSet will run the end listeners on the next frame of last animation frame. So the implementation of callback won't delay the animation frame. Also make FrameTracker exclude the frame of end callback from jank data if it is the frame after the last animation frame. Bug: 300035126 Flag: EXEMPT disabled by default Test: atest FrameworksCoreTests:FrameTrackerTest# \ testEndAnimationWithLastFrameSyncId atest FrameworksCoreTests:ValueAnimatorTests# \ testPostNotifyEndListener Change-Id: I0550d951c65fe0e03e81bce883b3b33a796ae532 --- .../android/animation/AnimationHandler.java | 52 +++++++++++++++++++ core/java/android/animation/Animator.java | 39 ++++++++++++++ core/java/android/animation/AnimatorSet.java | 9 +++- .../java/android/animation/ValueAnimator.java | 13 +++-- .../android/internal/jank/FrameTracker.java | 4 +- .../android/animation/ValueAnimatorTests.java | 30 +++++++++++ .../internal/jank/FrameTrackerTest.java | 41 +++++++++++++++ 7 files changed, 183 insertions(+), 5 deletions(-) diff --git a/core/java/android/animation/AnimationHandler.java b/core/java/android/animation/AnimationHandler.java index 4fc90ae9d22c..d84a4c12a2cd 100644 --- a/core/java/android/animation/AnimationHandler.java +++ b/core/java/android/animation/AnimationHandler.java @@ -81,6 +81,25 @@ public class AnimationHandler { */ private final ArrayList> mAnimatorRequestors = new ArrayList<>(); + /** + * The callbacks which will invoke {@link Animator#notifyEndListeners(boolean)} on next frame. + * It is only used if {@link Animator#setPostNotifyEndListenerEnabled(boolean)} sets true. + */ + private ArrayList mPendingEndAnimationListeners; + + /** + * The value of {@link Choreographer#getVsyncId()} at the last animation frame. + * It is only used if {@link Animator#setPostNotifyEndListenerEnabled(boolean)} sets true. + */ + private long mLastAnimationFrameVsyncId; + + /** + * The value of {@link Choreographer#getVsyncId()} when calling + * {@link Animator#notifyEndListeners(boolean)}. + * It is only used if {@link Animator#setPostNotifyEndListenerEnabled(boolean)} sets true. + */ + private long mEndAnimationFrameVsyncId; + private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() { @Override public void doFrame(long frameTimeNanos) { @@ -332,6 +351,39 @@ public class AnimationHandler { } } + /** + * Returns the vsyncId of last animation frame if the given {@param currentVsyncId} matches + * the vsyncId from the end callback of animation. Otherwise it returns the given vsyncId. + * It only takes effect if {@link #postEndAnimationCallback(Runnable)} is called. + */ + public long getLastAnimationFrameVsyncId(long currentVsyncId) { + return currentVsyncId == mEndAnimationFrameVsyncId && mLastAnimationFrameVsyncId != 0 + ? mLastAnimationFrameVsyncId : currentVsyncId; + } + + /** Runs the given callback on next frame to notify the end of the animation. */ + public void postEndAnimationCallback(Runnable notifyEndAnimation) { + if (mPendingEndAnimationListeners == null) { + mPendingEndAnimationListeners = new ArrayList<>(); + } + mPendingEndAnimationListeners.add(notifyEndAnimation); + if (mPendingEndAnimationListeners.size() > 1) { + return; + } + final Choreographer choreographer = Choreographer.getInstance(); + mLastAnimationFrameVsyncId = choreographer.getVsyncId(); + getProvider().postFrameCallback(frame -> { + mEndAnimationFrameVsyncId = choreographer.getVsyncId(); + // The animation listeners can only get vsyncId of last animation frame in this frame + // by getLastAnimationFrameVsyncId(currentVsyncId). + while (mPendingEndAnimationListeners.size() > 0) { + mPendingEndAnimationListeners.remove(0).run(); + } + mEndAnimationFrameVsyncId = 0; + mLastAnimationFrameVsyncId = 0; + }); + } + private void doAnimationFrame(long frameTime) { long currentTime = SystemClock.uptimeMillis(); final int size = mAnimationCallbacks.size(); diff --git a/core/java/android/animation/Animator.java b/core/java/android/animation/Animator.java index c58624e9dfab..d1eb8e8fa2ff 100644 --- a/core/java/android/animation/Animator.java +++ b/core/java/android/animation/Animator.java @@ -16,6 +16,7 @@ package android.animation; +import android.annotation.CallSuper; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; @@ -23,6 +24,7 @@ import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo.Config; import android.content.res.ConstantState; import android.os.Build; +import android.os.Trace; import android.util.LongArray; import java.util.ArrayList; @@ -72,6 +74,13 @@ public abstract class Animator implements Cloneable { */ private static long sBackgroundPauseDelay = 1000; + /** + * If true, when the animation plays normally to the end, the callback + * {@link AnimatorListener#onAnimationEnd(Animator)} will be scheduled on the next frame. + * It is to avoid the last animation frame being delayed by the implementation of listeners. + */ + static boolean sPostNotifyEndListenerEnabled; + /** * A cache of the values in a list. Used so that when calling the list, we have a copy * of it in case the list is modified while iterating. The array can be reused to avoid @@ -123,6 +132,14 @@ public abstract class Animator implements Cloneable { AnimationHandler.setOverrideAnimatorPausingSystemProperty(!enable); } + /** + * @see #sPostNotifyEndListenerEnabled + * @hide + */ + public static void setPostNotifyEndListenerEnabled(boolean enable) { + sPostNotifyEndListenerEnabled = enable; + } + /** * Starts this animation. If the animation has a nonzero startDelay, the animation will start * running after that delay elapses. A non-delayed animation will have its initial @@ -635,6 +652,28 @@ public abstract class Animator implements Cloneable { } } + void notifyEndListenersFromEndAnimation(boolean isReversing, boolean postNotifyEndListener) { + if (postNotifyEndListener) { + AnimationHandler.getInstance().postEndAnimationCallback( + () -> completeEndAnimation(isReversing, "postNotifyAnimEnd")); + } else { + completeEndAnimation(isReversing, "notifyAnimEnd"); + } + } + + @CallSuper + void completeEndAnimation(boolean isReversing, String notifyListenerTraceName) { + final boolean useTrace = mListeners != null && Trace.isTagEnabled(Trace.TRACE_TAG_VIEW); + if (useTrace) { + Trace.traceBegin(Trace.TRACE_TAG_VIEW, notifyListenerTraceName + + "-" + getClass().getSimpleName()); + } + notifyEndListeners(isReversing); + if (useTrace) { + Trace.traceEnd(Trace.TRACE_TAG_VIEW); + } + } + /** * Calls call for every item in list with animator and * isReverse as parameters. diff --git a/core/java/android/animation/AnimatorSet.java b/core/java/android/animation/AnimatorSet.java index ac3711366ec7..76098db2dc5b 100644 --- a/core/java/android/animation/AnimatorSet.java +++ b/core/java/android/animation/AnimatorSet.java @@ -1442,6 +1442,8 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim } private void endAnimation() { + final boolean postNotifyEndListener = sPostNotifyEndListenerEnabled && mListeners != null + && mLastFrameTime > 0; mStarted = false; mLastFrameTime = -1; mFirstFrame = -1; @@ -1453,7 +1455,12 @@ public final class AnimatorSet extends Animator implements AnimationHandler.Anim // No longer receive callbacks removeAnimationCallback(); - notifyEndListeners(mReversing); + notifyEndListenersFromEndAnimation(mReversing, postNotifyEndListener); + } + + @Override + void completeEndAnimation(boolean isReversing, String notifyListenerTraceName) { + super.completeEndAnimation(isReversing, notifyListenerTraceName); removeAnimationEndListener(); mSelfPulse = true; mReversing = false; diff --git a/core/java/android/animation/ValueAnimator.java b/core/java/android/animation/ValueAnimator.java index 5de7f387b206..e849abaf4aec 100644 --- a/core/java/android/animation/ValueAnimator.java +++ b/core/java/android/animation/ValueAnimator.java @@ -1289,6 +1289,8 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio if (mAnimationEndRequested) { return; } + final boolean postNotifyEndListener = sPostNotifyEndListenerEnabled && mListeners != null + && mLastFrameTime > 0; removeAnimationCallback(); mAnimationEndRequested = true; @@ -1303,15 +1305,20 @@ public class ValueAnimator extends Animator implements AnimationHandler.Animatio mStartTime = -1; mRunning = false; mStarted = false; - notifyEndListeners(mReversing); - // mReversing needs to be reset *after* notifying the listeners for the end callbacks. - mReversing = false; + notifyEndListenersFromEndAnimation(mReversing, postNotifyEndListener); if (Trace.isTagEnabled(Trace.TRACE_TAG_VIEW)) { Trace.asyncTraceEnd(Trace.TRACE_TAG_VIEW, getNameForTrace(), System.identityHashCode(this)); } } + @Override + void completeEndAnimation(boolean isReversing, String notifyListenerTraceName) { + super.completeEndAnimation(isReversing, notifyListenerTraceName); + // mReversing needs to be reset *after* notifying the listeners for the end callbacks. + mReversing = false; + } + /** * Called internally to start an animation by adding it to the active animations list. Must be * called on the UI thread. diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index d474c6db4f02..6448f10f01b9 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -30,6 +30,7 @@ import static com.android.internal.jank.InteractionJankMonitor.ACTION_SESSION_CA import static com.android.internal.jank.InteractionJankMonitor.ACTION_SESSION_END; import static com.android.internal.jank.InteractionJankMonitor.EXECUTOR_TASK_TIMEOUT; +import android.animation.AnimationHandler; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -344,7 +345,8 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai @UiThread public boolean end(@Reasons int reason) { if (mCancelled || mEndVsyncId != INVALID_ID) return false; - mEndVsyncId = mChoreographer.getVsyncId(); + mEndVsyncId = AnimationHandler.getInstance().getLastAnimationFrameVsyncId( + mChoreographer.getVsyncId()); // Cancel the session if: // 1. The session begins and ends at the same vsync id. // 2. The session never begun. diff --git a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java index eb463fd9a76b..04698465e971 100644 --- a/core/tests/coretests/src/android/animation/ValueAnimatorTests.java +++ b/core/tests/coretests/src/android/animation/ValueAnimatorTests.java @@ -18,6 +18,8 @@ package android.animation; import static android.test.MoreAsserts.assertNotEqual; +import static com.google.common.truth.Truth.assertThat; + import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; @@ -891,6 +893,34 @@ public class ValueAnimatorTests { }); } + @Test + public void testPostNotifyEndListener() throws Throwable { + ValueAnimator.setPostNotifyEndListenerEnabled(true); + final CountDownLatch latch = new CountDownLatch(1); + final long[] lastAnimFrameId = new long[1]; + final long[] endAnimCallbackId = new long[1]; + try { + a1.addUpdateListener(animator -> { + if (animator.getAnimatedFraction() == 1f) { + lastAnimFrameId[0] = Choreographer.getInstance().getVsyncId(); + } + }); + a1.addListener(new MyListener() { + @Override + public void onAnimationEnd(Animator animation) { + super.onAnimationEnd(animation); + endAnimCallbackId[0] = Choreographer.getInstance().getVsyncId(); + latch.countDown(); + } + }); + mActivityRule.runOnUiThread(() -> a1.start()); + assertTrue(latch.await(1, TimeUnit.SECONDS)); + assertThat(endAnimCallbackId[0]).isGreaterThan(lastAnimFrameId[0]); + } finally { + ValueAnimator.setPostNotifyEndListenerEnabled(false); + } + } + @Test public void testZeroDuration() throws Throwable { // Run two animators with zero duration, with one running forward and the other one diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index c3a5b19c9442..1cbc7d6d3f98 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -40,7 +40,10 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.animation.AnimationHandler; +import android.os.ConditionVariable; import android.os.Handler; +import android.view.Choreographer; import android.view.FrameMetrics; import android.view.SurfaceControl; import android.view.SurfaceControl.JankData; @@ -575,6 +578,44 @@ public class FrameTrackerTest { eq(0L) /* maxSuccessiveMissedFramesCount */); } + @Test + public void testEndAnimationWithLastFrameSyncId() { + final long[] expectedLastAnimationFrameVsyncId = { 0 }; + final long[] lastAnimationFrameVsyncId = { 0 }; + final long[] endAnimationVsyncId = { 0 }; + final ConditionVariable condition = new ConditionVariable(); + final FrameTracker tracker = spyFrameTracker(/* surfaceOnly= */ false); + mActivity.runOnUiThread(() -> { + final AnimationHandler animationHandler = AnimationHandler.getInstance(); + final Choreographer realChoreographer = Choreographer.getInstance(); + // 3 v-sync ids: + // 1. Begin mocked vsyncId = 0 + // 2. Current real vsyncId = last animation frame + // 3. Posted real vsyncId = end animation + when(mChoreographer.getVsyncId()).thenReturn(0L); + tracker.begin(); + mRunnableArgumentCaptor.getValue().run(); + when(mChoreographer.getVsyncId()).thenAnswer(a -> realChoreographer.getVsyncId()); + expectedLastAnimationFrameVsyncId[0] = realChoreographer.getVsyncId(); + // Simulate ending multiple animators. Their callbacks should run in a batch. + animationHandler.postEndAnimationCallback(() -> { + endAnimationVsyncId[0] = realChoreographer.getVsyncId(); + lastAnimationFrameVsyncId[0] = + animationHandler.getLastAnimationFrameVsyncId(endAnimationVsyncId[0]); + }); + animationHandler.postEndAnimationCallback(() -> { + tracker.end(FrameTracker.REASON_END_NORMAL); + condition.open(); + }); + }); + + condition.block(1000L /* timeoutMs */); + assertThat(lastAnimationFrameVsyncId[0]).isEqualTo(expectedLastAnimationFrameVsyncId[0]); + assertThat(endAnimationVsyncId[0]).isGreaterThan(lastAnimationFrameVsyncId[0]); + // Verifies that FrameTracker#mEndVsyncId uses the vsyncId from AnimationHandler. + verify(mJankStatsRegistration).removeAfter(eq(lastAnimationFrameVsyncId[0])); + } + @Test public void testMaxSuccessiveMissedFramesCount() { FrameTracker tracker = spyFrameTracker(/* surfaceOnly= */ true); -- GitLab From 955da7239e6ec26b86a6e8469641a1931e4b99b0 Mon Sep 17 00:00:00 2001 From: Behnam Heydarshahi Date: Fri, 27 Sep 2024 22:21:08 +0000 Subject: [PATCH 006/459] Make shutdown text visible when wallpaper is white The shutdown background was black. The wallpaper was white but hidden. The shutdown text was trying to match wallpaper, so black was chosen, which caused the text to be invisible. This CL solves that issue by setting text color to global_actions_shutdown_ui_text. Also this CL removes the code to blur the background because its alpha has been set to 1 for a while now. Bug: 193831592 Flag: EXEMPT resource only update Test: atest ShutdownUiTest Change-Id: I375beec37c26ce534cb4a5b9752acf5e40082aac --- .../globalactions/ShutdownUiTest.java | 32 +++++++++++++-- .../systemui/globalactions/ShutdownUi.java | 39 ++++++------------- 2 files changed, 39 insertions(+), 32 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/globalactions/ShutdownUiTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/globalactions/ShutdownUiTest.java index 73509e2da520..acc17e73ac69 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/globalactions/ShutdownUiTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/globalactions/ShutdownUiTest.java @@ -19,20 +19,25 @@ package com.android.systemui.globalactions; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.content.res.Resources; import android.nearby.NearbyManager; import android.net.platform.flags.Flags; import android.os.PowerManager; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; +import android.testing.TestableLooper; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.R; import com.android.systemui.SysuiTestCase; -import com.android.systemui.statusbar.BlurUtils; import org.junit.Before; import org.junit.Test; @@ -46,14 +51,13 @@ public class ShutdownUiTest extends SysuiTestCase { ShutdownUi mShutdownUi; @Mock - BlurUtils mBlurUtils; - @Mock NearbyManager mNearbyManager; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - mShutdownUi = new ShutdownUi(getContext(), mBlurUtils, mNearbyManager); + mContext = spy(mContext); + mShutdownUi = new ShutdownUi(mContext, mNearbyManager); } @Test @@ -140,4 +144,24 @@ public class ShutdownUiTest extends SysuiTestCase { assertEquals(actualLayout, expectedLayout); } + /** + * Main looper required here because showShutdown UI creates a dialog which instantiates a + * handler that needs to be on the main thread. + */ + @TestableLooper.RunWithLooper(setAsMainLooper = true) + @Test + public void showShutdownUi_loadsShutdownTextColorAndAlpha() { + this.allowTestableLooperAsMainThread(); + + Resources mockResources = spy(mContext.getResources()); + when(mContext.getResources()).thenReturn(mockResources); + + mShutdownUi.showShutdownUi(false, "test"); + + verify(mockResources).getFloat( + eq(com.android.systemui.res.R.dimen.shutdown_scrim_behind_alpha)); + verify(mockResources).getColor( + eq(com.android.systemui.res.R.color.global_actions_shutdown_ui_text), + any()); + } } diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/ShutdownUi.java b/packages/SystemUI/src/com/android/systemui/globalactions/ShutdownUi.java index ccd69ca55f0c..4599afa66407 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/ShutdownUi.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/ShutdownUi.java @@ -36,10 +36,7 @@ import android.widget.TextView; import androidx.annotation.VisibleForTesting; import com.android.internal.R; -import com.android.settingslib.Utils; import com.android.systemui.scrim.ScrimDrawable; -import com.android.systemui.statusbar.BlurUtils; -import com.android.systemui.statusbar.phone.ScrimController; import javax.inject.Inject; @@ -49,13 +46,11 @@ import javax.inject.Inject; public class ShutdownUi { private Context mContext; - private BlurUtils mBlurUtils; private NearbyManager mNearbyManager; @Inject - public ShutdownUi(Context context, BlurUtils blurUtils, NearbyManager nearbyManager) { + public ShutdownUi(Context context, NearbyManager nearbyManager) { mContext = context; - mBlurUtils = blurUtils; mNearbyManager = nearbyManager; } @@ -63,25 +58,17 @@ public class ShutdownUi { * Display the shutdown UI. * @param isReboot Whether the device will be rebooting after this shutdown. * @param reason Cause for the shutdown. + * @return Shutdown dialog. */ - public void showShutdownUi(boolean isReboot, String reason) { + public Dialog showShutdownUi(boolean isReboot, String reason) { ScrimDrawable background = new ScrimDrawable(); final Dialog d = new Dialog(mContext, com.android.systemui.res.R.style.Theme_SystemUI_Dialog_GlobalActions); - d.setOnShowListener(dialog -> { - if (mBlurUtils.supportsBlursOnWindows()) { - int backgroundAlpha = (int) (ScrimController.BUSY_SCRIM_ALPHA * 255); - background.setAlpha(backgroundAlpha); - mBlurUtils.applyBlur(d.getWindow().getDecorView().getViewRootImpl(), - (int) mBlurUtils.blurRadiusOfRatio(1), backgroundAlpha == 255); - } else { - float backgroundAlpha = mContext.getResources().getFloat( - com.android.systemui.res.R.dimen.shutdown_scrim_behind_alpha); - background.setAlpha((int) (backgroundAlpha * 255)); - } - }); + float backgroundAlpha = mContext.getResources().getFloat( + com.android.systemui.res.R.dimen.shutdown_scrim_behind_alpha); + background.setAlpha((int) (backgroundAlpha * 255)); // Window initialization Window window = d.getWindow(); @@ -110,14 +97,9 @@ public class ShutdownUi { d.setContentView(getShutdownDialogContent(isReboot)); d.setCancelable(false); - int color; - if (mBlurUtils.supportsBlursOnWindows()) { - color = Utils.getColorAttrDefaultColor(mContext, - com.android.systemui.res.R.attr.wallpaperTextColor); - } else { - color = mContext.getResources().getColor( - com.android.systemui.res.R.color.global_actions_shutdown_ui_text); - } + int color = mContext.getResources().getColor( + com.android.systemui.res.R.color.global_actions_shutdown_ui_text, + mContext.getTheme()); ProgressBar bar = d.findViewById(R.id.progress); bar.getIndeterminateDrawable().setTint(color); @@ -136,6 +118,8 @@ public class ShutdownUi { } d.show(); + + return d; } /** @@ -162,7 +146,6 @@ public class ShutdownUi { } } - @StringRes @VisibleForTesting int getRebootMessage(boolean isReboot, @Nullable String reason) { if (reason != null && reason.startsWith(PowerManager.REBOOT_RECOVERY_UPDATE)) { -- GitLab From 8e5ff988fc6ba7e9120b9c2039e31c7bb04a6588 Mon Sep 17 00:00:00 2001 From: Yu-Ting Tseng Date: Fri, 4 Oct 2024 11:22:15 -0700 Subject: [PATCH 007/459] Make libprotoutil available to uprobestats apex Flag: build.RELEASE_UPROBESTATS_MODULE Bug: 355315669 Test: m Change-Id: I337a3d68e1616f41ed8403801111d2b5e9056b70 --- libs/protoutil/Android.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/protoutil/Android.bp b/libs/protoutil/Android.bp index 28856c87f7c6..8af4b7e8f4c8 100644 --- a/libs/protoutil/Android.bp +++ b/libs/protoutil/Android.bp @@ -60,6 +60,7 @@ cc_library { "//apex_available:platform", "com.android.os.statsd", "test_com.android.os.statsd", + "com.android.uprobestats", ], } -- GitLab From d25f347307eb87243ad8ad1f07cee777be16b2c0 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 26 Sep 2024 16:11:31 +0800 Subject: [PATCH 008/459] Apply top scheduling group for non-occluded freeform app Give a higher priority if the freeform task of an app is almost not occluded by other freeform task. Assume 3 freeform tasks: The top 2 tasks will have top shed group. If the 3rd task is not occluded by the top 2 tasks, the 3rd task will also have top shed group. But if the area of 3rd task has 10% area occluded by the top 2 tasks, its shed group will down to multi-window. Bug: 200769420 Test: atest RootWindowContainerTests#testTaskLayerRankFreeform Test: Resize/move freeform and check adb shell dumpsys activity oom | grep TOP Flag: com.android.window.flags.process_priority_policy_for_multi_window_mode Change-Id: If9510f83ccb16e59dcad9cef5f94792711d7cfa0 --- .../server/wm/ActivityTaskSupervisor.java | 13 ++++- .../server/wm/RootWindowContainer.java | 56 +++++++++++++++++-- .../core/java/com/android/server/wm/Task.java | 29 ++++++++++ .../server/wm/WindowProcessController.java | 11 +++- .../android/server/wm/utils/RegionUtils.java | 11 ++++ .../server/wm/RootWindowContainerTests.java | 46 +++++++++++++++ 6 files changed, 157 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4f71719006f5..567eca2f639a 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -2572,14 +2572,21 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { wpc.computeProcessActivityState(); } - void computeProcessActivityStateBatch() { + boolean computeProcessActivityStateBatch() { if (mActivityStateChangedProcs.isEmpty()) { - return; + return false; } + boolean changed = false; for (int i = mActivityStateChangedProcs.size() - 1; i >= 0; i--) { - mActivityStateChangedProcs.get(i).computeProcessActivityState(); + final WindowProcessController wpc = mActivityStateChangedProcs.get(i); + final int prevState = wpc.getActivityStateFlags(); + wpc.computeProcessActivityState(); + if (!changed && prevState != wpc.getActivityStateFlags()) { + changed = true; + } } mActivityStateChangedProcs.clear(); + return changed; } /** diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java index 266fdbba0be7..8e81beacbc8f 100644 --- a/services/core/java/com/android/server/wm/RootWindowContainer.java +++ b/services/core/java/com/android/server/wm/RootWindowContainer.java @@ -105,6 +105,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.UserProperties; import android.content.res.Configuration; import android.graphics.Rect; +import android.graphics.Region; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManagerInternal; import android.hardware.power.Mode; @@ -153,6 +154,7 @@ import com.android.server.pm.UserManagerInternal; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.WindowManagerPolicy; import com.android.server.utils.Slogf; +import com.android.server.wm.utils.RegionUtils; import java.io.FileDescriptor; import java.io.PrintWriter; @@ -270,6 +272,8 @@ class RootWindowContainer extends WindowContainer private boolean mTaskLayersChanged = true; private int mTmpTaskLayerRank; private final RankTaskLayersRunnable mRankTaskLayersRunnable = new RankTaskLayersRunnable(); + private Region mTmpOccludingRegion; + private Region mTmpTaskRegion; private String mDestroyAllActivitiesReason; private final Runnable mDestroyAllActivitiesRunnable = new Runnable() { @@ -2921,6 +2925,11 @@ class RootWindowContainer extends WindowContainer }); } + void invalidateTaskLayersAndUpdateOomAdjIfNeeded() { + mRankTaskLayersRunnable.mCheckUpdateOomAdj = true; + invalidateTaskLayers(); + } + void invalidateTaskLayers() { if (!mTaskLayersChanged) { mTaskLayersChanged = true; @@ -2938,13 +2947,18 @@ class RootWindowContainer extends WindowContainer // Only rank for leaf tasks because the score of activity is based on immediate parent. forAllLeafTasks(task -> { final int oldRank = task.mLayerRank; - final ActivityRecord r = task.topRunningActivityLocked(); - if (r != null && r.isVisibleRequested()) { + final int oldRatio = task.mNonOccludedFreeformAreaRatio; + task.mNonOccludedFreeformAreaRatio = 0; + if (task.isVisibleRequested()) { task.mLayerRank = ++mTmpTaskLayerRank; + if (task.inFreeformWindowingMode()) { + computeNonOccludedFreeformAreaRatio(task); + } } else { task.mLayerRank = Task.LAYER_RANK_INVISIBLE; } - if (task.mLayerRank != oldRank) { + if (task.mLayerRank != oldRank + || task.mNonOccludedFreeformAreaRatio != oldRatio) { task.forAllActivities(activity -> { if (activity.hasProcess()) { mTaskSupervisor.onProcessActivityStateChanged(activity.app, @@ -2953,12 +2967,42 @@ class RootWindowContainer extends WindowContainer }); } }, true /* traverseTopToBottom */); - + if (mTmpOccludingRegion != null) { + mTmpOccludingRegion.setEmpty(); + } + boolean changed = false; if (!mTaskSupervisor.inActivityVisibilityUpdate()) { - mTaskSupervisor.computeProcessActivityStateBatch(); + changed = mTaskSupervisor.computeProcessActivityStateBatch(); + } + if (mRankTaskLayersRunnable.mCheckUpdateOomAdj) { + mRankTaskLayersRunnable.mCheckUpdateOomAdj = false; + if (changed) { + mService.updateOomAdj(); + } } } + /** This method is called for visible freeform task from top to bottom. */ + private void computeNonOccludedFreeformAreaRatio(@NonNull Task task) { + if (!com.android.window.flags.Flags.processPriorityPolicyForMultiWindowMode()) { + return; + } + if (mTmpOccludingRegion == null) { + mTmpOccludingRegion = new Region(); + mTmpTaskRegion = new Region(); + } + final Rect taskBounds = task.getBounds(); + mTmpTaskRegion.set(taskBounds); + // Exclude the area outside the display. + mTmpTaskRegion.op(task.mDisplayContent.getBounds(), Region.Op.INTERSECT); + // Exclude the area covered by the above tasks. + mTmpTaskRegion.op(mTmpOccludingRegion, Region.Op.DIFFERENCE); + task.mNonOccludedFreeformAreaRatio = 100 * RegionUtils.getAreaSize(mTmpTaskRegion) + / (taskBounds.width() * taskBounds.height()); + // Accumulate the occluding region for other visible tasks behind. + mTmpOccludingRegion.op(taskBounds, Region.Op.UNION); + } + void clearOtherAppTimeTrackers(AppTimeTracker except) { forAllActivities(r -> { if (r.appTimeTracker != except) { @@ -3862,6 +3906,8 @@ class RootWindowContainer extends WindowContainer } private class RankTaskLayersRunnable implements Runnable { + boolean mCheckUpdateOomAdj; + @Override public void run() { synchronized (mService.mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 98919d9fd617..6d1d3fb4f3e9 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -432,6 +432,9 @@ class Task extends TaskFragment { // This number will be assigned when we evaluate OOM scores for all visible tasks. int mLayerRank = LAYER_RANK_INVISIBLE; + /** A 0~100 ratio to indicate the percentage of visible area on screen of a freeform task. */ + int mNonOccludedFreeformAreaRatio; + /* Unique identifier for this task. */ final int mTaskId; /* User for which this task was created. */ @@ -1201,6 +1204,28 @@ class Task extends TaskFragment { forAllActivities(ActivityRecord::updateAnimatingActivityRegistry); } + @Override + void onResize() { + super.onResize(); + updateTaskLayerForFreeform(); + } + + @Override + void onMovedByResize() { + super.onMovedByResize(); + updateTaskLayerForFreeform(); + } + + private void updateTaskLayerForFreeform() { + if (!com.android.window.flags.Flags.processPriorityPolicyForMultiWindowMode()) { + return; + } + if (!isVisibleRequested() || !inFreeformWindowingMode()) { + return; + } + mRootWindowContainer.invalidateTaskLayersAndUpdateOomAdjIfNeeded(); + } + @Override @Nullable ActivityRecord getTopResumedActivity() { @@ -5905,6 +5930,10 @@ class Task extends TaskFragment { pw.print(prefix); pw.print(" mLastNonFullscreenBounds="); pw.println(mLastNonFullscreenBounds); } + if (mNonOccludedFreeformAreaRatio != 0) { + pw.print(prefix); pw.print(" mNonOccludedFreeformAreaRatio="); + pw.println(mNonOccludedFreeformAreaRatio); + } if (isLeafTask()) { pw.println(prefix + " isSleeping=" + shouldSleepActivities()); printThisActivity(pw, getTopPausingActivity(), dumpPackage, false, diff --git a/services/core/java/com/android/server/wm/WindowProcessController.java b/services/core/java/com/android/server/wm/WindowProcessController.java index 86adc1944371..ffb9a7143ca7 100644 --- a/services/core/java/com/android/server/wm/WindowProcessController.java +++ b/services/core/java/com/android/server/wm/WindowProcessController.java @@ -121,6 +121,11 @@ public class WindowProcessController extends ConfigurationContainer 0) { @@ -1298,7 +1306,8 @@ public class WindowProcessController extends ConfigurationContainer 1) { - if (minTaskLayer <= 1 + MAX_NUM_PERCEPTIBLE_FREEFORM) { + if (minTaskLayer <= 1 + MAX_NUM_PERCEPTIBLE_FREEFORM + || nonOccludedRatio >= PERCEPTIBLE_FREEFORM_VISIBLE_RATIO) { stateFlags |= ACTIVITY_STATE_FLAG_PERCEPTIBLE_FREEFORM; } else { stateFlags |= ACTIVITY_STATE_FLAG_VISIBLE_MULTI_WINDOW_MODE; diff --git a/services/core/java/com/android/server/wm/utils/RegionUtils.java b/services/core/java/com/android/server/wm/utils/RegionUtils.java index ce7776f270fd..ff23145fc6b9 100644 --- a/services/core/java/com/android/server/wm/utils/RegionUtils.java +++ b/services/core/java/com/android/server/wm/utils/RegionUtils.java @@ -81,4 +81,15 @@ public class RegionUtils { Collections.reverse(rects); rects.forEach(rectConsumer); } + + /** Returns the area size of the region. */ + public static int getAreaSize(Region region) { + final RegionIterator regionIterator = new RegionIterator(region); + int area = 0; + final Rect rect = new Rect(); + while (regionIterator.next(rect)) { + area += rect.width() * rect.height(); + } + return area; + } } diff --git a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java index cf1dcd0515d1..7e8bd38fb6a9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/RootWindowContainerTests.java @@ -284,6 +284,52 @@ public class RootWindowContainerTests extends WindowTestsBase { assertEquals(Task.LAYER_RANK_INVISIBLE, task2.mLayerRank); } + @Test + public void testTaskLayerRankFreeform() { + mSetFlagsRule.enableFlags(com.android.window.flags.Flags + .FLAG_PROCESS_PRIORITY_POLICY_FOR_MULTI_WINDOW_MODE); + final Task[] freeformTasks = new Task[3]; + final WindowProcessController[] processes = new WindowProcessController[3]; + for (int i = 0; i < freeformTasks.length; i++) { + freeformTasks[i] = new TaskBuilder(mSupervisor) + .setWindowingMode(WINDOWING_MODE_FREEFORM).setCreateActivity(true).build(); + final ActivityRecord r = freeformTasks[i].getTopMostActivity(); + r.setState(RESUMED, "test"); + processes[i] = r.app; + } + resizeDisplay(mDisplayContent, 2400, 2000); + // --------- + // | 2 | 1 | + // --------- + // | 0 | | + // --------- + freeformTasks[2].setBounds(0, 0, 1000, 1000); + freeformTasks[1].setBounds(1000, 0, 2000, 1000); + freeformTasks[0].setBounds(0, 1000, 1000, 2000); + mRootWindowContainer.rankTaskLayers(); + assertEquals(1, freeformTasks[2].mLayerRank); + assertEquals(2, freeformTasks[1].mLayerRank); + assertEquals(3, freeformTasks[0].mLayerRank); + assertFalse("Top doesn't need perceptible hint", (processes[2].getActivityStateFlags() + & WindowProcessController.ACTIVITY_STATE_FLAG_PERCEPTIBLE_FREEFORM) != 0); + assertTrue((processes[1].getActivityStateFlags() + & WindowProcessController.ACTIVITY_STATE_FLAG_PERCEPTIBLE_FREEFORM) != 0); + assertTrue((processes[0].getActivityStateFlags() + & WindowProcessController.ACTIVITY_STATE_FLAG_PERCEPTIBLE_FREEFORM) != 0); + + // Make task2 occlude half of task0. + clearInvocations(mAtm); + freeformTasks[2].setBounds(0, 0, 1000, 1500); + waitHandlerIdle(mWm.mH); + // The process of task0 will demote from perceptible to visible. + final int stateFlags0 = processes[0].getActivityStateFlags(); + assertTrue((stateFlags0 + & WindowProcessController.ACTIVITY_STATE_FLAG_VISIBLE_MULTI_WINDOW_MODE) != 0); + assertFalse((stateFlags0 + & WindowProcessController.ACTIVITY_STATE_FLAG_PERCEPTIBLE_FREEFORM) != 0); + verify(mAtm).updateOomAdj(); + } + @Test public void testForceStopPackage() { final Task task = new TaskBuilder(mSupervisor).setCreateActivity(true).build(); -- GitLab From ef9ea0faa26e0ce0ee5e8dc70a663f98e04b0ca0 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 9 Oct 2024 01:50:57 +0000 Subject: [PATCH 009/459] Pass SafeActivityOptions with actual caller for startActivityInTF We clearCallingUid before apply the WCT, but SafeActivityOptions will query the Binder Uid when construct. Update to pass in the actual caller. Flag: EXEMPT bug fix Bug: 369103643 Test: atest WmTests:WindowOrganizerTests# testStartActivityInTaskFragment_checkCallerPermission Merged-In: I873ae576de0bc4a7402c2f522b45853bce48a0c5 Change-Id: I873ae576de0bc4a7402c2f522b45853bce48a0c5 (cherry picked from commit 20c568e77eae5d469cd5e594b644d8645d830dbd) --- .../java/com/android/server/wm/ActivityStartController.java | 5 ++--- .../com/android/server/wm/WindowOrganizerController.java | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 32ed4725b3b4..d51b90ef1ec0 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -39,7 +39,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.UserHandle; import android.provider.Settings; @@ -500,14 +499,14 @@ public class ActivityStartController { * Starts an activity in the TaskFragment. * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in. * @param activityIntent intent to start the activity. - * @param activityOptions ActivityOptions to start the activity with. + * @param activityOptions SafeActivityOptions to start the activity with. * @param resultTo the caller activity * @param callingUid the caller uid * @param callingPid the caller pid * @return the start result. */ int startActivityInTaskFragment(@NonNull TaskFragment taskFragment, - @NonNull Intent activityIntent, @Nullable Bundle activityOptions, + @NonNull Intent activityIntent, @Nullable SafeActivityOptions activityOptions, @Nullable IBinder resultTo, int callingUid, int callingPid, @Nullable IBinder errorCallbackToken) { final ActivityRecord caller = diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 4f4d5967365c..65dce1352ba4 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -722,8 +722,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } final Intent activityIntent = hop.getActivityIntent(); final Bundle activityOptions = hop.getLaunchOptions(); + final SafeActivityOptions safeOptions = + SafeActivityOptions.fromBundle(activityOptions, caller.mPid, caller.mUid); final int result = mService.getActivityStartController() - .startActivityInTaskFragment(tf, activityIntent, activityOptions, + .startActivityInTaskFragment(tf, activityIntent, safeOptions, hop.getCallingActivity(), caller.mUid, caller.mPid, errorCallbackToken); if (!isStartResultSuccessful(result)) { -- GitLab From 703bc57a6fa008fb43d9daddd863525affc44070 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 9 Oct 2024 01:50:57 +0000 Subject: [PATCH 010/459] Pass SafeActivityOptions with actual caller for startActivityInTF We clearCallingUid before apply the WCT, but SafeActivityOptions will query the Binder Uid when construct. Update to pass in the actual caller. Flag: EXEMPT bug fix Bug: 369103643 Test: atest WmTests:WindowOrganizerTests# testStartActivityInTaskFragment_checkCallerPermission Merged-In: I873ae576de0bc4a7402c2f522b45853bce48a0c5 Change-Id: I873ae576de0bc4a7402c2f522b45853bce48a0c5 (cherry picked from commit 20c568e77eae5d469cd5e594b644d8645d830dbd) --- .../java/com/android/server/wm/ActivityStartController.java | 5 ++--- .../com/android/server/wm/WindowOrganizerController.java | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index 39106f61d515..b18b720aaad6 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -42,7 +42,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.UserHandle; import android.provider.Settings; @@ -527,14 +526,14 @@ public class ActivityStartController { * Starts an activity in the TaskFragment. * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in. * @param activityIntent intent to start the activity. - * @param activityOptions ActivityOptions to start the activity with. + * @param activityOptions SafeActivityOptions to start the activity with. * @param resultTo the caller activity * @param callingUid the caller uid * @param callingPid the caller pid * @return the start result. */ int startActivityInTaskFragment(@NonNull TaskFragment taskFragment, - @NonNull Intent activityIntent, @Nullable Bundle activityOptions, + @NonNull Intent activityIntent, @Nullable SafeActivityOptions activityOptions, @Nullable IBinder resultTo, int callingUid, int callingPid, @Nullable IBinder errorCallbackToken) { final ActivityRecord caller = diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 6228050dc583..51a42ca37cdb 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -919,8 +919,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub } final Intent activityIntent = hop.getActivityIntent(); final Bundle activityOptions = hop.getLaunchOptions(); + final SafeActivityOptions safeOptions = + SafeActivityOptions.fromBundle(activityOptions, caller.mPid, caller.mUid); final int result = mService.getActivityStartController() - .startActivityInTaskFragment(tf, activityIntent, activityOptions, + .startActivityInTaskFragment(tf, activityIntent, safeOptions, hop.getCallingActivity(), caller.mUid, caller.mPid, errorCallbackToken); if (!isStartResultSuccessful(result)) { -- GitLab From 198f7b559f9a13d5b9d26b41c6b95bc1e45fcb1e Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 9 Oct 2024 01:50:57 +0000 Subject: [PATCH 011/459] Pass SafeActivityOptions with actual caller for startActivityInTF We clearCallingUid before apply the WCT, but SafeActivityOptions will query the Binder Uid when construct. Update to pass in the actual caller. Flag: EXEMPT bug fix Bug: 369103643 Test: atest WmTests:WindowOrganizerTests# testStartActivityInTaskFragment_checkCallerPermission Merged-In: I873ae576de0bc4a7402c2f522b45853bce48a0c5 Change-Id: I873ae576de0bc4a7402c2f522b45853bce48a0c5 (cherry picked from commit 20c568e77eae5d469cd5e594b644d8645d830dbd) --- .../java/com/android/server/wm/ActivityStartController.java | 5 ++--- .../com/android/server/wm/WindowOrganizerController.java | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index a6e50405e7d9..4de02f7f812f 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -43,7 +43,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.Trace; import android.os.UserHandle; @@ -529,14 +528,14 @@ public class ActivityStartController { * Starts an activity in the TaskFragment. * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in. * @param activityIntent intent to start the activity. - * @param activityOptions ActivityOptions to start the activity with. + * @param activityOptions SafeActivityOptions to start the activity with. * @param resultTo the caller activity * @param callingUid the caller uid * @param callingPid the caller pid * @return the start result. */ int startActivityInTaskFragment(@NonNull TaskFragment taskFragment, - @NonNull Intent activityIntent, @Nullable Bundle activityOptions, + @NonNull Intent activityIntent, @Nullable SafeActivityOptions activityOptions, @Nullable IBinder resultTo, int callingUid, int callingPid, @Nullable IBinder errorCallbackToken) { final ActivityRecord caller = diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 027ab97693fd..7b59d6fbd820 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1189,8 +1189,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub final IBinder callerActivityToken = operation.getActivityToken(); final Intent activityIntent = operation.getActivityIntent(); final Bundle activityOptions = operation.getBundle(); + final SafeActivityOptions safeOptions = + SafeActivityOptions.fromBundle(activityOptions, caller.mPid, caller.mUid); final int result = mService.getActivityStartController() - .startActivityInTaskFragment(taskFragment, activityIntent, activityOptions, + .startActivityInTaskFragment(taskFragment, activityIntent, safeOptions, callerActivityToken, caller.mUid, caller.mPid, errorCallbackToken); if (!isStartResultSuccessful(result)) { -- GitLab From 7602e198721f0e1f9dc6e2c634f45dd1910748c1 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 9 Oct 2024 01:50:57 +0000 Subject: [PATCH 012/459] Pass SafeActivityOptions with actual caller for startActivityInTF We clearCallingUid before apply the WCT, but SafeActivityOptions will query the Binder Uid when construct. Update to pass in the actual caller. Flag: EXEMPT bug fix Bug: 369103643 Test: atest WmTests:WindowOrganizerTests# testStartActivityInTaskFragment_checkCallerPermission Merged-In: I873ae576de0bc4a7402c2f522b45853bce48a0c5 Change-Id: I873ae576de0bc4a7402c2f522b45853bce48a0c5 (cherry picked from commit 20c568e77eae5d469cd5e594b644d8645d830dbd) --- .../java/com/android/server/wm/ActivityStartController.java | 5 ++--- .../com/android/server/wm/WindowOrganizerController.java | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index a6e50405e7d9..4de02f7f812f 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -43,7 +43,6 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.os.Binder; -import android.os.Bundle; import android.os.IBinder; import android.os.Trace; import android.os.UserHandle; @@ -529,14 +528,14 @@ public class ActivityStartController { * Starts an activity in the TaskFragment. * @param taskFragment TaskFragment {@link TaskFragment} to start the activity in. * @param activityIntent intent to start the activity. - * @param activityOptions ActivityOptions to start the activity with. + * @param activityOptions SafeActivityOptions to start the activity with. * @param resultTo the caller activity * @param callingUid the caller uid * @param callingPid the caller pid * @return the start result. */ int startActivityInTaskFragment(@NonNull TaskFragment taskFragment, - @NonNull Intent activityIntent, @Nullable Bundle activityOptions, + @NonNull Intent activityIntent, @Nullable SafeActivityOptions activityOptions, @Nullable IBinder resultTo, int callingUid, int callingPid, @Nullable IBinder errorCallbackToken) { final ActivityRecord caller = diff --git a/services/core/java/com/android/server/wm/WindowOrganizerController.java b/services/core/java/com/android/server/wm/WindowOrganizerController.java index 9375b297be2b..fdcee56d899e 100644 --- a/services/core/java/com/android/server/wm/WindowOrganizerController.java +++ b/services/core/java/com/android/server/wm/WindowOrganizerController.java @@ -1210,8 +1210,10 @@ class WindowOrganizerController extends IWindowOrganizerController.Stub final IBinder callerActivityToken = operation.getActivityToken(); final Intent activityIntent = operation.getActivityIntent(); final Bundle activityOptions = operation.getBundle(); + final SafeActivityOptions safeOptions = + SafeActivityOptions.fromBundle(activityOptions, caller.mPid, caller.mUid); final int result = mService.getActivityStartController() - .startActivityInTaskFragment(taskFragment, activityIntent, activityOptions, + .startActivityInTaskFragment(taskFragment, activityIntent, safeOptions, callerActivityToken, caller.mUid, caller.mPid, errorCallbackToken); if (!isStartResultSuccessful(result)) { -- GitLab From fa5e185a5585924a92d24cc304cb36aa203a24e1 Mon Sep 17 00:00:00 2001 From: Scarlett Song Date: Fri, 11 Oct 2024 17:29:40 +0000 Subject: [PATCH 013/459] Add com.android.healthfitness to apex_available for android.permission.flags-aconfig-java-export java_aconfig_library Health&Fitness mainline module needs to use this flag (ag/28112536). Bug: 364638912 Bug: 364643447 Change-Id: Ib4da0b5cdd3def5e2a4527610d56a7c2cf724481 Flag: android.permission.flags.replace_body_sensor_permission_enabled --- AconfigFlags.bp | 1 + 1 file changed, 1 insertion(+) diff --git a/AconfigFlags.bp b/AconfigFlags.bp index c6ce799f0a24..67ccb991c98d 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -767,6 +767,7 @@ java_aconfig_library { min_sdk_version: "30", apex_available: [ "//apex_available:platform", + "com.android.healthfitness", "com.android.permission", "com.android.nfcservices", ], -- GitLab From e27fc17a2d6140460c4015408d83be2533a04e58 Mon Sep 17 00:00:00 2001 From: Yihan Dong Date: Sat, 12 Oct 2024 08:54:12 +0000 Subject: [PATCH 014/459] Add proposed trendy teams for VTS modules Change-Id: I89c97e222f69ce43be465f58a6937572ec238215 Test: build locally Bug: 368362374 --- core/xsd/vts/Android.bp | 1 + services/core/xsd/vts/Android.bp | 1 + 2 files changed, 2 insertions(+) diff --git a/core/xsd/vts/Android.bp b/core/xsd/vts/Android.bp index 5d8407f584bc..239eed0c44f0 100644 --- a/core/xsd/vts/Android.bp +++ b/core/xsd/vts/Android.bp @@ -15,6 +15,7 @@ // package { + default_team: "trendy_team_android_kernel", // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import // all of the 'license_kinds' from "frameworks_base_license" diff --git a/services/core/xsd/vts/Android.bp b/services/core/xsd/vts/Android.bp index 4d3c79eb28ae..e1478d616121 100644 --- a/services/core/xsd/vts/Android.bp +++ b/services/core/xsd/vts/Android.bp @@ -15,6 +15,7 @@ // package { + default_team: "trendy_team_android_kernel", // See: http://go/android-license-faq // A large-scale-change added 'default_applicable_licenses' to import // all of the 'license_kinds' from "frameworks_base_license" -- GitLab From 9dc83418545c211226894018a3864d575c02fef4 Mon Sep 17 00:00:00 2001 From: chelseahao Date: Sat, 12 Oct 2024 17:16:26 +0800 Subject: [PATCH 015/459] Remove `audioSharingQsDialogImprovement` flag guard when injecting AudioSharingRepository. `AudioSharingRepositoryImpl` contains general audio sharing functions (e.g, `audioSharingAvailable`), it should be injected whenever `enableLeAudioSharing` flag is on. The dialog improvement behavior is guarded in the `AudioSharingDeviceItemActionInteractorImpl`. Test: atest Bug: 360759048 Flag: com.android.settingslib.flags.audio_sharing_qs_dialog_improvement Change-Id: I12f0644e280473194822ff5cf30ed3ed99308494 --- .../bluetooth/qsdialog/dagger/AudioSharingModule.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/dagger/AudioSharingModule.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/dagger/AudioSharingModule.kt index 50970a5d006f..8b5fde384837 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/dagger/AudioSharingModule.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/dagger/AudioSharingModule.kt @@ -55,11 +55,7 @@ interface AudioSharingModule { settingsLibAudioSharingRepository: SettingsLibAudioSharingRepository, @Background backgroundDispatcher: CoroutineDispatcher, ): AudioSharingRepository = - if ( - Flags.enableLeAudioSharing() && - Flags.audioSharingQsDialogImprovement() && - localBluetoothManager != null - ) { + if (Flags.enableLeAudioSharing() && localBluetoothManager != null) { AudioSharingRepositoryImpl( localBluetoothManager, settingsLibAudioSharingRepository, -- GitLab From 134f5593cfd507e73d733c2147d324a73387be50 Mon Sep 17 00:00:00 2001 From: Cam Bickel Date: Sat, 5 Oct 2024 02:03:03 +0000 Subject: [PATCH 016/459] audio: On desktop, show output device USB name Bug: b/366358858 Flag: com.android.media.flags.enable_audio_input_device_routing_and_volume_control Test: atest PhoneMediaDeviceTest Change-Id: I7a3d08e28deb997e2bec36af41a84d45fec5f4f8 --- .../settingslib/media/PhoneMediaDevice.java | 4 +- .../media/PhoneMediaDeviceTest.java | 63 +++++++++++++++++-- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index b94e9069da6b..481306a18f0e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -41,9 +41,9 @@ import android.media.RouteListingPreference; import android.os.SystemProperties; import android.util.Log; -import androidx.annotation.VisibleForTesting; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; import com.android.settingslib.R; import com.android.settingslib.media.flags.Flags; @@ -98,7 +98,7 @@ public class PhoneMediaDevice extends MediaDevice { case TYPE_USB_ACCESSORY: name = inputRoutingEnabledAndIsDesktop(context) - ? context.getString(R.string.media_transfer_usb_audio_name) + ? routeInfo.getName() : context.getString(R.string.media_transfer_wired_headphone_name); break; case TYPE_DOCK: diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java index 1739c0e5e2bf..9f7f0c9cb38d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/PhoneMediaDeviceTest.java @@ -17,7 +17,9 @@ package com.android.settingslib.media; import static android.media.MediaRoute2Info.TYPE_BUILTIN_SPEAKER; +import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY; import static android.media.MediaRoute2Info.TYPE_USB_DEVICE; +import static android.media.MediaRoute2Info.TYPE_USB_HEADSET; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADPHONES; import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; @@ -120,28 +122,79 @@ public class PhoneMediaDeviceTest { @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) @Test - public void getName_returnCorrectName_desktop() { + public void getName_returnCorrectName_desktop_wiredHeadphones() { ShadowSystemProperties.override("ro.build.characteristics", "desktop"); when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADPHONES); + // Even if the MediaRoute2Info reports a name, the default string should still be displayed, + // since the MediaRoute2Info name is only used for USB devices. + when(mInfo.getName()).thenReturn("WIRED_HEADPHONES"); assertThat(mPhoneMediaDevice.getName()) .isEqualTo(mContext.getString(R.string.media_transfer_headphone_name)); + } + + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void getName_returnCorrectName_desktop_wiredHeadset() { + ShadowSystemProperties.override("ro.build.characteristics", "desktop"); when(mInfo.getType()).thenReturn(TYPE_WIRED_HEADSET); + // Even if the MediaRoute2Info reports a name, the default string should still be displayed, + // since the MediaRoute2Info name is only used for USB devices. + when(mInfo.getName()).thenReturn("WIRED_HEADSET"); assertThat(mPhoneMediaDevice.getName()) .isEqualTo(mContext.getString(R.string.media_transfer_headphone_name)); + } + + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void getName_returnCorrectName_desktop_usbDevice() { + ShadowSystemProperties.override("ro.build.characteristics", "desktop"); when(mInfo.getType()).thenReturn(TYPE_USB_DEVICE); + final String mediaRoute2InfoName = "USB-Audio - My Device"; + when(mInfo.getName()).thenReturn(mediaRoute2InfoName); - assertThat(mPhoneMediaDevice.getName()) - .isEqualTo(mContext.getString(R.string.media_transfer_usb_audio_name)); + assertThat(mPhoneMediaDevice.getName()).isEqualTo(mediaRoute2InfoName); + } + + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void getName_returnCorrectName_desktop_usbHeadset() { + ShadowSystemProperties.override("ro.build.characteristics", "desktop"); + + when(mInfo.getType()).thenReturn(TYPE_USB_HEADSET); + final String mediaRoute2InfoName = "USB-Audio - My Headset"; + when(mInfo.getName()).thenReturn(mediaRoute2InfoName); + + assertThat(mPhoneMediaDevice.getName()).isEqualTo(mediaRoute2InfoName); + } + + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void getName_returnCorrectName_desktop_usbAccessory() { + ShadowSystemProperties.override("ro.build.characteristics", "desktop"); + + when(mInfo.getType()).thenReturn(TYPE_USB_ACCESSORY); + final String mediaRoute2InfoName = "USB-Audio - My Accessory"; + when(mInfo.getName()).thenReturn(mediaRoute2InfoName); + + assertThat(mPhoneMediaDevice.getName()).isEqualTo(mediaRoute2InfoName); + } + + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void getName_returnCorrectName_desktop_builtinSpeaker() { + ShadowSystemProperties.override("ro.build.characteristics", "desktop"); when(mInfo.getType()).thenReturn(TYPE_BUILTIN_SPEAKER); + // Even if the MediaRoute2Info reports a name, the default string should still be displayed, + // since the MediaRoute2Info name is only used for USB devices. + when(mInfo.getName()).thenReturn("Phone"); - assertThat(mPhoneMediaDevice.getName()) - .isEqualTo(getMediaTransferThisDeviceName(mContext)); + assertThat(mPhoneMediaDevice.getName()).isEqualTo(getMediaTransferThisDeviceName(mContext)); } @EnableFlags(Flags.FLAG_ENABLE_AUDIO_POLICIES_DEVICE_AND_BLUETOOTH_CONTROLLER) -- GitLab From b39dded2a2589b366950e82c7da2ba427acdf2f0 Mon Sep 17 00:00:00 2001 From: 0 Date: Tue, 15 Oct 2024 16:21:26 -0700 Subject: [PATCH 017/459] [flexiglass] use LSToGoneTransitionViewModel for keyguardAlpha during LS -> GONE With flexiglass on, using the shade/QS alpha for keyguard when on Gone scene was causing the stack to flicker when going from LS -> Gone scene, as well as during the first shade invocation after going from LS -> Gone. This CL switches us over to the alpha provided by LockscreenToGoneTransitionViewModel and only uses shade/QS alpha when shade/QS are actually occluding keyguard. Bug: 364887368 Test: Manually verified keyguard alpha during LS -> Gone transition Flag: com.android.systemui.scene_container Change-Id: I837156b5e39cfc512ec7564824683a5acb6fc98b --- .../SharedNotificationContainerViewModel.kt | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) 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..472e7794cd0a 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 @@ -475,19 +475,28 @@ constructor( } fun keyguardAlpha(viewState: ViewStateAccessor, scope: CoroutineScope): Flow { - // Transitions are not (yet) authoritative for NSSL; they still rely on StatusBarState to - // help determine when the device has fully moved to GONE or OCCLUDED state. Once SHADE - // state has been set, let shade alpha take over - val isKeyguardNotVisible = - combine( + val isKeyguardOccluded = + keyguardTransitionInteractor.transitionValue(OCCLUDED).map { it == 1f } + + val isKeyguardNotVisibleInState = + if (SceneContainerFlag.isEnabled) { + isKeyguardOccluded + } else { anyOf( - keyguardTransitionInteractor.transitionValue(OCCLUDED).map { it == 1f }, + isKeyguardOccluded, keyguardTransitionInteractor .transitionValue(scene = Scenes.Gone, stateWithoutSceneContainer = GONE) .map { it == 1f }, - ), - keyguardInteractor.statusBarState, - ) { isKeyguardNotVisibleInState, statusBarState -> + ) + } + + // Transitions are not (yet) authoritative for NSSL; they still rely on StatusBarState to + // help determine when the device has fully moved to GONE or OCCLUDED state. Once SHADE + // state has been set, let shade alpha take over + val isKeyguardNotVisible = + combine(isKeyguardNotVisibleInState, keyguardInteractor.statusBarState) { + isKeyguardNotVisibleInState, + statusBarState -> isKeyguardNotVisibleInState && statusBarState == SHADE } -- GitLab From 5a2c7673eb6a40eebc6122e33f6c22ea82c19e2b Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Tue, 1 Oct 2024 16:07:40 +0900 Subject: [PATCH 018/459] Enlarge pointer icon for magnification When full screen magnification is enabled, pointer icons should be also enlarged by the zoom factor. This change adds an API in InputManagerInternal for accessibility to update the scale factor when full screen magnification is enabled. Currently there's only one caller, but it will be called from more places in future changes. Bug: 355734856 Test: Enable flag, and changing scale with slider or gesture will change pointer icons. Test: PointerIconCacheTest Test: atest com.android.server.accessibility.magnification Flag: com.android.server.accessibility.magnification_enlarge_pointer Change-Id: I985183b12d6a1c4a6aa4c53e4f462778aeb2e9ae --- .../FullScreenMagnificationController.java | 29 ++++ .../server/input/InputManagerInternal.java | 8 ++ .../server/input/InputManagerService.java | 9 ++ .../server/input/PointerIconCache.java | 37 ++++- ...FullScreenMagnificationControllerTest.java | 21 +++ ...ScreenMagnificationGestureHandlerTest.java | 3 + .../MagnificationControllerTest.java | 4 + tests/Input/Android.bp | 1 + .../server/input/PointerIconCacheTest.kt | 135 ++++++++++++++++++ 9 files changed, 245 insertions(+), 2 deletions(-) create mode 100644 tests/Input/src/com/android/server/input/PointerIconCacheTest.kt diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java index a77ba624a68f..12c64c52b4a0 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java @@ -64,6 +64,7 @@ import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.Flags; +import com.android.server.input.InputManagerInternal; import com.android.server.wm.WindowManagerInternal; import java.util.ArrayList; @@ -955,6 +956,7 @@ public class FullScreenMagnificationController implements context, traceManager, LocalServices.getService(WindowManagerInternal.class), + LocalServices.getService(InputManagerInternal.class), new Handler(context.getMainLooper()), context.getResources().getInteger(R.integer.config_longAnimTime)), lock, @@ -1640,6 +1642,8 @@ public class FullScreenMagnificationController implements */ public void persistScale(int displayId) { final float scale = getScale(displayId); + notifyScaleForInput(displayId, scale); + if (scale < MagnificationConstants.PERSISTED_SCALE_MIN_VALUE) { return; } @@ -1690,6 +1694,20 @@ public class FullScreenMagnificationController implements } } + /** + * Notifies input manager that magnification scale changed non-transiently + * so that pointer cursor is scaled as well. + * + * @param displayId The logical display id. + * @param scale The new scale factor. + */ + public void notifyScaleForInput(int displayId, float scale) { + if (Flags.magnificationEnlargePointer()) { + mControllerCtx.getInputManager() + .setAccessibilityPointerIconScaleFactor(displayId, scale); + } + } + /** * Resets all displays' magnification if last magnifying service is disabled. * @@ -2166,6 +2184,7 @@ public class FullScreenMagnificationController implements private final Context mContext; private final AccessibilityTraceManager mTrace; private final WindowManagerInternal mWindowManager; + private final InputManagerInternal mInputManager; private final Handler mHandler; private final Long mAnimationDuration; @@ -2175,11 +2194,13 @@ public class FullScreenMagnificationController implements public ControllerContext(@NonNull Context context, @NonNull AccessibilityTraceManager traceManager, @NonNull WindowManagerInternal windowManager, + @NonNull InputManagerInternal inputManager, @NonNull Handler handler, long animationDuration) { mContext = context; mTrace = traceManager; mWindowManager = windowManager; + mInputManager = inputManager; mHandler = handler; mAnimationDuration = animationDuration; } @@ -2208,6 +2229,14 @@ public class FullScreenMagnificationController implements return mWindowManager; } + /** + * @return InputManagerInternal + */ + @NonNull + public InputManagerInternal getInputManager() { + return mInputManager; + } + /** * @return Handler for main looper */ diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java index 99f7f12567b4..c888eef7f5df 100644 --- a/services/core/java/com/android/server/input/InputManagerInternal.java +++ b/services/core/java/com/android/server/input/InputManagerInternal.java @@ -262,4 +262,12 @@ public abstract class InputManagerInternal { */ public abstract void handleKeyGestureInKeyGestureController(int deviceId, int[] keycodes, int modifierState, @KeyGestureEvent.KeyGestureType int event); + + /** + * Sets the magnification scale factor for pointer icons. + * + * @param displayId the ID of the display where the new scale factor is applied. + * @param scaleFactor the new scale factor to be applied for pointer icons. + */ + public abstract void setAccessibilityPointerIconScaleFactor(int displayId, float scaleFactor); } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 8acf583e0765..98e5319cde30 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -3506,6 +3506,11 @@ public class InputManagerService extends IInputManager.Stub int modifierState, @KeyGestureEvent.KeyGestureType int gestureType) { mKeyGestureController.handleKeyGesture(deviceId, keycodes, modifierState, gestureType); } + + @Override + public void setAccessibilityPointerIconScaleFactor(int displayId, float scaleFactor) { + InputManagerService.this.setAccessibilityPointerIconScaleFactor(displayId, scaleFactor); + } } @Override @@ -3688,6 +3693,10 @@ public class InputManagerService extends IInputManager.Stub mPointerIconCache.setPointerScale(scale); } + void setAccessibilityPointerIconScaleFactor(int displayId, float scaleFactor) { + mPointerIconCache.setAccessibilityScaleFactor(displayId, scaleFactor); + } + interface KeyboardBacklightControllerInterface { default void incrementKeyboardBacklight(int deviceId) {} default void decrementKeyboardBacklight(int deviceId) {} diff --git a/services/core/java/com/android/server/input/PointerIconCache.java b/services/core/java/com/android/server/input/PointerIconCache.java index 297cd68d5d3d..e16031cb664a 100644 --- a/services/core/java/com/android/server/input/PointerIconCache.java +++ b/services/core/java/com/android/server/input/PointerIconCache.java @@ -27,6 +27,7 @@ import android.hardware.display.DisplayManager; import android.os.Handler; import android.util.Slog; import android.util.SparseArray; +import android.util.SparseDoubleArray; import android.util.SparseIntArray; import android.view.ContextThemeWrapper; import android.view.Display; @@ -34,6 +35,7 @@ import android.view.DisplayInfo; import android.view.PointerIcon; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.UiThread; import java.util.Objects; @@ -51,7 +53,7 @@ final class PointerIconCache { private final NativeInputManagerService mNative; // We use the UI thread for loading pointer icons. - private final Handler mUiThreadHandler = UiThread.getHandler(); + private final Handler mUiThreadHandler; @GuardedBy("mLoadedPointerIconsByDisplayAndType") private final SparseArray> mLoadedPointerIconsByDisplayAndType = @@ -70,6 +72,9 @@ final class PointerIconCache { POINTER_ICON_VECTOR_STYLE_STROKE_WHITE; @GuardedBy("mLoadedPointerIconsByDisplayAndType") private float mPointerIconScale = DEFAULT_POINTER_SCALE; + // Note that android doesn't have SparseFloatArray, so this falls back to use double instead. + @GuardedBy("mLoadedPointerIconsByDisplayAndType") + private final SparseDoubleArray mAccessibilityScaleFactorPerDisplay = new SparseDoubleArray(); private final DisplayManager.DisplayListener mDisplayListener = new DisplayManager.DisplayListener() { @@ -86,6 +91,7 @@ final class PointerIconCache { mLoadedPointerIconsByDisplayAndType.remove(displayId); mDisplayContexts.remove(displayId); mDisplayDensities.delete(displayId); + mAccessibilityScaleFactorPerDisplay.delete(displayId); } } @@ -96,8 +102,15 @@ final class PointerIconCache { }; /* package */ PointerIconCache(Context context, NativeInputManagerService nativeService) { + this(context, nativeService, UiThread.getHandler()); + } + + @VisibleForTesting + /* package */ PointerIconCache(Context context, NativeInputManagerService nativeService, + Handler handler) { mContext = context; mNative = nativeService; + mUiThreadHandler = handler; } public void systemRunning() { @@ -134,6 +147,11 @@ final class PointerIconCache { mUiThreadHandler.post(() -> handleSetPointerScale(scale)); } + /** Set the scale for accessibility (magnification) for vector pointer icons. */ + public void setAccessibilityScaleFactor(int displayId, float scaleFactor) { + mUiThreadHandler.post(() -> handleAccessibilityScaleFactor(displayId, scaleFactor)); + } + /** * Get a loaded system pointer icon. This will fetch the icon from the cache, or load it if * it isn't already cached. @@ -155,8 +173,10 @@ final class PointerIconCache { /* force= */ true); theme.applyStyle(PointerIcon.vectorStrokeStyleToResource(mPointerIconStrokeStyle), /* force= */ true); + final float scale = mPointerIconScale + * (float) mAccessibilityScaleFactorPerDisplay.get(displayId, 1f); icon = PointerIcon.getLoadedSystemIcon(new ContextThemeWrapper(context, theme), - type, mUseLargePointerIcons, mPointerIconScale); + type, mUseLargePointerIcons, scale); iconsByType.put(type, icon); } return Objects.requireNonNull(icon); @@ -261,6 +281,19 @@ final class PointerIconCache { mNative.reloadPointerIcons(); } + @android.annotation.UiThread + private void handleAccessibilityScaleFactor(int displayId, float scale) { + synchronized (mLoadedPointerIconsByDisplayAndType) { + if (mAccessibilityScaleFactorPerDisplay.get(displayId, 1f) == scale) { + return; + } + mAccessibilityScaleFactorPerDisplay.put(displayId, scale); + // Clear cached icons on the display. + mLoadedPointerIconsByDisplayAndType.remove(displayId); + } + mNative.reloadPointerIcons(); + } + // Updates the cached display density for the given displayId, and returns true if // the cached density changed. @GuardedBy("mLoadedPointerIconsByDisplayAndType") diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java index c4b4afd13a60..76553ba0120f 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java @@ -18,6 +18,7 @@ package com.android.server.accessibility.magnification; import static android.accessibilityservice.MagnificationConfig.MAGNIFICATION_MODE_FULLSCREEN; +import static com.android.server.accessibility.Flags.FLAG_MAGNIFICATION_ENLARGE_POINTER; import static com.android.server.accessibility.magnification.FullScreenMagnificationController.MagnificationInfoChangedCallback; import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; @@ -76,6 +77,7 @@ import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.Flags; import com.android.server.accessibility.test.MessageCapturingHandler; +import com.android.server.input.InputManagerInternal; import com.android.server.wm.WindowManagerInternal; import com.android.server.wm.WindowManagerInternal.MagnificationCallbacks; @@ -126,6 +128,7 @@ public class FullScreenMagnificationControllerTest { final Resources mMockResources = mock(Resources.class); final AccessibilityTraceManager mMockTraceManager = mock(AccessibilityTraceManager.class); final WindowManagerInternal mMockWindowManager = mock(WindowManagerInternal.class); + final InputManagerInternal mMockInputManager = mock(InputManagerInternal.class); private final MagnificationAnimationCallback mAnimationCallback = mock( MagnificationAnimationCallback.class); private final MagnificationInfoChangedCallback mRequestObserver = mock( @@ -163,6 +166,7 @@ public class FullScreenMagnificationControllerTest { when(mMockControllerCtx.getContext()).thenReturn(mMockContext); when(mMockControllerCtx.getTraceManager()).thenReturn(mMockTraceManager); when(mMockControllerCtx.getWindowManager()).thenReturn(mMockWindowManager); + when(mMockControllerCtx.getInputManager()).thenReturn(mMockInputManager); when(mMockControllerCtx.getHandler()).thenReturn(mMessageCapturingHandler); when(mMockControllerCtx.getAnimationDuration()).thenReturn(1000L); mResolver = new MockContentResolver(); @@ -1478,6 +1482,23 @@ public class FullScreenMagnificationControllerTest { 4.0f); } + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void persistScale_setValue_notifyInput() { + register(TEST_DISPLAY); + + PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScale(TEST_DISPLAY, 4.0f, pivotPoint.x, pivotPoint.y, + true, SERVICE_ID_1); + mFullScreenMagnificationController.persistScale(TEST_DISPLAY); + + // persistScale may post a task to a background thread. Let's wait for it completes. + waitForBackgroundThread(); + Assert.assertEquals(mFullScreenMagnificationController.getPersistedScale(TEST_DISPLAY), + 4.0f); + verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, 4.0f); + } + @Test public void testOnContextChanged_alwaysOnFeatureDisabled_resetMagnification() { setScaleToMagnifying(); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java index b745e6a7d4a5..00b7de818c12 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java @@ -90,6 +90,7 @@ import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.EventStreamTransformation; import com.android.server.accessibility.Flags; import com.android.server.accessibility.magnification.FullScreenMagnificationController.MagnificationInfoChangedCallback; +import com.android.server.input.InputManagerInternal; import com.android.server.testutils.OffsettableClock; import com.android.server.testutils.TestHandler; import com.android.server.wm.WindowManagerInternal; @@ -227,9 +228,11 @@ public class FullScreenMagnificationGestureHandlerTest { final FullScreenMagnificationController.ControllerContext mockController = mock(FullScreenMagnificationController.ControllerContext.class); final WindowManagerInternal mockWindowManager = mock(WindowManagerInternal.class); + final InputManagerInternal mockInputManager = mock(InputManagerInternal.class); when(mockController.getContext()).thenReturn(mContext); when(mockController.getTraceManager()).thenReturn(mMockTraceManager); when(mockController.getWindowManager()).thenReturn(mockWindowManager); + when(mockController.getInputManager()).thenReturn(mockInputManager); when(mockController.getHandler()).thenReturn(new Handler(mContext.getMainLooper())); when(mockController.newValueAnimator()).thenReturn(new ValueAnimator()); when(mockController.getAnimationDuration()).thenReturn(1000L); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index 25281774cd95..d70e1fe1d9d1 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -76,6 +76,7 @@ import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.test.MessageCapturingHandler; +import com.android.server.input.InputManagerInternal; import com.android.server.wm.WindowManagerInternal; import com.android.window.flags.Flags; @@ -154,6 +155,8 @@ public class MagnificationControllerTest { private WindowManagerInternal mWindowManagerInternal; @Mock private WindowManagerInternal.AccessibilityControllerInternal mA11yController; + @Mock + private InputManagerInternal mInputManagerInternal; @Mock private DisplayManagerInternal mDisplayManagerInternal; @@ -200,6 +203,7 @@ public class MagnificationControllerTest { when(mControllerCtx.getContext()).thenReturn(mContext); when(mControllerCtx.getTraceManager()).thenReturn(mTraceManager); when(mControllerCtx.getWindowManager()).thenReturn(mWindowManagerInternal); + when(mControllerCtx.getInputManager()).thenReturn(mInputManagerInternal); when(mControllerCtx.getHandler()).thenReturn(mMessageCapturingHandler); when(mControllerCtx.getAnimationDuration()).thenReturn(1000L); when(mControllerCtx.newValueAnimator()).thenReturn(mValueAnimator); diff --git a/tests/Input/Android.bp b/tests/Input/Android.bp index 6742cbe1f19a..168141bf6e7d 100644 --- a/tests/Input/Android.bp +++ b/tests/Input/Android.bp @@ -41,6 +41,7 @@ android_test { "hamcrest-library", "junit-params", "kotlin-test", + "mockito-kotlin-nodeps", "mockito-target-extended-minus-junit4", "platform-test-annotations", "platform-screenshot-diff-core", diff --git a/tests/Input/src/com/android/server/input/PointerIconCacheTest.kt b/tests/Input/src/com/android/server/input/PointerIconCacheTest.kt new file mode 100644 index 000000000000..47e7ac720a08 --- /dev/null +++ b/tests/Input/src/com/android/server/input/PointerIconCacheTest.kt @@ -0,0 +1,135 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.input + +import android.content.Context +import android.content.ContextWrapper +import android.os.Handler +import android.os.test.TestLooper +import android.platform.test.annotations.Presubmit +import android.view.Display +import android.view.PointerIcon +import androidx.test.platform.app.InstrumentationRegistry +import junit.framework.Assert.assertEquals +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.mockito.Mock +import org.mockito.junit.MockitoJUnit +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever + +/** + * Tests for {@link PointerIconCache}. + */ +@Presubmit +class PointerIconCacheTest { + + @get:Rule + val rule = MockitoJUnit.rule()!! + + @Mock + private lateinit var native: NativeInputManagerService + @Mock + private lateinit var defaultDisplay: Display + + private lateinit var context: Context + private lateinit var testLooper: TestLooper + private lateinit var cache: PointerIconCache + + @Before + fun setup() { + whenever(defaultDisplay.displayId).thenReturn(Display.DEFAULT_DISPLAY) + + context = object : ContextWrapper(InstrumentationRegistry.getInstrumentation().context) { + override fun getDisplay() = defaultDisplay + } + + testLooper = TestLooper() + cache = PointerIconCache(context, native, Handler(testLooper.looper)) + } + + @Test + fun testSetPointerScale() { + val defaultBitmap = getDefaultIcon().bitmap + cache.setPointerScale(2f) + + testLooper.dispatchAll() + verify(native).reloadPointerIcons() + + val bitmap = + cache.getLoadedPointerIcon(Display.DEFAULT_DISPLAY, PointerIcon.TYPE_ARROW).bitmap + + assertEquals(defaultBitmap.height * 2, bitmap.height) + assertEquals(defaultBitmap.width * 2, bitmap.width) + } + + @Test + fun testSetAccessibilityScaleFactor() { + val defaultBitmap = getDefaultIcon().bitmap + cache.setAccessibilityScaleFactor(Display.DEFAULT_DISPLAY, 4f) + + testLooper.dispatchAll() + verify(native).reloadPointerIcons() + + val bitmap = + cache.getLoadedPointerIcon(Display.DEFAULT_DISPLAY, PointerIcon.TYPE_ARROW).bitmap + + assertEquals(defaultBitmap.height * 4, bitmap.height) + assertEquals(defaultBitmap.width * 4, bitmap.width) + } + + @Test + fun testSetAccessibilityScaleFactorOnSecondaryDisplay() { + val defaultBitmap = getDefaultIcon().bitmap + val secondaryDisplayId = Display.DEFAULT_DISPLAY + 1 + cache.setAccessibilityScaleFactor(secondaryDisplayId, 4f) + + testLooper.dispatchAll() + verify(native).reloadPointerIcons() + + val bitmap = + cache.getLoadedPointerIcon(Display.DEFAULT_DISPLAY, PointerIcon.TYPE_ARROW).bitmap + assertEquals(defaultBitmap.height, bitmap.height) + assertEquals(defaultBitmap.width, bitmap.width) + + val bitmapSecondary = + cache.getLoadedPointerIcon(secondaryDisplayId, PointerIcon.TYPE_ARROW).bitmap + assertEquals(defaultBitmap.height * 4, bitmapSecondary.height) + assertEquals(defaultBitmap.width * 4, bitmapSecondary.width) + } + + @Test + fun testSetPointerScaleAndAccessibilityScaleFactor() { + val defaultBitmap = getDefaultIcon().bitmap + cache.setPointerScale(2f) + cache.setAccessibilityScaleFactor(Display.DEFAULT_DISPLAY, 3f) + + testLooper.dispatchAll() + verify(native, times(2)).reloadPointerIcons() + + val bitmap = + cache.getLoadedPointerIcon(Display.DEFAULT_DISPLAY, PointerIcon.TYPE_ARROW).bitmap + + assertEquals(defaultBitmap.height * 6, bitmap.height) + assertEquals(defaultBitmap.width * 6, bitmap.width) + } + + private fun getDefaultIcon() = + PointerIcon.getLoadedSystemIcon(context, PointerIcon.TYPE_ARROW, false, 1f) +} -- GitLab From 63d8edcc943ec87e7514ab7432e991ef124dfa7e Mon Sep 17 00:00:00 2001 From: Sally Qi Date: Mon, 7 Oct 2024 10:35:26 -0700 Subject: [PATCH 019/459] [Lut API] LUT java interface update. - LutProperties#getSize return integer instead. Bug: 349667978 Test: builds Flag: NONE new added apis are all hidden now Change-Id: I0913bb1b40b6e395d06f389ef6aaab96bf742b68 --- core/java/android/hardware/LutProperties.java | 6 +++--- core/jni/android_hardware_OverlayProperties.cpp | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core/java/android/hardware/LutProperties.java b/core/java/android/hardware/LutProperties.java index 57f8a4ece304..c9c6d6d08ed2 100644 --- a/core/java/android/hardware/LutProperties.java +++ b/core/java/android/hardware/LutProperties.java @@ -30,7 +30,7 @@ import java.lang.annotation.RetentionPolicy; */ public final class LutProperties { private final @Dimension int mDimension; - private final long mSize; + private final int mSize; private final @SamplingKey int[] mSamplingKeys; @Retention(RetentionPolicy.SOURCE) @@ -68,7 +68,7 @@ public final class LutProperties { /** * @return the size of the Lut. */ - public long getSize() { + public int getSize() { return mSize; } @@ -83,7 +83,7 @@ public final class LutProperties { } /* use in the native code */ - private LutProperties(@Dimension int dimension, long size, @SamplingKey int[] samplingKeys) { + private LutProperties(@Dimension int dimension, int size, @SamplingKey int[] samplingKeys) { if (dimension != ONE_DIMENSION || dimension != THREE_DIMENSION) { throw new IllegalArgumentException("The dimension is either 1 or 3!"); } diff --git a/core/jni/android_hardware_OverlayProperties.cpp b/core/jni/android_hardware_OverlayProperties.cpp index 63de1950f2a5..bb4084e8f39e 100644 --- a/core/jni/android_hardware_OverlayProperties.cpp +++ b/core/jni/android_hardware_OverlayProperties.cpp @@ -213,6 +213,6 @@ int register_android_hardware_OverlayProperties(JNIEnv* env) { clazz = FindClassOrDie(env, "android/hardware/LutProperties"); gLutPropertiesClassInfo.clazz = MakeGlobalRefOrDie(env, clazz); gLutPropertiesClassInfo.ctor = - GetMethodIDOrDie(env, gLutPropertiesClassInfo.clazz, "", "(IJ[I)V"); + GetMethodIDOrDie(env, gLutPropertiesClassInfo.clazz, "", "(II[I)V"); return err; } -- GitLab From 51f86b52421127e04fb241e79d9f56ea666b6803 Mon Sep 17 00:00:00 2001 From: yumeichen Date: Wed, 18 Sep 2024 09:27:37 +0000 Subject: [PATCH 020/459] Add validation before logging ScreenInteractiveSessionReported The value of reducedInteractiveStateOnDurationMs should be in [0, screen_off_timeout]. Don't send the log if the value is invalid. Flag: EXEMPT bugfix Test: atest WakefulnessSessionObserverTest Bug: 359355557 Change-Id: I9f8a9a0b1992e0e66f111ae9ee4c53f56563f28e --- .../power/WakefulnessSessionObserver.java | 103 ++++++++------- .../power/WakefulnessSessionObserverTest.java | 119 +++++++++++++++++- 2 files changed, 166 insertions(+), 56 deletions(-) diff --git a/services/core/java/com/android/server/power/WakefulnessSessionObserver.java b/services/core/java/com/android/server/power/WakefulnessSessionObserver.java index c6b260288a88..64f0693f14c4 100644 --- a/services/core/java/com/android/server/power/WakefulnessSessionObserver.java +++ b/services/core/java/com/android/server/power/WakefulnessSessionObserver.java @@ -49,6 +49,7 @@ import android.os.SystemClock; import android.os.UserHandle; import android.provider.Settings; import android.util.IndentingPrintWriter; +import android.util.Slog; import android.util.SparseArray; import android.view.Display; import android.view.DisplayAddress; @@ -70,12 +71,11 @@ import java.lang.annotation.RetentionPolicy; public class WakefulnessSessionObserver { private static final String TAG = "WakefulnessSessionObserver"; - private static final int OFF_REASON_UNKNOWN = FrameworkStatsLog + static final int OFF_REASON_UNKNOWN = FrameworkStatsLog .SCREEN_INTERACTIVE_SESSION_REPORTED__INTERACTIVE_STATE_OFF_REASON__UNKNOWN; - private static final int OFF_REASON_TIMEOUT = FrameworkStatsLog + static final int OFF_REASON_TIMEOUT = FrameworkStatsLog .SCREEN_INTERACTIVE_SESSION_REPORTED__INTERACTIVE_STATE_OFF_REASON__TIMEOUT; - @VisibleForTesting - protected static final int OFF_REASON_POWER_BUTTON = FrameworkStatsLog + static final int OFF_REASON_POWER_BUTTON = FrameworkStatsLog .SCREEN_INTERACTIVE_SESSION_REPORTED__INTERACTIVE_STATE_OFF_REASON__POWER_BUTTON; /** @@ -90,25 +90,21 @@ public class WakefulnessSessionObserver { @Retention(RetentionPolicy.SOURCE) private @interface OffReason {} - private static final int OVERRIDE_OUTCOME_UNKNOWN = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_UNKNOWN = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__UNKNOWN; - @VisibleForTesting - protected static final int OVERRIDE_OUTCOME_TIMEOUT_SUCCESS = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_TIMEOUT_SUCCESS = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__TIMEOUT_SUCCESS; - @VisibleForTesting - protected static final int OVERRIDE_OUTCOME_TIMEOUT_USER_INITIATED_REVERT = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_TIMEOUT_USER_INITIATED_REVERT = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__TIMEOUT_USER_INITIATED_REVERT; - private static final int OVERRIDE_OUTCOME_CANCEL_CLIENT_API_CALL = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_CANCEL_CLIENT_API_CALL = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__CANCEL_CLIENT_API_CALL; - @VisibleForTesting - protected static final int OVERRIDE_OUTCOME_CANCEL_USER_INTERACTION = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_CANCEL_USER_INTERACTION = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__CANCEL_USER_INTERACTION; - @VisibleForTesting - protected static final int OVERRIDE_OUTCOME_CANCEL_POWER_BUTTON = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_CANCEL_POWER_BUTTON = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__CANCEL_POWER_BUTTON; - private static final int OVERRIDE_OUTCOME_CANCEL_CLIENT_DISCONNECT = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_CANCEL_CLIENT_DISCONNECT = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__CANCEL_CLIENT_DISCONNECTED; - private static final int OVERRIDE_OUTCOME_CANCEL_OTHER = FrameworkStatsLog + static final int OVERRIDE_OUTCOME_CANCEL_OTHER = FrameworkStatsLog .SCREEN_TIMEOUT_OVERRIDE_REPORTED__OVERRIDE_OUTCOME__CANCEL_OTHER; /** @@ -128,19 +124,15 @@ public class WakefulnessSessionObserver { @Retention(RetentionPolicy.SOURCE) private @interface OverrideOutcome {} - private static final int POLICY_REASON_UNKNOWN = FrameworkStatsLog + static final int POLICY_REASON_UNKNOWN = FrameworkStatsLog .SCREEN_DIM_REPORTED__POLICY_REASON__UNKNOWN; - @VisibleForTesting - protected static final int POLICY_REASON_OFF_TIMEOUT = FrameworkStatsLog + static final int POLICY_REASON_OFF_TIMEOUT = FrameworkStatsLog .SCREEN_DIM_REPORTED__POLICY_REASON__OFF_TIMEOUT; - @VisibleForTesting - protected static final int POLICY_REASON_OFF_POWER_BUTTON = FrameworkStatsLog + static final int POLICY_REASON_OFF_POWER_BUTTON = FrameworkStatsLog .SCREEN_DIM_REPORTED__POLICY_REASON__OFF_POWER_BUTTON; - @VisibleForTesting - protected static final int POLICY_REASON_BRIGHT_UNDIM = FrameworkStatsLog + static final int POLICY_REASON_BRIGHT_UNDIM = FrameworkStatsLog .SCREEN_DIM_REPORTED__POLICY_REASON__BRIGHT_UNDIM; - @VisibleForTesting - protected static final int POLICY_REASON_BRIGHT_INITIATED_REVERT = FrameworkStatsLog + static final int POLICY_REASON_BRIGHT_INITIATED_REVERT = FrameworkStatsLog .SCREEN_DIM_REPORTED__POLICY_REASON__BRIGHT_INITIATED_REVERT; /** @@ -157,21 +149,18 @@ public class WakefulnessSessionObserver { @Retention(RetentionPolicy.SOURCE) private @interface PolicyReason {} - @VisibleForTesting protected static final int DEFAULT_USER_ACTIVITY = USER_ACTIVITY_EVENT_OTHER; - private static final long USER_INITIATED_REVERT_THRESHOLD_MILLIS = 5000L; - private static final long SEND_OVERRIDE_TIMEOUT_LOG_THRESHOLD_MILLIS = 1000L; - @VisibleForTesting - protected static final long SCREEN_POLICY_DIM_POWER_OFF_BRIGHT_THRESHOLD_MILLIS = 500L; + static final int DEFAULT_USER_ACTIVITY = USER_ACTIVITY_EVENT_OTHER; + static final long USER_INITIATED_REVERT_THRESHOLD_MILLIS = 5000L; + static final long SEND_OVERRIDE_TIMEOUT_LOG_THRESHOLD_MILLIS = 1000L; + static final long SCREEN_POLICY_DIM_POWER_OFF_BRIGHT_THRESHOLD_MILLIS = 500L; - @VisibleForTesting protected static final Object HANDLER_TOKEN = new Object(); + static final Object HANDLER_TOKEN = new Object(); private Context mContext; private int mScreenOffTimeoutMs; private int mOverrideTimeoutMs = 0; - @VisibleForTesting - protected final SparseArray mPowerGroups = new SparseArray<>(); - @VisibleForTesting - protected WakefulnessSessionFrameworkStatsLogger mWakefulnessSessionFrameworkStatsLogger; + final SparseArray mPowerGroups = new SparseArray<>(); + WakefulnessSessionFrameworkStatsLogger mWakefulnessSessionFrameworkStatsLogger; private final Clock mClock; private final Object mLock = new Object(); private final Handler mHandler; @@ -347,7 +336,8 @@ public class WakefulnessSessionObserver { writer.println(); } - private void updateSettingScreenOffTimeout(Context context) { + @VisibleForTesting + void updateSettingScreenOffTimeout(Context context) { synchronized (mLock) { mScreenOffTimeoutMs = Settings.System.getIntForUser( context.getContentResolver(), @@ -453,6 +443,7 @@ public class WakefulnessSessionObserver { return; } + final int screenOffTimeoutMs = getScreenOffTimeout(); mIsInteractive = isInteractive(wakefulness); if (mIsInteractive) { mInteractiveStateOnStartTimestamp = eventTime; @@ -466,7 +457,7 @@ public class WakefulnessSessionObserver { mPowerGroupId, OVERRIDE_OUTCOME_TIMEOUT_USER_INITIATED_REVERT, mOverrideTimeoutMs, - getScreenOffTimeout()); + screenOffTimeoutMs); mSendOverrideTimeoutLogTimestamp = eventTime; } mTimeoutOffTimestamp = TIMEOUT_OFF_RESET_TIMESTAMP; @@ -496,7 +487,7 @@ public class WakefulnessSessionObserver { mPowerGroupId, OVERRIDE_OUTCOME_CANCEL_POWER_BUTTON, mOverrideTimeoutMs, - getScreenOffTimeout()); + screenOffTimeoutMs); mSendOverrideTimeoutLogTimestamp = eventTime; mTimeoutOverrideReleaseReason = RELEASE_REASON_UNKNOWN; // reset the reason } @@ -514,13 +505,12 @@ public class WakefulnessSessionObserver { // timeout has been done successfully. if (isInOverrideTimeout()) { reducedInteractiveStateOnDurationMs = - getScreenOffTimeout() - mOverrideTimeoutMs; - + screenOffTimeoutMs - mOverrideTimeoutMs; mWakefulnessSessionFrameworkStatsLogger.logTimeoutOverrideEvent( mPowerGroupId, OVERRIDE_OUTCOME_TIMEOUT_SUCCESS, mOverrideTimeoutMs, - getScreenOffTimeout()); + screenOffTimeoutMs); mSendOverrideTimeoutLogTimestamp = eventTime; // Record a timestamp to track if the user initiates to revert from off @@ -533,13 +523,21 @@ public class WakefulnessSessionObserver { long interactiveStateOnDurationMs = eventTime - mInteractiveStateOnStartTimestamp; - mWakefulnessSessionFrameworkStatsLogger.logSessionEvent( - mPowerGroupId, - interactiveStateOffReason, - interactiveStateOnDurationMs, - lastUserActivity, - lastUserActivityDurationMs, - reducedInteractiveStateOnDurationMs); + + if (reducedInteractiveStateOnDurationMs < screenOffTimeoutMs + && reducedInteractiveStateOnDurationMs >= 0) { + mWakefulnessSessionFrameworkStatsLogger.logSessionEvent( + mPowerGroupId, + interactiveStateOffReason, + interactiveStateOnDurationMs, + lastUserActivity, + lastUserActivityDurationMs, + reducedInteractiveStateOnDurationMs); + } else { + Slog.w(TAG, "invalid reducedInteractiveStateOnDurationMs: " + + reducedInteractiveStateOnDurationMs); + } + } } @@ -608,6 +606,7 @@ public class WakefulnessSessionObserver { return; } + final int screenOffTimeoutMs = getScreenOffTimeout(); int dimDurationMs = 0; int lastUserActivity = mCurrentUserActivityEvent; int lastUserActivityDurationMs = (int) (eventTime - mCurrentUserActivityTimestamp); @@ -625,7 +624,7 @@ public class WakefulnessSessionObserver { lastUserActivity, lastUserActivityDurationMs, dimDurationMs, - mScreenOffTimeoutMs); + screenOffTimeoutMs); mPastDimDurationMs = dimDurationMs; return; } @@ -645,7 +644,7 @@ public class WakefulnessSessionObserver { lastUserActivity, lastUserActivityDurationMs, dimDurationMs, - mScreenOffTimeoutMs); + screenOffTimeoutMs); mHandler.removeCallbacksAndMessages(HANDLER_TOKEN); } @@ -674,7 +673,7 @@ public class WakefulnessSessionObserver { savedLastUserActivity, savedLastUserActivityDurationMs, savedDimDurationMs, - mScreenOffTimeoutMs); + screenOffTimeoutMs); mPastDimDurationMs = savedDimDurationMs; }, HANDLER_TOKEN, SCREEN_POLICY_DIM_POWER_OFF_BRIGHT_THRESHOLD_MILLIS); } @@ -692,7 +691,7 @@ public class WakefulnessSessionObserver { lastUserActivity, lastUserActivityDurationMs, mPastDimDurationMs, - mScreenOffTimeoutMs); + screenOffTimeoutMs); } return; } diff --git a/services/tests/servicestests/src/com/android/server/power/WakefulnessSessionObserverTest.java b/services/tests/servicestests/src/com/android/server/power/WakefulnessSessionObserverTest.java index 6b32be0b2dfd..1af366b32da9 100644 --- a/services/tests/servicestests/src/com/android/server/power/WakefulnessSessionObserverTest.java +++ b/services/tests/servicestests/src/com/android/server/power/WakefulnessSessionObserverTest.java @@ -28,6 +28,7 @@ import static android.view.Display.DEFAULT_DISPLAY_GROUP; import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_UNKNOWN; import static com.android.server.power.ScreenTimeoutOverridePolicy.RELEASE_REASON_USER_ACTIVITY_TOUCH; import static com.android.server.power.WakefulnessSessionObserver.OFF_REASON_POWER_BUTTON; +import static com.android.server.power.WakefulnessSessionObserver.OFF_REASON_TIMEOUT; import static com.android.server.power.WakefulnessSessionObserver.OVERRIDE_OUTCOME_CANCEL_POWER_BUTTON; import static com.android.server.power.WakefulnessSessionObserver.OVERRIDE_OUTCOME_CANCEL_USER_INTERACTION; import static com.android.server.power.WakefulnessSessionObserver.OVERRIDE_OUTCOME_TIMEOUT_SUCCESS; @@ -40,6 +41,7 @@ import static com.android.server.power.WakefulnessSessionObserver.POLICY_REASON_ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; @@ -90,6 +92,7 @@ public class WakefulnessSessionObserverTest { mWakefulnessSessionFrameworkStatsLogger; @Mock private DisplayManagerInternal mDisplayManagerInternal; + private MockContentResolver mContentResolver = new MockContentResolver(); private TestHandler mHandler; @Before @@ -106,10 +109,9 @@ public class WakefulnessSessionObserverTest { R.integer.config_screenTimeoutOverride); when(mContext.getResources()).thenReturn(res); FakeSettingsProvider.clearSettingsProvider(); - MockContentResolver mockContentResolver = new MockContentResolver(); - mockContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); - when(mContext.getContentResolver()).thenReturn(mockContentResolver); - Settings.System.putIntForUser(mockContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + mContentResolver.addProvider(Settings.AUTHORITY, new FakeSettingsProvider()); + when(mContext.getContentResolver()).thenReturn(mContentResolver); + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, DEFAULT_SCREEN_OFF_TIMEOUT_MS, UserHandle.USER_CURRENT); final DisplayInfo info = new DisplayInfo(); @@ -511,6 +513,115 @@ public class WakefulnessSessionObserverTest { DEFAULT_SCREEN_OFF_TIMEOUT_MS); // default Timeout Ms } + @Test + public void testScreenOffTimeout_normal_logSessionEventTriggered() { + int powerGroupId = 1; + int userActivity = PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY; + triggerLogSessionEvent(powerGroupId, userActivity); + verify(mWakefulnessSessionFrameworkStatsLogger) + .logSessionEvent( + powerGroupId, // powerGroupId + OFF_REASON_TIMEOUT, // interactiveStateOffReason + 0, // interactiveStateOnDurationMs + userActivity, // userActivity + 0, // lastUserActivityEventDurationMs + DEFAULT_SCREEN_OFF_TIMEOUT_MS - OVERRIDE_SCREEN_OFF_TIMEOUT_MS + ); // reducedInteractiveStateOnDurationMs; + } + + @Test + public void testScreenOffTimeout_zero_noLogSessionEventTriggered() { + // simulate adding an invalid screen_off_timeout value + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + 0, // invalid timeout value + UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + + try { + triggerLogSessionEvent(); + verify(mWakefulnessSessionFrameworkStatsLogger, never()) + .logSessionEvent(anyInt(), anyInt(), anyLong(), anyInt(), anyLong(), anyInt()); + } finally { + // rollback the original data + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + DEFAULT_SCREEN_OFF_TIMEOUT_MS, UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + } + } + + @Test + public void testScreenOffTimeout_negative_noLogSessionEventTriggered() { + // simulate adding an invalid screen_off_timeout value + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + -1, // invalid timeout value + UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + + try { + triggerLogSessionEvent(); + verify(mWakefulnessSessionFrameworkStatsLogger, never()) + .logSessionEvent(anyInt(), anyInt(), anyLong(), anyInt(), anyLong(), anyInt()); + } finally { + // rollback the original data + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + DEFAULT_SCREEN_OFF_TIMEOUT_MS, UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + } + } + + @Test + public void testScreenOffTimeout_max_logSessionEventTriggered() { + // simulate adding the max screen_off_timeout value + int defaultTimeoutMs = Integer.MAX_VALUE; + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + defaultTimeoutMs, + UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + + try { + int powerGroupId = 1; + int userActivity = PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY; + triggerLogSessionEvent(powerGroupId, userActivity); + verify(mWakefulnessSessionFrameworkStatsLogger) + .logSessionEvent( + powerGroupId, // powerGroupId + OFF_REASON_TIMEOUT, // interactiveStateOffReason + 0, // interactiveStateOnDurationMs + userActivity, // userActivity + 0, // lastUserActivityEventDurationMs + defaultTimeoutMs - OVERRIDE_SCREEN_OFF_TIMEOUT_MS + ); // reducedInteractiveStateOnDurationMs; + } finally { + // rollback the original data + Settings.System.putIntForUser(mContentResolver, Settings.System.SCREEN_OFF_TIMEOUT, + DEFAULT_SCREEN_OFF_TIMEOUT_MS, UserHandle.USER_CURRENT); + mWakefulnessSessionObserver.updateSettingScreenOffTimeout(mContext); + } + } + + private void triggerLogSessionEvent() { + triggerLogSessionEvent(1, PowerManager.USER_ACTIVITY_EVENT_ACCESSIBILITY); + } + + private void triggerLogSessionEvent(int powerGroupId, int userActivity) { + mWakefulnessSessionObserver.onWakefulnessChangeStarted( + powerGroupId, + PowerManagerInternal.WAKEFULNESS_AWAKE, + WAKE_REASON_POWER_BUTTON, + mTestClock.now()); + mWakefulnessSessionObserver.onWakeLockAcquired( + PowerManager.SCREEN_TIMEOUT_OVERRIDE_WAKE_LOCK); + + long userActivityTime = mTestClock.now(); + mWakefulnessSessionObserver.notifyUserActivity( + userActivityTime, powerGroupId, userActivity); + mWakefulnessSessionObserver.onWakefulnessChangeStarted( + powerGroupId, + PowerManagerInternal.WAKEFULNESS_DOZING, + GO_TO_SLEEP_REASON_TIMEOUT, + mTestClock.now()); + } + private void advanceTime(long timeMs) { mTestClock.fastForward(timeMs); } -- GitLab From e88c1e66da12ca5de4ca294654f5717380bd9990 Mon Sep 17 00:00:00 2001 From: Tetiana Meronyk Date: Mon, 14 Oct 2024 12:21:58 +0000 Subject: [PATCH 021/459] Add handling of simultaneous alarms/timers Initial implementation handled only one alarm at a time, if a new alarm came in, a notification for it would not be shown until the initial alarm is muted/dismissed. Now we can keep track of all uids that have audio focus for ALARM usage type and therefore handle each of them independently. Bug: 367615180 Test: atest BackgroundUserSoundNotifier Flag: android.multiuser.multiple_alarm_notifications_support Change-Id: I7a988e6c8f426b596ebc93f1433174424e62b50f --- .../pm/BackgroundUserSoundNotifier.java | 69 +++++++++++---- .../pm/BackgroundUserSoundNotifierTest.java | 83 ++++++++++++++++++- 2 files changed, 135 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/pm/BackgroundUserSoundNotifier.java b/services/core/java/com/android/server/pm/BackgroundUserSoundNotifier.java index a221152222ee..d1d6ed0f1f99 100644 --- a/services/core/java/com/android/server/pm/BackgroundUserSoundNotifier.java +++ b/services/core/java/com/android/server/pm/BackgroundUserSoundNotifier.java @@ -34,16 +34,19 @@ import android.media.AudioFocusInfo; import android.media.AudioManager; import android.media.AudioPlaybackConfiguration; import android.media.audiopolicy.AudioPolicy; +import android.multiuser.Flags; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.util.ArraySet; import android.util.Log; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; import java.util.List; +import java.util.Set; public class BackgroundUserSoundNotifier { @@ -65,6 +68,10 @@ public class BackgroundUserSoundNotifier { */ @VisibleForTesting int mNotificationClientUid = -1; + /** + * UIDs of audio focus infos with active notifications. + */ + Set mNotificationClientUids = new ArraySet<>(); @VisibleForTesting AudioPolicy mFocusControlAudioPolicy; @VisibleForTesting @@ -149,26 +156,42 @@ public class BackgroundUserSoundNotifier { @SuppressLint("MissingPermission") @Override public void onReceive(Context context, Intent intent) { - if (mNotificationClientUid == -1) { - return; + if (Flags.multipleAlarmNotificationsSupport()) { + if (!intent.hasExtra(EXTRA_NOTIFICATION_CLIENT_UID)) { + return; + } + } else { + if (mNotificationClientUid == -1) { + return; + } } - dismissNotification(mNotificationClientUid); + + int clientUid; + if (Flags.multipleAlarmNotificationsSupport()) { + clientUid = intent.getIntExtra(EXTRA_NOTIFICATION_CLIENT_UID, -1); + } else { + clientUid = mNotificationClientUid; + } + dismissNotification(clientUid); if (DEBUG) { final int actionIndex = intent.getAction().lastIndexOf(".") + 1; final String action = intent.getAction().substring(actionIndex); Log.d(LOG_TAG, "Action requested: " + action + ", by userId " + ActivityManager.getCurrentUser() + " for alarm on user " - + UserHandle.getUserHandleForUid(mNotificationClientUid)); + + UserHandle.getUserHandleForUid(clientUid)); } if (ACTION_MUTE_SOUND.equals(intent.getAction())) { - muteAlarmSounds(mNotificationClientUid); + muteAlarmSounds(clientUid); } else if (ACTION_SWITCH_USER.equals(intent.getAction())) { - activityManager.switchUser(UserHandle.getUserId(mNotificationClientUid)); + activityManager.switchUser(UserHandle.getUserId(clientUid)); + } + if (Flags.multipleAlarmNotificationsSupport()) { + mNotificationClientUids.remove(clientUid); + } else { + mNotificationClientUid = -1; } - - mNotificationClientUid = -1; } }; @@ -215,10 +238,11 @@ public class BackgroundUserSoundNotifier { final int userId = UserHandle.getUserId(afi.getClientUid()); final int usage = afi.getAttributes().getUsage(); UserInfo userInfo = mUserManager.getUserInfo(userId); + // Only show notification if the sound is coming from background user and the notification - // is not already shown. + // for this UID is not already shown. if (userInfo != null && userId != foregroundContext.getUserId() - && mNotificationClientUid == -1) { + && !isNotificationShown(afi.getClientUid())) { //TODO: b/349138482 - Add handling of cases when usage == USAGE_NOTIFICATION_RINGTONE if (usage == USAGE_ALARM) { if (DEBUG) { @@ -226,8 +250,11 @@ public class BackgroundUserSoundNotifier { + ", displaying notification for current user " + foregroundContext.getUserId()); } - - mNotificationClientUid = afi.getClientUid(); + if (Flags.multipleAlarmNotificationsSupport()) { + mNotificationClientUids.add(afi.getClientUid()); + } else { + mNotificationClientUid = afi.getClientUid(); + } mNotificationManager.notifyAsUser(LOG_TAG, afi.getClientUid(), createNotification(userInfo.name, foregroundContext, afi.getClientUid()), @@ -243,15 +270,21 @@ public class BackgroundUserSoundNotifier { */ @VisibleForTesting void dismissNotificationIfNecessary(int notificationClientUid) { + if (getAudioFocusInfoForNotification(notificationClientUid) == null - && mNotificationClientUid >= 0) { + && isNotificationShown(notificationClientUid)) { if (DEBUG) { Log.d(LOG_TAG, "Alarm ringing on background user " + UserHandle.getUserHandleForUid(notificationClientUid).getIdentifier() + " left focus stack, dismissing notification"); } dismissNotification(notificationClientUid); - mNotificationClientUid = -1; + + if (Flags.multipleAlarmNotificationsSupport()) { + mNotificationClientUids.remove(notificationClientUid); + } else { + mNotificationClientUid = -1; + } } } @@ -331,4 +364,12 @@ public class BackgroundUserSoundNotifier { return notificationBuilder.build(); } + + private boolean isNotificationShown(int notificationClientUid) { + if (Flags.multipleAlarmNotificationsSupport()) { + return mNotificationClientUids.contains(notificationClientUid); + } else { + return mNotificationClientUid != -1; + } + } } diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundUserSoundNotifierTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundUserSoundNotifierTest.java index 625dbe6e16f9..bf946a1258fd 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundUserSoundNotifierTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/BackgroundUserSoundNotifierTest.java @@ -41,14 +41,19 @@ import android.media.AudioManager; import android.media.AudioPlaybackConfiguration; import android.media.PlayerProxy; import android.media.audiopolicy.AudioPolicy; +import android.multiuser.Flags; import android.os.Build; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.util.ArraySet; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -60,7 +65,6 @@ import java.util.List; import java.util.Stack; @RunWith(JUnit4.class) - public class BackgroundUserSoundNotifierTest { private final Context mRealContext = androidx.test.InstrumentationRegistry.getInstrumentation() .getTargetContext(); @@ -72,6 +76,10 @@ public class BackgroundUserSoundNotifierTest { @Mock private NotificationManager mNotificationManager; + + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); @@ -142,8 +150,11 @@ public class BackgroundUserSoundNotifierTest { final int fgUserId = mSpiedContext.getUserId(); int bgUserId = fgUserId + 1; int bgUserUid = bgUserId * 100000; - mBackgroundUserSoundNotifier.mNotificationClientUid = bgUserUid; - + if (Flags.multipleAlarmNotificationsSupport()) { + mBackgroundUserSoundNotifier.mNotificationClientUids.add(bgUserUid); + } else { + mBackgroundUserSoundNotifier.mNotificationClientUid = bgUserUid; + } AudioManager mockAudioManager = mock(AudioManager.class); when(mSpiedContext.getSystemService(AudioManager.class)).thenReturn(mockAudioManager); @@ -243,6 +254,72 @@ public class BackgroundUserSoundNotifierTest { notification.actions[0].title); } + @RequiresFlagsEnabled({Flags.FLAG_MULTIPLE_ALARM_NOTIFICATIONS_SUPPORT}) + @Test + public void testMultipleAlarmsSameUid_OneNotificationCreated() throws RemoteException { + assumeTrue(UserManager.supportsMultipleUsers()); + UserInfo user = createUser("User", UserManager.USER_TYPE_FULL_SECONDARY, 0); + final int fgUserId = mSpiedContext.getUserId(); + final int bgUserUid = user.id * 100000; + doReturn(UserHandle.of(fgUserId)).when(mSpiedContext).getUser(); + + AudioAttributes aa = new AudioAttributes.Builder().setUsage(USAGE_ALARM).build(); + AudioFocusInfo afi1 = new AudioFocusInfo(aa, bgUserUid, "", + /* packageName= */ "com.android.car.audio", AudioManager.AUDIOFOCUS_GAIN, + AudioManager.AUDIOFOCUS_NONE, /* flags= */ 0, Build.VERSION.SDK_INT); + + mBackgroundUserSoundNotifier.notifyForegroundUserAboutSoundIfNecessary(afi1); + verify(mNotificationManager) + .notifyAsUser(eq(BackgroundUserSoundNotifier.class.getSimpleName()), + eq(afi1.getClientUid()), any(Notification.class), + eq(UserHandle.of(fgUserId))); + + AudioFocusInfo afi2 = new AudioFocusInfo(aa, bgUserUid, "", + /* packageName= */ "com.android.car.audio", AudioManager.AUDIOFOCUS_GAIN, + AudioManager.AUDIOFOCUS_NONE, /* flags= */ 0, Build.VERSION.SDK_INT); + clearInvocations(mNotificationManager); + mBackgroundUserSoundNotifier.notifyForegroundUserAboutSoundIfNecessary(afi2); + verify(mNotificationManager, never()) + .notifyAsUser(eq(BackgroundUserSoundNotifier.class.getSimpleName()), + eq(afi2.getClientUid()), any(Notification.class), + eq(UserHandle.of(fgUserId))); + } + + @RequiresFlagsEnabled({Flags.FLAG_MULTIPLE_ALARM_NOTIFICATIONS_SUPPORT}) + @Test + public void testMultipleAlarmsDifferentUsers_multipleNotificationsCreated() + throws RemoteException { + assumeTrue(UserManager.supportsMultipleUsers()); + UserInfo user1 = createUser("User1", UserManager.USER_TYPE_FULL_SECONDARY, 0); + UserInfo user2 = createUser("User2", UserManager.USER_TYPE_FULL_SECONDARY, 0); + final int fgUserId = mSpiedContext.getUserId(); + final int bgUserUid1 = user1.id * 100000; + final int bgUserUid2 = user2.id * 100000; + doReturn(UserHandle.of(fgUserId)).when(mSpiedContext).getUser(); + + AudioAttributes aa = new AudioAttributes.Builder().setUsage(USAGE_ALARM).build(); + AudioFocusInfo afi1 = new AudioFocusInfo(aa, bgUserUid1, "", + /* packageName= */ "com.android.car.audio", AudioManager.AUDIOFOCUS_GAIN, + AudioManager.AUDIOFOCUS_NONE, /* flags= */ 0, Build.VERSION.SDK_INT); + + mBackgroundUserSoundNotifier.notifyForegroundUserAboutSoundIfNecessary(afi1); + verify(mNotificationManager) + .notifyAsUser(eq(BackgroundUserSoundNotifier.class.getSimpleName()), + eq(afi1.getClientUid()), any(Notification.class), + eq(UserHandle.of(fgUserId))); + + AudioFocusInfo afi2 = new AudioFocusInfo(aa, bgUserUid2, "", + /* packageName= */ "com.android.car.audio", AudioManager.AUDIOFOCUS_GAIN, + AudioManager.AUDIOFOCUS_NONE, /* flags= */ 0, Build.VERSION.SDK_INT); + clearInvocations(mNotificationManager); + mBackgroundUserSoundNotifier.notifyForegroundUserAboutSoundIfNecessary(afi2); + verify(mNotificationManager) + .notifyAsUser(eq(BackgroundUserSoundNotifier.class.getSimpleName()), + eq(afi2.getClientUid()), any(Notification.class), + eq(UserHandle.of(fgUserId))); + } + + private UserInfo createUser(String name, String userType, int flags) { UserInfo user = mUserManager.createUser(name, userType, flags); if (user != null) { -- GitLab From 44cb19410102507f39e4f0bda863b96c87ddf9f7 Mon Sep 17 00:00:00 2001 From: Mina Granic Date: Wed, 16 Oct 2024 10:59:08 +0000 Subject: [PATCH 022/459] Check event in app's bounds using absolute coordinates. Event's X and Y coordinates are relative to the current window, not necessarily the app, meaning that windows with different coordinate systems than the apps - for example dialogs - would have incorrect calculations if used. Also, even if the tap is outside the current window's bounds, but inside app's bounds, it should be forwarded to the app (for example to trigger dialog dismiss). Flag: com.android.window.flags.scrolling_from_letterbox Test: atest FrameworksCoreTests:LetterboxScrollProcessorTest Test: verified dialogs are dismissable. Fixes: 372918146 Change-Id: I01f57aacf8b2aa04854f76c0d5cb0417b797a8aa --- .../view/LetterboxScrollProcessor.java | 16 ++++- .../view/LetterboxScrollProcessorTest.java | 68 +++++++++++++++++-- 2 files changed, 75 insertions(+), 9 deletions(-) diff --git a/core/java/android/view/LetterboxScrollProcessor.java b/core/java/android/view/LetterboxScrollProcessor.java index dc736d6abf7d..4fc34429e151 100644 --- a/core/java/android/view/LetterboxScrollProcessor.java +++ b/core/java/android/view/LetterboxScrollProcessor.java @@ -145,9 +145,19 @@ public class LetterboxScrollProcessor { return mContext.getResources().getConfiguration().windowConfiguration.getBounds(); } - private boolean isOutsideAppBounds(MotionEvent motionEvent, Rect appBounds) { - return motionEvent.getX() < 0 || motionEvent.getX() >= appBounds.width() - || motionEvent.getY() < 0 || motionEvent.getY() >= appBounds.height(); + /** Checks whether the gesture is located on the letterbox area. */ + private boolean isOutsideAppBounds(@NonNull MotionEvent motionEvent, @NonNull Rect appBounds) { + // The events are in the coordinate system of the ViewRootImpl (window). The window might + // not have the same dimensions as the app bounds - for example in case of Dialogs - thus + // `getRawX()` and `getRawY()` are used, with the absolute bounds (left, top, etc) instead + // of width and height. + // The event should be passed to the app if it has happened anywhere in the app area, + // irrespective of the current window size, therefore the app bounds are used instead of the + // current window. + return motionEvent.getRawX() < appBounds.left + || motionEvent.getRawX() >= appBounds.right + || motionEvent.getRawY() < appBounds.top + || motionEvent.getRawY() >= appBounds.bottom; } private void applyOffset(MotionEvent event, Rect appBounds) { diff --git a/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java index f8ec9f4fb51b..4e401b86d592 100644 --- a/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java +++ b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java @@ -31,6 +31,7 @@ import android.os.Handler; import android.os.Looper; import android.platform.test.annotations.Presubmit; +import androidx.annotation.NonNull; import androidx.test.filters.SmallTest; import androidx.test.platform.app.InstrumentationRegistry; @@ -57,13 +58,15 @@ public class LetterboxScrollProcessorTest { // Constant delta used when comparing coordinates (floats) private static final float EPSILON = 0.1f; + private static final Rect APP_BOUNDS = + new Rect(/* left= */ 200, /* top= */ 200, /* right= */ 600, /* bottom= */ 1000); + @Before public void setUp() { mContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); // Set app bounds as if it was letterboxed. - mContext.getResources().getConfiguration().windowConfiguration - .setBounds(new Rect(200, 200, 600, 1000)); + mContext.getResources().getConfiguration().windowConfiguration.setBounds(APP_BOUNDS); Handler handler = new Handler(Looper.getMainLooper()); @@ -86,6 +89,24 @@ public class LetterboxScrollProcessorTest { assertMotionEventsShouldBeFinished(processedEvents); } + @Test + public void testGestureInAppBoundsButOutsideTopWindowAlsoForwardedToTheApp() { + final Rect dialogBounds = + new Rect(/* left= */ 300, /* top= */ 500, /* right= */ 500, /* bottom= */ 700); + // Tap-like gesture outside the dialog, but in app bounds. + List tapGestureEvents = createTapGestureEventsWithCoordinateSystem(0f, 0f, + dialogBounds); + + // Get processed events from Letterbox Scroll Processor. + List processedEvents = processMotionEvents(tapGestureEvents); + + // Ensure no changes are made to events after processing - the event should be forwarded as + // normal. + assertEventLocationsAreNotAdjusted(tapGestureEvents, processedEvents); + // Ensure all of these events should be finished (expect no generated events). + assertMotionEventsShouldBeFinished(processedEvents); + } + @Test public void testGestureOutsideBoundsIsIgnored() { // Tap-like gesture outside bounds (non-scroll). @@ -187,11 +208,25 @@ public class LetterboxScrollProcessorTest { return processedEvents; } + /** + * Creates and returns a tap gesture with X and Y in reference to the app bounds (top left + * corner is x=0, y=0). + */ private List createTapGestureEvents(float startX, float startY) { + return createTapGestureEventsWithCoordinateSystem(startX, startY, APP_BOUNDS); + } + + /** + * @param referenceWindowBounds the amount the event will be translated by. + */ + private List createTapGestureEventsWithCoordinateSystem(float startX, float startY, + @NonNull Rect referenceWindowBounds) { // Events for tap-like gesture (non-scroll) List motionEvents = new ArrayList<>(); - motionEvents.add(createBasicMotionEvent(0, ACTION_DOWN, startX, startY)); - motionEvents.add(createBasicMotionEvent(10, ACTION_UP, startX , startY)); + motionEvents.add(createBasicMotionEventWithCoordinateSystem(0, ACTION_DOWN, + startX, startY, referenceWindowBounds)); + motionEvents.add(createBasicMotionEventWithCoordinateSystem(10, ACTION_UP, + startX , startY, referenceWindowBounds)); return motionEvents; } @@ -213,8 +248,29 @@ public class LetterboxScrollProcessorTest { return motionEvents; } - private MotionEvent createBasicMotionEvent(int downTime, int action, float x, float y) { - return MotionEvent.obtain(0, downTime, action, x, y, 0); + /** + * Creates and returns an event with X and Y in reference to the app bounds (top left corner is + * x=0, y=0). + */ + @NonNull + private MotionEvent createBasicMotionEvent(int eventTime, int action, float x, float y) { + return createBasicMotionEventWithCoordinateSystem(eventTime, action, x, y, APP_BOUNDS); + } + + /** + * @param referenceWindowBounds the amount the event will be translated by. + */ + @NonNull + private MotionEvent createBasicMotionEventWithCoordinateSystem(int eventTime, int action, + float x, float y, @NonNull Rect referenceWindowBounds) { + final float rawX = referenceWindowBounds.left + x; + final float rawY = referenceWindowBounds.top + y; + // RawX and RawY cannot be changed once the event is created. Therefore, pass rawX and rawY + // according to the app's bounds on the display, and then offset to make X and Y relative to + // the app's bounds. + final MotionEvent event = MotionEvent.obtain(0, eventTime, action, rawX, rawY, 0); + event.offsetLocation(-referenceWindowBounds.left, -referenceWindowBounds.top); + return event; } private void assertEventLocationsAreNotAdjusted( -- GitLab From 9b38acc800238b2e3d8b9186c30fdef984851c24 Mon Sep 17 00:00:00 2001 From: Mina Granic Date: Wed, 16 Oct 2024 10:59:57 +0000 Subject: [PATCH 023/459] Cleanup LetterboxScrollProcessor with @NonNull and similar. Flag: com.android.window.flags.scrolling_from_letterbox Test: atest FrameworksCoreTests:LetterboxScrollProcessorTest Bug: 353697519 Change-Id: Ifc0b5381149457a77465f5b5eaf06172113d9847 --- .../view/LetterboxScrollProcessor.java | 24 ++++-- .../view/LetterboxScrollProcessorTest.java | 79 ++++++++++--------- 2 files changed, 59 insertions(+), 44 deletions(-) diff --git a/core/java/android/view/LetterboxScrollProcessor.java b/core/java/android/view/LetterboxScrollProcessor.java index 4fc34429e151..1364a82e60a1 100644 --- a/core/java/android/view/LetterboxScrollProcessor.java +++ b/core/java/android/view/LetterboxScrollProcessor.java @@ -16,6 +16,8 @@ package android.view; +import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE; + import android.annotation.Nullable; import android.content.Context; import android.graphics.Rect; @@ -23,6 +25,8 @@ import android.os.Handler; import androidx.annotation.NonNull; +import com.android.internal.annotations.VisibleForTesting; + import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -35,6 +39,7 @@ import java.util.Set; * * @hide */ +@VisibleForTesting(visibility = PACKAGE) public class LetterboxScrollProcessor { private enum LetterboxScrollState { @@ -53,6 +58,7 @@ public class LetterboxScrollProcessor { /** IDs of events generated from this class */ private final Set mGeneratedEventIds = new HashSet<>(); + @VisibleForTesting(visibility = PACKAGE) public LetterboxScrollProcessor(@NonNull Context context, @Nullable Handler handler) { mContext = context; mScrollDetector = new GestureDetector(context, new ScrollListener(), handler); @@ -69,7 +75,9 @@ public class LetterboxScrollProcessor { * @return The list of adjusted events, or null if no adjustments are needed. The list is empty * if the event should be ignored. Do not keep a reference to the output as the list is reused. */ - public List processMotionEvent(MotionEvent motionEvent) { + @Nullable + @VisibleForTesting(visibility = PACKAGE) + public List processMotionEvent(@NonNull MotionEvent motionEvent) { mProcessedEvents.clear(); final Rect appBounds = getAppBounds(); @@ -124,11 +132,9 @@ public class LetterboxScrollProcessor { mState = LetterboxScrollState.AWAITING_GESTURE_START; } - if (makeNoAdjustments) return null; - return mProcessedEvents; + return makeNoAdjustments ? null : mProcessedEvents; } - /** * Processes the InputEvent for compatibility before it is finished by calling * InputEventReceiver#finishInputEvent(). @@ -136,11 +142,13 @@ public class LetterboxScrollProcessor { * @param motionEvent The MotionEvent to process. * @return The motionEvent to finish, or null if it should not be finished. */ - public InputEvent processMotionEventBeforeFinish(MotionEvent motionEvent) { - if (mGeneratedEventIds.remove(motionEvent.getId())) return null; - return motionEvent; + @Nullable + @VisibleForTesting(visibility = PACKAGE) + public InputEvent processMotionEventBeforeFinish(@NonNull MotionEvent motionEvent) { + return mGeneratedEventIds.remove(motionEvent.getId()) ? null : motionEvent; } + @NonNull private Rect getAppBounds() { return mContext.getResources().getConfiguration().windowConfiguration.getBounds(); } @@ -160,7 +168,7 @@ public class LetterboxScrollProcessor { || motionEvent.getRawY() >= appBounds.bottom; } - private void applyOffset(MotionEvent event, Rect appBounds) { + private void applyOffset(@NonNull MotionEvent event, @NonNull Rect appBounds) { float horizontalOffset = calculateOffset(event.getX(), appBounds.width()); float verticalOffset = calculateOffset(event.getY(), appBounds.height()); // Apply the offset to the motion event so it is over the app's view. diff --git a/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java index 4e401b86d592..235625d8f14c 100644 --- a/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java +++ b/core/tests/coretests/src/android/view/LetterboxScrollProcessorTest.java @@ -38,7 +38,6 @@ import androidx.test.platform.app.InstrumentationRegistry; import org.junit.Before; import org.junit.Test; - import java.util.ArrayList; import java.util.List; @@ -55,7 +54,7 @@ public class LetterboxScrollProcessorTest { private LetterboxScrollProcessor mLetterboxScrollProcessor; private Context mContext; - // Constant delta used when comparing coordinates (floats) + // Constant delta used when comparing coordinates (floats). private static final float EPSILON = 0.1f; private static final Rect APP_BOUNDS = @@ -68,19 +67,19 @@ public class LetterboxScrollProcessorTest { // Set app bounds as if it was letterboxed. mContext.getResources().getConfiguration().windowConfiguration.setBounds(APP_BOUNDS); - Handler handler = new Handler(Looper.getMainLooper()); - // Recreate to reset LetterboxScrollProcessor state. - mLetterboxScrollProcessor = new LetterboxScrollProcessor(mContext, handler); + mLetterboxScrollProcessor = new LetterboxScrollProcessor(mContext, + new Handler(Looper.getMainLooper())); } @Test public void testGestureInBoundsHasNoAdjustments() { // Tap-like gesture in bounds (non-scroll). - List tapGestureEvents = createTapGestureEvents(0f, 0f); + final List tapGestureEvents = createTapGestureEvents( + /* startX= */ 0f, /* startY= */ 0f); // Get processed events from Letterbox Scroll Processor. - List processedEvents = processMotionEvents(tapGestureEvents); + final List processedEvents = processMotionEvents(tapGestureEvents); // Ensure no changes are made to events after processing - event locations should not be // adjusted because the gesture started in the app's bounds (for all gestures). @@ -110,10 +109,11 @@ public class LetterboxScrollProcessorTest { @Test public void testGestureOutsideBoundsIsIgnored() { // Tap-like gesture outside bounds (non-scroll). - List tapGestureEvents = createTapGestureEvents(-100f, -100f); + final List tapGestureEvents = createTapGestureEvents( + /* startX= */ -100f, /* startY= */ -100f); // Get processed events from Letterbox Scroll Processor. - List processedEvents = processMotionEvents(tapGestureEvents); + final List processedEvents = processMotionEvents(tapGestureEvents); // All events should be ignored since it was a non-scroll gesture and out of bounds. assertEquals(0, processedEvents.size()); @@ -122,10 +122,11 @@ public class LetterboxScrollProcessorTest { @Test public void testScrollGestureInBoundsHasNoAdjustments() { // Scroll gesture in bounds (non-scroll). - List scrollGestureEvents = createScrollGestureEvents(0f, 0f); + final List scrollGestureEvents = createScrollGestureEvents( + /* startX= */ 0f, /* startY= */ 0f); // Get processed events from Letterbox Scroll Processor. - List processedEvents = processMotionEvents(scrollGestureEvents); + final List processedEvents = processMotionEvents(scrollGestureEvents); // Ensure no changes are made to events after processing - event locations should not be // adjusted because the gesture started in the app's bounds (for all gestures). @@ -137,10 +138,11 @@ public class LetterboxScrollProcessorTest { @Test public void testScrollGestureInBoundsThenLeavesBoundsHasNoAdjustments() { // Scroll gesture in bounds (non-scroll) that moves out of bounds. - List scrollGestureEvents = createScrollGestureEvents(390f, 790f); + final List scrollGestureEvents = createScrollGestureEvents( + /* startX= */ 390f, /* startY= */ 790f); // Get processed events from Letterbox Scroll Processor. - List processedEvents = processMotionEvents(scrollGestureEvents); + final List processedEvents = processMotionEvents(scrollGestureEvents); // Ensure no changes are made to events after processing - event locations should not be // adjusted because the gesture started in the app's bounds (for all gestures), even if it @@ -153,7 +155,8 @@ public class LetterboxScrollProcessorTest { @Test public void testScrollGestureOutsideBoundsIsStartedInBounds() { // Scroll gesture outside bounds. - List scrollGestureEvents = createScrollGestureEvents(-100f, 0f); + List scrollGestureEvents = createScrollGestureEvents( + /* startX= */ -100f, /* startY= */ 0f); // Get processed events from Letterbox Scroll Processor. List processedEvents = processMotionEvents(scrollGestureEvents); @@ -163,9 +166,9 @@ public class LetterboxScrollProcessorTest { // Ensure offset ACTION_DOWN is first event received. MotionEvent firstProcessedEvent = processedEvents.getFirst(); - assertEquals(firstProcessedEvent.getAction(), ACTION_DOWN); - assertEquals(firstProcessedEvent.getX(), 0, EPSILON); - assertEquals(firstProcessedEvent.getY(), 0, EPSILON); + assertEquals(ACTION_DOWN, firstProcessedEvent.getAction()); + assertEquals(0, firstProcessedEvent.getX(), EPSILON); + assertEquals(0, firstProcessedEvent.getY(), EPSILON); // Ensure this event is not finished (because it was generated by LetterboxScrollProcessor). assertNull(mLetterboxScrollProcessor.processMotionEventBeforeFinish(firstProcessedEvent)); } @@ -173,16 +176,17 @@ public class LetterboxScrollProcessorTest { @Test public void testScrollGestureOutsideBoundsIsMovedInBounds() { // Scroll gesture outside bounds. - List scrollGestureEvents = createScrollGestureEvents(-100f, 0f); + final List scrollGestureEvents = createScrollGestureEvents( + /* startX= */ -100f, /* startY= */ 0f); // Get processed events from Letterbox Scroll Processor. - List processedEvents = processMotionEvents(scrollGestureEvents); + final List processedEvents = processMotionEvents(scrollGestureEvents); // When a scroll occurs outside bounds: once detected as a scroll, an offset ACTION_DOWN is // placed and then the rest of the gesture is offset also. Some ACTION_MOVE events may be // ignored until the gesture is 'detected as a scroll'. // For this test, we expect the first ACTION_MOVE event to be ignored: - scrollGestureEvents.remove(1); + scrollGestureEvents.remove(/* index= */ 1); // Ensure all processed events (that are not ignored) are offset over the app. assertXCoordinatesAdjustedToZero(scrollGestureEvents, processedEvents); @@ -191,8 +195,9 @@ public class LetterboxScrollProcessorTest { assertMotionEventsShouldBeFinished(processedEvents.subList(1, processedEvents.size())); } - private List processMotionEvents(List motionEvents) { - List processedEvents = new ArrayList<>(); + @NonNull + private List processMotionEvents(@NonNull List motionEvents) { + final List processedEvents = new ArrayList<>(); for (MotionEvent motionEvent : motionEvents) { MotionEvent clonedEvent = MotionEvent.obtain(motionEvent); List letterboxScrollCompatEvents = @@ -212,6 +217,7 @@ public class LetterboxScrollProcessorTest { * Creates and returns a tap gesture with X and Y in reference to the app bounds (top left * corner is x=0, y=0). */ + @NonNull private List createTapGestureEvents(float startX, float startY) { return createTapGestureEventsWithCoordinateSystem(startX, startY, APP_BOUNDS); } @@ -230,20 +236,21 @@ public class LetterboxScrollProcessorTest { return motionEvents; } + @NonNull private List createScrollGestureEvents(float startX, float startY) { - float touchSlop = (float) ViewConfiguration.get(mContext).getScaledTouchSlop(); + final float touchSlop = (float) ViewConfiguration.get(mContext).getScaledTouchSlop(); - // Events for scroll gesture (starts at (startX, startY) then moves down-right - List motionEvents = new ArrayList<>(); - motionEvents.add(createBasicMotionEvent(0, ACTION_DOWN, startX, startY)); - motionEvents.add(createBasicMotionEvent(10, ACTION_MOVE, + // Events for scroll gesture (starts at (startX, startY) then moves down-right. + final List motionEvents = new ArrayList<>(); + motionEvents.add(createBasicMotionEvent(/* downTime= */ 0, ACTION_DOWN, startX, startY)); + motionEvents.add(createBasicMotionEvent(/* downTime= */ 10, ACTION_MOVE, startX + touchSlop / 2, startY + touchSlop / 2)); - // Below event is first event in the scroll gesture where distance > touchSlop - motionEvents.add(createBasicMotionEvent(20, ACTION_MOVE, + // Below event is first event in the scroll gesture where distance > touchSlop. + motionEvents.add(createBasicMotionEvent(/* downTime= */ 20, ACTION_MOVE, startX + touchSlop * 2, startY + touchSlop * 2)); - motionEvents.add(createBasicMotionEvent(30, ACTION_MOVE, + motionEvents.add(createBasicMotionEvent(/* downTime= */ 30, ACTION_MOVE, startX + touchSlop * 3, startY + touchSlop * 3)); - motionEvents.add(createBasicMotionEvent(40, ACTION_UP, + motionEvents.add(createBasicMotionEvent(/* downTime= */ 40, ACTION_UP, startX + touchSlop * 3, startY + touchSlop * 3)); return motionEvents; } @@ -274,8 +281,8 @@ public class LetterboxScrollProcessorTest { } private void assertEventLocationsAreNotAdjusted( - List originalEvents, - List processedEvents) { + @NonNull List originalEvents, + @NonNull List processedEvents) { assertEquals("MotionEvent arrays are not the same size", originalEvents.size(), processedEvents.size()); @@ -288,8 +295,8 @@ public class LetterboxScrollProcessorTest { } private void assertXCoordinatesAdjustedToZero( - List originalEvents, - List processedEvents) { + @NonNull List originalEvents, + @NonNull List processedEvents) { assertEquals("MotionEvent arrays are not the same size", originalEvents.size(), processedEvents.size()); @@ -301,7 +308,7 @@ public class LetterboxScrollProcessorTest { } } - private void assertMotionEventsShouldBeFinished(List processedEvents) { + private void assertMotionEventsShouldBeFinished(@NonNull List processedEvents) { for (MotionEvent processedEvent : processedEvents) { assertNotNull(mLetterboxScrollProcessor.processMotionEventBeforeFinish(processedEvent)); } -- GitLab From 47815b50c2fa943d598b57592be036778844acd2 Mon Sep 17 00:00:00 2001 From: Piotr Karzelek Date: Wed, 16 Oct 2024 13:19:15 +0000 Subject: [PATCH 024/459] remove multi-user and enterprise deprecated functions from DeviceState Test: atest HarrierTest:com.android.bedstead.harrier.MainAnnotationExecutorTest Test: atest CtsDevicePolicyTestCases:android.devicepolicy.cts.UserTest Flag: TEST_ONLY Bug: 334025286 Bug: 336991736 Change-Id: I1d47cc46d07eb3662ef831718f4ea0a7d0be12c1 --- packages/SettingsProvider/Android.bp | 1 + .../settings/SettingsProviderMultiUsersTest.java | 9 ++++++--- .../PackageManagerServiceTests/appenumeration/Android.bp | 1 + .../appenumeration/CrossUserPackageVisibilityTests.java | 5 +++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/SettingsProvider/Android.bp b/packages/SettingsProvider/Android.bp index 65b22758946d..00ae05ceabd4 100644 --- a/packages/SettingsProvider/Android.bp +++ b/packages/SettingsProvider/Android.bp @@ -76,6 +76,7 @@ android_test { "truth", "Nene", "Harrier", + "bedstead-enterprise", ], libs: [ "android.test.base.stubs.system", diff --git a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java index e86e72712b48..9cce43160b52 100644 --- a/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java +++ b/packages/SettingsProvider/test/src/com/android/providers/settings/SettingsProviderMultiUsersTest.java @@ -20,6 +20,9 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_ENABLED; import static android.provider.Settings.Secure.SYNC_PARENT_SOUNDS; import static android.provider.Settings.System.RINGTONE; +import static com.android.bedstead.enterprise.EnterpriseDeviceStateExtensionsKt.workProfile; +import static com.android.bedstead.multiuser.MultiUserDeviceStateExtensionsKt.secondaryUser; + import static com.google.common.truth.Truth.assertThat; import android.content.pm.PackageManager; @@ -82,7 +85,7 @@ public class SettingsProviderMultiUsersTest { @RequireFeature(PackageManager.FEATURE_MANAGED_USERS) @EnsureHasWorkProfile public void testSettings_workProfile() throws Exception { - UserReference profile = sDeviceState.workProfile(); + UserReference profile = workProfile(sDeviceState); // Settings.Global settings are shared between different users assertSettingsShared(SPACE_GLOBAL, mPrimaryUser.id(), profile.id()); @@ -96,7 +99,7 @@ public class SettingsProviderMultiUsersTest { @RequireRunOnInitialUser @EnsureHasSecondaryUser public void testSettings_secondaryUser() throws Exception { - UserReference secondaryUser = sDeviceState.secondaryUser(); + UserReference secondaryUser = secondaryUser(sDeviceState); // Settings.Global settings are shared between different users assertSettingsShared(SPACE_GLOBAL, mPrimaryUser.id(), secondaryUser.id()); @@ -223,7 +226,7 @@ public class SettingsProviderMultiUsersTest { @RequireRunOnInitialUser @EnsureHasSecondaryUser public void testSettings_stopAndRestartSecondaryUser() throws Exception { - UserReference secondaryUser = sDeviceState.secondaryUser(); + UserReference secondaryUser = secondaryUser(sDeviceState); assertSettingsDifferent(SPACE_SECURE, mPrimaryUser.id(), secondaryUser.id()); diff --git a/services/tests/PackageManagerServiceTests/appenumeration/Android.bp b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp index f15e533fee2b..2f00a1bb3c8c 100644 --- a/services/tests/PackageManagerServiceTests/appenumeration/Android.bp +++ b/services/tests/PackageManagerServiceTests/appenumeration/Android.bp @@ -32,6 +32,7 @@ android_test { "androidx.test.runner", "truth", "Harrier", + "bedstead-multiuser", ], platform_apis: true, certificate: "platform", diff --git a/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java index 70a2d4847ce7..48cebd7dcb04 100644 --- a/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java +++ b/services/tests/PackageManagerServiceTests/appenumeration/src/com/android/server/pm/test/appenumeration/CrossUserPackageVisibilityTests.java @@ -22,6 +22,7 @@ import static android.Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS; import static android.Manifest.permission.MOVE_PACKAGE; import static android.content.pm.PackageManager.MOVE_FAILED_DOESNT_EXIST; +import static com.android.bedstead.multiuser.MultiUserDeviceStateExtensionsKt.secondaryUser; import static com.android.compatibility.common.util.ShellUtils.runShellCommand; import static com.google.common.truth.Truth.assertThat; @@ -112,9 +113,9 @@ public class CrossUserPackageVisibilityTests { final UserReference primaryUser = sDeviceState.primaryUser(); if (primaryUser.id() == UserHandle.myUserId()) { mCurrentUser = primaryUser; - mOtherUser = sDeviceState.secondaryUser(); + mOtherUser = secondaryUser(sDeviceState); } else { - mCurrentUser = sDeviceState.secondaryUser(); + mCurrentUser = secondaryUser(sDeviceState); mOtherUser = primaryUser; } -- GitLab From 3b4e0f130d097950eac564a46eab587789f1d180 Mon Sep 17 00:00:00 2001 From: Austin Borger Date: Tue, 15 Oct 2024 17:05:58 -0700 Subject: [PATCH 025/459] Add new Motion Photo intents Android 16 will support launching the native camera app via an intent to return a motion photo. These new intents function similarly to the ACTION_IMAGE_CAPTURE intents, but will not return a Bitmap in the case of an absent uri. Test: N/A Bug: 362580165 Flag: com.android.providers.media.flags.motion_photo_intent Change-Id: I5902db4e4a9c995595ac738e78953f2b5b638988 --- core/java/android/content/Intent.java | 2 ++ .../server/pm/DefaultCrossProfileIntentFiltersUtils.java | 4 ++++ .../java/com/android/server/wm/ActivityTaskSupervisor.java | 2 ++ 3 files changed, 8 insertions(+) diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 0bb0027fb0c3..73e5b336591a 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -12763,6 +12763,8 @@ public class Intent implements Parcelable, Cloneable { private boolean isImageCaptureIntent() { return (MediaStore.ACTION_IMAGE_CAPTURE.equals(mAction) || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(mAction) + || MediaStore.ACTION_MOTION_PHOTO_CAPTURE.equals(mAction) + || MediaStore.ACTION_MOTION_PHOTO_CAPTURE_SECURE.equals(mAction) || MediaStore.ACTION_VIDEO_CAPTURE.equals(mAction)); } diff --git a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java index 5ac883c58f03..9c24abcef123 100644 --- a/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java +++ b/services/core/java/com/android/server/pm/DefaultCrossProfileIntentFiltersUtils.java @@ -316,6 +316,8 @@ public class DefaultCrossProfileIntentFiltersUtils { /* letsPersonalDataIntoProfile= */ true) .addAction(MediaStore.ACTION_IMAGE_CAPTURE) .addAction(MediaStore.ACTION_IMAGE_CAPTURE_SECURE) + .addAction(MediaStore.ACTION_MOTION_PHOTO_CAPTURE) + .addAction(MediaStore.ACTION_MOTION_PHOTO_CAPTURE_SECURE) .addAction(MediaStore.ACTION_VIDEO_CAPTURE) .addAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION) .addAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) @@ -438,6 +440,8 @@ public class DefaultCrossProfileIntentFiltersUtils { /* letsPersonalDataIntoProfile= */ false) .addAction(MediaStore.ACTION_IMAGE_CAPTURE) .addAction(MediaStore.ACTION_IMAGE_CAPTURE_SECURE) + .addAction(MediaStore.ACTION_MOTION_PHOTO_CAPTURE) + .addAction(MediaStore.ACTION_MOTION_PHOTO_CAPTURE_SECURE) .addAction(MediaStore.ACTION_VIDEO_CAPTURE) .addAction(MediaStore.Audio.Media.RECORD_SOUND_ACTION) .addAction(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4f71719006f5..14153a971bb5 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -242,6 +242,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { static { ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_IMAGE_CAPTURE, Manifest.permission.CAMERA); + ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_MOTION_PHOTO_CAPTURE, + Manifest.permission.CAMERA); ACTION_TO_RUNTIME_PERMISSION.put(MediaStore.ACTION_VIDEO_CAPTURE, Manifest.permission.CAMERA); ACTION_TO_RUNTIME_PERMISSION.put(Intent.ACTION_CALL, -- GitLab From 185048041e6f9d43c38829c09965e7a4740d2a6a Mon Sep 17 00:00:00 2001 From: Dmitry Dementyev Date: Wed, 16 Oct 2024 15:01:59 -0700 Subject: [PATCH 026/459] Update checkKeyIntent 1) Explicityly set component after target activity check. 2) Update Intent subclass check. Bug: 360846772 Test: manual Flag: EXEMPT bugfix Merged-In: Ied7961c73299681aa5b523cf3f00fd905893116f Change-Id: Iafc1e2260107f7ecc18c90ce12f8987b4fc76350 --- .../android/server/accounts/AccountManagerService.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/accounts/AccountManagerService.java b/services/core/java/com/android/server/accounts/AccountManagerService.java index 36ffc40bf5f7..5f434ee267d4 100644 --- a/services/core/java/com/android/server/accounts/AccountManagerService.java +++ b/services/core/java/com/android/server/accounts/AccountManagerService.java @@ -4916,6 +4916,8 @@ public class AccountManagerService Log.e(TAG, String.format(tmpl, activityName, pkgName, mAccountType)); return false; } + intent.setComponent(targetActivityInfo.getComponentName()); + bundle.putParcelable(AccountManager.KEY_INTENT, intent); return true; } finally { Binder.restoreCallingIdentity(bid); @@ -4937,13 +4939,14 @@ public class AccountManagerService Bundle simulateBundle = p.readBundle(); p.recycle(); Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); - if (intent != null && intent.getClass() != Intent.class) { - return false; - } Intent simulateIntent = simulateBundle.getParcelable(AccountManager.KEY_INTENT); if (intent == null) { return (simulateIntent == null); } + if (intent.getClass() != Intent.class || simulateIntent.getClass() != Intent.class) { + return false; + } + if (!intent.filterEquals(simulateIntent)) { return false; } -- GitLab From 63df053afbf5b4adb13f905e48a14b98a8929df5 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Martinez Date: Wed, 16 Oct 2024 13:02:52 -0700 Subject: [PATCH 027/459] Adding the MSDLPlayer to platform slider haptics. To deliver MSDL slider haptic feedback, the MSDL player is integrated into SliderHapticFeedbackProvider. This enables MSDL for legacy and composable sliders. Test: atest SliderHapticFeedbackProviderTest Flag: com.android.systemui.msdl_feedback Bug: 371192839 Bug: 371192839 Bug: 373919020 Change-Id: I9627446d5c905247735ed76a3574d6d2aaa8f57a --- .../haptics/slider/SeekbarHapticPluginTest.kt | 7 +- .../SliderHapticFeedbackProviderTest.kt | 242 ++++++++++++++++++ .../BrightnessSliderControllerTest.kt | 35 +-- .../haptics/slider/SeekbarHapticPlugin.kt | 3 + .../slider/SliderHapticFeedbackProvider.kt | 46 +++- .../compose/ui/SliderHapticsViewModel.kt | 3 + .../BrightnessSliderController.java | 6 + .../systemui/volume/VolumeDialogImpl.java | 8 +- .../systemui/volume/dagger/VolumeModule.java | 4 + .../systemui/volume/VolumeDialogImplTest.java | 5 + .../systemui/haptics/msdl/FakeMSDLPlayer.kt | 9 +- .../SliderHapticsViewModelFactoryKosmos.kt | 2 + .../BrightnessSliderControllerKosmos.kt | 2 + 13 files changed, 332 insertions(+), 40 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt index 855b6d0b95d7..587d3d98fbec 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt @@ -20,6 +20,7 @@ import android.widget.SeekBar import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.haptics.msdl.msdlPlayer import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testScope import com.android.systemui.statusbar.VibratorHelper @@ -141,11 +142,7 @@ class SeekbarHapticPluginTest : SysuiTestCase() { } private fun createPlugin() { - plugin = - SeekbarHapticPlugin( - vibratorHelper, - kosmos.fakeSystemClock, - ) + plugin = SeekbarHapticPlugin(vibratorHelper, kosmos.msdlPlayer, kosmos.fakeSystemClock) } companion object { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt index 28f88fe1d84e..3467382df4da 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProviderTest.kt @@ -16,16 +16,26 @@ package com.android.systemui.haptics.slider +import android.os.VibrationAttributes import android.os.VibrationEffect +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.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.haptics.fakeVibratorHelper +import com.android.systemui.haptics.msdl.fakeMSDLPlayer +import com.android.systemui.kosmos.testScope import com.android.systemui.testKosmos import com.android.systemui.util.time.fakeSystemClock +import com.google.android.msdl.data.model.MSDLToken +import com.google.android.msdl.domain.InteractionProperties +import com.google.common.truth.Truth.assertThat import kotlin.math.max import kotlin.test.assertEquals import kotlin.test.assertTrue +import kotlinx.coroutines.test.runTest import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -35,6 +45,7 @@ import org.junit.runner.RunWith class SliderHapticFeedbackProviderTest : SysuiTestCase() { private val kosmos = testKosmos() + private val testScope = kosmos.testScope private val config = SliderHapticFeedbackConfig() @@ -44,7 +55,14 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { private val dragTextureThresholdMillis = lowTickDuration * config.numberOfLowTicks + config.deltaMillisForDragInterval private val vibratorHelper = kosmos.fakeVibratorHelper + private val msdlPlayer = kosmos.fakeMSDLPlayer private lateinit var sliderHapticFeedbackProvider: SliderHapticFeedbackProvider + private val pipeliningAttributes = + VibrationAttributes.Builder() + .setUsage(VibrationAttributes.USAGE_TOUCH) + .setFlags(VibrationAttributes.FLAG_PIPELINED_EFFECT) + .build() + private lateinit var dynamicProperties: InteractionProperties.DynamicVibrationScale @Before fun setup() { @@ -54,13 +72,20 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { sliderHapticFeedbackProvider = SliderHapticFeedbackProvider( vibratorHelper, + msdlPlayer, dragVelocityProvider, config, kosmos.fakeSystemClock, ) + dynamicProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnEdgeCollision(config.maxVelocityToScale), + pipeliningAttributes, + ) } @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtLowerBookend_playsClick() = with(kosmos) { val vibration = @@ -77,6 +102,18 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtLowerBookend_playsDragThresholdLimitToken() = + testScope.runTest { + sliderHapticFeedbackProvider.onLowerBookend() + + assertThat(msdlPlayer.latestTokenPlayed) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(dynamicProperties) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtLowerBookend_twoTimes_playsClickOnlyOnce() = with(kosmos) { val vibration = @@ -94,6 +131,20 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtLowerBookend_twoTimes_playsDragThresholdLimitTokenOnlyOnce() = + testScope.runTest { + sliderHapticFeedbackProvider.onLowerBookend() + sliderHapticFeedbackProvider.onLowerBookend() + + assertThat(msdlPlayer.latestTokenPlayed) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(dynamicProperties) + assertThat(msdlPlayer.getHistory().size).isEqualTo(1) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtUpperBookend_playsClick() = with(kosmos) { val vibration = @@ -110,6 +161,18 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtUpperBookend_playsDragThresholdLimitToken() = + testScope.runTest { + sliderHapticFeedbackProvider.onUpperBookend() + + assertThat(msdlPlayer.latestTokenPlayed) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(dynamicProperties) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtUpperBookend_twoTimes_playsClickOnlyOnce() = with(kosmos) { val vibration = @@ -127,6 +190,20 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtUpperBookend_twoTimes_playsDragThresholdLimitTokenOnlyOnce() = + testScope.runTest { + sliderHapticFeedbackProvider.onUpperBookend() + sliderHapticFeedbackProvider.onUpperBookend() + + assertThat(msdlPlayer.latestTokenPlayed) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(dynamicProperties) + assertThat(msdlPlayer.getHistory().size).isEqualTo(1) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtProgress_onQuickSuccession_playsLowTicksOnce() = with(kosmos) { // GIVEN max velocity and slider progress @@ -150,6 +227,31 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtProgress_onQuickSuccession_playsContinuousDragTokenOnce() = + with(kosmos) { + // GIVEN max velocity and slider progress + val progress = 1f + val expectedScale = + sliderHapticFeedbackProvider.scaleOnDragTexture(config.maxVelocityToScale, progress) + val expectedProperties = + InteractionProperties.DynamicVibrationScale(expectedScale, pipeliningAttributes) + + // GIVEN system running for 1s + fakeSystemClock.advanceTime(1000) + + // WHEN two calls to play occur immediately + sliderHapticFeedbackProvider.onProgress(progress) + sliderHapticFeedbackProvider.onProgress(progress) + + // THEN the correct token plays once + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.DRAG_INDICATOR_CONTINUOUS) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(expectedProperties) + assertThat(msdlPlayer.getHistory().size).isEqualTo(1) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtProgress_beforeNextDragThreshold_playsLowTicksOnce() = with(kosmos) { // GIVEN max velocity and a slider progress at half progress @@ -175,6 +277,41 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtProgress_beforeNextDragThreshold_playsContinousDragTokenOnce() = + with(kosmos) { + // GIVEN max velocity and a slider progress at half progress + val firstProgress = 0.5f + + // Given a second slider progress event smaller than the progress threshold + val secondProgress = + firstProgress + max(0f, config.deltaProgressForDragThreshold - 0.01f) + + // GIVEN system running for 1s + fakeSystemClock.advanceTime(1000) + + // WHEN two calls to play occur with the required threshold separation (time and + // progress) + sliderHapticFeedbackProvider.onProgress(firstProgress) + fakeSystemClock.advanceTime(dragTextureThresholdMillis.toLong()) + sliderHapticFeedbackProvider.onProgress(secondProgress) + + // THEN Only the first event plays the expected token and propertiesv + val expectedProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnDragTexture( + config.maxVelocityToScale, + firstProgress, + ), + pipeliningAttributes, + ) + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.DRAG_INDICATOR_CONTINUOUS) + assertThat(msdlPlayer.latestPropertiesPlayed).isEqualTo(expectedProperties) + assertThat(msdlPlayer.getHistory().size).isEqualTo(1) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtProgress_afterNextDragThreshold_playsLowTicksTwice() = with(kosmos) { // GIVEN max velocity and a slider progress at half progress @@ -200,6 +337,51 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtProgress_afterNextDragThreshold_playsContinuousDragTokenTwice() = + with(kosmos) { + // GIVEN max velocity and a slider progress at half progress + val firstProgress = 0.5f + + // Given a second slider progress event beyond progress threshold + val secondProgress = firstProgress + config.deltaProgressForDragThreshold + 0.01f + + // GIVEN system running for 1s + fakeSystemClock.advanceTime(1000) + + // WHEN two calls to play occur with the required threshold separation (time and + // progress) + sliderHapticFeedbackProvider.onProgress(firstProgress) + fakeSystemClock.advanceTime(dragTextureThresholdMillis.toLong()) + sliderHapticFeedbackProvider.onProgress(secondProgress) + + // THEN the correct token plays twice with the correct properties + val firstProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnDragTexture( + config.maxVelocityToScale, + firstProgress, + ), + pipeliningAttributes, + ) + val secondProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnDragTexture( + config.maxVelocityToScale, + secondProgress, + ), + pipeliningAttributes, + ) + + assertThat(msdlPlayer.getHistory().size).isEqualTo(2) + assertThat(msdlPlayer.tokensPlayed[0]).isEqualTo(MSDLToken.DRAG_INDICATOR_CONTINUOUS) + assertThat(msdlPlayer.propertiesPlayed[0]).isEqualTo(firstProperties) + assertThat(msdlPlayer.tokensPlayed[1]).isEqualTo(MSDLToken.DRAG_INDICATOR_CONTINUOUS) + assertThat(msdlPlayer.propertiesPlayed[1]).isEqualTo(secondProperties) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtLowerBookend_afterPlayingAtProgress_playsTwice() = with(kosmos) { // GIVEN max velocity and slider progress @@ -233,6 +415,36 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { } @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtLowerBookend_afterPlayingAtProgress_playsTokensTwice() = + with(kosmos) { + // GIVEN max velocity and slider progress + val progress = 1f + val expectedProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnEdgeCollision(config.maxVelocityToScale), + pipeliningAttributes, + ) + + // GIVEN a vibration at the lower bookend followed by a request to vibrate at progress + sliderHapticFeedbackProvider.onLowerBookend() + sliderHapticFeedbackProvider.onProgress(progress) + + // WHEN a vibration is to trigger again at the lower bookend + sliderHapticFeedbackProvider.onLowerBookend() + + // THEN there are two bookend token vibrations + assertThat(msdlPlayer.getHistory().size).isEqualTo(2) + assertThat(msdlPlayer.tokensPlayed[0]) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.propertiesPlayed[0]).isEqualTo(expectedProperties) + assertThat(msdlPlayer.tokensPlayed[1]) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.propertiesPlayed[1]).isEqualTo(expectedProperties) + } + + @Test + @DisableFlags(Flags.FLAG_MSDL_FEEDBACK) fun playHapticAtUpperBookend_afterPlayingAtProgress_playsTwice() = with(kosmos) { // GIVEN max velocity and slider progress @@ -265,6 +477,36 @@ class SliderHapticFeedbackProviderTest : SysuiTestCase() { ) } + @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun playHapticAtUpperBookend_afterPlayingAtProgress_playsTokensTwice() = + with(kosmos) { + // GIVEN max velocity and slider progress + val progress = 1f + val expectedProperties = + InteractionProperties.DynamicVibrationScale( + sliderHapticFeedbackProvider.scaleOnEdgeCollision(config.maxVelocityToScale), + pipeliningAttributes, + ) + + // GIVEN a vibration at the upper bookend followed by a request to vibrate at progress + sliderHapticFeedbackProvider.onUpperBookend() + sliderHapticFeedbackProvider.onProgress(progress) + + // WHEN a vibration is to trigger again at the upper bookend + sliderHapticFeedbackProvider.onUpperBookend() + + // THEN there are two bookend vibrations + assertThat(msdlPlayer.getHistory().size).isEqualTo(2) + assertThat(msdlPlayer.tokensPlayed[0]) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.propertiesPlayed[0]).isEqualTo(expectedProperties) + assertThat(msdlPlayer.tokensPlayed[1]) + .isEqualTo(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT) + assertThat(msdlPlayer.propertiesPlayed[1]).isEqualTo(expectedProperties) + } + + @Test fun dragTextureLastProgress_afterDragTextureHaptics_keepsLastDragTextureProgress() = with(kosmos) { // GIVEN max velocity and a slider progress at half progress diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt index fb91c78b9041..080f46fd5f48 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt @@ -32,6 +32,7 @@ import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.capture import com.android.systemui.util.mockito.eq import com.android.systemui.util.time.FakeSystemClock +import com.google.android.msdl.domain.MSDLPlayer import com.google.common.truth.Truth.assertThat import org.junit.After import org.junit.Before @@ -46,34 +47,26 @@ import org.mockito.Mockito.isNull import org.mockito.Mockito.never import org.mockito.Mockito.notNull import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations import org.mockito.Mockito.`when` as whenever +import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidTestingRunner::class) class BrightnessSliderControllerTest : SysuiTestCase() { - @Mock - private lateinit var brightnessSliderView: BrightnessSliderView - @Mock - private lateinit var enforcedAdmin: RestrictedLockUtils.EnforcedAdmin - @Mock - private lateinit var mirrorController: BrightnessMirrorController - @Mock - private lateinit var mirror: ToggleSlider - @Mock - private lateinit var motionEvent: MotionEvent - @Mock - private lateinit var listener: ToggleSlider.Listener - @Mock - private lateinit var vibratorHelper: VibratorHelper - @Mock - private lateinit var activityStarter: ActivityStarter + @Mock private lateinit var brightnessSliderView: BrightnessSliderView + @Mock private lateinit var enforcedAdmin: RestrictedLockUtils.EnforcedAdmin + @Mock private lateinit var mirrorController: BrightnessMirrorController + @Mock private lateinit var mirror: ToggleSlider + @Mock private lateinit var motionEvent: MotionEvent + @Mock private lateinit var listener: ToggleSlider.Listener + @Mock private lateinit var vibratorHelper: VibratorHelper + @Mock private lateinit var msdlPlayer: MSDLPlayer + @Mock private lateinit var activityStarter: ActivityStarter @Captor private lateinit var seekBarChangeCaptor: ArgumentCaptor - @Mock - private lateinit var seekBar: SeekBar + @Mock private lateinit var seekBar: SeekBar private val uiEventLogger = UiEventLoggerFake() private var mFalsingManager: FalsingManagerFake = FalsingManagerFake() private val systemClock = FakeSystemClock() @@ -93,7 +86,7 @@ class BrightnessSliderControllerTest : SysuiTestCase() { brightnessSliderView, mFalsingManager, uiEventLogger, - SeekbarHapticPlugin(vibratorHelper, systemClock), + SeekbarHapticPlugin(vibratorHelper, msdlPlayer, systemClock), activityStarter, ) mController.init() @@ -241,4 +234,4 @@ class BrightnessSliderControllerTest : SysuiTestCase() { assertThat(uiEventLogger.numLogs()).isEqualTo(1) assertThat(uiEventLogger.eventId(0)).isEqualTo(event.id) } -} \ No newline at end of file +} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt index 932e5af6244b..cc77f68a801e 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt @@ -22,6 +22,7 @@ import android.widget.SeekBar import androidx.annotation.VisibleForTesting import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.util.time.SystemClock +import com.google.android.msdl.domain.MSDLPlayer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay @@ -39,6 +40,7 @@ class SeekbarHapticPlugin @JvmOverloads constructor( vibratorHelper: VibratorHelper, + msdlPlayer: MSDLPlayer, systemClock: SystemClock, sliderHapticFeedbackConfig: SliderHapticFeedbackConfig = SliderHapticFeedbackConfig(), private val sliderTrackerConfig: SeekableSliderTrackerConfig = SeekableSliderTrackerConfig(), @@ -63,6 +65,7 @@ constructor( private val sliderHapticFeedbackProvider = SliderHapticFeedbackProvider( vibratorHelper, + msdlPlayer, dragVelocityProvider, sliderHapticFeedbackConfig, systemClock, diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt index 06428b77f759..bc4f531b8b81 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderHapticFeedbackProvider.kt @@ -22,7 +22,11 @@ import android.view.VelocityTracker import android.view.animation.AccelerateInterpolator import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting +import com.android.systemui.Flags import com.android.systemui.statusbar.VibratorHelper +import com.google.android.msdl.data.model.MSDLToken +import com.google.android.msdl.domain.InteractionProperties +import com.google.android.msdl.domain.MSDLPlayer import kotlin.math.abs import kotlin.math.min import kotlin.math.pow @@ -38,6 +42,7 @@ import kotlin.math.pow */ class SliderHapticFeedbackProvider( private val vibratorHelper: VibratorHelper, + private val msdlPlayer: MSDLPlayer, private val velocityProvider: SliderDragVelocityProvider, private val config: SliderHapticFeedbackConfig = SliderHapticFeedbackConfig(), private val clock: com.android.systemui.util.time.SystemClock, @@ -67,11 +72,20 @@ class SliderHapticFeedbackProvider( */ private fun vibrateOnEdgeCollision(absoluteVelocity: Float) { val powerScale = scaleOnEdgeCollision(absoluteVelocity) - val vibration = - VibrationEffect.startComposition() - .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, powerScale) - .compose() - vibratorHelper.vibrate(vibration, VIBRATION_ATTRIBUTES_PIPELINING) + if (Flags.msdlFeedback()) { + val properties = + InteractionProperties.DynamicVibrationScale( + powerScale, + VIBRATION_ATTRIBUTES_PIPELINING, + ) + msdlPlayer.playToken(MSDLToken.DRAG_THRESHOLD_INDICATOR_LIMIT, properties) + } else { + val vibration = + VibrationEffect.startComposition() + .addPrimitive(VibrationEffect.Composition.PRIMITIVE_CLICK, powerScale) + .compose() + vibratorHelper.vibrate(vibration, VIBRATION_ATTRIBUTES_PIPELINING) + } } /** @@ -112,16 +126,26 @@ class SliderHapticFeedbackProvider( val powerScale = scaleOnDragTexture(absoluteVelocity, normalizedSliderProgress) - // Trigger the vibration composition - val composition = VibrationEffect.startComposition() - repeat(config.numberOfLowTicks) { - composition.addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK, powerScale) - } - vibratorHelper.vibrate(composition.compose(), VIBRATION_ATTRIBUTES_PIPELINING) + // Deliver haptic feedback + performContinuousSliderDragVibration(powerScale) dragTextureLastTime = currentTime dragTextureLastProgress = normalizedSliderProgress } + private fun performContinuousSliderDragVibration(scale: Float) { + if (Flags.msdlFeedback()) { + val properties = + InteractionProperties.DynamicVibrationScale(scale, VIBRATION_ATTRIBUTES_PIPELINING) + msdlPlayer.playToken(MSDLToken.DRAG_INDICATOR_CONTINUOUS, properties) + } else { + val composition = VibrationEffect.startComposition() + repeat(config.numberOfLowTicks) { + composition.addPrimitive(VibrationEffect.Composition.PRIMITIVE_LOW_TICK, scale) + } + vibratorHelper.vibrate(composition.compose(), VIBRATION_ATTRIBUTES_PIPELINING) + } + } + /** * Get the scale of the drag texture vibration. * 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..07bc86189d09 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 @@ -33,6 +33,7 @@ import com.android.systemui.haptics.slider.SliderStateTracker import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.util.time.SystemClock +import com.google.android.msdl.domain.MSDLPlayer import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject @@ -50,6 +51,7 @@ constructor( @Assisted private val sliderHapticFeedbackConfig: SliderHapticFeedbackConfig, @Assisted private val sliderTrackerConfig: SeekableSliderTrackerConfig, vibratorHelper: VibratorHelper, + msdlPlayer: MSDLPlayer, systemClock: SystemClock, ) : ExclusiveActivatable() { @@ -78,6 +80,7 @@ constructor( private val sliderHapticFeedbackProvider = SliderHapticFeedbackProvider( vibratorHelper, + msdlPlayer, dragVelocityProvider, sliderHapticFeedbackConfig, systemClock, diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java index 75165cb5610e..8703f68f39aa 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java @@ -40,6 +40,8 @@ import com.android.systemui.statusbar.policy.BrightnessMirrorController; import com.android.systemui.util.ViewController; import com.android.systemui.util.time.SystemClock; +import com.google.android.msdl.domain.MSDLPlayer; + import javax.inject.Inject; /** @@ -283,12 +285,14 @@ public class BrightnessSliderController extends ViewController mSecureSettings; private int mDialogTimeoutMillis; private final VibratorHelper mVibratorHelper; + private final MSDLPlayer mMSDLPlayer; private final com.android.systemui.util.time.SystemClock mSystemClock; private final VolumePanelFlag mVolumePanelFlag; private final VolumeDialogInteractor mInteractor; @@ -340,12 +342,14 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, DumpManager dumpManager, Lazy secureSettings, VibratorHelper vibratorHelper, + MSDLPlayer msdlPlayer, com.android.systemui.util.time.SystemClock systemClock, VolumeDialogInteractor interactor) { mContext = new ContextThemeWrapper(context, R.style.volume_dialog_theme); mHandler = new H(looper); mVibratorHelper = vibratorHelper; + mMSDLPlayer = msdlPlayer; mSystemClock = systemClock; mShouldListenForJank = shouldListenForJank; mController = volumeDialogController; @@ -927,7 +931,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, } private void addSliderHapticsToRow(VolumeRow row) { - row.createPlugin(mVibratorHelper, mSystemClock); + row.createPlugin(mVibratorHelper, mMSDLPlayer, mSystemClock); HapticSliderViewBinder.bind(row.slider, row.mHapticPlugin); } @@ -2707,11 +2711,13 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, void createPlugin( VibratorHelper vibratorHelper, + MSDLPlayer msdlPlayer, com.android.systemui.util.time.SystemClock systemClock) { if (mHapticPlugin != null) return; mHapticPlugin = new SeekbarHapticPlugin( vibratorHelper, + msdlPlayer, systemClock, sSliderHapticFeedbackConfig, sSliderTrackerConfig); diff --git a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java index ed8de69ec482..2009143859d3 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java +++ b/packages/SystemUI/src/com/android/systemui/volume/dagger/VolumeModule.java @@ -50,6 +50,8 @@ import com.android.systemui.volume.panel.dagger.factory.VolumePanelComponentFact import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag; import com.android.systemui.volume.ui.navigation.VolumeNavigator; +import com.google.android.msdl.domain.MSDLPlayer; + import dagger.Binds; import dagger.Lazy; import dagger.Module; @@ -121,6 +123,7 @@ public interface VolumeModule { DumpManager dumpManager, Lazy secureSettings, VibratorHelper vibratorHelper, + MSDLPlayer msdlPlayer, SystemClock systemClock, VolumeDialogInteractor interactor) { if (Flags.volumeRedesign()) { @@ -144,6 +147,7 @@ public interface VolumeModule { dumpManager, secureSettings, vibratorHelper, + msdlPlayer, systemClock, interactor); impl.setStreamImportant(AudioManager.STREAM_SYSTEM, false); diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java index ecc7909a857a..3007eabba0b8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogImplTest.java @@ -92,6 +92,7 @@ import com.android.systemui.volume.domain.interactor.VolumePanelNavigationIntera import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag; import com.android.systemui.volume.ui.navigation.VolumeNavigator; +import com.google.android.msdl.domain.MSDLPlayer; import com.google.common.collect.ImmutableList; import dagger.Lazy; @@ -169,6 +170,9 @@ public class VolumeDialogImplTest extends SysuiTestCase { @Mock private VibratorHelper mVibratorHelper; + @Mock + private MSDLPlayer mMSDLPlayer; + private int mLongestHideShowAnimationDuration = 250; private FakeSettings mSecureSettings; @@ -222,6 +226,7 @@ public class VolumeDialogImplTest extends SysuiTestCase { mDumpManager, mLazySecureSettings, mVibratorHelper, + mMSDLPlayer, new FakeSystemClock(), mVolumeDialogInteractor); mDialog.init(0, null); diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/FakeMSDLPlayer.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/FakeMSDLPlayer.kt index 2b81da33b9bc..fe82ab9ff7ed 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/FakeMSDLPlayer.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/FakeMSDLPlayer.kt @@ -23,19 +23,24 @@ import com.google.android.msdl.domain.MSDLPlayer import com.google.android.msdl.logging.MSDLEvent class FakeMSDLPlayer : MSDLPlayer { + val tokensPlayed = mutableListOf() + val propertiesPlayed = mutableListOf() private val history = arrayListOf() + var currentFeedbackLevel = FeedbackLevel.DEFAULT var latestTokenPlayed: MSDLToken? = null + get() = tokensPlayed.lastOrNull() private set var latestPropertiesPlayed: InteractionProperties? = null + get() = propertiesPlayed.lastOrNull() private set override fun getSystemFeedbackLevel(): FeedbackLevel = currentFeedbackLevel override fun playToken(token: MSDLToken, properties: InteractionProperties?) { - latestTokenPlayed = token - latestPropertiesPlayed = properties + tokensPlayed.add(token) + propertiesPlayed.add(properties) history.add(MSDLEvent(token, properties)) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/slider/SliderHapticsViewModelFactoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/slider/SliderHapticsViewModelFactoryKosmos.kt index 257d758fe6e6..3fbcf7773eb7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/slider/SliderHapticsViewModelFactoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/slider/SliderHapticsViewModelFactoryKosmos.kt @@ -18,6 +18,7 @@ package com.android.systemui.haptics.slider import androidx.compose.foundation.gestures.Orientation import androidx.compose.foundation.interaction.InteractionSource +import com.android.systemui.haptics.msdl.msdlPlayer import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.haptics.vibratorHelper import com.android.systemui.kosmos.Kosmos @@ -40,6 +41,7 @@ val Kosmos.sliderHapticsViewModelFactory by sliderHapticFeedbackConfig, sliderTrackerConfig, vibratorHelper, + msdlPlayer, fakeSystemClock, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt index 8b7e5d8f54c5..88063c9b5db9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/settings/BrightnessSliderControllerKosmos.kt @@ -18,6 +18,7 @@ package com.android.systemui.settings import com.android.internal.logging.uiEventLogger import com.android.systemui.classifier.falsingManager +import com.android.systemui.haptics.msdl.msdlPlayer import com.android.systemui.haptics.vibratorHelper import com.android.systemui.kosmos.Kosmos import com.android.systemui.plugins.activityStarter @@ -31,6 +32,7 @@ var Kosmos.brightnessSliderControllerFactory by falsingManager, uiEventLogger, vibratorHelper, + msdlPlayer, systemClock, activityStarter, ) -- GitLab From 692cddfb32abae6c77b00c4850fd36b7eaaf8c70 Mon Sep 17 00:00:00 2001 From: Raphael Kim Date: Wed, 16 Oct 2024 14:42:21 -0700 Subject: [PATCH 028/459] [CDM] Check for system calling UID when backing up and restoring data Bug: 370962373 Test: Manual test on POC Flag: EXEMPT bugfix Change-Id: I307940b7194dd17eacbbfb8be5c92ac21e688c65 --- .../server/companion/CompanionDeviceManagerService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 95281c81fc33..591107010431 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -715,11 +715,17 @@ public class CompanionDeviceManagerService extends SystemService { @Override public byte[] getBackupPayload(int userId) { + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system"); + } return mBackupRestoreProcessor.getBackupPayload(userId); } @Override public void applyRestoredPayload(byte[] payload, int userId) { + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system"); + } mBackupRestoreProcessor.applyRestoredPayload(payload, userId); } -- GitLab From 746b93479637a280bf4e91a51646a14c98ffda5c Mon Sep 17 00:00:00 2001 From: Eino-Ville Talvala Date: Wed, 11 Sep 2024 22:24:46 -0700 Subject: [PATCH 029/459] Add YCBCR_P210 format YCBCR_P210 is a 10-bit 4:2:2 YCbCr color format. Add the definition in HardwareBuffer, ImageFormat, and MediaCodecInfo. Test: New tests pass Flag: android.media.codec.p210_format_support Bug: 368395888 Change-Id: I515478ecd1aa4aa22346f4a88bd900f6c3e97889 --- core/api/current.txt | 3 ++ .../java/android/hardware/HardwareBuffer.java | 11 ++++++++ .../java/android/graphics/ImageFormat.java | 28 ++++++++++++++++++- media/java/android/media/MediaCodecInfo.java | 27 ++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) diff --git a/core/api/current.txt b/core/api/current.txt index ec6a20c49629..d3f49ac928f9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -16360,6 +16360,7 @@ package android.graphics { field public static final int UNKNOWN = 0; // 0x0 field public static final int Y8 = 538982489; // 0x20203859 field public static final int YCBCR_P010 = 54; // 0x36 + field @FlaggedApi("android.media.codec.p210_format_support") public static final int YCBCR_P210 = 60; // 0x3c field public static final int YUV_420_888 = 35; // 0x23 field public static final int YUV_422_888 = 39; // 0x27 field public static final int YUV_444_888 = 40; // 0x28 @@ -18708,6 +18709,7 @@ package android.hardware { field public static final long USAGE_VIDEO_ENCODE = 65536L; // 0x10000L field public static final int YCBCR_420_888 = 35; // 0x23 field public static final int YCBCR_P010 = 54; // 0x36 + field @FlaggedApi("android.media.codec.p210_format_support") public static final int YCBCR_P210 = 60; // 0x3c } @FlaggedApi("android.hardware.flags.overlayproperties_class_api") public final class OverlayProperties implements android.os.Parcelable { @@ -22975,6 +22977,7 @@ package android.media { field public static final int COLOR_FormatYUV444Flexible = 2135181448; // 0x7f444888 field @Deprecated public static final int COLOR_FormatYUV444Interleaved = 29; // 0x1d field public static final int COLOR_FormatYUVP010 = 54; // 0x36 + field @FlaggedApi("android.media.codec.p210_format_support") public static final int COLOR_FormatYUVP210 = 60; // 0x3c field @Deprecated public static final int COLOR_QCOM_FormatYUV420SemiPlanar = 2141391872; // 0x7fa30c00 field @Deprecated public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 2130706688; // 0x7f000100 field public static final String FEATURE_AdaptivePlayback = "adaptive-playback"; diff --git a/core/java/android/hardware/HardwareBuffer.java b/core/java/android/hardware/HardwareBuffer.java index 8c87ad3353b6..1f7382f64b67 100644 --- a/core/java/android/hardware/HardwareBuffer.java +++ b/core/java/android/hardware/HardwareBuffer.java @@ -66,6 +66,7 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { DS_FP32UI8, S_UI8, YCBCR_P010, + YCBCR_P210, R_8, R_16, RG_1616, @@ -111,6 +112,16 @@ public final class HardwareBuffer implements Parcelable, AutoCloseable { * little-endian value, with the lower 6 bits set to zero. */ public static final int YCBCR_P010 = 0x36; + /** + *

Android YUV P210 format.

+ * + * P210 is a 4:2:2 YCbCr semiplanar format comprised of a WxH Y plane + * followed by a WxH CbCr plane. Each sample is represented by a 16-bit + * little-endian value, with the lower 6 bits set to zero. + */ + @FlaggedApi(android.media.codec.Flags.FLAG_P210_FORMAT_SUPPORT) + public static final int YCBCR_P210 = 0x3c; + /** Format: 8 bits red */ @FlaggedApi(com.android.graphics.hwui.flags.Flags.FLAG_REQUESTED_FORMATS_V) public static final int R_8 = 0x38; diff --git a/graphics/java/android/graphics/ImageFormat.java b/graphics/java/android/graphics/ImageFormat.java index cb3b64c3e6cd..93d94c9cd7eb 100644 --- a/graphics/java/android/graphics/ImageFormat.java +++ b/graphics/java/android/graphics/ImageFormat.java @@ -16,6 +16,7 @@ package android.graphics; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import java.lang.annotation.Retention; @@ -41,6 +42,7 @@ public class ImageFormat { Y8, Y16, YCBCR_P010, + YCBCR_P210, NV16, NV21, YUY2, @@ -205,6 +207,26 @@ public class ImageFormat { */ public static final int YCBCR_P010 = 0x36; + /** + *

Android YUV P210 format.

+ * + * P210 is a 4:2:2 YCbCr semiplanar format comprised of a WxH Y plane + * followed by a WxH CbCr plane. Each sample is represented by a 16-bit + * little-endian value, with the lower 6 bits set to zero. + * + *

For example, the {@link android.media.Image} object can provide data + * in this format from a {@link android.hardware.camera2.CameraDevice} + * through a {@link android.media.ImageReader} object if this format is + * supported by {@link android.hardware.camera2.CameraDevice}.

+ * + * @see android.media.Image + * @see android.media.ImageReader + * @see android.hardware.camera2.CameraDevice + * + */ + @FlaggedApi(android.media.codec.Flags.FLAG_P210_FORMAT_SUPPORT) + public static final int YCBCR_P210 = 0x3c; + /** * YCbCr format, used for video. * @@ -849,6 +871,8 @@ public class ImageFormat { return 16; case YCBCR_P010: return 24; + case YCBCR_P210: + return 32; case RAW_DEPTH10: case RAW10: return 10; @@ -899,7 +923,9 @@ public class ImageFormat { case JPEG_R: return true; } - + if (android.media.codec.Flags.p210FormatSupport() && format == YCBCR_P210) { + return true; + } return false; } } diff --git a/media/java/android/media/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java index 8ff4305a9817..3a19f466f7c1 100644 --- a/media/java/android/media/MediaCodecInfo.java +++ b/media/java/android/media/MediaCodecInfo.java @@ -462,6 +462,33 @@ public final class MediaCodecInfo { @SuppressLint("AllUpper") public static final int COLOR_FormatYUVP010 = 54; + /** + * P210 is 10-bit-per component 4:2:2 YCbCr semiplanar format. + *

+ * This format uses 32 allocated bits per pixel with 20 bits of + * data per pixel. Chroma planes are subsampled by 2 both + * horizontally. Each chroma and luma component + * has 16 allocated bits in little-endian configuration with 10 + * MSB of actual data. + * + *

+         *            byte                   byte
+         *  <--------- i --------> | <------ i + 1 ------>
+         * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+         * |     UNUSED      |      Y/Cb/Cr                |
+         * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
+         *  0               5 6   7 0                    7
+         * bit
+         * 
+ * + * Use this format with {@link Image}. This format corresponds + * to {@link android.graphics.ImageFormat#YCBCR_P210}. + *

+ */ + @SuppressLint("AllUpper") + @FlaggedApi(android.media.codec.Flags.FLAG_P210_FORMAT_SUPPORT) + public static final int COLOR_FormatYUVP210 = 60; + /** @deprecated Use {@link #COLOR_FormatYUV420Flexible}. */ public static final int COLOR_TI_FormatYUV420PackedSemiPlanar = 0x7f000100; // COLOR_FormatSurface indicates that the data will be a GraphicBuffer metadata reference. -- GitLab From f318ad521c8dfa4106219547995aeb773f7fdc83 Mon Sep 17 00:00:00 2001 From: David Padlipsky Date: Thu, 17 Oct 2024 01:19:56 +0000 Subject: [PATCH 030/459] Update bug report shortcut to launch the bug handler app Updates the Meta + Ctrl + Backspace shortcut to open the assigned bug handler. Bug: 369926469 Test: Manually on device Flag: EXEMPT due to minor update of debug behavior Change-Id: I41fbfb94372f3698d3bce15195790c118ad563fd --- .../com/android/server/policy/PhoneWindowManager.java | 8 ++++++-- .../com/android/server/policy/TestPhoneWindowManager.java | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ad5c84026aa6..26651e586f0e 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -3608,7 +3608,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (mEnableBugReportKeyboardShortcut && firstDown && event.isMetaPressed() && event.isCtrlPressed()) { try { - mActivityManagerService.requestInteractiveBugReport(); + if (!mActivityManagerService.launchBugReportHandlerApp()) { + mActivityManagerService.requestInteractiveBugReport(); + } } catch (RemoteException e) { Slog.d(TAG, "Error taking bugreport", e); } @@ -4102,7 +4104,9 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT: if (complete && mEnableBugReportKeyboardShortcut) { try { - mActivityManagerService.requestInteractiveBugReport(); + if (!mActivityManagerService.launchBugReportHandlerApp()) { + mActivityManagerService.requestInteractiveBugReport(); + } } catch (RemoteException e) { Slog.d(TAG, "Error taking bugreport", e); } diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index a85f8666d2e1..0f6a33823125 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -822,9 +822,9 @@ class TestPhoneWindowManager { void assertTakeBugreport(boolean wasCalled) throws RemoteException { mTestLooper.dispatchAll(); if (wasCalled) { - verify(mActivityManagerService).requestInteractiveBugReport(); + verify(mActivityManagerService).launchBugReportHandlerApp(); } else { - verify(mActivityManagerService, never()).requestInteractiveBugReport(); + verify(mActivityManagerService, never()).launchBugReportHandlerApp(); } } -- GitLab From e6cd19d9df5261d71687890e0857aeafea51f205 Mon Sep 17 00:00:00 2001 From: krhardeep Date: Mon, 14 Oct 2024 13:59:03 +0000 Subject: [PATCH 031/459] Handle malformed PDFs gracefully in PrintSpooler The PrintSpooler now handles malformed PDFs by marking the print job as failed and calling finish(), preventing RuntimeException Bug: 367448551 Flag: EXEMPT bug fix Test: atest IPrintManagerParametersTest, tested in test app on a physical device Change-Id: I54d14b270741172eff7e4147ad59b2e0d39ab188 --- .../android/print/IPrintDocumentAdapter.aidl | 1 - core/java/android/print/PrintManager.java | 20 ------------------- .../model/RemotePrintDocument.java | 12 ----------- .../printspooler/ui/PrintActivity.java | 8 ++++++-- 4 files changed, 6 insertions(+), 35 deletions(-) diff --git a/core/java/android/print/IPrintDocumentAdapter.aidl b/core/java/android/print/IPrintDocumentAdapter.aidl index 8f33e0b2c003..9d384fba874d 100644 --- a/core/java/android/print/IPrintDocumentAdapter.aidl +++ b/core/java/android/print/IPrintDocumentAdapter.aidl @@ -37,5 +37,4 @@ oneway interface IPrintDocumentAdapter { void write(in PageRange[] pages, in ParcelFileDescriptor fd, IWriteResultCallback callback, int sequence); void finish(); - void kill(String reason); } diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java index ef274a56e1d3..1b1554f8192d 100644 --- a/core/java/android/print/PrintManager.java +++ b/core/java/android/print/PrintManager.java @@ -945,17 +945,6 @@ public final class PrintManager { } } - @Override - public void kill(String reason) { - synchronized (mLock) { - // If destroyed the handler is null. - if (!isDestroyedLocked()) { - mHandler.obtainMessage(MyHandler.MSG_ON_KILL, - reason).sendToTarget(); - } - } - } - @Override public void onActivityPaused(Activity activity) { /* do nothing */ @@ -1118,15 +1107,6 @@ public final class PrintManager { } } break; - case MSG_ON_KILL: { - if (DEBUG) { - Log.i(LOG_TAG, "onKill()"); - } - - String reason = (String) message.obj; - throw new RuntimeException(reason); - } - default: { throw new IllegalArgumentException("Unknown message: " + message.what); diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java index bfc00bb8b94d..b48c55ddfef0 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java +++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java @@ -329,18 +329,6 @@ public final class RemotePrintDocument { disconnectFromRemoteDocument(); } - public void kill(String reason) { - if (DEBUG) { - Log.i(LOG_TAG, "[CALLED] kill()"); - } - - try { - mPrintDocumentAdapter.kill(reason); - } catch (RemoteException re) { - Log.e(LOG_TAG, "Error calling kill()", re); - } - } - public boolean isUpdating() { return mState == STATE_UPDATING || mState == STATE_CANCELING; } diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java index c4173ed999f3..bd2b5ec8436e 100644 --- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java +++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java @@ -514,8 +514,12 @@ public class PrintActivity extends Activity implements RemotePrintDocument.Updat ensureErrorUiShown(null, PrintErrorFragment.ACTION_RETRY); setState(STATE_UPDATE_FAILED); - - mPrintedDocument.kill(message); + if (DEBUG) { + Log.i(LOG_TAG, "PrintJob state[" + PrintJobInfo.STATE_FAILED + "] reason: " + message); + } + PrintSpoolerService spooler = mSpoolerProvider.getSpooler(); + spooler.setPrintJobState(mPrintJob.getId(), PrintJobInfo.STATE_FAILED, message); + mPrintedDocument.finish(); } @Override -- GitLab From 269eef85ec5b93ae255f213f9a7c804e234e2f96 Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Wed, 16 Oct 2024 13:30:57 +0000 Subject: [PATCH 032/459] Set Launcher alpha to 0 during Desktop exit transition. During the Desktop last-window-close exit transition we are simultaneously 1. closing a Desktop app 2. closing DesktopWallpaperActivity 3. opening LauncherActivity Since the Desktop app might not cover the entire screen, and DesktopWallpaperActivity is transparent - the user will see LauncherActivity beneath those tasks/windows throughout the exit animation. Before this CL the alpha of the leash of LauncherActivity was set to 1 at the beginning of the animation (before the Launcher Workspace view had time to reset its Views), causing a flicker showing the Workspace view (icons and widgets) for a single frame. With this CL we set the alpha of the Launcher leash to 0 at the start of the Desktop exit animation, so the LauncherActivity and its Workspace won't show until the Workspace view is ready. Test: manual Bug: 366153364 Flag: com.android.window.flags.enable_desktop_windowing_exit_transitions Change-Id: I8e4d7ef01052e2158a644630f85d2f9ec4e9bda4 --- .../RemoteAnimationRunnerCompat.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationRunnerCompat.java b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationRunnerCompat.java index 94f884673fbd..0b15d230dee2 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationRunnerCompat.java +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/RemoteAnimationRunnerCompat.java @@ -22,8 +22,14 @@ import static android.view.WindowManager.TRANSIT_OLD_NONE; import static android.view.WindowManager.TRANSIT_OPEN; import static android.view.WindowManager.TRANSIT_TO_BACK; import static android.view.WindowManager.TRANSIT_TO_FRONT; +import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS; import static android.window.TransitionInfo.FLAG_IS_WALLPAPER; +import static com.android.internal.util.Preconditions.checkArgument; +import static com.android.wm.shell.shared.TransitionUtil.isClosingMode; +import static com.android.wm.shell.shared.TransitionUtil.isClosingType; +import static com.android.wm.shell.shared.TransitionUtil.isOpeningMode; + import android.os.IBinder; import android.os.RemoteException; import android.util.ArrayMap; @@ -157,6 +163,9 @@ public abstract class RemoteAnimationRunnerCompat extends IRemoteAnimationRunner t.show(wallpapers[i].leash); t.setAlpha(wallpapers[i].leash, 1.f); } + if (ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue()) { + resetLauncherAlphaOnDesktopExit(info, launcherTask, leashMap, t); + } } else { if (launcherTask != null) { counterLauncher.addChild(t, leashMap.get(launcherTask.getLeash())); @@ -236,4 +245,33 @@ public abstract class RemoteAnimationRunnerCompat extends IRemoteAnimationRunner } }; } + + /** + * Reset the alpha of the Launcher leash to give the Launcher time to hide its Views before the + * exit-desktop animation starts. + * + * This method should only be called if the current transition is opening Launcher, otherwise we + * might not be exiting Desktop Mode. + */ + private static void resetLauncherAlphaOnDesktopExit( + TransitionInfo info, + TransitionInfo.Change launcherChange, + ArrayMap leashMap, + SurfaceControl.Transaction startTransaction + ) { + checkArgument(isOpeningMode(launcherChange.getMode())); + if (!isClosingType(info.getType())) { + return; + } + for (int i = info.getChanges().size() - 1; i >= 0; --i) { + final TransitionInfo.Change change = info.getChanges().get(i); + // skip changes that we didn't wrap + if (!leashMap.containsKey(change.getLeash())) continue; + // Only make the update if we are closing Desktop tasks. + if (change.getTaskInfo().isFreeform() && isClosingMode(change.getMode())) { + startTransaction.setAlpha(leashMap.get(launcherChange.getLeash()), 0f); + return; + } + } + } } -- GitLab From e0b7038114f6fd207fd0da5f700cc2f1044fd41d Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Fri, 11 Oct 2024 15:58:38 +0000 Subject: [PATCH 033/459] Introduce FlingOnBackAnimationCallback to make use of new timestamp API With the new frameTime field in BackEvent, velocity can be calculated on the client side. Therefore this CL introduces a FlingOnBackAnimationCallback that automatically animates back gesture flings. Bug: 362938401 Test: FlingOnBackAnimationCallbackTest Flag: com.android.window.flags.predictive_back_timestamp_api Change-Id: I3bcf0ef23ab0171cbd8326ad4e0d548dcf87b334 --- .../back/FlingOnBackAnimationCallback.kt | 166 ++++++++++++++++++ .../back/OnBackAnimationCallbackExtension.kt | 13 +- .../back/FlingOnBackAnimationCallbackTest.kt | 127 ++++++++++++++ .../StatusBarKeyguardViewManagerTest.java | 6 +- .../keyguard/KeyguardSecurityContainer.java | 4 +- .../phone/StatusBarKeyguardViewManager.java | 12 +- 6 files changed, 312 insertions(+), 16 deletions(-) create mode 100644 packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/animation/back/FlingOnBackAnimationCallbackTest.kt diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt new file mode 100644 index 000000000000..6da06d0711d8 --- /dev/null +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt @@ -0,0 +1,166 @@ +/* + * 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.animation.back + +import android.util.TimeUtils +import android.view.Choreographer +import android.view.MotionEvent +import android.view.MotionEvent.ACTION_MOVE +import android.view.VelocityTracker +import android.view.animation.Interpolator +import android.window.BackEvent +import android.window.OnBackAnimationCallback +import com.android.app.animation.Interpolators +import com.android.internal.dynamicanimation.animation.DynamicAnimation +import com.android.internal.dynamicanimation.animation.FlingAnimation +import com.android.internal.dynamicanimation.animation.FloatValueHolder +import com.android.window.flags.Flags.predictiveBackTimestampApi + +private const val FLING_FRICTION = 6f +private const val SCALE_FACTOR = 100f + +/** + * Enhanced [OnBackAnimationCallback] with automatic fling animation and interpolated progress. + * + * Simplifies back gesture handling by animating flings and emitting processed events through + * `compat` functions. Customize progress interpolation with an optional [Interpolator]. + * + * @param progressInterpolator [Interpolator] for progress, defaults to + * [Interpolators.BACK_GESTURE]. + */ +abstract class FlingOnBackAnimationCallback( + val progressInterpolator: Interpolator = Interpolators.BACK_GESTURE +) : OnBackAnimationCallback { + + private val velocityTracker = VelocityTracker.obtain() + private var lastBackEvent: BackEvent? = null + private var downTime: Long? = null + + private var backInvokedFlingAnim: FlingAnimation? = null + private val backInvokedFlingUpdateListener = + DynamicAnimation.OnAnimationUpdateListener { _, progress: Float, _ -> + lastBackEvent?.let { + val backEvent = + BackEvent( + it.touchX, + it.touchY, + progress / SCALE_FACTOR, + it.swipeEdge, + it.frameTime, + ) + onBackProgressedCompat(backEvent) + } + } + private val backInvokedFlingEndListener = + DynamicAnimation.OnAnimationEndListener { _, _, _, _ -> + onBackInvokedCompat() + reset() + } + + abstract fun onBackStartedCompat(backEvent: BackEvent) + + abstract fun onBackProgressedCompat(backEvent: BackEvent) + + abstract fun onBackInvokedCompat() + + abstract fun onBackCancelledCompat() + + final override fun onBackStarted(backEvent: BackEvent) { + if (backInvokedFlingAnim != null) { + // This should never happen but let's call onBackInvokedCompat() just in case there is + // still a fling animation in progress + onBackInvokedCompat() + } + reset() + if (predictiveBackTimestampApi()) { + downTime = backEvent.frameTime + } + onBackStartedCompat(backEvent) + } + + final override fun onBackProgressed(backEvent: BackEvent) { + val interpolatedProgress = progressInterpolator.getInterpolation(backEvent.progress) + if (predictiveBackTimestampApi()) { + velocityTracker.addMovement( + MotionEvent.obtain( + /* downTime */ downTime!!, + /* eventTime */ backEvent.frameTime, + /* action */ ACTION_MOVE, + /* x */ interpolatedProgress * SCALE_FACTOR, + /* y */ 0f, + /* metaState */ 0, + ) + ) + lastBackEvent = + BackEvent( + backEvent.touchX, + backEvent.touchY, + interpolatedProgress, + backEvent.swipeEdge, + backEvent.frameTime, + ) + } else { + lastBackEvent = + BackEvent( + backEvent.touchX, + backEvent.touchY, + interpolatedProgress, + backEvent.swipeEdge, + ) + } + lastBackEvent?.let { onBackProgressedCompat(it) } + } + + final override fun onBackInvoked() { + if (predictiveBackTimestampApi() && lastBackEvent != null) { + velocityTracker.computeCurrentVelocity(1000) + backInvokedFlingAnim = + FlingAnimation(FloatValueHolder()) + .setStartValue((lastBackEvent?.progress ?: 0f) * SCALE_FACTOR) + .setFriction(FLING_FRICTION) + .setStartVelocity(velocityTracker.xVelocity) + .setMinValue(0f) + .setMaxValue(SCALE_FACTOR) + .also { + it.addUpdateListener(backInvokedFlingUpdateListener) + it.addEndListener(backInvokedFlingEndListener) + it.start() + // do an animation-frame immediately to prevent idle frame + it.doAnimationFrame( + Choreographer.getInstance().lastFrameTimeNanos / TimeUtils.NANOS_PER_MS + ) + } + } else { + onBackInvokedCompat() + reset() + } + } + + final override fun onBackCancelled() { + onBackCancelledCompat() + reset() + } + + private fun reset() { + velocityTracker.clear() + backInvokedFlingAnim?.removeEndListener(backInvokedFlingEndListener) + backInvokedFlingAnim?.removeUpdateListener(backInvokedFlingUpdateListener) + lastBackEvent = null + backInvokedFlingAnim = null + downTime = null + } +} diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtension.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtension.kt index 8740d1467296..f708de3e9234 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtension.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/OnBackAnimationCallbackExtension.kt @@ -23,6 +23,7 @@ import android.window.BackEvent import android.window.OnBackAnimationCallback import android.window.OnBackInvokedDispatcher import android.window.OnBackInvokedDispatcher.Priority +import com.android.app.animation.Interpolators /** * Generates an [OnBackAnimationCallback] given a [backAnimationSpec]. [onBackProgressed] will be @@ -40,16 +41,16 @@ fun onBackAnimationCallbackFrom( onBackInvoked: () -> Unit = {}, onBackCancelled: () -> Unit = {}, ): OnBackAnimationCallback { - return object : OnBackAnimationCallback { + return object : FlingOnBackAnimationCallback(progressInterpolator = Interpolators.LINEAR) { private var initialY = 0f private val lastTransformation = BackTransformation() - override fun onBackStarted(backEvent: BackEvent) { + override fun onBackStartedCompat(backEvent: BackEvent) { initialY = backEvent.touchY onBackStarted(backEvent) } - override fun onBackProgressed(backEvent: BackEvent) { + override fun onBackProgressedCompat(backEvent: BackEvent) { val progressY = (backEvent.touchY - initialY) / displayMetrics.heightPixels backAnimationSpec.getBackTransformation( @@ -61,11 +62,11 @@ fun onBackAnimationCallbackFrom( onBackProgressed(lastTransformation) } - override fun onBackInvoked() { + override fun onBackInvokedCompat() { onBackInvoked() } - override fun onBackCancelled() { + override fun onBackCancelledCompat() { onBackCancelled() } } @@ -86,7 +87,7 @@ fun View.registerOnBackInvokedCallbackOnViewAttached( override fun onViewAttachedToWindow(v: View) { onBackInvokedDispatcher.registerOnBackInvokedCallback( priority, - onBackAnimationCallback + onBackAnimationCallback, ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/back/FlingOnBackAnimationCallbackTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/back/FlingOnBackAnimationCallbackTest.kt new file mode 100644 index 000000000000..75a5768193cf --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/back/FlingOnBackAnimationCallbackTest.kt @@ -0,0 +1,127 @@ +/* + * 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.animation.back + +import android.platform.test.annotations.RequiresFlagsDisabled +import android.platform.test.annotations.RequiresFlagsEnabled +import android.platform.test.flag.junit.CheckFlagsRule +import android.platform.test.flag.junit.DeviceFlagsValueProvider +import android.view.animation.Interpolator +import android.window.BackEvent +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation +import com.android.app.animation.Interpolators +import com.android.systemui.SysuiTestCase +import com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_TIMESTAMP_API +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertTrue +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito + +@SmallTest +@RunWith(AndroidJUnit4::class) +class FlingOnBackAnimationCallbackTest : SysuiTestCase() { + + @get:Rule val checkFlagsRule: CheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule() + + @Test + fun testProgressInterpolation() { + val mockInterpolator = Mockito.mock(Interpolator::class.java) + val backEvent = backEventOf(0.5f) + Mockito.`when`(mockInterpolator.getInterpolation(0.5f)).thenReturn(0.8f) + val callback = TestFlingOnBackAnimationCallback(mockInterpolator) + callback.onBackStarted(backEvent) + assertTrue("Assert onBackStartedCompat called", callback.backStartedCalled) + callback.onBackProgressed(backEvent) + assertTrue("Assert onBackProgressedCompat called", callback.backProgressedCalled) + assertEquals("Assert interpolated progress", 0.8f, callback.progressEvent?.progress) + } + + @Test + @RequiresFlagsEnabled(FLAG_PREDICTIVE_BACK_TIMESTAMP_API) + fun testFling() { + val callback = TestFlingOnBackAnimationCallback(Interpolators.LINEAR) + callback.onBackStarted(backEventOf(progress = 0f, frameTime = 0)) + assertTrue("Assert onBackStartedCompat called", callback.backStartedCalled) + callback.onBackProgressed(backEventOf(0f, 8)) + callback.onBackProgressed(backEventOf(0.2f, 16)) + callback.onBackProgressed(backEventOf(0.4f, 24)) + callback.onBackProgressed(backEventOf(0.6f, 32)) + assertTrue("Assert onBackProgressedCompat called", callback.backProgressedCalled) + assertEquals("Assert interpolated progress", 0.6f, callback.progressEvent?.progress) + getInstrumentation().runOnMainSync { callback.onBackInvoked() } + // Assert that onBackInvoked is not called immediately... + assertFalse(callback.backInvokedCalled) + // Instead the fling animation is played and eventually onBackInvoked is called. + callback.backInvokedLatch.await(1000, TimeUnit.MILLISECONDS) + assertTrue(callback.backInvokedCalled) + } + + @Test + @RequiresFlagsDisabled(FLAG_PREDICTIVE_BACK_TIMESTAMP_API) + fun testCallbackWithoutTimestampApi() { + // Assert that all callback methods are immediately forwarded + val callback = TestFlingOnBackAnimationCallback(Interpolators.LINEAR) + callback.onBackStarted(backEventOf(progress = 0f, frameTime = 0)) + assertTrue("Assert onBackStartedCompat called", callback.backStartedCalled) + callback.onBackProgressed(backEventOf(0f, 8)) + assertTrue("Assert onBackProgressedCompat called", callback.backProgressedCalled) + callback.onBackInvoked() + assertTrue("Assert onBackInvoked called", callback.backInvokedCalled) + callback.onBackCancelled() + assertTrue("Assert onBackCancelled called", callback.backCancelledCalled) + } + + private fun backEventOf(progress: Float, frameTime: Long = 0): BackEvent { + return BackEvent(10f, 10f, progress, 0, frameTime) + } + + /** Helper class to expose the compat functions for testing */ + private class TestFlingOnBackAnimationCallback(progressInterpolator: Interpolator) : + FlingOnBackAnimationCallback(progressInterpolator) { + var backStartedCalled = false + var backProgressedCalled = false + var backInvokedCalled = false + val backInvokedLatch = CountDownLatch(1) + var backCancelledCalled = false + var progressEvent: BackEvent? = null + + override fun onBackStartedCompat(backEvent: BackEvent) { + backStartedCalled = true + } + + override fun onBackProgressedCompat(backEvent: BackEvent) { + backProgressedCalled = true + progressEvent = backEvent + } + + override fun onBackInvokedCompat() { + backInvokedCalled = true + backInvokedLatch.countDown() + } + + override fun onBackCancelledCompat() { + backCancelledCalled = true + } + } +} 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 94753f7e5203..21a317aab36a 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,6 +34,7 @@ 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.timeout; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -56,6 +57,7 @@ import android.window.WindowOnBackInvokedDispatcher; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.util.LatencyTracker; import com.android.internal.widget.LockPatternUtils; @@ -675,8 +677,8 @@ public class StatusBarKeyguardViewManagerTest extends SysuiTestCase { backCallback.onBackProgressed(event); verify(mBouncerViewDelegateBackCallback).onBackProgressed(eq(event)); - backCallback.onBackInvoked(); - verify(mBouncerViewDelegateBackCallback).onBackInvoked(); + InstrumentationRegistry.getInstrumentation().runOnMainSync(backCallback::onBackInvoked); + verify(mBouncerViewDelegateBackCallback, timeout(1000)).onBackInvoked(); backCallback.onBackCancelled(); verify(mBouncerViewDelegateBackCallback).onBackCancelled(); diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java index 2d27f1c0ca73..6bcacd023c74 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java @@ -32,7 +32,6 @@ import static androidx.constraintlayout.widget.ConstraintSet.START; import static androidx.constraintlayout.widget.ConstraintSet.TOP; import static androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT; -import static com.android.app.animation.InterpolatorsAndroidX.DECELERATE_QUINT; import static com.android.systemui.plugins.FalsingManager.LOW_PENALTY; import static java.lang.Integer.max; @@ -271,8 +270,7 @@ public class KeyguardSecurityContainer extends ConstraintLayout { public void onBackProgressed(BackEvent event) { float progress = event.getProgress(); // TODO(b/263819310): Update the interpolator to match spec. - float scale = MIN_BACK_SCALE - + (1 - MIN_BACK_SCALE) * (1 - DECELERATE_QUINT.getInterpolation(progress)); + float scale = MIN_BACK_SCALE + (1 - MIN_BACK_SCALE) * (1 - progress); setScale(scale); } }; 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 74c6e72d3400..555d85c5addb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -56,6 +56,7 @@ import com.android.keyguard.TrustGrantFlags; import com.android.keyguard.ViewMediatorCallback; import com.android.systemui.DejankUtils; import com.android.systemui.Flags; +import com.android.systemui.animation.back.FlingOnBackAnimationCallback; import com.android.systemui.biometrics.domain.interactor.UdfpsOverlayInteractor; import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerCallbackInteractor; @@ -236,9 +237,10 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } }; - private final OnBackAnimationCallback mOnBackInvokedCallback = new OnBackAnimationCallback() { + private final OnBackAnimationCallback mOnBackInvokedCallback = + new FlingOnBackAnimationCallback() { @Override - public void onBackInvoked() { + public void onBackInvokedCompat() { if (DEBUG) { Log.d(TAG, "onBackInvokedCallback() called, invoking onBackPressed()"); } @@ -249,21 +251,21 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } @Override - public void onBackProgressed(BackEvent event) { + public void onBackProgressedCompat(@NonNull BackEvent event) { if (shouldPlayBackAnimation() && mPrimaryBouncerView.getDelegate() != null) { mPrimaryBouncerView.getDelegate().getBackCallback().onBackProgressed(event); } } @Override - public void onBackCancelled() { + public void onBackCancelledCompat() { if (shouldPlayBackAnimation() && mPrimaryBouncerView.getDelegate() != null) { mPrimaryBouncerView.getDelegate().getBackCallback().onBackCancelled(); } } @Override - public void onBackStarted(BackEvent event) { + public void onBackStartedCompat(@NonNull BackEvent event) { if (shouldPlayBackAnimation() && mPrimaryBouncerView.getDelegate() != null) { mPrimaryBouncerView.getDelegate().getBackCallback().onBackStarted(event); } -- GitLab From 71ada7db1fb6171b36a1d3faec78a22c858119b1 Mon Sep 17 00:00:00 2001 From: Dmitrii Ishcheikin Date: Thu, 17 Oct 2024 13:56:54 +0000 Subject: [PATCH 034/459] Split dirty-image-objects file between art and framework Test: presubmit Test: install ART jitzygote module, check that dex2oat receives new path to dirty-image-objects file Change-Id: Ied314e038cd42eea634e680f705cd82134f273fc --- config/dirty-image-objects | 3129 ++++++++++++++++------------------- core/jni/AndroidRuntime.cpp | 16 +- 2 files changed, 1439 insertions(+), 1706 deletions(-) diff --git a/config/dirty-image-objects b/config/dirty-image-objects index f2e2b82cd82a..d4913d8f70d7 100644 --- a/config/dirty-image-objects +++ b/config/dirty-image-objects @@ -1,5 +1,5 @@ # -# Copyright (C) 2017 The Android Open Source Project +# 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. @@ -19,1710 +19,1435 @@ # The image writer will bin these objects together in the image. # More info about dirty objects format and how to collect the data can be # found in: art/imgdiag/dirty_image_objects.md -# This particular file was generated by dumping all pre-installed apps. +# This particular file was generated by: +# https://android-build.corp.google.com/test_investigate/invocation/I55400010326683472/ # -Landroid/text/style/URLSpan; 0 -Landroid/content/res/Resources$NotFoundException; 1 -Landroid/os/PowerManager$WakeLock; 2 -Landroid/os/BatterySaverPolicyConfig; 2 -Landroid/content/ContextWrapper; 2 -Landroid/app/WallpaperInfo; 2 -Landroid/content/pm/PackageManager; 2 -Landroid/app/IWallpaperManager; 2 -Ljava/lang/BootClassLoader; 2 -Ljava/time/Duration; 2 -Landroid/util/Printer; 2 -Landroid/app/WallpaperManager$OnColorsChangedListener; 2 -Landroid/app/WallpaperColors; 2 -Landroid/content/pm/ServiceInfo; 2 -Landroid/app/KeyguardManager$KeyguardDismissCallback; 2 -Ljava/lang/CharSequence; 3 -Landroid/widget/Switch; 4 -Lcom/android/internal/util/ContrastColorUtil; 4 -Landroid/view/SurfaceControl; 4 -Landroid/graphics/ColorMatrix;.dexCache:Ljava/lang/Object; 4 -Lcom/android/internal/widget/CachingIconView; 4 -Landroid/window/IRemoteTransition$Stub$Proxy; 4 -Landroid/app/trust/TrustManager$TrustListener; 4 -Landroid/view/NotificationHeaderView; 4 -Lcom/android/internal/widget/ImageResolver; 4 -Landroid/window/WindowContainerTransaction$Change; 4 -Lcom/android/internal/widget/MessagingLayout; 4 -Ljava/util/concurrent/ConcurrentLinkedQueue; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry; 4 -Landroid/view/RemotableViewMethod; 4 -Landroid/app/IApplicationThread$Stub$Proxy; 4 -Landroid/os/FileUtils; 4 -Landroid/view/View;.SCALE_X:Landroid/util/Property; 4 -Landroid/widget/GridLayout;.UNDEFINED_ALIGNMENT:Landroid/widget/GridLayout$Alignment; 4 -Landroid/media/MediaPlayer$EventHandler; 4 -Landroid/widget/DateTimeView; 4 -Llibcore/util/ZoneInfo; 4 -Lcom/android/internal/statusbar/IStatusBarService; 4 -Ljava/lang/invoke/MethodType;.internTable:Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;.stale:Ljava/lang/ref/ReferenceQueue; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry; 4 -Lcom/android/internal/logging/UiEventLogger; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry; 4 -Landroid/renderscript/RenderScript; 4 -Landroid/view/ViewTreeObserver$OnWindowVisibilityChangeListener; 4 -Lcom/android/internal/widget/RemeasuringLinearLayout; 4 -Landroid/widget/DateTimeView$ReceiverInfo$1; 4 -Landroid/view/View;.TRANSLATION_Y:Landroid/util/Property; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry; 4 -Lcom/android/internal/widget/NotificationExpandButton; 4 -Lcom/android/internal/view/menu/ActionMenuItemView; 4 -Landroid/view/animation/AnimationSet; 4 -Landroid/hardware/biometrics/BiometricSourceType;.FINGERPRINT:Landroid/hardware/biometrics/BiometricSourceType; 4 -Landroid/window/WindowOrganizer;.IWindowOrganizerControllerSingleton:Landroid/util/Singleton; 4 -Ljava/lang/Runnable; 4 -Lorg/apache/harmony/dalvik/ddmc/DdmServer;.mHandlerMap:Ljava/util/HashMap; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry; 4 -Lcom/android/internal/widget/ImageFloatingTextView; 4 -Landroid/window/IWindowContainerToken$Stub$Proxy; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry; 4 -Landroid/content/res/ColorStateList; 4 -Landroid/view/View;.SCALE_Y:Landroid/util/Property; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap; 4 -Lcom/android/internal/widget/ConversationLayout; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry;.right:Ljava/util/TreeMap$TreeMapEntry; 4 -Lcom/android/internal/colorextraction/ColorExtractor$OnColorsChangedListener; 4 -Landroid/hardware/face/FaceManager$FaceDetectionCallback; 4 -Landroid/widget/RemoteViews;.sLookupKey:Landroid/widget/RemoteViews$MethodKey; 4 -Landroid/widget/ViewSwitcher;.dexCache:Ljava/lang/Object; 4 -Lcom/android/internal/widget/NotificationActionListLayout; 4 -Ljava/util/concurrent/ConcurrentLinkedQueue$Node; 4 -Landroid/hardware/biometrics/BiometricSourceType;.FACE:Landroid/hardware/biometrics/BiometricSourceType; 4 -Landroid/hardware/biometrics/BiometricSourceType;.IRIS:Landroid/hardware/biometrics/BiometricSourceType; 4 -Landroid/view/NotificationTopLineView; 4 -Lcom/android/internal/protolog/BaseProtoLogImpl;.LOG_GROUPS:Ljava/util/TreeMap;.root:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry;.left:Ljava/util/TreeMap$TreeMapEntry; 4 -Landroid/widget/RemoteViews;.sMethods:Landroid/util/ArrayMap; 4 -Lcom/android/internal/os/BinderInternal$BinderProxyLimitListener; 5 -Landroid/app/AppOpsManager$OnOpNotedInternalListener; 5 -Lcom/android/internal/R$styleable;.WindowAnimation:[I 5 -Lcom/android/internal/logging/UiEventLogger$UiEventEnum; 5 -Lcom/android/internal/policy/AttributeCache; 5 -Landroid/app/Notification$CallStyle; 5 -Landroid/app/AppOpsManager$OnOpNotedListener; 5 -Lcom/android/internal/protolog/BaseProtoLogImpl; 5 -Landroid/app/AppOpsManager$OnOpStartedListener; 5 -Lcom/android/internal/util/ScreenshotHelper$1; 5 -Landroid/app/Notification$DecoratedCustomViewStyle; 5 -Landroid/view/DisplayCutout; 5 -Landroid/view/InputEvent;.mNextSeq:Ljava/util/concurrent/atomic/AtomicInteger; 5 -Lcom/android/internal/statusbar/NotificationVisibility; 5 -Landroid/telephony/DataSpecificRegistrationInfo; 6 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle; 7 -Landroid/telephony/VoiceSpecificRegistrationInfo; 8 -Landroid/telephony/AnomalyReporter; 8 -Landroid/telephony/TelephonyRegistryManager;.sCarrierPrivilegeCallbacks:Ljava/util/WeakHashMap; 8 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.1:Ljava/util/WeakHashMap$Entry; 8 -Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection; 8 -Landroid/content/ContentProvider$Transport; 8 -Landroid/telephony/NetworkRegistrationInfo; 8 -Landroid/net/MatchAllNetworkSpecifier; 8 -Landroid/telephony/TelephonyRegistryManager;.sCarrierPrivilegeCallbacks:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry; 8 -Landroid/app/PropertyInvalidatedCache;.sInvalidates:Ljava/util/HashMap; 9 -Landroid/app/PropertyInvalidatedCache$NoPreloadHolder; 9 -Landroid/app/PropertyInvalidatedCache;.sDisabledKeys:Ljava/util/HashSet;.map:Ljava/util/HashMap; 10 -Landroid/media/AudioSystem$AudioRecordingCallback; 11 -Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedString; 11 -Landroid/net/metrics/IpManagerEvent; 11 -Lcom/android/internal/os/ProcessCpuTracker$FilterStats; 11 -Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest; 11 -Landroid/content/pm/RegisteredServicesCache$3; 11 -Lcom/android/internal/os/LooperStats; 11 -Lcom/android/server/AppWidgetBackupBridge; 11 -Landroid/hardware/display/DisplayManagerInternal; 11 -Landroid/content/pm/PackageInfo; 11 -Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate; 11 -Landroid/app/servertransaction/ResumeActivityItem; 11 -Lcom/android/internal/widget/AlertDialogLayout; 11 -Landroid/content/pm/FallbackCategoryProvider;.sFallbacks:Landroid/util/ArrayMap; 11 -Landroid/os/RemoteCallback$1; 11 -Landroid/content/pm/SharedLibraryInfo; 11 -Landroid/util/MemoryIntArray; 11 -Landroid/net/metrics/DhcpErrorEvent; 11 -Lcom/android/internal/util/function/DodecConsumer; 11 -Landroid/provider/Settings; 11 -Landroid/app/PropertyInvalidatedCache;.sCorkLock:Ljava/lang/Object; 11 -Lcom/android/internal/os/CachedDeviceState$Readonly; 11 -Landroid/app/job/JobServiceEngine$JobHandler; 11 -Landroid/app/SystemServiceRegistry; 11 -Lcom/android/internal/os/BinderInternal$CallStatsObserver; 11 -Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy; 11 -Landroid/hardware/location/IActivityRecognitionHardwareClient; 11 -Landroid/telecom/Logging/EventManager$EventListener; 11 -Landroid/accounts/AccountManagerInternal; 11 -Lcom/android/internal/os/KernelCpuBpfTracking; 11 -Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation; 11 -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal; 11 -Landroid/os/ServiceSpecificException; 11 -Landroid/net/Uri$PathPart;.NULL:Landroid/net/Uri$PathPart; 11 -Landroid/app/ActivityManagerInternal; 11 -Landroid/media/AudioSystem; 11 -Landroid/service/dreams/DreamManagerInternal; 11 -Landroid/debug/AdbManagerInternal; 11 -Landroid/graphics/Bitmap$CompressFormat; 11 -Landroid/hardware/location/NanoAppMessage; 11 -Landroid/os/storage/StorageManagerInternal; 11 -Landroid/app/AppOpsManagerInternal; 11 -Ljava/security/cert/CertificateException; 11 -Ldalvik/system/VMRuntime; 11 -Landroid/content/pm/SigningInfo; 11 -Landroid/view/KeyEvent; 11 -Lcom/android/internal/view/WindowManagerPolicyThread; 11 -Landroid/graphics/Region;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 11 -Landroid/content/res/ResourceTimer; 11 -Landroid/view/autofill/AutofillManagerInternal; 11 -Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object; 11 -Landroid/graphics/Region;.sPool:Landroid/util/Pools$SynchronizedPool; 11 -Landroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0; 11 -Lcom/android/server/LocalServices;.sLocalServiceObjects:Landroid/util/ArrayMap; 11 -Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener; 11 -Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener; 11 -Landroid/content/pm/PermissionInfo; 11 -Landroid/view/WindowManagerPolicyConstants$PointerEventListener; 11 -Landroid/os/UEventObserver; 11 -Landroid/media/AudioManagerInternal$RingerModeDelegate; 11 -Landroid/view/Display$HdrCapabilities; 11 -Landroid/service/notification/Condition; 11 -Landroid/content/pm/UserPackage; 11 -Landroid/app/AppOpsManager$SamplingStrategy; 11 -Landroid/telephony/ServiceState; 11 -Landroid/app/servertransaction/PauseActivityItem; 11 -Lcom/android/internal/util/function/pooled/PooledLambdaImpl;.sMessageCallbacksPool:Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;.mLock:Ljava/lang/Object; 11 -Landroid/view/KeyCharacterMap$FallbackAction; 11 -Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringArray; 11 -Landroid/hardware/display/DeviceProductInfo; 11 -Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap;.mHashes:[I 11 -Landroid/content/pm/RegisteredServicesCache$2; 11 -Landroid/content/pm/PackageManager;.sCacheAutoCorker:Landroid/app/PropertyInvalidatedCache$AutoCorker; 11 -Landroid/app/PropertyInvalidatedCache;.sCorks:Ljava/util/HashMap; 11 -Landroid/service/notification/StatusBarNotification; 11 -Landroid/app/servertransaction/ConfigurationChangeItem; 11 -Landroid/app/ActivityManager$RecentTaskInfo; 11 -Landroid/app/Notification; 11 -Landroid/app/servertransaction/DestroyActivityItem; 11 -Landroid/webkit/WebViewLibraryLoader$RelroFileCreator; 11 -Landroid/net/metrics/NetworkEvent; 11 -Landroid/media/AudioPlaybackConfiguration; 11 -Landroid/accessibilityservice/AccessibilityServiceInfo; 11 -Landroid/hardware/display/DeviceProductInfo$ManufactureDate; 11 -Landroid/os/storage/StorageVolume; 11 -Landroid/os/BatteryManagerInternal; 11 -Landroid/appwidget/AppWidgetManagerInternal; 11 -Landroid/app/servertransaction/NewIntentItem; 11 -Landroid/content/pm/ShortcutServiceInternal; 11 -Landroid/app/assist/ActivityId; 11 -Landroid/window/DisplayAreaAppearedInfo; 11 -Landroid/os/Process;.ZYGOTE_PROCESS:Landroid/os/ZygoteProcess;.mLock:Ljava/lang/Object; 11 -Landroid/app/usage/UsageStats; 11 -Landroid/app/Notification$MediaStyle; 11 -Landroid/media/AudioSystem$DynamicPolicyCallback; 11 -Landroid/content/pm/ProviderInfo; 11 -Landroid/os/PowerManagerInternal; 11 -Landroid/service/voice/VoiceInteractionManagerInternal; 11 -Landroid/content/pm/FeatureInfo; 11 -Landroid/app/servertransaction/TopResumedActivityChangeItem; 11 -Landroid/app/Notification$DecoratedMediaCustomViewStyle; 11 -Landroid/appwidget/AppWidgetProviderInfo; 11 -Landroid/app/AppOpsManager$NoteOpEvent; 11 -Landroid/graphics/GraphicsStatsService; 11 -Landroid/view/DisplayAddress$Physical; 11 -Landroid/content/ComponentName$WithComponentName; 11 -Landroid/app/admin/DevicePolicyManagerInternal; 11 -Landroid/os/ResultReceiver$MyResultReceiver; 11 -Landroid/content/ContentProviderClient; 11 -Landroid/content/pm/RegisteredServicesCache$1; 11 -Landroid/app/PendingIntent$FinishedDispatcher; 11 -Landroid/location/LocationManager; 11 -Landroid/hardware/location/ContextHubInfo; 11 -Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener; 11 -Lcom/android/server/usage/AppStandbyInternal; 11 -Landroid/content/pm/RegisteredServicesCacheListener; 11 -Landroid/app/servertransaction/LaunchActivityItem; 11 -Landroid/content/pm/BaseParceledListSlice$1; 11 -Landroid/annotation/StringRes; 11 -Lcom/android/internal/R$styleable;.Window:[I 11 -Landroid/service/notification/ZenModeConfig; 11 -Landroid/telecom/Logging/SessionManager$ISessionListener; 11 -Landroid/app/time/TimeZoneConfiguration; 11 -Landroid/net/metrics/ValidationProbeEvent; 11 -Landroid/content/pm/PackageInstaller$SessionInfo; 11 -Landroid/content/pm/UserPackage;.sCache:Landroid/util/SparseArrayMap;.mData:Landroid/util/SparseArray; 11 -Landroid/content/pm/PermissionGroupInfo; 11 -Landroid/hardware/sidekick/SidekickInternal; 11 -Lcom/android/internal/widget/ButtonBarLayout; 11 -Landroid/content/pm/LauncherActivityInfoInternal; 11 -Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap; 11 -Lcom/android/internal/widget/LockSettingsInternal; 11 -Landroid/media/AudioManagerInternal; 11 -Landroid/app/AppOpsManager$AttributedOpEntry; 11 -Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringList; 11 -Landroid/telecom/Log; 11 -Landroid/app/time/TimeZoneCapabilities; 11 -Landroid/attention/AttentionManagerInternal; 11 -Landroid/view/WindowManagerPolicyConstants; 11 -Landroid/content/pm/CrossProfileAppsInternal; 11 -Landroid/hardware/location/GeofenceHardwareService; 11 -Landroid/content/pm/dex/ArtManagerInternal; 11 -Landroid/net/metrics/IpReachabilityEvent; 11 -Landroid/content/pm/LauncherApps$ShortcutQuery$QueryFlags; 11 -Landroid/media/AudioAttributes; 11 -Landroid/app/PropertyInvalidatedCache$AutoCorker$1; 11 -Landroid/net/metrics/ApfProgramEvent; 11 -Landroid/content/pm/SigningDetails; 11 -Lcom/android/internal/protolog/ProtoLogImpl; 11 -Landroid/hardware/biometrics/ComponentInfoInternal; 11 -Lcom/android/internal/util/ToBooleanFunction; 11 -Landroid/app/ActivityThread$H; 11 -Landroid/hardware/location/GeofenceHardwareImpl; 11 -Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventHandler; 11 -Landroid/util/NtpTrustedTime; 11 -Landroid/hardware/soundtrigger/SoundTrigger$StatusListener; 11 -Lcom/android/internal/app/procstats/AssociationState;.sTmpSourceKey:Lcom/android/internal/app/procstats/AssociationState$SourceKey; 11 -Ljava/util/zip/ZipFile$ZipFileInflaterInputStream; 11 -Landroid/app/job/JobInfo; 11 -Lcom/android/internal/content/om/OverlayConfig; 11 -Landroid/webkit/WebViewZygote; 11 -Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringSet; 11 -Lcom/android/internal/infra/AbstractRemoteService$VultureCallback; 11 -Landroid/permission/PermissionManagerInternal; 11 -Lcom/android/server/WidgetBackupProvider; 11 -Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper; 11 -Landroid/app/PropertyInvalidatedCache;.sCorkedInvalidates:Ljava/util/HashMap; 11 -Landroid/media/AudioPlaybackConfiguration$PlayerDeathMonitor; 11 -Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventCallback; 11 -Landroid/service/notification/NotificationListenerService$RankingMap; 11 -Landroid/os/UserHandle;.sExtraUserHandleCache:Landroid/util/SparseArray; 11 -Ljava/time/DateTimeException; 11 -Ljava/lang/NumberFormatException; 11 -Ljava/security/Provider;.knownEngines:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.125:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 11 -Landroid/app/LoadedApk$ServiceDispatcher$RunConnection; 11 -Landroid/view/RoundedCorners; 11 -Landroid/os/Process;.ZYGOTE_PROCESS:Landroid/os/ZygoteProcess; 11 -Landroid/media/audiopolicy/AudioVolumeGroup; 11 -Landroid/media/AudioSystem$ErrorCallback; 11 -Landroid/app/servertransaction/ActivityResultItem; 11 -Lcom/android/internal/widget/DialogTitle; 11 -Lcom/android/internal/os/StoragedUidIoStatsReader$Callback; 11 -Landroid/view/ViewRootImpl$W; 11 -Landroid/app/ServiceStartArgs; 11 -Landroid/window/TaskAppearedInfo; 11 -Lcom/android/internal/listeners/ListenerExecutor$FailureCallback; 11 -Landroid/app/ApplicationExitInfo; 11 -Landroid/content/pm/PackageManager;.sCacheAutoCorker:Landroid/app/PropertyInvalidatedCache$AutoCorker;.mLock:Ljava/lang/Object; 11 -Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringValueMap; 11 -Landroid/content/pm/ResolveInfo; 11 -Lcom/android/internal/display/BrightnessSynchronizer; 11 -Landroid/window/IOnBackInvokedCallback$Stub$Proxy; 12 -Landroid/graphics/drawable/PictureDrawable; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.126:Ljava/lang/Byte; 13 -Landroid/view/ViewDebug$ExportedProperty; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.41:Ljava/lang/Byte; 13 -Landroid/view/inputmethod/DeleteGesture; 13 -Landroid/view/ViewDebug$IntToString; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.56:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.65:Ljava/lang/Byte; 13 -Landroid/webkit/WebViewFactory;.sProviderLock:Ljava/lang/Object; 13 -Ljava/lang/IllegalAccessError; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.51:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.52:Ljava/lang/Byte; 13 -Landroid/view/inputmethod/DeleteRangeGesture; 13 -Landroid/window/WindowContext; 13 -Ljava/util/concurrent/ConcurrentSkipListMap$Node; 13 -Landroid/view/inputmethod/SelectRangeGesture; 13 -Landroid/util/MalformedJsonException; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.131:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.120:Ljava/lang/Byte; 13 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 13 -Ljava/nio/file/StandardOpenOption;.TRUNCATE_EXISTING:Ljava/nio/file/StandardOpenOption; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.121:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.16:Ljava/lang/Byte; 13 -Ljava/util/concurrent/ConcurrentSkipListMap$Index; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.139:Ljava/lang/Byte; 13 -Landroid/view/ViewDebug$FlagToString; 13 -Landroid/view/inputmethod/SelectGesture; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.20:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.94:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.64:Ljava/lang/Byte; 13 -Landroid/webkit/WebViewFactoryProvider$Statics; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.95:Ljava/lang/Byte; 13 -Landroid/service/media/MediaBrowserService$ServiceBinder$1; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.7:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.23:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.46:Ljava/lang/Byte; 13 -Landroid/provider/Settings$SettingNotFoundException; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.74:Ljava/lang/Byte; 13 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.8:Ljava/lang/Byte; 13 -Landroid/widget/TextView;.TEMP_POSITION:[F 13 -Ljava/io/ByteArrayInputStream; 14 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.93:Ljava/lang/Byte; 14 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.134:Ljava/lang/Byte; 14 -Landroid/text/style/ImageSpan; 14 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.154:Ljava/lang/Byte; 15 -Landroid/view/TextureView$SurfaceTextureListener; 16 -Landroid/media/AudioManager$OnAudioFocusChangeListener; 17 -Ljava/util/Locale;.JAPAN:Ljava/util/Locale; 18 -Ljava/util/Locale;.GERMANY:Ljava/util/Locale; 19 -Ljava/util/Locale;.CANADA_FRENCH:Ljava/util/Locale; 20 -Ljava/util/Locale;.ITALY:Ljava/util/Locale; 20 -Ljava/util/Locale;.FRANCE:Ljava/util/Locale; 20 -Ljava/util/Locale;.UK:Ljava/util/Locale; 21 -Ljava/util/Locale;.CANADA:Ljava/util/Locale; 21 -Ljava/util/Locale$Cache;.LOCALECACHE:Ljava/util/Locale$Cache;.map:Ljava/util/concurrent/ConcurrentMap; 22 -Ljava/lang/IllegalStateException; 23 -Lcom/android/internal/util/function/pooled/PooledLambdaImpl;.sMessageCallbacksPool:Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool; 24 -Lcom/android/internal/util/function/pooled/PooledLambdaImpl;.sMessageCallbacksPool:Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;.mPool:[Ljava/lang/Object; 24 -Landroid/media/MediaRouter$WifiDisplayStatusChangedReceiver; 25 -Landroid/media/MediaRouter$VolumeChangeReceiver; 25 -Landroid/app/AppOpsManager$OnOpActiveChangedListener; 26 -Landroid/media/PlayerBase; 27 -Landroid/content/pm/Checksum$Type; 28 -Ljava/lang/Class; 29 -Landroid/widget/MediaController$MediaPlayerControl; 30 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.135:Ljava/lang/Long; 30 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.152:Ljava/lang/Long; 30 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.215:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.206:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.137:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.203:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.213:Ljava/lang/Byte; 31 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.549:Ljava/lang/Long; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.201:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.249:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.163:Ljava/lang/Byte; 31 -Ljava/util/HashMap; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.210:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.161:Ljava/lang/Byte; 31 -Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.0:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.199:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.248:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.252:Ljava/lang/Byte; 31 -Lcom/android/ims/rcs/uce/UceDeviceState;.DEVICE_STATE_DESCRIPTION:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.3:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.159:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.217:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.200:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.240:Ljava/lang/Byte; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.198:Ljava/lang/Byte; 31 -Lcom/android/ims/rcs/uce/UceDeviceState;.DEVICE_STATE_DESCRIPTION:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.4:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 31 -Landroid/content/pm/PackageManager$OnChecksumsReadyListener; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.193:Ljava/lang/Byte; 31 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.228:Ljava/lang/Long; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.236:Ljava/lang/Byte; 31 -Landroid/telephony/ims/ImsService;.CAPABILITIES_LOG_MAP:Ljava/util/Map;.table:[Ljava/lang/Object;.2:Ljava/lang/Long; 31 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.211:Ljava/lang/Byte; 31 -Landroid/view/SurfaceView; 32 -Landroid/view/ViewStub$OnInflateListener; 33 -Landroid/graphics/drawable/DrawableInflater;.CONSTRUCTOR_MAP:Ljava/util/HashMap; 34 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.245:Ljava/lang/Byte; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.232:Ljava/lang/Byte; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.12:Ljava/lang/Byte; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.170:Ljava/lang/Long; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.183:Ljava/lang/Long; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.246:Ljava/lang/Byte; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.168:Ljava/lang/Long; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.72:Ljava/lang/Byte; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.243:Ljava/lang/Byte; 35 -Ljava/util/WeakHashMap;.NULL_KEY:Ljava/lang/Object; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.235:Ljava/lang/Byte; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.147:Ljava/lang/Long; 35 -Ljava/io/InterruptedIOException; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.184:Ljava/lang/Long; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.165:Ljava/lang/Long; 35 -Landroid/text/style/ForegroundColorSpan; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.176:Ljava/lang/Long; 35 -Ljava/lang/Long$LongCache;.archivedCache:[Ljava/lang/Long;.173:Ljava/lang/Long; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.181:Ljava/lang/Byte; 35 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.157:Ljava/lang/Byte; 35 -Landroid/content/res/AssetManager$AssetInputStream; 35 -Landroid/graphics/drawable/TransitionDrawable; 36 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1:Ljava/lang/Boolean; 37 -Landroid/view/ViewOverlay$OverlayViewGroup; 38 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.11:Ljava/lang/Boolean; 39 -Ljava/util/Observer; 40 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.129:Ljava/lang/Byte; 41 -[Ljava/lang/Byte; 41 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.144:Ljava/lang/Byte; 41 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.164:Ljava/lang/Byte; 42 -Landroid/view/OrientationEventListener; 43 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.195:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.233:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.229:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.128:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.242:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.196:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.208:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.212:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.228:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.205:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.197:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.204:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.207:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.223:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.244:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.174:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.194:Ljava/lang/Byte; 44 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.225:Ljava/lang/Byte; 45 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.239:Ljava/lang/Byte; 45 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.238:Ljava/lang/Byte; 45 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.227:Ljava/lang/Byte; 45 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.152:Ljava/lang/Byte; 46 -Landroid/app/RemoteAction; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.168:Ljava/lang/Byte; 46 -Landroid/text/style/QuoteSpan; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.54:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.124:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.142:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.190:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.114:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.69:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.30:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.133:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.49:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.58:Ljava/lang/Byte; 46 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.143:Ljava/lang/Byte; 47 -Landroid/icu/text/RelativeDateTimeFormatter$AbsoluteUnit; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.82:Ljava/lang/Byte; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.140:Ljava/lang/Byte; 47 -Landroid/icu/text/RelativeDateTimeFormatter;.fallbackCache:[Landroid/icu/text/RelativeDateTimeFormatter$Style; 47 -Landroid/icu/text/RelativeDateTimeFormatter$Style; 47 -Landroid/icu/text/RelativeDateTimeFormatter;.cache:Landroid/icu/text/RelativeDateTimeFormatter$Cache;.cache:Landroid/icu/impl/CacheBase;.map:Ljava/util/concurrent/ConcurrentHashMap; 47 -Landroid/icu/text/RelativeDateTimeFormatter$RelativeUnit; 47 -Landroid/icu/text/RelativeDateTimeFormatter$Direction; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.130:Ljava/lang/Byte; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.43:Ljava/lang/Byte; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.146:Ljava/lang/Byte; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.138:Ljava/lang/Byte; 47 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.136:Ljava/lang/Byte; 48 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.0:Ljava/lang/Byte; 49 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.160:Ljava/lang/Byte; 49 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.169:Ljava/lang/Byte; 50 -Landroid/widget/Spinner; 50 -Landroid/widget/MultiAutoCompleteTextView; 50 -Ljava/util/ArrayList; 50 -Landroid/widget/CheckBox; 50 -Ljava/io/Serializable; 50 -Landroid/widget/RatingBar; 50 -Ljava/lang/Byte$ByteCache;.archivedCache:[Ljava/lang/Byte;.132:Ljava/lang/Byte; 50 -Landroid/widget/AutoCompleteTextView; 50 -Ljava/util/concurrent/ConcurrentLinkedDeque$Node; 50 -[Ljava/lang/Object; 50 -Landroid/widget/SeekBar; 51 -Ljava/lang/Void; 52 -Landroid/app/ActivityTaskManager;.sInstance:Landroid/util/Singleton; 53 -Landroid/view/ViewRootImpl$$ExternalSyntheticLambda11; 54 -Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener; 55 -Landroid/view/InsetsAnimationThread; 56 -Lcom/android/internal/jank/InteractionJankMonitor$InstanceHolder; 57 -Lcom/android/internal/jank/InteractionJankMonitor; 57 -Landroid/hardware/camera2/CameraCharacteristics;.FLASH_INFO_AVAILABLE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 58 -Landroid/hardware/display/NightDisplayListener$Callback; 59 -Landroid/media/MediaRouter2Manager; 59 -Landroid/os/HandlerExecutor; 59 -Landroid/os/strictmode/LeakedClosableViolation; 60 -Lcom/android/internal/logging/MetricsLogger; 60 -Lcom/android/internal/os/PowerProfile;.sPowerItemMap:Ljava/util/HashMap; 61 -Lcom/android/internal/os/PowerProfile;.sPowerArrayMap:Ljava/util/HashMap; 61 -Lcom/android/internal/os/PowerProfile;.sModemPowerProfile:Lcom/android/internal/power/ModemPowerProfile;.mPowerConstants:Landroid/util/SparseDoubleArray;.mValues:Landroid/util/SparseLongArray; 61 -Landroid/content/IntentFilter; 62 -Landroid/telecom/TelecomManager; 63 -Ljava/lang/IllegalArgumentException; 64 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.1:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object; 65 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.1:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mCache:Ljava/util/LinkedHashMap; 65 -Landroid/telephony/VisualVoicemailSmsFilterSettings;.DEFAULT_ORIGINATING_NUMBERS:Ljava/util/List; 66 -Ljava/util/AbstractList; 68 -Ljava/util/AbstractCollection; 68 -Ljava/util/Collections$EmptyList; 69 -Ljava/lang/StackTraceElement; 69 -[Ljava/lang/StackTraceElement; 69 -Landroid/os/strictmode/Violation; 70 -Ljava/util/List; 71 -Ljava/lang/String; 72 -Ljava/io/ObjectInputStream; 73 -Ljava/io/ObjectStreamClass$Caches;.localDescs:Ljava/util/concurrent/ConcurrentMap; 73 -Ljava/io/ObjectStreamClass$Caches;.reflectors:Ljava/util/concurrent/ConcurrentMap; 73 -Ljava/io/ObjectOutputStream; 73 -Ljava/lang/Number; 74 -Ljava/math/BigInteger; 75 -[B 76 -Landroid/os/Handler; 77 -Landroid/view/accessibility/AccessibilityManager; 78 +Landroid/content/ComponentCallbacks; 2 +Landroid/content/ComponentCallbacks2; 2 +Lcom/android/internal/app/ResolverActivity$ActionTitle;.HOME:Lcom/android/internal/app/ResolverActivity$ActionTitle;.name:Ljava/lang/String; 4 +Landroid/icu/text/MessageFormat;.typeList:[Ljava/lang/String;.1:Ljava/lang/String; 4 +Landroid/app/assist/AssistStructure$HtmlInfoNode; 4 +Landroid/app/ActivityManager$AppTask; 4 +Landroid/view/inputmethod/SurroundingText; 5 +Landroid/widget/ProgressBar$SavedState; 6 +Landroid/telephony/SignalStrength; 9 +Landroid/app/Notification$BigTextStyle; 10 +Landroid/app/AppOpsManager$OnOpNotedListener; 11 +Landroid/window/IRemoteTransition$Stub$Proxy; 11 +Lcom/android/internal/logging/UiEventLogger$UiEventEnum; 11 +Landroid/app/AppOpsManager$OnOpNotedInternalListener; 11 +Landroid/view/DisplayCutout; 11 +Lcom/android/internal/logging/MetricsLogger; 11 +Landroid/os/strictmode/LeakedClosableViolation; 11 +Lcom/android/internal/policy/AttributeCache; 11 +Lcom/android/internal/util/LatencyTracker$Action; 11 +Landroid/app/AppOpsManager$OnOpStartedListener; 11 +Landroid/app/Notification$DecoratedCustomViewStyle; 11 +Lcom/android/internal/R$styleable;.WindowAnimation:[I 11 +Landroid/app/Notification$CallStyle; 11 +Lcom/android/internal/statusbar/NotificationVisibility; 11 +Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal; 12 +Landroid/graphics/ColorSpace$Model;.RGB:Landroid/graphics/ColorSpace$Model; 13 +Landroid/app/WallpaperManager; 13 +Landroid/text/TextUtils$TruncateAt; 14 +Landroid/app/smartspace/uitemplatedata/BaseTemplateData; 15 +Landroid/app/smartspace/SmartspaceTarget; 15 +Lcom/android/internal/os/SomeArgs; 16 +Landroid/widget/inline/InlinePresentationSpec; 17 +Landroid/media/AudioSystem; 18 +Lcom/android/internal/os/CachedDeviceState$Readonly; 18 +Landroid/service/notification/Condition; 18 +Landroid/os/BatteryManagerInternal; 18 +Landroid/content/pm/PermissionGroupInfo; 18 +Landroid/app/job/JobInfo; 18 +Landroid/hardware/location/IActivityRecognitionHardwareClient; 18 +Landroid/accessibilityservice/AccessibilityServiceInfo; 18 +Landroid/app/Notification$DecoratedMediaCustomViewStyle; 18 +Landroid/hardware/location/NanoAppMessage; 18 +Landroid/net/Uri$PathPart;.NULL:Landroid/net/Uri$PathPart; 18 +Landroid/hardware/soundtrigger/SoundTrigger$StatusListener; 18 +Landroid/util/EventLog; 18 +Landroid/app/ActivityManager$RecentTaskInfo; 18 +Lcom/android/internal/widget/LockSettingsInternal; 18 +Landroid/window/DisplayAreaAppearedInfo; 18 +Landroid/accounts/AuthenticatorException; 18 +Landroid/os/ResultReceiver; 18 +Landroid/content/pm/UserPackage;.sCacheLock:Ljava/lang/Object; 18 +Lcom/android/internal/view/WindowManagerPolicyThread; 18 +Landroid/content/pm/LauncherActivityInfoInternal; 18 +Landroid/webkit/WebViewLibraryLoader$RelroFileCreator; 18 +Landroid/hardware/biometrics/BiometricSourceType; 18 +Landroid/net/metrics/ValidationProbeEvent; 18 +Landroid/view/RoundedCorners; 18 +Landroid/os/Process;.ZYGOTE_PROCESS:Landroid/os/ZygoteProcess; 18 +Landroid/app/ServiceStartArgs; 18 +Landroid/telecom/Logging/EventManager$EventListener; 18 +Landroid/app/SystemServiceRegistry; 18 +Landroid/permission/PermissionManagerInternal; 18 +Landroid/service/notification/StatusBarNotification; 18 +Lcom/android/internal/os/ProcessCpuTracker$FilterStats; 18 +Lcom/android/internal/util/ToBooleanFunction; 18 +Landroid/content/pm/RegisteredServicesCache$3; 18 +Landroid/os/ServiceManager$ServiceNotFoundException; 18 +Landroid/app/ActivityManagerInternal; 18 +Landroid/app/assist/AssistStructure; 18 +Landroid/hardware/camera2/CameraManager$CameraManagerGlobal; 18 +Landroid/app/servertransaction/PauseActivityItem; 18 +Landroid/hardware/soundtrigger/SoundTriggerModule$EventHandlerDelegate; 18 +Landroid/media/AudioAttributes; 18 +Landroid/service/dreams/DreamManagerInternal; 18 +Lcom/android/internal/listeners/ListenerExecutor$FailureCallback; 18 +Landroid/net/metrics/DhcpErrorEvent; 18 +Landroid/app/servertransaction/ConfigurationChangeItem; 18 +Landroid/hardware/sidekick/SidekickInternal; 18 +Landroid/appwidget/AppWidgetManagerInternal; 18 +Landroid/hardware/display/DisplayManagerInternal; 18 +Landroid/telecom/PhoneAccountHandle; 18 +Landroid/view/WindowManagerPolicyConstants; 18 +Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventCallback; 18 +Lcom/android/internal/app/procstats/AssociationState;.sTmpSourceKey:Lcom/android/internal/app/procstats/AssociationState$SourceKey; 18 +Landroid/content/pm/RegisteredServicesCache$2; 18 +Landroid/content/pm/UserPackage; 18 +Landroid/app/time/TimeZoneCapabilities; 18 +Lcom/android/internal/util/function/LongObjPredicate; 18 +Landroid/app/servertransaction/NewIntentItem; 18 +Landroid/app/PropertyInvalidatedCache;.sCorkedInvalidates:Ljava/util/HashMap; 18 +Lcom/android/internal/os/StatsdHiddenApiUsageLogger;.sInstance:Lcom/android/internal/os/StatsdHiddenApiUsageLogger; 18 +Landroid/app/admin/DevicePolicyManagerInternal$OnCrossProfileWidgetProvidersChangeListener; 18 +Landroid/app/usage/AppStandbyInfo; 18 +Landroid/graphics/GraphicsStatsService; 18 +Lcom/android/internal/os/LongArrayMultiStateCounter; 18 +Landroid/graphics/Bitmap$CompressFormat; 18 +Landroid/media/audiopolicy/AudioVolumeGroup; 18 +Landroid/content/pm/CrossProfileAppsInternal; 18 +Landroid/os/PowerManagerInternal; 18 +Landroid/hardware/location/GeofenceHardwareImpl; 18 +Landroid/app/AppOpsManager$AttributedOpEntry; 18 +Landroid/attention/AttentionManagerInternal; 18 +Landroid/telecom/Log; 18 +Landroid/accounts/AccountManagerInternal; 18 +Landroid/content/pm/ShortcutServiceInternal$ShortcutChangeListener; 18 +Landroid/os/PatternMatcher;.sParsedPatternScratch:[I 18 +Landroid/app/AppOpsManager$NoteOpEvent; 18 +Lcom/android/internal/R$styleable;.Window:[I 18 +Landroid/content/pm/dex/ArtManagerInternal; 18 +Landroid/content/pm/PackageInstaller$SessionInfo; 18 +Landroid/app/servertransaction/StartActivityItem; 18 +Landroid/content/pm/PackageManager;.sCacheAutoCorker:Landroid/app/PropertyInvalidatedCache$AutoCorker; 18 +Landroid/graphics/Region;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 18 +Landroid/app/Notification$MediaStyle; 18 +Landroid/app/time/TimeZoneConfiguration; 18 +Lcom/android/internal/os/LongMultiStateCounter; 18 +Landroid/service/voice/VoiceInteractionManagerInternal; 18 +Landroid/view/Display$HdrCapabilities; 18 +Landroid/media/AudioSystem$AudioRecordingCallback; 18 +Landroid/app/servertransaction/DestroyActivityItem; 18 +Lcom/android/internal/os/RuntimeInit$ApplicationWtfHandler; 18 +Landroid/net/metrics/IpManagerEvent; 18 +Landroid/net/metrics/NetworkEvent; 18 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.7:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mLock:Ljava/lang/Object; 18 +Landroid/app/AppOpsManagerInternal; 18 +Landroid/content/res/ResourceTimer; 18 +Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest; 18 +Lcom/android/internal/statusbar/NotificationVisibility$NotificationLocation; 18 +Landroid/app/servertransaction/ObjectPool;.sPoolSync:Ljava/lang/Object; 18 +Landroid/content/pm/PackageManager;.sCacheAutoCorker:Landroid/app/PropertyInvalidatedCache$AutoCorker;.mLock:Ljava/lang/Object; 18 +Landroid/app/admin/DevicePolicyManagerInternal; 18 +Landroid/webkit/WebViewZygote; 18 +Landroid/view/DisplayAddress$Physical; 18 +Landroid/accounts/AccountManagerInternal$OnAppPermissionChangeListener; 18 +Lcom/android/internal/os/BatteryStatsHistory$HistoryStepDetailsCalculator; 18 +Landroid/appwidget/AppWidgetProviderInfo; 18 +Landroid/provider/Settings; 18 +Lcom/android/server/AppWidgetBackupBridge; 18 +Landroid/content/pm/RegisteredServicesCacheListener; 18 +Landroid/window/IOnBackInvokedCallback$Stub$Proxy; 18 +Landroid/view/ViewDebug$ExportedProperty; 18 +Landroid/text/format/TimeFormatter; 18 +Landroid/content/ComponentName$WithComponentName; 18 +Landroid/hardware/location/ContextHubInfo; 18 +Landroid/app/servertransaction/ActivityResultItem; 18 +Landroid/hardware/display/DeviceProductInfo$ManufactureDate; 18 +Lcom/android/internal/util/function/DodecConsumer; 18 +Landroid/app/PropertyInvalidatedCache;.sCorks:Ljava/util/HashMap; 18 +Landroid/app/ApplicationExitInfo; 18 +Lcom/android/server/usage/AppStandbyInternal; 18 +Landroid/view/autofill/AutofillManagerInternal; 18 +Lcom/android/internal/infra/AbstractRemoteService$VultureCallback; 18 +Landroid/service/notification/NotificationListenerService$RankingMap; 18 +Landroid/service/notification/ConditionProviderService; 18 +Landroid/net/metrics/ApfProgramEvent; 18 +Lcom/android/internal/infra/AndroidFuture$1; 18 +Landroid/app/servertransaction/StopActivityItem; 18 +Landroid/app/PropertyInvalidatedCache$AutoCorker$1; 18 +Landroid/util/NtpTrustedTime; 18 +Landroid/content/pm/parsing/ApkLite; 18 +Lcom/android/server/LocalServices;.sLocalServiceObjects:Landroid/util/ArrayMap; 18 +Landroid/app/PropertyInvalidatedCache;.sCorkLock:Ljava/lang/Object; 18 +Landroid/app/PendingIntent$FinishedDispatcher; 18 +Landroid/os/ResultReceiver$MyResultReceiver; 18 +Landroid/os/ServiceSpecificException; 18 +Landroid/os/UEventObserver; 18 +Landroid/os/SharedMemory; 18 +Lcom/android/internal/util/function/DodecFunction; 18 +Landroid/content/pm/BaseParceledListSlice$1; 18 +Landroid/content/pm/FallbackCategoryProvider;.sFallbacks:Landroid/util/ArrayMap; 18 +Lcom/android/internal/content/om/OverlayConfig$PackageProvider; 18 +Landroid/util/ArrayMap;.sBaseCacheLock:Ljava/lang/Object; 18 +Landroid/debug/AdbManagerInternal; 18 +Landroid/view/WindowManagerPolicyConstants$PointerEventListener; 18 +Landroid/telephony/ServiceState; 18 +Lcom/android/internal/os/LooperStats; 18 +Landroid/content/pm/LauncherApps$ShortcutQuery$QueryFlags; 18 +Landroid/app/ActivityManager; 18 +Landroid/app/assist/ActivityId; 18 +Landroid/hardware/display/DeviceProductInfo; 18 +Lcom/android/internal/os/LongArrayMultiStateCounter;.sTmpArrayContainer:Ljava/util/concurrent/atomic/AtomicReference; 18 +Lcom/android/internal/os/LongArrayMultiStateCounter$LongArrayContainer; 18 +Landroid/service/notification/ZenPolicy; 18 +Landroid/content/pm/PackageManager$Property; 18 +Lcom/android/internal/content/om/OverlayConfig; 18 +Landroid/content/pm/ResolveInfo; 18 +Lcom/android/internal/os/KernelCpuBpfTracking; 18 +Landroid/content/pm/RegisteredServicesCache$1; 18 +Landroid/telecom/Logging/SessionManager$ISessionListener; 18 +Landroid/media/AudioPlaybackConfiguration$PlayerDeathMonitor; 18 +Landroid/service/autofill/FillContext; 18 +Landroid/graphics/Region;.sPool:Landroid/util/Pools$SynchronizedPool; 18 +Landroid/util/MemoryIntArray; 18 +Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper; 18 +Landroid/os/storage/StorageManagerInternal; 18 +Landroid/media/AudioSystem$ErrorCallback; 18 +Landroid/service/notification/ZenModeConfig; 18 +Landroid/media/AudioPlaybackConfiguration; 18 +Landroid/content/pm/UserPackage;.sCache:Landroid/util/SparseArrayMap;.mData:Landroid/util/SparseArray; 18 +Landroid/app/AppOpsManager$SamplingStrategy; 18 +Landroid/app/servertransaction/ActivityConfigurationChangeItem; 18 +Landroid/hardware/location/GeofenceHardwareService; 18 +Landroid/os/RemoteCallback$1; 18 +Landroid/os/FileUtils$ProgressListener; 18 +Landroid/annotation/StringRes; 18 +Lcom/android/server/WidgetBackupProvider; 18 +Landroid/media/AudioManagerInternal$RingerModeDelegate; 18 +Landroid/hardware/biometrics/ComponentInfoInternal; 18 +Landroid/media/AudioManagerInternal; 18 +Landroid/media/AudioSystem$DynamicPolicyCallback; 18 +Landroid/os/DeadObjectException; 18 +Landroid/content/pm/ShortcutServiceInternal; 18 +Landroid/view/ViewDebug$FlagToString; 18 +Landroid/os/storage/StorageVolume; 18 +Landroid/window/TaskAppearedInfo; 18 +Lcom/android/internal/display/BrightnessSynchronizer; 18 +Lcom/android/internal/infra/ServiceConnector$Impl$CompletionAwareJob; 18 +Landroid/os/strictmode/UnbufferedIoViolation; 19 +Landroid/app/usage/UsageStats; 20 +Landroid/app/usage/CacheQuotaHint; 21 +Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig; 21 +Landroid/os/BaseBundle; 22 +Landroid/os/Parcel$ReadWriteHelper; 23 +Landroid/util/SparseArray; 24 +Landroid/app/Instrumentation; 25 +Landroid/content/pm/PathPermission; 26 +[Landroid/content/pm/ConfigurationInfo; 26 +Landroid/content/pm/ActivityInfo; 26 +Landroid/content/pm/Attribution; 26 +Landroid/content/pm/ConfigurationInfo; 26 +Landroid/content/pm/ActivityInfo$WindowLayout; 26 +Landroid/os/PatternMatcher; 26 +Landroid/content/pm/ServiceInfo; 26 +[Landroid/content/pm/FeatureInfo; 26 +[Landroid/content/pm/FeatureGroupInfo; 26 +Landroid/content/pm/SigningInfo; 26 +[Landroid/content/pm/InstrumentationInfo; 26 +[Landroid/content/pm/ServiceInfo; 26 +[Landroid/os/PatternMatcher; 26 +Landroid/content/pm/ComponentInfo; 26 +[Landroid/content/pm/PermissionInfo; 26 +[Landroid/content/pm/ActivityInfo; 26 +[Landroid/content/pm/Attribution; 26 +Landroid/content/pm/SharedLibraryInfo; 26 +Landroid/content/pm/FeatureGroupInfo; 26 +Landroid/content/pm/InstrumentationInfo; 26 +[Landroid/content/pm/Signature; 26 +[Landroid/content/pm/ProviderInfo; 26 +[Landroid/content/pm/PathPermission; 26 +Landroid/content/pm/Signature; 26 +Landroid/graphics/drawable/NinePatchDrawable; 28 +Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_APERTURES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 29 +Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_FOCAL_LENGTHS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 30 +Landroid/hardware/camera2/params/StreamConfigurationDuration; 31 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/params/StreamConfiguration; 31 +Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_CAPABILITIES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/params/HighSpeedVideoConfiguration; 31 +Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 31 +Landroid/hardware/camera2/CameraCharacteristics;.LENS_FACING:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 32 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 33 +Landroid/hardware/camera2/marshal/MarshalRegistry;.sMarshalerMap:Ljava/util/HashMap; 33 +Landroid/hardware/devicestate/DeviceStateManagerGlobal; 34 +Lgov/nist/javax/sip/header/AuthenticationHeader;.SIGNATURE:Ljava/lang/String; 40 +Landroid/app/slice/Slice;.SUBTYPE_SOURCE:Ljava/lang/String; 41 +Ljavax/sip/message/Request;.INFO:Ljava/lang/String; 41 +Lgov/nist/javax/sip/header/extensions/ReferencesHeader;.SERVICE:Ljava/lang/String; 42 +Landroid/icu/impl/locale/LocaleValidityChecker$SpecialCase;.normal:Landroid/icu/impl/locale/LocaleValidityChecker$SpecialCase;.name:Ljava/lang/String; 42 +Lgov/nist/javax/sip/address/NetObject;.PHONE:Ljava/lang/String; 42 +Landroid/icu/impl/ValidIdentifiers$Datatype;.language:Landroid/icu/impl/ValidIdentifiers$Datatype;.name:Ljava/lang/String; 42 +Landroid/icu/text/MessageFormat;.dateModifierList:[Ljava/lang/String;.3:Ljava/lang/String; 42 +Landroid/view/translation/UiTranslationManager;.EXTRA_PACKAGE_NAME:Ljava/lang/String; 42 +Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.140:Ljava/lang/String; 43 +Landroid/icu/impl/units/UnitPreferences;.measurementSystem:Ljava/util/Map;.m:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.15:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 44 +Lcom/android/i18n/timezone/TimeZoneFinder;.COUNTRY_ELEMENT:Ljava/lang/String; 45 +Landroid/app/usage/UsageEvents$Event;.DEVICE_EVENT_PACKAGE_NAME:Ljava/lang/String; 46 +Landroid/icu/text/MessageFormat;.rootLocale:Ljava/util/Locale;.baseLocale:Lsun/util/locale/BaseLocale;.language:Ljava/lang/String; 47 +Landroid/graphics/Bitmap; 68 +Landroid/view/inputmethod/IInputMethodManagerGlobalInvoker; 69 +Landroid/view/SurfaceControlRegistry; 70 +Lcom/android/internal/inputmethod/ImeTracing; 70 +Lcom/android/internal/policy/DecorView; 71 +Landroid/view/ViewTreeObserver; 71 +Landroid/view/accessibility/AccessibilityNodeIdManager; 71 +Landroid/view/ViewRootImpl; 71 +Landroid/widget/FrameLayout; 71 +Landroid/view/ViewStub; 71 +Landroid/window/SurfaceSyncGroup; 72 +Landroid/view/Choreographer; 73 +Landroid/os/SystemProperties;.sChangeCallbacks:Ljava/util/ArrayList; 74 +Landroid/app/ActivityClient;.sInstance:Landroid/util/Singleton; 75 +Landroid/app/ActivityClient;.INTERFACE_SINGLETON:Landroid/app/ActivityClient$ActivityClientControllerSingleton; 75 +Landroid/view/autofill/AutofillId; 76 +Landroid/os/StrictMode$InstanceTracker;.sInstanceCounts:Ljava/util/HashMap; 77 +Landroid/widget/LinearLayout; 78 Landroid/view/ViewConfiguration;.sConfigurations:Landroid/util/SparseArray;.mKeys:[I 79 Landroid/view/ViewConfiguration;.sConfigurations:Landroid/util/SparseArray;.mValues:[Ljava/lang/Object; 79 Landroid/view/ViewConfiguration;.sConfigurations:Landroid/util/SparseArray; 79 -Landroid/widget/FrameLayout; 80 -Lcom/android/internal/inputmethod/ImeTracing; 80 -Lcom/android/internal/policy/DecorView; 80 -Landroid/view/accessibility/AccessibilityNodeIdManager; 80 -Landroid/view/ViewTreeObserver; 80 -Landroid/view/ViewRootImpl; 80 -Landroid/os/SystemProperties;.sChangeCallbacks:Ljava/util/ArrayList; 80 -Landroid/transition/ChangeTransform; 80 -Landroid/window/SurfaceSyncGroup; 80 -Landroid/transition/ChangeClipBounds; 80 -Landroid/view/SurfaceControlRegistry; 80 -Landroid/transition/ChangeImageTransform; 80 -Landroid/widget/LinearLayout; 80 -Landroid/view/ViewStub; 81 -Landroid/text/TextLine;.sCached:[Landroid/text/TextLine; 82 -Landroid/text/TextUtils; 82 -Landroid/graphics/TemporaryBuffer; 82 -Landroid/content/res/ColorStateList;.sCache:Landroid/util/SparseArray; 83 -Landroid/text/Layout;.sTempRect:Landroid/graphics/Rect; 84 -Landroid/widget/ImageView; 85 -Landroid/graphics/drawable/ColorDrawable; 86 -Landroid/os/StrictMode$InstanceTracker;.sInstanceCounts:Ljava/util/HashMap; 87 -Landroid/app/ActivityClient;.INTERFACE_SINGLETON:Landroid/app/ActivityClient$ActivityClientControllerSingleton; 88 -Landroid/app/ActivityClient;.sInstance:Landroid/util/Singleton; 88 -Landroid/view/AbsSavedState$1; 89 -Landroid/app/FragmentManagerState; 90 -Landroid/window/OnBackAnimationCallback; 91 -Landroid/animation/AnimatorInflater;.sTmpTypedValue:Landroid/util/TypedValue; 92 -Landroid/graphics/drawable/RippleDrawable; 93 -Landroid/view/inputmethod/IInputMethodManagerGlobalInvoker; 94 -Landroid/app/ActivityTaskManager;.IActivityTaskManagerSingleton:Landroid/util/Singleton; 95 -Landroid/view/Choreographer; 96 -Lcom/android/internal/os/SomeArgs; 97 -Landroid/graphics/Bitmap; 98 -Landroid/view/autofill/AutofillId; 99 -Landroid/view/inputmethod/BaseInputConnection;.COMPOSING:Ljava/lang/Object; 100 -Landroid/text/Selection;.SELECTION_MEMORY:Ljava/lang/Object; 101 -Landroid/text/Selection;.SELECTION_END:Ljava/lang/Object; 101 -Landroid/text/Selection;.SELECTION_START:Ljava/lang/Object; 101 -Landroid/text/SpannableStringBuilder;.sCachedIntBuffer:[[I 102 -Landroid/text/Selection$MemoryTextWatcher; 103 -Landroid/text/SpanWatcher; 104 -Lcom/android/internal/util/ArrayUtils;.sCache:[Ljava/lang/Object; 105 -Ljava/lang/Integer;.SMALL_NEG_VALUES:[Ljava/lang/String; 106 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 107 -Lsun/nio/ch/SharedFileLockTable;.lockMap:Ljava/util/concurrent/ConcurrentHashMap; 108 -Lsun/nio/ch/FileChannelImpl; 108 -Landroid/database/sqlite/SQLiteDatabase$CursorFactory; 109 -Landroid/database/sqlite/SQLiteDebug$NoPreloadHolder; 110 -Landroid/database/sqlite/SQLiteCompatibilityWalFlags; 110 -Landroid/database/sqlite/SQLiteGlobal; 110 -Landroid/database/CursorWindow; 111 -Landroid/content/ContentResolver; 112 -Ljava/nio/charset/Charset; 113 -Landroid/app/ContextImpl; 114 -Ljava/util/concurrent/Executors$DefaultThreadFactory;.poolNumber:Ljava/util/concurrent/atomic/AtomicInteger; 115 -Landroid/content/pm/PackageManager;.sPackageInfoCache:Landroid/app/PropertyInvalidatedCache;.mCache:Ljava/util/LinkedHashMap; 116 -Landroid/content/pm/PackageManager;.sApplicationInfoCache:Landroid/app/PropertyInvalidatedCache;.mCache:Ljava/util/LinkedHashMap; 117 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager;.systemContext:Ljava/util/logging/LogManager$LoggerContext;.namedLoggers:Ljava/util/Hashtable;.table:[Ljava/util/Hashtable$HashtableEntry; 118 -Landroid/ddm/DdmHandleAppName; 118 -Landroid/provider/DeviceConfigInitializer; 118 -Lsun/misc/Cleaner; 118 -Ldalvik/system/CloseGuard; 118 -Landroid/graphics/Typeface; 118 -Landroid/os/BinderProxy;.sProxyMap:Landroid/os/BinderProxy$ProxyMap;.mMainIndexKeys:[[Ljava/lang/Long; 118 -Landroid/permission/PermissionManager; 118 -Landroid/media/MediaFrameworkPlatformInitializer; 118 -Ljava/util/TimeZone; 118 -Landroid/os/Environment; 118 -Landroid/compat/Compatibility; 118 -Landroid/os/ServiceManager; 118 -Landroid/content/pm/PackageManager;.sApplicationInfoCache:Landroid/app/PropertyInvalidatedCache; 118 -Ljava/util/Locale$NoImagePreloadHolder; 118 -Ljava/lang/System; 118 -Lcom/android/internal/os/RuntimeInit; 118 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager;.systemContext:Ljava/util/logging/LogManager$LoggerContext;.namedLoggers:Ljava/util/Hashtable; 118 -Ldalvik/system/VMRuntime;.THE_ONE:Ldalvik/system/VMRuntime; 118 -Landroid/view/View; 118 -Landroid/hardware/display/DisplayManagerGlobal; 118 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager; 118 -Landroid/telephony/TelephonyFrameworkInitializer; 118 -Landroid/se/omapi/SeFrameworkInitializer; 118 -Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap;.mHashes:[I 118 -Landroid/security/net/config/SystemCertificateSource$NoPreloadHolder; 118 -Landroid/security/net/config/ApplicationConfig; 118 -Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map; 118 -Ljava/util/Locale; 118 -Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map;.table:[Ljava/util/WeakHashMap$Entry; 118 -Ljava/security/Provider; 118 -Ldalvik/system/ZygoteHooks; 118 -Landroid/os/Message; 118 -Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object; 118 -Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap; 118 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap; 118 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager;.userContext:Ljava/util/logging/LogManager$LoggerContext;.namedLoggers:Ljava/util/Hashtable; 118 -Ljava/lang/ThreadGroup;.mainThreadGroup:Ljava/lang/ThreadGroup; 118 -Ldalvik/system/RuntimeHooks; 118 -Landroid/nfc/NfcFrameworkInitializer; 118 -Landroid/os/Looper; 118 -Landroid/os/LocaleList; 118 -Ldalvik/system/SocketTagger; 118 -Landroid/icu/util/TimeZone; 118 -Landroid/util/ArraySet; 118 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager;.systemContext:Ljava/util/logging/LogManager$LoggerContext;.root:Ljava/util/logging/LogManager$LogNode; 118 -Landroid/os/BinderProxy;.sProxyMap:Landroid/os/BinderProxy$ProxyMap;.mMainIndexValues:[Ljava/util/ArrayList; 118 -Ljava/util/Random;.seedUniquifier:Ljava/util/concurrent/atomic/AtomicLong; 118 -Landroid/app/ActivityThread; 118 -Landroid/os/Binder; 118 -Ljava/lang/ThreadLocal;.nextHashCode:Ljava/util/concurrent/atomic/AtomicInteger; 119 -Landroid/os/Parcel; 120 -Landroid/system/UnixSocketAddress; 120 -Ljava/lang/ThreadGroup;.systemThreadGroup:Ljava/lang/ThreadGroup; 120 -Ljava/lang/Daemons$FinalizerDaemon;.INSTANCE:Ljava/lang/Daemons$FinalizerDaemon; 120 -Landroid/os/Parcel;.sPairedCreators:Ljava/util/HashMap; 120 -Ljava/lang/Thread; 120 -Landroid/os/Parcel;.mCreators:Ljava/util/HashMap; 120 -Ljava/lang/Daemons$FinalizerDaemon;.INSTANCE:Ljava/lang/Daemons$FinalizerDaemon;.progressCounter:Ljava/util/concurrent/atomic/AtomicInteger; 120 -Landroid/system/StructPollfd; 120 -Ljava/lang/Daemons$HeapTaskDaemon;.INSTANCE:Ljava/lang/Daemons$HeapTaskDaemon; 120 -Landroid/system/StructTimeval; 120 -Ldalvik/system/VMRuntime;.THE_ONE:Ldalvik/system/VMRuntime;.allocationCount:Ljava/util/concurrent/atomic/AtomicInteger; 120 -Ljava/lang/Daemons$ReferenceQueueDaemon;.INSTANCE:Ljava/lang/Daemons$ReferenceQueueDaemon;.progressCounter:Ljava/util/concurrent/atomic/AtomicInteger; 120 -Landroid/os/GraphicsEnvironment;.sInstance:Landroid/os/GraphicsEnvironment; 120 -Ljava/lang/Daemons$FinalizerWatchdogDaemon;.INSTANCE:Ljava/lang/Daemons$FinalizerWatchdogDaemon; 120 -Ljava/lang/ref/FinalizerReference; 120 -Landroid/os/Process; 120 -Ljava/lang/Daemons$ReferenceQueueDaemon;.INSTANCE:Ljava/lang/Daemons$ReferenceQueueDaemon; 120 -Lcom/android/internal/os/BinderInternal; 120 -Landroid/app/ApplicationLoaders;.gApplicationLoaders:Landroid/app/ApplicationLoaders;.mLoaders:Landroid/util/ArrayMap; 121 -Landroid/app/DexLoadReporter;.INSTANCE:Landroid/app/DexLoadReporter;.mDataDirs:Ljava/util/Set;.map:Ljava/util/HashMap; 122 -Ldalvik/system/BaseDexClassLoader; 122 -Landroid/renderscript/RenderScriptCacheDir; 122 -Landroid/graphics/Compatibility; 123 -Llibcore/io/Libcore; 123 -Landroid/provider/FontsContract; 123 -Ljava/security/Security;.version:Ljava/util/concurrent/atomic/AtomicInteger; 123 -Llibcore/net/NetworkSecurityPolicy; 123 -Lsun/security/jca/Providers; 123 -Landroid/graphics/Canvas; 123 -Landroid/os/StrictMode; 124 -Landroid/content/pm/PackageManager;.sPackageInfoCache:Landroid/app/PropertyInvalidatedCache; 125 -Lcom/android/internal/os/StatsdHiddenApiUsageLogger;.sInstance:Lcom/android/internal/os/StatsdHiddenApiUsageLogger; 126 -Ljava/util/logging/LogManager;.manager:Ljava/util/logging/LogManager;.loggerRefQueue:Ljava/lang/ref/ReferenceQueue; 127 -Landroid/view/WindowManagerGlobal; 128 -Lcom/android/internal/util/function/pooled/PooledLambdaImpl;.sPool:Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool; 129 -Lcom/android/internal/util/function/pooled/PooledLambdaImpl;.sPool:Lcom/android/internal/util/function/pooled/PooledLambdaImpl$Pool;.mPool:[Ljava/lang/Object; 129 -Landroid/view/inputmethod/InputMethodManager; 130 -Landroid/media/MediaRouter; 131 -Landroid/hardware/SensorPrivacyManager; 132 -Landroid/os/storage/StorageManager; 133 -Landroid/view/contentcapture/ContentCaptureManager; 134 -Landroid/hardware/input/InputManager; 134 -Landroid/app/people/PeopleManager; 134 -Landroid/media/session/MediaSessionManager; 134 -Landroid/security/attestationverification/AttestationVerificationManager; 134 -Landroid/net/vcn/VcnManager; 134 -Landroid/os/RecoverySystem; 134 -Landroid/net/NetworkPolicyManager; 134 -Landroid/net/wifi/sharedconnectivity/app/SharedConnectivityManager; 134 -Landroid/permission/PermissionControllerManager; 134 -Landroid/app/tare/EconomyManager; 134 -Landroid/view/translation/TranslationManager; 134 -Landroid/view/textclassifier/TextClassificationManager; 134 -Landroid/view/autofill/AutofillManager; 134 -Landroid/os/SystemConfigManager; 134 -Landroid/view/LayoutInflater; 134 -Landroid/credentials/CredentialManager; 134 -Landroid/service/persistentdata/PersistentDataBlockManager; 134 -Landroid/view/textservice/TextServicesManager; 134 -Landroid/app/admin/DevicePolicyManager; 134 -Ljava/lang/StackStreamFactory; 134 -Landroid/view/WindowManager; 134 -Landroid/app/contentsuggestions/ContentSuggestionsManager; 134 -Landroid/media/tv/tunerresourcemanager/TunerResourceManager; 134 -Landroid/telephony/SubscriptionManager; 134 -Landroid/os/HardwarePropertiesManager; 134 -Landroid/media/AudioManager; 135 -Landroid/telephony/TelephonyManager; 136 -Landroid/util/ArrayMap; 137 -Landroid/app/QueuedWork; 138 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.0:Ljava/util/WeakHashMap$Entry; 139 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap; 140 -Ljava/util/concurrent/ScheduledThreadPoolExecutor;.sequencer:Ljava/util/concurrent/atomic/AtomicLong; 141 -Landroid/util/Log; 142 -Ljava/util/Collections$SynchronizedCollection; 143 -Ljava/util/Set; 143 -Ljava/util/Collections$SynchronizedSet; 143 -Ljava/util/Collection; 143 -Ljava/lang/Integer;.SMALL_NONNEG_VALUES:[Ljava/lang/String; 144 -Landroid/content/ComponentName; 145 -Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle; 146 -Landroid/os/PersistableBundle;.EMPTY:Landroid/os/PersistableBundle; 147 -Landroid/icu/impl/locale/BaseLocale;.CACHE:Landroid/icu/impl/locale/BaseLocale$Cache;._map:Ljava/util/concurrent/ConcurrentHashMap; 148 -Ljava/util/GregorianCalendar; 149 -Ljava/text/DontCareFieldPosition;.INSTANCE:Ljava/text/FieldPosition; 150 -Landroid/app/UiModeManager; 151 -Ljdk/internal/access/SharedSecrets; 152 -Landroid/icu/impl/ZoneMeta;.CANONICAL_ID_CACHE:Landroid/icu/impl/ICUCache; 153 -Landroid/icu/impl/ZoneMeta;.SYSTEM_ZONE_CACHE:Landroid/icu/impl/ZoneMeta$SystemTimeZoneCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 154 -Ljava/time/ZoneOffset;.ID_CACHE:Ljava/util/concurrent/ConcurrentMap; 155 -Ljava/time/ZoneOffset;.ID_CACHE:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node; 155 -Ljava/time/ZoneOffset;.SECONDS_CACHE:Ljava/util/concurrent/ConcurrentMap; 155 -Ljava/time/ZoneOffset;.SECONDS_CACHE:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.0:Ljava/util/concurrent/ConcurrentHashMap$Node;.next:Ljava/util/concurrent/ConcurrentHashMap$Node; 155 -Ljava/time/ZoneOffset;.SECONDS_CACHE:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node; 155 -Landroid/widget/TextView; 156 -Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;.sPool:Landroid/util/Pools$SimplePool;.mPool:[Ljava/lang/Object; 157 -Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;.sPool:Landroid/util/Pools$SimplePool; 157 -Landroid/view/ViewGroup; 158 -Landroid/graphics/Rect; 159 -Landroid/view/View$BaseSavedState; 160 -Landroid/widget/Button; 161 -Landroid/widget/ImageButton; 162 -Landroid/view/View$OnHoverListener; 163 -Landroid/widget/Toolbar; 164 -Landroid/hardware/display/ColorDisplayManager$ColorDisplayManagerInternal; 165 -Landroid/app/WallpaperManager; 166 -Landroid/graphics/ColorSpace$Model;.RGB:Landroid/graphics/ColorSpace$Model; 166 -Landroid/graphics/drawable/AdaptiveIconDrawable; 167 -Landroid/animation/ValueAnimator$DurationScaleChangeListener; 168 -Landroid/widget/Toast; 168 -Landroid/app/smartspace/SmartspaceSession$OnTargetsAvailableListener; 168 -Landroid/view/CrossWindowBlurListeners; 168 -Landroid/app/servertransaction/ActivityRelaunchItem; 169 -[Ljava/util/concurrent/ForkJoinTask; 169 -Landroid/view/WindowManager$LayoutParams; 169 -Ljava/util/concurrent/ForkJoinPool$WorkQueue; 169 -Landroid/app/prediction/AppTargetEvent; 169 -Lorg/xmlpull/v1/XmlPullParserException; 169 -Landroid/app/servertransaction/ObjectPool;.sPoolMap:Ljava/util/Map; 170 -Landroid/app/servertransaction/ClientTransaction; 170 -Landroid/app/servertransaction/StopActivityItem; 170 -Landroid/system/ErrnoException; 171 -Landroid/hardware/location/ContextHubTransaction$OnCompleteListener; 172 -Landroid/app/PendingIntent$OnFinished; 172 -Ljava/lang/NullPointerException; 173 -Landroid/os/strictmode/DiskReadViolation; 174 -Lorg/apache/http/params/HttpParams; 175 -Landroid/nfc/cardemulation/CardEmulation; 176 -Ljava/io/FileDescriptor; 177 -Landroid/content/pm/PackageManager$OnPermissionsChangedListener; 178 -Landroid/security/keystore2/KeyStoreCryptoOperationUtils; 179 -Landroid/app/ActivityTaskManager; 180 -Landroid/util/EventLog; 181 -Ljava/net/URLConnection; 181 -Ljava/net/SocketException; 181 -Ljava/lang/reflect/InvocationTargetException; 181 -Ljava/lang/Enum; 182 -Landroid/widget/AbsListView$SelectionBoundsAdjuster; 183 -Ljava/lang/ClassNotFoundException; 183 -Landroid/content/SyncStatusObserver; 184 -Landroid/content/AsyncTaskLoader$LoadTask; 185 -Landroid/app/LoaderManager$LoaderCallbacks; 185 -Landroid/webkit/CookieSyncManager; 186 -Landroid/webkit/WebViewProvider$ViewDelegate; 187 -Landroid/webkit/WebView; 187 -Landroid/webkit/WebViewProvider$ScrollDelegate; 187 -Landroid/webkit/WebViewProvider; 187 -Landroid/webkit/WebViewFactory;.sTimestamps:Landroid/webkit/WebViewFactory$StartupTimestamps; 188 -Landroid/webkit/WebViewFactoryProvider; 189 -Landroid/webkit/WebViewFactory; 190 -Landroid/os/PowerManager$OnThermalStatusChangedListener; 191 -Landroid/os/Bundle; 192 -Landroid/widget/ProgressBar; 193 -Landroid/graphics/Bitmap$Config;.ALPHA_8:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/Bitmap$Config;.RGB_565:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/Bitmap$Config;.RGBA_1010102:Landroid/graphics/Bitmap$Config; 194 -Landroid/renderscript/Allocation;.mBitmapOptions:Landroid/graphics/BitmapFactory$Options;.inPreferredConfig:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/Bitmap$Config;.RGBA_F16:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/Bitmap$Config;.ARGB_4444:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/Bitmap$Config;.HARDWARE:Landroid/graphics/Bitmap$Config; 194 -Landroid/graphics/drawable/StateListDrawable; 195 -Landroid/view/PointerIcon;.gSystemIconsByDisplay:Landroid/util/SparseArray; 196 -Landroid/view/PointerIcon; 196 -Ljavax/net/ssl/SSLServerSocketFactory; 197 -Ljavax/net/ssl/SSLSocketFactory; 198 -Ljavax/net/ssl/HttpsURLConnection$NoPreloadHolder; 198 -Ljavax/net/ssl/SSLSessionContext; 199 -Lcom/android/org/bouncycastle/crypto/CryptoServicesRegistrar; 200 -Lsun/security/x509/PKIXExtensions;.KeyUsage_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/x509/PKIXExtensions;.PolicyConstraints_Id:Lsun/security/util/ObjectIdentifier; 201 -Ljava/security/cert/PKIXRevocationChecker$Option;.ONLY_END_ENTITY:Ljava/security/cert/PKIXRevocationChecker$Option; 201 -Lsun/security/x509/PKIXExtensions;.ExtendedKeyUsage_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/provider/X509Factory;.certCache:Lsun/security/util/Cache; 201 -Lsun/security/x509/PKIXExtensions;.CertificatePolicies_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/x509/PKIXExtensions;.NameConstraints_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/x509/PKIXExtensions;.AuthorityKey_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/provider/X509Factory;.certCache:Lsun/security/util/Cache;.cacheMap:Ljava/util/Map; 201 -Ljava/security/cert/PKIXRevocationChecker$Option;.NO_FALLBACK:Ljava/security/cert/PKIXRevocationChecker$Option; 201 -Lsun/security/x509/PKIXExtensions;.SubjectAlternativeName_Id:Lsun/security/util/ObjectIdentifier; 201 -Lsun/security/x509/PKIXExtensions;.PolicyMappings_Id:Lsun/security/util/ObjectIdentifier; 202 -Lsun/security/x509/PKIXExtensions;.InhibitAnyPolicy_Id:Lsun/security/util/ObjectIdentifier; 202 -Lsun/security/x509/PKIXExtensions;.BasicConstraints_Id:Lsun/security/util/ObjectIdentifier; 202 -Ljava/security/Security;.spiMap:Ljava/util/Map; 203 -Lsun/security/x509/X500Name;.commonName_oid:Lsun/security/util/ObjectIdentifier; 204 -Lsun/security/x509/X500Name;.countryName_oid:Lsun/security/util/ObjectIdentifier; 204 -Lsun/security/x509/X500Name;.orgName_oid:Lsun/security/util/ObjectIdentifier; 204 -Ljava/nio/charset/Charset;.cache2:Ljava/util/HashMap; 205 -Ljava/net/URL;.handlers:Ljava/util/Hashtable;.table:[Ljava/util/Hashtable$HashtableEntry; 206 -Ljava/net/URL;.handlers:Ljava/util/Hashtable; 206 -Ljava/net/Inet6AddressImpl;.addressCache:Ljava/net/AddressCache;.cache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap; 207 -Ljava/net/Proxy$Type;.DIRECT:Ljava/net/Proxy$Type; 208 -Ljava/net/ProxySelector;.theProxySelector:Ljava/net/ProxySelector; 208 -Lcom/android/okhttp/okio/SegmentPool; 209 -Lcom/android/okhttp/internal/http/AuthenticatorAdapter;.INSTANCE:Lcom/android/okhttp/Authenticator; 209 -Lcom/android/okhttp/HttpsHandler;.HTTP_1_1_ONLY:Ljava/util/List;.element:Ljava/lang/Object; 209 -Lcom/android/okhttp/ConfigAwareConnectionPool;.instance:Lcom/android/okhttp/ConfigAwareConnectionPool;.networkEventDispatcher:Llibcore/net/event/NetworkEventDispatcher;.listeners:Ljava/util/List; 210 -Lcom/android/okhttp/Dns;.SYSTEM:Lcom/android/okhttp/Dns; 210 -Lcom/android/okhttp/ConfigAwareConnectionPool;.instance:Lcom/android/okhttp/ConfigAwareConnectionPool; 210 -Lcom/android/okhttp/okio/AsyncTimeout; 211 -Ljava/lang/IllegalAccessException; 212 -Ljavax/net/ssl/SSLContext; 213 -Ljavax/net/ssl/HttpsURLConnection; 213 -Ljava/security/Security;.props:Ljava/util/Properties;.map:Ljava/util/concurrent/ConcurrentHashMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.12:Ljava/util/concurrent/ConcurrentHashMap$Node;.next:Ljava/util/concurrent/ConcurrentHashMap$Node; 214 -Ljava/security/Security;.props:Ljava/util/Properties;.map:Ljava/util/concurrent/ConcurrentHashMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.30:Ljava/util/concurrent/ConcurrentHashMap$Node; 214 -Landroid/database/sqlite/SQLiteTransactionListener; 215 -Landroid/accounts/OnAccountsUpdateListener; 216 -Landroid/accounts/AccountManager$20; 217 -Lsun/nio/ch/FileChannelImpl$Unmapper; 218 -Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map;.queue:Ljava/lang/ref/ReferenceQueue; 219 -Landroid/text/method/SingleLineTransformationMethod; 220 -Landroid/widget/RelativeLayout; 221 -Landroid/graphics/drawable/BitmapDrawable; 222 -Landroid/graphics/drawable/GradientDrawable; 223 -Landroid/animation/PropertyValuesHolder;.sGetterPropertyMap:Ljava/util/HashMap; 224 -Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;.sJNISetterPropertyMap:Ljava/util/HashMap; 225 -Landroid/graphics/drawable/Drawable;.DEFAULT_TINT_MODE:Landroid/graphics/PorterDuff$Mode; 226 -Landroid/text/StaticLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool; 227 -Landroid/text/StaticLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 227 -Ljava/util/concurrent/ThreadLocalRandom; 228 -Landroid/widget/Space; 229 -Landroid/widget/ScrollView; 230 -Landroid/text/style/LineHeightSpan; 231 -Landroid/text/style/TabStopSpan; 232 -Landroid/text/style/ReplacementSpan; 233 -Landroid/text/style/MetricAffectingSpan; 233 -Landroid/text/style/LeadingMarginSpan; 233 +Landroid/view/WindowManagerImpl; 80 +Landroid/view/accessibility/AccessibilityManager; 81 +Landroid/app/ActivityTaskManager;.IActivityTaskManagerSingleton:Landroid/util/Singleton; 82 +Landroid/os/Handler; 83 +Landroid/transition/ChangeImageTransform; 109 +Landroid/transition/ChangeClipBounds; 109 +Landroid/transition/ChangeTransform; 109 +Landroid/graphics/drawable/ColorDrawable; 110 +Landroid/text/TextUtils; 111 +Landroid/graphics/TemporaryBuffer; 112 +Landroid/text/TextLine;.sCached:[Landroid/text/TextLine; 113 +Landroid/text/Layout;.sTempRect:Landroid/graphics/Rect; 114 +Landroid/widget/ImageView; 115 +Landroid/content/res/ColorStateList;.sCache:Landroid/util/SparseArray; 116 +Landroid/graphics/Bitmap;.sAllBitmaps:Ljava/util/WeakHashMap; 117 +Landroid/icu/impl/locale/BaseLocale;.CACHE:Landroid/icu/impl/locale/BaseLocale$Cache;._map:Ljava/util/concurrent/ConcurrentHashMap; 118 +Landroid/database/sqlite/SQLiteGlobal; 125 +Landroid/database/sqlite/SQLiteDebug$NoPreloadHolder; 125 +Landroid/database/sqlite/SQLiteCompatibilityWalFlags; 125 +Landroid/database/CursorWindow; 126 +Landroid/content/SharedPreferences; 127 +Landroid/app/AppOpsManager; 132 +Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap;.mHashes:[I 133 +Landroid/media/MediaFrameworkPlatformInitializer; 133 +Lcom/android/internal/os/RuntimeInit; 133 +Landroid/os/Message; 133 +Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map; 133 +Landroid/os/ServiceManager; 133 +Landroid/se/omapi/SeFrameworkInitializer; 133 +Landroid/ddm/DdmHandleAppName; 133 +Landroid/security/net/config/ApplicationConfig; 133 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.7:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object; 133 +Landroid/os/Environment; 133 +Landroid/os/Looper; 133 +Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map;.table:[Ljava/util/WeakHashMap$Entry; 133 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.7:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mCache:Ljava/util/LinkedHashMap; 133 +Landroid/os/StrictMode; 133 +Landroid/provider/DeviceConfigInitializer; 133 +Landroid/graphics/Typeface; 133 +Landroid/app/ActivityThread; 133 +Landroid/view/View; 133 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap; 133 +Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object; 133 +Landroid/telephony/TelephonyFrameworkInitializer; 133 +Landroid/util/ArraySet; 133 +Landroid/os/Binder; 133 +Landroid/os/LocaleList; 133 +Landroid/hardware/display/DisplayManagerGlobal; 133 +Landroid/app/LoadedApk;.sApplications:Landroid/util/ArrayMap; 133 +Landroid/security/net/config/SystemCertificateSource$NoPreloadHolder; 133 +Landroid/os/DdmSyncState; 133 +Landroid/os/GraphicsEnvironment;.sInstance:Landroid/os/GraphicsEnvironment; 134 +Landroid/os/Parcel;.mCreators:Ljava/util/HashMap; 134 +Landroid/os/Parcel; 134 +Landroid/app/ApplicationLoaders;.gApplicationLoaders:Landroid/app/ApplicationLoaders;.mLoaders:Landroid/util/ArrayMap; 134 +Landroid/os/Process; 134 +Landroid/os/Parcel;.sPairedCreators:Ljava/util/HashMap; 134 +Landroid/graphics/Compatibility; 135 +Landroid/app/DexLoadReporter;.INSTANCE:Landroid/app/DexLoadReporter;.mDataDirs:Ljava/util/Set;.map:Ljava/util/HashMap; 135 +Landroid/renderscript/RenderScriptCacheDir; 135 +Landroid/graphics/Canvas; 135 +Landroid/provider/FontsContract; 135 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.4:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mCache:Ljava/util/LinkedHashMap; 136 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.4:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object; 136 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.9:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object; 139 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.9:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mCache:Ljava/util/LinkedHashMap; 140 +Lcom/android/internal/os/BinderInternal; 141 +Landroid/app/servertransaction/ClientTransactionListenerController; 142 +Landroid/app/QueuedWork; 143 +Landroid/view/WindowManagerGlobal; 144 +Landroid/view/WindowManager; 145 +Landroid/view/inputmethod/InputMethodManager; 146 +Landroid/telephony/TelephonyManager; 147 +Landroid/content/Context; 151 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.4:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mSkips:[J 152 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.9:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mSkips:[J 153 +Landroid/app/NotificationManager; 154 +Landroid/content/pm/VersionedPackage; 155 +Landroid/content/ContentResolver; 156 +Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener; 160 +Landroid/app/UiModeManager; 162 +Landroid/webkit/WebViewFactory; 163 +Landroid/webkit/WebViewFactory;.sTimestamps:Landroid/webkit/WebViewFactory$StartupTimestamps; 164 +Landroid/webkit/WebViewFactoryProvider; 165 +Landroid/webkit/WebViewProvider$ViewDelegate; 166 +Landroid/webkit/WebViewProvider; 166 +Landroid/webkit/WebViewProvider$ScrollDelegate; 166 +Landroid/webkit/CookieSyncManager; 167 +Landroid/media/MediaCodecList; 168 +Landroid/media/MediaCodecInfo$CodecCapabilities$FeatureList; 168 +Landroid/media/MediaCodec; 169 +Landroid/view/KeyEvent; 170 +Landroid/webkit/HttpAuthHandler; 171 +Landroid/webkit/WebResourceResponse; 171 +Landroid/webkit/WebViewClient; 171 +Landroid/webkit/WebResourceError; 171 +Landroid/webkit/WebView; 171 +Landroid/view/InputEvent; 171 +Landroid/webkit/RenderProcessGoneDetail; 171 +Landroid/webkit/WebResourceRequest; 172 +Landroid/view/PointerIcon;.SYSTEM_ICONS:Landroid/util/SparseArray; 173 +Landroid/content/ClipboardManager$OnPrimaryClipChangedListener; 174 +Landroid/hardware/input/InputManager$InputDeviceListener; 175 +Landroid/hardware/input/InputManagerGlobal; 176 +Landroid/window/WindowTokenClientController; 177 +Landroid/os/PowerManager$OnThermalStatusChangedListener; 178 +Landroid/webkit/WebViewFactoryProvider$Statics; 179 +Landroid/webkit/DownloadListener; 180 +Landroid/webkit/ConsoleMessage; 181 +Landroid/webkit/GeolocationPermissions$Callback; 181 +Landroid/webkit/PermissionRequest; 181 +Landroid/webkit/WebChromeClient$CustomViewCallback; 181 +Landroid/webkit/WebChromeClient; 181 +Landroid/webkit/ValueCallback; 182 +Landroid/view/View$OnDragListener; 183 +Landroid/view/autofill/Helper; 184 +Landroid/icu/impl/ICUResourceBundleReader;.CACHE:Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 185 +Landroid/icu/impl/ZoneMeta;.CANONICAL_ID_CACHE:Landroid/icu/impl/ICUCache; 186 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.10:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object; 187 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.10:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mCache:Ljava/util/LinkedHashMap; 188 +Landroid/graphics/fonts/Font$NoImagePreloadHolder; 189 +Landroid/icu/text/DecimalFormatSymbols;.cachedLocaleData:Landroid/icu/impl/CacheBase;.map:Ljava/util/concurrent/ConcurrentHashMap; 198 +Landroid/icu/impl/CurrencyData;.provider:Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider; 199 +Landroid/icu/text/DateFormatSymbols;.DFSCACHE:Landroid/icu/impl/CacheBase;.map:Ljava/util/concurrent/ConcurrentHashMap; 204 +Landroid/icu/util/ULocale; 205 +Landroid/graphics/Paint;.sMinikinLocaleListIdCache:Ljava/util/HashMap; 206 +Landroid/os/Parcelable$Creator; 207 +Landroid/graphics/drawable/Drawable; 215 +Landroid/graphics/Bitmap$Config;.RGB_565:Landroid/graphics/Bitmap$Config; 218 +Landroid/graphics/Bitmap$Config;.RGBA_F16:Landroid/graphics/Bitmap$Config; 218 +Landroid/renderscript/Allocation;.mBitmapOptions:Landroid/graphics/BitmapFactory$Options;.inPreferredConfig:Landroid/graphics/Bitmap$Config; 218 +Landroid/graphics/Bitmap$Config;.HARDWARE:Landroid/graphics/Bitmap$Config; 218 +Landroid/graphics/Bitmap$Config;.RGBA_1010102:Landroid/graphics/Bitmap$Config; 218 +Landroid/graphics/Bitmap$Config;.ALPHA_8:Landroid/graphics/Bitmap$Config; 218 +Landroid/graphics/Bitmap$Config;.ARGB_4444:Landroid/graphics/Bitmap$Config; 218 +Landroid/os/ParcelFileDescriptor; 219 +Landroid/content/ComponentName; 224 +Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle; 225 +Landroid/database/sqlite/SQLiteDatabase$CursorFactory; 226 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.7:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mSkips:[J 227 +Landroid/util/ArrayMap; 229 +Landroid/media/AudioManager; 230 +Landroid/content/res/Resources;.sResourcesHistory:Ljava/util/Set;.c:Ljava/util/Collection;.m:Ljava/util/Map;.queue:Ljava/lang/ref/ReferenceQueue; 231 +Lcom/android/internal/util/ArrayUtils;.sCache:[Ljava/lang/Object; 232 +Landroid/text/SpanWatcher; 233 Landroid/text/style/LineBackgroundSpan; 234 -Landroid/text/style/CharacterStyle; 235 -Landroid/text/style/SuggestionSpan; 236 -Landroid/widget/TextView$ChangeWatcher; 237 -Landroid/text/DynamicLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 238 -Landroid/text/DynamicLayout; 238 -Landroid/text/DynamicLayout$ChangeWatcher; 238 -Landroid/text/style/WrapTogetherSpan; 238 -Landroid/text/DynamicLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool; 238 -Landroid/text/method/LinkMovementMethod; 239 +Landroid/text/style/LeadingMarginSpan; 235 +Landroid/text/style/TabStopSpan; 236 +Landroid/text/style/LineBreakConfigSpan; 237 +Landroid/text/style/MetricAffectingSpan; 238 +Landroid/text/style/LineHeightSpan; 239 Landroid/text/style/ClickableSpan; 240 -Ljava/util/logging/LogRecord;.globalSequenceNumber:Ljava/util/concurrent/atomic/AtomicLong; 241 -Ljava/lang/Runtime;.currentRuntime:Ljava/lang/Runtime; 242 -Landroid/content/pm/LauncherActivityInfo; 243 -Landroid/database/sqlite/SQLiteMisuseException; 243 -Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask; 243 -Landroid/database/sqlite/SQLiteCantOpenDatabaseException; 243 -Landroid/database/sqlite/SQLiteDatabaseCorruptException; 243 -Landroid/database/sqlite/SQLiteDatabaseLockedException; 243 -Ljava/util/Map$Entry; 243 -Ljava/util/zip/ZipException; 243 -Landroid/database/sqlite/SQLiteAccessPermException; 243 -Landroid/speech/tts/TextToSpeech$OnInitListener; 243 -Landroid/app/Notification$MessagingStyle; 244 -Landroid/text/TextUtils$TruncateAt; 245 -Landroid/app/smartspace/SmartspaceTarget; 246 -Landroid/app/prediction/AppTarget; 246 -Landroid/app/smartspace/uitemplatedata/BaseTemplateData; 246 -Landroid/location/LocationManager;.sLocationListeners:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry; 247 -Landroid/location/LocationManager;.sLocationListeners:Ljava/util/WeakHashMap; 247 -Landroid/service/notification/ConditionProviderService; 248 -Landroid/os/WorkSource; 249 -Landroid/security/keystore2/AndroidKeyStoreProvider; 249 -Ljava/net/Socket; 249 -Lcom/android/internal/listeners/ListenerTransport; 249 -Landroid/os/ParcelUuid; 250 -Landroid/telephony/emergency/EmergencyNumber; 251 -Lcom/android/internal/telephony/uicc/UiccProfile$4; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$IncomingSms; 251 -Lcom/android/internal/telephony/SmsStorageMonitor$1; 251 -Lcom/android/internal/telephony/TelephonyDevController; 251 -Lcom/android/internal/telephony/uicc/UiccController; 251 -Lcom/android/internal/telephony/emergency/EmergencyNumberTracker$1; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession; 251 -Lcom/android/internal/telephony/TelephonyDevController;.mSims:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsAcsProvisioningStats; 251 -Ljava/lang/UnsupportedOperationException; 251 -Landroid/database/CursorToBulkCursorAdaptor; 251 -Lcom/android/internal/telephony/satellite/PointingAppController; 251 -Landroid/telephony/ModemActivityInfo; 251 -Lcom/android/internal/telephony/imsphone/ImsPhone; 251 -Lcom/android/internal/telephony/ServiceStateTracker; 251 -Lcom/android/internal/telephony/IccSmsInterfaceManager; 251 -Lcom/android/internal/telephony/util/NotificationChannelController$1; 251 -Lcom/android/internal/telephony/RilWakelockInfo; 251 -Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler$GsmCbTestBroadcastReceiver; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportFeatureTagStats; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$UceEventStats; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$BindingState; 251 -Lcom/android/internal/telephony/ims/ImsResolver$3; 251 -Landroid/net/NetworkPolicyManager$SubscriptionCallbackProxy; 251 -Lcom/android/internal/telephony/TelephonyDevController;.mModems:Ljava/util/ArrayList; 251 -Landroid/telephony/ims/aidl/IImsServiceController$Stub$Proxy; 251 -Lcom/android/internal/telephony/CarrierPrivilegesTracker$1; 251 -Lcom/android/internal/telephony/CommandException; 251 -Lcom/android/ims/FeatureConnector$1; 251 -Lcom/android/internal/telephony/IWapPushManager; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SipDelegateStats; 251 -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mTtyModeReceivedRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mMmiCompleteRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/i18n/timezone/TelephonyLookup; 251 -Landroid/telephony/BarringInfo$BarringServiceInfo; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequests; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$14; 251 -Lcom/android/internal/telephony/SmsBroadcastUndelivered; 251 -Lcom/android/internal/telephony/LocaleTracker; 251 -Lcom/android/internal/telephony/PhoneSubInfoController; 251 -Lcom/android/internal/telephony/CarrierKeyDownloadManager$1; 251 -Lcom/android/internal/telephony/GsmCdmaCallTracker$1; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.339:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/ServiceStateTracker$1; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.353:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/euicc/EuiccCardController$SimSlotStatusChangedBroadcastReceiver; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$PresenceNotifyEvent; 251 -Lcom/android/internal/telephony/SimActivationTracker$1; 251 -Landroid/telephony/ModemInfo; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1393:[Ljava/lang/String; 251 -Landroid/telephony/CellSignalStrengthWcdma; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteProvision; 251 -Lcom/android/internal/telephony/PhoneConfigurationManager; 251 -Lcom/android/internal/telephony/SmsApplication$SmsPackageMonitor; 251 -Landroid/telephony/TelephonyRegistryManager$3; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallSession; 251 -Landroid/os/Handler$MessengerImpl; 251 -Lcom/android/internal/telephony/LocaleTracker$1; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mInCallVoicePrivacyOffRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSosMessageRecommender; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationServiceDescStats; 251 -Lcom/android/internal/telephony/uicc/UiccPkcs15$Pkcs15Selector; 251 -Lcom/android/internal/telephony/CarrierResolver$2; 251 -Lcom/android/internal/telephony/CarrierActionAgent$1; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mPhones:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/SmsController; 251 -Lcom/android/internal/telephony/uicc/euicc/EuiccCardException; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationTermination; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1125:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/NetworkTypeController$1; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.803:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/uicc/asn1/TagNotFoundException; 251 -Lcom/android/internal/telephony/CarrierServiceBindHelper$1; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState; 251 -Lcom/android/internal/telephony/cdma/CdmaSubscriptionSourceManager; 251 -Lcom/android/internal/telephony/InboundSmsHandler$NewMessageNotificationActionReceiver; 251 -Lcom/android/internal/telephony/CarrierActionAgent; 251 -Lcom/android/i18n/timezone/TimeZoneFinder; 251 -Lcom/android/internal/telephony/RILRequest; 251 -Lcom/android/internal/telephony/RIL;.sRilTimeHistograms:Landroid/util/SparseArray; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.33:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/MccTable; 251 -Lcom/android/internal/telephony/uicc/UiccProfile$2; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierIdMismatch; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1235:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules; 251 -Landroid/telephony/CellSignalStrengthTdscdma; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerListenerEvent; 251 -Lcom/android/internal/telephony/SmsDispatchersController; 251 -Landroid/timezone/TelephonyLookup; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteOutgoingDatagram; 251 -Lcom/android/internal/telephony/SMSDispatcher$1; 251 -Lcom/android/internal/telephony/AppSmsManager; 251 -Landroid/timezone/TimeZoneFinder; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mBackgroundCalls:Ljava/util/ArrayList; 251 -Lcom/android/ims/rcs/uce/eab/EabProvider; 251 -Lcom/android/internal/telephony/uicc/PinStorage$1; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerEvent; 251 -Landroid/telephony/CellSignalStrengthLte; 251 -Landroid/telephony/ims/ProvisioningManager$Callback$CallbackBinder; 251 -Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray;.mKeys:[I 251 -Landroid/telephony/CellSignalStrengthNr; 251 -Lcom/android/internal/telephony/SomeArgs; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mInCallVoicePrivacyOnRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/StateMachine$SmHandler; 251 -Lcom/android/internal/telephony/PackageChangeReceiver; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingShortCodeSms; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequestsV2; 251 -Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$AvailableState; 251 -Lcom/android/ims/internal/IImsServiceFeatureCallback$Stub$Proxy; 251 -Landroid/telephony/data/ApnSetting;.APN_TYPE_INT_MAP:Ljava/util/Map; 251 -Lcom/android/internal/telephony/RadioInterfaceCapabilityController; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationStats; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallRatUsage; 251 -Lcom/android/internal/telephony/metrics/TelephonyMetrics; 251 -Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall; 251 -Lcom/android/internal/telephony/NetworkRegistrationManager$NetworkRegStateCallback; 251 -Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState; 251 -Lcom/android/internal/telephony/RadioConfig; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$DisconnectedState; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSession; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mDisplayInfoRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo; 251 -Lcom/android/internal/telephony/GsmCdmaPhone; 251 -Lcom/android/internal/telephony/TelephonyTester$1; 251 -Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaScpTestBroadcastReceiver; 251 -Lcom/android/internal/telephony/NetworkTypeController$DefaultState; 251 -Landroid/net/TelephonyNetworkSpecifier; 251 -Lcom/android/internal/telephony/NitzStateMachine; 251 -Landroid/app/timezonedetector/TimeZoneDetector; 251 -Lcom/android/internal/telephony/IntentBroadcaster$1; 251 -Lcom/android/internal/telephony/uicc/UiccStateChangedLauncher; 251 -Lcom/android/internal/telephony/ims/ImsResolver$1; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingSms; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$UnmeteredNetworks; 251 -Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader;.packages:Ljava/util/Map;.m:Ljava/util/Map; 251 -Lcom/android/internal/telephony/euicc/EuiccController; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mForegroundCalls:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/satellite/SatelliteModemInterface; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.531:[Ljava/lang/String; 251 -Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$1; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.467:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SipMessageResponse; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportSession; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$UnavailableState; 251 -Lcom/android/internal/telephony/DeviceStateMonitor$3; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mSignalInfoRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray;.mValues:[Ljava/lang/Object; 251 -Lcom/android/internal/telephony/IccPhoneBookInterfaceManager; 251 -Lcom/android/internal/telephony/DisplayInfoController; 251 -Lcom/android/internal/telephony/ims/ImsResolver$2; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1377:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$NetworkRegistrationInfo; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteController; 251 -Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder; 251 -Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$EmergencyNumbersInfo; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$GbaEvent; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.23:[Ljava/lang/String; 251 -Landroid/telephony/CellSignalStrengthCdma; 251 -Landroid/telephony/TelephonyLocalConnection; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteIncomingDatagram; 251 -Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$2; 251 -Lcom/android/internal/telephony/ims/ImsResolver; 251 -Lcom/android/internal/telephony/SmsStorageMonitor; 251 -Lcom/android/internal/telephony/uicc/UiccProfile; 251 -Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback$CapabilityBinder; 251 -Lcom/android/internal/telephony/euicc/EuiccCardController; 251 -Lcom/android/internal/telephony/SmsBroadcastUndelivered$1; 251 -Lcom/android/internal/telephony/GsmCdmaCallTracker; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsClientProvisioningStats; 251 -Lcom/android/internal/telephony/cat/CatService; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.761:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/SmsApplication; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mDisconnectRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/PhoneFactory; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mHandlerMap:Ljava/util/HashMap; 251 -Landroid/os/AsyncResult; 251 -Lcom/android/internal/telephony/ProxyController; 251 -Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaCbTestBroadcastReceiver; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.453:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/MultiSimSettingController; 251 -Ljava/io/BufferedReader; 251 -Landroid/telephony/CellSignalStrengthGsm; 251 -Lcom/android/internal/telephony/SimActivationTracker; 251 -Lcom/android/internal/telephony/CellBroadcastServiceManager; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mRingingCalls:Ljava/util/ArrayList; 251 -Lcom/android/internal/telephony/IntentBroadcaster; 251 -Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationFeatureTagStats; 251 -Lcom/android/internal/telephony/euicc/EuiccConnector$EuiccPackageMonitor; 251 -Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mSuppServiceFailedRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 251 -Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader;.packages:Ljava/util/Map;.m:Ljava/util/Map;.table:[Ljava/util/HashMap$Node; 251 -Lcom/android/internal/telephony/CarrierServiceBindHelper$CarrierServicePackageMonitor; 251 -Lcom/android/internal/telephony/TelephonyComponentFactory; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.637:[Ljava/lang/String; 251 -Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo; 251 -Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.651:[Ljava/lang/String; 251 -Lcom/android/internal/telephony/SmsUsageMonitor; 251 -Lcom/android/internal/telephony/CommandException$Error;.INVALID_SIM_STATE:Lcom/android/internal/telephony/CommandException$Error; 251 -Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback; 252 -Landroid/app/ActivityThread$ApplicationThread; 252 -Landroid/app/ActivityManager$MyUidObserver; 253 -Landroid/media/browse/MediaBrowser$ServiceCallbacks; 253 -Landroid/media/session/MediaController$CallbackStub; 253 -Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListener; 253 -Landroid/app/PendingIntent$CancelListener; 253 -Landroid/media/AudioManager$2; 253 -Landroid/database/ContentObserver$Transport; 253 -Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1; 253 -Landroid/content/ContentProvider$PipeDataWriter; 254 -Landroid/security/net/config/UserCertificateSource$NoPreloadHolder; 255 -Landroid/view/Window$Callback; 256 -Landroid/transition/TransitionManager;.sDefaultTransition:Landroid/transition/Transition;.mTransitions:Ljava/util/ArrayList;.elementData:[Ljava/lang/Object;.1:Landroid/transition/ChangeBounds;.mCurrentAnimators:Ljava/util/ArrayList; 256 -Landroid/transition/TransitionManager;.sDefaultTransition:Landroid/transition/Transition;.mTransitions:Ljava/util/ArrayList;.elementData:[Ljava/lang/Object;.2:Landroid/transition/Fade;.mCurrentAnimators:Ljava/util/ArrayList; 256 -Landroid/transition/TransitionManager;.sPendingTransitions:Ljava/util/ArrayList; 256 -Landroid/transition/TransitionManager;.sDefaultTransition:Landroid/transition/Transition;.mTransitions:Ljava/util/ArrayList;.elementData:[Ljava/lang/Object;.0:Landroid/transition/Fade;.mCurrentAnimators:Ljava/util/ArrayList; 256 -Landroid/view/AttachedSurfaceControl$OnBufferTransformHintChangedListener; 257 -Landroid/webkit/ValueCallback; 258 -Landroid/webkit/WebResourceRequest; 258 -Landroid/webkit/WebChromeClient$CustomViewCallback; 258 -Landroid/hardware/camera2/CameraCharacteristics;.INFO_SUPPORTED_HARDWARE_LEVEL:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 258 -Landroid/accounts/Account; 258 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 258 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/params/StreamConfigurationDuration; 259 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_COLOR_FILTER_ARRANGEMENT:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AVAILABLE_HIGH_SPEED_VIDEO_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_STALL_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/params/HighSpeedVideoConfiguration; 259 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_INPUT_OUTPUT_FORMATS_MAP:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/CameraCharacteristics;.DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -I 259 -Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_CAPABILITIES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 259 -Landroid/hardware/camera2/params/StreamConfiguration; 259 -Z 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PIXEL_ARRAY_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.LENS_FOCAL_LENGTH:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_APERTURES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.DISTORTION_CORRECTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.EXTENSION_STRENGTH:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -J 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PHYSICAL_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.TONEMAP_PRESET_CURVE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -B 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_TRIGGER:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_EXPOSURE_COMPENSATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -[D 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_SESSION_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_EXPOSURE_TIME:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_CALIBRATION_TRANSFORM2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_TRANSFORM:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/content/res/Resources$Theme; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -F 260 -Landroid/hardware/camera2/CaptureRequest;.LENS_FILTER_DENSITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.LENS_OPTICAL_STABILIZATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.NOISE_REDUCTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_FRAME_DURATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_EXTENDED_SCENE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.STATISTICS_OIS_DATA_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_TEST_PATTERN_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.HOT_PIXEL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_ANTIBANDING_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.STATISTICS_LENS_SHADING_MAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SCALER_CROP_REGION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.LENS_FOCUS_DISTANCE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.TONEMAP_GAMMA:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_REFERENCE_ILLUMINANT2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_REFERENCE_ILLUMINANT1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -[F 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_ZOOM_RATIO:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_ABERRATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.TONEMAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_REQUEST_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SCALER_ROTATE_AND_CROP:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_GAINS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_COLOR_TRANSFORM1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_SENSITIVITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_FOCAL_LENGTHS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_OPTICAL_BLACK_REGIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.JPEG_QUALITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.FLASH_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_POST_RAW_SENSITIVITY_BOOST:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_WHITE_LEVEL:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_SETTINGS_OVERRIDE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -[Landroid/hardware/camera2/params/MeteringRectangle; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.LOGICAL_MULTI_CAMERA_PHYSICAL_IDS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_EXPOSURE_TIME_RANGE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Ljava/lang/Float; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_ENABLE_ZSL:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.INFO_DEVICE_STATE_ORIENTATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_CALIBRATION_TRANSFORM1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.EDGE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_CAPTURE_INTENT:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_ORIENTATION:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.JPEG_ORIENTATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_COLOR_TRANSFORM2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -[J 260 -Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Ljava/util/concurrent/Phaser; 260 -Landroid/hardware/camera2/CaptureRequest;.BLACK_LEVEL_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_SCENE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.JPEG_THUMBNAIL_SIZE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SHADING_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.STATISTICS_FACE_DETECT_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.STATISTICS_HOT_PIXEL_MAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AUTOFRAMING:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_TARGET_FPS_RANGE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_TEST_PATTERN_DATA:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_PRECAPTURE_TRIGGER:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.FLASH_STRENGTH_LEVEL:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_VIDEO_STABILIZATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Ljava/lang/Boolean; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_EFFECT_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.LENS_APERTURE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.JPEG_THUMBNAIL_QUALITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -Ljava/lang/Long; 260 -Landroid/hardware/camera2/CaptureRequest;.SENSOR_PIXEL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 260 -[Ljava/lang/String; 261 -[Z 262 -Ljava/lang/Class$Caches;.genericInterfaces:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap; 263 -Ljava/util/Map; 264 -Ljava/nio/Bits; 265 -Ljava/nio/DirectByteBuffer; 266 -Ljava/io/File; 267 -Ljava/nio/ByteBuffer; 268 -Ljava/io/InputStream; 269 -Landroid/os/ParcelFileDescriptor; 270 -Landroid/os/BinderProxy;.sProxyMap:Landroid/os/BinderProxy$ProxyMap; 271 -Landroid/app/PendingIntent; 272 -Landroid/content/Intent; 273 -Landroid/net/Uri$HierarchicalUri; 274 -Landroid/net/Uri$StringUri; 275 -Landroid/net/Uri$PathPart;.EMPTY:Landroid/net/Uri$PathPart; 276 -Lcom/android/internal/telephony/MccTable;.FALLBACKS:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.6:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 277 -Landroid/icu/text/DecimalFormatSymbols;.cachedLocaleData:Landroid/icu/impl/CacheBase;.map:Ljava/util/concurrent/ConcurrentHashMap; 278 -Llibcore/icu/DecimalFormatData;.CACHE:Ljava/util/concurrent/ConcurrentHashMap; 279 -Landroid/icu/impl/CurrencyData;.provider:Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider; 280 -Lcom/android/internal/infra/AndroidFuture; 281 -Lcom/android/internal/util/LatencyTracker$Action; 282 -Landroid/app/AppOpsManager$Mode; 283 -Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener; 284 -Landroid/annotation/IdRes; 285 -Landroid/content/pm/PackageItemInfo; 286 -Ljava/util/Random; 287 -Landroid/widget/RadioButton; 288 -Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState; 289 -Landroid/graphics/Insets; 290 -Landroid/view/View;.sNextGeneratedId:Ljava/util/concurrent/atomic/AtomicInteger; 291 -Landroid/graphics/drawable/LayerDrawable; 292 -Landroid/animation/LayoutTransition; 293 -Llibcore/reflect/AnnotationFactory;.cache:Ljava/util/Map; 294 -Llibcore/reflect/AnnotationFactory;.cache:Ljava/util/Map;.table:[Ljava/util/WeakHashMap$Entry; 294 -Ljava/lang/reflect/Proxy;.proxyClassCache:Ljava/lang/reflect/WeakCache;.reverseMap:Ljava/util/concurrent/ConcurrentMap; 295 -Ljava/lang/reflect/Proxy$ProxyClassFactory;.nextUniqueNumber:Ljava/util/concurrent/atomic/AtomicLong; 295 -Ljava/lang/reflect/Proxy;.proxyClassCache:Ljava/lang/reflect/WeakCache;.map:Ljava/util/concurrent/ConcurrentMap; 296 -Ljava/lang/Object; 297 -Ljava/lang/invoke/MethodType;.internTable:Ljava/lang/invoke/MethodType$ConcurrentWeakInternSet;.map:Ljava/util/concurrent/ConcurrentMap; 298 -Ljava/nio/channels/SocketChannel;.dexCache:Ljava/lang/Object; 298 -Ljava/lang/invoke/MethodType;.objectOnlyTypes:[Ljava/lang/invoke/MethodType; 299 -Ljava/util/concurrent/ForkJoinTask; 300 -Ljava/util/concurrent/CompletableFuture; 301 -Landroid/app/Notification$BigTextStyle; 302 -Landroid/content/pm/ApplicationInfo; 303 -Ljava/security/Signature;.signatureInfo:Ljava/util/Map;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.13:Ljava/util/concurrent/ConcurrentHashMap$Node;.next:Ljava/util/concurrent/ConcurrentHashMap$Node;.next:Ljava/util/concurrent/ConcurrentHashMap$Node; 304 -Lsun/security/x509/X500Name;.stateName_oid:Lsun/security/util/ObjectIdentifier; 305 -Lsun/security/x509/X500Name;.localityName_oid:Lsun/security/util/ObjectIdentifier; 306 -Lsun/security/x509/X500Name;.orgUnitName_oid:Lsun/security/util/ObjectIdentifier; 306 -Ljava/util/UUID; 307 -Landroid/app/slice/Slice; 308 -Ljava/util/Locale;.FRENCH:Ljava/util/Locale; 308 -Landroid/os/NullVibrator; 308 -Ldalvik/system/CloseGuard;.MESSAGE:Ljava/lang/String; 308 -Lsun/util/locale/BaseLocale$Cache;.CACHE:Lsun/util/locale/BaseLocale$Cache;.map:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.22:Ljava/util/concurrent/ConcurrentHashMap$Node;.val:Ljava/lang/Object;.referent:Ljava/lang/Object; 308 -Ljava/util/Locale$Cache;.LOCALECACHE:Ljava/util/Locale$Cache;.map:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.24:Ljava/util/concurrent/ConcurrentHashMap$Node;.val:Ljava/lang/Object;.referent:Ljava/lang/Object; 308 -Landroid/app/Activity$$ExternalSyntheticLambda0; 308 -Landroid/icu/impl/locale/BaseLocale;.CACHE:Landroid/icu/impl/locale/BaseLocale$Cache;._map:Ljava/util/concurrent/ConcurrentHashMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.0:Ljava/util/concurrent/ConcurrentHashMap$Node; 308 -Ljava/util/Locale;.ITALIAN:Ljava/util/Locale; 308 -Landroid/media/MediaRouter2Manager$Callback; 308 -Lsun/util/locale/BaseLocale$Cache;.CACHE:Lsun/util/locale/BaseLocale$Cache;.map:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.29:Ljava/util/concurrent/ConcurrentHashMap$Node;.val:Ljava/lang/Object;.referent:Ljava/lang/Object; 308 -Ljava/util/Locale;.GERMAN:Ljava/util/Locale; 309 -Landroid/icu/impl/StandardPlural; 310 -Landroid/icu/impl/number/range/StandardPluralRanges; 311 -Landroid/icu/impl/PluralRulesLoader;.loader:Landroid/icu/impl/PluralRulesLoader; 311 -Landroid/icu/impl/PluralRulesLoader;.loader:Landroid/icu/impl/PluralRulesLoader;.pluralRulesCache:Ljava/util/Map; 311 -Landroid/icu/text/PluralRules$Operand; 311 -Landroid/icu/util/Calendar;.PATTERN_CACHE:Landroid/icu/impl/ICUCache; 312 -Landroid/icu/impl/DateNumberFormat;.CACHE:Landroid/icu/impl/SimpleCache; 313 -Landroid/text/format/DateFormat; 314 -Landroid/view/View$OnDragListener; 315 -Landroid/hardware/input/InputManager$InputDeviceListener; 316 -Landroid/hardware/input/InputManagerGlobal; 317 -Landroid/hardware/SystemSensorManager; 318 -Lcom/android/internal/os/BackgroundThread; 319 -Ljava/lang/Throwable; 320 -Landroid/app/NotificationManager; 321 -Landroid/app/NotificationChannel; 322 -Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener; 323 -Landroid/content/pm/VersionedPackage; 324 -Landroid/app/AppOpsManager; 325 -Ldalvik/system/ZipPathValidator; 326 -Landroid/content/pm/PackageManager;.sPackageInfoCache:Landroid/app/PropertyInvalidatedCache;.mSkips:[J 327 -Landroid/content/pm/PackageManager;.sApplicationInfoCache:Landroid/app/PropertyInvalidatedCache;.mSkips:[J 328 -Lsun/util/locale/BaseLocale$Cache;.CACHE:Lsun/util/locale/BaseLocale$Cache;.map:Ljava/util/concurrent/ConcurrentMap; 329 -Landroid/content/Context; 330 -Ljava/util/concurrent/Executor; 331 -Ljava/util/concurrent/ScheduledExecutorService; 332 -Ljava/util/concurrent/ExecutorService; 332 -Landroid/view/Window$OnFrameMetricsAvailableListener; 333 -Ljava/lang/annotation/Annotation; 334 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 335 -Ljava/util/concurrent/CancellationException; 336 -Ljava/lang/NoSuchMethodException; 337 -Landroid/os/strictmode/CustomViolation; 338 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.3:Ljava/util/WeakHashMap$Entry; 339 -Lcom/android/internal/policy/PhoneWindow; 340 -Landroid/view/autofill/AutofillValue; 340 -Landroid/widget/TextView$SavedState; 341 -Landroid/text/method/MetaKeyKeyListener;.SYM:Ljava/lang/Object; 342 -Landroid/text/method/MetaKeyKeyListener;.ALT:Ljava/lang/Object; 342 -Landroid/text/method/MetaKeyKeyListener;.SELECTING:Ljava/lang/Object; 342 -Landroid/text/method/MetaKeyKeyListener;.CAP:Ljava/lang/Object; 342 -Landroid/widget/PopupWindow$PopupBackgroundView; 343 -Landroid/widget/TextView;.TEMP_RECTF:Landroid/graphics/RectF; 343 -Landroid/text/method/ScrollingMovementMethod; 343 -Landroid/icu/impl/locale/UnicodeLocaleExtension;.EMPTY_SORTED_SET:Ljava/util/SortedSet;.m:Ljava/util/NavigableMap; 343 -Landroid/widget/PopupWindow$PopupDecorView; 343 -Landroid/widget/Editor$TextRenderNode; 343 -Landroid/widget/Editor$PositionListener; 344 -Landroid/text/style/SpellCheckSpan; 345 -Landroid/text/method/ArrowKeyMovementMethod; 346 -Landroid/text/method/TextKeyListener;.sInstance:[Landroid/text/method/TextKeyListener; 346 -Landroid/text/TextUtils$TruncateAt;.MARQUEE:Landroid/text/TextUtils$TruncateAt; 347 -Landroid/view/autofill/Helper; 348 -Lcom/android/internal/util/LatencyTracker; 349 -Lcom/android/internal/util/LatencyTracker$SLatencyTrackerHolder; 349 -Landroid/graphics/drawable/Icon; 350 -Landroid/text/style/AlignmentSpan; 351 -Landroid/text/MeasuredParagraph;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 352 -Landroid/text/MeasuredParagraph;.sPool:Landroid/util/Pools$SynchronizedPool; 352 -Landroid/icu/impl/ICUResourceBundleReader;.CACHE:Landroid/icu/impl/ICUResourceBundleReader$ReaderCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 353 -Landroid/location/ILocationManager$Stub;.dexCache:Ljava/lang/Object; 354 -Landroid/annotation/CurrentTimeMillisLong; 355 -Ljava/lang/reflect/Method; 356 -Lcom/android/internal/os/ZygoteInit; 356 -Landroid/database/DatabaseUtils; 356 -Landroid/os/HandlerThread; 356 -Ljava/security/Signature;.signatureInfo:Ljava/util/Map;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node; 357 -Ljava/security/Signature;.signatureInfo:Ljava/util/Map; 358 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.queue:Ljava/lang/ref/ReferenceQueue; 359 -Landroid/telephony/TelephonyRegistryManager; 360 -Landroid/graphics/HardwareRenderer; 361 -Landroid/os/BinderProxy; 362 -Landroid/app/compat/CompatChanges;.QUERY_CACHE:Landroid/app/compat/ChangeIdStateCache;.mCache:Ljava/util/LinkedHashMap; 363 -Landroid/app/compat/CompatChanges;.QUERY_CACHE:Landroid/app/compat/ChangeIdStateCache; 363 -Landroid/app/AlarmManager; 364 -Landroid/net/metrics/DhcpClientEvent; 365 -[I 366 -Landroid/media/MediaCodecList; 367 -Landroid/graphics/drawable/InsetDrawable; 368 -Landroid/widget/ProgressBar$SavedState; 369 -Landroid/widget/ScrollView$SavedState; 370 -Landroid/graphics/drawable/AnimatedVectorDrawable; 371 -Landroid/widget/ListView; 372 -Landroid/widget/AbsListView; 373 -Landroid/widget/AbsListView$SavedState; 373 -Landroid/widget/CompoundButton$SavedState; 374 -Landroid/widget/HorizontalScrollView$SavedState; 375 -Landroid/widget/HorizontalScrollView; 376 -Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.1:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 377 -Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.6:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 377 -Landroid/view/View$OnSystemUiVisibilityChangeListener; 378 -Ljava/util/AbstractMap; 379 -Landroid/telephony/euicc/EuiccCardManager$ResultCallback; 380 -Ljava/lang/Character$UnicodeBlock;.CJK_SYMBOLS_AND_PUNCTUATION:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.KANBUN:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.HANGUL_COMPATIBILITY_JAMO:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.KATAKANA:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.HANGUL_SYLLABLES:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.ENCLOSED_CJK_LETTERS_AND_MONTHS:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.HANGUL_JAMO:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.BOPOMOFO_EXTENDED:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.CJK_COMPATIBILITY_FORMS:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.BOPOMOFO:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.HIRAGANA:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.HALFWIDTH_AND_FULLWIDTH_FORMS:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.KANGXI_RADICALS:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.CJK_RADICALS_SUPPLEMENT:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.KATAKANA_PHONETIC_EXTENSIONS:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.CJK_COMPATIBILITY:Ljava/lang/Character$UnicodeBlock; 381 -Ljava/lang/Character$UnicodeBlock;.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT:Ljava/lang/Character$UnicodeBlock; 382 -Ljava/lang/Character$UnicodeBlock;.CJK_COMPATIBILITY_IDEOGRAPHS:Ljava/lang/Character$UnicodeBlock; 382 -Ljava/lang/Character$UnicodeBlock;.CJK_UNIFIED_IDEOGRAPHS:Ljava/lang/Character$UnicodeBlock; 382 -Ljava/lang/Character$UnicodeBlock;.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A:Ljava/lang/Character$UnicodeBlock; 382 -Ljava/lang/Character$UnicodeBlock;.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B:Ljava/lang/Character$UnicodeBlock; 382 -Lcom/android/internal/inputmethod/InputMethodPrivilegedOperationsRegistry; 383 -Landroid/view/Window$DecorCallback; 383 -Landroid/view/inputmethod/EditorInfo; 383 -Landroid/view/MenuItem$OnActionExpandListener; 384 -Ljava/util/Locale;.JAPANESE:Ljava/util/Locale; 385 -Ljava/util/Locale;.KOREAN:Ljava/util/Locale; 385 -Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper; 386 -Landroid/telecom/PhoneAccountHandle; 387 -Landroid/content/AsyncQueryHandler; 388 -Landroid/speech/RecognitionListener; 389 -Ljava/lang/InstantiationException; 390 -Ljava/util/concurrent/ExecutionException; 391 -Landroid/icu/text/DateIntervalInfo;.DIICACHE:Landroid/icu/impl/ICUCache; 392 -Landroid/text/format/DateIntervalFormat;.CACHED_FORMATTERS:Landroid/util/LruCache;.map:Ljava/util/LinkedHashMap; 392 -Landroid/icu/text/DateIntervalFormat;.LOCAL_PATTERN_CACHE:Landroid/icu/impl/ICUCache; 392 -Landroid/icu/impl/OlsonTimeZone; 392 -Landroid/text/format/DateIntervalFormat;.CACHED_FORMATTERS:Landroid/util/LruCache; 392 -Landroid/graphics/drawable/Drawable; 393 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 394 -Landroid/app/Activity; 395 -Landroid/icu/text/PluralRules$KeywordStatus;.INVALID:Landroid/icu/text/PluralRules$KeywordStatus;.name:Ljava/lang/String; 396 -Landroid/net/Uri; 396 -Lsun/util/calendar/CalendarSystem;.calendars:Ljava/util/concurrent/ConcurrentMap; 396 -Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;.sJNISetterPropertyMap:Ljava/util/HashMap; 397 -Landroid/graphics/drawable/ShapeDrawable; 398 -Lcom/android/internal/widget/ActionBarContextView; 399 -Landroid/widget/Toolbar$SavedState; 399 -Lcom/android/internal/widget/ActionBarContainer; 399 -Lcom/android/internal/widget/ActionBarOverlayLayout; 399 -Lcom/android/internal/widget/ActionBarContainer$ActionBarBackgroundDrawable; 399 -Landroid/widget/ActionMenuPresenter$OverflowMenuButton; 400 -Landroid/widget/ActionMenuView; 401 -Landroid/content/res/Configuration; 402 -Ljava/util/IdentityHashMap;.NULL_KEY:Ljava/lang/Object; 403 -Ljava/util/concurrent/ForkJoinPool; 404 -Landroid/os/ResultReceiver; 405 -Ljava/util/concurrent/TimeoutException; 406 -Ljava/io/IOException; 407 -Landroid/accounts/AccountAuthenticatorResponse; 408 -Landroid/nfc/NfcAdapter; 409 -Landroid/nfc/NfcAdapter;.sNfcAdapters:Ljava/util/HashMap; 409 -Landroid/app/backup/BackupManager; 410 -Landroid/app/NotificationChannelGroup; 411 -Landroid/content/pm/ParceledListSlice; 411 -Landroid/os/FileObserver; 412 -Landroid/os/UserHandle; 413 -Landroid/content/pm/PackageManager$NameNotFoundException; 414 -[Ljava/lang/Integer; 415 -Landroid/animation/PropertyValuesHolder;.sSetterPropertyMap:Ljava/util/HashMap; 415 -Landroid/content/LocusId; 416 -Landroid/view/contentcapture/ContentCaptureContext; 416 -Landroid/telephony/ims/RegistrationManager;.IMS_REG_TO_ACCESS_TYPE_MAP:Ljava/util/Map;.table:[Ljava/lang/Object;.18:Ljava/lang/Integer; 417 -Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;.pool:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.4:Ljava/util/concurrent/ConcurrentHashMap$Node; 418 -Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;.pool:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node; 418 -Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;.pool:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.2:Ljava/util/concurrent/ConcurrentHashMap$Node;.next:Ljava/util/concurrent/ConcurrentHashMap$Node; 418 -Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver;.EF_SOURCE_PRIORITY:Ljava/util/List;.a:[Ljava/lang/Object;.9:Ljava/lang/Integer; 418 -Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;.pool:Ljava/util/concurrent/ConcurrentMap;.table:[Ljava/util/concurrent/ConcurrentHashMap$Node;.56:Ljava/util/concurrent/ConcurrentHashMap$Node; 418 -Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver;.EF_SOURCE_PRIORITY:Ljava/util/List;.a:[Ljava/lang/Object;.5:Ljava/lang/Integer; 418 -Lcom/android/org/bouncycastle/asn1/ASN1ObjectIdentifier;.pool:Ljava/util/concurrent/ConcurrentMap; 418 -Landroid/widget/EditText; 419 -Landroid/widget/CheckedTextView; 420 -Landroid/os/strictmode/UnsafeIntentLaunchViolation; 421 -Landroid/app/Service; 422 -Ldalvik/system/BlockGuard; 423 -Landroid/hardware/devicestate/DeviceStateManagerGlobal; 424 -Landroid/hardware/camera2/CameraCharacteristics;.SCALER_MULTI_RESOLUTION_STREAM_SUPPORTED:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 425 -Landroid/hardware/camera2/marshal/MarshalRegistry;.sMarshalerMap:Ljava/util/HashMap; 425 -Landroid/hardware/camera2/CameraCharacteristics;.LENS_FACING:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 425 -Landroid/content/ClipboardManager$OnPrimaryClipChangedListener; 426 -Landroid/icu/text/BreakIterator;.iterCache:[Landroid/icu/impl/CacheValue; 427 -Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.13:Ljava/util/WeakHashMap$Entry; 428 -Landroid/icu/text/Collator; 429 -Landroid/icu/impl/number/parse/NanMatcher;.DEFAULT:Landroid/icu/impl/number/parse/NanMatcher;.uniSet:Landroid/icu/text/UnicodeSet;.strings:Ljava/util/SortedSet;.c:Ljava/util/Collection;.m:Ljava/util/NavigableMap; 430 -Ljava/io/FileNotFoundException; 431 -Landroid/os/BaseBundle; 432 -Landroid/service/watchdog/ExplicitHealthCheckService$PackageConfig; 433 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.116:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.12:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.90:Ljava/lang/String; 434 -Landroid/icu/text/MessageFormat;.rootLocale:Ljava/util/Locale;.baseLocale:Lsun/util/locale/BaseLocale;.language:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.385:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.107:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.112:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.480:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.550:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.143:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._obsoleteLanguages:[Ljava/lang/String;.1:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.473:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.138:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.204:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.71:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._replacementCountries:[Ljava/lang/String;.12:Ljava/lang/String; 434 -Landroid/icu/impl/duration/impl/DataRecord$ETimeLimit;.names:[Ljava/lang/String;.1:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._replacementCountries:[Ljava/lang/String;.9:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.99:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages3:[Ljava/lang/String;.152:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.256:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.170:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.220:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.461:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._replacementLanguages:[Ljava/lang/String;.5:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.190:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.157:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._obsoleteCountries:[Ljava/lang/String;.4:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.196:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.117:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.5:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.499:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.199:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.18:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.324:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.101:Ljava/lang/String; 434 -Landroid/icu/impl/locale/UnicodeLocaleExtension;.CA_JAPANESE:Landroid/icu/impl/locale/UnicodeLocaleExtension;._keywords:Ljava/util/SortedMap;.root:Ljava/util/TreeMap$TreeMapEntry;.key:Ljava/lang/Object; 434 -Landroid/icu/impl/LocaleIDs;._replacementCountries:[Ljava/lang/String;.3:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.140:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.105:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.37:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._replacementCountries:[Ljava/lang/String;.5:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.22:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.103:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.412:Ljava/lang/String; 434 -Landroid/icu/impl/duration/impl/DataRecord$EMilliSupport;.names:[Ljava/lang/String;.1:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.124:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.232:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.219:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.179:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.523:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.75:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.486:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.166:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.112:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.119:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.160:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.298:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.257:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.182:Ljava/lang/String; 434 -Landroid/icu/impl/units/UnitPreferences;.measurementSystem:Ljava/util/Map;.m:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.5:Ljava/util/HashMap$Node;.next:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.47:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.180:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.111:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.358:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.96:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._obsoleteLanguages:[Ljava/lang/String;.0:Ljava/lang/String; 434 -Landroid/icu/text/DateFormat;.HOUR_GENERIC_TZ:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.67:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.254:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.222:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.55:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.349:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.16:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.352:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.443:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.478:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.19:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.401:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.137:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.65:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.474:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.168:Ljava/lang/String; 434 -Landroid/icu/impl/units/UnitPreferences;.measurementSystem:Ljava/util/Map;.m:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.15:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.111:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages3:[Ljava/lang/String;.545:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.30:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.469:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.21:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.69:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.56:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.519:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._replacementLanguages:[Ljava/lang/String;.4:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.107:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.290:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.59:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.220:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.186:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.516:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.181:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.199:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.396:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.117:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.227:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.331:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.447:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.151:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.144:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.132:Ljava/lang/String; 434 -Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.230:Ljava/lang/String; 434 -Landroid/icu/text/DateFormat;.MINUTE_SECOND:Ljava/lang/String; 434 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 435 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.head:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 436 -Ljava/lang/Enum;.sharedConstantsCache:Llibcore/util/BasicLruCache;.map:Ljava/util/LinkedHashMap;.tail:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry;.before:Ljava/util/LinkedHashMap$LinkedHashMapEntry; 437 -Landroid/graphics/drawable/ColorStateListDrawable; 438 -Ljava/lang/SecurityException; 439 -Ljava/lang/RuntimeException; 440 -Landroid/media/audiopolicy/AudioProductStrategy; 441 -Landroid/os/PersistableBundle; 442 -Landroid/content/pm/ShortcutInfo; 442 -Landroid/icu/text/TimeZoneFormat;._tzfCache:Landroid/icu/text/TimeZoneFormat$TimeZoneFormatCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 443 -Landroid/graphics/LeakyTypefaceStorage;.sStorage:Ljava/util/ArrayList; 443 -Landroid/graphics/LeakyTypefaceStorage;.sTypefaceMap:Landroid/util/ArrayMap; 443 -Landroid/text/TextWatcher; 444 -Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener; 445 -Ljavax/net/SocketFactory; 446 -Ljava/util/Collections; 447 -Ljava/lang/Exception; 448 -Landroid/os/UserManager; 449 -Landroid/os/RemoteException; 450 -Landroid/content/AttributionSource; 451 -Lcom/android/okhttp/internalandroidapi/HttpURLConnectionFactory$DnsAdapter; 452 -Lcom/android/okhttp/Protocol;.HTTP_2:Lcom/android/okhttp/Protocol; 452 -Ljava/net/Inet4Address; 452 -Lcom/android/okhttp/Protocol;.SPDY_3:Lcom/android/okhttp/Protocol; 452 -Lcom/android/okhttp/OkHttpClient; 452 -Landroid/os/storage/VolumeInfo; 453 -Landroid/os/storage/DiskInfo; 453 -Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mMap:Landroid/util/ArrayMap; 454 -Ljava/nio/file/StandardOpenOption;.WRITE:Ljava/nio/file/StandardOpenOption; 455 -Ljava/nio/file/StandardOpenOption;.APPEND:Ljava/nio/file/StandardOpenOption; 456 -Ljava/util/logging/FileHandler; 457 -Ljava/nio/file/StandardOpenOption;.CREATE_NEW:Ljava/nio/file/StandardOpenOption; 457 -Ljava/util/logging/FileHandler;.locks:Ljava/util/Set;.map:Ljava/util/HashMap; 457 -Lsun/nio/ch/SharedFileLockTable;.queue:Ljava/lang/ref/ReferenceQueue; 458 -Ljavax/net/ServerSocketFactory; 458 -Landroid/os/AsyncTask; 459 -Landroid/os/strictmode/UnbufferedIoViolation; 460 -Landroid/app/usage/AppStandbyInfo; 461 -Landroid/text/format/DateUtils; 462 -Landroid/security/IKeyChainService; 463 -Landroid/util/Log$TerribleFailure; 464 -Lcom/android/internal/os/RuntimeInit$KillApplicationHandler; 464 -Ljava/util/Timer;.nextSerialNumber:Ljava/util/concurrent/atomic/AtomicInteger; 465 -Landroid/telephony/ims/stub/ImsConfigImplBase$ImsConfigStub; 466 -Landroid/telephony/ims/stub/ImsRegistrationImplBase$1; 466 -Landroid/telephony/ims/ImsUtListener; 466 -Landroid/telephony/ims/feature/MmTelFeature$1; 466 -Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray;.mValues:[Ljava/lang/Object; 467 -Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray; 467 -Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray;.mKeys:[I 467 -Landroid/telephony/ims/aidl/IImsConfig$Stub$Proxy; 468 -Landroid/telephony/ims/aidl/IImsRegistration$Stub$Proxy; 468 -Landroid/telephony/NetworkService; 469 -Landroid/telephony/TelephonyCallback$ServiceStateListener; 470 -Landroid/telephony/TelephonyCallback$PhysicalChannelConfigListener; 471 -Landroid/telephony/TelephonyCallback$RadioPowerStateListener; 471 -Lsun/security/x509/X500Name;.internedOIDs:Ljava/util/Map; 472 -Lsun/security/x509/X500Name;.internedOIDs:Ljava/util/Map;.table:[Ljava/util/HashMap$Node; 472 -Landroid/media/MediaCodec; 473 -Ljava/nio/file/StandardOpenOption;.CREATE:Ljava/nio/file/StandardOpenOption; 474 -Ljava/nio/file/NoSuchFileException; 475 -Ljava/text/DateFormatSymbols;.cachedInstances:Ljava/util/concurrent/ConcurrentMap; 476 -Ljava/util/Currency;.instances:Ljava/util/concurrent/ConcurrentMap; 476 -Ljava/util/Calendar;.cachedLocaleData:Ljava/util/concurrent/ConcurrentMap; 476 -Ljava/text/SimpleDateFormat;.cachedNumberFormatData:Ljava/util/concurrent/ConcurrentMap; 476 -Landroid/app/UriGrantsManager;.IUriGrantsManagerSingleton:Landroid/util/Singleton; 477 -Landroid/content/ContentProviderProxy; 478 -Landroid/os/DeadObjectException; 479 -Landroid/app/slice/SliceSpec; 479 -Landroid/database/sqlite/SQLiteDatabase; 480 -Ljava/util/Locale;.CHINA:Ljava/util/Locale; 481 -Ljava/util/Locale;.TAIWAN:Ljava/util/Locale; 481 -Ljava/util/Locale;.KOREA:Ljava/util/Locale; 481 -Ljava/util/Scanner; 482 -Ljava/math/BigDecimal; 483 -Ljava/security/interfaces/RSAPrivateCrtKey; 483 -Ljava/security/interfaces/RSAPrivateKey; 483 -Lcom/android/server/backup/AccountSyncSettingsBackupHelper;.KEY_ACCOUNT_TYPE:Ljava/lang/String; 483 -Landroid/util/UtilConfig; 484 -Ljava/net/ResponseCache; 485 -Landroid/content/ReceiverCallNotAllowedException; 486 -Landroid/app/ReceiverRestrictedContext; 487 -Landroid/os/strictmode/CredentialProtectedWhileLockedViolation; 488 -Landroid/app/Application; 489 -Ljava/util/NoSuchElementException; 490 -Landroid/os/Messenger; 491 -Landroid/telephony/TelephonyCallback$DataEnabledListener; 491 -Landroid/system/StructLinger; 492 +Landroid/text/DynamicLayout$ChangeWatcher; 241 +Landroid/text/DynamicLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool; 242 +Landroid/text/DynamicLayout; 242 +Landroid/text/DynamicLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 242 +Landroid/text/style/WrapTogetherSpan; 243 +Landroid/widget/TextView$ChangeWatcher; 244 +Landroid/text/Selection$MemoryTextWatcher; 245 +Landroid/text/SpannableStringBuilder;.sCachedIntBuffer:[[I 246 +Landroid/text/style/SuggestionSpan; 247 +Landroid/text/style/ReplacementSpan; 248 +Landroid/text/TextUtils$TruncateAt;.MARQUEE:Landroid/text/TextUtils$TruncateAt; 249 +Landroid/text/style/SpellCheckSpan; 250 +Landroid/text/method/ArrowKeyMovementMethod; 251 +Landroid/text/method/TextKeyListener;.sInstance:[Landroid/text/method/TextKeyListener; 251 +Landroid/view/textclassifier/TextClassificationConstants; 252 +Landroid/text/Selection;.SELECTION_START:Ljava/lang/Object; 253 +Landroid/text/Selection;.SELECTION_END:Ljava/lang/Object; 253 +Landroid/text/Selection;.SELECTION_MEMORY:Ljava/lang/Object; 253 +Landroid/widget/EditText; 254 +Landroid/view/autofill/AutofillValue; 255 +Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;.sPool:Landroid/util/Pools$SimplePool; 256 +Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture;.sPool:Landroid/util/Pools$SimplePool;.mPool:[Ljava/lang/Object; 256 +Landroid/view/ViewGroup; 257 +Landroid/widget/TextView; 258 +Landroid/animation/AnimatorInflater;.sTmpTypedValue:Landroid/util/TypedValue; 259 +Landroid/graphics/drawable/GradientDrawable; 260 +Landroid/text/method/SingleLineTransformationMethod; 261 +Landroid/text/StaticLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 262 +Landroid/text/StaticLayout$Builder;.sPool:Landroid/util/Pools$SynchronizedPool; 262 +Landroid/os/HandlerThread; 263 +Lcom/android/internal/os/ZygoteInit; 263 +Landroid/database/DatabaseUtils; 263 +Landroid/annotation/CurrentTimeMillisLong; 264 +Landroid/app/NotificationChannel; 265 +Landroid/os/AsyncTask; 267 +Landroid/graphics/Bitmap;.sAllBitmaps:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry; 285 +Lcom/android/internal/telephony/MccTable;.FALLBACKS:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.6:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 288 +Landroid/view/Window$OnFrameMetricsAvailableListener; 289 +Landroid/graphics/drawable/BitmapDrawable; 290 +Landroid/graphics/drawable/RippleDrawable; 291 +Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;.sJNISetterPropertyMap:Ljava/util/HashMap; 292 +Landroid/animation/PropertyValuesHolder;.sGetterPropertyMap:Ljava/util/HashMap; 293 +Landroid/graphics/drawable/LayerDrawable; 294 +Landroid/media/audiopolicy/AudioProductStrategy;.sLock:Ljava/lang/Object; 304 +Landroid/graphics/drawable/RotateDrawable; 304 +Landroid/opengl/EGLConfig; 307 +Landroid/icu/impl/ValidIdentifiers$Datasubtype;.unknown:Landroid/icu/impl/ValidIdentifiers$Datasubtype;.name:Ljava/lang/String; 308 +Lcom/android/ims/rcs/uce/UceDeviceState;.DEVICE_STATE_DESCRIPTION:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.4:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 308 +Lcom/android/ims/rcs/uce/UceDeviceState;.DEVICE_STATE_DESCRIPTION:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.3:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 309 +Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.0:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 310 +Landroid/telephony/ims/ImsService;.CAPABILITIES_LOG_MAP:Ljava/util/Map;.table:[Ljava/lang/Object;.2:Ljava/lang/Long; 311 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.569:Ljava/lang/Long; 311 +Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.6:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 312 +Landroid/icu/text/MeasureFormat;.hmsTo012:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.1:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 313 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.11:Ljava/lang/Boolean; 314 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1:Ljava/lang/Boolean; 315 +Landroid/os/SystemProperties; 325 +Landroid/app/job/JobParameters; 328 +Landroid/view/Window$DecorCallback; 329 +Landroid/view/MenuItem$OnActionExpandListener; 329 +Landroid/view/inputmethod/EditorInfo; 329 +Lcom/android/internal/inputmethod/InputMethodPrivilegedOperationsRegistry; 329 +Landroid/app/ActivityManager$OnUidImportanceListener; 331 +Landroid/os/strictmode/DiskReadViolation; 332 +Landroid/os/strictmode/CustomViolation; 333 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.4:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mLock:Ljava/lang/Object; 334 +Landroid/location/Location; 337 +Landroid/database/sqlite/SQLiteConstraintException; 337 +Lcom/android/internal/listeners/ListenerTransport; 338 +Landroid/content/IntentFilter; 339 +Landroid/hardware/location/ContextHubTransaction$OnCompleteListener; 340 +Landroid/app/PendingIntent$OnFinished; 340 +Landroid/os/WorkSource; 340 +Landroid/content/pm/PackageManager$OnPermissionsChangedListener; 341 +Landroid/annotation/IdRes; 342 +Landroid/app/AppOpsManager$Mode; 343 +Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener; 344 +Landroid/telephony/DataSpecificRegistrationInfo; 345 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle; 346 +Landroid/telephony/TelephonyRegistryManager;.sCarrierPrivilegeCallbacks:Ljava/util/WeakHashMap; 347 +Landroid/telephony/NetworkRegistrationInfo; 347 +Lcom/android/internal/telephony/TelephonyPermissions;.sReportedDeviceIDPackages:Ljava/util/Map; 347 +Landroid/telephony/AnomalyReporter; 347 +Landroid/content/ContentProvider$Transport; 347 +Landroid/database/CursorToBulkCursorAdaptor; 347 +Landroid/telephony/TelephonyRegistryManager;.sCarrierPrivilegeCallbacks:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry; 347 +Landroid/telephony/VoiceSpecificRegistrationInfo; 347 +Landroid/net/MatchAllNetworkSpecifier; 347 +Landroid/app/PropertyInvalidatedCache$NoPreloadHolder; 348 +Landroid/app/PropertyInvalidatedCache;.sInvalidates:Ljava/util/HashMap; 348 +Landroid/app/PropertyInvalidatedCache;.sDisabledKeys:Ljava/util/HashSet;.map:Ljava/util/HashMap; 349 +Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1; 350 +Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListener; 350 +Landroid/media/AudioManager$2; 350 +Landroid/app/PendingIntent$CancelListener; 350 +Landroid/app/ActivityManager$MyUidObserver; 350 +Landroid/app/compat/CompatChanges;.QUERY_CACHE:Landroid/app/compat/ChangeIdStateCache;.mCache:Ljava/util/LinkedHashMap; 351 +Landroid/app/compat/CompatChanges;.QUERY_CACHE:Landroid/app/compat/ChangeIdStateCache; 351 +Landroid/app/AlarmManager; 352 +Landroid/os/UserManager; 353 +Landroid/text/MeasuredParagraph;.sPool:Landroid/util/Pools$SynchronizedPool; 355 +Landroid/text/MeasuredParagraph;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 355 +Landroid/database/sqlite/SQLiteTransactionListener; 357 +Landroid/text/format/DateFormat; 358 +Landroid/icu/util/Calendar;.PATTERN_CACHE:Landroid/icu/impl/ICUCache; 359 +Landroid/icu/impl/DateNumberFormat;.CACHE:Landroid/icu/impl/SimpleCache; 360 +Landroid/app/smartspace/SmartspaceSession$OnTargetsAvailableListener; 361 +Lcom/android/internal/util/PerfettoTrigger;.sLastInvocationPerTrigger:Landroid/util/SparseLongArray; 361 +Lcom/android/internal/util/PerfettoTrigger;.sLastInvocationPerTrigger:Landroid/util/SparseLongArray;.mValues:[J 361 +Landroid/window/WindowOrganizer;.IWindowOrganizerControllerSingleton:Landroid/util/Singleton; 361 +Landroid/window/WindowContainerTransaction$Change; 361 +Lcom/android/internal/util/PerfettoTrigger;.sLastInvocationPerTrigger:Landroid/util/SparseLongArray;.mKeys:[I 361 +Landroid/view/ViewTreeObserver$OnWindowVisibilityChangeListener; 361 +Landroid/view/CrossWindowBlurListeners; 362 +Landroid/widget/Toast; 363 +Landroid/view/ViewStub$OnInflateListener; 364 +Landroid/text/Spanned; 365 +Lcom/android/internal/policy/PhoneLayoutInflater; 365 +Landroid/content/MutableContextWrapper; 365 +Landroid/renderscript/RenderScript; 365 +Landroid/content/pm/IPackageManager$Stub$Proxy; 367 +Landroid/media/MediaPlayer$EventHandler; 368 +Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.220:Ljava/lang/String; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.BOTTOM_TOP:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.RIGHT_LEFT:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/content/res/ResourcesImpl; 368 +Landroid/os/ResultReceiver$MyRunnable; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.TL_BR:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/view/animation/Animation$3; 368 +Landroid/view/ViewRootImpl$7; 368 +Landroid/view/animation/Animation$1; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.BR_TL:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.TOP_BOTTOM:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/os/PowerManager$3$$ExternalSyntheticLambda0; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.BL_TR:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.LEFT_RIGHT:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Landroid/graphics/drawable/GradientDrawable$Orientation;.TR_BL:Landroid/graphics/drawable/GradientDrawable$Orientation; 368 +Lcom/android/internal/policy/PhoneWindow$1; 368 +Landroid/hardware/SensorManager; 368 +Landroid/widget/SeekBar; 369 +Landroid/media/MediaRouter2Manager; 370 +Landroid/app/trust/TrustManager$TrustListener; 370 +Landroid/permission/PermissionManager;.INDICATOR_EXEMPTED_PACKAGES:[Ljava/lang/String; 370 +Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0; 370 +Landroid/view/ViewOverlay$OverlayViewGroup; 370 +Landroid/hardware/display/NightDisplayListener$Callback; 370 +Lcom/android/internal/widget/NotificationOptimizedLinearLayout; 370 +Landroid/hardware/biometrics/BiometricSourceType;.IRIS:Landroid/hardware/biometrics/BiometricSourceType; 370 +Landroid/view/NotificationTopLineView; 370 +Landroid/permission/PermissionManager; 370 +Landroid/text/TextShaper$GlyphsConsumer; 370 +Lcom/android/internal/widget/RemeasuringLinearLayout; 370 +Landroid/os/HandlerExecutor; 370 +Landroid/hardware/biometrics/BiometricSourceType;.FACE:Landroid/hardware/biometrics/BiometricSourceType; 370 +Landroid/animation/ValueAnimator$DurationScaleChangeListener; 370 +Landroid/widget/RemoteViews;.sLookupKey:Landroid/widget/RemoteViews$MethodKey; 370 +Lcom/android/internal/logging/UiEventLogger; 370 +Lcom/android/internal/view/menu/ActionMenuItemView; 370 +Landroid/hardware/biometrics/BiometricSourceType;.FINGERPRINT:Landroid/hardware/biometrics/BiometricSourceType; 370 +Landroid/transition/TransitionManager;.sPendingTransitions:Ljava/util/ArrayList; 370 +Landroid/graphics/drawable/DrawableInflater;.CONSTRUCTOR_MAP:Ljava/util/HashMap; 370 +Lcom/android/internal/widget/ImageFloatingTextView; 370 +Lcom/android/internal/widget/CachingIconView; 370 +Lcom/android/internal/widget/MessagingLayout; 370 +Landroid/widget/DateTimeView$ReceiverInfo$1; 370 +Landroid/view/animation/AnimationSet; 370 +Landroid/hardware/face/FaceManager$FaceDetectionCallback; 370 +Landroid/view/SurfaceControl; 370 +Lcom/android/internal/widget/NotificationExpandButton; 370 +Landroid/widget/ViewSwitcher;.dexCache:Ljava/lang/Object; 370 +Lcom/android/internal/colorextraction/ColorExtractor$OnColorsChangedListener; 370 +Landroid/view/RemotableViewMethod; 370 +Landroid/view/View;.SCALE_Y:Landroid/util/Property; 370 +Landroid/view/View;.TRANSLATION_Y:Landroid/util/Property; 370 +Landroid/telephony/satellite/SatelliteManager;.sSatelliteSupportedStateCallbackMap:Ljava/util/concurrent/ConcurrentHashMap; 370 +Landroid/view/NotificationHeaderView; 370 +Lcom/android/internal/widget/ImageResolver; 370 +Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0; 370 +Lcom/android/internal/widget/ConversationLayout; 370 +Lcom/android/internal/util/ContrastColorUtil; 370 +Landroid/text/format/DateUtils; 370 +Landroid/widget/RemoteViews;.sMethods:Landroid/util/ArrayMap; 370 +Landroid/widget/DateTimeView; 370 +Lcom/android/internal/widget/NotificationActionListLayout; 370 +Landroid/view/View;.SCALE_X:Landroid/util/Property; 370 +Landroid/widget/GridLayout;.UNDEFINED_ALIGNMENT:Landroid/widget/GridLayout$Alignment; 372 +Landroid/database/CursorIndexOutOfBoundsException; 374 +Lcom/android/internal/policy/DecorView$2; 375 +Landroid/widget/Spinner; 376 +Landroid/security/keystore2/AndroidKeyStoreRSAPrivateKey; 376 +Landroid/security/keystore/KeyInfo; 377 +Landroid/security/keystore2/AndroidKeyStoreECPrivateKey; 378 +Landroid/text/method/TextKeyListener;.ACTIVE:Ljava/lang/Object; 379 +Landroid/text/method/PasswordTransformationMethod; 380 +Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask; 382 +Landroid/speech/tts/TextToSpeech$OnInitListener; 383 +Lcom/android/internal/policy/PhoneWindow; 384 +Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState; 385 +Landroid/content/res/Configuration; 386 +Landroid/window/WindowContext; 386 +Landroid/icu/impl/number/parse/NanMatcher;.DEFAULT:Landroid/icu/impl/number/parse/NanMatcher;.uniSet:Landroid/icu/text/UnicodeSet;.strings:Ljava/util/SortedSet;.c:Ljava/util/Collection;.m:Ljava/util/NavigableMap; 386 +Landroid/app/Dialog$$ExternalSyntheticLambda2; 386 +Landroid/app/prediction/AppTargetEvent; 386 +Landroid/app/prediction/AppTarget; 388 +Landroid/content/res/Resources$NotFoundException; 389 +Landroid/icu/text/Collator; 390 +Landroid/widget/TextView$SavedState; 391 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.4:Ljava/util/WeakHashMap$Entry; 393 +Lcom/android/internal/logging/AndroidHandler; 395 +Landroid/view/VelocityTracker;.sPool:Landroid/util/Pools$SynchronizedPool; 397 +Landroid/os/StrictMode$OnThreadViolationListener; 397 +Landroid/view/VelocityTracker;.sPool:Landroid/util/Pools$SynchronizedPool;.mPool:[Ljava/lang/Object; 397 +Landroid/content/Context;.ACCOUNT_SERVICE:Ljava/lang/String; 397 +Landroid/service/trust/TrustAgentService;.EXTRA_TOKEN:Ljava/lang/String; 397 +Ljavax/sip/header/AcceptEncodingHeader;.NAME:Ljava/lang/String; 397 +Landroid/widget/RadioGroup$OnCheckedChangeListener; 398 +Lcom/android/internal/widget/DialogTitle; 399 +Lcom/android/internal/widget/ButtonBarLayout; 399 +Lcom/android/internal/widget/AlertDialogLayout; 399 +Landroid/icu/text/DecimalFormatSymbols;.DEF_DIGIT_STRINGS_ARRAY:[Ljava/lang/String;.1:Ljava/lang/String; 401 +Landroid/widget/Editor$TextRenderNode; 402 +Landroid/view/inputmethod/DeleteGesture; 403 +Landroid/text/method/MetaKeyKeyListener;.ALT:Ljava/lang/Object; 403 +Landroid/view/inputmethod/SelectRangeGesture; 403 +Landroid/text/method/MetaKeyKeyListener;.CAP:Ljava/lang/Object; 403 +Landroid/view/inputmethod/DeleteRangeGesture; 403 +Landroid/text/method/MetaKeyKeyListener;.SYM:Ljava/lang/Object; 403 +Landroid/text/method/MetaKeyKeyListener;.SELECTING:Ljava/lang/Object; 403 +Landroid/view/inputmethod/SelectGesture; 403 +Landroid/widget/TextView;.TEMP_POSITION:[F 404 +Landroid/view/inputmethod/BaseInputConnection;.COMPOSING:Ljava/lang/Object; 405 +Lcom/android/internal/infra/AndroidFuture; 406 +Landroid/accounts/Account;.sAccessedAccounts:Ljava/util/Set; 407 +Landroid/os/Message;.sPoolSync:Ljava/lang/Object; 408 +Landroid/database/sqlite/SQLiteCantOpenDatabaseException; 409 +Landroid/accounts/Account; 409 +Landroid/os/VibrationEffect; 411 +Landroid/content/ServiceConnection; 411 +Landroid/app/ActivityManager$MemoryInfo; 411 +Landroid/util/DisplayMetrics; 411 +Landroid/view/Display; 411 +Landroid/telephony/TelephonyCallback$DataConnectionStateListener; 412 +Landroid/hardware/display/IDisplayManager; 414 +Lcom/android/icu/util/regex/PatternNative; 414 +Landroid/view/WindowInsets; 414 +Landroid/app/ActivityTaskManager$2; 414 +Landroid/view/View$AttachInfo; 414 +Landroid/media/AudioManager$ServiceEventHandlerDelegate$1; 414 +Landroid/view/ViewRootImpl$6; 414 +Landroid/webkit/WebViewDelegate; 414 +Landroid/os/IInterface; 415 +Landroid/content/pm/IPackageManager; 417 +Landroid/app/IActivityManager; 418 +Landroid/text/style/ImageSpan; 419 +Landroid/widget/RelativeLayout; 422 +Landroid/graphics/drawable/StateListDrawable; 423 +Landroid/view/TextureView$SurfaceTextureListener; 427 +Landroid/graphics/SurfaceTexture; 428 +Landroid/media/audiopolicy/AudioProductStrategy; 429 +Landroid/media/PlayerBase; 430 +Landroid/os/FileUtils; 431 +Landroid/media/MediaDrm$OnEventListener; 435 +Landroid/graphics/drawable/TransitionDrawable; 436 +Lcom/android/internal/telephony/WspTypeDecoder;.WELL_KNOWN_PARAMETERS:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.25:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 437 +Lcom/android/ims/rcs/uce/presence/pidfparser/omapres/Version;.ELEMENT_NAME:Ljava/lang/String; 442 +Landroid/view/Window$Callback; 442 +Landroid/provider/SyncStateContract$Columns;.DATA:Ljava/lang/String; 442 +Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap;.mHashes:[I 444 +Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedString; 444 +Landroid/aconfig/nano/Aconfig$tracepoint; 444 +Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringArray; 444 +Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringSet; 444 +Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringValueMap; 444 +Lcom/android/internal/util/Parcelling$BuiltIn$ForInternedStringList; 444 +Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object; 444 +Landroid/app/ActivityTaskManager; 444 +Landroid/aconfig/nano/Aconfig$parsed_flag; 444 +Lcom/android/internal/util/Parcelling$Cache;.sCache:Landroid/util/ArrayMap; 444 +Landroid/app/servertransaction/TopResumedActivityChangeItem; 445 +Landroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0; 446 +Landroid/app/LoadedApk$ServiceDispatcher$RunConnection; 447 +Landroid/view/Choreographer$FrameDisplayEventReceiver; 448 +Landroid/view/inputmethod/InputMethodManager$H; 448 +Landroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0; 448 +Landroid/view/ViewRootImpl$ViewRootHandler; 449 +Landroid/view/Choreographer$FrameHandler; 450 +Landroid/view/View$$ExternalSyntheticLambda4; 451 +Landroid/app/IActivityTaskManager; 451 +Landroid/os/AsyncTask$InternalHandler; 452 +Landroid/app/job/JobServiceEngine$JobHandler; 452 +Landroid/app/servertransaction/PendingTransactionActions$StopInfo; 453 +Landroid/os/MessageQueue; 453 +Landroid/widget/PopupWindow$PopupDecorView; 453 +Landroid/view/WindowLeaked; 454 +Landroid/app/servertransaction/ClientTransaction; 455 +Landroid/content/res/Resources; 457 +Landroid/util/Pair; 458 +Landroid/widget/Switch; 460 +Landroid/view/ViewManager; 467 +Landroid/view/accessibility/AccessibilityEventSource; 467 +Landroid/view/KeyEvent$Callback; 467 +Landroid/view/ViewParent; 467 +Landroid/graphics/drawable/Drawable$Callback; 467 +Landroid/content/pm/SigningDetails; 468 +Landroid/content/pm/FeatureInfo; 468 +Landroid/content/pm/ProviderInfo; 468 +Landroid/content/pm/PermissionInfo; 468 +Landroid/content/pm/PackageItemInfo; 469 +Landroid/content/pm/PackageInfo; 470 +Landroid/app/IActivityManager$Stub$Proxy; 473 +Lcom/android/internal/os/PowerProfile;.sPowerItemMap:Ljava/util/HashMap; 474 +Lcom/android/internal/os/PowerProfile;.sPowerArrayMap:Ljava/util/HashMap; 474 +Lcom/android/internal/os/PowerProfile;.sModemPowerProfile:Lcom/android/internal/power/ModemPowerProfile;.mPowerConstants:Landroid/util/SparseDoubleArray;.mValues:Landroid/util/SparseLongArray; 474 +Landroid/widget/HorizontalScrollView; 475 +Landroid/view/ViewTreeObserver$OnWindowFocusChangeListener; 476 +Landroid/content/res/AssetManager$AssetInputStream; 477 +Landroid/os/Parcelable; 478 +Landroid/icu/util/Calendar;.WEEK_DATA_CACHE:Landroid/icu/util/Calendar$WeekDataCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 480 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.10:Ljava/util/WeakHashMap$Entry; 482 +Landroid/view/InsetsAnimationThread; 483 +Lcom/android/internal/jank/InteractionJankMonitor$InstanceHolder; 484 +Lcom/android/internal/jank/InteractionJankMonitor; 484 +Landroid/view/View$OnSystemUiVisibilityChangeListener; 485 +Landroid/hardware/display/DisplayManager$DisplayListener; 486 +Landroid/view/View$OnApplyWindowInsetsListener; 486 +Landroid/view/Choreographer$FrameCallback; 487 +Landroid/os/Handler$Callback; 489 +Landroid/os/Build$VERSION; 490 +Landroid/view/View$OnLayoutChangeListener; 490 +Landroid/app/SharedPreferencesImpl$EditorImpl; 491 +Landroid/view/InputDevice; 492 +Landroid/preference/PreferenceManager; 492 +Landroid/os/Build; 493 +Landroid/app/ContextImpl$ApplicationContentResolver; 496 +Landroid/provider/Settings$Secure; 496 +Landroid/view/TextureView; 497 +Landroid/os/strictmode/NetworkViolation; 498 +Landroid/graphics/drawable/AnimatedVectorDrawable; 499 +Landroid/icu/util/MeasureUnit$Complexity;.MIXED:Landroid/icu/util/MeasureUnit$Complexity;.name:Ljava/lang/String; 500 +Landroid/media/MediaDrm; 500 +Lcom/android/internal/app/procstats/DumpUtils;.STATE_NAMES_CSV:[Ljava/lang/String;.12:Ljava/lang/String; 500 +Landroid/provider/DocumentsContract;.DOWNLOADS_PROVIDER_AUTHORITY:Ljava/lang/String; 500 +Landroid/annotation/SystemApi; 500 +Landroid/icu/text/MessagePattern;.argTypes:[Landroid/icu/text/MessagePattern$ArgType;.0:Landroid/icu/text/MessagePattern$ArgType;.name:Ljava/lang/String; 500 +Landroid/webkit/WebViewFactory;.sProviderLock:Ljava/lang/Object; 505 +Landroid/app/ActivityThread$H; 506 +Landroid/view/AttachedSurfaceControl$OnBufferTransformHintChangedListener; 508 +Landroid/widget/ViewFlipper; 517 +Landroid/app/IActivityTaskManager$Stub$Proxy; 519 +Landroid/app/ActivityThread$ProviderRefCount; 519 +Landroid/view/ViewRootImpl$W; 519 +Lcom/android/internal/telephony/ITelephony; 519 +Lcom/android/internal/os/PowerProfile; 521 +Landroid/view/View$VisibilityChangeForAutofillHandler; 521 +Landroid/view/View$ScrollabilityCache; 521 +Landroid/app/INotificationManager; 521 +Landroid/graphics/drawable/LevelListDrawable; 521 +Landroid/app/SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0; 522 +Landroid/window/SplashScreen; 526 +Landroid/media/AudioManager$OnAudioFocusChangeListener; 528 +Landroid/app/Application; 529 +Landroid/content/ContextWrapper; 530 +Landroid/view/SurfaceView; 531 +Landroid/hardware/camera2/CameraCharacteristics;.FLASH_INFO_AVAILABLE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 532 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_TARGET_FPS_RANGE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_ZOOM_RATIO:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_EXPOSURE_COMPENSATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_ENABLE_ZSL:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 533 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_TEST_PATTERN_DATA:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.JPEG_QUALITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.STATISTICS_LENS_SHADING_MAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.LENS_FOCUS_DISTANCE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.REPROCESS_EFFECTIVE_EXPOSURE_FACTOR:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_TEST_PATTERN_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.LENS_APERTURE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.STATISTICS_HOT_PIXEL_MAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_SESSION_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_REFERENCE_ILLUMINANT1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_STABILIZATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.LENS_OPTICAL_STABILIZATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.LENS_FILTER_DENSITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AWB_REGIONS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_PADDING_ZOOM_FACTOR:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.BLACK_LEVEL_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.STATISTICS_FACE_DETECT_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.LOGICAL_MULTI_CAMERA_PHYSICAL_IDS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.JPEG_THUMBNAIL_SIZE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SCALER_ROTATE_AND_CROP:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_COLOR_FILTER_ARRANGEMENT:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_OPTICAL_BLACK_REGIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.FLASH_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AF_TRIGGER:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_MAX_PADDING_ZOOM_FACTOR:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_PIXEL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_WHITE_LEVEL:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.DISTORTION_CORRECTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_CAPTURE_INTENT:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_AUTO_ZOOM:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_CALIBRATION_TRANSFORM1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_ABERRATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_COLOR_TRANSFORM1:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.TONEMAP_GAMMA:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.NOISE_REDUCTION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SCALER_CROP_REGION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.TONEMAP_PRESET_CURVE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_EXPOSURE_TIME_RANGE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_POST_RAW_SENSITIVITY_BOOST:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.STATISTICS_OIS_DATA_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_FRAME_DURATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.HOT_PIXEL_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_EXTENDED_SCENE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_REQUEST_KEYS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_GAINS:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_AVAILABLE_OPTICAL_STABILIZATION:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_COLOR_TRANSFORM2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_CALIBRATION_TRANSFORM2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_LOCK:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.JPEG_THUMBNAIL_QUALITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_PRECAPTURE_TRIGGER:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_SENSITIVITY:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_EFFECT_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +[Landroid/hardware/camera2/params/MeteringRectangle; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AE_ANTIBANDING_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_AUTOFRAMING:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EXTENSION_STRENGTH:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_SCENE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_SETTINGS_OVERRIDE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_ROTATE_VIEWPORT:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.FLASH_STRENGTH_LEVEL:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_REFERENCE_ILLUMINANT2:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PIXEL_ARRAY_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.CONTROL_VIDEO_STABILIZATION_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.LENS_FOCAL_LENGTH:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.JPEG_ORIENTATION:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EFV_TRANSLATE_VIEWPORT:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SENSOR_EXPOSURE_TIME:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.TONEMAP_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.COLOR_CORRECTION_TRANSFORM:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.SHADING_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CaptureRequest;.EDGE_MODE:Landroid/hardware/camera2/CaptureRequest$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 534 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_PHYSICAL_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 535 +Landroid/util/Log; 536 +Landroid/accounts/AccountManager$20; 537 +Landroid/accounts/OnAccountsUpdateListener; 538 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.7:Ljava/util/WeakHashMap$Entry; 541 +Landroid/os/FileObserver; 544 +Landroid/widget/Space; 546 +Landroid/content/pm/ApplicationInfo; 547 +Landroid/graphics/ColorMatrix;.dexCache:Ljava/lang/Object; 548 +Landroid/text/style/CharacterStyle; 549 +Landroid/text/style/AlignmentSpan; 550 +Landroid/text/TextWatcher; 551 +Landroid/graphics/Bitmap;.sAllBitmaps:Ljava/util/WeakHashMap;.queue:Ljava/lang/ref/ReferenceQueue; 553 +Landroid/view/ViewRootImpl$$ExternalSyntheticLambda11; 554 +Landroid/app/Fragment;.sClassMap:Landroid/util/ArrayMap; 555 +Landroid/os/Bundle; 556 +Landroid/app/ActivityTaskManager;.sInstance:Landroid/util/Singleton; 557 +Landroid/content/pm/ShortcutInfo; 564 +Landroid/graphics/drawable/Icon; 565 +Landroid/os/PersistableBundle; 566 +Landroid/content/LocusId; 576 +Landroid/view/contentcapture/ContentCaptureContext; 576 +Landroid/telephony/TelephonyCallback$DisplayInfoListener; 577 +Landroid/app/Notification$Builder; 583 +Landroid/hardware/usb/UsbManager;.FUNCTION_NAME_TO_CODE:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.13:Ljava/util/HashMap$Node;.next:Ljava/util/HashMap$Node;.next:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 583 +Landroid/telephony/ims/ImsService;.CAPABILITIES_LOG_MAP:Ljava/util/Map;.table:[Ljava/lang/Object;.8:Ljava/lang/Long; 583 +Landroid/app/Notification; 584 +Landroid/app/RemoteAction; 585 +Landroid/graphics/Insets; 590 +Landroid/graphics/Rect; 591 +Lcom/android/internal/os/BackgroundThread; 592 +Landroid/widget/ViewSwitcher; 602 +Landroid/graphics/Color;.sColorNameMap:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.3:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 603 +Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Basic;.OPEN:Ljava/lang/String; 603 +Lcom/android/internal/os/BinderCallsStats$SettingsObserver;.SETTINGS_ENABLED_KEY:Ljava/lang/String; 603 +Landroid/icu/text/DecimalFormatSymbols;.DEF_DIGIT_STRINGS_ARRAY:[Ljava/lang/String;.3:Ljava/lang/String; 603 +Landroid/os/BatteryConsumer;.sPowerComponentNames:[Ljava/lang/String;.13:Ljava/lang/String; 603 +Landroid/os/IncidentManager;.URI_SCHEME:Ljava/lang/String; 603 +Landroid/os/AsyncTask$4; 603 +Landroid/text/Html$HtmlParser;.schema:Lorg/ccil/cowan/tagsoup/HTMLSchema;.theEntities:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.3233:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 603 +Landroid/provider/DocumentsContract;.PATH_SEARCH:Ljava/lang/String; 603 +Landroid/icu/impl/LocaleIDs;._languages:[Ljava/lang/String;.437:Ljava/lang/String; 603 +Landroid/icu/impl/units/UnitsData$Constants;.DEFAULT_USAGE:Ljava/lang/String; 604 +Lcom/android/internal/telephony/IccProvider;.ADDRESS_BOOK_COLUMN_NAMES:[Ljava/lang/String;.0:Ljava/lang/String; 604 +Landroid/text/method/DialerKeyListener; 605 +Landroid/icu/text/DecimalFormatSymbols;.DEF_DIGIT_STRINGS_ARRAY:[Ljava/lang/String;.0:Ljava/lang/String; 605 +Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Timestamp;.ELEMENT_NAME:Ljava/lang/String; 605 +Lcom/android/ims/rcs/uce/presence/pidfparser/pidf/Status;.ELEMENT_NAME:Ljava/lang/String; 605 +Landroid/os/BatteryManager;.EXTRA_SEQUENCE:Ljava/lang/String; 605 +Landroid/icu/text/MessageFormat;.typeList:[Ljava/lang/String;.5:Ljava/lang/String; 605 +Landroid/provider/Telephony$ThreadsColumns;.ERROR:Ljava/lang/String; 605 +Lcom/android/internal/os/RailStats;.WIFI_SUBSYSTEM:Ljava/lang/String; 605 +Landroid/app/NotificationChannel;.TAG_CHANNEL:Ljava/lang/String; 605 +Landroid/app/NotificationChannel;.EDIT_LAUNCHER:Ljava/lang/String; 605 +Lcom/android/ims/ImsUt;.KEY_ACTION:Ljava/lang/String; 605 +Landroid/view/textclassifier/TextClassifier;.TYPE_URL:Ljava/lang/String; 605 +Landroid/provider/Telephony$BaseMmsColumns;.START:Ljava/lang/String; 605 +Landroid/icu/impl/ValidIdentifiers$Datatype;.region:Landroid/icu/impl/ValidIdentifiers$Datatype;.name:Ljava/lang/String; 605 +Landroid/icu/impl/ZoneMeta;.REGION_CACHE:Landroid/icu/impl/ICUCache; 608 +Landroid/widget/TextView;.TEMP_RECTF:Landroid/graphics/RectF; 609 +Landroid/app/Activity; 611 +Landroid/text/method/LinkMovementMethod; 614 +Landroid/net/Uri; 615 +Landroid/app/PendingIntent; 617 +Landroid/security/net/config/UserCertificateSource$NoPreloadHolder; 618 +Landroid/net/Uri$PathPart;.EMPTY:Landroid/net/Uri$PathPart; 619 +Landroid/content/Intent; 620 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.197:Landroid/os/PersistableBundle; 622 +Landroid/graphics/HardwareRenderer; 624 +Landroid/icu/util/TimeZone; 625 +Landroid/telephony/TelephonyRegistryManager; 627 +Landroid/telecom/TelecomManager; 628 +Landroid/telephony/TelephonyCallback$ServiceStateListener; 629 +Landroid/telephony/TelephonyCallback$RadioPowerStateListener; 630 +Landroid/widget/ActionMenuView; 631 +Landroid/widget/ActionMenuPresenter$OverflowMenuButton; 631 +Landroid/widget/Toolbar; 631 +Lcom/android/internal/widget/ActionBarContainer; 632 +Lcom/android/internal/widget/ActionBarContainer$ActionBarBackgroundDrawable; 632 +Lcom/android/internal/widget/ActionBarContextView; 632 +Lcom/android/internal/widget/ActionBarOverlayLayout; 632 +Landroid/graphics/drawable/AdaptiveIconDrawable; 633 +Landroid/widget/ImageButton; 634 +Landroid/widget/Button; 635 +Landroid/view/AbsSavedState$1; 636 +Landroid/app/FragmentManagerState; 637 +Landroid/view/View$BaseSavedState; 638 +Landroid/graphics/drawable/ShapeDrawable; 639 +Lcom/android/internal/telephony/WspTypeDecoder;.WELL_KNOWN_MIME_TYPES:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.54:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 640 +Lcom/android/internal/telephony/WspTypeDecoder;.WELL_KNOWN_MIME_TYPES:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.33:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 640 +Landroid/widget/MultiAutoCompleteTextView; 642 +Landroid/speech/RecognitionListener; 642 +Landroid/widget/ToggleButton; 643 +Landroid/widget/AutoCompleteTextView; 644 +Landroid/widget/RadioButton; 645 +Landroid/widget/CheckBox; 646 +Landroid/view/View$OnGenericMotionListener; 647 +Landroid/os/UserHandle; 648 +Landroid/app/servertransaction/ResumeActivityItem; 655 +Landroid/app/servertransaction/ActivityRelaunchItem; 655 +Landroid/app/servertransaction/ObjectPool;.sPoolMap:Ljava/util/Map; 655 +Landroid/text/style/URLSpan; 656 +Landroid/icu/util/ULocale$AvailableType;.DEFAULT:Landroid/icu/util/ULocale$AvailableType;.name:Ljava/lang/String; 656 +Landroid/icu/util/CodePointMap$RangeOption;.NORMAL:Landroid/icu/util/CodePointMap$RangeOption;.name:Ljava/lang/String; 658 +Landroid/security/keystore2/AndroidKeyStoreProvider; 676 +Landroid/security/keystore2/KeyStoreCryptoOperationUtils; 677 +Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener; 678 +Landroid/view/View;.sNextGeneratedId:Ljava/util/concurrent/atomic/AtomicInteger; 679 +Landroid/icu/impl/number/range/StandardPluralRanges; 680 +Landroid/icu/impl/PluralRulesLoader;.loader:Landroid/icu/impl/PluralRulesLoader; 680 +Landroid/icu/impl/PluralRulesLoader;.loader:Landroid/icu/impl/PluralRulesLoader;.pluralRulesCache:Ljava/util/Map; 680 +Landroid/icu/text/PluralRules$Operand; 680 +Landroid/icu/impl/StandardPlural; 681 +Landroid/webkit/JavascriptInterface; 682 +Landroid/content/res/AssetManager; 684 +Ljavax/sip/header/ContentEncodingHeader;.NAME:Ljava/lang/String; 685 +Landroid/view/View$OnClickListener; 685 +Landroid/hardware/usb/UsbManager;.FUNCTION_NAME_TO_CODE:Ljava/util/Map;.table:[Ljava/util/HashMap$Node;.13:Ljava/util/HashMap$Node;.value:Ljava/lang/Object; 685 +Landroid/widget/CompoundButton; 685 +Landroid/view/accessibility/AccessibilityManager;.sInstanceSync:Ljava/lang/Object; 686 +Landroid/webkit/CookieManager; 687 +Landroid/icu/text/NFRule;.ZERO:Ljava/lang/Long; 689 +Landroid/app/AppOpsManager$OnOpActiveChangedListener; 691 +Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mMap:Landroid/util/ArrayMap; 692 +Landroid/os/RemoteException; 693 +Landroid/content/pm/PackageManager$OnChecksumsReadyListener; 694 +Landroid/content/pm/Checksum$Type; 695 +Landroid/view/InputEvent;.mNextSeq:Ljava/util/concurrent/atomic/AtomicInteger; 696 +Landroid/view/MotionEvent; 697 +Landroid/widget/ScrollView; 698 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.10:Ljava/util/WeakHashMap$Entry;.referent:Ljava/lang/Object;.mSkips:[J 702 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.queue:Ljava/lang/ref/ReferenceQueue; 703 +Landroid/widget/ProgressBar; 704 +Landroid/animation/LayoutTransition; 706 +Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;.sJNISetterPropertyMap:Ljava/util/HashMap; 707 +Lorg/apache/http/params/HttpParams; 711 +Landroid/app/NotificationChannelGroup; 712 +Landroid/content/pm/ParceledListSlice; 712 +Landroid/os/vibrator/StepSegment; 713 +Lcom/android/internal/util/LatencyTracker$SLatencyTrackerHolder; 714 +Lcom/android/internal/util/LatencyTracker; 714 +Landroid/app/Application$ActivityLifecycleCallbacks; 715 +Landroid/os/Messenger; 716 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AE_AVAILABLE_MODES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_INFO_ACTIVE_ARRAY_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.INFO_SESSION_CONFIGURATION_QUERY_VERSION:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.LENS_INFO_SHADING_MAP_SIZE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CaptureResult;.SENSOR_TIMESTAMP:Landroid/hardware/camera2/CaptureResult$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AWB_AVAILABLE_MODES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraDevice$StateCallback; 720 +Landroid/hardware/camera2/impl/CameraMetadataNative; 720 +Landroid/hardware/camera2/CameraCharacteristics;.SCALER_AVAILABLE_STREAM_USE_CASES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_ZOOM_RATIO_RANGE:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/util/Size; 720 +Landroid/hardware/camera2/CameraCaptureSession$StateCallback; 720 +Landroid/hardware/camera2/CameraCharacteristics;.CONTROL_AF_AVAILABLE_MODES:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCharacteristics;.REQUEST_PARTIAL_RESULT_COUNT:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 720 +Landroid/hardware/camera2/CameraCaptureSession$CaptureCallback; 720 +Landroid/util/Range; 720 +Landroid/widget/ListView; 721 +Landroid/widget/AbsListView; 721 +Landroid/transition/Explode; 723 +Landroid/text/HtmlToSpannedConverter$Font; 724 +Landroid/text/Html$TagHandler; 725 +Lcom/android/internal/telephony/cdnr/CarrierDisplayNameResolver;.EF_SOURCE_PRIORITY:Ljava/util/List;.a:[Ljava/lang/Object;.2:Ljava/lang/Integer; 725 +Landroid/telephony/ims/feature/MmTelFeature$1; 726 +Landroid/telephony/ims/stub/ImsConfigImplBase$ImsConfigStub; 726 +Landroid/telephony/ims/ImsUtListener; 726 +Landroid/telephony/ims/stub/ImsRegistrationImplBase$1; 726 +Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray;.mKeys:[I 727 +Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray; 728 +Lcom/android/ims/ImsManager;.IMS_MANAGER_INSTANCES:Landroid/util/SparseArray;.mValues:[Ljava/lang/Object; 728 +Landroid/telephony/ims/aidl/IImsConfig$Stub$Proxy; 729 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipMessageResponse; 730 +Landroid/timezone/TimeZoneFinder; 730 +Landroid/telephony/TelephonyRegistryManager$3; 730 +Lcom/android/internal/telephony/DeviceStateMonitor; 730 +Lcom/android/internal/telephony/imsphone/ImsPhone; 730 +Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker; 730 +Lcom/android/internal/telephony/cat/CatService; 730 +Landroid/net/NetworkPolicyManager$SubscriptionCallbackProxy; 730 +Landroid/telephony/ModemActivityInfo; 730 +Lcom/android/internal/telephony/InboundSmsHandler$NewMessageNotificationActionReceiver; 730 +Landroid/icu/impl/ZoneMeta;.SYSTEM_ZONE_CACHE:Landroid/icu/impl/ZoneMeta$SystemTimeZoneCache;.map:Ljava/util/concurrent/ConcurrentHashMap; 730 +Lcom/android/internal/telephony/TelephonyDevController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$GbaEvent; 730 +Lcom/android/internal/telephony/RadioInterfaceCapabilityController; 730 +Lcom/android/internal/telephony/SmsBroadcastUndelivered; 730 +Landroid/telephony/data/ApnSetting;.APN_TYPE_INT_MAP:Ljava/util/Map; 730 +Lcom/android/internal/telephony/SmsStorageMonitor$1; 730 +Lcom/android/internal/telephony/CellBroadcastServiceManager; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch; 730 +Lcom/android/internal/telephony/StateMachine$SmHandler; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierRoamingSatelliteControllerStats; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.673:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/NetworkTypeController$1; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mDisplayInfoRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/CarrierActionAgent; 730 +Lcom/android/internal/telephony/uicc/UiccCarrierPrivilegeRules; 730 +Lcom/android/internal/telephony/MultiSimSettingController; 730 +Lcom/android/internal/telephony/GsmCdmaCallTracker; 730 +Lcom/android/internal/telephony/gsm/GsmInboundSmsHandler$GsmCbTestBroadcastReceiver; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteController; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1289:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/IntentBroadcaster$1; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.483:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$PresenceNotifyEvent; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSosMessageRecommender; 730 +Landroid/telephony/CellSignalStrengthWcdma; 730 +Lcom/android/ims/rcs/uce/eab/EabProvider; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierRoamingSatelliteSession; 730 +Lcom/android/internal/telephony/TelephonyComponentFactory; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mRingingCalls:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/ims/ImsResolver$2; 730 +Lcom/android/internal/telephony/emergency/EmergencyNumberTracker; 730 +Landroid/timezone/TelephonyLookup; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$UnavailableState; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.363:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/ProxyController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteOutgoingDatagram; 730 +Lcom/android/i18n/timezone/TimeZoneFinder; 730 +Lcom/android/internal/telephony/SimActivationTracker; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteProvision; 730 +Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaScpTestBroadcastReceiver; 730 +Lcom/android/internal/telephony/ServiceStateTracker; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$AvailableState; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsClientProvisioningStats; 730 +Lcom/android/internal/telephony/SmsApplication; 730 +Lcom/android/internal/telephony/TelephonyDevController;.mModems:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/SimActivationTracker$1; 730 +Lcom/android/internal/telephony/emergency/EmergencyNumberTracker$1; 730 +Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequestsV2; 730 +Lcom/android/internal/telephony/AppSmsManager; 730 +Landroid/telephony/ims/ProvisioningManager$Callback$CallbackBinder; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.789:[Ljava/lang/String; 730 +Lcom/android/i18n/timezone/TelephonyLookup; 730 +Lcom/android/internal/telephony/CarrierServiceBindHelper$CarrierServicePackageMonitor; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.549:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mInCallVoicePrivacyOffRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/cdma/CdmaInboundSmsHandler$CdmaCbTestBroadcastReceiver; 730 +Lcom/android/internal/telephony/IntentBroadcaster; 730 +Landroid/telephony/ims/RegistrationManager$RegistrationCallback$RegistrationBinder; 730 +Lcom/android/internal/telephony/GsmCdmaCallTracker$1; 730 +Lcom/android/internal/telephony/uicc/UiccProfile$2; 730 +Landroid/telephony/ims/ImsMmTelManager$CapabilityCallback$CapabilityBinder; 730 +Landroid/telephony/CellSignalStrengthGsm; 730 +Landroid/os/Handler$MessengerImpl; 730 +Lcom/android/internal/telephony/DisplayInfoController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationStats; 730 +Lcom/android/internal/telephony/DeviceStateMonitor$3; 730 +Lcom/android/internal/telephony/RIL;.sRilTimeHistograms:Landroid/util/SparseArray; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.469:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/PhoneConfigurationManager; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.349:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/TelephonyDevController;.mSims:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$IncomingSms; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$UnmeteredNetworks; 730 +Lcom/android/internal/telephony/euicc/EuiccCardController; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mMmiCompleteRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$DataNetworkValidation; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$BindingState; 730 +Lcom/android/internal/telephony/uicc/UiccPkcs15$Pkcs15Selector; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.23:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/SomeArgs; 730 +Lcom/android/internal/telephony/SmsStorageMonitor; 730 +Lcom/android/internal/telephony/SmsApplication$SmsPackageMonitor; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierIdMismatch; 730 +Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mSuppServiceFailedRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyCallSession$Event$RilCall; 730 +Lcom/android/internal/telephony/metrics/TelephonyMetrics; 730 +Lcom/android/internal/telephony/ims/ImsResolver$3; 730 +Lcom/android/internal/telephony/uicc/UiccProfile; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteAccessController; 730 +Lcom/android/internal/telephony/NitzStateMachine; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$DisconnectedState; 730 +Lcom/android/internal/telephony/uicc/UiccStateChangedLauncher; 730 +Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$15; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.833:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/SmsUsageMonitor; 730 +Lcom/android/internal/telephony/euicc/EuiccCardController$SimSlotStatusChangedBroadcastReceiver; 730 +Lcom/android/internal/telephony/ims/ImsServiceController$1; 730 +Lcom/android/internal/telephony/satellite/SatelliteModemInterface; 730 +Lcom/android/internal/telephony/CarrierResolver$2; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$NetworkRequests; 730 +Lcom/android/internal/telephony/MccTable; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipDelegateStats; 730 +Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray;.mValues:[Ljava/lang/Object; 730 +Lcom/android/ims/FeatureConnector$1; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1443:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/ims/ImsResolver$1; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState; 730 +Lcom/android/internal/telephony/security/NullCipherNotifier; 730 +Lcom/android/internal/telephony/SMSDispatcher$1; 730 +Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo; 730 +Lcom/android/internal/telephony/LocaleTracker$1; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mTtyModeReceivedRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallRatUsage; 730 +Landroid/os/AsyncResult; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mDisconnectRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteConfigUpdater; 730 +Lcom/android/internal/telephony/ims/ImsResolver; 730 +Lcom/android/internal/telephony/ServiceStateTracker$1; 730 +Lcom/android/internal/telephony/PhoneFactory; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager; 730 +Landroid/telephony/CellSignalStrengthTdscdma; 730 +Landroid/telephony/emergency/EmergencyNumber; 730 +Lcom/android/internal/telephony/GsmCdmaPhone; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportSession; 730 +Landroid/app/timezonedetector/TimeZoneDetector; 730 +Landroid/telephony/ims/aidl/IImsServiceController$Stub$Proxy; 730 +Lcom/android/internal/telephony/TelephonyTester$1; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$EmergencyNumbersInfo; 730 +Lcom/android/internal/telephony/nano/TelephonyProto$TelephonyServiceState$NetworkRegistrationInfo; 730 +Lcom/android/internal/telephony/CarrierServiceBindHelper$1; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mHandlerMap:Ljava/util/HashMap; 730 +Lcom/android/internal/telephony/IccPhoneBookInterfaceManager; 730 +Lcom/android/internal/telephony/CarrierPrivilegesTracker$1; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1173:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mForegroundCalls:Ljava/util/ArrayList; 730 +Landroid/telephony/TelephonyLocalConnection; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$1; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerListenerEvent; 730 +Landroid/telephony/ModemInfo; 730 +Lcom/android/internal/telephony/CommandException$Error;.INVALID_SIM_STATE:Lcom/android/internal/telephony/CommandException$Error; 730 +Lcom/android/internal/telephony/CommandException; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$VoiceCallSession; 730 +Lcom/android/internal/telephony/imsphone/ImsExternalCallTracker; 730 +Lcom/android/internal/telephony/euicc/EuiccController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteSession; 730 +Landroid/telephony/CellSignalStrengthLte; 730 +Lcom/android/internal/telephony/CarrierActionAgent$1; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingShortCodeSms; 730 +Lcom/android/internal/telephony/satellite/PointingAppController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteIncomingDatagram; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationFeatureTagStats; 730 +Lcom/android/internal/telephony/imsphone/ImsPhoneCallTracker$2; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.33:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/nano/TelephonyProto$RilDataCall; 730 +Lcom/android/internal/telephony/RILRequest; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$ConnectedState$5; 730 +Landroid/telephony/BarringInfo$BarringServiceInfo; 730 +Lcom/android/internal/telephony/IWapPushManager; 730 +Lcom/android/internal/telephony/SmsDispatchersController; 730 +Lcom/android/internal/telephony/uicc/UiccController; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$OutgoingSms; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteEntitlement; 730 +Lcom/android/internal/telephony/util/NotificationChannelController$1; 730 +Lcom/android/ims/ImsManager;.IMS_STATS_CALLBACKS:Landroid/util/SparseArray;.mKeys:[I 730 +Lcom/android/internal/telephony/IccSmsInterfaceManager; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$SipTransportFeatureTagStats; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mInCallVoicePrivacyOnRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/uicc/UiccProfile$4; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$UceEventStats; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerEvent; 730 +Lcom/android/internal/telephony/RadioConfig; 730 +Lcom/android/internal/telephony/PackageChangeReceiver; 730 +Lcom/android/internal/telephony/PhoneSubInfoController; 730 +Lcom/android/internal/telephony/euicc/EuiccConnector$EuiccPackageMonitor; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationTermination; 730 +Lcom/android/internal/telephony/uicc/PinStorage$1; 730 +Lcom/android/internal/telephony/SmsBroadcastUndelivered$1; 730 +Lcom/android/internal/telephony/cdma/CdmaSubscriptionSourceManager; 730 +Lcom/android/internal/telephony/CarrierKeyDownloadManager$3; 730 +Lcom/android/internal/telephony/NetworkTypeController$DefaultState; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsAcsProvisioningStats; 730 +Landroid/net/TelephonyNetworkSpecifier; 730 +Landroid/telephony/CarrierConfigManager;.sDefaults:Landroid/os/PersistableBundle;.mMap:Landroid/util/ArrayMap;.mArray:[Ljava/lang/Object;.1459:[Ljava/lang/String; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mSignalInfoRegistrants:Lcom/android/internal/telephony/RegistrantList;.registrants:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsRegistrationServiceDescStats; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mBackgroundCalls:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/CallManager;.INSTANCE:Lcom/android/internal/telephony/CallManager;.mPhones:Ljava/util/ArrayList; 730 +Lcom/android/internal/telephony/LocaleTracker; 730 +Lcom/android/internal/telephony/RilWakelockInfo; 730 +Landroid/telephony/CellSignalStrengthNr; 730 +Landroid/telephony/CellSignalStrengthCdma; 730 +Landroid/telephony/NetworkService; 731 +Landroid/util/Log$TerribleFailure; 732 +Lcom/android/internal/os/RuntimeInit$KillApplicationHandler; 733 +Landroid/content/res/ResourcesKey; 734 +Landroid/app/ResourcesManager; 734 +Landroid/widget/HorizontalScrollView$SavedState; 736 +Landroid/widget/AbsSpinner$SavedState; 736 +Landroid/widget/Spinner$SavedState; 736 +Lcom/android/internal/transition/EpicenterTranslateClipReveal; 737 +Landroid/transition/TransitionInflater;.sConstructors:Landroid/util/ArrayMap; 737 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.15:Ljava/lang/String; 738 +Landroid/view/ThreadedRenderer;.OVERDRAW_PROPERTY_SHOW:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.141:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.35:Ljava/lang/String; 738 +Landroid/text/Html$ImageGetter; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.80:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.224:Ljava/lang/String; 738 +Landroid/webkit/ConsoleMessage$MessageLevel;.WARNING:Landroid/webkit/ConsoleMessage$MessageLevel; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.118:Ljava/lang/String; 738 +Landroid/webkit/ConsoleMessage$MessageLevel;.LOG:Landroid/webkit/ConsoleMessage$MessageLevel; 738 +Landroid/webkit/ConsoleMessage$MessageLevel;.DEBUG:Landroid/webkit/ConsoleMessage$MessageLevel; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.221:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._replacementCountries:[Ljava/lang/String;.9:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.127:Ljava/lang/String; 738 +Landroid/window/ImeOnBackInvokedDispatcher;.RESULT_KEY_PRIORITY:Ljava/lang/String; 738 +Landroid/util/AndroidRuntimeException; 738 +Lcom/android/internal/app/procstats/DumpUtils;.STATE_TAGS:[Ljava/lang/String;.14:Ljava/lang/String; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.6:Ljava/lang/String; 738 +Landroid/webkit/ConsoleMessage$MessageLevel;.TIP:Landroid/webkit/ConsoleMessage$MessageLevel; 738 +Landroid/webkit/ConsoleMessage$MessageLevel;.ERROR:Landroid/webkit/ConsoleMessage$MessageLevel; 738 +Landroid/opengl/GLSurfaceView; 738 +Landroid/icu/impl/LocaleIDs;._countries:[Ljava/lang/String;.237:Ljava/lang/String; 738 +Landroid/app/servertransaction/LaunchActivityItem; 739 +Landroid/app/backup/BackupManager; 750 +Landroid/content/pm/PackageManager$NameNotFoundException; 751 +Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader;.packages:Ljava/util/Map;.m:Ljava/util/Map;.table:[Ljava/util/HashMap$Node; 752 +Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader;.packages:Ljava/util/Map;.m:Ljava/util/Map; 752 +Landroid/view/textclassifier/TextLanguage;.EMPTY:Landroid/view/textclassifier/TextLanguage;.mBundle:Landroid/os/Bundle;.mClassLoader:Ljava/lang/ClassLoader; 752 +Landroid/icu/util/ULocale$AliasReplacer; 753 +Landroid/widget/MediaController$MediaPlayerControl; 755 +Landroid/graphics/Point; 759 +Landroid/content/ContentValues; 759 +Landroid/opengl/GLSurfaceView$Renderer; 760 +Landroid/opengl/GLSurfaceView;.sGLThreadManager:Landroid/opengl/GLSurfaceView$GLThreadManager; 761 +Landroid/text/StaticLayout; 762 +Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider; 762 +Landroid/text/method/DigitsKeyListener;.sLocaleInstanceCache:Ljava/util/HashMap; 764 +Landroid/graphics/Path$Op; 765 +Landroid/text/method/QwertyKeyListener; 765 +Landroid/app/StackTrace; 765 +Landroid/icu/text/BreakIterator;.iterCache:[Landroid/icu/impl/CacheValue; 766 +Landroid/view/View$OnHoverListener; 767 +Landroid/content/res/ColorStateList; 767 +Landroid/security/IKeyChainService; 768 +Landroid/app/Notification$MessagingStyle; 769 +Landroid/content/ContentProviderClient; 773 +Landroid/os/UserHandle;.sExtraUserHandleCache:Landroid/util/SparseArray; 773 +Landroid/content/ContentProvider$PipeDataWriter; 774 +Landroid/os/strictmode/UnsafeIntentLaunchViolation; 774 +Landroid/content/AsyncQueryHandler; 776 +Landroid/app/Activity$$ExternalSyntheticLambda0; 777 +Landroid/widget/CheckedTextView; 777 +Landroid/graphics/PorterDuff$Mode;.SRC_IN:Landroid/graphics/PorterDuff$Mode; 778 +Landroid/graphics/drawable/InsetDrawable; 779 +Landroid/view/OrientationEventListener; 781 +Landroid/hardware/camera2/CameraCharacteristics;.INFO_SUPPORTED_HARDWARE_LEVEL:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 782 +Landroid/hardware/camera2/CameraCharacteristics;.SENSOR_ORIENTATION:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 783 +Landroid/hardware/camera2/CameraCharacteristics;.INFO_DEVICE_STATE_ORIENTATIONS:Landroid/hardware/camera2/CameraCharacteristics$Key;.mKey:Landroid/hardware/camera2/impl/CameraMetadataNative$Key; 783 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.9:Ljava/util/WeakHashMap$Entry; 785 +Landroid/media/MediaRouter$VolumeChangeReceiver; 787 +Landroid/media/MediaRouter$WifiDisplayStatusChangedReceiver; 787 +Landroid/media/MediaRouter; 788 +Landroid/hardware/SensorPrivacyManager; 789 +Landroid/os/storage/StorageManager; 790 +Landroid/telephony/SubscriptionManager; 791 +Landroid/view/textservice/TextServicesManager; 791 +Landroid/os/SystemConfigManager; 791 +Landroid/view/LayoutInflater; 791 +Landroid/hardware/input/InputManager; 791 +Landroid/credentials/CredentialManager; 791 +Landroid/permission/PermissionControllerManager; 791 +Landroid/net/NetworkPolicyManager; 791 +Landroid/security/attestationverification/AttestationVerificationManager; 791 +Landroid/app/contextualsearch/ContextualSearchManager; 791 +Landroid/app/wearable/WearableSensingManager; 791 +Landroid/app/people/PeopleManager; 791 +Landroid/net/wifi/sharedconnectivity/app/SharedConnectivityManager; 791 +Landroid/media/session/MediaSessionManager; 791 +Landroid/provider/E2eeContactKeysManager; 791 +Landroid/view/contentcapture/ContentCaptureManager; 791 +Landroid/app/contentsuggestions/ContentSuggestionsManager; 791 +Landroid/os/HardwarePropertiesManager; 791 +Landroid/app/admin/DevicePolicyManager; 791 +Landroid/view/translation/TranslationManager; 791 +Landroid/view/autofill/AutofillManager; 791 +Landroid/net/vcn/VcnManager; 791 +Landroid/service/persistentdata/PersistentDataBlockManager; 791 +Landroid/view/textclassifier/TextClassificationManager; 791 +Landroid/media/tv/tunerresourcemanager/TunerResourceManager; 791 +Landroid/os/RecoverySystem; 791 +Landroid/os/strictmode/Violation; 793 +Lcom/android/internal/telephony/uicc/asn1/Asn1Node;.EMPTY_NODE_LIST:Ljava/util/List; 795 +Landroid/os/strictmode/CredentialProtectedWhileLockedViolation; 796 +Landroid/net/metrics/DhcpClientEvent; 797 +Landroid/icu/impl/CharacterPropertiesImpl;.inclusions:[Landroid/icu/text/UnicodeSet; 798 +Landroid/content/AttributionSource; 800 +Landroid/database/sqlite/SQLiteException; 801 +Lcom/android/ims/ImsManager;.TRUE:Ljava/lang/String; 802 +Landroid/graphics/Matrix; 803 +Landroid/graphics/RectF; 803 +Landroid/os/Parcel$LazyValue; 803 +Landroid/telephony/TelephonyCallback$DataEnabledListener; 804 +Landroid/app/PropertyInvalidatedCache;.sCaches:Ljava/util/WeakHashMap;.table:[Ljava/util/WeakHashMap$Entry;.6:Ljava/util/WeakHashMap$Entry; 805 +Landroid/service/media/MediaBrowserService$ServiceState; 806 +Landroid/graphics/drawable/PictureDrawable; 806 +Landroid/content/pm/PackageManager; 812 +Landroid/window/IWindowContainerToken$Stub$Proxy; 813 +Landroid/app/UriGrantsManager;.IUriGrantsManagerSingleton:Landroid/util/Singleton; 814 +Landroid/provider/FontsContract;.sTypefaceCache:Landroid/util/LruCache;.map:Ljava/util/LinkedHashMap; 816 +Landroid/provider/FontsContract;.sTypefaceCache:Landroid/util/LruCache; 816 +Lcom/android/internal/telephony/WspTypeDecoder;.WELL_KNOWN_MIME_TYPES:Ljava/util/HashMap;.table:[Ljava/util/HashMap$Node;.81:Ljava/util/HashMap$Node;.key:Ljava/lang/Object; 817 +Landroid/app/Service; 818 +Landroid/app/ReceiverRestrictedContext; 819 +Landroid/util/proto/ProtoStream;.FIELD_TYPE_NAMES:[Ljava/lang/String;.10:Ljava/lang/String; 820 +Lorg/apache/http/conn/ssl/SSLSocketFactory$NoPreloadHolder; 820 +Landroid/app/LoadedApk$WarningContextClassLoader; 820 +Ljavax/sip/header/PriorityHeader;.NORMAL:Ljava/lang/String; 820 +Lcom/android/internal/telephony/euicc/EuiccController;.EXTRA_OPERATION:Ljava/lang/String; 820 +Landroid/widget/ViewAnimator; 820 +Landroid/security/keystore/KeyGenParameterSpec; 821 +Landroid/text/style/StyleSpan; 821 +Landroid/util/SparseIntArray; 823 +Landroid/database/ContentObserver; 823 diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index ed59327ff8e9..c5df248ec1a9 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -1022,10 +1022,18 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote, bool p parseCompilerOption("dalvik.vm.image-dex2oat-filter", dex2oatImageCompilerFilterBuf, "--compiler-filter=", "-Ximage-compiler-option"); - // If there is a dirty-image-objects file, push it. - if (hasFile("/system/etc/dirty-image-objects")) { - addOption("-Ximage-compiler-option"); - addOption("--dirty-image-objects=/system/etc/dirty-image-objects"); + // If there are dirty-image-objects files, push them. + const char* dirty_image_objects_options[] = { + "--dirty-image-objects=/apex/com.android.art/etc/dirty-image-objects", + "--dirty-image-objects=/system/etc/dirty-image-objects", + }; + for (const char* option : dirty_image_objects_options) { + // Get the file path by finding the first '/' and check if + // this file exists. + if (hasFile(strchr(option, '/'))) { + addOption("-Ximage-compiler-option"); + addOption(option); + } } parseCompilerOption("dalvik.vm.image-dex2oat-threads", dex2oatThreadsImageBuf, "-j", -- GitLab From 0e86fd9711da6f820e89672b8b2a3df97084ef49 Mon Sep 17 00:00:00 2001 From: Matthew Reynolds Date: Thu, 17 Oct 2024 17:21:31 +0000 Subject: [PATCH 035/459] Migrate from mockito.Matchers to mockito.argumentMatchers Test: tested manually with atest Bug: 374108184 Flag: TEST_ONLY Change-Id: Ia114aa79fd42f1021e8923fd1bd1c8b29d205aaa --- packages/SystemUI/Android.bp | 20 ++-------- .../WorkLockActivityControllerTest.java | 8 ++-- .../pipeline/MediaTimeoutListenerTest.kt | 4 +- .../power/PowerNotificationWarningsTest.java | 2 +- .../android/systemui/power/PowerUITest.java | 39 +++++++++--------- .../systemui/qs/QSSecurityFooterTest.java | 2 +- .../systemui/qs/tileimpl/QSTileImplTest.java | 2 +- .../view/SimpleDigitalClockTextViewTest.kt | 1 + .../plugins/PluginActionManagerTest.java | 4 +- .../systemui/statusbar/CommandQueueTest.java | 2 +- .../commandline/CommandRegistryTest.kt | 40 +++++++++---------- .../connectivity/CallbackHandlerTest.java | 2 +- .../NetworkControllerBaseTest.java | 9 +++-- .../policy/BatteryStateNotifierTest.kt | 11 ++--- .../policy/SecurityControllerTest.java | 13 +++--- 15 files changed, 70 insertions(+), 89 deletions(-) diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 3c560fdcadb6..5f90b39808f8 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -276,8 +276,6 @@ filegroup { filegroup { name: "SystemUI-tests-broken-robofiles-compile", srcs: [ - "tests/src/**/*DeviceOnlyTest.java", - "tests/src/**/*DeviceOnlyTest.kt", "tests/src/**/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt", "tests/src/**/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt", "tests/src/**/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt", @@ -293,7 +291,6 @@ filegroup { "tests/src/**/systemui/keyguard/ResourceTrimmerTest.kt", "tests/src/**/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt", "tests/src/**/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt", - "tests/src/**/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt", "tests/src/**/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt", "tests/src/**/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt", "tests/src/**/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt", @@ -303,14 +300,12 @@ filegroup { "tests/src/**/systemui/screenshot/ActionIntentCreatorTest.kt", "tests/src/**/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt", "tests/src/**/systemui/screenshot/TakeScreenshotServiceTest.kt", - "tests/src/**/systemui/statusbar/commandline/CommandRegistryTest.kt", "tests/src/**/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt", "tests/src/**/systemui/statusbar/notification/icon/IconManagerTest.kt", "tests/src/**/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt", "tests/src/**/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt", "tests/src/**/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt", "tests/src/**/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt", - "tests/src/**/systemui/statusbar/policy/BatteryStateNotifierTest.kt", "tests/src/**/systemui/statusbar/policy/FlashlightControllerImplTest.kt", "tests/src/**/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt", "tests/src/**/systemui/stylus/StylusUsiPowerStartableTest.kt", @@ -449,27 +444,20 @@ filegroup { "tests/src/**/systemui/media/dialog/MediaSwitchingControllerTest.java", "tests/src/**/systemui/navigationbar/views/NavigationBarTest.java", "tests/src/**/systemui/power/PowerNotificationWarningsTest.java", - "tests/src/**/systemui/power/PowerUITest.java", "tests/src/**/systemui/qs/QSFooterViewControllerTest.java", "tests/src/**/systemui/qs/QSImplTest.java", - "tests/src/**/systemui/qs/QSSecurityFooterTest.java", - "tests/src/**/systemui/qs/tileimpl/QSTileImplTest.java", "tests/src/**/systemui/qs/tiles/QuickAccessWalletTileTest.java", "tests/src/**/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java", - "tests/src/**/systemui/shared/plugins/PluginActionManagerTest.java", - "tests/src/**/systemui/statusbar/CommandQueueTest.java", - "tests/src/**/systemui/statusbar/connectivity/CallbackHandlerTest.java", "tests/src/**/systemui/statusbar/connectivity/NetworkControllerBaseTest.java", + "tests/src/**/systemui/statusbar/connectivity/NetworkControllerDataTest.java", + "tests/src/**/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java", + "tests/src/**/systemui/statusbar/connectivity/NetworkControllerSignalTest.java", + "tests/src/**/systemui/statusbar/connectivity/NetworkControllerWifiTest.java", "tests/src/**/systemui/statusbar/KeyguardIndicationControllerTest.java", "tests/src/**/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java", "tests/src/**/systemui/statusbar/phone/ScrimControllerTest.java", "tests/src/**/systemui/statusbar/policy/RotationLockControllerImplTest.java", - "tests/src/**/systemui/statusbar/policy/SecurityControllerTest.java", "tests/src/**/systemui/toast/ToastUITest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerDataTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerSignalTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerWifiTest.java", ], visibility: ["//visibility:private"], } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java index e981d627b582..cad22d360508 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/WorkLockActivityControllerTest.java @@ -16,11 +16,11 @@ package com.android.systemui.keyguard; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.argThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt index dcf32a5f574d..51c852531697 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt @@ -38,11 +38,11 @@ import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentCaptor +import org.mockito.ArgumentMatchers import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyString import org.mockito.Captor import org.mockito.Mock -import org.mockito.Mockito import org.mockito.Mockito.clearInvocations import org.mockito.Mockito.mock import org.mockito.Mockito.never @@ -61,7 +61,7 @@ private const val SESSION_TITLE = "SESSION_TITLE" private const val SMARTSPACE_KEY = "SMARTSPACE_KEY" private fun anyObject(): T { - return Mockito.anyObject() + return ArgumentMatchers.any() } @SmallTest diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java index bdd8dc8875e9..2aa300df4f7c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java @@ -21,7 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.mock; diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java index 2f41ac17892d..338ed7596bd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/power/PowerUITest.java @@ -19,9 +19,8 @@ import static android.provider.Settings.Global.SHOW_USB_TEMPERATURE_ALARM; import static com.google.common.truth.Truth.assertThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.anyObject; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -194,7 +193,7 @@ public class PowerUITest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_SKIN)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_SKIN)); } @Test @@ -207,7 +206,7 @@ public class PowerUITest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_USB_PORT)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_USB_PORT)); } @Test @@ -220,7 +219,7 @@ public class PowerUITest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(0)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_SKIN)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_SKIN)); } @Test @@ -233,7 +232,7 @@ public class PowerUITest extends SysuiTestCase { TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(0)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_USB_PORT)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_USB_PORT)); } @Test @@ -243,14 +242,14 @@ public class PowerUITest extends SysuiTestCase { // success registering skin thermal event listener when(mThermalServiceMock.registerThermalEventListenerWithType( - anyObject(), eq(Temperature.TYPE_SKIN))).thenReturn(true); + any(), eq(Temperature.TYPE_SKIN))).thenReturn(true); mPowerUI.doSkinThermalEventListenerRegistration(); // verify registering skin thermal event listener, return true (success) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_SKIN)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_SKIN)); // Settings SHOW_TEMPERATURE_WARNING is set to 0 Settings.Global.putInt(mContext.getContentResolver(), SHOW_TEMPERATURE_WARNING, 0); @@ -259,7 +258,7 @@ public class PowerUITest extends SysuiTestCase { // verify unregistering skin thermal event listener TestableLooper.get(this).processAllMessages(); - verify(mThermalServiceMock, times(1)).unregisterThermalEventListener(anyObject()); + verify(mThermalServiceMock, times(1)).unregisterThermalEventListener(any()); } @Test @@ -269,14 +268,14 @@ public class PowerUITest extends SysuiTestCase { // fail registering skin thermal event listener when(mThermalServiceMock.registerThermalEventListenerWithType( - anyObject(), eq(Temperature.TYPE_SKIN))).thenReturn(false); + any(), eq(Temperature.TYPE_SKIN))).thenReturn(false); mPowerUI.doSkinThermalEventListenerRegistration(); // verify registering skin thermal event listener, return false (fail) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_SKIN)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_SKIN)); // Settings SHOW_TEMPERATURE_WARNING is set to 0 Settings.Global.putInt(mContext.getContentResolver(), SHOW_TEMPERATURE_WARNING, 0); @@ -285,7 +284,7 @@ public class PowerUITest extends SysuiTestCase { // verify that cannot unregister listener (current state is unregistered) TestableLooper.get(this).processAllMessages(); - verify(mThermalServiceMock, times(0)).unregisterThermalEventListener(anyObject()); + verify(mThermalServiceMock, times(0)).unregisterThermalEventListener(any()); // Settings SHOW_TEMPERATURE_WARNING is set to 1 Settings.Global.putInt(mContext.getContentResolver(), SHOW_TEMPERATURE_WARNING, 1); @@ -295,7 +294,7 @@ public class PowerUITest extends SysuiTestCase { // verify that can register listener (current state is unregistered) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(2)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_SKIN)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_SKIN)); } @Test @@ -305,14 +304,14 @@ public class PowerUITest extends SysuiTestCase { // success registering usb thermal event listener when(mThermalServiceMock.registerThermalEventListenerWithType( - anyObject(), eq(Temperature.TYPE_USB_PORT))).thenReturn(true); + any(), eq(Temperature.TYPE_USB_PORT))).thenReturn(true); mPowerUI.doUsbThermalEventListenerRegistration(); // verify registering usb thermal event listener, return true (success) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_USB_PORT)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_USB_PORT)); // Settings SHOW_USB_TEMPERATURE_ALARM is set to 0 Settings.Global.putInt(mContext.getContentResolver(), SHOW_USB_TEMPERATURE_ALARM, 0); @@ -320,7 +319,7 @@ public class PowerUITest extends SysuiTestCase { // verify unregistering usb thermal event listener mPowerUI.doUsbThermalEventListenerRegistration(); TestableLooper.get(this).processAllMessages(); - verify(mThermalServiceMock, times(1)).unregisterThermalEventListener(anyObject()); + verify(mThermalServiceMock, times(1)).unregisterThermalEventListener(any()); } @Test @@ -330,14 +329,14 @@ public class PowerUITest extends SysuiTestCase { // fail registering usb thermal event listener when(mThermalServiceMock.registerThermalEventListenerWithType( - anyObject(), eq(Temperature.TYPE_USB_PORT))).thenReturn(false); + any(), eq(Temperature.TYPE_USB_PORT))).thenReturn(false); mPowerUI.doUsbThermalEventListenerRegistration(); // verify registering usb thermal event listener, return false (fail) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(1)) - .registerThermalEventListenerWithType(anyObject(), eq(Temperature.TYPE_USB_PORT)); + .registerThermalEventListenerWithType(any(), eq(Temperature.TYPE_USB_PORT)); // Settings SHOW_USB_TEMPERATURE_ALARM is set to 0 Settings.Global.putInt(mContext.getContentResolver(), SHOW_USB_TEMPERATURE_ALARM, 0); @@ -346,7 +345,7 @@ public class PowerUITest extends SysuiTestCase { // verify that cannot unregister listener (current state is unregistered) TestableLooper.get(this).processAllMessages(); - verify(mThermalServiceMock, times(0)).unregisterThermalEventListener(anyObject()); + verify(mThermalServiceMock, times(0)).unregisterThermalEventListener(any()); // Settings SHOW_USB_TEMPERATURE_ALARM is set to 1 Settings.Global.putInt(mContext.getContentResolver(), SHOW_USB_TEMPERATURE_ALARM, 1); @@ -356,7 +355,7 @@ public class PowerUITest extends SysuiTestCase { // verify that can register listener (current state is unregistered) TestableLooper.get(this).processAllMessages(); verify(mThermalServiceMock, times(2)).registerThermalEventListenerWithType( - anyObject(), eq(Temperature.TYPE_USB_PORT)); + any(), eq(Temperature.TYPE_USB_PORT)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java index dad65f5add42..f6d57325bb1c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/QSSecurityFooterTest.java @@ -25,7 +25,7 @@ import static junit.framework.Assert.assertNull; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java index 748c7d9d939b..296478be77e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java @@ -36,7 +36,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Matchers.argThat; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt index 040a9e959094..8bd8b72e5527 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +package systemui.shared.clocks.view import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginActionManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginActionManagerTest.java index e9222c3ef6ad..3ad0605f2781 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginActionManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginActionManagerTest.java @@ -19,8 +19,8 @@ package com.android.systemui.shared.plugins; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index 2b5e014b2048..b730b3703515 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -21,8 +21,8 @@ import static android.inputmethodservice.InputMethodService.IME_ACTIVE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowInsetsController.BEHAVIOR_DEFAULT; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.Matchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt index b18b7f8f8129..72ffa0ee0855 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt @@ -16,41 +16,39 @@ package com.android.systemui.statusbar.commandline -import androidx.test.filters.SmallTest -import android.testing.AndroidTestingRunner import android.testing.TestableLooper - +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase - +import java.io.PrintWriter +import java.io.StringWriter +import java.util.concurrent.Executor +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.any import org.mockito.ArgumentMatchers.anyList import org.mockito.ArgumentMatchers.eq -import org.mockito.Mockito import org.mockito.Mockito.mock import org.mockito.Mockito.verify -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -import java.io.PrintWriter -import java.io.StringWriter -import java.util.concurrent.Executor private fun anyObject(): T { - return Mockito.anyObject() + return any() } private fun safeEq(value: T): T = eq(value) ?: value -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper @SmallTest class CommandRegistryTest : SysuiTestCase() { lateinit var registry: CommandRegistry - val inLineExecutor = object : Executor { - override fun execute(command: Runnable) { - command.run() + val inLineExecutor = + object : Executor { + override fun execute(command: Runnable) { + command.run() + } } - } val writer: PrintWriter = PrintWriter(StringWriter()) @@ -83,11 +81,9 @@ class CommandRegistryTest : SysuiTestCase() { } class FakeCommand() : Command { - override fun execute(pw: PrintWriter, args: List) { - } + override fun execute(pw: PrintWriter, args: List) {} - override fun help(pw: PrintWriter) { - } + override fun help(pw: PrintWriter) {} } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java index 7bd77a62ffcd..5fce08b08137 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/CallbackHandlerTest.java @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.connectivity; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; -import static org.mockito.Matchers.eq; +import static org.mockito.ArgumentMatchers.eq; import android.os.HandlerThread; import android.telephony.SubscriptionInfo; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index 83dbfa0682ad..b00f9e9f01d3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -25,10 +25,10 @@ import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static junit.framework.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.isA; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isA; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; @@ -297,7 +297,8 @@ public class NetworkControllerBaseTest extends SysuiTestCase { assertNotNull(mDefaultCallbackInWifiTracker); assertNotNull(mDefaultCallbackInNetworkController); verify(mMockCm, atLeastOnce()).registerNetworkCallback( - isA(NetworkRequest.class), callbackArg.capture(), isA(Handler.class)); + isA(NetworkRequest.class), callbackArg.capture(), + isA(Handler.class)); mNetworkCallback = callbackArg.getValue(); assertNotNull(mNetworkCallback); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt index dcd57f137d71..c2460f93b862 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt @@ -17,30 +17,27 @@ package com.android.systemui.statusbar.policy import android.app.NotificationManager -import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper - +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest - import com.android.systemui.SysuiTestCase import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.time.FakeSystemClock - 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.anyString import org.mockito.Mock -import org.mockito.Mockito import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations private fun anyObject(): T { - return Mockito.anyObject() + return any() } -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @RunWithLooper() @SmallTest class BatteryStateNotifierTest : SysuiTestCase() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java index 9bb760760cd7..f91f373dfc2c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SecurityControllerTest.java @@ -22,10 +22,9 @@ import static android.net.NetworkCapabilities.TRANSPORT_VPN; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.anyInt; -import static org.mockito.Matchers.anyObject; -import static org.mockito.Matchers.argThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -120,9 +119,9 @@ public class SecurityControllerTest extends SysuiTestCase { verify(mBroadcastDispatcher).registerReceiverWithHandler( brCaptor.capture(), - anyObject(), - anyObject(), - anyObject()); + any(), + any(), + any()); mBroadcastReceiver = brCaptor.getValue(); } -- GitLab From ccedde80dc50a96073dca1a0ca3faf9b4da90136 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Wed, 16 Oct 2024 16:22:27 -0700 Subject: [PATCH 036/459] Helper to verify ui event has bubble info Create a custom Subject implementation to verify that FakeUiEvent includes the correct fields from a Bubble. Allows us to verify bubble data with one call vs checking 3 fields in every test. Bug: 349845968 Test: atest BubbleBarExpandedViewTest Test: atest UiEventSubjectTest Flag: EXEMPT test only Change-Id: I16e452b6480bd84a2e1a62e011e67950a6417a4a --- .../wm/shell/bubbles/UiEventSubject.kt | 40 +++++ .../wm/shell/bubbles/UiEventSubjectTest.kt | 147 ++++++++++++++++++ .../bubbles/bar/BubbleBarExpandedViewTest.kt | 16 +- 3 files changed, 196 insertions(+), 7 deletions(-) create mode 100644 libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubject.kt create mode 100644 libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubject.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubject.kt new file mode 100644 index 000000000000..2d6df43f67e0 --- /dev/null +++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubject.kt @@ -0,0 +1,40 @@ +/* + * 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.wm.shell.bubbles + +import com.android.internal.logging.testing.UiEventLoggerFake.FakeUiEvent +import com.google.common.truth.FailureMetadata +import com.google.common.truth.Subject +import com.google.common.truth.Truth + +/** Subclass of [Subject] to simplify verifying [FakeUiEvent] data */ +class UiEventSubject(metadata: FailureMetadata, private val actual: FakeUiEvent) : + Subject(metadata, actual) { + + /** Check that [FakeUiEvent] contains the expected data from the [bubble] passed id */ + fun hasBubbleInfo(bubble: Bubble) { + check("uid").that(actual.uid).isEqualTo(bubble.appUid) + check("packageName").that(actual.packageName).isEqualTo(bubble.packageName) + check("instanceId").that(actual.instanceId).isEqualTo(bubble.instanceId) + } + + companion object { + @JvmStatic + fun assertThat(event: FakeUiEvent): UiEventSubject = + Truth.assertAbout(Factory(::UiEventSubject)).that(event) + } +} diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt new file mode 100644 index 000000000000..af238d033aee --- /dev/null +++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/UiEventSubjectTest.kt @@ -0,0 +1,147 @@ +/* + * 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.wm.shell.bubbles + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.internal.logging.InstanceId +import com.android.internal.logging.testing.UiEventLoggerFake +import com.android.internal.logging.testing.UiEventLoggerFake.FakeUiEvent +import com.android.wm.shell.bubbles.UiEventSubject.Companion.assertThat +import com.google.common.truth.ExpectFailure.assertThat +import com.google.common.truth.ExpectFailure.expectFailure +import com.google.common.truth.Subject +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.Mockito.mock +import org.mockito.kotlin.whenever + +/** Test for [UiEventSubject] */ +@SmallTest +@RunWith(AndroidJUnit4::class) +class UiEventSubjectTest { + + private val uiEventSubjectFactory = + Subject.Factory { metadata, actual -> + UiEventSubject(metadata, actual) + } + + private lateinit var uiEventLoggerFake: UiEventLoggerFake + + @Before + fun setUp() { + uiEventLoggerFake = UiEventLoggerFake() + } + + @Test + fun test_bubbleLogEvent_hasBubbleInfo() { + val bubble = + createBubble( + appUid = 1, + packageName = "test", + instanceId = InstanceId.fakeInstanceId(2), + ) + BubbleLogger(uiEventLoggerFake).log(bubble, BubbleLogger.Event.BUBBLE_BAR_BUBBLE_POSTED) + val uiEvent = uiEventLoggerFake.logs.first() + + // Check that fields match the expected values + assertThat(uiEvent.uid).isEqualTo(1) + assertThat(uiEvent.packageName).isEqualTo("test") + assertThat(uiEvent.instanceId.id).isEqualTo(2) + + // Check that hasBubbleInfo condition passes + assertThat(uiEvent).hasBubbleInfo(bubble) + } + + @Test + fun test_bubbleLogEvent_uidMismatch() { + val bubble = + createBubble( + appUid = 1, + packageName = "test", + instanceId = InstanceId.fakeInstanceId(2), + ) + BubbleLogger(uiEventLoggerFake).log(bubble, BubbleLogger.Event.BUBBLE_BAR_BUBBLE_POSTED) + val uiEvent = uiEventLoggerFake.logs.first() + + // Change uid to have a mismatch + val otherBubble = bubble.copy(appUid = 99) + + val failure = expectFailure { test -> + test.about(uiEventSubjectFactory).that(uiEvent).hasBubbleInfo(otherBubble) + } + assertThat(failure).factValue("value of").isEqualTo("uiEvent.uid") + } + + @Test + fun test_bubbleLogEvent_packageNameMismatch() { + val bubble = + createBubble( + appUid = 1, + packageName = "test", + instanceId = InstanceId.fakeInstanceId(2), + ) + BubbleLogger(uiEventLoggerFake).log(bubble, BubbleLogger.Event.BUBBLE_BAR_BUBBLE_POSTED) + val uiEvent = uiEventLoggerFake.logs.first() + + // Change package name to have a mismatch + val otherBubble = bubble.copy(packageName = "somethingelse") + + val failure = expectFailure { test -> + test.about(uiEventSubjectFactory).that(uiEvent).hasBubbleInfo(otherBubble) + } + assertThat(failure).factValue("value of").isEqualTo("uiEvent.packageName") + } + + @Test + fun test_bubbleLogEvent_instanceIdMismatch() { + val bubble = + createBubble( + appUid = 1, + packageName = "test", + instanceId = InstanceId.fakeInstanceId(2), + ) + BubbleLogger(uiEventLoggerFake).log(bubble, BubbleLogger.Event.BUBBLE_BAR_BUBBLE_POSTED) + val uiEvent = uiEventLoggerFake.logs.first() + + // Change instance id to have a mismatch + val otherBubble = bubble.copy(instanceId = InstanceId.fakeInstanceId(99)) + + val failure = expectFailure { test -> + test.about(uiEventSubjectFactory).that(uiEvent).hasBubbleInfo(otherBubble) + } + assertThat(failure).factValue("value of").isEqualTo("uiEvent.instanceId") + } + + private fun createBubble(appUid: Int, packageName: String, instanceId: InstanceId): Bubble { + return mock(Bubble::class.java).apply { + whenever(getAppUid()).thenReturn(appUid) + whenever(getPackageName()).thenReturn(packageName) + whenever(getInstanceId()).thenReturn(instanceId) + } + } + + private fun Bubble.copy( + appUid: Int = this.appUid, + packageName: String = this.packageName, + instanceId: InstanceId = this.instanceId, + ): Bubble { + return createBubble(appUid, packageName, instanceId) + } +} diff --git a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewTest.kt b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewTest.kt index fa9d2baa78d9..08d647de4a51 100644 --- a/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewTest.kt +++ b/libs/WindowManager/Shell/multivalentTests/src/com/android/wm/shell/bubbles/bar/BubbleBarExpandedViewTest.kt @@ -40,6 +40,7 @@ import com.android.wm.shell.bubbles.BubbleTaskView import com.android.wm.shell.bubbles.BubbleTaskViewFactory import com.android.wm.shell.bubbles.DeviceConfig import com.android.wm.shell.bubbles.RegionSamplingProvider +import com.android.wm.shell.bubbles.UiEventSubject.Companion.assertThat import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.shared.bubbles.BubbleBarLocation import com.android.wm.shell.shared.handles.RegionSamplingHelper @@ -47,16 +48,14 @@ import com.android.wm.shell.taskview.TaskView import com.android.wm.shell.taskview.TaskViewTaskController import com.google.common.truth.Truth.assertThat import com.google.common.util.concurrent.MoreExecutors.directExecutor +import java.util.Collections +import java.util.concurrent.Executor import org.junit.After import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.kotlin.mock -import org.mockito.kotlin.spy -import org.mockito.kotlin.verify import org.mockito.kotlin.whenever -import java.util.Collections -import java.util.concurrent.Executor /** Tests for [BubbleBarExpandedViewTest] */ @SmallTest @@ -82,7 +81,7 @@ class BubbleBarExpandedViewTest { private var testableRegionSamplingHelper: TestableRegionSamplingHelper? = null private var regionSamplingProvider: TestRegionSamplingProvider? = null - private val bubbleLogger = spy(BubbleLogger(UiEventLoggerFake())) + private val uiEventLoggerFake = UiEventLoggerFake() @Before fun setUp() { @@ -116,7 +115,7 @@ class BubbleBarExpandedViewTest { bubbleExpandedView.initialize( expandedViewManager, positioner, - bubbleLogger, + BubbleLogger(uiEventLoggerFake), false /* isOverflow */, bubbleTaskView, mainExecutor, @@ -223,7 +222,10 @@ class BubbleBarExpandedViewTest { bubbleExpandedView.findViewWithTag(BubbleBarMenuView.DISMISS_ACTION_TAG) assertThat(dismissMenuItem).isNotNull() getInstrumentation().runOnMainSync { dismissMenuItem.performClick() } - verify(bubbleLogger).log(bubble, BubbleLogger.Event.BUBBLE_BAR_BUBBLE_DISMISSED_APP_MENU) + assertThat(uiEventLoggerFake.numLogs()).isEqualTo(1) + assertThat(uiEventLoggerFake.logs[0].eventId) + .isEqualTo(BubbleLogger.Event.BUBBLE_BAR_BUBBLE_DISMISSED_APP_MENU.id) + assertThat(uiEventLoggerFake.logs[0]).hasBubbleInfo(bubble) } private inner class FakeBubbleTaskViewFactory : BubbleTaskViewFactory { -- GitLab From 6e15198b5588fb9c4074a39b2d32e9461ede0a08 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 09:07:03 +0000 Subject: [PATCH 037/459] Turn PerfettoProtoLogImpl class into abstract class to support both a version for processed and unprocessed protologs Bug: 369052956 Flag: EXEMPT minor refactor Test: atest TracingTests Change-Id: Ib872eaba62fb0d4d2dc6d64cc0546b3663b3675f --- .../protolog/PerfettoProtoLogImpl.java | 200 ++---------------- 1 file changed, 21 insertions(+), 179 deletions(-) diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java index a037cb421b0c..318f79074cb7 100644 --- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java @@ -60,18 +60,16 @@ import android.util.ArraySet; import android.util.Log; import android.util.LongArray; import android.util.Slog; -import android.util.proto.ProtoInputStream; import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs; import com.android.internal.protolog.common.ILogger; import com.android.internal.protolog.common.IProtoLog; import com.android.internal.protolog.common.IProtoLogGroup; import com.android.internal.protolog.common.LogDataType; import com.android.internal.protolog.common.LogLevel; -import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; @@ -93,26 +91,18 @@ import java.util.stream.Stream; /** * A service for the ProtoLog logging system. */ -public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProtoLog { +public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProtoLog { private static final String LOG_TAG = "ProtoLog"; public static final String NULL_STRING = "null"; private final AtomicInteger mTracingInstances = new AtomicInteger(); @NonNull - private final ProtoLogDataSource mDataSource; - @Nullable - private final ProtoLogViewerConfigReader mViewerConfigReader; - @Deprecated - @Nullable - private final ViewerConfigInputStreamProvider mViewerConfigInputStreamProvider; + protected final ProtoLogDataSource mDataSource; @NonNull - private final TreeMap mLogGroups = new TreeMap<>(); + protected final TreeMap mLogGroups = new TreeMap<>(); @NonNull private final Runnable mCacheUpdater; - @Nullable // null when the flag android.tracing.client_side_proto_logging is not flipped - private final IProtoLogConfigurationService mProtoLogConfigurationService; - @NonNull private final int[] mDefaultLogLevelCounts = new int[LogLevel.values().length]; @NonNull @@ -121,68 +111,12 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto private final Map mCollectStackTraceGroupCounts = new ArrayMap<>(); private final Lock mBackgroundServiceLock = new ReentrantLock(); - private ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor(); - - public PerfettoProtoLogImpl(@NonNull IProtoLogGroup[] groups) - throws ServiceManager.ServiceNotFoundException { - this(null, null, null, () -> {}, groups); - } - - public PerfettoProtoLogImpl(@NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) - throws ServiceManager.ServiceNotFoundException { - this(null, null, null, cacheUpdater, groups); - } - - public PerfettoProtoLogImpl( - @NonNull String viewerConfigFilePath, - @NonNull Runnable cacheUpdater, - @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { - this(viewerConfigFilePath, - null, - new ProtoLogViewerConfigReader(() -> { - try { - return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); - } catch (FileNotFoundException e) { - throw new RuntimeException( - "Failed to load viewer config file " + viewerConfigFilePath, e); - } - }), - cacheUpdater, groups); - } - - @Deprecated - @VisibleForTesting - public PerfettoProtoLogImpl( - @Nullable ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, - @Nullable ProtoLogViewerConfigReader viewerConfigReader, - @NonNull Runnable cacheUpdater, - @NonNull IProtoLogGroup[] groups, - @NonNull ProtoLogDataSourceBuilder dataSourceBuilder, - @NonNull ProtoLogConfigurationService configurationService) { - this(null, viewerConfigInputStreamProvider, viewerConfigReader, cacheUpdater, - groups, dataSourceBuilder, configurationService); - } + protected ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor(); - @VisibleForTesting - public PerfettoProtoLogImpl( - @Nullable String viewerConfigFilePath, - @Nullable ProtoLogViewerConfigReader viewerConfigReader, - @NonNull Runnable cacheUpdater, - @NonNull IProtoLogGroup[] groups, - @NonNull ProtoLogDataSourceBuilder dataSourceBuilder, - @NonNull ProtoLogConfigurationService configurationService) { - this(viewerConfigFilePath, null, viewerConfigReader, cacheUpdater, - groups, dataSourceBuilder, configurationService); - } - - private PerfettoProtoLogImpl( - @Nullable String viewerConfigFilePath, - @Nullable ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, - @Nullable ProtoLogViewerConfigReader viewerConfigReader, + protected PerfettoProtoLogImpl( @NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { - this(viewerConfigFilePath, viewerConfigInputStreamProvider, viewerConfigReader, - cacheUpdater, groups, + this(cacheUpdater, groups, ProtoLogDataSource::new, android.tracing.Flags.clientSideProtoLogging() ? IProtoLogConfigurationService.Stub.asInterface( @@ -191,19 +125,11 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto ); } - private PerfettoProtoLogImpl( - @Nullable String viewerConfigFilePath, - @Nullable ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, - @Nullable ProtoLogViewerConfigReader viewerConfigReader, + protected PerfettoProtoLogImpl( @NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups, @NonNull ProtoLogDataSourceBuilder dataSourceBuilder, @Nullable IProtoLogConfigurationService configurationService) { - if (viewerConfigFilePath != null && viewerConfigInputStreamProvider != null) { - throw new RuntimeException("Only one of viewerConfigFilePath and " - + "viewerConfigInputStreamProvider can be set"); - } - mDataSource = dataSourceBuilder.build( this::onTracingInstanceStart, this::onTracingFlush, @@ -219,55 +145,33 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto // for some messages logged right after the construction of this class. mDataSource.register(params); - if (viewerConfigInputStreamProvider == null && viewerConfigFilePath != null) { - viewerConfigInputStreamProvider = new ViewerConfigInputStreamProvider() { - @NonNull - @Override - public ProtoInputStream getInputStream() { - try { - return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); - } catch (FileNotFoundException e) { - throw new RuntimeException( - "Failed to load viewer config file " + viewerConfigFilePath, e); - } - } - }; - } - - this.mViewerConfigInputStreamProvider = viewerConfigInputStreamProvider; - this.mViewerConfigReader = viewerConfigReader; this.mCacheUpdater = cacheUpdater; registerGroupsLocally(groups); if (android.tracing.Flags.clientSideProtoLogging()) { - mProtoLogConfigurationService = configurationService; - Objects.requireNonNull(mProtoLogConfigurationService, + Objects.requireNonNull(configurationService, "A null ProtoLog Configuration Service was provided!"); try { - var args = new ProtoLogConfigurationServiceImpl.RegisterClientArgs(); - - if (viewerConfigFilePath != null) { - args.setViewerConfigFile(viewerConfigFilePath); - } + var args = createConfigurationServiceRegisterClientArgs(); final var groupArgs = Stream.of(groups) - .map(group -> new ProtoLogConfigurationServiceImpl.RegisterClientArgs + .map(group -> new RegisterClientArgs .GroupConfig(group.name(), group.isLogToLogcat())) - .toArray(ProtoLogConfigurationServiceImpl - .RegisterClientArgs.GroupConfig[]::new); + .toArray(RegisterClientArgs.GroupConfig[]::new); args.setGroups(groupArgs); - mProtoLogConfigurationService.registerClient(this, args); + configurationService.registerClient(this, args); } catch (RemoteException e) { throw new RuntimeException("Failed to register ProtoLog client"); } - } else { - mProtoLogConfigurationService = null; } } + @NonNull + protected abstract RegisterClientArgs createConfigurationServiceRegisterClientArgs(); + /** * Main log method, do not call directly. */ @@ -334,9 +238,6 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto * @return status code */ public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { - if (mViewerConfigReader != null) { - mViewerConfigReader.loadViewerConfig(groups, logger); - } return setTextLogging(true, logger, groups); } @@ -347,9 +248,6 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto * @return status code */ public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { - if (mViewerConfigReader != null) { - mViewerConfigReader.unloadViewerConfig(groups, logger); - } return setTextLogging(false, logger, groups); } @@ -372,21 +270,8 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto // we might want to manually specify an id for the group with a collision verifyNoCollisionsOrDuplicates(protoLogGroups); - final var groupsLoggingToLogcat = new ArrayList(); for (IProtoLogGroup protoLogGroup : protoLogGroups) { mLogGroups.put(protoLogGroup.name(), protoLogGroup); - - if (protoLogGroup.isLogToLogcat()) { - groupsLoggingToLogcat.add(protoLogGroup.name()); - } - } - - if (mViewerConfigReader != null) { - // Load in background to avoid delay in boot process. - // The caveat is that any log message that is also logged to logcat will not be - // successfully decoded until this completes. - mBackgroundLoggingService.execute(() -> mViewerConfigReader - .loadViewerConfig(groupsLoggingToLogcat.toArray(new String[0]))); } } @@ -499,57 +384,14 @@ public class PerfettoProtoLogImpl extends IProtoLogClient.Stub implements IProto } @Deprecated - private void dumpViewerConfig() { - if (mViewerConfigInputStreamProvider == null) { - // No viewer config available - return; - } - - Log.d(LOG_TAG, "Dumping viewer config to trace"); + abstract void dumpViewerConfig(); - Utils.dumpViewerConfig(mDataSource, mViewerConfigInputStreamProvider); - - Log.d(LOG_TAG, "Dumped viewer config to trace"); - } + @NonNull + abstract String getLogcatMessageString(@NonNull Message message); - private void logToLogcat(String tag, LogLevel level, Message message, + private void logToLogcat(@NonNull String tag, @NonNull LogLevel level, @NonNull Message message, @Nullable Object[] args) { - String messageString; - if (mViewerConfigReader == null) { - messageString = message.getMessage(); - - if (messageString == null) { - Log.e(LOG_TAG, "Failed to decode message for logcat. " - + "Message not available without ViewerConfig to decode the hash."); - } - } else { - messageString = message.getMessage(mViewerConfigReader); - - if (messageString == null) { - Log.e(LOG_TAG, "Failed to decode message for logcat. " - + "Message hash either not available in viewerConfig file or " - + "not loaded into memory from file before decoding."); - } - } - - if (messageString == null) { - StringBuilder builder = new StringBuilder("UNKNOWN MESSAGE"); - if (args != null) { - builder.append(" args = ("); - builder.append(String.join(", ", Arrays.stream(args) - .map(it -> { - if (it == null) { - return "null"; - } else { - return it.toString(); - } - }).toList())); - builder.append(")"); - } - messageString = builder.toString(); - args = new Object[0]; - } - + String messageString = getLogcatMessageString(message); logToLogcat(tag, level, messageString, args); } -- GitLab From 8a0bd27d26c055bda3c43585179c4f14df6d4ea3 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 08:55:48 +0000 Subject: [PATCH 038/459] Create ProcessedPerfettoProtoLogImpl class Bug: 369052956 Flag: EXEMPT minor refactor Test: atest TracingTests Change-Id: I8e82136479a14e985c1a1277636bc9d68cfcfcfa --- .../ProcessedPerfettoProtoLogImpl.java | 168 ++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java diff --git a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java new file mode 100644 index 000000000000..040d9545b2a8 --- /dev/null +++ b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java @@ -0,0 +1,168 @@ +/* + * 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.internal.protolog; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.os.ServiceManager; +import android.util.Log; +import android.util.proto.ProtoInputStream; + +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs; +import com.android.internal.protolog.common.ILogger; +import com.android.internal.protolog.common.IProtoLogGroup; + +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.ArrayList; + +public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { + private static final String LOG_TAG = "PerfettoProtoLogImpl"; + + @NonNull + private final ProtoLogViewerConfigReader mViewerConfigReader; + @Deprecated + @NonNull + private final ViewerConfigInputStreamProvider mViewerConfigInputStreamProvider; + @NonNull + private final String mViewerConfigFilePath; + + public ProcessedPerfettoProtoLogImpl( + @NonNull String viewerConfigFilePath, + @NonNull Runnable cacheUpdater, + @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { + this(viewerConfigFilePath, new ViewerConfigInputStreamProvider() { + @androidx.annotation.NonNull + @Override + public ProtoInputStream getInputStream() { + try { + return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); + } catch (FileNotFoundException e) { + throw new RuntimeException( + "Failed to load viewer config file " + viewerConfigFilePath, e); + } + } + }, + cacheUpdater, groups); + } + + private ProcessedPerfettoProtoLogImpl( + @NonNull String viewerConfigFilePath, + @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, + @NonNull Runnable cacheUpdater, + @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { + super(cacheUpdater, groups); + + this.mViewerConfigFilePath = viewerConfigFilePath; + + this.mViewerConfigInputStreamProvider = viewerConfigInputStreamProvider; + this.mViewerConfigReader = new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider); + + loadLogcatGroupsViewerConfig(groups); + } + + @VisibleForTesting + public ProcessedPerfettoProtoLogImpl( + @NonNull String viewerConfigFilePath, + @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, + @NonNull ProtoLogViewerConfigReader viewerConfigReader, + @NonNull Runnable cacheUpdater, + @NonNull IProtoLogGroup[] groups, + @NonNull ProtoLogDataSourceBuilder dataSourceBuilder, + @Nullable IProtoLogConfigurationService configurationService) + throws ServiceManager.ServiceNotFoundException { + super(cacheUpdater, groups, dataSourceBuilder, configurationService); + + this.mViewerConfigFilePath = viewerConfigFilePath; + + this.mViewerConfigInputStreamProvider = viewerConfigInputStreamProvider; + this.mViewerConfigReader = viewerConfigReader; + + loadLogcatGroupsViewerConfig(groups); + } + + @NonNull + @Override + protected RegisterClientArgs createConfigurationServiceRegisterClientArgs() { + return new RegisterClientArgs() + .setViewerConfigFile(mViewerConfigFilePath); + } + + /** + * Start text logging + * @param groups Groups to start text logging for + * @param logger A logger to write status updates to + * @return status code + */ + @Override + public int startLoggingToLogcat(String[] groups, @NonNull ILogger logger) { + mViewerConfigReader.loadViewerConfig(groups, logger); + return super.startLoggingToLogcat(groups, logger); + } + + /** + * Stop text logging + * @param groups Groups to start text logging for + * @param logger A logger to write status updates to + * @return status code + */ + @Override + public int stopLoggingToLogcat(String[] groups, @NonNull ILogger logger) { + mViewerConfigReader.unloadViewerConfig(groups, logger); + return super.stopLoggingToLogcat(groups, logger); + } + + @Deprecated + @Override + void dumpViewerConfig() { + Log.d(LOG_TAG, "Dumping viewer config to trace"); + Utils.dumpViewerConfig(mDataSource, mViewerConfigInputStreamProvider); + Log.d(LOG_TAG, "Dumped viewer config to trace"); + } + + @NonNull + @Override + String getLogcatMessageString(@NonNull Message message) { + String messageString; + messageString = message.getMessage(mViewerConfigReader); + + if (messageString == null) { + throw new RuntimeException("Failed to decode message for logcat. " + + "Message hash (" + message.getMessageHash() + ") either not available in " + + "viewerConfig file (" + mViewerConfigFilePath + ") or " + + "not loaded into memory from file before decoding."); + } + + return messageString; + } + + private void loadLogcatGroupsViewerConfig(@NonNull IProtoLogGroup[] protoLogGroups) { + final var groupsLoggingToLogcat = new ArrayList(); + for (IProtoLogGroup protoLogGroup : protoLogGroups) { + if (protoLogGroup.isLogToLogcat()) { + groupsLoggingToLogcat.add(protoLogGroup.name()); + } + } + + // Load in background to avoid delay in boot process. + // The caveat is that any log message that is also logged to logcat will not be + // successfully decoded until this completes. + mBackgroundLoggingService.execute(() -> mViewerConfigReader + .loadViewerConfig(groupsLoggingToLogcat.toArray(new String[0]))); + } +} -- GitLab From ab70dbe7e1e53fc039c7bd266613cb8e3af1a317 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 09:09:45 +0000 Subject: [PATCH 039/459] Implement unprocessed version of PerfettoProtoLogImpl Bug: 369052956 Flag: EXEMPT minor refactor Test: atest TracingTests Change-Id: I844024d082f3358f3c2ecb15f81446c220013893 --- .../UnprocessedPerfettoProtoLogImpl.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java diff --git a/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java new file mode 100644 index 000000000000..10e6cefcc79c --- /dev/null +++ b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java @@ -0,0 +1,60 @@ +/* + * 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.internal.protolog; + +import android.annotation.NonNull; +import android.os.ServiceManager; + +import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs; +import com.android.internal.protolog.common.IProtoLogGroup; + +public class UnprocessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { + public UnprocessedPerfettoProtoLogImpl(@NonNull IProtoLogGroup[] groups) + throws ServiceManager.ServiceNotFoundException { + this(() -> {}, groups); + } + + public UnprocessedPerfettoProtoLogImpl(@NonNull Runnable cacheUpdater, + @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { + super(cacheUpdater, groups); + } + + @NonNull + @Override + protected RegisterClientArgs createConfigurationServiceRegisterClientArgs() { + return new RegisterClientArgs(); + } + + @Override + void dumpViewerConfig() { + // No-op + } + + @NonNull + @Override + String getLogcatMessageString(@NonNull Message message) { + String messageString; + messageString = message.getMessage(); + + if (messageString == null) { + throw new RuntimeException("Failed to decode message for logcat. " + + "Message not available without ViewerConfig to decode the hash."); + } + + return messageString; + } +} -- GitLab From 3228b8806d7deeb086cd5886ea54dedc2282fbd1 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 09:37:50 +0000 Subject: [PATCH 040/459] Update tests We now throw when we cannot get the log message for a protolog Flag: TEST_ONLY Test: atest TracingTests Change-Id: Ib0308c8da07aba0f6c1f54fef0fe31eff689ddec --- apct-tests/perftests/tracing/Android.bp | 1 + .../internal/protolog/ProtoLogPerfTest.java | 37 ++++++++++++++--- .../ProcessedPerfettoProtoLogImpl.java | 3 +- ...=> ProcessedPerfettoProtoLogImplTest.java} | 41 ++++++++----------- .../internal/protolog/ProtoLogTest.java | 10 ++--- 5 files changed, 56 insertions(+), 36 deletions(-) rename tests/Tracing/src/com/android/internal/protolog/{PerfettoProtoLogImplTest.java => ProcessedPerfettoProtoLogImplTest.java} (96%) diff --git a/apct-tests/perftests/tracing/Android.bp b/apct-tests/perftests/tracing/Android.bp index 08e365be514a..8814216644d7 100644 --- a/apct-tests/perftests/tracing/Android.bp +++ b/apct-tests/perftests/tracing/Android.bp @@ -22,6 +22,7 @@ android_test { "apct-perftests-utils", "collector-device-lib", "platform-test-annotations", + "perfetto_trace_java_protos", ], test_suites: [ "device-tests", diff --git a/apct-tests/perftests/tracing/src/com/android/internal/protolog/ProtoLogPerfTest.java b/apct-tests/perftests/tracing/src/com/android/internal/protolog/ProtoLogPerfTest.java index f4759b8bd35c..7ef8c53d1d62 100644 --- a/apct-tests/perftests/tracing/src/com/android/internal/protolog/ProtoLogPerfTest.java +++ b/apct-tests/perftests/tracing/src/com/android/internal/protolog/ProtoLogPerfTest.java @@ -17,10 +17,12 @@ package com.android.internal.protolog; import android.app.Activity; import android.os.Bundle; +import android.os.ServiceManager.ServiceNotFoundException; import android.perftests.utils.Stats; import androidx.test.InstrumentationRegistry; +import com.android.internal.protolog.common.IProtoLog; import com.android.internal.protolog.common.IProtoLogGroup; import com.android.internal.protolog.common.LogLevel; @@ -31,6 +33,8 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; +import perfetto.protos.ProtologCommon; + import java.util.ArrayList; import java.util.Collection; @@ -65,24 +69,48 @@ public class ProtoLogPerfTest { }; } + private IProtoLog mProcessedProtoLogger; + private static final String MOCK_TEST_FILE_PATH = "mock/file/path"; + private static final perfetto.protos.Protolog.ProtoLogViewerConfig VIEWER_CONFIG = + perfetto.protos.Protolog.ProtoLogViewerConfig.newBuilder() + .addGroups( + perfetto.protos.Protolog.ProtoLogViewerConfig.Group.newBuilder() + .setId(1) + .setName(TestProtoLogGroup.TEST_GROUP.toString()) + .setTag(TestProtoLogGroup.TEST_GROUP.getTag()) + ).addMessages( + perfetto.protos.Protolog.ProtoLogViewerConfig.MessageData.newBuilder() + .setMessageId(123) + .setMessage("My Test Debug Log Message %b") + .setLevel(ProtologCommon.ProtoLogLevel.PROTOLOG_LEVEL_DEBUG) + .setGroupId(1) + .setLocation("com/test/MyTestClass.java:123") + ).build(); + @BeforeClass public static void init() { ProtoLog.init(TestProtoLogGroup.values()); } @Before - public void setUp() { + public void setUp() throws ServiceNotFoundException { TestProtoLogGroup.TEST_GROUP.setLogToProto(mLogToProto); TestProtoLogGroup.TEST_GROUP.setLogToLogcat(mLogToLogcat); + + mProcessedProtoLogger = new ProcessedPerfettoProtoLogImpl( + MOCK_TEST_FILE_PATH, + () -> new AutoClosableProtoInputStream(VIEWER_CONFIG.toByteArray()), + () -> {}, + TestProtoLogGroup.values() + ); } @Test public void log_Processed_NoArgs() { - final var protoLog = ProtoLog.getSingleInstance(); final var perfMonitor = new PerfMonitor(); while (perfMonitor.keepRunning()) { - protoLog.log( + mProcessedProtoLogger.log( LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 123, 0, (Object[]) null); } @@ -90,11 +118,10 @@ public class ProtoLogPerfTest { @Test public void log_Processed_WithArgs() { - final var protoLog = ProtoLog.getSingleInstance(); final var perfMonitor = new PerfMonitor(); while (perfMonitor.keepRunning()) { - protoLog.log( + mProcessedProtoLogger.log( LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 123, 0b1110101001010100, new Object[]{"test", 1, 2, 3, 0.4, 0.5, 0.6, true}); diff --git a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java index 040d9545b2a8..9ec22a203a2e 100644 --- a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java @@ -61,7 +61,8 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { cacheUpdater, groups); } - private ProcessedPerfettoProtoLogImpl( + @VisibleForTesting + public ProcessedPerfettoProtoLogImpl( @NonNull String viewerConfigFilePath, @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider, @NonNull Runnable cacheUpdater, diff --git a/tests/Tracing/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java b/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java similarity index 96% rename from tests/Tracing/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java rename to tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java index 6f3deab1d4fa..794cdad66075 100644 --- a/tests/Tracing/src/com/android/internal/protolog/PerfettoProtoLogImplTest.java +++ b/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java @@ -40,7 +40,6 @@ import android.tools.traces.io.ResultWriter; import android.tools.traces.monitors.PerfettoTraceMonitor; import android.tools.traces.protolog.ProtoLogTrace; import android.tracing.perfetto.DataSource; -import android.util.proto.ProtoInputStream; import androidx.test.platform.app.InstrumentationRegistry; @@ -74,7 +73,7 @@ import java.util.concurrent.atomic.AtomicInteger; @SuppressWarnings("ConstantConditions") @Presubmit @RunWith(JUnit4.class) -public class PerfettoProtoLogImplTest { +public class ProcessedPerfettoProtoLogImplTest { private static final String TEST_PROTOLOG_DATASOURCE_NAME = "test.android.protolog"; private static final String MOCK_VIEWER_CONFIG_FILE = "my/mock/viewer/config/file.pb"; private final File mTracingDirectory = InstrumentationRegistry.getInstrumentation() @@ -100,7 +99,7 @@ public class PerfettoProtoLogImplTest { private static ProtoLogViewerConfigReader sReader; - public PerfettoProtoLogImplTest() throws IOException { + public ProcessedPerfettoProtoLogImplTest() throws IOException { } @BeforeClass @@ -151,7 +150,8 @@ public class PerfettoProtoLogImplTest { ViewerConfigInputStreamProvider viewerConfigInputStreamProvider = Mockito.mock( ViewerConfigInputStreamProvider.class); Mockito.when(viewerConfigInputStreamProvider.getInputStream()) - .thenAnswer(it -> new ProtoInputStream(sViewerConfigBuilder.build().toByteArray())); + .thenAnswer(it -> new AutoClosableProtoInputStream( + sViewerConfigBuilder.build().toByteArray())); sCacheUpdater = () -> {}; sReader = Mockito.spy(new ProtoLogViewerConfigReader(viewerConfigInputStreamProvider)); @@ -171,15 +171,10 @@ public class PerfettoProtoLogImplTest { sProtoLogConfigurationService = new ProtoLogConfigurationServiceImpl(dataSourceBuilder, tracer); - if (android.tracing.Flags.clientSideProtoLogging()) { - sProtoLog = new PerfettoProtoLogImpl( - MOCK_VIEWER_CONFIG_FILE, sReader, () -> sCacheUpdater.run(), - TestProtoLogGroup.values(), dataSourceBuilder, sProtoLogConfigurationService); - } else { - sProtoLog = new PerfettoProtoLogImpl( - viewerConfigInputStreamProvider, sReader, () -> sCacheUpdater.run(), - TestProtoLogGroup.values(), dataSourceBuilder, sProtoLogConfigurationService); - } + sProtoLog = new ProcessedPerfettoProtoLogImpl( + MOCK_VIEWER_CONFIG_FILE, viewerConfigInputStreamProvider, sReader, + () -> sCacheUpdater.run(), TestProtoLogGroup.values(), dataSourceBuilder, + sProtoLogConfigurationService); busyWaitForDataSourceRegistration(TEST_PROTOLOG_DATASOURCE_NAME); } @@ -398,18 +393,17 @@ public class PerfettoProtoLogImplTest { } @Test - public void log_logcatEnabledNoMessage() { + public void log_logcatEnabledNoMessageThrows() { when(sReader.getViewerString(anyLong())).thenReturn(null); PerfettoProtoLogImpl implSpy = Mockito.spy(sProtoLog); TestProtoLogGroup.TEST_GROUP.setLogToLogcat(true); TestProtoLogGroup.TEST_GROUP.setLogToProto(false); - implSpy.log(LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, - new Object[]{5}); - - verify(implSpy).passToLogcat(eq(TestProtoLogGroup.TEST_GROUP.getTag()), eq( - LogLevel.INFO), eq("UNKNOWN MESSAGE args = (5)")); - verify(sReader).getViewerString(eq(1234L)); + var assertion = assertThrows(RuntimeException.class, () -> + implSpy.log(LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, 1234, 4321, + new Object[]{5})); + Truth.assertThat(assertion).hasMessageThat() + .contains("Failed to decode message for logcat"); } @Test @@ -539,16 +533,12 @@ public class PerfettoProtoLogImplTest { PerfettoTraceMonitor traceMonitor = PerfettoTraceMonitor.newBuilder() .enableProtoLog(TEST_PROTOLOG_DATASOURCE_NAME) .build(); - long before; - long after; try { traceMonitor.start(); - before = SystemClock.elapsedRealtimeNanos(); sProtoLog.log( LogLevel.INFO, TestProtoLogGroup.TEST_GROUP, messageHash, 0b01100100, new Object[]{"test", 1, 0.1, true}); - after = SystemClock.elapsedRealtimeNanos(); } finally { traceMonitor.stop(mWriter); } @@ -606,7 +596,8 @@ public class PerfettoProtoLogImplTest { Truth.assertThat(stacktrace).doesNotContain(DataSource.class.getSimpleName() + ".java"); Truth.assertThat(stacktrace) .doesNotContain(ProtoLogImpl.class.getSimpleName() + ".java"); - Truth.assertThat(stacktrace).contains(PerfettoProtoLogImplTest.class.getSimpleName()); + Truth.assertThat(stacktrace) + .contains(ProcessedPerfettoProtoLogImplTest.class.getSimpleName()); Truth.assertThat(stacktrace).contains("stackTraceTrimmed"); } diff --git a/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java b/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java index 8ecddaa76216..3d1e208189b0 100644 --- a/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java +++ b/tests/Tracing/src/com/android/internal/protolog/ProtoLogTest.java @@ -47,12 +47,12 @@ public class ProtoLogTest { } @Test - public void throwOnRegisteringDuplicateGroup() { - final var assertion = assertThrows(RuntimeException.class, - () -> ProtoLog.init(TEST_GROUP_1, TEST_GROUP_1, TEST_GROUP_2)); + public void deduplicatesRegisteringDuplicateGroup() { + ProtoLog.init(TEST_GROUP_1, TEST_GROUP_1, TEST_GROUP_2); - Truth.assertThat(assertion).hasMessageThat().contains("" + TEST_GROUP_1.getId()); - Truth.assertThat(assertion).hasMessageThat().contains("duplicate"); + final var instance = ProtoLog.getSingleInstance(); + Truth.assertThat(instance.getRegisteredGroups()) + .containsExactly(TEST_GROUP_1, TEST_GROUP_2); } @Test -- GitLab From 6257d935827628a00674326c23bddb6c45fe979f Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 09:44:48 +0000 Subject: [PATCH 041/459] Update PerfettoProtoLogImpl constructor usages to use unprocessed and processed implementations where relevant Bug: 369052956 Test: atest TracingTests Flag: EXEMPT minor refactor Change-Id: Iec12159590be9b3cc08eb2a94f26215556d2b53a --- core/java/com/android/internal/protolog/ProtoLog.java | 2 +- core/java/com/android/internal/protolog/ProtoLogImpl.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/java/com/android/internal/protolog/ProtoLog.java b/core/java/com/android/internal/protolog/ProtoLog.java index 60213b1830c6..a7101004e033 100644 --- a/core/java/com/android/internal/protolog/ProtoLog.java +++ b/core/java/com/android/internal/protolog/ProtoLog.java @@ -79,7 +79,7 @@ public class ProtoLog { } try { - sProtoLogInstance = new PerfettoProtoLogImpl(groups); + sProtoLogInstance = new UnprocessedPerfettoProtoLogImpl(groups); } catch (ServiceManager.ServiceNotFoundException e) { throw new RuntimeException(e); } diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java index 5d67534b1b44..53ee0e232d7e 100644 --- a/core/java/com/android/internal/protolog/ProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java @@ -117,10 +117,11 @@ public class ProtoLogImpl { + ProtoLogImpl.class.getSimpleName() + ". " + "Setting up without a viewer config instead..."); - sServiceInstance = new PerfettoProtoLogImpl(sCacheUpdater, groups); - } else { sServiceInstance = - new PerfettoProtoLogImpl(sViewerConfigPath, sCacheUpdater, groups); + new UnprocessedPerfettoProtoLogImpl(sCacheUpdater, groups); + } else { + sServiceInstance = new ProcessedPerfettoProtoLogImpl( + sViewerConfigPath, sCacheUpdater, groups); } } catch (ServiceManager.ServiceNotFoundException e) { throw new RuntimeException(e); -- GitLab From 828149e62080e1d78be77e9dfea752c95d5f8706 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 14:10:24 +0000 Subject: [PATCH 042/459] Don't try to log to logcat before the service is ready to trace messages to logcat This means we need to wait for the relevant parts of the viewer config to be loaded into memory. Flag: EXEMPT minor bug fix Bug: 369052956 Test: atest TracingTests Change-Id: I1472eaccb309ac6b3eccbf4a6b58aab8dc51b9b1 --- .../internal/protolog/PerfettoProtoLogImpl.java | 14 ++++++++++++++ .../protolog/ProcessedPerfettoProtoLogImpl.java | 6 ++++-- .../protolog/UnprocessedPerfettoProtoLogImpl.java | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java index 318f79074cb7..a1c987f79304 100644 --- a/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/PerfettoProtoLogImpl.java @@ -113,6 +113,9 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen private final Lock mBackgroundServiceLock = new ReentrantLock(); protected ExecutorService mBackgroundLoggingService = Executors.newSingleThreadExecutor(); + // Set to true once this is ready to accept protolog to logcat requests. + private boolean mLogcatReady = false; + protected PerfettoProtoLogImpl( @NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { @@ -288,6 +291,10 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen } } + protected void readyToLogToLogcat() { + mLogcatReady = true; + } + /** * Responds to a shell command. */ @@ -391,6 +398,13 @@ public abstract class PerfettoProtoLogImpl extends IProtoLogClient.Stub implemen private void logToLogcat(@NonNull String tag, @NonNull LogLevel level, @NonNull Message message, @Nullable Object[] args) { + if (!mLogcatReady) { + Log.w(LOG_TAG, "Trying to log a protolog message with hash " + + message.getMessageHash() + " to logcat before the service is ready to accept " + + "such requests."); + return; + } + String messageString = getLogcatMessageString(message); logToLogcat(tag, level, messageString, args); } diff --git a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java index 9ec22a203a2e..7bcfd1182f05 100644 --- a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java @@ -163,7 +163,9 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { // Load in background to avoid delay in boot process. // The caveat is that any log message that is also logged to logcat will not be // successfully decoded until this completes. - mBackgroundLoggingService.execute(() -> mViewerConfigReader - .loadViewerConfig(groupsLoggingToLogcat.toArray(new String[0]))); + mBackgroundLoggingService.execute(() -> { + mViewerConfigReader.loadViewerConfig(groupsLoggingToLogcat.toArray(new String[0])); + readyToLogToLogcat(); + }); } } diff --git a/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java index 10e6cefcc79c..f3fe58070fa9 100644 --- a/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/UnprocessedPerfettoProtoLogImpl.java @@ -31,6 +31,7 @@ public class UnprocessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { public UnprocessedPerfettoProtoLogImpl(@NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { super(cacheUpdater, groups); + readyToLogToLogcat(); } @NonNull -- GitLab From e67c19f3d2cf00086e878bbfa5427d59632bcb45 Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Fri, 27 Sep 2024 14:26:53 +0000 Subject: [PATCH 043/459] Simplify nested logic Flag: EXEMPT minor refactor Test: atest TracingTests Change-Id: I90b1002782d4a7db46bee465a3fb1e9d7914a2b6 --- .../internal/protolog/ProtoLogImpl.java | 54 ++++++++++--------- 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java index 53ee0e232d7e..43fce5d281ec 100644 --- a/core/java/com/android/internal/protolog/ProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java @@ -105,32 +105,10 @@ public class ProtoLogImpl { + "viewerConfigPath = " + sViewerConfigPath); final var groups = sLogGroups.values().toArray(new IProtoLogGroup[0]); - if (android.tracing.Flags.perfettoProtologTracing()) { - try { - File f = new File(sViewerConfigPath); - if (!ProtoLog.REQUIRE_PROTOLOGTOOL && !f.exists()) { - // TODO(b/353530422): Remove - temporary fix to unblock b/352290057 - // In some tests the viewer config file might not exist in which we don't - // want to provide config path to the user - Log.w(LOG_TAG, "Failed to find viewerConfigFile when setting up " - + ProtoLogImpl.class.getSimpleName() + ". " - + "Setting up without a viewer config instead..."); - - sServiceInstance = - new UnprocessedPerfettoProtoLogImpl(sCacheUpdater, groups); - } else { - sServiceInstance = new ProcessedPerfettoProtoLogImpl( - sViewerConfigPath, sCacheUpdater, groups); - } - } catch (ServiceManager.ServiceNotFoundException e) { - throw new RuntimeException(e); - } + sServiceInstance = createPerfettoProtoLogImpl(groups); } else { - var protologImpl = new LegacyProtoLogImpl( - sLegacyOutputFilePath, sLegacyViewerConfigPath, sCacheUpdater); - protologImpl.registerGroups(groups); - sServiceInstance = protologImpl; + sServiceInstance = createLegacyProtoLogImpl(groups); } sCacheUpdater.run(); @@ -138,6 +116,34 @@ public class ProtoLogImpl { return sServiceInstance; } + private static PerfettoProtoLogImpl createPerfettoProtoLogImpl(IProtoLogGroup[] groups) { + try { + File f = new File(sViewerConfigPath); + if (!ProtoLog.REQUIRE_PROTOLOGTOOL && !f.exists()) { + // TODO(b/353530422): Remove - temporary fix to unblock b/352290057 + // In some tests the viewer config file might not exist in which we don't + // want to provide config path to the user + Log.w(LOG_TAG, "Failed to find viewerConfigFile when setting up " + + ProtoLogImpl.class.getSimpleName() + ". " + + "Setting up without a viewer config instead..."); + + return new UnprocessedPerfettoProtoLogImpl(sCacheUpdater, groups); + } else { + return new ProcessedPerfettoProtoLogImpl(sViewerConfigPath, sCacheUpdater, groups); + } + } catch (ServiceManager.ServiceNotFoundException e) { + throw new RuntimeException(e); + } + } + + private static LegacyProtoLogImpl createLegacyProtoLogImpl(IProtoLogGroup[] groups) { + var protologImpl = new LegacyProtoLogImpl( + sLegacyOutputFilePath, sLegacyViewerConfigPath, sCacheUpdater); + protologImpl.registerGroups(groups); + + return protologImpl; + } + @VisibleForTesting public static synchronized void setSingleInstance(@Nullable IProtoLog instance) { sServiceInstance = instance; -- GitLab From 1ef32e9b36f6eb29dcfb360697ebd757ba84db7f Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Mon, 30 Sep 2024 12:36:12 +0000 Subject: [PATCH 044/459] Wrap ProtoInputStream in autoclosable class This is to ensure that we always properly close the input file we are using to read the proto data from. Bug: 348142756 Flag: EXEMPT minor refactor Test: atest TracingTests Change-Id: I6a247b3bbbd0b9e97cc726a67a16a78cfd853385 --- .../AutoClosableProtoInputStream.java | 56 +++++++++ .../ProcessedPerfettoProtoLogImpl.java | 9 +- .../ProtoLogConfigurationServiceImpl.java | 2 +- .../protolog/ProtoLogViewerConfigReader.java | 113 +++++++++--------- .../com/android/internal/protolog/Utils.java | 4 +- .../ViewerConfigInputStreamProvider.java | 4 +- .../ProcessedPerfettoProtoLogImplTest.java | 2 +- .../ProtoLogViewerConfigReaderTest.java | 3 +- 8 files changed, 126 insertions(+), 67 deletions(-) create mode 100644 core/java/com/android/internal/protolog/AutoClosableProtoInputStream.java diff --git a/core/java/com/android/internal/protolog/AutoClosableProtoInputStream.java b/core/java/com/android/internal/protolog/AutoClosableProtoInputStream.java new file mode 100644 index 000000000000..1acb34f73002 --- /dev/null +++ b/core/java/com/android/internal/protolog/AutoClosableProtoInputStream.java @@ -0,0 +1,56 @@ +/* + * 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.internal.protolog; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.util.proto.ProtoInputStream; + +import java.io.FileInputStream; +import java.io.IOException; + +public final class AutoClosableProtoInputStream implements AutoCloseable { + @NonNull + private final ProtoInputStream mProtoInputStream; + @Nullable + private final FileInputStream mFileInputStream; + + public AutoClosableProtoInputStream(@NonNull FileInputStream fileInputStream) { + mProtoInputStream = new ProtoInputStream(fileInputStream); + mFileInputStream = fileInputStream; + } + + public AutoClosableProtoInputStream(@NonNull byte[] input) { + mProtoInputStream = new ProtoInputStream(input); + mFileInputStream = null; + } + + /** + * @return the ProtoInputStream this class is wrapping + */ + @NonNull + public ProtoInputStream get() { + return mProtoInputStream; + } + + @Override + public void close() throws IOException { + if (mFileInputStream != null) { + mFileInputStream.close(); + } + } +} diff --git a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java index 7bcfd1182f05..febe1f3a72ac 100644 --- a/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProcessedPerfettoProtoLogImpl.java @@ -20,7 +20,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.ServiceManager; import android.util.Log; -import android.util.proto.ProtoInputStream; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.protolog.ProtoLogConfigurationServiceImpl.RegisterClientArgs; @@ -47,11 +46,13 @@ public class ProcessedPerfettoProtoLogImpl extends PerfettoProtoLogImpl { @NonNull Runnable cacheUpdater, @NonNull IProtoLogGroup[] groups) throws ServiceManager.ServiceNotFoundException { this(viewerConfigFilePath, new ViewerConfigInputStreamProvider() { - @androidx.annotation.NonNull + @NonNull @Override - public ProtoInputStream getInputStream() { + public AutoClosableProtoInputStream getInputStream() { try { - return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); + final var protoFileInputStream = + new FileInputStream(viewerConfigFilePath); + return new AutoClosableProtoInputStream(protoFileInputStream); } catch (FileNotFoundException e) { throw new RuntimeException( "Failed to load viewer config file " + viewerConfigFilePath, e); diff --git a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java index 8d37899f8602..e9a8770deb73 100644 --- a/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java +++ b/core/java/com/android/internal/protolog/ProtoLogConfigurationServiceImpl.java @@ -379,7 +379,7 @@ public class ProtoLogConfigurationServiceImpl extends IProtoLogConfigurationServ @NonNull String viewerConfigFilePath) { Utils.dumpViewerConfig(dataSource, () -> { try { - return new ProtoInputStream(new FileInputStream(viewerConfigFilePath)); + return new AutoClosableProtoInputStream(new FileInputStream(viewerConfigFilePath)); } catch (FileNotFoundException e) { throw new RuntimeException( "Failed to load viewer config file " + viewerConfigFilePath, e); diff --git a/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java b/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java index 571fe0ba37b2..524f64225084 100644 --- a/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java +++ b/core/java/com/android/internal/protolog/ProtoLogViewerConfigReader.java @@ -106,46 +106,47 @@ public class ProtoLogViewerConfigReader { long targetGroupId = loadGroupId(group); final Map hashesForGroup = new TreeMap<>(); - final ProtoInputStream pis = mViewerConfigInputStreamProvider.getInputStream(); - - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - if (pis.getFieldNumber() == (int) MESSAGES) { - final long inMessageToken = pis.start(MESSAGES); - - long messageId = 0; - String message = null; - int groupId = 0; - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - switch (pis.getFieldNumber()) { - case (int) MESSAGE_ID: - messageId = pis.readLong(MESSAGE_ID); - break; - case (int) MESSAGE: - message = pis.readString(MESSAGE); - break; - case (int) GROUP_ID: - groupId = pis.readInt(GROUP_ID); - break; + try (var pisWrapper = mViewerConfigInputStreamProvider.getInputStream()) { + final var pis = pisWrapper.get(); + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + if (pis.getFieldNumber() == (int) MESSAGES) { + final long inMessageToken = pis.start(MESSAGES); + + long messageId = 0; + String message = null; + int groupId = 0; + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + switch (pis.getFieldNumber()) { + case (int) MESSAGE_ID: + messageId = pis.readLong(MESSAGE_ID); + break; + case (int) MESSAGE: + message = pis.readString(MESSAGE); + break; + case (int) GROUP_ID: + groupId = pis.readInt(GROUP_ID); + break; + } } - } - if (groupId == 0) { - throw new IOException("Failed to get group id"); - } + if (groupId == 0) { + throw new IOException("Failed to get group id"); + } - if (messageId == 0) { - throw new IOException("Failed to get message id"); - } + if (messageId == 0) { + throw new IOException("Failed to get message id"); + } - if (message == null) { - throw new IOException("Failed to get message string"); - } + if (message == null) { + throw new IOException("Failed to get message string"); + } - if (groupId == targetGroupId) { - hashesForGroup.put(messageId, message); - } + if (groupId == targetGroupId) { + hashesForGroup.put(messageId, message); + } - pis.end(inMessageToken); + pis.end(inMessageToken); + } } } @@ -153,30 +154,32 @@ public class ProtoLogViewerConfigReader { } private long loadGroupId(@NonNull String group) throws IOException { - final ProtoInputStream pis = mViewerConfigInputStreamProvider.getInputStream(); - - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - if (pis.getFieldNumber() == (int) GROUPS) { - final long inMessageToken = pis.start(GROUPS); - - long groupId = 0; - String groupName = null; - while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { - switch (pis.getFieldNumber()) { - case (int) ID: - groupId = pis.readInt(ID); - break; - case (int) NAME: - groupName = pis.readString(NAME); - break; + try (var pisWrapper = mViewerConfigInputStreamProvider.getInputStream()) { + final var pis = pisWrapper.get(); + + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + if (pis.getFieldNumber() == (int) GROUPS) { + final long inMessageToken = pis.start(GROUPS); + + long groupId = 0; + String groupName = null; + while (pis.nextField() != ProtoInputStream.NO_MORE_FIELDS) { + switch (pis.getFieldNumber()) { + case (int) ID: + groupId = pis.readInt(ID); + break; + case (int) NAME: + groupName = pis.readString(NAME); + break; + } } - } - if (Objects.equals(groupName, group)) { - return groupId; - } + if (Objects.equals(groupName, group)) { + return groupId; + } - pis.end(inMessageToken); + pis.end(inMessageToken); + } } } diff --git a/core/java/com/android/internal/protolog/Utils.java b/core/java/com/android/internal/protolog/Utils.java index 00ef80ab2bdd..629682ca2e71 100644 --- a/core/java/com/android/internal/protolog/Utils.java +++ b/core/java/com/android/internal/protolog/Utils.java @@ -48,8 +48,8 @@ public class Utils { public static void dumpViewerConfig(@NonNull ProtoLogDataSource dataSource, @NonNull ViewerConfigInputStreamProvider viewerConfigInputStreamProvider) { dataSource.trace(ctx -> { - try { - ProtoInputStream pis = viewerConfigInputStreamProvider.getInputStream(); + try (var pisWrapper = viewerConfigInputStreamProvider.getInputStream()) { + final var pis = pisWrapper.get(); final ProtoOutputStream os = ctx.newTracePacket(); diff --git a/core/java/com/android/internal/protolog/ViewerConfigInputStreamProvider.java b/core/java/com/android/internal/protolog/ViewerConfigInputStreamProvider.java index 14bc8e4782f2..60c98923eb23 100644 --- a/core/java/com/android/internal/protolog/ViewerConfigInputStreamProvider.java +++ b/core/java/com/android/internal/protolog/ViewerConfigInputStreamProvider.java @@ -17,12 +17,12 @@ package com.android.internal.protolog; import android.annotation.NonNull; -import android.util.proto.ProtoInputStream; public interface ViewerConfigInputStreamProvider { /** * @return a ProtoInputStream. */ @NonNull - ProtoInputStream getInputStream(); + AutoClosableProtoInputStream getInputStream(); } + diff --git a/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java b/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java index 794cdad66075..2692e12c57ed 100644 --- a/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java +++ b/tests/Tracing/src/com/android/internal/protolog/ProcessedPerfettoProtoLogImplTest.java @@ -165,7 +165,7 @@ public class ProcessedPerfettoProtoLogImplTest { throw new RuntimeException( "Unexpected viewer config file path provided"); } - return new ProtoInputStream(sViewerConfigBuilder.build().toByteArray()); + return new AutoClosableProtoInputStream(sViewerConfigBuilder.build().toByteArray()); }); }; sProtoLogConfigurationService = diff --git a/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java b/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java index d78ced161eaf..3d6be7753c42 100644 --- a/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java +++ b/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import android.platform.test.annotations.Presubmit; -import android.util.proto.ProtoInputStream; import org.junit.Before; import org.junit.Test; @@ -83,7 +82,7 @@ public class ProtoLogViewerConfigReaderTest { ).build().toByteArray(); private final ViewerConfigInputStreamProvider mViewerConfigInputStreamProvider = - () -> new ProtoInputStream(TEST_VIEWER_CONFIG); + () -> new AutoClosableProtoInputStream(TEST_VIEWER_CONFIG); private ProtoLogViewerConfigReader mConfig; -- GitLab From 99853d950af4a7803ba43c421cef6bd634fad51e Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Thu, 3 Oct 2024 16:06:33 +0000 Subject: [PATCH 045/459] Ensure we always de-duplicate groups on ProtoLog init Flag: EXEMPT minor fix Test: atest TracingTests Change-Id: Ib69c7e0f8796cf1bdeff365b5021951daa5cc7a7 --- core/java/com/android/internal/protolog/ProtoLog.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/java/com/android/internal/protolog/ProtoLog.java b/core/java/com/android/internal/protolog/ProtoLog.java index a7101004e033..d117e93d7de7 100644 --- a/core/java/com/android/internal/protolog/ProtoLog.java +++ b/core/java/com/android/internal/protolog/ProtoLog.java @@ -70,16 +70,16 @@ public class ProtoLog { // directly to the generated tracing implementations. if (android.tracing.Flags.perfettoProtologTracing()) { synchronized (sInitLock) { + final var allGroups = new HashSet<>(Arrays.stream(groups).toList()); if (sProtoLogInstance != null) { // The ProtoLog instance has already been initialized in this process final var alreadyRegisteredGroups = sProtoLogInstance.getRegisteredGroups(); - final var allGroups = new HashSet<>(alreadyRegisteredGroups); - allGroups.addAll(Arrays.stream(groups).toList()); - groups = allGroups.toArray(new IProtoLogGroup[0]); + allGroups.addAll(alreadyRegisteredGroups); } try { - sProtoLogInstance = new UnprocessedPerfettoProtoLogImpl(groups); + sProtoLogInstance = new UnprocessedPerfettoProtoLogImpl( + allGroups.toArray(new IProtoLogGroup[0])); } catch (ServiceManager.ServiceNotFoundException e) { throw new RuntimeException(e); } -- GitLab From ed7546f3cf1c84cc0cb0f4bcba657adc08739796 Mon Sep 17 00:00:00 2001 From: Eric Miao Date: Wed, 10 Jul 2024 10:35:35 -0700 Subject: [PATCH 046/459] Report Post-GC memory metrics Bug: 331243037 Flag: android.app.report_postgc_memory_metrics This makes use of ProcfsMemoryUtil.java, and so part of the change is to move ProcfsMemoryUtil to com.android.internal.os so it can be shared. This also registers the callback to report memory metrics in VMRuntime when a post-GC event happens. Change-Id: Idbe67f306935fefa8f3e4b4ef4fe656a61a4ede6 --- core/java/android/app/ActivityThread.java | 11 +++ core/java/android/app/metrics.aconfig | 10 +++ .../internal/os}/ProcfsMemoryUtil.java | 74 +++++++++++++++++-- .../os/logging/MetricsLoggerWrapper.java | 48 ++++++++++++ .../server/am/ProcessErrorStateRecord.java | 4 +- .../stats/pull/StatsPullAtomService.java | 9 ++- 6 files changed, 142 insertions(+), 14 deletions(-) create mode 100644 core/java/android/app/metrics.aconfig rename {services/core/java/com/android/server/stats/pull => core/java/com/android/internal/os}/ProcfsMemoryUtil.java (60%) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index e7f4dbc24022..ed6b3d4a4632 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -237,6 +237,7 @@ import com.android.internal.os.DebugStore; import com.android.internal.os.RuntimeInit; import com.android.internal.os.SafeZipPathValidatorCallback; import com.android.internal.os.SomeArgs; +import com.android.internal.os.logging.MetricsLoggerWrapper; import com.android.internal.policy.DecorView; import com.android.internal.util.ArrayUtils; import com.android.internal.util.FastPrintWriter; @@ -7675,6 +7676,16 @@ public final class ActivityThread extends ClientTransactionHandler } } }); + + // Register callback to report native memory metrics post GC cleanup + if (Flags.reportPostgcMemoryMetrics() && + com.android.libcore.readonly.Flags.postCleanupApis()) { + VMRuntime.addPostCleanupCallback(new Runnable() { + @Override public void run() { + MetricsLoggerWrapper.logPostGcMemorySnapshot(); + } + }); + } } @UnsupportedAppUsage diff --git a/core/java/android/app/metrics.aconfig b/core/java/android/app/metrics.aconfig new file mode 100644 index 000000000000..488f1c71990b --- /dev/null +++ b/core/java/android/app/metrics.aconfig @@ -0,0 +1,10 @@ +package: "android.app" +container: "system" + +flag { + namespace: "system_performance" + name: "report_postgc_memory_metrics" + is_exported: false + description: "Controls whether to report memory metrics post GC cleanup" + bug: "331243037" +} diff --git a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java b/core/java/com/android/internal/os/ProcfsMemoryUtil.java similarity index 60% rename from services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java rename to core/java/com/android/internal/os/ProcfsMemoryUtil.java index 6cb6dc07f8b8..382f6c4a8a16 100644 --- a/services/core/java/com/android/server/stats/pull/ProcfsMemoryUtil.java +++ b/core/java/com/android/internal/os/ProcfsMemoryUtil.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.android.server.stats.pull; +package com.android.internal.os; -import static android.os.Process.PROC_OUT_STRING; +import static android.os.Process.*; import android.annotation.Nullable; import android.os.Process; @@ -23,6 +23,7 @@ import android.util.SparseArray; public final class ProcfsMemoryUtil { private static final int[] CMDLINE_OUT = new int[] { PROC_OUT_STRING }; + private static final int[] OOM_SCORE_ADJ_OUT = new int[] { PROC_NEWLINE_TERM | PROC_OUT_LONG }; private static final String[] STATUS_KEYS = new String[] { "Uid:", "VmHWM:", @@ -38,17 +39,34 @@ public final class ProcfsMemoryUtil { private ProcfsMemoryUtil() {} /** - * Reads memory stats of a process from procfs. Returns values of the VmHWM, VmRss, AnonRSS, - * VmSwap, RssShmem fields in /proc/pid/status in kilobytes or null if not available. + * Reads memory stats of a process from procfs. + * + * Returns values of the VmHWM, VmRss, AnonRSS, VmSwap, RssShmem fields in + * /proc/pid/status in kilobytes or null if not available. */ @Nullable public static MemorySnapshot readMemorySnapshotFromProcfs(int pid) { + return readMemorySnapshotFromProcfs("/proc/" + pid + "/status"); + } + + /** + * Reads memory stats of the current process from procfs. + * + * Returns values of the VmHWM, VmRss, AnonRSS, VmSwap, RssShmem fields in + * /proc/self/status in kilobytes or null if not available. + */ + @Nullable + public static MemorySnapshot readMemorySnapshotFromProcfs() { + return readMemorySnapshotFromProcfs("/proc/self/status"); + } + + private static MemorySnapshot readMemorySnapshotFromProcfs(String path) { long[] output = new long[STATUS_KEYS.length]; output[0] = -1; output[3] = -1; output[4] = -1; output[5] = -1; - Process.readProcLines("/proc/" + pid + "/status", STATUS_KEYS, output); + Process.readProcLines(path, STATUS_KEYS, output); if (output[0] == -1 || output[3] == -1 || output[4] == -1 || output[5] == -1) { // Could not open or parse file. return null; @@ -70,13 +88,53 @@ public final class ProcfsMemoryUtil { * if the file is not available. */ public static String readCmdlineFromProcfs(int pid) { + return readCmdlineFromProcfs("/proc/" + pid + "/cmdline"); + } + + /** + * Reads cmdline of the current process from procfs. + * + * Returns content of /proc/pid/cmdline (e.g. /system/bin/statsd) or an empty string + * if the file is not available. + */ + public static String readCmdlineFromProcfs() { + return readCmdlineFromProcfs("/proc/self/cmdline"); + } + + private static String readCmdlineFromProcfs(String path) { String[] cmdline = new String[1]; - if (!Process.readProcFile("/proc/" + pid + "/cmdline", CMDLINE_OUT, cmdline, null, null)) { + if (!Process.readProcFile(path, CMDLINE_OUT, cmdline, null, null)) { return ""; } return cmdline[0]; } + /** + * Reads oom_score_adj of a process from procfs + * + * Returns content of /proc/pid/oom_score_adj. Defaults to 0 if reading fails. + */ + public static int readOomScoreAdjFromProcfs(int pid) { + return readOomScoreAdjFromProcfs("/proc/" + pid + "/oom_score_adj"); + } + + /** + * Reads oom_score_adj of the current process from procfs + * + * Returns content of /proc/pid/oom_score_adj. Defaults to 0 if reading fails. + */ + public static int readOomScoreAdjFromProcfs() { + return readOomScoreAdjFromProcfs("/proc/self/oom_score_adj"); + } + + private static int readOomScoreAdjFromProcfs(String path) { + long[] oom_score_adj = new long[1]; + if (Process.readProcFile(path, OOM_SCORE_ADJ_OUT, null, oom_score_adj, null)) { + return (int)oom_score_adj[0]; + } + return 0; + } + /** * Scans all /proc/pid/cmdline entries and returns a mapping between pid and cmdline. */ @@ -109,7 +167,7 @@ public final class ProcfsMemoryUtil { /** Reads and parses selected entries of /proc/vmstat. */ @Nullable - static VmStat readVmStat() { + public static VmStat readVmStat() { long[] vmstat = new long[VMSTAT_KEYS.length]; vmstat[0] = -1; Process.readProcLines("/proc/vmstat", VMSTAT_KEYS, vmstat); @@ -121,7 +179,7 @@ public final class ProcfsMemoryUtil { return result; } - static final class VmStat { + public static final class VmStat { public int oomKillCount; } } diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java index b42ea7d0b769..e2237f61dfbb 100644 --- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java +++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java @@ -16,9 +16,15 @@ package com.android.internal.os.logging; +import android.app.Application; +import android.os.Process; +import android.util.Log; import android.view.WindowManager.LayoutParams; +import com.android.internal.os.ProcfsMemoryUtil; import com.android.internal.util.FrameworkStatsLog; +import java.util.Collection; +import libcore.util.NativeAllocationRegistry; /** * Used to wrap different logging calls in one, so that client side code base is clean and more @@ -49,4 +55,46 @@ public class MetricsLoggerWrapper { } } } + + public static void logPostGcMemorySnapshot() { + if (!com.android.libcore.Flags.nativeMetrics()) { + return; + } + int pid = Process.myPid(); + String processName = Application.getProcessName(); + Collection metrics = + NativeAllocationRegistry.getMetrics(); + int nMetrics = metrics.size(); + + String[] classNames = new String[nMetrics]; + long[] mallocedCount = new long[nMetrics]; + long[] mallocedBytes = new long[nMetrics]; + long[] nonmallocedCount = new long[nMetrics]; + long[] nonmallocedBytes = new long[nMetrics]; + + int i = 0; + for (NativeAllocationRegistry.Metrics m : metrics) { + classNames[i] = m.getClassName(); + mallocedCount[i] = m.getMallocedCount(); + mallocedBytes[i] = m.getMallocedBytes(); + nonmallocedCount[i] = m.getNonmallocedCount(); + nonmallocedBytes[i] = m.getNonmallocedBytes(); + i++; + } + + ProcfsMemoryUtil.MemorySnapshot m = ProcfsMemoryUtil.readMemorySnapshotFromProcfs(); + int oom_score_adj = ProcfsMemoryUtil.readOomScoreAdjFromProcfs(); + FrameworkStatsLog.write(FrameworkStatsLog.POSTGC_MEMORY_SNAPSHOT, + m.uid, processName, pid, + oom_score_adj, + m.rssInKilobytes, + m.anonRssInKilobytes, + m.swapInKilobytes, + m.anonRssInKilobytes + m.swapInKilobytes, + classNames, + mallocedCount, + mallocedBytes, + nonmallocedCount, + nonmallocedBytes); + } } diff --git a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java index ba4b71cd7540..17fcbf47206f 100644 --- a/services/core/java/com/android/server/am/ProcessErrorStateRecord.java +++ b/services/core/java/com/android/server/am/ProcessErrorStateRecord.java @@ -22,7 +22,7 @@ import static com.android.server.Watchdog.NATIVE_STACKS_OF_INTEREST; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR; import static com.android.server.am.ActivityManagerService.MY_PID; import static com.android.server.am.ProcessRecord.TAG; -import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; +import static com.android.internal.os.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; import android.annotation.Nullable; import android.app.ActivityManager; @@ -58,7 +58,7 @@ import com.android.internal.util.FrameworkStatsLog; import com.android.modules.expresslog.Counter; import com.android.server.ResourcePressureUtil; import com.android.server.criticalevents.CriticalEventLog; -import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot; +import com.android.internal.os.ProcfsMemoryUtil.MemorySnapshot; import com.android.server.wm.WindowProcessController; import java.io.File; diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index e7735d8480f8..54e4f8e9a110 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -48,6 +48,9 @@ import static android.telephony.TelephonyManager.UNKNOWN_CARRIER_ID; import static android.util.MathUtils.constrain; import static android.view.Display.HdrCapabilities.HDR_TYPE_INVALID; +import static com.android.internal.os.ProcfsMemoryUtil.getProcessCmdlines; +import static com.android.internal.os.ProcfsMemoryUtil.readCmdlineFromProcfs; +import static com.android.internal.os.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; import static com.android.internal.util.ConcurrentUtils.DIRECT_EXECUTOR; import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_STATS__GESTURE_SHORTCUT_TYPE__TRIPLE_TAP; import static com.android.internal.util.FrameworkStatsLog.ACCESSIBILITY_SHORTCUT_STATS__HARDWARE_SHORTCUT_TYPE__VOLUME_KEY; @@ -68,9 +71,6 @@ import static com.android.server.stats.Flags.addMobileBytesTransferByProcStatePu import static com.android.server.stats.Flags.applyNetworkStatsPollRateLimit; import static com.android.server.stats.pull.IonMemoryUtil.readProcessSystemIonHeapSizesFromDebugfs; import static com.android.server.stats.pull.IonMemoryUtil.readSystemIonHeapSizeFromDebugfs; -import static com.android.server.stats.pull.ProcfsMemoryUtil.getProcessCmdlines; -import static com.android.server.stats.pull.ProcfsMemoryUtil.readCmdlineFromProcfs; -import static com.android.server.stats.pull.ProcfsMemoryUtil.readMemorySnapshotFromProcfs; import static com.android.server.stats.pull.netstats.NetworkStatsUtils.fromPublicNetworkStats; import static com.android.server.stats.pull.netstats.NetworkStatsUtils.isAddEntriesSupported; @@ -209,6 +209,8 @@ import com.android.internal.os.KernelSingleProcessCpuThreadReader.ProcessCpuUsag import com.android.internal.os.LooperStats; import com.android.internal.os.PowerProfile; import com.android.internal.os.ProcessCpuTracker; +import com.android.internal.os.ProcfsMemoryUtil; +import com.android.internal.os.ProcfsMemoryUtil.MemorySnapshot; import com.android.internal.os.SelectedProcessCpuThreadReader; import com.android.internal.os.StoragedUidIoStatsReader; import com.android.internal.util.CollectionUtils; @@ -229,7 +231,6 @@ import com.android.server.power.stats.KernelWakelockReader; import com.android.server.power.stats.KernelWakelockStats; import com.android.server.power.stats.SystemServerCpuThreadReader.SystemServiceCpuThreadTimes; import com.android.server.stats.pull.IonMemoryUtil.IonAllocations; -import com.android.server.stats.pull.ProcfsMemoryUtil.MemorySnapshot; import com.android.server.stats.pull.netstats.NetworkStatsAccumulator; import com.android.server.stats.pull.netstats.NetworkStatsExt; import com.android.server.stats.pull.netstats.SubInfo; -- GitLab From 92ff7c75e4fed791a51202f95541ab62791136fe Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 15 Oct 2024 16:45:42 +0800 Subject: [PATCH 047/459] Reset draw state after notifying invisible to activity window This moves the concept of I69f893a19d6426710bb0b8b0e18f3d2664cb6412 to a more suitable place. Instead of resetting draw state when the app becomes visible, it is more general when setting app window to be invisible. There are 2 cases that could benefit from this: 1. The computation ActivityRecord#updateReportedVisibilityLocked depends on w.isDrawn(). So ActivityRecord#isReportedDrawn() won't get stale draw state. 2. ActivityRecord#addStartingWindow checks w.isDrawn() to skip adding starting window. So it can avoid missing starting window when launching app again in a short time, e.g. return to home and click the same app immediately. Bug: 373023636 Test: atest ActivityRecordTests#testSetVisibility_visibleToInvisible Flag: com.android.window.flags.reset_draw_state_on_client_invisible Change-Id: I91ffbd5ce4d014feb667383fda404df23759be89 --- .../window/flags/windowing_frontend.aconfig | 10 +++++++++ .../com/android/server/wm/ActivityRecord.java | 3 ++- .../com/android/server/wm/WindowState.java | 10 +++++++++ .../server/wm/ActivityRecordTests.java | 21 +++++++++++++------ 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index 0d235ffad9b5..d15f52c39efa 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -8,6 +8,16 @@ flag { bug: "232195501" } +flag { + name: "reset_draw_state_on_client_invisible" + namespace: "windowing_frontend" + description: "Reset draw state if the client is notified to be invisible" + bug: "373023636" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "wait_for_transition_on_display_switch" namespace: "windowing_frontend" diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 460de01a7d1d..d4dccc30b4eb 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -5508,7 +5508,8 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A clearAllDrawn(); // Reset the draw state in order to prevent the starting window to be immediately // dismissed when the app still has the surface. - if (!isVisible() && !isClientVisible()) { + if (!Flags.resetDrawStateOnClientInvisible() + && !isVisible() && !isClientVisible()) { forAllWindows(w -> { if (w.mWinAnimator.mDrawState == HAS_DRAWN) { w.mWinAnimator.resetDrawState(); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 76f2437cbc3f..614187682ef4 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3304,6 +3304,16 @@ class WindowState extends WindowContainer implements WindowManagerP android.os.Process.killProcess(mSession.mPid); } } + + // Because the client is notified to be invisible, it should no longer be considered as + // drawn state. This prevent the app from showing incomplete content if the app is + // requested to be visible in a short time (e.g. before activity stopped). + if (Flags.resetDrawStateOnClientInvisible() && !clientVisible && mActivityRecord != null + && mWinAnimator.mDrawState == HAS_DRAWN) { + mWinAnimator.resetDrawState(); + // Make sure the app can report drawn if it becomes visible again. + forceReportingResized(); + } } void onStartFreezingScreen() { diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 577b02a4ff7a..c30b4bb6f65d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -3214,23 +3214,32 @@ public class ActivityRecordTests extends WindowTestsBase { assertFalse(activity.mDisplayContent.mClosingApps.contains(activity)); } + @SetupWindows(addWindows = W_ACTIVITY) @Test public void testSetVisibility_visibleToInvisible() { - final ActivityRecord activity = new ActivityBuilder(mAtm) - .setCreateTask(true).build(); + final TestTransitionPlayer player = registerTestTransitionPlayer(); + final ActivityRecord activity = mAppWindow.mActivityRecord; + makeWindowVisibleAndDrawn(mAppWindow); // By default, activity is visible. assertTrue(activity.isVisible()); assertTrue(activity.isVisibleRequested()); - assertFalse(activity.mDisplayContent.mClosingApps.contains(activity)); + assertTrue(mAppWindow.isDrawn()); + assertFalse(mAppWindow.setReportResizeHints()); // Request the activity to be invisible. Since the visibility changes, app transition // animation should be applied on this activity. - mDisplayContent.prepareAppTransition(0); + activity.mTransitionController.requestCloseTransitionIfNeeded(activity); activity.setVisibility(false); assertTrue(activity.isVisible()); assertFalse(activity.isVisibleRequested()); - assertFalse(activity.mDisplayContent.mOpeningApps.contains(activity)); - assertTrue(activity.mDisplayContent.mClosingApps.contains(activity)); + + player.start(); + mSetFlagsRule.enableFlags(Flags.FLAG_RESET_DRAW_STATE_ON_CLIENT_INVISIBLE); + // ActivityRecord#commitVisibility(false) -> WindowState#sendAppVisibilityToClients(). + player.finish(); + assertFalse(activity.isVisible()); + assertFalse("Reset draw state after committing invisible", mAppWindow.isDrawn()); + assertTrue("Set pending redraw hint", mAppWindow.setReportResizeHints()); } @Test -- GitLab From 08ff158a5b847b2e3aef87f463eb88027fbe8847 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Wed, 9 Oct 2024 15:34:56 +0200 Subject: [PATCH 048/459] Notif redesign: Don't apply effects to app icons In order to know if we're showing the app icon from places where we can't inject NotificationIconStyleProvider, I added a property to ExpandableNotificationRow. It's not ideal that now the shouldShowAppIcon getter has side effects, but it's better than attempting an overly complex solution to be able to access NotificationRowIconView otherwise. Bug: 371174789 Test: tested manually that e.g. icons in grouped messaging notifications from Notify aren't greyed out Flag: android.app.notifications_redesign_app_icons Change-Id: I632daa937f237aa7bea22b9e7fd84939be1a5a34 --- .../statusbar/NotificationGroupingUtil.java | 57 +++++++++++++------ .../row/ExpandableNotificationRow.java | 19 +++++++ .../NotificationRowIconViewInflaterFactory.kt | 32 +++++++---- 3 files changed, 78 insertions(+), 30 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java index 8d3f7284e359..30f564f63fa1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGroupingUtil.java @@ -16,6 +16,7 @@ package com.android.systemui.statusbar; +import android.app.Flags; import android.app.Notification; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; @@ -60,20 +61,6 @@ public class NotificationGroupingUtil { return row.getEntry().getSbn().getNotification(); } }; - private static final IconComparator ICON_VISIBILITY_COMPARATOR = new IconComparator() { - public boolean compare(View parent, View child, Object parentData, - Object childData) { - return hasSameIcon(parentData, childData) - && hasSameColor(parentData, childData); - } - }; - private static final IconComparator GREY_COMPARATOR = new IconComparator() { - public boolean compare(View parent, View child, Object parentData, - Object childData) { - return !hasSameIcon(parentData, childData) - || hasSameColor(parentData, childData); - } - }; private static final ResultApplicator GREY_APPLICATOR = new ResultApplicator() { @Override public void apply(View parent, View view, boolean apply, boolean reset) { @@ -90,34 +77,58 @@ public class NotificationGroupingUtil { public NotificationGroupingUtil(ExpandableNotificationRow row) { mRow = row; + + final IconComparator iconVisibilityComparator = new IconComparator(mRow) { + public boolean compare(View parent, View child, Object parentData, + Object childData) { + return hasSameIcon(parentData, childData) + && hasSameColor(parentData, childData); + } + }; + final IconComparator greyComparator = new IconComparator(mRow) { + public boolean compare(View parent, View child, Object parentData, + Object childData) { + if (Flags.notificationsRedesignAppIcons() && mRow.isShowingAppIcon()) { + return false; + } + return !hasSameIcon(parentData, childData) + || hasSameColor(parentData, childData); + } + }; + // To hide the icons if they are the same and the color is the same mProcessors.add(new Processor(mRow, com.android.internal.R.id.icon, ICON_EXTRACTOR, - ICON_VISIBILITY_COMPARATOR, + iconVisibilityComparator, VISIBILITY_APPLICATOR)); - // To grey them out the icons and expand button when the icons are not the same + // To grey out the icons when they are not the same, or they have the same color mProcessors.add(new Processor(mRow, com.android.internal.R.id.status_bar_latest_event_content, ICON_EXTRACTOR, - GREY_COMPARATOR, + greyComparator, GREY_APPLICATOR)); + // To show the large icon on the left side instead if all the small icons are the same mProcessors.add(new Processor(mRow, com.android.internal.R.id.status_bar_latest_event_content, ICON_EXTRACTOR, - ICON_VISIBILITY_COMPARATOR, + iconVisibilityComparator, LEFT_ICON_APPLICATOR)); + // To only show the work profile icon in the group header mProcessors.add(new Processor(mRow, com.android.internal.R.id.profile_badge, null /* Extractor */, BADGE_COMPARATOR, VISIBILITY_APPLICATOR)); + // To hide the app name in group children mProcessors.add(new Processor(mRow, com.android.internal.R.id.app_name_text, null, APP_NAME_COMPARATOR, APP_NAME_APPLICATOR)); + // To hide the header text if it's the same mProcessors.add(Processor.forTextView(mRow, com.android.internal.R.id.header_text)); + mDividers.add(com.android.internal.R.id.header_text_divider); mDividers.add(com.android.internal.R.id.header_text_secondary_divider); mDividers.add(com.android.internal.R.id.time_divider); @@ -261,6 +272,7 @@ public class NotificationGroupingUtil { mParentData = mExtractor == null ? null : mExtractor.extractData(mParentRow); mApply = !mComparator.isEmpty(mParentView); } + public void compareToGroupParent(ExpandableNotificationRow row) { if (!mApply) { return; @@ -356,12 +368,21 @@ public class NotificationGroupingUtil { } private abstract static class IconComparator implements ViewComparator { + private final ExpandableNotificationRow mRow; + + IconComparator(ExpandableNotificationRow row) { + mRow = row; + } + @Override public boolean compare(View parent, View child, Object parentData, Object childData) { return false; } protected boolean hasSameIcon(Object parentData, Object childData) { + if (Flags.notificationsRedesignAppIcons() && mRow.isShowingAppIcon()) { + return true; + } Icon parentIcon = getIcon((Notification) parentData); Icon childIcon = getIcon((Notification) childData); return parentIcon.sameAs(childIcon); 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 adb3352b948c..e80b09e0a7b2 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 @@ -262,6 +262,11 @@ public class ExpandableNotificationRow extends ActivatableNotificationView */ private boolean mIsHeadsUp; + /** + * Whether or not the notification is showing the app icon instead of the small icon. + */ + private boolean mIsShowingAppIcon; + private boolean mLastChronometerRunning = true; private ViewStub mChildrenContainerStub; private GroupMembershipManager mGroupMembershipManager; @@ -816,6 +821,20 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } } + /** + * Indicate that the notification is showing the app icon instead of the small icon. + */ + public void setIsShowingAppIcon(boolean isShowingAppIcon) { + mIsShowingAppIcon = isShowingAppIcon; + } + + /** + * Whether or not the notification is showing the app icon instead of the small icon. + */ + public boolean isShowingAppIcon() { + return mIsShowingAppIcon; + } + @Override public boolean showingPulsing() { return isHeadsUpState() && (isDozing() || (mOnKeyguard && isBypassEnabled())); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt index 79defd255de0..7b85bfdfb197 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt @@ -21,6 +21,7 @@ import android.graphics.drawable.Drawable import android.util.AttributeSet import android.view.View import com.android.internal.widget.NotificationRowIconView +import com.android.internal.widget.NotificationRowIconView.NotificationIconProvider import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotifRemoteViewsFactory import com.android.systemui.statusbar.notification.row.NotificationRowContentBinder @@ -47,20 +48,27 @@ constructor( return when (name) { NotificationRowIconView::class.java.name -> NotificationRowIconView(context, attrs).also { view -> - val sbn = row.entry.sbn - view.setIconProvider( - object : NotificationRowIconView.NotificationIconProvider { - override fun shouldShowAppIcon(): Boolean { - return iconStyleProvider.shouldShowAppIcon(row.entry.sbn, context) - } - - override fun getAppIcon(): Drawable { - return appIconProvider.getOrFetchAppIcon(sbn.packageName, context) - } - } - ) + view.setIconProvider(createIconProvider(row, context)) } else -> null } } + + private fun createIconProvider( + row: ExpandableNotificationRow, + context: Context, + ): NotificationIconProvider { + val sbn = row.entry.sbn + return object : NotificationIconProvider { + override fun shouldShowAppIcon(): Boolean { + val shouldShowAppIcon = iconStyleProvider.shouldShowAppIcon(row.entry.sbn, context) + row.setIsShowingAppIcon(shouldShowAppIcon) + return shouldShowAppIcon + } + + override fun getAppIcon(): Drawable { + return appIconProvider.getOrFetchAppIcon(sbn.packageName, context) + } + } + } } -- GitLab From cf244b0831dde4d7ffd03adc7796126da4476200 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 4 Oct 2024 02:06:18 +0000 Subject: [PATCH 049/459] Record latest back gesture occur on which task. To help check if the coming close transition could be triggerred from back gesture, and clear it when transition finish. Flag: EXEMPT bugfix Bug: 372458739 Test: verify latest back gesture can be record in BAC, and reset when transition finish. Change-Id: I1e05419e339577e73fd9ee839bc908c0c0667087 --- .../android/window/BackNavigationInfo.java | 29 ++++++++- .../shell/back/BackAnimationController.java | 60 +++++++++++++++++++ .../server/wm/BackNavigationController.java | 3 + 3 files changed, 90 insertions(+), 2 deletions(-) diff --git a/core/java/android/window/BackNavigationInfo.java b/core/java/android/window/BackNavigationInfo.java index 59639d04b45b..6cefc4d2fecf 100644 --- a/core/java/android/window/BackNavigationInfo.java +++ b/core/java/android/window/BackNavigationInfo.java @@ -16,6 +16,8 @@ package android.window; +import static android.app.ActivityTaskManager.INVALID_TASK_ID; + import android.annotation.AnimRes; import android.annotation.ColorInt; import android.annotation.IntDef; @@ -118,6 +120,7 @@ public final class BackNavigationInfo implements Parcelable { private final Rect mTouchableRegion; private final boolean mAppProgressGenerationAllowed; + private final int mFocusedTaskId; /** * Create a new {@link BackNavigationInfo} instance. @@ -135,7 +138,8 @@ public final class BackNavigationInfo implements Parcelable { @Nullable CustomAnimationInfo customAnimationInfo, int letterboxColor, @Nullable Rect touchableRegion, - boolean appProgressGenerationAllowed) { + boolean appProgressGenerationAllowed, + int focusedTaskId) { mType = type; mOnBackNavigationDone = onBackNavigationDone; mOnBackInvokedCallback = onBackInvokedCallback; @@ -145,6 +149,7 @@ public final class BackNavigationInfo implements Parcelable { mLetterboxColor = letterboxColor; mTouchableRegion = new Rect(touchableRegion); mAppProgressGenerationAllowed = appProgressGenerationAllowed; + mFocusedTaskId = focusedTaskId; } private BackNavigationInfo(@NonNull Parcel in) { @@ -157,6 +162,7 @@ public final class BackNavigationInfo implements Parcelable { mLetterboxColor = in.readInt(); mTouchableRegion = in.readTypedObject(Rect.CREATOR); mAppProgressGenerationAllowed = in.readBoolean(); + mFocusedTaskId = in.readInt(); } /** @hide */ @@ -171,6 +177,7 @@ public final class BackNavigationInfo implements Parcelable { dest.writeInt(mLetterboxColor); dest.writeTypedObject(mTouchableRegion, flags); dest.writeBoolean(mAppProgressGenerationAllowed); + dest.writeInt(mFocusedTaskId); } /** @@ -237,6 +244,14 @@ public final class BackNavigationInfo implements Parcelable { return mAppProgressGenerationAllowed; } + /** + * @return The focused task id when back gesture start. + * @hide + */ + public int getFocusedTaskId() { + return mFocusedTaskId; + } + /** * Callback to be called when the back preview is finished in order to notify the server that * it can clean up the resources created for the animation. @@ -435,6 +450,7 @@ public final class BackNavigationInfo implements Parcelable { private int mLetterboxColor = Color.TRANSPARENT; private Rect mTouchableRegion; private boolean mAppProgressGenerationAllowed; + private int mFocusedTaskId = INVALID_TASK_ID; /** * @see BackNavigationInfo#getType() @@ -526,6 +542,14 @@ public final class BackNavigationInfo implements Parcelable { return this; } + /** + * @param focusedTaskId The current focused taskId when back gesture start. + */ + public Builder setFocusedTaskId(int focusedTaskId) { + mFocusedTaskId = focusedTaskId; + return this; + } + /** * Builds and returns an instance of {@link BackNavigationInfo} */ @@ -537,7 +561,8 @@ public final class BackNavigationInfo implements Parcelable { mCustomAnimationInfo, mLetterboxColor, mTouchableRegion, - mAppProgressGenerationAllowed); + mAppProgressGenerationAllowed, + mFocusedTaskId); } } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index 19b51f143241..fafb69cc8089 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -164,6 +164,9 @@ public class BackAnimationController implements RemoteCallable { ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...", MAX_ANIMATION_DURATION); @@ -268,6 +271,7 @@ public class BackAnimationController implements RemoteCallable= 0; --i) { + final TransitionInfo.Change c = info.getChanges().get(i); + if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) { + mMonitorBinder = transition; + break; + } + } + // Transition happen but the task isn't involved, reset. + if (mMonitorBinder == null) { + mFocusedTaskId = INVALID_TASK_ID; + } + } + + @Override + public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { + if (mMonitorBinder == merged) { + mMonitorBinder = playing; + } + } + + @Override + public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { + if (mMonitorBinder == transition) { + mFocusedTaskId = INVALID_TASK_ID; + } + } + } } diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index 94cd2e64b057..bab2210f29aa 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -200,6 +200,9 @@ class BackNavigationController { infoBuilder.setTouchableRegion(window.getFrame()); infoBuilder.setAppProgressAllowed((window.getAttrs().privateFlags & PRIVATE_FLAG_APP_PROGRESS_GENERATION_ALLOWED) != 0); + if (currentTask != null) { + infoBuilder.setFocusedTaskId(currentTask.mTaskId); + } mNavigationMonitor.startMonitor(window, navigationObserver); ProtoLog.d(WM_DEBUG_BACK_PREVIEW, "startBackNavigation currentTask=%s, " -- GitLab From c1bca5a02ee6f3c64713385437154b81ca603d5c Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Fri, 18 Oct 2024 07:58:04 +0000 Subject: [PATCH 050/459] Clear close prepare transition token by TransitionObserver Transition handler won't receive startAnimation nor mergeAnimation if there is no changes in that transition. Use TransitionObserver to track the state in case the close prepare transition is aborted. Flag: EXEMPT bugfix Bug: 373828944 Test: disable snapshot, click app button on edge which also trigger predictive back animation, verify the close prepare transition can be reset if aborted. Change-Id: I6c927f5a7602ed3345da05564671445496d30b5a --- .../shell/back/BackAnimationController.java | 36 ++++++++++++------- 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java index fafb69cc8089..e4db7b636ed9 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationController.java @@ -164,8 +164,8 @@ public class BackAnimationController implements RemoteCallable { ProtoLog.w(WM_SHELL_BACK_PREVIEW, "Animation didn't finish in %d ms. Resetting...", @@ -271,7 +271,8 @@ public class BackAnimationController implements RemoteCallable= 0; --i) { final TransitionInfo.Change c = info.getChanges().get(i); if (c.getTaskInfo() != null && c.getTaskInfo().taskId == mFocusedTaskId) { - mMonitorBinder = transition; + mFocusTaskMonitorToken = transition; break; } } // Transition happen but the task isn't involved, reset. - if (mMonitorBinder == null) { + if (mFocusTaskMonitorToken == null) { mFocusedTaskId = INVALID_TASK_ID; } } @Override public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { - if (mMonitorBinder == merged) { - mMonitorBinder = playing; + if (mFocusTaskMonitorToken == merged) { + mFocusTaskMonitorToken = playing; + } + if (mBackTransitionHandler.mClosePrepareTransition == merged) { + mBackTransitionHandler.mClosePrepareTransition = null; } } @Override public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { - if (mMonitorBinder == transition) { + if (mFocusTaskMonitorToken == transition) { mFocusedTaskId = INVALID_TASK_ID; } + if (mBackTransitionHandler.mClosePrepareTransition == transition) { + mBackTransitionHandler.mClosePrepareTransition = null; + } } } } -- GitLab From da2dfeee49b644ad2b9d88201acecb139cb9cc53 Mon Sep 17 00:00:00 2001 From: tomhsu Date: Thu, 17 Oct 2024 10:59:52 +0000 Subject: [PATCH 051/459] Avoid strings clipped Flag: EXEMPT bugfix fix: b/328519283 Test: Manual test. see b/328519283#10 Change-Id: I3524c8f98e6f3628e5697a6cd8be74f8c664690b --- packages/SystemUI/res/layout/internet_connectivity_dialog.xml | 2 +- packages/SystemUI/res/values/styles.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml index 0029180932ee..2b40df47667a 100644 --- a/packages/SystemUI/res/layout/internet_connectivity_dialog.xml +++ b/packages/SystemUI/res/layout/internet_connectivity_dialog.xml @@ -148,7 +148,7 @@ android:orientation="vertical" android:clickable="false" android:layout_width="wrap_content" - android:layout_height="match_parent" + android:layout_height="wrap_content" android:gravity="start|center_vertical"> match_parent - 88dp + wrap_content @dimen/internet_dialog_network_layout_margin @dimen/internet_dialog_network_layout_margin center_vertical|start -- GitLab From e0722e9156795c6c97ce232f2e52c686b1bef202 Mon Sep 17 00:00:00 2001 From: Ashley Ingram Date: Thu, 17 Oct 2024 08:49:21 +0000 Subject: [PATCH 052/459] Make Wearable settings readable Settings were not hidden on Wear pre-T, so some apps have dependencies on these settings. When they run on U, they crash (because the settings are now hidden). We do not have an alternative API, so there's no other approach apps can take in subsequent API versions. Change the Settings to be Readable. We can deprecate these when official APIs are added to Wear. Bug: 372375270 Flag: EXEMPT: unflaggable Change-Id: Ib599b0390980677aa1155366dad7c6f9b584224c --- core/java/android/provider/Settings.java | 114 +++++++++++------------ 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 594005c3ebd6..01e18ad97d79 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -19299,14 +19299,14 @@ public final class Settings { * If hotword detection should be enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String HOTWORD_DETECTION_ENABLED = "hotword_detection_enabled"; /** * Whether Smart Replies are enabled within Wear. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SMART_REPLIES_ENABLED = "smart_replies_enabled"; /** @@ -19320,7 +19320,7 @@ public final class Settings { * If FLP should obtain location data from the paired device. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String OBTAIN_PAIRED_DEVICE_LOCATION = "obtain_paired_device_location"; @@ -19328,7 +19328,7 @@ public final class Settings { * The play store availability on companion phone. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String PHONE_PLAY_STORE_AVAILABILITY = "phone_play_store_availability"; @@ -19344,7 +19344,7 @@ public final class Settings { * Whether the bug report is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String BUG_REPORT = "bug_report"; // Possible bug report states @@ -19357,14 +19357,14 @@ public final class Settings { * The enabled/disabled state of the SmartIlluminate. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SMART_ILLUMINATE_ENABLED = "smart_illuminate_enabled"; /** * Whether automatic time is enabled on the watch. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CLOCKWORK_AUTO_TIME = "clockwork_auto_time"; // Possible clockwork auto time states @@ -19382,7 +19382,7 @@ public final class Settings { * Whether automatic time zone is enabled on the watch. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CLOCKWORK_AUTO_TIME_ZONE = "clockwork_auto_time_zone"; // Possible clockwork auto time zone states @@ -19399,14 +19399,14 @@ public final class Settings { * Whether 24 hour time format is enabled on the watch. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CLOCKWORK_24HR_TIME = "clockwork_24hr_time"; /** * Whether the auto wifi toggle setting is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AUTO_WIFI = "auto_wifi"; // Possible force wifi on states @@ -19426,7 +19426,7 @@ public final class Settings { * wifi requirement until this time). The time is in millis since epoch. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String ALT_BYPASS_WIFI_REQUIREMENT_TIME_MILLIS = "alt_bypass_wifi_requirement_time_millis"; @@ -19434,7 +19434,7 @@ public final class Settings { * Whether the setup was skipped. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SETUP_SKIPPED = "setup_skipped"; // Possible setup_skipped states @@ -19449,7 +19449,7 @@ public final class Settings { * The last requested call forwarding action. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String LAST_CALL_FORWARD_ACTION = "last_call_forward_action"; // Possible call forwarding actions @@ -19462,31 +19462,31 @@ public final class Settings { // Stem button settings. /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_1_TYPE = "STEM_1_TYPE"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_1_DATA = "STEM_1_DATA"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_1_DEFAULT_DATA = "STEM_1_DEFAULT_DATA"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_2_TYPE = "STEM_2_TYPE"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_2_DATA = "STEM_2_DATA"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_2_DEFAULT_DATA = "STEM_2_DEFAULT_DATA"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_3_TYPE = "STEM_3_TYPE"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_3_DATA = "STEM_3_DATA"; /** @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String STEM_3_DEFAULT_DATA = "STEM_3_DEFAULT_DATA"; // Stem types @@ -19501,14 +19501,14 @@ public final class Settings { * If the device should be muted when off body. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String MUTE_WHEN_OFF_BODY_ENABLED = "obtain_mute_when_off_body"; /** * Wear OS version string. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String WEAR_OS_VERSION_STRING = "wear_os_version_string"; /** @@ -19521,28 +19521,28 @@ public final class Settings { * The android wear system version. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String ANDROID_WEAR_VERSION = "android_wear_version"; /** * The wear system capabiltiies. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SYSTEM_CAPABILITIES = "system_capabilities"; /** * The android wear system edition. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SYSTEM_EDITION = "android_wear_system_edition"; /** * The Wear platform MR number. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String WEAR_PLATFORM_MR_NUMBER = "wear_platform_mr_number"; /** @@ -19556,42 +19556,42 @@ public final class Settings { * Whether ambient is currently enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_ENABLED = "ambient_enabled"; /** * Whether ambient tilt to wake is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_TILT_TO_WAKE = "ambient_tilt_to_wake"; /** * Whether ambient low bit mode is enabled by developer options. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_LOW_BIT_ENABLED_DEV = "ambient_low_bit_enabled_dev"; /** * Whether ambient touch to wake is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_TOUCH_TO_WAKE = "ambient_touch_to_wake"; /** * Whether ambient tilt to bright is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_TILT_TO_BRIGHT = "ambient_tilt_to_bright"; /** * Whether touch and hold to edit WF is enabled * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String GESTURE_TOUCH_AND_HOLD_WATCH_FACE_ENABLED = "gesture_touch_and_hold_watchface_enabled"; @@ -19605,7 +19605,7 @@ public final class Settings { * Whether bedtime mode is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String BEDTIME_MODE = "bedtime_mode"; /** @@ -19617,35 +19617,35 @@ public final class Settings { * Whether the current watchface is decomposable. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String DECOMPOSABLE_WATCHFACE = "current_watchface_decomposable"; /** * Whether to force ambient when docked. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_FORCE_WHEN_DOCKED = "ambient_force_when_docked"; /** * Whether the ambient low bit mode is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_LOW_BIT_ENABLED = "ambient_low_bit_enabled"; /** * The timeout duration in minutes of ambient mode when plugged in. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String AMBIENT_PLUGGED_TIMEOUT_MIN = "ambient_plugged_timeout_min"; /** * What OS does paired device has. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String PAIRED_DEVICE_OS_TYPE = "paired_device_os_type"; // Possible values of PAIRED_DEVICE_OS_TYPE @@ -19680,7 +19680,7 @@ public final class Settings { * The user's last setting for hfp client. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String USER_HFP_CLIENT_SETTING = "user_hfp_client_setting"; // Possible hfp client user setting values @@ -19705,7 +19705,7 @@ public final class Settings { * The companion App name. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String COMPANION_APP_NAME = "wear_companion_app_name"; /** @@ -19713,21 +19713,21 @@ public final class Settings { * wear. 1 for supporting, 0 for not supporting. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String ENABLE_ALL_LANGUAGES = "enable_all_languages"; /** * The Locale (as language tag) the user chose at startup. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String SETUP_LOCALE = "setup_locale"; /** * The version of oem setup present. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String OEM_SETUP_VERSION = "oem_setup_version"; /** @@ -19773,7 +19773,7 @@ public final class Settings { * -{@link BATTERY_SAVER_MODE_CUSTOM} * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String BATTERY_SAVER_MODE = "battery_saver_mode"; /** @@ -19830,7 +19830,7 @@ public final class Settings { * If burn in protection is enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String BURN_IN_PROTECTION_ENABLED = "burn_in_protection"; /** @@ -19849,7 +19849,7 @@ public final class Settings { * RIGHT_WRIST_ROTATION_0 = "2", RIGHT_WRIST_ROTATION_180 = "3" * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String WRIST_ORIENTATION_MODE = "wear_wrist_orientation_mode"; /** @@ -19888,7 +19888,7 @@ public final class Settings { * * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CLOCKWORK_SYSUI_PACKAGE = "clockwork_sysui_package"; /** @@ -19918,7 +19918,7 @@ public final class Settings { * Whether the device has Wet Mode/ Touch Lock Mode enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String WET_MODE_ON = "wet_mode_on"; /** @@ -19937,7 +19937,7 @@ public final class Settings { * Whether charging sounds are enabled. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CHARGING_SOUNDS_ENABLED = "wear_charging_sounds_enabled"; /** @@ -19946,7 +19946,7 @@ public final class Settings { * * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String DYNAMIC_COLOR_THEME_ENABLED = "dynamic_color_theme_enabled"; /** @@ -20038,7 +20038,7 @@ public final class Settings { * The key to indicate the data migration status on device upgrade in Wear Services. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String UPGRADE_DATA_MIGRATION_STATUS = "upgrade_data_migration_status"; @@ -20095,20 +20095,20 @@ public final class Settings { * The custom foreground color. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CUSTOM_COLOR_FOREGROUND = "custom_foreground_color"; /** * The custom background color. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String CUSTOM_COLOR_BACKGROUND = "custom_background_color"; /** The status of the phone switching process. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String PHONE_SWITCHING_STATUS = "phone_switching_status"; /** @@ -20285,7 +20285,7 @@ public final class Settings { * Controls the launcher ui mode on wearable devices. * @hide */ - @Readable(maxTargetSdk = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + @Readable public static final String WEAR_LAUNCHER_UI_MODE = "wear_launcher_ui_mode"; /** Whether Wear Power Anomaly Service is enabled. -- GitLab From 974a5aa8fa449bca959592bef0e9b0e110054691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Mazzucato?= Date: Fri, 18 Oct 2024 11:04:23 +0000 Subject: [PATCH 053/459] Add tracing to FrameTracker This will help us understand why there are some lenghty cpu compute blocks from FrameTracker Bug: 373193674 Change-Id: If286610bf1ba577603c9508785a64361b4687025 Test: perfetto trace Flag: NONE - adding logs --- .../android/internal/jank/FrameTracker.java | 90 +++++++++++-------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index d474c6db4f02..1bf6bcbbcbae 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -252,6 +252,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai mSurfaceChangedCallback = new ViewRootImpl.SurfaceChangedCallback() { @Override public void surfaceCreated(SurfaceControl.Transaction t) { + Trace.beginSection("FrameTracker#surfaceCreated"); mHandler.runWithScissors(() -> { if (mSurfaceControl == null) { mSurfaceControl = mViewRoot.getSurfaceControl(); @@ -261,6 +262,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai } } }, EXECUTOR_TASK_TIMEOUT); + Trace.endSection(); } @Override @@ -462,23 +464,28 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai @Override public void onJankDataAvailable(SurfaceControl.JankData[] jankData) { postCallback(() -> { - if (mCancelled || mMetricsFinalized) { - return; - } - - for (SurfaceControl.JankData jankStat : jankData) { - if (!isInRange(jankStat.frameVsyncId)) { - continue; + try { + Trace.beginSection("FrameTracker#onJankDataAvailable"); + if (mCancelled || mMetricsFinalized) { + return; } - JankInfo info = findJankInfo(jankStat.frameVsyncId); - if (info != null) { - info.update(jankStat); - } else { - mJankInfos.put((int) jankStat.frameVsyncId, - JankInfo.createFromSurfaceControlCallback(jankStat)); + + for (SurfaceControl.JankData jankStat : jankData) { + if (!isInRange(jankStat.frameVsyncId)) { + continue; + } + JankInfo info = findJankInfo(jankStat.frameVsyncId); + if (info != null) { + info.update(jankStat); + } else { + mJankInfos.put((int) jankStat.frameVsyncId, + JankInfo.createFromSurfaceControlCallback(jankStat)); + } } + processJankInfos(); + } finally { + Trace.endSection(); } - processJankInfos(); }); } @@ -505,29 +512,35 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai @Override public void onFrameMetricsAvailable(int dropCountSinceLastInvocation) { postCallback(() -> { - if (mCancelled || mMetricsFinalized) { - return; - } - - // Since this callback might come a little bit late after the end() call. - // We should keep tracking the begin / end timestamp that we can compare with - // vsync timestamp to check if the frame is in the duration of the CUJ. - long totalDurationNanos = mMetricsWrapper.getMetric(FrameMetrics.TOTAL_DURATION); - boolean isFirstFrame = mMetricsWrapper.getMetric(FrameMetrics.FIRST_DRAW_FRAME) == 1; - long frameVsyncId = - mMetricsWrapper.getTiming()[FrameMetrics.Index.FRAME_TIMELINE_VSYNC_ID]; + try { + Trace.beginSection("FrameTracker#onFrameMetricsAvailable"); + if (mCancelled || mMetricsFinalized) { + return; + } - if (!isInRange(frameVsyncId)) { - return; - } - JankInfo info = findJankInfo(frameVsyncId); - if (info != null) { - info.update(totalDurationNanos, isFirstFrame); - } else { - mJankInfos.put((int) frameVsyncId, JankInfo.createFromHwuiCallback( - frameVsyncId, totalDurationNanos, isFirstFrame)); + // Since this callback might come a little bit late after the end() call. + // We should keep tracking the begin / end timestamp that we can compare with + // vsync timestamp to check if the frame is in the duration of the CUJ. + long totalDurationNanos = mMetricsWrapper.getMetric(FrameMetrics.TOTAL_DURATION); + boolean isFirstFrame = + mMetricsWrapper.getMetric(FrameMetrics.FIRST_DRAW_FRAME) == 1; + long frameVsyncId = + mMetricsWrapper.getTiming()[FrameMetrics.Index.FRAME_TIMELINE_VSYNC_ID]; + + if (!isInRange(frameVsyncId)) { + return; + } + JankInfo info = findJankInfo(frameVsyncId); + if (info != null) { + info.update(totalDurationNanos, isFirstFrame); + } else { + mJankInfos.put((int) frameVsyncId, JankInfo.createFromHwuiCallback( + frameVsyncId, totalDurationNanos, isFirstFrame)); + } + processJankInfos(); + } finally { + Trace.endSection(); } - processJankInfos(); }); } @@ -573,6 +586,13 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai @UiThread private void finish() { + Trace.beginSection("FrameTracker#finish"); + finishTraced(); + Trace.endSection(); + } + + @UiThread + private void finishTraced() { if (mMetricsFinalized || mCancelled) return; mMetricsFinalized = true; -- GitLab From ac54d3cccaa79b768d8b4fad9d7737fcee5d7d2f Mon Sep 17 00:00:00 2001 From: wanghuadong Date: Wed, 16 Oct 2024 21:21:48 +0800 Subject: [PATCH 054/459] Remove StartingWindow or cancel the request to add StartingWindow after all activities have been drawn In Embedded mode, all activities have already been drawn before the addition of StartingWindow is completed, then there is no suitable time to remove StartingWindow. So when all activities have been drawn but StartingWindow has not been successfully added, we need to cancel the request to add StartingWindow Bug: 373802899 Change-Id: I4e98947ad305a3434ee22b12612b76f0e0578e96 Signed-off-by: wanghuadong --- services/core/java/com/android/server/wm/ActivityRecord.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index a076cf6bf6ab..3bca2d8e9957 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -6960,7 +6960,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else if (associatedTask.getActivity( r -> r.isVisibleRequested() && !r.firstWindowDrawn) == null) { // The last drawn activity may not be the one that owns the starting window. - final ActivityRecord r = associatedTask.topActivityContainsStartingWindow(); + final ActivityRecord r = associatedTask.getActivity(ar -> ar.mStartingData != null); if (r != null) { r.removeStartingWindow(); } -- GitLab From bb206200e65cfa9ab693764305aa4f460c06d900 Mon Sep 17 00:00:00 2001 From: petsjonkin Date: Fri, 18 Oct 2024 13:31:38 +0000 Subject: [PATCH 055/459] Disable HBMController HDR boost if HDRModifier is enabled Bug: b/374055383 Test: manually tested low power mode Flag: EXEMPT trivial bugfix Change-Id: Ibe923e32b3e9a44fb0ebc8e5e487e674ef505e3a --- .../display/BrightnessRangeController.java | 4 ++++ .../display/HighBrightnessModeController.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/services/core/java/com/android/server/display/BrightnessRangeController.java b/services/core/java/com/android/server/display/BrightnessRangeController.java index 1d68ee54d96c..83b0801ce87f 100644 --- a/services/core/java/com/android/server/display/BrightnessRangeController.java +++ b/services/core/java/com/android/server/display/BrightnessRangeController.java @@ -67,6 +67,10 @@ class BrightnessRangeController { mNormalBrightnessModeController.resetNbmData( displayDeviceConfig.getLuxThrottlingData()); } + if (flags.useNewHdrBrightnessModifier()) { + // HDR boost is handled by HdrBrightnessModifier and should be disabled in HbmController + mHbmController.disableHdrBoost(); + } updateHdrClamper(info, displayToken, displayDeviceConfig); } diff --git a/services/core/java/com/android/server/display/HighBrightnessModeController.java b/services/core/java/com/android/server/display/HighBrightnessModeController.java index 135cab6d0614..6be0c123d262 100644 --- a/services/core/java/com/android/server/display/HighBrightnessModeController.java +++ b/services/core/java/com/android/server/display/HighBrightnessModeController.java @@ -38,6 +38,7 @@ import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.util.FrameworkStatsLog; import com.android.server.display.DisplayManagerService.Clock; import com.android.server.display.config.HighBrightnessModeData; +import com.android.server.display.feature.DisplayManagerFlags; import com.android.server.display.utils.DebugUtils; import java.io.PrintWriter; @@ -119,6 +120,14 @@ class HighBrightnessModeController { @Nullable private HighBrightnessModeMetadata mHighBrightnessModeMetadata; + /** + * If {@link DisplayManagerFlags#useNewHdrBrightnessModifier()} is ON, hdr boost is handled by + * {@link com.android.server.display.brightness.clamper.HdrBrightnessModifier} and should be + * disabled in this class. After flag is cleaned up, this field together with HDR handling + * should be cleaned up from this class. + */ + private boolean mHdrBoostDisabled = false; + HighBrightnessModeController(Handler handler, int width, int height, IBinder displayToken, String displayUniqueId, float brightnessMin, float brightnessMax, HighBrightnessModeData hbmData, HdrBrightnessDeviceConfig hdrBrightnessCfg, @@ -323,6 +332,7 @@ class HighBrightnessModeController { pw.println(" mIsTimeAvailable= " + mIsTimeAvailable); pw.println(" mIsBlockedByLowPowerMode=" + mIsBlockedByLowPowerMode); pw.println(" width*height=" + mWidth + "*" + mHeight); + pw.println(" mHdrBoostDisabled=" + mHdrBoostDisabled); if (mHighBrightnessModeMetadata != null) { pw.println(" mRunningStartTimeMillis=" @@ -373,6 +383,11 @@ class HighBrightnessModeController { return mHbmData != null && mHighBrightnessModeMetadata != null; } + void disableHdrBoost() { + mHdrBoostDisabled = true; + unregisterHdrListener(); + } + private long calculateRemainingTime(long currentTime) { if (!deviceSupportsHbm()) { return 0; @@ -583,6 +598,9 @@ class HighBrightnessModeController { } private void registerHdrListener(IBinder displayToken) { + if (mHdrBoostDisabled) { + return; + } if (mRegisteredDisplayToken == displayToken) { return; } -- GitLab From d4ca0f536133517db83c74eb86d13c3fb4d7dc32 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Wed, 9 Oct 2024 15:19:09 +0200 Subject: [PATCH 056/459] Notif redesign: reduce conversation icon margin Bug: 371174789 Test: visually checked that the notification has the smaller margin Flag: android.app.notifications_redesign_app_icons Change-Id: I50e9806abba4da17cf6c4021a73cffb2e525d873 --- ...tionConversationTemplateViewWrapperTest.kt | 4 +- ...ficationConversationTemplateViewWrapper.kt | 102 ++++++++++-------- 2 files changed, 58 insertions(+), 48 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt index 9d990b1d7edf..9a6a6997b96f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapperTest.kt @@ -26,6 +26,7 @@ import com.android.internal.widget.ConversationLayout import com.android.internal.widget.MessagingGroup import com.android.internal.widget.MessagingImageMessage import com.android.internal.widget.MessagingLinearLayout +import com.android.internal.widget.NotificationRowIconView import com.android.systemui.SysuiTestCase import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.NotificationTestHelper @@ -90,7 +91,7 @@ class NotificationConversationTemplateViewWrapperTest : SysuiTestCase() { private fun fakeConversationLayout( mockDrawableGroupMessage: AnimatedImageDrawable, - mockDrawableImageMessage: AnimatedImageDrawable + mockDrawableImageMessage: AnimatedImageDrawable, ): View { val mockMessagingImageMessage: MessagingImageMessage = mock().apply { @@ -126,6 +127,7 @@ class NotificationConversationTemplateViewWrapperTest : SysuiTestCase() { whenever(requireViewById(R.id.conversation_icon)) .thenReturn(mock()) whenever(findViewById(R.id.icon)).thenReturn(mock()) + whenever(requireViewById(R.id.icon)).thenReturn(mock()) whenever(requireViewById(R.id.conversation_icon_badge_bg)).thenReturn(mock()) whenever(requireViewById(R.id.expand_button)).thenReturn(mock()) whenever(requireViewById(R.id.expand_button_container)).thenReturn(mock()) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt index b4411f1a33a5..f8aff69f0531 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/wrapper/NotificationConversationTemplateViewWrapper.kt @@ -16,15 +16,18 @@ package com.android.systemui.statusbar.notification.row.wrapper +import android.app.Flags import android.content.Context import android.graphics.drawable.AnimatedImageDrawable import android.view.View import android.view.ViewGroup +import android.view.ViewGroup.MarginLayoutParams import com.android.internal.widget.CachingIconView import com.android.internal.widget.ConversationLayout import com.android.internal.widget.MessagingGroup import com.android.internal.widget.MessagingImageMessage import com.android.internal.widget.MessagingLinearLayout +import com.android.internal.widget.NotificationRowIconView import com.android.systemui.res.R import com.android.systemui.statusbar.notification.NotificationFadeAware import com.android.systemui.statusbar.notification.NotificationUtils @@ -32,23 +35,23 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.row.wrapper.NotificationMessagingTemplateViewWrapper.setCustomImageMessageTransform import com.android.systemui.util.children -/** - * Wraps a notification containing a conversation template - */ -class NotificationConversationTemplateViewWrapper constructor( +/** Wraps a notification containing a conversation template */ +class NotificationConversationTemplateViewWrapper( ctx: Context, view: View, - row: ExpandableNotificationRow + row: ExpandableNotificationRow, ) : NotificationTemplateViewWrapper(ctx, view, row) { - private val minHeightWithActions: Int = NotificationUtils.getFontScaledHeight( + private val minHeightWithActions: Int = + NotificationUtils.getFontScaledHeight( ctx, - R.dimen.notification_messaging_actions_min_height - ) + R.dimen.notification_messaging_actions_min_height, + ) private val conversationLayout: ConversationLayout = view as ConversationLayout private lateinit var conversationIconContainer: View private lateinit var conversationIconView: CachingIconView + private lateinit var badgeIconView: NotificationRowIconView private lateinit var conversationBadgeBg: View private lateinit var expandBtn: View private lateinit var expandBtnContainer: View @@ -68,10 +71,13 @@ class NotificationConversationTemplateViewWrapper constructor( messageContainers = conversationLayout.messagingGroups with(conversationLayout) { conversationIconContainer = - requireViewById(com.android.internal.R.id.conversation_icon_container) + requireViewById(com.android.internal.R.id.conversation_icon_container) conversationIconView = requireViewById(com.android.internal.R.id.conversation_icon) + if (Flags.notificationsRedesignAppIcons()) { + badgeIconView = requireViewById(com.android.internal.R.id.icon) + } conversationBadgeBg = - requireViewById(com.android.internal.R.id.conversation_icon_badge_bg) + requireViewById(com.android.internal.R.id.conversation_icon_badge_bg) expandBtn = requireViewById(com.android.internal.R.id.expand_button) expandBtnContainer = requireViewById(com.android.internal.R.id.expand_button_container) importanceRing = requireViewById(com.android.internal.R.id.conversation_icon_badge_ring) @@ -80,7 +86,7 @@ class NotificationConversationTemplateViewWrapper constructor( facePileTop = findViewById(com.android.internal.R.id.conversation_face_pile_top) facePileBottom = findViewById(com.android.internal.R.id.conversation_face_pile_bottom) facePileBottomBg = - findViewById(com.android.internal.R.id.conversation_face_pile_bottom_background) + findViewById(com.android.internal.R.id.conversation_face_pile_bottom_background) } } @@ -88,6 +94,13 @@ class NotificationConversationTemplateViewWrapper constructor( // Reinspect the notification. Before the super call, because the super call also updates // the transformation types and we need to have our values set by then. resolveViews() + if (Flags.notificationsRedesignAppIcons() && row.isShowingAppIcon) { + // Override the margins to be 2dp instead of 4dp according to the new design if we're + // showing the app icon. + val lp = badgeIconView.layoutParams as MarginLayoutParams + lp.setMargins(2, 2, 2, 2) + badgeIconView.layoutParams = lp + } super.onContentUpdated(row) } @@ -96,56 +109,50 @@ class NotificationConversationTemplateViewWrapper constructor( super.updateTransformedTypes() mTransformationHelper.addTransformedView(TRANSFORMING_VIEW_TITLE, conversationTitleView) - addTransformedViews( - messagingLinearLayout, - appName - ) + addTransformedViews(messagingLinearLayout, appName) setCustomImageMessageTransform(mTransformationHelper, imageMessageContainer) addViewsTransformingToSimilar( - conversationIconView, - conversationBadgeBg, - expandBtn, - importanceRing, - facePileTop, - facePileBottom, - facePileBottomBg + conversationIconView, + conversationBadgeBg, + expandBtn, + importanceRing, + facePileTop, + facePileBottom, + facePileBottomBg, ) } override fun getShelfTransformationTarget(): View? = - if (conversationLayout.isImportantConversation) - if (conversationIconView.visibility != View.GONE) - conversationIconView - else - // A notification with a fallback icon was set to important. Currently - // the transformation doesn't work for these and needs to be fixed. - // In the meantime those are using the icon. - super.getShelfTransformationTarget() + if (conversationLayout.isImportantConversation) + if (conversationIconView.visibility != View.GONE) conversationIconView else - super.getShelfTransformationTarget() + // A notification with a fallback icon was set to important. Currently + // the transformation doesn't work for these and needs to be fixed. + // In the meantime those are using the icon. + super.getShelfTransformationTarget() + else super.getShelfTransformationTarget() override fun setRemoteInputVisible(visible: Boolean) = - conversationLayout.showHistoricMessages(visible) + conversationLayout.showHistoricMessages(visible) override fun updateExpandability( expandable: Boolean, onClickListener: View.OnClickListener, - requestLayout: Boolean + requestLayout: Boolean, ) = conversationLayout.updateExpandability(expandable, onClickListener) override fun disallowSingleClick(x: Float, y: Float): Boolean { - val isOnExpandButton = expandBtnContainer.visibility == View.VISIBLE && - isOnView(expandBtnContainer, x, y) + val isOnExpandButton = + expandBtnContainer.visibility == View.VISIBLE && isOnView(expandBtnContainer, x, y) return isOnExpandButton || super.disallowSingleClick(x, y) } override fun getMinLayoutHeight(): Int = - if (mActionsContainer != null && mActionsContainer.visibility != View.GONE) - minHeightWithActions - else - super.getMinLayoutHeight() + if (mActionsContainer != null && mActionsContainer.visibility != View.GONE) + minHeightWithActions + else super.getMinLayoutHeight() override fun setNotificationFaded(faded: Boolean) { // Do not call super @@ -157,16 +164,17 @@ class NotificationConversationTemplateViewWrapper constructor( override fun setAnimationsRunning(running: Boolean) { // We apply to both the child message containers in a conversation group, // and the top level image message container. - val containers = messageContainers.asSequence().map { it.messageContainer } + + val containers = + messageContainers.asSequence().map { it.messageContainer } + sequenceOf(imageMessageContainer) val drawables = - containers - .flatMap { it.children } - .mapNotNull { child -> - (child as? MessagingImageMessage)?.let { imageMessage -> - imageMessage.drawable as? AnimatedImageDrawable - } - } + containers + .flatMap { it.children } + .mapNotNull { child -> + (child as? MessagingImageMessage)?.let { imageMessage -> + imageMessage.drawable as? AnimatedImageDrawable + } + } drawables.toSet().forEach { when { running -> it.start() -- GitLab From 87bd231d296fec3e827478fdcdaf63932390fc49 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 18 Oct 2024 14:53:13 +0000 Subject: [PATCH 057/459] Remove dreaming hosted lockscreen - Part #4 (end) Bug: 364380926 Test: atest SystemUITests Flag: EXEMPT cleanup old code Change-Id: I09ba4cd07916f9e52f0489d0441df3b642baa07e --- .../repository/KeyguardRepositoryImplTest.kt | 33 +--- .../interactor/KeyguardClockInteractorTest.kt | 11 -- ...ockscreenHostedDreamGestureListenerTest.kt | 185 ------------------ .../src/com/android/systemui/flags/Flags.kt | 7 +- .../data/repository/KeyguardRepository.kt | 12 -- .../interactor/KeyguardClockInteractor.kt | 10 +- .../domain/interactor/KeyguardInteractor.kt | 7 - .../interactor/LightRevealScrimInteractor.kt | 1 - .../keyguard/shared/model/KeyguardState.kt | 9 - .../DeviceEntryBackgroundViewModel.kt | 1 - .../ui/viewmodel/DeviceEntryIconViewModel.kt | 47 ++--- .../LockscreenHostedDreamGestureListener.kt | 72 ------- .../data/repository/FakeKeyguardRepository.kt | 7 - 13 files changed, 26 insertions(+), 376 deletions(-) delete mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/shade/LockscreenHostedDreamGestureListener.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt index 93754fd7e778..4c9049370c41 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt @@ -313,16 +313,6 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { verify(statusBarStateController).removeCallback(any()) } - @Test - fun isActiveDreamLockscreenHosted() = - testScope.runTest { - underTest.setIsActiveDreamLockscreenHosted(true) - assertThat(underTest.isActiveDreamLockscreenHosted.value).isEqualTo(true) - - underTest.setIsActiveDreamLockscreenHosted(false) - assertThat(underTest.isActiveDreamLockscreenHosted.value).isEqualTo(false) - } - @Test fun isUdfpsSupported() = testScope.runTest { @@ -423,17 +413,17 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { runCurrent() listener.onDozeTransition( DozeMachine.State.DOZE_REQUEST_PULSE, - DozeMachine.State.DOZE_PULSING + DozeMachine.State.DOZE_PULSING, ) runCurrent() listener.onDozeTransition( DozeMachine.State.DOZE_SUSPEND_TRIGGERS, - DozeMachine.State.DOZE_PULSE_DONE + DozeMachine.State.DOZE_PULSE_DONE, ) runCurrent() listener.onDozeTransition( DozeMachine.State.DOZE_AOD_PAUSING, - DozeMachine.State.DOZE_AOD_PAUSED + DozeMachine.State.DOZE_AOD_PAUSED, ) runCurrent() @@ -443,22 +433,22 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { // Initial value will be UNINITIALIZED DozeTransitionModel( DozeStateModel.UNINITIALIZED, - DozeStateModel.UNINITIALIZED + DozeStateModel.UNINITIALIZED, ), DozeTransitionModel(DozeStateModel.INITIALIZED, DozeStateModel.DOZE), DozeTransitionModel(DozeStateModel.DOZE, DozeStateModel.DOZE_AOD), DozeTransitionModel(DozeStateModel.DOZE_AOD_DOCKED, DozeStateModel.FINISH), DozeTransitionModel( DozeStateModel.DOZE_REQUEST_PULSE, - DozeStateModel.DOZE_PULSING + DozeStateModel.DOZE_PULSING, ), DozeTransitionModel( DozeStateModel.DOZE_SUSPEND_TRIGGERS, - DozeStateModel.DOZE_PULSE_DONE + DozeStateModel.DOZE_PULSE_DONE, ), DozeTransitionModel( DozeStateModel.DOZE_AOD_PAUSING, - DozeStateModel.DOZE_AOD_PAUSED + DozeStateModel.DOZE_AOD_PAUSED, ), ) ) @@ -510,12 +500,7 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { // consuming it should handle that properly. assertThat(values).isEqualTo(listOf(null)) - listOf( - Point(500, 500), - Point(0, 0), - null, - Point(250, 250), - ) + listOf(Point(500, 500), Point(0, 0), null, Point(250, 250)) .onEach { facePropertyRepository.setSensorLocation(it) runCurrent() @@ -551,7 +536,7 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { .onEach { biometricSourceType -> underTest.setBiometricUnlockState( BiometricUnlockMode.NONE, - BiometricUnlockSource.Companion.fromBiometricSourceType(biometricSourceType) + BiometricUnlockSource.Companion.fromBiometricSourceType(biometricSourceType), ) runCurrent() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt index 48621047016b..e60d971c7289 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractorTest.kt @@ -171,17 +171,6 @@ class KeyguardClockInteractorTest : SysuiTestCase() { assertThat(value).isTrue() } - @Test - @EnableSceneContainer - fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_isActiveDreamLockscreenHosted_true() = - testScope.runTest { - val value by collectLastValue(underTest.clockShouldBeCentered) - kosmos.shadeRepository.setShadeLayoutWide(true) - kosmos.activeNotificationListRepository.setActiveNotifs(1) - kosmos.keyguardRepository.setIsActiveDreamLockscreenHosted(true) - assertThat(value).isTrue() - } - @Test @EnableSceneContainer fun clockShouldBeCentered_sceneContainerFlagOn_splitMode_hasPulsingNotifications_false() = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt deleted file mode 100644 index 2ac0ed0efff4..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/LockscreenHostedDreamGestureListenerTest.kt +++ /dev/null @@ -1,185 +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.shade - -import android.os.PowerManager -import android.view.MotionEvent -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor -import com.android.systemui.classifier.FalsingCollector -import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository -import com.android.systemui.plugins.FalsingManager -import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.power.data.repository.FakePowerRepository -import com.android.systemui.power.domain.interactor.PowerInteractorFactory -import com.android.systemui.statusbar.StatusBarState -import com.android.systemui.util.mockito.whenever -import com.google.common.truth.Truth -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope -import kotlinx.coroutines.test.UnconfinedTestDispatcher -import kotlinx.coroutines.test.runCurrent -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers -import org.mockito.Mock -import org.mockito.Mockito.never -import org.mockito.Mockito.verify -import org.mockito.MockitoAnnotations - -@SmallTest -@OptIn(ExperimentalCoroutinesApi::class) -@RunWith(AndroidJUnit4::class) -class LockscreenHostedDreamGestureListenerTest : SysuiTestCase() { - @Mock private lateinit var falsingManager: FalsingManager - @Mock private lateinit var falsingCollector: FalsingCollector - @Mock private lateinit var statusBarStateController: StatusBarStateController - @Mock private lateinit var shadeLogger: ShadeLogger - @Mock private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor - - private val testDispatcher = UnconfinedTestDispatcher() - private val testScope = TestScope(testDispatcher) - - private lateinit var powerRepository: FakePowerRepository - private lateinit var keyguardRepository: FakeKeyguardRepository - private lateinit var underTest: LockscreenHostedDreamGestureListener - - @Before - fun setUp() { - MockitoAnnotations.initMocks(this) - - powerRepository = FakePowerRepository() - keyguardRepository = FakeKeyguardRepository() - - underTest = - LockscreenHostedDreamGestureListener( - falsingManager, - PowerInteractorFactory.create( - repository = powerRepository, - statusBarStateController = statusBarStateController, - ) - .powerInteractor, - statusBarStateController, - primaryBouncerInteractor, - keyguardRepository, - shadeLogger, - ) - whenever(statusBarStateController.state).thenReturn(StatusBarState.KEYGUARD) - whenever(primaryBouncerInteractor.isBouncerShowing()).thenReturn(false) - } - - @Test - fun testGestureDetector_onSingleTap_whileDreaming() = - testScope.runTest { - // GIVEN device dreaming and the dream is hosted in lockscreen - whenever(statusBarStateController.isDreaming).thenReturn(true) - keyguardRepository.setIsActiveDreamLockscreenHosted(true) - testScope.runCurrent() - - // GIVEN the falsing manager does NOT think the tap is a false tap - whenever(falsingManager.isFalseTap(ArgumentMatchers.anyInt())).thenReturn(false) - - // WHEN there's a tap - underTest.onSingleTapUp(upEv) - - // THEN wake up device if dreaming - Truth.assertThat(powerRepository.lastWakeWhy).isNotNull() - Truth.assertThat(powerRepository.lastWakeReason).isEqualTo(PowerManager.WAKE_REASON_TAP) - } - - @Test - fun testGestureDetector_onSingleTap_notOnKeyguard() = - testScope.runTest { - // GIVEN device dreaming and the dream is hosted in lockscreen - whenever(statusBarStateController.isDreaming).thenReturn(true) - keyguardRepository.setIsActiveDreamLockscreenHosted(true) - testScope.runCurrent() - - // GIVEN shade is open - whenever(statusBarStateController.state).thenReturn(StatusBarState.SHADE) - - // GIVEN the falsing manager does NOT think the tap is a false tap - whenever(falsingManager.isFalseTap(ArgumentMatchers.anyInt())).thenReturn(false) - - // WHEN there's a tap - underTest.onSingleTapUp(upEv) - - // THEN the falsing manager never gets a call - verify(falsingManager, never()).isFalseTap(ArgumentMatchers.anyInt()) - } - - @Test - fun testGestureDetector_onSingleTap_bouncerShown() = - testScope.runTest { - // GIVEN device dreaming and the dream is hosted in lockscreen - whenever(statusBarStateController.isDreaming).thenReturn(true) - keyguardRepository.setIsActiveDreamLockscreenHosted(true) - testScope.runCurrent() - - // GIVEN bouncer is expanded - whenever(primaryBouncerInteractor.isBouncerShowing()).thenReturn(true) - - // GIVEN the falsing manager does NOT think the tap is a false tap - whenever(falsingManager.isFalseTap(ArgumentMatchers.anyInt())).thenReturn(false) - - // WHEN there's a tap - underTest.onSingleTapUp(upEv) - - // THEN the falsing manager never gets a call - verify(falsingManager, never()).isFalseTap(ArgumentMatchers.anyInt()) - } - - @Test - fun testGestureDetector_onSingleTap_falsing() = - testScope.runTest { - // GIVEN device dreaming and the dream is hosted in lockscreen - whenever(statusBarStateController.isDreaming).thenReturn(true) - keyguardRepository.setIsActiveDreamLockscreenHosted(true) - testScope.runCurrent() - - // GIVEN the falsing manager thinks the tap is a false tap - whenever(falsingManager.isFalseTap(ArgumentMatchers.anyInt())).thenReturn(true) - - // WHEN there's a tap - underTest.onSingleTapUp(upEv) - - // THEN the device doesn't wake up - Truth.assertThat(powerRepository.lastWakeWhy).isNull() - Truth.assertThat(powerRepository.lastWakeReason).isNull() - } - - @Test - fun testSingleTap_notDreaming_noFalsingCheck() = - testScope.runTest { - // GIVEN device not dreaming with lockscreen hosted dream - whenever(statusBarStateController.isDreaming).thenReturn(false) - keyguardRepository.setIsActiveDreamLockscreenHosted(false) - testScope.runCurrent() - - // WHEN there's a tap - underTest.onSingleTapUp(upEv) - - // THEN the falsing manager never gets a call - verify(falsingManager, never()).isFalseTap(ArgumentMatchers.anyInt()) - } -} - -private val upEv = MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_UP, 0f, 0f, 0) diff --git a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt index 95cd9eb4ae4b..61832875dc2e 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/Flags.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/Flags.kt @@ -165,7 +165,7 @@ object Flags { val QS_USER_DETAIL_SHORTCUT = resourceBooleanFlag( R.bool.flag_lockscreen_qs_user_detail_shortcut, - "qs_user_detail_shortcut" + "qs_user_detail_shortcut", ) // TODO(b/254512383): Tracking Bug @@ -365,11 +365,6 @@ object Flags { val ZJ_285570694_LOCKSCREEN_TRANSITION_FROM_AOD = releasedFlag("zj_285570694_lockscreen_transition_from_aod") - // 3000 - dream - // TODO(b/285059790) : Tracking Bug - @JvmField - val LOCKSCREEN_WALLPAPER_DREAM_ENABLED = unreleasedFlag("enable_lockscreen_wallpaper_dream") - // TODO(b/283447257): Tracking bug @JvmField val BIGPICTURE_NOTIFICATION_LAZY_LOADING = diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 821017418277..23c6a4f82e73 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -184,9 +184,6 @@ interface KeyguardRepository { /** Observable for whether the device is dreaming with an overlay, see [DreamOverlayService] */ val isDreamingWithOverlay: Flow - /** Observable for device dreaming state and the active dream is hosted in lockscreen */ - val isActiveDreamLockscreenHosted: StateFlow - /** * Observable for the amount of doze we are currently in. * @@ -308,8 +305,6 @@ interface KeyguardRepository { fun setIsDozing(isDozing: Boolean) - fun setIsActiveDreamLockscreenHosted(isLockscreenHosted: Boolean) - fun dozeTimeTick() fun showDismissibleKeyguard() @@ -637,9 +632,6 @@ constructor( private val _isQuickSettingsVisible = MutableStateFlow(false) override val isQuickSettingsVisible: Flow = _isQuickSettingsVisible.asStateFlow() - private val _isActiveDreamLockscreenHosted = MutableStateFlow(false) - override val isActiveDreamLockscreenHosted = _isActiveDreamLockscreenHosted.asStateFlow() - private val _shortcutAbsoluteTop = MutableStateFlow(0F) override val shortcutAbsoluteTop = _shortcutAbsoluteTop.asStateFlow() @@ -698,10 +690,6 @@ constructor( _isQuickSettingsVisible.value = isVisible } - override fun setIsActiveDreamLockscreenHosted(isLockscreenHosted: Boolean) { - _isActiveDreamLockscreenHosted.value = isLockscreenHosted - } - override fun setClockShouldBeCentered(shouldBeCentered: Boolean) { _clockShouldBeCentered.value = shouldBeCentered } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt index 5b7eeddfb8e1..d18d6dce2e94 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardClockInteractor.kt @@ -105,21 +105,13 @@ constructor( combine( shadeInteractor.isShadeLayoutWide, activeNotificationsInteractor.areAnyNotificationsPresent, - keyguardInteractor.isActiveDreamLockscreenHosted, isOnAod, headsUpNotificationInteractor.isHeadsUpOrAnimatingAway, keyguardInteractor.isDozing, - ) { - isShadeLayoutWide, - areAnyNotificationsPresent, - isActiveDreamLockscreenHosted, - isOnAod, - isHeadsUp, - isDozing -> + ) { isShadeLayoutWide, areAnyNotificationsPresent, isOnAod, isHeadsUp, isDozing -> when { !isShadeLayoutWide -> true !areAnyNotificationsPresent -> true - isActiveDreamLockscreenHosted -> true // Pulsing notification appears on the right. Move clock left to avoid overlap. isHeadsUp && isDozing -> false else -> isOnAod diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 6ecbc6175e40..5369b53b5f8f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -189,9 +189,6 @@ constructor( /** Whether any dreaming is running, including the doze dream. */ val isDreamingAny: Flow = repository.isDreaming - /** Whether the system is dreaming and the active dream is hosted in lockscreen */ - val isActiveDreamLockscreenHosted: StateFlow = repository.isActiveDreamLockscreenHosted - /** Event for when the camera gesture is detected */ val onCameraLaunchDetected: Flow = repository.onCameraLaunchDetected.filter { it.type != CameraLaunchType.IGNORE } @@ -477,10 +474,6 @@ constructor( } } - fun setIsActiveDreamLockscreenHosted(isLockscreenHosted: Boolean) { - repository.setIsActiveDreamLockscreenHosted(isLockscreenHosted) - } - /** Sets whether quick settings or quick-quick settings is visible. */ fun setQuickSettingsVisible(isVisible: Boolean) { repository.setQuickSettingsVisible(isVisible) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt index cf747c81769a..328399a0b45c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt @@ -149,7 +149,6 @@ constructor( KeyguardState.DOZING -> false KeyguardState.AOD -> false KeyguardState.DREAMING -> true - KeyguardState.DREAMING_LOCKSCREEN_HOSTED -> true KeyguardState.GLANCEABLE_HUB -> true KeyguardState.ALTERNATE_BOUNCER -> true KeyguardState.PRIMARY_BOUNCER -> true diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt index 080ddfd18370..f0e79b8590a0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/shared/model/KeyguardState.kt @@ -40,12 +40,6 @@ enum class KeyguardState { * parties to present their own UI over keyguard, like a screensaver. */ DREAMING, - /** - * A device state after the device times out, which can be from both LOCKSCREEN or GONE states. - * It is a special version of DREAMING state but not DOZING. The active dream will be windowless - * and hosted in the lockscreen. - */ - DREAMING_LOCKSCREEN_HOSTED, /** * The device has entered a special low-power mode within SystemUI, also called the Always-on * Display (AOD). A minimal UI is presented to show critical information. If the device is in @@ -125,7 +119,6 @@ enum class KeyguardState { OFF, DOZING, DREAMING, - DREAMING_LOCKSCREEN_HOSTED, AOD, ALTERNATE_BOUNCER, OCCLUDED, @@ -142,7 +135,6 @@ enum class KeyguardState { OFF, DOZING, DREAMING, - DREAMING_LOCKSCREEN_HOSTED, AOD, ALTERNATE_BOUNCER, OCCLUDED, @@ -166,7 +158,6 @@ enum class KeyguardState { OFF -> false DOZING -> false DREAMING -> false - DREAMING_LOCKSCREEN_HOSTED -> false GLANCEABLE_HUB -> true AOD -> false ALTERNATE_BOUNCER -> true diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt index 68244d842046..4c667c1c702d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryBackgroundViewModel.kt @@ -114,7 +114,6 @@ constructor( keyguardTransitionInteractor.currentKeyguardState.replayCache.last() ) { KeyguardState.GLANCEABLE_HUB, - KeyguardState.DREAMING_LOCKSCREEN_HOSTED, KeyguardState.GONE, KeyguardState.OCCLUDED, KeyguardState.OFF, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt index d3bb4f5d7508..f5e0c81ca9a2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DeviceEntryIconViewModel.kt @@ -95,11 +95,10 @@ constructor( .shareIn(scope, SharingStarted.WhileSubscribed()) .onStart { emit(initialAlphaFromKeyguardState(transitionInteractor.getCurrentState())) } private val alphaMultiplierFromShadeExpansion: Flow = - combine( - showingAlternateBouncer, + combine(showingAlternateBouncer, shadeExpansion, qsProgress) { + showingAltBouncer, shadeExpansion, - qsProgress, - ) { showingAltBouncer, shadeExpansion, qsProgress -> + qsProgress -> val interpolatedQsProgress = (qsProgress * 2).coerceIn(0f, 1f) if (showingAltBouncer) { 1f @@ -113,13 +112,9 @@ constructor( combine( burnInInteractor.deviceEntryIconXOffset, burnInInteractor.deviceEntryIconYOffset, - burnInInteractor.udfpsProgress + burnInInteractor.udfpsProgress, ) { fullyDozingBurnInX, fullyDozingBurnInY, fullyDozingBurnInProgress -> - BurnInOffsets( - fullyDozingBurnInX, - fullyDozingBurnInY, - fullyDozingBurnInProgress, - ) + BurnInOffsets(fullyDozingBurnInX, fullyDozingBurnInY, fullyDozingBurnInProgress) } private val dozeAmount: Flow = transitionInteractor.transitionValue(KeyguardState.AOD) @@ -129,22 +124,15 @@ constructor( BurnInOffsets( intEvaluator.evaluate(dozeAmount, 0, burnInOffsets.x), intEvaluator.evaluate(dozeAmount, 0, burnInOffsets.y), - floatEvaluator.evaluate(dozeAmount, 0, burnInOffsets.progress) + floatEvaluator.evaluate(dozeAmount, 0, burnInOffsets.progress), ) } val deviceEntryViewAlpha: Flow = - combine( - transitionAlpha, - alphaMultiplierFromShadeExpansion, - ) { alpha, alphaMultiplier -> + combine(transitionAlpha, alphaMultiplierFromShadeExpansion) { alpha, alphaMultiplier -> alpha * alphaMultiplier } - .stateIn( - scope = scope, - started = SharingStarted.WhileSubscribed(), - initialValue = 0f, - ) + .stateIn(scope = scope, started = SharingStarted.WhileSubscribed(), initialValue = 0f) private fun initialAlphaFromKeyguardState(keyguardState: KeyguardState): Float { return when (keyguardState) { @@ -155,11 +143,10 @@ constructor( KeyguardState.GLANCEABLE_HUB, KeyguardState.GONE, KeyguardState.OCCLUDED, - KeyguardState.DREAMING_LOCKSCREEN_HOSTED, - KeyguardState.UNDEFINED, -> 0f + KeyguardState.UNDEFINED -> 0f KeyguardState.AOD, KeyguardState.ALTERNATE_BOUNCER, - KeyguardState.LOCKSCREEN, -> 1f + KeyguardState.LOCKSCREEN -> 1f } } @@ -171,7 +158,7 @@ constructor( combine( transitionInteractor.startedKeyguardTransitionStep.sample( shadeInteractor.isAnyFullyExpanded, - ::Pair + ::Pair, ), animatedBurnInOffsets, nonAnimatedBurnInOffsets, @@ -228,10 +215,9 @@ constructor( } val iconType: Flow = - combine( - deviceEntryUdfpsInteractor.isListeningForUdfps, - isUnlocked, - ) { isListeningForUdfps, isUnlocked -> + combine(deviceEntryUdfpsInteractor.isListeningForUdfps, isUnlocked) { + isListeningForUdfps, + isUnlocked -> if (isListeningForUdfps) { if (isUnlocked) { // Don't show any UI until isUnlocked=false. This covers the case @@ -250,10 +236,7 @@ constructor( val isVisible: Flow = deviceEntryViewAlpha.map { it > 0f }.distinctUntilChanged() private val isInteractive: Flow = - combine( - iconType, - isUdfpsSupported, - ) { deviceEntryStatus, isUdfps -> + combine(iconType, isUdfpsSupported) { deviceEntryStatus, isUdfps -> when (deviceEntryStatus) { DeviceEntryIconView.IconType.LOCK -> isUdfps DeviceEntryIconView.IconType.UNLOCK -> true diff --git a/packages/SystemUI/src/com/android/systemui/shade/LockscreenHostedDreamGestureListener.kt b/packages/SystemUI/src/com/android/systemui/shade/LockscreenHostedDreamGestureListener.kt deleted file mode 100644 index 45fc68a793bd..000000000000 --- a/packages/SystemUI/src/com/android/systemui/shade/LockscreenHostedDreamGestureListener.kt +++ /dev/null @@ -1,72 +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.shade - -import android.os.PowerManager -import android.view.GestureDetector -import android.view.MotionEvent -import com.android.systemui.bouncer.domain.interactor.PrimaryBouncerInteractor -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.keyguard.data.repository.KeyguardRepository -import com.android.systemui.plugins.FalsingManager -import com.android.systemui.plugins.FalsingManager.LOW_PENALTY -import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.power.domain.interactor.PowerInteractor -import com.android.systemui.statusbar.StatusBarState -import javax.inject.Inject - -/** - * This gestureListener will wake up by tap when the device is dreaming but not dozing, and the - * selected screensaver is hosted in lockscreen. Tap is gated by the falsing manager. - * - * Touches go through the [NotificationShadeWindowViewController]. - */ -@SysUISingleton -class LockscreenHostedDreamGestureListener -@Inject -constructor( - private val falsingManager: FalsingManager, - private val powerInteractor: PowerInteractor, - private val statusBarStateController: StatusBarStateController, - private val primaryBouncerInteractor: PrimaryBouncerInteractor, - private val keyguardRepository: KeyguardRepository, - private val shadeLogger: ShadeLogger, -) : GestureDetector.SimpleOnGestureListener() { - private val TAG = this::class.simpleName - - override fun onSingleTapUp(e: MotionEvent): Boolean { - if (shouldHandleMotionEvent()) { - if (!falsingManager.isFalseTap(LOW_PENALTY)) { - shadeLogger.d("$TAG#onSingleTapUp tap handled, requesting wakeUpIfDreaming") - powerInteractor.wakeUpIfDreaming( - "DREAMING_SINGLE_TAP", - PowerManager.WAKE_REASON_TAP - ) - } else { - shadeLogger.d("$TAG#onSingleTapUp false tap ignored") - } - return true - } - return false - } - - private fun shouldHandleMotionEvent(): Boolean { - return keyguardRepository.isActiveDreamLockscreenHosted.value && - statusBarStateController.state == StatusBarState.KEYGUARD && - !primaryBouncerInteractor.isBouncerShowing() - } -} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index e513e8d2a350..0e69a6722af9 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -88,9 +88,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _isDreamingWithOverlay = MutableStateFlow(false) override val isDreamingWithOverlay: Flow = _isDreamingWithOverlay - private val _isActiveDreamLockscreenHosted = MutableStateFlow(false) - override val isActiveDreamLockscreenHosted: StateFlow = _isActiveDreamLockscreenHosted - private val _dozeAmount = MutableStateFlow(0f) override val linearDozeAmount: Flow = _dozeAmount @@ -235,10 +232,6 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { _isDreamingWithOverlay.value = isDreaming } - override fun setIsActiveDreamLockscreenHosted(isLockscreenHosted: Boolean) { - _isActiveDreamLockscreenHosted.value = isLockscreenHosted - } - fun setDozeAmount(dozeAmount: Float) { _dozeAmount.value = dozeAmount } -- GitLab From a528bda1b1a2543a42d63a172e88eaa43da08be2 Mon Sep 17 00:00:00 2001 From: omarmt Date: Wed, 16 Oct 2024 12:32:48 +0000 Subject: [PATCH 058/459] Cleanup NestedScrollSource.Drag usages Drag and UserInput are exactly the same ```kotlin /** Dragging via mouse/touch/etc events. */ @Deprecated( "This has been replaced by UserInput.", replaceWith = ReplaceWith( "NestedScrollSource.UserInput", "import androidx.compose.ui.input.nestedscroll." + "NestedScrollSource.Companion.UserInput" ) ) val Drag: NestedScrollSource = UserInput ``` Test: No tests Bug: 371984715 Flag: com.android.systemui.scene_container Change-Id: Iac0324f863c52273b9e72392a4168e78a7008685 --- .../animation/scene/DraggableHandlerTest.kt | 30 +++------- ...ficationScrimNestedScrollConnectionTest.kt | 57 +++++-------------- 2 files changed, 24 insertions(+), 63 deletions(-) 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 a0fed9064181..339445e3483a 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 @@ -22,7 +22,7 @@ import androidx.compose.foundation.gestures.Orientation import androidx.compose.material3.Text import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion.UserInput import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.LayoutDirection @@ -294,15 +294,10 @@ class DraggableHandlerTest { available: Offset, consumedByScroll: Offset = Offset.Zero, ) { - val consumedByPreScroll = - onPreScroll(available = available, source = NestedScrollSource.Drag) + val consumedByPreScroll = onPreScroll(available = available, source = UserInput) val consumed = consumedByPreScroll + consumedByScroll - onPostScroll( - consumed = consumed, - available = available - consumed, - source = NestedScrollSource.Drag, - ) + onPostScroll(consumed = consumed, available = available - consumed, source = UserInput) } fun NestedScrollConnection.preFling( @@ -738,7 +733,7 @@ class DraggableHandlerTest { val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeWithPreview) nestedScroll.onPreScroll( available = downOffset(fractionOfScreen = 0.1f), - source = NestedScrollSource.Drag, + source = UserInput, ) assertIdle(currentScene = SceneA) } @@ -750,7 +745,7 @@ class DraggableHandlerTest { nestedScroll.onPostScroll( consumed = Offset.Zero, available = Offset.Zero, - source = NestedScrollSource.Drag, + source = UserInput, ) assertIdle(currentScene = SceneA) @@ -764,7 +759,7 @@ class DraggableHandlerTest { nestedScroll.onPostScroll( consumed = Offset.Zero, available = downOffset(fractionOfScreen = 0.1f), - source = NestedScrollSource.Drag, + source = UserInput, ) assertTransition(currentScene = SceneA) @@ -784,16 +779,12 @@ class DraggableHandlerTest { val consumed = nestedScroll.onPreScroll( available = downOffset(fractionOfScreen = 0.1f), - source = NestedScrollSource.Drag, + source = UserInput, ) assertThat(progress).isEqualTo(0.2f) // do nothing on postScroll - nestedScroll.onPostScroll( - consumed = consumed, - available = Offset.Zero, - source = NestedScrollSource.Drag, - ) + nestedScroll.onPostScroll(consumed = consumed, available = Offset.Zero, source = UserInput) assertThat(progress).isEqualTo(0.2f) nestedScroll.scroll(available = downOffset(fractionOfScreen = 0.1f)) @@ -813,10 +804,7 @@ class DraggableHandlerTest { nestedScroll.preFling(available = Velocity.Zero) // a pre scroll event, that could be intercepted by DraggableHandlerImpl - nestedScroll.onPreScroll( - available = Offset(0f, secondScroll), - source = NestedScrollSource.Drag, - ) + nestedScroll.onPreScroll(available = Offset(0f, secondScroll), source = UserInput) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt index 97fa6eb17b5b..75479ad35725 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt @@ -17,7 +17,7 @@ package com.android.systemui.statusbar.notification import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.input.nestedscroll.NestedScrollSource +import androidx.compose.ui.input.nestedscroll.NestedScrollSource.Companion.UserInput import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -58,10 +58,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { contentHeight = COLLAPSED_CONTENT_HEIGHT val offsetConsumed = - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = -1f), - source = NestedScrollSource.Drag, - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = -1f), source = UserInput) assertThat(offsetConsumed).isEqualTo(Offset.Zero) assertThat(isStarted).isEqualTo(false) @@ -73,10 +70,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrimOffset = MIN_SCRIM_OFFSET val offsetConsumed = - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = -1f), - source = NestedScrollSource.Drag, - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = -1f), source = UserInput) assertThat(offsetConsumed).isEqualTo(Offset.Zero) assertThat(isStarted).isEqualTo(false) @@ -88,10 +82,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { val availableOffset = Offset(x = 0f, y = -1f) val offsetConsumed = - scrollConnection.onPreScroll( - available = availableOffset, - source = NestedScrollSource.Drag, - ) + scrollConnection.onPreScroll(available = availableOffset, source = UserInput) assertThat(offsetConsumed).isEqualTo(availableOffset) assertThat(isStarted).isEqualTo(true) @@ -105,10 +96,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { val availableOffset = Offset(x = 0f, y = -2f) val consumableOffset = Offset(x = 0f, y = -1f) val offsetConsumed = - scrollConnection.onPreScroll( - available = availableOffset, - source = NestedScrollSource.Drag, - ) + scrollConnection.onPreScroll(available = availableOffset, source = UserInput) assertThat(offsetConsumed).isEqualTo(consumableOffset) assertThat(isStarted).isEqualTo(true) @@ -120,7 +108,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrollConnection.onPostScroll( consumed = Offset.Zero, available = Offset(x = 0f, y = -1f), - source = NestedScrollSource.Drag, + source = UserInput, ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) @@ -130,10 +118,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { @Test fun onScrollDown_canStartPreScroll_ignoreScroll() = runTest { val offsetConsumed = - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = 1f), - source = NestedScrollSource.Drag, - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = 1f), source = UserInput) assertThat(offsetConsumed).isEqualTo(Offset.Zero) assertThat(isStarted).isEqualTo(false) @@ -148,7 +133,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrollConnection.onPostScroll( consumed = Offset.Zero, available = availableOffset, - source = NestedScrollSource.Drag + source = UserInput, ) assertThat(offsetConsumed).isEqualTo(availableOffset) @@ -165,7 +150,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrollConnection.onPostScroll( consumed = Offset.Zero, available = availableOffset, - source = NestedScrollSource.Drag + source = UserInput, ) assertThat(offsetConsumed).isEqualTo(consumableOffset) @@ -180,7 +165,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrollConnection.onPostScroll( consumed = Offset.Zero, available = Offset(x = 0f, y = 1f), - source = NestedScrollSource.Drag + source = UserInput, ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) @@ -197,7 +182,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { scrollConnection.onPostScroll( consumed = Offset.Zero, available = Offset(x = 0f, y = 1f), - source = NestedScrollSource.Drag + source = UserInput, ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) @@ -210,17 +195,11 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { fun canContinueScroll_inBetweenMinMaxOffset_true() = runTest { scrimOffset = (MIN_SCRIM_OFFSET + MAX_SCRIM_OFFSET) / 2f contentHeight = EXPANDED_CONTENT_HEIGHT - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = -1f), - source = NestedScrollSource.Drag - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = -1f), source = UserInput) assertThat(isStarted).isEqualTo(true) - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = 1f), - source = NestedScrollSource.Drag - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = 1f), source = UserInput) assertThat(isStarted).isEqualTo(true) } @@ -229,17 +208,11 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { fun canContinueScroll_atMaxOffset_false() = runTest { scrimOffset = MAX_SCRIM_OFFSET contentHeight = EXPANDED_CONTENT_HEIGHT - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = -1f), - source = NestedScrollSource.Drag - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = -1f), source = UserInput) assertThat(isStarted).isEqualTo(true) - scrollConnection.onPreScroll( - available = Offset(x = 0f, y = 1f), - source = NestedScrollSource.Drag - ) + scrollConnection.onPreScroll(available = Offset(x = 0f, y = 1f), source = UserInput) assertThat(isStarted).isEqualTo(false) } -- GitLab From 8b87e1afcc6c9c910193281c3c85e035cdf6afa4 Mon Sep 17 00:00:00 2001 From: Pat Manning Date: Tue, 8 Oct 2024 17:17:20 +0100 Subject: [PATCH 059/459] Migrate ShortcutHelper from Activity to BottomSheet Dialog. Fix: 362742276 Fix: 368284741 Fix: 362736342 Fix: 362733890 Fix: 356842463 Fix: 362730288 Fix: 358560966 Fix: 372659372 Test: ShortcutHelperActivityStarterTest Flag: com.android.systemui.keyboard_shortcut_helper_rewrite Change-Id: I53c7af2959ecb9a379d9efb548e47f6566b8d06d --- packages/SystemUI/AndroidManifest.xml | 6 - .../ShortcutHelperDialogStarterTest.kt} | 79 ++++---- .../res/anim/shortcut_helper_close_anim.xml | 26 --- .../res/anim/shortcut_helper_launch_anim.xml | 27 --- packages/SystemUI/res/values-night/styles.xml | 4 - packages/SystemUI/res/values/styles.xml | 28 --- .../keyboard/shortcut/ShortcutHelperModule.kt | 13 +- .../ui/ShortcutHelperActivityStarter.kt | 66 ------- .../ui/ShortcutHelperDialogStarter.kt | 102 ++++++++++ .../ui/composable/ShortcutHelperUtils.kt | 22 +++ .../ui/view/ShortcutHelperActivity.kt | 184 ------------------ .../FakeShortcutHelperStartActivity.kt | 28 --- .../shortcut/KeyboardShortcutHelperKosmos.kt | 26 +-- 13 files changed, 167 insertions(+), 444 deletions(-) rename packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/{ui => ui/ShortcutHelperDialogStarterTest.kt} (73%) delete mode 100644 packages/SystemUI/res/anim/shortcut_helper_close_anim.xml delete mode 100644 packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml delete mode 100644 packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarter.kt create mode 100644 packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarter.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/FakeShortcutHelperStartActivity.kt diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml index 9726ecf74e06..510c9b742e74 100644 --- a/packages/SystemUI/AndroidManifest.xml +++ b/packages/SystemUI/AndroidManifest.xml @@ -1139,11 +1139,5 @@ android:name="android.service.dream" android:resource="@xml/home_controls_dream_metadata" /> - - diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarterTest.kt similarity index 73% rename from packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarterTest.kt index f8e2f47f939a..d1431eecfc68 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarterTest.kt @@ -16,25 +16,26 @@ package com.android.systemui.keyboard.shortcut.ui -import android.content.Intent +import androidx.test.annotation.UiThreadTest import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.keyboard.shortcut.data.source.FakeKeyboardShortcutGroupsSource import com.android.systemui.keyboard.shortcut.data.source.TestShortcuts -import com.android.systemui.keyboard.shortcut.fakeShortcutHelperStartActivity -import com.android.systemui.keyboard.shortcut.shortcutHelperActivityStarter import com.android.systemui.keyboard.shortcut.shortcutHelperAppCategoriesShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperCurrentAppShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperInputShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperMultiTaskingShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperSystemShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperTestHelper -import com.android.systemui.keyboard.shortcut.ui.view.ShortcutHelperActivity +import com.android.systemui.keyboard.shortcut.shortcutHelperViewModel import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.activityStarter +import com.android.systemui.statusbar.phone.systemUIDialogFactory import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.UnconfinedTestDispatcher @@ -46,7 +47,7 @@ import org.junit.runner.RunWith @OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(AndroidJUnit4::class) -class ShortcutHelperActivityStarterTest : SysuiTestCase() { +class ShortcutHelperDialogStarterTest : SysuiTestCase() { private val fakeSystemSource = FakeKeyboardShortcutGroupsSource() private val fakeMultiTaskingSource = FakeKeyboardShortcutGroupsSource() @@ -64,8 +65,14 @@ class ShortcutHelperActivityStarterTest : SysuiTestCase() { private val testScope = kosmos.testScope private val testHelper = kosmos.shortcutHelperTestHelper - private val fakeStartActivity = kosmos.fakeShortcutHelperStartActivity - private val starter = kosmos.shortcutHelperActivityStarter + private val dialogFactory = kosmos.systemUIDialogFactory + private val coroutineScope = kosmos.applicationCoroutineScope + private val viewModel = kosmos.shortcutHelperViewModel + + private val starter: ShortcutHelperDialogStarter = + with(kosmos) { + ShortcutHelperDialogStarter(coroutineScope, viewModel, dialogFactory, activityStarter) + } @Before fun setUp() { @@ -74,21 +81,22 @@ class ShortcutHelperActivityStarterTest : SysuiTestCase() { } @Test - fun start_doesNotStartByDefault() = + fun start_doesNotShowDialogByDefault() = testScope.runTest { starter.start() - assertThat(fakeStartActivity.startIntents).isEmpty() + assertThat(starter.dialog).isNull() } @Test - fun start_onToggle_startsActivity() = + @UiThreadTest + fun start_onToggle_showsDialog() = testScope.runTest { starter.start() testHelper.toggle(deviceId = 456) - verifyShortcutHelperActivityStarted() + assertThat(starter.dialog?.isShowing).isTrue() } @Test @@ -101,34 +109,18 @@ class ShortcutHelperActivityStarterTest : SysuiTestCase() { testHelper.toggle(deviceId = 456) - assertThat(fakeStartActivity.startIntents).isEmpty() - } - - @Test - fun start_onToggle_multipleTimesStartsActivityOnlyWhenNotStarted() = - testScope.runTest { - starter.start() - - // Starts - testHelper.toggle(deviceId = 456) - // Stops - testHelper.toggle(deviceId = 456) - // Starts again - testHelper.toggle(deviceId = 456) - // Stops - testHelper.toggle(deviceId = 456) - - verifyShortcutHelperActivityStarted(numTimes = 2) + assertThat(starter.dialog).isNull() } @Test + @UiThreadTest fun start_onRequestShowShortcuts_startsActivity() = testScope.runTest { starter.start() testHelper.showFromActivity() - verifyShortcutHelperActivityStarted() + assertThat(starter.dialog?.isShowing).isTrue() } @Test @@ -140,10 +132,11 @@ class ShortcutHelperActivityStarterTest : SysuiTestCase() { testHelper.showFromActivity() - assertThat(fakeStartActivity.startIntents).isEmpty() + assertThat(starter.dialog).isNull() } @Test + @UiThreadTest fun start_onRequestShowShortcuts_multipleTimes_startsActivityOnlyOnce() = testScope.runTest { starter.start() @@ -152,40 +145,40 @@ class ShortcutHelperActivityStarterTest : SysuiTestCase() { testHelper.showFromActivity() testHelper.showFromActivity() - verifyShortcutHelperActivityStarted(numTimes = 1) + assertThat(starter.dialog?.isShowing).isTrue() } @Test + @UiThreadTest fun start_onRequestShowShortcuts_multipleTimes_startsActivityOnlyWhenNotStarted() = testScope.runTest { starter.start() + assertThat(starter.dialog).isNull() // No-op. Already hidden. testHelper.hideFromActivity() + assertThat(starter.dialog).isNull() // No-op. Already hidden. testHelper.hideForSystem() + assertThat(starter.dialog).isNull() // Show 1st time. testHelper.toggle(deviceId = 987) + assertThat(starter.dialog).isNotNull() + assertThat(starter.dialog?.isShowing).isTrue() // No-op. Already shown. testHelper.showFromActivity() + assertThat(starter.dialog?.isShowing).isTrue() // Hidden. testHelper.hideFromActivity() + assertThat(starter.dialog?.isShowing).isFalse() // No-op. Already hidden. testHelper.hideForSystem() + assertThat(starter.dialog?.isShowing).isFalse() // Show 2nd time. testHelper.toggle(deviceId = 456) + assertThat(starter.dialog?.isShowing).isTrue() // No-op. Already shown. testHelper.showFromActivity() - - verifyShortcutHelperActivityStarted(numTimes = 2) - } - - private fun verifyShortcutHelperActivityStarted(numTimes: Int = 1) { - assertThat(fakeStartActivity.startIntents).hasSize(numTimes) - fakeStartActivity.startIntents.forEach { intent -> - assertThat(intent.flags).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK) - assertThat(intent.filterEquals(Intent(context, ShortcutHelperActivity::class.java))) - .isTrue() + assertThat(starter.dialog?.isShowing).isTrue() } - } } diff --git a/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml b/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml deleted file mode 100644 index 47fd78a4d368..000000000000 --- a/packages/SystemUI/res/anim/shortcut_helper_close_anim.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - diff --git a/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml b/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml deleted file mode 100644 index 77edf588bd2e..000000000000 --- a/packages/SystemUI/res/anim/shortcut_helper_launch_anim.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - diff --git a/packages/SystemUI/res/values-night/styles.xml b/packages/SystemUI/res/values-night/styles.xml index 17ba2e5c10c4..d5d52e333caf 100644 --- a/packages/SystemUI/res/values-night/styles.xml +++ b/packages/SystemUI/res/values-night/styles.xml @@ -59,8 +59,4 @@ --> true - - diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 7cebac2feaba..bda34530e6eb 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -1709,32 +1709,4 @@ - - - - - - - - diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt index 906f600e3826..7b3380a6a608 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ShortcutHelperModule.kt @@ -16,7 +16,6 @@ package com.android.systemui.keyboard.shortcut -import android.app.Activity import com.android.systemui.CoreStartable import com.android.systemui.Flags.keyboardShortcutHelperRewrite import com.android.systemui.keyboard.shortcut.data.repository.ShortcutHelperStateRepository @@ -31,8 +30,7 @@ import com.android.systemui.keyboard.shortcut.qualifiers.CurrentAppShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.InputShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.MultitaskingShortcuts import com.android.systemui.keyboard.shortcut.qualifiers.SystemShortcuts -import com.android.systemui.keyboard.shortcut.ui.ShortcutHelperActivityStarter -import com.android.systemui.keyboard.shortcut.ui.view.ShortcutHelperActivity +import com.android.systemui.keyboard.shortcut.ui.ShortcutHelperDialogStarter import dagger.Binds import dagger.Lazy import dagger.Module @@ -43,11 +41,6 @@ import dagger.multibindings.IntoMap @Module interface ShortcutHelperModule { - @Binds - @IntoMap - @ClassKey(ShortcutHelperActivity::class) - fun activity(impl: ShortcutHelperActivity): Activity - @Binds @SystemShortcuts fun systemShortcutsSource(impl: SystemShortcutsSource): KeyboardShortcutGroupsSource @@ -73,8 +66,8 @@ interface ShortcutHelperModule { companion object { @Provides @IntoMap - @ClassKey(ShortcutHelperActivityStarter::class) - fun starter(implLazy: Lazy): CoreStartable { + @ClassKey(ShortcutHelperDialogStarter::class) + fun starter(implLazy: Lazy): CoreStartable { return if (keyboardShortcutHelperRewrite()) { implLazy.get() } else { diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarter.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarter.kt deleted file mode 100644 index fbf52e773599..000000000000 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperActivityStarter.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.keyboard.shortcut.ui - -import android.content.Context -import android.content.Intent -import com.android.systemui.CoreStartable -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.keyboard.shortcut.ui.view.ShortcutHelperActivity -import com.android.systemui.keyboard.shortcut.ui.viewmodel.ShortcutHelperViewModel -import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch - -@SysUISingleton -class ShortcutHelperActivityStarter( - private val context: Context, - @Application private val applicationScope: CoroutineScope, - private val viewModel: ShortcutHelperViewModel, - private val startActivity: (Intent) -> Unit, -) : CoreStartable { - - @Inject - constructor( - context: Context, - @Application applicationScope: CoroutineScope, - viewModel: ShortcutHelperViewModel, - ) : this( - context, - applicationScope, - viewModel, - startActivity = { intent -> context.startActivity(intent) } - ) - - override fun start() { - applicationScope.launch { - viewModel.shouldShow.collect { shouldShow -> - if (shouldShow) { - startShortcutHelperActivity() - } - } - } - } - - private fun startShortcutHelperActivity() { - startActivity( - Intent(context, ShortcutHelperActivity::class.java) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - ) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarter.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarter.kt new file mode 100644 index 000000000000..d33ab2acc8fb --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/ShortcutHelperDialogStarter.kt @@ -0,0 +1,102 @@ +/* + * 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.keyboard.shortcut.ui + +import android.app.Dialog +import android.content.ActivityNotFoundException +import android.content.Intent +import android.content.Intent.FLAG_ACTIVITY_NEW_TASK +import android.os.UserHandle +import android.provider.Settings +import androidx.annotation.VisibleForTesting +import androidx.compose.foundation.layout.width +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.android.systemui.CoreStartable +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.keyboard.shortcut.ui.composable.ShortcutHelper +import com.android.systemui.keyboard.shortcut.ui.composable.ShortcutHelperBottomSheet +import com.android.systemui.keyboard.shortcut.ui.composable.getWidth +import com.android.systemui.keyboard.shortcut.ui.viewmodel.ShortcutHelperViewModel +import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.phone.SystemUIDialogFactory +import com.android.systemui.statusbar.phone.createBottomSheet +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.map + +@SysUISingleton +class ShortcutHelperDialogStarter +@Inject +constructor( + @Application private val applicationScope: CoroutineScope, + private val viewModel: ShortcutHelperViewModel, + private val dialogFactory: SystemUIDialogFactory, + private val activityStarter: ActivityStarter, +) : CoreStartable { + + @VisibleForTesting var dialog: Dialog? = null + + override fun start() { + viewModel.shouldShow + .map { shouldShow -> + if (shouldShow) { + dialog = createShortcutHelperDialog().also { it.show() } + } else { + dialog?.dismiss() + } + } + .launchIn(applicationScope) + } + + private fun createShortcutHelperDialog(): Dialog { + return dialogFactory.createBottomSheet( + content = { dialog -> + val shortcutsUiState by viewModel.shortcutsUiState.collectAsStateWithLifecycle() + ShortcutHelper( + modifier = Modifier.width(getWidth()), + shortcutsUiState = shortcutsUiState, + onKeyboardSettingsClicked = { onKeyboardSettingsClicked(dialog) }, + onSearchQueryChanged = { viewModel.onSearchQueryChanged(it) }, + ) + dialog.setOnDismissListener { viewModel.onViewClosed() } + }, + maxWidth = ShortcutHelperBottomSheet.LargeScreenWidthLandscape + ) + } + + private fun onKeyboardSettingsClicked(dialog: Dialog) { + try { + activityStarter.startActivity( + Intent(Settings.ACTION_HARD_KEYBOARD_SETTINGS).addFlags(FLAG_ACTIVITY_NEW_TASK), + /* dismissShade= */ true, + /* animationController = */ null, + /* showOverLockscreenWhenLocked = */ false, + UserHandle.CURRENT, + ) + } catch (e: ActivityNotFoundException) { + // From the Settings docs: In some cases, a matching Activity may not exist, so ensure + // you safeguard against this. + e.printStackTrace() + return + } + dialog.dismiss() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelperUtils.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelperUtils.kt index 1f0d696eebd6..e295564a740f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelperUtils.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelperUtils.kt @@ -16,9 +16,13 @@ package com.android.systemui.keyboard.shortcut.ui.composable +import android.content.res.Configuration import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp import com.android.compose.windowsizeclass.LocalWindowSizeClass /** @@ -29,3 +33,21 @@ import com.android.compose.windowsizeclass.LocalWindowSizeClass fun hasCompactWindowSize() = LocalWindowSizeClass.current.widthSizeClass == WindowWidthSizeClass.Compact || LocalWindowSizeClass.current.heightSizeClass == WindowHeightSizeClass.Compact + +@Composable +fun getWidth(): Dp { + return if (hasCompactWindowSize()) { + ShortcutHelperBottomSheet.DefaultWidth + } else + when (LocalConfiguration.current.orientation) { + Configuration.ORIENTATION_LANDSCAPE -> + ShortcutHelperBottomSheet.LargeScreenWidthLandscape + else -> ShortcutHelperBottomSheet.LargeScreenWidthPortrait + } +} + +object ShortcutHelperBottomSheet { + val DefaultWidth = 412.dp + val LargeScreenWidthPortrait = 704.dp + val LargeScreenWidthLandscape = 864.dp +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt deleted file mode 100644 index 52263ce64a85..000000000000 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/view/ShortcutHelperActivity.kt +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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.keyboard.shortcut.ui.view - -import android.content.ActivityNotFoundException -import android.content.Intent -import android.content.Intent.FLAG_ACTIVITY_NEW_TASK -import android.content.res.Configuration -import android.os.Bundle -import android.provider.Settings -import androidx.activity.ComponentActivity -import androidx.activity.compose.setContent -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.Surface -import androidx.compose.material3.rememberModalBottomSheetState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.input.key.Key -import androidx.compose.ui.input.key.key -import androidx.compose.ui.input.key.onKeyEvent -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.semantics.contentDescription -import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import androidx.lifecycle.flowWithLifecycle -import androidx.lifecycle.lifecycleScope -import com.android.compose.theme.PlatformTheme -import com.android.systemui.keyboard.shortcut.ui.composable.ShortcutHelper -import com.android.systemui.keyboard.shortcut.ui.composable.hasCompactWindowSize -import com.android.systemui.keyboard.shortcut.ui.viewmodel.ShortcutHelperViewModel -import com.android.systemui.res.R -import com.android.systemui.settings.UserTracker -import javax.inject.Inject -import kotlinx.coroutines.launch - -/** - * Activity that hosts the new version of the keyboard shortcut helper. It will be used both for - * small and large screen devices. - */ -class ShortcutHelperActivity -@Inject -constructor(private val userTracker: UserTracker, private val viewModel: ShortcutHelperViewModel) : - ComponentActivity() { - - override fun onCreate(savedInstanceState: Bundle?) { - setupEdgeToEdge() - super.onCreate(savedInstanceState) - setContent { Content() } - observeFinishRequired() - viewModel.onViewOpened() - } - - @Composable - private fun Content() { - CompositionLocalProvider(LocalContext provides userTracker.userContext) { - PlatformTheme { BottomSheet { finish() } } - } - } - - @OptIn(ExperimentalMaterial3Api::class) - @Composable - private fun BottomSheet(onDismiss: () -> Unit) { - ModalBottomSheet( - onDismissRequest = { onDismiss() }, - modifier = - Modifier.width(getWidth()).padding(top = getTopPadding()).onKeyEvent { - if (it.key == Key.Escape) { - onDismiss() - true - } else false - }, - sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true), - dragHandle = { DragHandle() }, - ) { - val shortcutsUiState by viewModel.shortcutsUiState.collectAsStateWithLifecycle() - ShortcutHelper( - shortcutsUiState = shortcutsUiState, - onKeyboardSettingsClicked = ::onKeyboardSettingsClicked, - onSearchQueryChanged = { viewModel.onSearchQueryChanged(it) }, - ) - } - } - - @Composable - fun DragHandle() { - val dragHandleContentDescription = - stringResource(id = R.string.shortcut_helper_content_description_drag_handle) - Surface( - modifier = - Modifier.padding(top = 16.dp, bottom = 6.dp).semantics { - contentDescription = dragHandleContentDescription - }, - color = MaterialTheme.colorScheme.outlineVariant, - shape = MaterialTheme.shapes.extraLarge, - ) { - Box(Modifier.size(width = 32.dp, height = 4.dp)) - } - } - - private fun onKeyboardSettingsClicked() { - try { - startActivityAsUser( - Intent(Settings.ACTION_HARD_KEYBOARD_SETTINGS).addFlags(FLAG_ACTIVITY_NEW_TASK), - userTracker.userHandle, - ) - } catch (e: ActivityNotFoundException) { - // From the Settings docs: In some cases, a matching Activity may not exist, so ensure - // you safeguard against this. - e.printStackTrace() - } - } - - override fun onDestroy() { - super.onDestroy() - if (isFinishing) { - viewModel.onViewClosed() - } - } - - private fun observeFinishRequired() { - lifecycleScope.launch { - viewModel.shouldShow.flowWithLifecycle(lifecycle).collect { shouldShow -> - if (!shouldShow) { - finish() - } - } - } - } - - private fun setupEdgeToEdge() { - // Draw behind system bars - window.setDecorFitsSystemWindows(false) - } - - @Composable - private fun getTopPadding(): Dp { - return if (hasCompactWindowSize()) DefaultTopPadding else LargeScreenTopPadding - } - - @Composable - private fun getWidth(): Dp { - return if (hasCompactWindowSize()) { - DefaultWidth - } else - when (LocalConfiguration.current.orientation) { - Configuration.ORIENTATION_LANDSCAPE -> LargeScreenWidthLandscape - else -> LargeScreenWidthPortrait - } - } - - companion object { - private val DefaultTopPadding = 64.dp - private val LargeScreenTopPadding = 72.dp - private val DefaultWidth = 412.dp - private val LargeScreenWidthPortrait = 704.dp - private val LargeScreenWidthLandscape = 864.dp - } -} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/FakeShortcutHelperStartActivity.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/FakeShortcutHelperStartActivity.kt deleted file mode 100644 index 3190171b180d..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/FakeShortcutHelperStartActivity.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * 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.keyboard.shortcut - -import android.content.Intent - -class FakeShortcutHelperStartActivity : (Intent) -> Unit { - - val startIntents = mutableListOf() - - override fun invoke(intent: Intent) { - startIntents += intent - } -} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt index c2a03d46cd30..fbfaba60ebf0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt @@ -33,7 +33,6 @@ import com.android.systemui.keyboard.shortcut.data.source.MultitaskingShortcutsS import com.android.systemui.keyboard.shortcut.data.source.SystemShortcutsSource import com.android.systemui.keyboard.shortcut.domain.interactor.ShortcutHelperCategoriesInteractor import com.android.systemui.keyboard.shortcut.domain.interactor.ShortcutHelperStateInteractor -import com.android.systemui.keyboard.shortcut.ui.ShortcutHelperActivityStarter import com.android.systemui.keyboard.shortcut.ui.viewmodel.ShortcutHelperViewModel import com.android.systemui.keyguard.data.repository.fakeCommandQueue import com.android.systemui.kosmos.Kosmos @@ -45,12 +44,7 @@ import com.android.systemui.settings.displayTracker import com.android.systemui.settings.fakeUserTracker var Kosmos.shortcutHelperAppCategoriesShortcutsSource: KeyboardShortcutGroupsSource by - Kosmos.Fixture { - AppCategoriesShortcutsSource( - windowManager, - testDispatcher, - ) - } + Kosmos.Fixture { AppCategoriesShortcutsSource(windowManager, testDispatcher) } var Kosmos.shortcutHelperSystemShortcutsSource: KeyboardShortcutGroupsSource by Kosmos.Fixture { SystemShortcutsSource(mainResources) } @@ -65,7 +59,7 @@ val Kosmos.shortcutHelperStateRepository by broadcastDispatcher, fakeInputManager.inputManager, testScope, - testDispatcher + testDispatcher, ) } @@ -109,7 +103,7 @@ val Kosmos.shortcutHelperStateInteractor by displayTracker, testScope, sysUiState, - shortcutHelperStateRepository + shortcutHelperStateRepository, ) } @@ -124,18 +118,6 @@ val Kosmos.shortcutHelperViewModel by applicationCoroutineScope, testDispatcher, shortcutHelperStateInteractor, - shortcutHelperCategoriesInteractor - ) - } - -val Kosmos.fakeShortcutHelperStartActivity by Kosmos.Fixture { FakeShortcutHelperStartActivity() } - -val Kosmos.shortcutHelperActivityStarter by - Kosmos.Fixture { - ShortcutHelperActivityStarter( - applicationContext, - applicationCoroutineScope, - shortcutHelperViewModel, - fakeShortcutHelperStartActivity, + shortcutHelperCategoriesInteractor, ) } -- GitLab From 8ecf84b33bcb405610eca3717a0816ee15a1cfb0 Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Fri, 18 Oct 2024 12:01:44 -0400 Subject: [PATCH 060/459] [sb] run formatter on system event animation files These will be modified in the next CLs to create a system event animation state repository Test: EXEMPT formatting Flag: EXEMPT formatting Bug: 364360986 Change-Id: I71b95ff43df245f42cb04810bb6841be399daa1e --- .../events/SystemStatusAnimationScheduler.kt | 28 +++--- .../SystemStatusAnimationSchedulerImpl.kt | 14 +-- .../fragment/StatusBarSystemEventAnimator.kt | 96 ++++++++++--------- 3 files changed, 72 insertions(+), 66 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index ef9089099a86..c6f3d7d21a22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -24,7 +24,7 @@ import com.android.systemui.Dumpable import com.android.systemui.statusbar.policy.CallbackController interface SystemStatusAnimationScheduler : - CallbackController, Dumpable { + CallbackController, Dumpable { @SystemAnimationState fun getAnimationState(): Int @@ -44,30 +44,36 @@ interface SystemStatusAnimationScheduler : */ interface SystemStatusAnimationCallback { /** Implement this method to return an [Animator] or [AnimatorSet] that presents the chip */ - fun onSystemEventAnimationBegin(): Animator? { return null } + fun onSystemEventAnimationBegin(): Animator? { + return null + } + /** Implement this method to return an [Animator] or [AnimatorSet] that hides the chip */ - fun onSystemEventAnimationFinish(hasPersistentDot: Boolean): Animator? { return null } + fun onSystemEventAnimationFinish(hasPersistentDot: Boolean): Animator? { + return null + } // Best method name, change my mind fun onSystemStatusAnimationTransitionToPersistentDot(contentDescription: String?): Animator? { return null } - fun onHidePersistentDot(): Animator? { return null } -} + fun onHidePersistentDot(): Animator? { + return null + } +} -/** - * Animation state IntDef - */ +/** Animation state IntDef */ @Retention(AnnotationRetention.SOURCE) @IntDef( - value = [ + value = + [ IDLE, ANIMATION_QUEUED, ANIMATING_IN, RUNNING_CHIP_ANIM, ANIMATING_OUT, - SHOWING_PERSISTENT_DOT + SHOWING_PERSISTENT_DOT, ] ) annotation class SystemAnimationState @@ -110,4 +116,4 @@ internal const val APPEAR_ANIMATION_DURATION = 500L internal const val DISPLAY_LENGTH = 3000L internal const val DISAPPEAR_ANIMATION_DURATION = 500L -internal const val MIN_UPTIME: Long = 5 * 1000 \ No newline at end of file +internal const val MIN_UPTIME: Long = 5 * 1000 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt index e34f61df8e88..5f9e4265c004 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt @@ -69,7 +69,7 @@ constructor( dumpManager: DumpManager, private val systemClock: SystemClock, @Application private val coroutineScope: CoroutineScope, - private val logger: SystemStatusAnimationSchedulerLogger? + private val logger: SystemStatusAnimationSchedulerLogger?, ) : SystemStatusAnimationScheduler { companion object { @@ -122,9 +122,7 @@ constructor( } } - coroutineScope.launch { - animationState.collect { logger?.logAnimationStateUpdate(it) } - } + coroutineScope.launch { animationState.collect { logger?.logAnimationStateUpdate(it) } } } @SystemAnimationState override fun getAnimationState(): Int = animationState.value @@ -195,7 +193,7 @@ constructor( return DeviceConfig.getBoolean( DeviceConfig.NAMESPACE_PRIVACY, PROPERTY_ENABLE_IMMERSIVE_INDICATOR, - true + true, ) } @@ -262,7 +260,7 @@ constructor( private fun announceForAccessibilityIfNeeded(event: StatusEvent) { val description = event.contentDescription ?: return - if (!event.shouldAnnounceAccessibilityEvent) return + if (!event.shouldAnnounceAccessibilityEvent) return chipAnimationController.announceForAccessibility(description) } @@ -356,9 +354,7 @@ constructor( logger?.logTransitionToPersistentDotCallbackInvoked() val anims: List = listeners.mapNotNull { - it.onSystemStatusAnimationTransitionToPersistentDot( - event?.contentDescription - ) + it.onSystemStatusAnimationTransitionToPersistentDot(event?.contentDescription) } if (anims.isNotEmpty()) { val aSet = AnimatorSet() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt index e73063b809cf..1f9ea08e602f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/StatusBarSystemEventAnimator.kt @@ -16,11 +16,11 @@ package com.android.systemui.statusbar.phone.fragment +import android.content.res.Resources +import android.view.View import androidx.core.animation.Animator import androidx.core.animation.AnimatorSet import androidx.core.animation.ValueAnimator -import android.content.res.Resources -import android.view.View import com.android.systemui.res.R import com.android.systemui.statusbar.events.STATUS_BAR_X_MOVE_IN import com.android.systemui.statusbar.events.STATUS_BAR_X_MOVE_OUT @@ -33,16 +33,15 @@ import com.android.systemui.util.doOnEnd * An implementation of [StatusBarSystemEventDefaultAnimator], applying the onAlphaChanged and * onTranslationXChanged callbacks directly to the provided animatedView. */ -class StatusBarSystemEventAnimator @JvmOverloads constructor( - val animatedView: View, - resources: Resources, - isAnimationRunning: Boolean = false -) : StatusBarSystemEventDefaultAnimator( +class StatusBarSystemEventAnimator +@JvmOverloads +constructor(val animatedView: View, resources: Resources, isAnimationRunning: Boolean = false) : + StatusBarSystemEventDefaultAnimator( resources = resources, onAlphaChanged = animatedView::setAlpha, onTranslationXChanged = animatedView::setTranslationX, - isAnimationRunning = isAnimationRunning -) + isAnimationRunning = isAnimationRunning, + ) /** * Tied directly to [SystemStatusAnimationScheduler]. Any StatusBar-like thing (keyguard, collapsed @@ -53,34 +52,39 @@ class StatusBarSystemEventAnimator @JvmOverloads constructor( * this class could be used directly as the animation callback, it's probably best to forward calls * to it so that it can be recreated at any moment without needing to remove/add callback. */ - -open class StatusBarSystemEventDefaultAnimator @JvmOverloads constructor( - resources: Resources, - private val onAlphaChanged: (Float) -> Unit, - private val onTranslationXChanged: (Float) -> Unit, - var isAnimationRunning: Boolean = false +open class StatusBarSystemEventDefaultAnimator +@JvmOverloads +constructor( + resources: Resources, + private val onAlphaChanged: (Float) -> Unit, + private val onTranslationXChanged: (Float) -> Unit, + var isAnimationRunning: Boolean = false, ) : SystemStatusAnimationCallback { - private val translationXIn: Int = resources.getDimensionPixelSize( - R.dimen.ongoing_appops_chip_animation_in_status_bar_translation_x) - private val translationXOut: Int = resources.getDimensionPixelSize( - R.dimen.ongoing_appops_chip_animation_out_status_bar_translation_x) + private val translationXIn: Int = + resources.getDimensionPixelSize( + R.dimen.ongoing_appops_chip_animation_in_status_bar_translation_x + ) + private val translationXOut: Int = + resources.getDimensionPixelSize( + R.dimen.ongoing_appops_chip_animation_out_status_bar_translation_x + ) override fun onSystemEventAnimationBegin(): Animator { isAnimationRunning = true - val moveOut = ValueAnimator.ofFloat(0f, 1f).apply { - duration = 23.frames - interpolator = STATUS_BAR_X_MOVE_OUT - addUpdateListener { - onTranslationXChanged(-(translationXIn * animatedValue as Float)) + val moveOut = + ValueAnimator.ofFloat(0f, 1f).apply { + duration = 23.frames + interpolator = STATUS_BAR_X_MOVE_OUT + addUpdateListener { + onTranslationXChanged(-(translationXIn * animatedValue as Float)) + } } - } - val alphaOut = ValueAnimator.ofFloat(1f, 0f).apply { - duration = 8.frames - interpolator = null - addUpdateListener { - onAlphaChanged(animatedValue as Float) + val alphaOut = + ValueAnimator.ofFloat(1f, 0f).apply { + duration = 8.frames + interpolator = null + addUpdateListener { onAlphaChanged(animatedValue as Float) } } - } val animSet = AnimatorSet() animSet.playTogether(moveOut, alphaOut) @@ -89,22 +93,22 @@ open class StatusBarSystemEventDefaultAnimator @JvmOverloads constructor( override fun onSystemEventAnimationFinish(hasPersistentDot: Boolean): Animator { onTranslationXChanged(translationXOut.toFloat()) - val moveIn = ValueAnimator.ofFloat(1f, 0f).apply { - duration = 23.frames - startDelay = 7.frames - interpolator = STATUS_BAR_X_MOVE_IN - addUpdateListener { - onTranslationXChanged(translationXOut * animatedValue as Float) + val moveIn = + ValueAnimator.ofFloat(1f, 0f).apply { + duration = 23.frames + startDelay = 7.frames + interpolator = STATUS_BAR_X_MOVE_IN + addUpdateListener { + onTranslationXChanged(translationXOut * animatedValue as Float) + } } - } - val alphaIn = ValueAnimator.ofFloat(0f, 1f).apply { - duration = 5.frames - startDelay = 11.frames - interpolator = null - addUpdateListener { - onAlphaChanged(animatedValue as Float) + val alphaIn = + ValueAnimator.ofFloat(0f, 1f).apply { + duration = 5.frames + startDelay = 11.frames + interpolator = null + addUpdateListener { onAlphaChanged(animatedValue as Float) } } - } val animatorSet = AnimatorSet() animatorSet.playTogether(moveIn, alphaIn) @@ -112,4 +116,4 @@ open class StatusBarSystemEventDefaultAnimator @JvmOverloads constructor( animatorSet.doOnCancel { isAnimationRunning = false } return animatorSet } -} \ No newline at end of file +} -- GitLab From 95d3598ec4d28d5b4899c4109b4cd288d0875a67 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Wed, 16 Oct 2024 09:24:07 +0000 Subject: [PATCH 061/459] Fix perf regression VisualStabilityCoordinator Use KeyguardStateController.Callback to dispatch keyguard hiding animation event to fix CL[1] using alwaysCollectFlow that main thread got blocked by coroutine thread. [1]: I61f1dad2dc9485f043c53a8900f1fae2e8ea1187 Flag: com.android.systemui.check_lockscreen_gone_transition Bug: 373203637 Bug: 358301118 Test: atest SystemUIMicrobenchmark Test: atest VisualStabilityCoordinatorTest Change-Id: If2b92094f7f2762fd5ac7bdd542c51311dbfe2d9 --- .../VisualStabilityCoordinatorTest.java | 22 +++++++------------ .../VisualStabilityCoordinator.java | 22 +++++++++++++------ 2 files changed, 23 insertions(+), 21 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java index ea5c29ef30aa..cfac486dd37c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -65,6 +66,7 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.plugga import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider; import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.time.FakeSystemClock; @@ -98,6 +100,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { @Mock private VisibilityLocationProvider mVisibilityLocationProvider; @Mock private VisualStabilityProvider mVisualStabilityProvider; @Mock private VisualStabilityCoordinatorLogger mLogger; + @Mock private KeyguardStateController mKeyguardStateController; @Captor private ArgumentCaptor mWakefulnessObserverCaptor; @Captor private ArgumentCaptor mSBStateListenerCaptor; @@ -138,6 +141,7 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { mKosmos.getCommunalSceneInteractor(), mKosmos.getShadeInteractor(), mKosmos.getKeyguardTransitionInteractor(), + mKeyguardStateController, mLogger); mCoordinator.attach(mNotifPipeline); mTestScope.getTestScheduler().runCurrent(); @@ -522,23 +526,13 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { @EnableFlags(Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION) public void testNotLockscreenInGoneTransition_invalidationCalled() { // GIVEN visual stability is being maintained b/c animation is playing - mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava( - mTestScope, new TransitionStep( - KeyguardState.LOCKSCREEN, - KeyguardState.GONE, - 1f, - TransitionState.RUNNING), /* validateStep = */ false); - mTestScope.getTestScheduler().runCurrent(); + doReturn(true).when(mKeyguardStateController).isKeyguardFadingAway(); + mCoordinator.mKeyguardFadeAwayAnimationCallback.onKeyguardFadingAwayChanged(); assertFalse(mNotifStabilityManager.isPipelineRunAllowed()); // WHEN the animation has stopped playing - mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava( - mTestScope, new TransitionStep( - KeyguardState.LOCKSCREEN, - KeyguardState.GONE, - 1f, - TransitionState.FINISHED), /* validateStep = */ false); - mTestScope.getTestScheduler().runCurrent(); + doReturn(false).when(mKeyguardStateController).isKeyguardFadingAway(); + mCoordinator.mKeyguardFadeAwayAnimationCallback.onKeyguardFadingAwayChanged(); // invalidate is called, b/c we were previously suppressing the pipeline from running verifyStabilityManagerWasInvalidated(times(1)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java index 8660cd117493..6edffc0b7542 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java @@ -29,11 +29,9 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; -import com.android.systemui.keyguard.shared.model.Edge; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.scene.shared.flag.SceneContainerFlag; -import com.android.systemui.scene.shared.model.Scenes; import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.notification.VisibilityLocationProvider; @@ -46,6 +44,7 @@ import com.android.systemui.statusbar.notification.collection.provider.VisualSta import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor; import com.android.systemui.statusbar.notification.shared.NotificationMinimalism; import com.android.systemui.statusbar.policy.HeadsUpManager; +import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.kotlin.BooleanFlowOperators; import com.android.systemui.util.kotlin.JavaAdapter; @@ -78,6 +77,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { private final CommunalSceneInteractor mCommunalSceneInteractor; private final ShadeInteractor mShadeInteractor; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; + private final KeyguardStateController mKeyguardStateController; private final VisualStabilityCoordinatorLogger mLogger; private boolean mSleepy = true; @@ -120,6 +120,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { CommunalSceneInteractor communalSceneInteractor, ShadeInteractor shadeInteractor, KeyguardTransitionInteractor keyguardTransitionInteractor, + KeyguardStateController keyguardStateController, VisualStabilityCoordinatorLogger logger) { mHeadsUpManager = headsUpManager; mShadeAnimationInteractor = shadeAnimationInteractor; @@ -133,6 +134,7 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { mCommunalSceneInteractor = communalSceneInteractor; mShadeInteractor = shadeInteractor; mKeyguardTransitionInteractor = keyguardTransitionInteractor; + mKeyguardStateController = keyguardStateController; mLogger = logger; dumpManager.registerDumpable(this); @@ -162,17 +164,23 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { KeyguardState.LOCKSCREEN), this::onLockscreenKeyguardStateTransitionValueChanged); } + if (Flags.checkLockscreenGoneTransition()) { - mJavaAdapter.alwaysCollectFlow(mKeyguardTransitionInteractor.isInTransition( - Edge.create(KeyguardState.LOCKSCREEN, Scenes.Gone), - Edge.create(KeyguardState.LOCKSCREEN, KeyguardState.GONE)), - this::onLockscreenInGoneTransitionChanged); + mKeyguardStateController.addCallback(mKeyguardFadeAwayAnimationCallback); } - pipeline.setVisualStabilityManager(mNotifStabilityManager); } + final KeyguardStateController.Callback mKeyguardFadeAwayAnimationCallback = + new KeyguardStateController.Callback() { + @Override + public void onKeyguardFadingAwayChanged() { + onLockscreenInGoneTransitionChanged( + mKeyguardStateController.isKeyguardFadingAway()); + } + }; + // TODO(b/203826051): Ensure stability manager can allow reordering off-screen // HUNs to the top of the shade private final NotifStabilityManager mNotifStabilityManager = -- GitLab From f0ccc4f7a51f2f976d5f787c9ceee5a375f595d5 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Tue, 15 Oct 2024 19:55:54 +0200 Subject: [PATCH 062/459] Introduce NotifCollectionCache This will be used to cache the app icons for notifications. Bug: 371174789 Test: NotifCollectionCacheTest Flag: EXEMPT new unused utility, usages will be flagged Change-Id: I6ef2411e107a08f80cf65a9375f03f9790986680 --- .../collection/NotifCollectionCacheTest.kt | 206 ++++++++++++++++++ .../collection/NotifCollectionCache.kt | 154 +++++++++++++ 2 files changed, 360 insertions(+) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt new file mode 100644 index 000000000000..7e9c5ca51ee2 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt @@ -0,0 +1,206 @@ +/* + * 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.statusbar.notification.collection + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.time.FakeSystemClock +import com.google.common.truth.Truth.assertThat +import kotlin.test.assertNotNull +import kotlin.test.assertNull +import org.junit.After +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class NotifCollectionCacheTest : SysuiTestCase() { + companion object { + const val A = "a" + const val B = "b" + const val C = "c" + } + + val systemClock = FakeSystemClock() + val underTest = + NotifCollectionCache(purgeTimeoutMillis = 200L, systemClock = systemClock) + + @After + fun cleanUp() { + underTest.clear() + } + + @Test + fun fetch_isOnlyCalledOncePerEntry() { + val fetchList = mutableListOf() + val fetch = { key: String -> + fetchList.add(key) + key + } + + // Construct the cache and make sure fetch is called + assertThat(underTest.getOrFetch(A, fetch)).isEqualTo(A) + assertThat(underTest.getOrFetch(B, fetch)).isEqualTo(B) + assertThat(underTest.getOrFetch(C, fetch)).isEqualTo(C) + assertThat(fetchList).containsExactly(A, B, C).inOrder() + + // Verify that further calls don't trigger fetch again + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(B, fetch) + underTest.getOrFetch(C, fetch) + assertThat(fetchList).containsExactly(A, B, C).inOrder() + + // Verify that fetch gets called again if the entries are cleared + underTest.clear() + underTest.getOrFetch(A, fetch) + assertThat(fetchList).containsExactly(A, B, C, A).inOrder() + } + + @Test + fun purge_beforeTimeout_doesNothing() { + // Populate cache + val fetch = { key: String -> key } + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(B, fetch) + underTest.getOrFetch(C, fetch) + + // B starts off with ♥ ︎♥︎ + assertThat(underTest.getLives(B)).isEqualTo(2) + // First purge run removes a ︎♥︎ + underTest.purge(listOf(A, C)) + assertNotNull(underTest.cache[B]) + assertThat(underTest.getLives(B)).isEqualTo(1) + // Second purge run done too early does nothing to B + systemClock.advanceTime(100L) + underTest.purge(listOf(A, C)) + assertNotNull(underTest.cache[B]) + assertThat(underTest.getLives(B)).isEqualTo(1) + // Purge done after timeout (200ms) clears B + systemClock.advanceTime(100L) + underTest.purge(listOf(A, C)) + assertNull(underTest.cache[B]) + } + + @Test + fun get_resetsLives() { + // Populate cache + val fetch = { key: String -> key } + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(B, fetch) + underTest.getOrFetch(C, fetch) + + // Bring B down to one ︎♥︎ + underTest.purge(listOf(A, C)) + assertThat(underTest.getLives(B)).isEqualTo(1) + + // Get should restore B to ♥ ︎♥︎ + underTest.getOrFetch(B, fetch) + assertThat(underTest.getLives(B)).isEqualTo(2) + + // Subsequent purge should remove a life regardless of timing + underTest.purge(listOf(A, C)) + assertThat(underTest.getLives(B)).isEqualTo(1) + } + + @Test + fun purge_resetsLives() { + // Populate cache + val fetch = { key: String -> key } + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(B, fetch) + underTest.getOrFetch(C, fetch) + + // Bring B down to one ︎♥︎ + underTest.purge(listOf(A, C)) + assertThat(underTest.getLives(B)).isEqualTo(1) + + // When B is back to wantedKeys, it is restored to to ♥ ︎♥ ︎︎ + underTest.purge(listOf(B)) + assertThat(underTest.getLives(B)).isEqualTo(2) + assertThat(underTest.getLives(A)).isEqualTo(1) + assertThat(underTest.getLives(C)).isEqualTo(1) + + // Subsequent purge should remove a life regardless of timing + underTest.purge(listOf(A, C)) + assertThat(underTest.getLives(B)).isEqualTo(1) + } + + @Test + fun purge_worksWithMoreLives() { + val multiLivesCache = + NotifCollectionCache( + retainCount = 3, + purgeTimeoutMillis = 100L, + systemClock = systemClock, + ) + + // Populate cache + val fetch = { key: String -> key } + multiLivesCache.getOrFetch(A, fetch) + multiLivesCache.getOrFetch(B, fetch) + multiLivesCache.getOrFetch(C, fetch) + + // B starts off with ♥ ︎♥︎ ♥ ︎♥︎ + assertThat(multiLivesCache.getLives(B)).isEqualTo(4) + // First purge run removes a ︎♥︎ + multiLivesCache.purge(listOf(A, C)) + assertNotNull(multiLivesCache.cache[B]) + assertThat(multiLivesCache.getLives(B)).isEqualTo(3) + // Second purge run done too early does nothing to B + multiLivesCache.purge(listOf(A, C)) + assertNotNull(multiLivesCache.cache[B]) + assertThat(multiLivesCache.getLives(B)).isEqualTo(3) + // Staggered purge runs remove further ︎♥︎ + systemClock.advanceTime(100L) + multiLivesCache.purge(listOf(A, C)) + assertNotNull(multiLivesCache.cache[B]) + assertThat(multiLivesCache.getLives(B)).isEqualTo(2) + systemClock.advanceTime(100L) + multiLivesCache.purge(listOf(A, C)) + assertNotNull(multiLivesCache.cache[B]) + assertThat(multiLivesCache.getLives(B)).isEqualTo(1) + systemClock.advanceTime(100L) + multiLivesCache.purge(listOf(A, C)) + assertNull(multiLivesCache.cache[B]) + } + + @Test + fun purge_worksWithNoLives() { + val noLivesCache = + NotifCollectionCache( + retainCount = 0, + purgeTimeoutMillis = 0L, + systemClock = systemClock, + ) + + val fetch = { key: String -> key } + noLivesCache.getOrFetch(A, fetch) + noLivesCache.getOrFetch(B, fetch) + noLivesCache.getOrFetch(C, fetch) + + // Purge immediately removes entry + noLivesCache.purge(listOf(A, C)) + + assertNotNull(noLivesCache.cache[A]) + assertNull(noLivesCache.cache[B]) + assertNotNull(noLivesCache.cache[C]) + } + + private fun NotifCollectionCache.getLives(key: String) = this.cache[key]?.lives +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt new file mode 100644 index 000000000000..192ba8de5653 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt @@ -0,0 +1,154 @@ +/* + * 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.statusbar.notification.collection + +import com.android.internal.annotations.VisibleForTesting +import com.android.systemui.util.time.SystemClock +import com.android.systemui.util.time.SystemClockImpl +import java.util.concurrent.ConcurrentHashMap + +/** + * A cache in which entries can "survive" getting purged [retainCount] times, given consecutive + * [purge] calls made at least [purgeTimeoutMillis] apart. See also [purge]. + * + * This cache is safe for multithreaded usage, and is recommended for objects that take a while to + * resolve (such as drawables, or things that require binder calls). As such, [getOrFetch] is + * recommended to be run on a background thread, while [purge] can be done from any thread. + */ +class NotifCollectionCache( + private val retainCount: Int = 1, + private val purgeTimeoutMillis: Long = 1000L, + private val systemClock: SystemClock = SystemClockImpl(), +) { + @get:VisibleForTesting val cache = ConcurrentHashMap() + + init { + if (retainCount < 0) { + throw IllegalArgumentException("retainCount cannot be negative") + } + } + + inner class CacheEntry(val key: String, val value: V) { + /** + * The "lives" represent how many times the entry will remain in the cache when purging it + * is attempted. + */ + @get:VisibleForTesting var lives: Int = retainCount + 1 + /** + * The last time this entry lost a "life". Starts at a negative value chosen so that the + * first purge is always considered "valid". + */ + private var lastValidPurge: Long = -purgeTimeoutMillis + + fun resetLives() { + // Lives/timeouts don't matter if retainCount is 0 + if (retainCount == 0) { + return + } + + synchronized(key) { + lives = retainCount + 1 + lastValidPurge = -purgeTimeoutMillis + } + // Add it to the cache again just in case it was deleted before we could reset the lives + cache[key] = this + } + + fun tryPurge(): Boolean { + // Lives/timeouts don't matter if retainCount is 0 + if (retainCount == 0) { + return true + } + + // Using uptimeMillis since it's guaranteed to be monotonic, as we don't want a + // timezone/clock change to break us + val now = systemClock.uptimeMillis() + + // Cannot purge the same entry from two threads simultaneously + synchronized(key) { + if (now - lastValidPurge < purgeTimeoutMillis) { + return false + } + lastValidPurge = now + return --lives <= 0 + } + } + } + + /** + * Get value from cache, or fetch it and add it to cache if not found. This can be called from + * any thread, but is usually expected to be called from the background. + * + * @param key key for the object to be obtained + * @param fetch method to fetch the object and add it to the cache if not present; note that + * there is no guarantee that two [fetch] cannot run in parallel for the same [key] (if + * [getOrFetch] is called simultaneously from different threads), so be mindful of potential + * side effects + */ + fun getOrFetch(key: String, fetch: (String) -> V): V { + val entry = cache[key] + if (entry != null) { + // Refresh lives on access + entry.resetLives() + return entry.value + } + + val value = fetch(key) + cache[key] = CacheEntry(key, value) + return value + } + + /** + * Clear entries that are NOT in [wantedKeys] if appropriate. This can be called from any + * thread. + * + * If retainCount > 0, a given entry will need to not be present in [wantedKeys] for + * ([retainCount] + 1) consecutive [purge] calls made within at least [purgeTimeoutMillis] of + * each other in order to be cleared. This count will be reset for any given entry 1) if + * [getOrFetch] is called for the entry or 2) if the entry is present in [wantedKeys] in a + * subsequent [purge] call. We prioritize keeping the entry if possible, so if [purge] is called + * simultaneously with [getOrFetch] on different threads for example, we will try to keep it in + * the cache, although it is not guaranteed. If avoiding cache misses is a concern, consider + * increasing the [retainCount] or [purgeTimeoutMillis]. + * + * For example, say [retainCount] = 1 and [purgeTimeoutMillis] = 1000 and we start with entries + * (a, b, c) in the cache: + * ```kotlin + * purge((a, c)); // marks b for deletion + * Thread.sleep(500) + * purge((a, c)); // does nothing as it was called earlier than the min 1s + * Thread.sleep(500) + * purge((b, c)); // b is no longer marked for deletion, but now a is + * Thread.sleep(1000); + * purge((c)); // deletes a from the cache and marks b for deletion, etc. + * ``` + */ + fun purge(wantedKeys: List) { + for ((key, entry) in cache) { + if (key in wantedKeys) { + entry.resetLives() + } else if (entry.tryPurge()) { + cache.remove(key) + } + } + } + + /** Clear all entries from the cache. */ + fun clear() { + cache.clear() + } +} -- GitLab From d3f8fc56aa44f623f0ca5248be5a6eaee4274725 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Wed, 16 Oct 2024 15:20:08 +0200 Subject: [PATCH 063/459] Implement hit-ratio dumping for NotifCollectionCache This will allow us to keep an eye on whether we end up with too many cache misses. Bug: 371174789 Test: NotifCollectionCacheTest for the counters, but the actual printing isn't tested yet, we can test it manually in a follow-up Flag: EXEMPT logging only change Change-Id: Ie7eef8c733ca96c979e2c82b1ca3be3a2a864d8b --- .../collection/NotifCollectionCacheTest.kt | 26 ++++++++++++++ .../collection/NotifCollectionCache.kt | 36 ++++++++++++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt index 7e9c5ca51ee2..d2a3a19e291c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCacheTest.kt @@ -202,5 +202,31 @@ class NotifCollectionCacheTest : SysuiTestCase() { assertNotNull(noLivesCache.cache[C]) } + @Test + fun hitsAndMisses_areAccurate() { + val fetch = { key: String -> key } + + // Construct the cache + assertThat(underTest.getOrFetch(A, fetch)).isEqualTo(A) + assertThat(underTest.getOrFetch(B, fetch)).isEqualTo(B) + assertThat(underTest.getOrFetch(C, fetch)).isEqualTo(C) + assertThat(underTest.hits.get()).isEqualTo(0) + assertThat(underTest.misses.get()).isEqualTo(3) + + // Verify that further calls count as hits + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(A, fetch) + underTest.getOrFetch(B, fetch) + underTest.getOrFetch(C, fetch) + assertThat(underTest.hits.get()).isEqualTo(4) + assertThat(underTest.misses.get()).isEqualTo(3) + + // Verify that a miss is counted again if the entries are cleared + underTest.clear() + underTest.getOrFetch(A, fetch) + assertThat(underTest.hits.get()).isEqualTo(4) + assertThat(underTest.misses.get()).isEqualTo(4) + } + private fun NotifCollectionCache.getLives(key: String) = this.cache[key]?.lives } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt index 192ba8de5653..2ee1dffd14f3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt @@ -16,10 +16,17 @@ package com.android.systemui.statusbar.notification.collection +import android.annotation.SuppressLint import com.android.internal.annotations.VisibleForTesting +import com.android.systemui.Dumpable +import com.android.systemui.util.asIndenting +import com.android.systemui.util.printCollection import com.android.systemui.util.time.SystemClock import com.android.systemui.util.time.SystemClockImpl +import com.android.systemui.util.withIncreasedIndent +import java.io.PrintWriter import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicInteger /** * A cache in which entries can "survive" getting purged [retainCount] times, given consecutive @@ -29,13 +36,18 @@ import java.util.concurrent.ConcurrentHashMap * resolve (such as drawables, or things that require binder calls). As such, [getOrFetch] is * recommended to be run on a background thread, while [purge] can be done from any thread. */ +@SuppressLint("DumpableNotRegistered") // this will be dumped by container classes class NotifCollectionCache( private val retainCount: Int = 1, private val purgeTimeoutMillis: Long = 1000L, private val systemClock: SystemClock = SystemClockImpl(), -) { +) : Dumpable { @get:VisibleForTesting val cache = ConcurrentHashMap() + // Counters for cache hits and misses to be used to calculate and dump the hit ratio + @get:VisibleForTesting val misses = AtomicInteger(0) + @get:VisibleForTesting val hits = AtomicInteger(0) + init { if (retainCount < 0) { throw IllegalArgumentException("retainCount cannot be negative") @@ -102,11 +114,13 @@ class NotifCollectionCache( fun getOrFetch(key: String, fetch: (String) -> V): V { val entry = cache[key] if (entry != null) { + hits.incrementAndGet() // Refresh lives on access entry.resetLives() return entry.value } + misses.incrementAndGet() val value = fetch(key) cache[key] = CacheEntry(key, value) return value @@ -151,4 +165,24 @@ class NotifCollectionCache( fun clear() { cache.clear() } + + override fun dump(pwOrig: PrintWriter, args: Array) { + val pw = pwOrig.asIndenting() + + pw.println("$TAG(retainCount = $retainCount, purgeTimeoutMillis = $purgeTimeoutMillis)") + pw.withIncreasedIndent { + pw.printCollection("keys present in cache", cache.keys.stream().sorted().toList()) + + val misses = misses.get() + val hits = hits.get() + pw.println( + "cache hit ratio = ${(hits.toFloat() / (hits + misses)) * 100}% " + + "($hits hits, $misses misses)" + ) + } + } + + companion object { + const val TAG = "NotifCollectionCache" + } } -- GitLab From b6cf44899c18bcd506c6aaf046f46d982c72d90f Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Wed, 16 Oct 2024 16:52:29 +0200 Subject: [PATCH 064/459] Implement caching in AppIconProvider Bug: 371174789 Test: PreparationCoordinatorTest Flag: android.app.notifications_redesign_app_icons Change-Id: I706ca0502635900751663e4515ac22f8523a642d --- .../PreparationCoordinatorTest.java | 75 ++++++++++++++++++- .../collection/NotifCollectionCache.kt | 5 +- .../coordinator/PreparationCoordinator.java | 36 ++++++++- .../notification/row/icon/AppIconProvider.kt | 29 +++++++ 4 files changed, 142 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java index dc9c22f566bf..94ad0db02dd1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java @@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.SHOW_NOTIFICATION_SNOOZE; import static com.android.systemui.log.LogBufferHelperKt.logcatLogBuffer; import static com.android.systemui.statusbar.notification.collection.GroupEntry.ROOT_ENTRY; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; @@ -36,9 +37,11 @@ import static org.mockito.Mockito.when; import static java.util.Objects.requireNonNull; +import android.app.Flags; import android.database.ContentObserver; import android.os.Handler; import android.os.RemoteException; +import android.platform.test.annotations.EnableFlags; import android.testing.TestableLooper; import androidx.annotation.NonNull; @@ -61,6 +64,7 @@ import com.android.systemui.statusbar.notification.collection.inflation.NotifInf import com.android.systemui.statusbar.notification.collection.inflation.NotifUiAdjustmentProvider; import com.android.systemui.statusbar.notification.collection.listbuilder.NotifSection; import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeFinalizeFilterListener; +import com.android.systemui.statusbar.notification.collection.listbuilder.OnBeforeTransformGroupsListener; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifFilter; import com.android.systemui.statusbar.notification.collection.listbuilder.pluggable.NotifSectioner; import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener; @@ -69,6 +73,7 @@ import com.android.systemui.statusbar.notification.collection.provider.SectionSt import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager; import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController; import com.android.systemui.util.settings.SecureSettings; @@ -82,10 +87,12 @@ import org.mockito.MockitoAnnotations; import org.mockito.Spy; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Stream; @SmallTest @RunWith(AndroidJUnit4.class) @@ -93,6 +100,7 @@ import java.util.Map; public class PreparationCoordinatorTest extends SysuiTestCase { private NotifCollectionListener mCollectionListener; private OnBeforeFinalizeFilterListener mBeforeFilterListener; + private OnBeforeTransformGroupsListener mBeforeTransformGroupsListener; private NotifFilter mUninflatedFilter; private NotifFilter mInflationErrorFilter; private NotifInflationErrorManager mErrorManager; @@ -101,6 +109,8 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Captor private ArgumentCaptor mCollectionListenerCaptor; @Captor private ArgumentCaptor mBeforeFilterListenerCaptor; + @Captor private ArgumentCaptor + mBeforeTransformGroupsListenerCaptor; @Captor private ArgumentCaptor mParamsCaptor; @Mock private NotifSectioner mNotifSectioner; @@ -108,6 +118,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Mock private NotifPipeline mNotifPipeline; @Mock private IStatusBarService mService; @Mock private BindEventManagerImpl mBindEventManagerImpl; + @Mock private AppIconProvider mAppIconProvider; @Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private SensitiveNotificationProtectionController mSensitiveNotifProtectionController; @Mock private Handler mHandler; @@ -126,6 +137,11 @@ public class PreparationCoordinatorTest extends SysuiTestCase { return new NotificationEntryBuilder().setSection(mNotifSection); } + @NonNull + private GroupEntryBuilder getGroupEntryBuilder() { + return new GroupEntryBuilder().setSection(mNotifSection); + } + @Before public void setUp() { MockitoAnnotations.initMocks(this); @@ -138,7 +154,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mSectionStyleProvider, mUserTracker, mGroupMembershipManager - ); + ); mEntry = getNotificationEntryBuilder().setParent(ROOT_ENTRY).build(); mInflationError = new Exception(TEST_MESSAGE); mErrorManager = new NotifInflationErrorManager(); @@ -153,6 +169,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mAdjustmentProvider, mService, mBindEventManagerImpl, + mAppIconProvider, TEST_CHILD_BIND_CUTOFF, TEST_MAX_GROUP_DELAY); @@ -163,6 +180,15 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mInflationErrorFilter = filters.get(0); mUninflatedFilter = filters.get(1); + if (android.app.Flags.notificationsRedesignAppIcons()) { + verify(mNotifPipeline).addOnBeforeTransformGroupsListener( + mBeforeTransformGroupsListenerCaptor.capture()); + mBeforeTransformGroupsListener = mBeforeTransformGroupsListenerCaptor.getValue(); + } else { + verify(mNotifPipeline, never()).addOnBeforeTransformGroupsListener( + mBeforeTransformGroupsListenerCaptor.capture()); + } + verify(mNotifPipeline).addCollectionListener(mCollectionListenerCaptor.capture()); mCollectionListener = mCollectionListenerCaptor.getValue(); @@ -198,6 +224,53 @@ public class PreparationCoordinatorTest extends SysuiTestCase { assertTrue(mInflationErrorFilter.shouldFilterOut(mEntry, 0)); } + @Test + @EnableFlags(Flags.FLAG_NOTIFICATIONS_REDESIGN_APP_ICONS) + public void testPurgesCache() { + // GIVEN a notification list + NotificationEntry entry1 = getNotificationEntryBuilder().setPkg("1").build(); + NotificationEntry entry2 = getNotificationEntryBuilder().setPkg("2").build(); + NotificationEntry entry2bis = getNotificationEntryBuilder().setPkg("2").build(); + NotificationEntry entry3 = getNotificationEntryBuilder().setPkg("3").build(); + + String groupKey1 = "group1"; + NotificationEntry summary = + getNotificationEntryBuilder() + .setPkg(groupKey1) + .setGroup(mContext, groupKey1) + .setGroupSummary(mContext, true) + .build(); + NotificationEntry child1 = getNotificationEntryBuilder().setGroup(mContext, groupKey1) + .setPkg(groupKey1).build(); + NotificationEntry child2 = getNotificationEntryBuilder().setGroup(mContext, groupKey1) + .setPkg(groupKey1).build(); + GroupEntry groupWithSummaryAndChildren = getGroupEntryBuilder().setKey(groupKey1) + .setSummary(summary).addChild(child1).addChild(child2).build(); + + String groupKey2 = "group2"; + NotificationEntry summary2 = + getNotificationEntryBuilder() + .setPkg(groupKey2) + .setGroup(mContext, groupKey2) + .setGroupSummary(mContext, true) + .build(); + GroupEntry summaryOnlyGroup = getGroupEntryBuilder().setKey(groupKey2) + .setSummary(summary2).build(); + + // WHEN onBeforeTransformGroup is called + mBeforeTransformGroupsListener.onBeforeTransformGroups( + List.of(entry1, entry2, entry2bis, entry3, + groupWithSummaryAndChildren, summaryOnlyGroup)); + + // THEN purge should be called + ArgumentCaptor> argumentCaptor = ArgumentCaptor.forClass(List.class); + verify(mAppIconProvider).purgeCache(argumentCaptor.capture()); + List actualList = argumentCaptor.getValue().stream().sorted().toList(); + List expectedList = Stream.of("1", "2", "3", "group1", "group2") + .sorted().toList(); + assertEquals(expectedList, actualList); + } + @Test public void testInflatesNewNotification() { // WHEN there is a new notification diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt index 2ee1dffd14f3..958001625a07 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollectionCache.kt @@ -35,6 +35,9 @@ import java.util.concurrent.atomic.AtomicInteger * This cache is safe for multithreaded usage, and is recommended for objects that take a while to * resolve (such as drawables, or things that require binder calls). As such, [getOrFetch] is * recommended to be run on a background thread, while [purge] can be done from any thread. + * + * Important: This cache does NOT have a maximum size, cleaning it up (via [purge]) is the + * responsibility of the caller, to avoid keeping things in memory unnecessarily. */ @SuppressLint("DumpableNotRegistered") // this will be dumped by container classes class NotifCollectionCache( @@ -151,7 +154,7 @@ class NotifCollectionCache( * purge((c)); // deletes a from the cache and marks b for deletion, etc. * ``` */ - fun purge(wantedKeys: List) { + fun purge(wantedKeys: Collection) { for ((key, entry) in cache) { if (key in wantedKeys) { entry.resetLives() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index 9b075a650b48..7a4aac30b02a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -27,6 +27,7 @@ import android.os.Trace; import android.service.notification.StatusBarNotification; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -49,13 +50,17 @@ import com.android.systemui.statusbar.notification.collection.render.NotifViewBa import com.android.systemui.statusbar.notification.collection.render.NotifViewController; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager.NotifInflationErrorListener; +import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation; import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.inject.Inject; @@ -104,6 +109,7 @@ public class PreparationCoordinator implements Coordinator { /** How long we can delay a group while waiting for all children to inflate */ private final long mMaxGroupInflationDelay; private final BindEventManagerImpl mBindEventManager; + private final AppIconProvider mAppIconProvider; @Inject public PreparationCoordinator( @@ -113,7 +119,8 @@ public class PreparationCoordinator implements Coordinator { NotifViewBarn viewBarn, NotifUiAdjustmentProvider adjustmentProvider, IStatusBarService service, - BindEventManagerImpl bindEventManager) { + BindEventManagerImpl bindEventManager, + AppIconProvider appIconProvider) { this( logger, notifInflater, @@ -122,6 +129,7 @@ public class PreparationCoordinator implements Coordinator { adjustmentProvider, service, bindEventManager, + appIconProvider, CHILD_BIND_CUTOFF, MAX_GROUP_INFLATION_DELAY); } @@ -135,6 +143,7 @@ public class PreparationCoordinator implements Coordinator { NotifUiAdjustmentProvider adjustmentProvider, IStatusBarService service, BindEventManagerImpl bindEventManager, + AppIconProvider appIconProvider, int childBindCutoff, long maxGroupInflationDelay) { mLogger = logger; @@ -146,6 +155,7 @@ public class PreparationCoordinator implements Coordinator { mChildBindCutoff = childBindCutoff; mMaxGroupInflationDelay = maxGroupInflationDelay; mBindEventManager = bindEventManager; + mAppIconProvider = appIconProvider; } @Override @@ -155,6 +165,9 @@ public class PreparationCoordinator implements Coordinator { () -> mNotifInflatingFilter.invalidateList("adjustmentProviderChanged")); pipeline.addCollectionListener(mNotifCollectionListener); + if (android.app.Flags.notificationsRedesignAppIcons()) { + pipeline.addOnBeforeTransformGroupsListener(this::purgeCaches); + } // Inflate after grouping/sorting since that affects what views to inflate. pipeline.addOnBeforeFinalizeFilterListener(this::inflateAllRequiredViews); pipeline.addFinalizeFilter(mNotifInflationErrorFilter); @@ -260,6 +273,27 @@ public class PreparationCoordinator implements Coordinator { } }; + private void purgeCaches(Collection entries) { + mAppIconProvider.purgeCache(/* wantedPackages = */ getPackages(entries)); + } + + /** + * Get all app packages present in {@param entries}. + */ + private static @NonNull Set getPackages(Collection entries) { + Set packages = new HashSet<>(); + for (ListEntry entry : entries) { + NotificationEntry notificationEntry = entry.getRepresentativeEntry(); + if (notificationEntry == null) { + Log.wtf(TAG, "notification entry " + entry.getKey() + + " has no representative entry"); + continue; + } + packages.add(notificationEntry.getSbn().getPackageName()); + } + return packages; + } + private void inflateAllRequiredViews(List entries) { for (int i = 0, size = entries.size(); i < size; i++) { ListEntry entry = entries.get(i); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt index 24b5cf1aa33b..429d1e7d7f8d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt @@ -16,6 +16,7 @@ package com.android.systemui.statusbar.notification.row.icon +import android.annotation.WorkerThread import android.app.ActivityManager import android.app.Flags import android.content.Context @@ -28,6 +29,7 @@ import android.util.Log import com.android.internal.R import com.android.launcher3.icons.BaseIconFactory import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.notification.collection.NotifCollectionCache import dagger.Module import dagger.Provides import javax.inject.Inject @@ -35,8 +37,20 @@ import javax.inject.Provider /** A provider used to cache and fetch app icons used by notifications. */ interface AppIconProvider { + /** + * Loads the icon corresponding to [packageName] into cache, or fetches it from there if already + * present. This should only be called from the background. + */ @Throws(NameNotFoundException::class) + @WorkerThread fun getOrFetchAppIcon(packageName: String, context: Context): Drawable + + /** + * Mark all the entries in the cache that are NOT in [wantedPackages] to be cleared. If they're + * still not needed on the next call of this method (made after a timeout of 1s, in case they + * happen more frequently than that), they will be purged. This can be done from any thread. + */ + fun purgeCache(wantedPackages: Collection) } @SysUISingleton @@ -53,13 +67,24 @@ class AppIconProviderImpl @Inject constructor(private val sysuiContext: Context) return BaseIconFactory(sysuiContext, res.configuration.densityDpi, iconSize) } + private val cache = NotifCollectionCache() + override fun getOrFetchAppIcon(packageName: String, context: Context): Drawable { + return cache.getOrFetch(packageName) { fetchAppIcon(packageName, context) } + } + + @WorkerThread + private fun fetchAppIcon(packageName: String, context: Context): BitmapDrawable { val icon = context.packageManager.getApplicationIcon(packageName) return BitmapDrawable( context.resources, iconFactory.createScaledBitmap(icon, BaseIconFactory.MODE_HARDWARE), ) } + + override fun purgeCache(wantedPackages: Collection) { + cache.purge(wantedPackages) + } } class NoOpIconProvider : AppIconProvider { @@ -71,6 +96,10 @@ class NoOpIconProvider : AppIconProvider { Log.wtf(TAG, "NoOpIconProvider should not be used anywhere.") return ColorDrawable(Color.WHITE) } + + override fun purgeCache(wantedPackages: Collection) { + Log.wtf(TAG, "NoOpIconProvider should not be used anywhere.") + } } @Module -- GitLab From 1c7b6944c2aef45808900614aa82a35c24f41a85 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Thu, 17 Oct 2024 14:21:38 +0200 Subject: [PATCH 065/459] Implement caching in NotifIconStyleProvider Bug: 371174789 Test: PreparationCoordinatorTest Flag: android.app.notifications_redesign_app_icons Change-Id: I796ef12168432b5483fc6955db41c0b893301bff --- .../PreparationCoordinatorTest.java | 55 ++++++++++++++++++- .../coordinator/PreparationCoordinator.java | 12 +++- .../row/icon/NotificationIconStyleProvider.kt | 26 ++++++++- 3 files changed, 87 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java index 94ad0db02dd1..f1edb417a314 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinatorTest.java @@ -74,6 +74,7 @@ import com.android.systemui.statusbar.notification.collection.render.GroupMember import com.android.systemui.statusbar.notification.collection.render.NotifViewBarn; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager; import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; import com.android.systemui.statusbar.policy.SensitiveNotificationProtectionController; import com.android.systemui.util.settings.SecureSettings; @@ -119,13 +120,13 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Mock private IStatusBarService mService; @Mock private BindEventManagerImpl mBindEventManagerImpl; @Mock private AppIconProvider mAppIconProvider; + @Mock private NotificationIconStyleProvider mNotificationIconStyleProvider; @Mock private NotificationLockscreenUserManager mLockscreenUserManager; @Mock private SensitiveNotificationProtectionController mSensitiveNotifProtectionController; @Mock private Handler mHandler; @Mock private SecureSettings mSecureSettings; @Spy private FakeNotifInflater mNotifInflater = new FakeNotifInflater(); - @Mock - HighPriorityProvider mHighPriorityProvider; + @Mock HighPriorityProvider mHighPriorityProvider; private SectionStyleProvider mSectionStyleProvider; @Mock private UserTracker mUserTracker; @Mock private GroupMembershipManager mGroupMembershipManager; @@ -170,6 +171,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { mService, mBindEventManagerImpl, mAppIconProvider, + mNotificationIconStyleProvider, TEST_CHILD_BIND_CUTOFF, TEST_MAX_GROUP_DELAY); @@ -226,7 +228,7 @@ public class PreparationCoordinatorTest extends SysuiTestCase { @Test @EnableFlags(Flags.FLAG_NOTIFICATIONS_REDESIGN_APP_ICONS) - public void testPurgesCache() { + public void testPurgesAppIconProviderCache() { // GIVEN a notification list NotificationEntry entry1 = getNotificationEntryBuilder().setPkg("1").build(); NotificationEntry entry2 = getNotificationEntryBuilder().setPkg("2").build(); @@ -271,6 +273,53 @@ public class PreparationCoordinatorTest extends SysuiTestCase { assertEquals(expectedList, actualList); } + @Test + @EnableFlags(Flags.FLAG_NOTIFICATIONS_REDESIGN_APP_ICONS) + public void testPurgesNotificationIconStyleProviderCache() { + // GIVEN a notification list + NotificationEntry entry1 = getNotificationEntryBuilder().setPkg("1").build(); + NotificationEntry entry2 = getNotificationEntryBuilder().setPkg("2").build(); + NotificationEntry entry2bis = getNotificationEntryBuilder().setPkg("2").build(); + NotificationEntry entry3 = getNotificationEntryBuilder().setPkg("3").build(); + + String groupKey1 = "group1"; + NotificationEntry summary = + getNotificationEntryBuilder() + .setPkg(groupKey1) + .setGroup(mContext, groupKey1) + .setGroupSummary(mContext, true) + .build(); + NotificationEntry child1 = getNotificationEntryBuilder().setGroup(mContext, groupKey1) + .setPkg(groupKey1).build(); + NotificationEntry child2 = getNotificationEntryBuilder().setGroup(mContext, groupKey1) + .setPkg(groupKey1).build(); + GroupEntry groupWithSummaryAndChildren = getGroupEntryBuilder().setKey(groupKey1) + .setSummary(summary).addChild(child1).addChild(child2).build(); + + String groupKey2 = "group2"; + NotificationEntry summary2 = + getNotificationEntryBuilder() + .setPkg(groupKey2) + .setGroup(mContext, groupKey2) + .setGroupSummary(mContext, true) + .build(); + GroupEntry summaryOnlyGroup = getGroupEntryBuilder().setKey(groupKey2) + .setSummary(summary2).build(); + + // WHEN onBeforeTransformGroup is called + mBeforeTransformGroupsListener.onBeforeTransformGroups( + List.of(entry1, entry2, entry2bis, entry3, + groupWithSummaryAndChildren, summaryOnlyGroup)); + + // THEN purge should be called + ArgumentCaptor> argumentCaptor = ArgumentCaptor.forClass(List.class); + verify(mNotificationIconStyleProvider).purgeCache(argumentCaptor.capture()); + List actualList = argumentCaptor.getValue().stream().sorted().toList(); + List expectedList = Stream.of("1", "2", "3", "group1", "group2") + .sorted().toList(); + assertEquals(expectedList, actualList); + } + @Test public void testInflatesNewNotification() { // WHEN there is a new notification diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java index 7a4aac30b02a..f75163d2662b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/PreparationCoordinator.java @@ -51,6 +51,7 @@ import com.android.systemui.statusbar.notification.collection.render.NotifViewCo import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager; import com.android.systemui.statusbar.notification.row.NotifInflationErrorManager.NotifInflationErrorListener; import com.android.systemui.statusbar.notification.row.icon.AppIconProvider; +import com.android.systemui.statusbar.notification.row.icon.NotificationIconStyleProvider; import com.android.systemui.statusbar.notification.row.shared.AsyncGroupHeaderViewInflation; import com.android.systemui.statusbar.notification.row.shared.AsyncHybridViewInflation; @@ -110,6 +111,7 @@ public class PreparationCoordinator implements Coordinator { private final long mMaxGroupInflationDelay; private final BindEventManagerImpl mBindEventManager; private final AppIconProvider mAppIconProvider; + private final NotificationIconStyleProvider mNotificationIconStyleProvider; @Inject public PreparationCoordinator( @@ -120,7 +122,8 @@ public class PreparationCoordinator implements Coordinator { NotifUiAdjustmentProvider adjustmentProvider, IStatusBarService service, BindEventManagerImpl bindEventManager, - AppIconProvider appIconProvider) { + AppIconProvider appIconProvider, + NotificationIconStyleProvider notificationIconStyleProvider) { this( logger, notifInflater, @@ -130,6 +133,7 @@ public class PreparationCoordinator implements Coordinator { service, bindEventManager, appIconProvider, + notificationIconStyleProvider, CHILD_BIND_CUTOFF, MAX_GROUP_INFLATION_DELAY); } @@ -144,6 +148,7 @@ public class PreparationCoordinator implements Coordinator { IStatusBarService service, BindEventManagerImpl bindEventManager, AppIconProvider appIconProvider, + NotificationIconStyleProvider notificationIconStyleProvider, int childBindCutoff, long maxGroupInflationDelay) { mLogger = logger; @@ -156,6 +161,7 @@ public class PreparationCoordinator implements Coordinator { mMaxGroupInflationDelay = maxGroupInflationDelay; mBindEventManager = bindEventManager; mAppIconProvider = appIconProvider; + mNotificationIconStyleProvider = notificationIconStyleProvider; } @Override @@ -274,7 +280,9 @@ public class PreparationCoordinator implements Coordinator { }; private void purgeCaches(Collection entries) { - mAppIconProvider.purgeCache(/* wantedPackages = */ getPackages(entries)); + Set wantedPackages = getPackages(entries); + mAppIconProvider.purgeCache(wantedPackages); + mNotificationIconStyleProvider.purgeCache(wantedPackages); } /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt index 165c1a7803a9..ebb7d97a772d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt @@ -23,6 +23,7 @@ import android.content.pm.ApplicationInfo import android.service.notification.StatusBarNotification import android.util.Log import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.notification.collection.NotifCollectionCache import dagger.Module import dagger.Provides import javax.inject.Inject @@ -33,15 +34,30 @@ import javax.inject.Provider * notifications. */ interface NotificationIconStyleProvider { + /** + * Determines whether the [notification] should display the app icon instead of the small icon. + * This can result in a binder call, and therefore should only be called from the background. + */ @WorkerThread fun shouldShowAppIcon(notification: StatusBarNotification, context: Context): Boolean + + /** + * Mark all the entries in the cache that are NOT in [wantedPackages] to be cleared. If they're + * still not needed on the next call of this method (made after a timeout of 1s, in case they + * happen more frequently than that), they will be purged. This can be done from any thread. + */ + fun purgeCache(wantedPackages: Collection) } @SysUISingleton class NotificationIconStyleProviderImpl @Inject constructor() : NotificationIconStyleProvider { + private val cache = NotifCollectionCache() + override fun shouldShowAppIcon(notification: StatusBarNotification, context: Context): Boolean { val packageContext = notification.getPackageContext(context) - return !belongsToHeadlessSystemApp(packageContext) + return cache.getOrFetch(notification.packageName) { + !belongsToHeadlessSystemApp(packageContext) + } } @WorkerThread @@ -62,6 +78,10 @@ class NotificationIconStyleProviderImpl @Inject constructor() : NotificationIcon return false } } + + override fun purgeCache(wantedPackages: Collection) { + cache.purge(wantedPackages) + } } class NoOpIconStyleProvider : NotificationIconStyleProvider { @@ -73,6 +93,10 @@ class NoOpIconStyleProvider : NotificationIconStyleProvider { Log.wtf(TAG, "NoOpIconStyleProvider should not be used anywhere.") return true } + + override fun purgeCache(wantedPackages: Collection) { + Log.wtf(TAG, "NoOpIconStyleProvider should not be used anywhere.") + } } @Module -- GitLab From b2181a83974662dbdaf07caa85e128c119152906 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Thu, 17 Oct 2024 15:05:03 +0200 Subject: [PATCH 066/459] Make AppIconProvider&NotifIconStyleProvider dumpable Example dump output: ``` AppIconProviderImpl: ---------------------------------------------------------------------------- cache information: NotifCollectionCache(retainCount = 1, purgeTimeoutMillis = 1000) keys present in cache: 4 com.google.android.apps.photos com.google.android.calendar com.google.android.gm com.google.android.googlequicksearchbox cache hit ratio = 88.2353% (30 hits, 4 misses) icon factory information: fullResIconDpi = 360 iconSize = 108 NORMAL dump took 1ms -- AppIconProviderImpl NotificationIconStyleProviderImpl: ---------------------------------------------------------------------------- cache information: NotifCollectionCache(retainCount = 1, purgeTimeoutMillis = 1000) keys present in cache: 5 android com.google.android.apps.photos com.google.android.calendar com.google.android.gm com.google.android.googlequicksearchbox cache hit ratio = 86.84211% (33 hits, 5 misses) NORMAL dump took 1ms -- NotificationIconStyleProviderImpl Dump took 5ms ``` Bug: 371174789 Test: adb shell dumpsys activity service com.android.systemui/.SystemUIService AppIconProviderImpl NotificationIconStyleProviderImpl Flag: android.app.notifications_redesign_app_icons Change-Id: Ia9f98af84026440c5483bf100bee4352924f37af --- .../notification/row/icon/AppIconProvider.kt | 32 ++++++++++++++++++- .../row/icon/NotificationIconStyleProvider.kt | 22 ++++++++++++- .../row/ExpandableNotificationRowBuilder.kt | 9 +++--- .../row/icon/AppIconProviderKosmos.kt | 4 ++- .../NotificationIconStyleProviderKosmos.kt | 4 ++- 5 files changed, 62 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt index 429d1e7d7f8d..0ddf9f7270df 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt @@ -28,10 +28,15 @@ import android.graphics.drawable.Drawable import android.util.Log import com.android.internal.R import com.android.launcher3.icons.BaseIconFactory +import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.notification.collection.NotifCollectionCache +import com.android.systemui.util.asIndenting +import com.android.systemui.util.withIncreasedIndent import dagger.Module import dagger.Provides +import java.io.PrintWriter import javax.inject.Inject import javax.inject.Provider @@ -54,7 +59,14 @@ interface AppIconProvider { } @SysUISingleton -class AppIconProviderImpl @Inject constructor(private val sysuiContext: Context) : AppIconProvider { +class AppIconProviderImpl +@Inject +constructor(private val sysuiContext: Context, dumpManager: DumpManager) : + AppIconProvider, Dumpable { + init { + dumpManager.registerNormalDumpable(TAG, this) + } + private val iconFactory: BaseIconFactory get() { val isLowRam = ActivityManager.isLowRamDeviceStatic() @@ -85,6 +97,24 @@ class AppIconProviderImpl @Inject constructor(private val sysuiContext: Context) override fun purgeCache(wantedPackages: Collection) { cache.purge(wantedPackages) } + + override fun dump(pwOrig: PrintWriter, args: Array) { + val pw = pwOrig.asIndenting() + + pw.println("cache information:") + pw.withIncreasedIndent { cache.dump(pw, args) } + + val iconFactory = iconFactory + pw.println("icon factory information:") + pw.withIncreasedIndent { + pw.println("fullResIconDpi = ${iconFactory.fullResIconDpi}") + pw.println("iconSize = ${iconFactory.iconBitmapSize}") + } + } + + companion object { + const val TAG = "AppIconProviderImpl" + } } class NoOpIconProvider : AppIconProvider { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt index ebb7d97a772d..35e38c2c0c14 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt @@ -22,10 +22,15 @@ import android.content.Context import android.content.pm.ApplicationInfo import android.service.notification.StatusBarNotification import android.util.Log +import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dump.DumpManager import com.android.systemui.statusbar.notification.collection.NotifCollectionCache +import com.android.systemui.util.asIndenting +import com.android.systemui.util.withIncreasedIndent import dagger.Module import dagger.Provides +import java.io.PrintWriter import javax.inject.Inject import javax.inject.Provider @@ -50,7 +55,12 @@ interface NotificationIconStyleProvider { } @SysUISingleton -class NotificationIconStyleProviderImpl @Inject constructor() : NotificationIconStyleProvider { +class NotificationIconStyleProviderImpl @Inject constructor(dumpManager: DumpManager) : + NotificationIconStyleProvider, Dumpable { + init { + dumpManager.registerNormalDumpable(TAG, this) + } + private val cache = NotifCollectionCache() override fun shouldShowAppIcon(notification: StatusBarNotification, context: Context): Boolean { @@ -82,6 +92,16 @@ class NotificationIconStyleProviderImpl @Inject constructor() : NotificationIcon override fun purgeCache(wantedPackages: Collection) { cache.purge(wantedPackages) } + + override fun dump(pwOrig: PrintWriter, args: Array) { + val pw = pwOrig.asIndenting() + pw.println("cache information:") + pw.withIncreasedIndent { cache.dump(pw, args) } + } + + companion object { + const val TAG = "NotificationIconStyleProviderImpl" + } } class NoOpIconStyleProvider : NotificationIconStyleProvider { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt index 7f4c670b05aa..c3996e400726 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt @@ -85,7 +85,6 @@ import com.android.systemui.statusbar.policy.dagger.RemoteInputViewSubcomponent import com.android.systemui.util.Assert.runWithCurrentThreadAsMainThread import com.android.systemui.util.DeviceConfigProxyFake import com.android.systemui.util.concurrency.FakeExecutor -import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.wmshell.BubblesManager @@ -126,6 +125,7 @@ class ExpandableNotificationRowBuilder( private val mMainCoroutineContext = mTestScope.coroutineContext private val mFakeSystemClock = FakeSystemClock() private val mMainExecutor = FakeExecutor(mFakeSystemClock) + private val mDumpManager = DumpManager() init { featureFlags.setDefault(Flags.ENABLE_NOTIFICATIONS_SIMULATE_SLOW_MEASURE) @@ -142,8 +142,7 @@ class ExpandableNotificationRowBuilder( mGroupMembershipManager = GroupMembershipManagerImpl() mSmartReplyController = Mockito.mock(SmartReplyController::class.java, STUB_ONLY) - val dumpManager = DumpManager() - mGroupExpansionManager = GroupExpansionManagerImpl(dumpManager, mGroupMembershipManager) + mGroupExpansionManager = GroupExpansionManagerImpl(mDumpManager, mGroupMembershipManager) mHeadsUpManager = Mockito.mock(HeadsUpManager::class.java, STUB_ONLY) mIconManager = IconManager( @@ -289,8 +288,8 @@ class ExpandableNotificationRowBuilder( NotificationOptimizedLinearLayoutFactory(), { Mockito.mock(NotificationViewFlipperFactory::class.java) }, NotificationRowIconViewInflaterFactory( - AppIconProviderImpl(context), - NotificationIconStyleProviderImpl(), + AppIconProviderImpl(context, mDumpManager), + NotificationIconStyleProviderImpl(mDumpManager), ), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/AppIconProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/AppIconProviderKosmos.kt index 08c6bbab6dd6..0fd0f1469818 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/AppIconProviderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/AppIconProviderKosmos.kt @@ -17,6 +17,8 @@ package com.android.systemui.statusbar.notification.row.icon import android.content.applicationContext +import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos -val Kosmos.appIconProvider by Kosmos.Fixture { AppIconProviderImpl(applicationContext) } +val Kosmos.appIconProvider by + Kosmos.Fixture { AppIconProviderImpl(applicationContext, dumpManager) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt index 611c90a6f4e8..0fe84fb135ab 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt @@ -16,6 +16,8 @@ package com.android.systemui.statusbar.notification.row.icon +import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos -val Kosmos.notificationIconStyleProvider by Kosmos.Fixture { NotificationIconStyleProviderImpl() } +val Kosmos.notificationIconStyleProvider by + Kosmos.Fixture { NotificationIconStyleProviderImpl(dumpManager) } -- GitLab From 781e35dcb056734be3d53f1a21dab363a10aadfb Mon Sep 17 00:00:00 2001 From: Hani Kazmi Date: Fri, 18 Oct 2024 16:59:23 +0000 Subject: [PATCH 067/459] [AAPM] Add Owners file for tests Bug: 352420507 Change-Id: I3b808adc6fdef25e305a100e72581657c06811db Test: N/A --- .../src/com/android/server/security/advancedprotection/OWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 services/tests/servicestests/src/com/android/server/security/advancedprotection/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/security/advancedprotection/OWNERS b/services/tests/servicestests/src/com/android/server/security/advancedprotection/OWNERS new file mode 100644 index 000000000000..9bf5e58c01a9 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/security/advancedprotection/OWNERS @@ -0,0 +1 @@ +file:platform/frameworks/base:main:/core/java/android/security/advancedprotection/OWNERS -- GitLab From b7815a0a3442f3c0b4e980654b22b1567ce76cfc Mon Sep 17 00:00:00 2001 From: Nan Wu Date: Thu, 10 Oct 2024 01:47:49 +0000 Subject: [PATCH 068/459] Add new API to allow app to opt out Intent Redirect Prevention Add new API Intent.allowUnsafeUnparceledIntentLaunch Bug: 372886352 Test: IntentTest#testAllowUnsafeUnparceledIntentLaunch Flag: android.security.prevent_intent_redirect Change-Id: Ifa2aee538cd2179ebb79c580179782019c0500a4 --- core/api/current.txt | 1 + core/java/android/content/Intent.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 012a2e62755c..ffdb205dbba6 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -11239,6 +11239,7 @@ package android.content { method public void removeCategory(String); method public void removeExtra(String); method public void removeFlags(int); + method @FlaggedApi("android.security.prevent_intent_redirect") public void removeLaunchSecurityProtection(); method @NonNull public android.content.Intent replaceExtras(@NonNull android.content.Intent); method @NonNull public android.content.Intent replaceExtras(@Nullable android.os.Bundle); method public android.content.ComponentName resolveActivity(@NonNull android.content.pm.PackageManager); diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index f71952849872..c9eb2f48cb69 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -20,6 +20,7 @@ import static android.app.sdksandbox.SdkSandboxManager.ACTION_START_SANDBOXED_AC import static android.content.ContentProvider.maybeAddUserId; import static android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE; import static android.security.Flags.FLAG_FRP_ENFORCEMENT; +import static android.security.Flags.FLAG_PREVENT_INTENT_REDIRECT; import static android.security.Flags.preventIntentRedirect; import android.Manifest; @@ -12281,6 +12282,20 @@ public class Intent implements Parcelable, Cloneable { mExtras.setIsIntentExtra(); } + /** + * When an intent comes from another app or component as an embedded extra intent, the system + * creates a token to identify the creator of this foreign intent. If this token is missing or + * invalid, the system will block the launch of this intent. If it contains a valid token, the + * system will perform verification against the creator to block launching target it has no + * permission to launch or block it from granting URI access to the tagert it cannot access. + * This method provides a way to opt out this feature. + */ + @FlaggedApi(FLAG_PREVENT_INTENT_REDIRECT) + public void removeLaunchSecurityProtection() { + mExtendedFlags &= ~EXTENDED_FLAG_MISSING_CREATOR_OR_INVALID_TOKEN; + removeCreatorTokenInfo(); + } + public void writeToParcel(Parcel out, int flags) { out.writeString8(mAction); Uri.writeToParcel(out, mData); -- GitLab From 2f97d5329c5a95e3f8fce95575c01e41708a1924 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 18 Oct 2024 14:55:58 +0000 Subject: [PATCH 069/459] Directly set isKeyguardGoingAway in repo When launching an activity from a pulsing notif while DOZING, the launch animation can sometimes run before the transition to GONE happens, which leaves the clock overlapping the animation a bit. Set the signal directly as opposed to waiting for a callback. Fixes: 373550549 Test: atest FromDozingTransitionInteractorTest Flag: EXEMPT bugfix Change-Id: I2a6f16512ef5370a480dfefcf2857403baa2af55 --- .../repository/KeyguardRepositoryImplTest.kt | 24 +++++-------------- .../FromDozingTransitionInteractorTest.kt | 16 +++++++++++++ .../policy/KeyguardStateControllerTest.java | 4 ++++ .../keyguard/KeyguardViewMediator.java | 2 +- .../data/repository/KeyguardRepository.kt | 6 +---- .../FromDozingTransitionInteractor.kt | 3 ++- .../domain/interactor/KeyguardInteractor.kt | 6 ++++- .../policy/KeyguardStateControllerImpl.java | 5 ++++ .../data/repository/FakeKeyguardRepository.kt | 5 ++-- 9 files changed, 42 insertions(+), 29 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt index 93754fd7e778..3507d6ddc5d4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryImplTest.kt @@ -336,26 +336,14 @@ class KeyguardRepositoryImplTest : SysuiTestCase() { @Test fun isKeyguardGoingAway() = testScope.runTest { - whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(false) - var latest: Boolean? = null - val job = underTest.isKeyguardGoingAway.onEach { latest = it }.launchIn(this) - runCurrent() - assertThat(latest).isFalse() - - val captor = argumentCaptor() - verify(keyguardStateController, atLeastOnce()).addCallback(captor.capture()) + val isGoingAway by collectLastValue(underTest.isKeyguardGoingAway) + assertThat(isGoingAway).isFalse() - whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(true) - captor.value.onKeyguardGoingAwayChanged() - runCurrent() - assertThat(latest).isTrue() - - whenever(keyguardStateController.isKeyguardGoingAway).thenReturn(false) - captor.value.onKeyguardGoingAwayChanged() - runCurrent() - assertThat(latest).isFalse() + underTest.isKeyguardGoingAway.value = true + assertThat(isGoingAway).isTrue() - job.cancel() + underTest.isKeyguardGoingAway.value = false + assertThat(isGoingAway).isFalse() } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt index 3b6e5d09a37c..df44425d4b49 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractorTest.kt @@ -90,6 +90,7 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT private lateinit var powerInteractor: PowerInteractor private lateinit var transitionRepository: FakeKeyguardTransitionRepository + private lateinit var keyguardInteractor: KeyguardInteractor companion object { @JvmStatic @@ -106,6 +107,7 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT @Before fun setup() { powerInteractor = kosmos.powerInteractor + keyguardInteractor = kosmos.keyguardInteractor transitionRepository = kosmos.fakeKeyguardTransitionRepositorySpy underTest = kosmos.fromDozingTransitionInteractor @@ -136,6 +138,20 @@ class FromDozingTransitionInteractorTest(flags: FlagsParameterization?) : SysuiT .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.LOCKSCREEN) } + @Test + @DisableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) + fun testTransitionToGone_onWakeup_whenGoingAway() = + testScope.runTest { + keyguardInteractor.setIsKeyguardGoingAway(true) + runCurrent() + + powerInteractor.setAwakeForTest() + advanceTimeBy(60L) + + assertThat(transitionRepository) + .startedTransition(from = KeyguardState.DOZING, to = KeyguardState.GONE) + } + @Test @EnableFlags(FLAG_KEYGUARD_WM_STATE_REFACTOR) @DisableFlags(FLAG_COMMUNAL_SCENE_KTF_REFACTOR) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java index aed9af6df454..406ca0585dd9 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/KeyguardStateControllerTest.java @@ -33,6 +33,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.widget.LockPatternUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.keyguard.KeyguardUpdateMonitorCallback; +import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.keyguard.logging.KeyguardUpdateMonitorLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; @@ -67,6 +68,8 @@ public class KeyguardStateControllerTest extends SysuiTestCase { @Mock private Lazy mKeyguardUnlockAnimationControllerLazy; @Mock + private Lazy mKeyguardInteractorLazy; + @Mock private SelectedUserInteractor mSelectedUserInteractor; @Mock private KeyguardUpdateMonitorLogger mLogger; @@ -86,6 +89,7 @@ public class KeyguardStateControllerTest extends SysuiTestCase { mKeyguardUnlockAnimationControllerLazy, mLogger, mDumpManager, + mKeyguardInteractorLazy, mFeatureFlags, mSelectedUserInteractor); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index fbc76c587be2..60a306b3e245 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -2975,7 +2975,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void run() { Trace.beginSection("KeyguardViewMediator.mKeyGuardGoingAwayRunnable"); - if (DEBUG) Log.d(TAG, "keyguardGoingAway"); + Log.d(TAG, "keyguardGoingAwayRunnable"); mKeyguardViewControllerLazy.get().keyguardGoingAway(); int flags = 0; diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 821017418277..706cd14c36b0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -114,7 +114,7 @@ interface KeyguardRepository { "away' is isInTransitionToState(GONE), but consider using more specific flows " + "whenever possible." ) - val isKeyguardGoingAway: Flow + val isKeyguardGoingAway: MutableStateFlow /** * Whether the keyguard is enabled, per [KeyguardService]. If the keyguard is not enabled, the @@ -655,10 +655,6 @@ constructor( override fun onUnlockedChanged() { isKeyguardDismissible.value = keyguardStateController.isUnlocked } - - override fun onKeyguardGoingAwayChanged() { - isKeyguardGoingAway.value = keyguardStateController.isKeyguardGoingAway - } } keyguardStateController.addCallback(callback) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index 8c7fe5f87a3f..0c2d5778079b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -131,12 +131,13 @@ constructor( .collect { (_, isCommunalAvailable, isIdleOnCommunal) -> val isKeyguardOccludedLegacy = keyguardInteractor.isKeyguardOccluded.value val primaryBouncerShowing = keyguardInteractor.primaryBouncerShowing.value + val isKeyguardGoingAway = keyguardInteractor.isKeyguardGoingAway.value if (!deviceEntryInteractor.isLockscreenEnabled()) { if (!SceneContainerFlag.isEnabled) { startTransitionTo(KeyguardState.GONE) } - } else if (canDismissLockscreen()) { + } else if (canDismissLockscreen() || isKeyguardGoingAway) { if (!SceneContainerFlag.isEnabled) { startTransitionTo(KeyguardState.GONE) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 6ecbc6175e40..6f943c9aaab7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -244,7 +244,7 @@ constructor( /** Whether the keyguard is going away. */ @Deprecated("Use KeyguardTransitionInteractor + KeyguardState.GONE") - val isKeyguardGoingAway: Flow = repository.isKeyguardGoingAway + val isKeyguardGoingAway: StateFlow = repository.isKeyguardGoingAway.asStateFlow() /** Keyguard can be clipped at the top as the shade is dragged */ val topClippingBounds: Flow by lazy { @@ -549,6 +549,10 @@ constructor( repository.setShortcutAbsoluteTop(top) } + fun setIsKeyguardGoingAway(isGoingAway: Boolean) { + repository.isKeyguardGoingAway.value = isGoingAway + } + companion object { private const val TAG = "KeyguardInteractor" } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java index c256e6430af9..00116aa71246 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardStateControllerImpl.java @@ -40,6 +40,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; +import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.res.R; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; @@ -71,6 +72,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController { new UpdateMonitorCallback(); private final Lazy mUnlockAnimationControllerLazy; private final KeyguardUpdateMonitorLogger mLogger; + private final Lazy mKeyguardInteractorLazy; private boolean mCanDismissLockScreen; private boolean mShowing; @@ -123,6 +125,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController { Lazy keyguardUnlockAnimationController, KeyguardUpdateMonitorLogger logger, DumpManager dumpManager, + Lazy keyguardInteractor, FeatureFlags featureFlags, SelectedUserInteractor userInteractor) { mContext = context; @@ -133,6 +136,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController { mKeyguardUpdateMonitor.registerCallback(mKeyguardUpdateMonitorCallback); mUnlockAnimationControllerLazy = keyguardUnlockAnimationController; mFeatureFlags = featureFlags; + mKeyguardInteractorLazy = keyguardInteractor; dumpManager.registerDumpable(getClass().getSimpleName(), this); @@ -354,6 +358,7 @@ public class KeyguardStateControllerImpl implements KeyguardStateController { Trace.traceCounter(Trace.TRACE_TAG_APP, "keyguardGoingAway", keyguardGoingAway ? 1 : 0); mKeyguardGoingAway = keyguardGoingAway; + mKeyguardInteractorLazy.get().setIsKeyguardGoingAway(keyguardGoingAway); invokeForEachCallback(Callback::onKeyguardGoingAwayChanged); } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index e513e8d2a350..63ce16fd951e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -102,8 +102,7 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { private val _isUdfpsSupported = MutableStateFlow(false) - private val _isKeyguardGoingAway = MutableStateFlow(false) - override val isKeyguardGoingAway: Flow = _isKeyguardGoingAway + override val isKeyguardGoingAway = MutableStateFlow(false) private val _biometricUnlockState = MutableStateFlow(BiometricUnlockModel(BiometricUnlockMode.NONE, null)) @@ -169,7 +168,7 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { } fun setKeyguardGoingAway(isGoingAway: Boolean) { - _isKeyguardGoingAway.value = isGoingAway + isKeyguardGoingAway.value = isGoingAway } fun setKeyguardOccluded(isOccluded: Boolean) { -- GitLab From be525fb5caadf8fb8fdc96c251c93397a8abc44a Mon Sep 17 00:00:00 2001 From: Tom Chan Date: Thu, 17 Oct 2024 22:09:13 +0000 Subject: [PATCH 070/459] Fix deadlock between attachSystemDataTransport and addOnTransportsChangedListener. Thread 1: CompanionTransportManager#attachSystemDataTransport -> (hold mTransports lock) -> notifyOnTransportsChanged -> (wait on mTransportsListeners) Thread 2: CompanionTransportManager#addListener(IOnTransportsChangedListener listener) -> (hold mTransportsListeners lock) -> getAssociationsWithTransport -> (wait on mTransports) This change is to use the same lock for both mTransports and mTransportsListeners. Test: Can no longer reproduce the deadlock in a test I am writing for wearable sensing. Bug: 374165899 Flag: EXEMPT bug fix Change-Id: Ife7fec38d163d81c9039e84406b2d12dcef518c8 --- .../transport/CompanionTransportManager.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java index 74908a4613be..36083607bfcd 100644 --- a/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java +++ b/services/companion/java/com/android/server/companion/transport/CompanionTransportManager.java @@ -57,8 +57,11 @@ public class CompanionTransportManager { /** Association id -> Transport */ @GuardedBy("mTransports") private final SparseArray mTransports = new SparseArray<>(); + + // Use mTransports to synchronize both mTransports and mTransportsListeners to avoid deadlock + // between threads that access both @NonNull - @GuardedBy("mTransportsListeners") + @GuardedBy("mTransports") private final RemoteCallbackList mTransportsListeners = new RemoteCallbackList<>(); @@ -95,7 +98,7 @@ public class CompanionTransportManager { */ public void addListener(IOnTransportsChangedListener listener) { Slog.i(TAG, "Registering OnTransportsChangedListener"); - synchronized (mTransportsListeners) { + synchronized (mTransports) { mTransportsListeners.register(listener); mTransportsListeners.broadcast(listener1 -> { // callback to the current listener with all the associations of the transports @@ -114,7 +117,7 @@ public class CompanionTransportManager { * Remove the listener for receiving callbacks when any of the transports is changed */ public void removeListener(IOnTransportsChangedListener listener) { - synchronized (mTransportsListeners) { + synchronized (mTransports) { mTransportsListeners.unregister(listener); } } @@ -204,7 +207,7 @@ public class CompanionTransportManager { } private void notifyOnTransportsChanged() { - synchronized (mTransportsListeners) { + synchronized (mTransports) { mTransportsListeners.broadcast(listener -> { try { listener.onTransportsChanged(getAssociationsWithTransport()); -- GitLab From 7fd21a2d419ed53d62f98a5978cd83350e35332c Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Fri, 18 Oct 2024 14:56:40 -0400 Subject: [PATCH 071/459] Ensure item being dragged shows on top of other items The item being dragged should draw on top of other items in the grid. Bug: 368056271 Test: manually by reordering items in the grid using the drag gesture Flag: EXEMPT bugfix Change-Id: Ia39444d84a01f014d46b64fb675011f80af27f30 --- .../systemui/communal/ui/compose/CommunalHub.kt | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt index 4ab526188ffe..ab8e8e696b26 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/CommunalHub.kt @@ -157,6 +157,7 @@ import androidx.compose.ui.unit.times import androidx.compose.ui.util.fastAll import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.viewinterop.NoOpUpdate +import androidx.compose.ui.zIndex import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.window.layout.WindowMetricsCalculator import com.android.compose.animation.Easings.Emphasized @@ -749,6 +750,7 @@ private fun BoxScope.CommunalHubLazyGrid( val dpSize = DpSize(size.width.dp, size.height.dp) if (viewModel.isEditMode && dragDropState != null) { + val isItemDragging = dragDropState.draggingItemKey == item.key val outlineAlpha by animateFloatAsState( targetValue = if (selected) 1f else 0f, @@ -764,13 +766,13 @@ private fun BoxScope.CommunalHubLazyGrid( enabled = selected, alpha = { outlineAlpha }, modifier = - Modifier.requiredSize(dpSize).thenIf( - dragDropState.draggingItemKey != item.key - ) { - Modifier.animateItem( - placementSpec = spring(stiffness = Spring.StiffnessMediumLow) - ) - }, + Modifier.requiredSize(dpSize) + .thenIf(!isItemDragging) { + Modifier.animateItem( + placementSpec = spring(stiffness = Spring.StiffnessMediumLow) + ) + } + .thenIf(isItemDragging) { Modifier.zIndex(1f) }, onResize = { resizeInfo -> contentListState.resize(index, resizeInfo) }, ) { modifier -> DraggableItem( -- GitLab From ee8579e21b9a90a578a5504971b642d65b593fb8 Mon Sep 17 00:00:00 2001 From: arunvoddu Date: Fri, 18 Oct 2024 10:44:08 +0000 Subject: [PATCH 072/459] [Satellite] Reading the datagram value from carrierConfig. adb shell cmd phone set-satellite-access-restriction-checking-result true Flag: EXEMPT bugfix Bug: 373476685 Test: Built successfully. Change-Id: Ibbbe5d247ec574ecafadac9a92f3eacaafb2f68a --- .../java/android/telephony/CarrierConfigManager.java | 10 ++++++++++ .../telephony/satellite/SatelliteCapabilities.java | 9 +++++++++ 2 files changed, 19 insertions(+) diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java index 02999c81250a..6535b9b8e429 100644 --- a/telephony/java/android/telephony/CarrierConfigManager.java +++ b/telephony/java/android/telephony/CarrierConfigManager.java @@ -9856,6 +9856,16 @@ public class CarrierConfigManager { public static final String KEY_REMOVE_SATELLITE_PLMN_IN_MANUAL_NETWORK_SCAN_BOOL = "remove_satellite_plmn_in_manual_network_scan_bool"; + /** + * This value is used to set the max datagram size, if the value is not available then the + * default one will be used. + * If key is {@code true}, retrieve the max datagram value and use this value always, + * {@code false} the default value from the modem will be used. + * + * @hide + */ + public static final String KEY_SATELLITE_SOS_MAX_DATAGRAM_SIZE = + "satellite_sos_max_datagram_size"; /** @hide */ @IntDef({ diff --git a/telephony/java/android/telephony/satellite/SatelliteCapabilities.java b/telephony/java/android/telephony/satellite/SatelliteCapabilities.java index 0d8f10178971..f34522aedeac 100644 --- a/telephony/java/android/telephony/satellite/SatelliteCapabilities.java +++ b/telephony/java/android/telephony/satellite/SatelliteCapabilities.java @@ -199,6 +199,15 @@ public final class SatelliteCapabilities implements Parcelable { return mMaxBytesPerOutgoingDatagram; } + /** + * Setting the maximum number of bytes per datagram that can be sent over satellite. + * + * @hide + */ + public void setMaxBytesPerOutgoingDatagram(int maxBytesPerOutgoingDatagram) { + mMaxBytesPerOutgoingDatagram = maxBytesPerOutgoingDatagram; + } + /** * Antenna Position received from satellite modem which gives information about antenna * direction to be used with satellite communication and suggested device hold positions. -- GitLab From 7aa6dba0a725e3dccc1964c00dd2622a38104308 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Fri, 18 Oct 2024 11:11:51 -0700 Subject: [PATCH 073/459] Refactor PropertyInvalidatedCache Refactor PropertyInvalidatedCache in preparation for putting nonces in shared memory. The refactoring is as follows: 1. A NonceHandler is created for every property key. Handles are saved in a global map, indexed by the property name. Statistics associated with the key are moved into the NonceHandler. 2. The invalidate, cork, and disable operations are now methods on the NonceHandler. 3. Testing is accomplished by using a NonceHandler that does not write to system properties. Two test APIs are obsolete but because they are in the API list, they will be updated in a later CL. Unit tests have been updated; CTS tests will be updated later, although they pass. This CL adds a new unit test that verifies the operation of the test support routines, which are used by clients such as bluetooth and telephony. Flag: EXEMPT refactor Bug: 360897450 Test: atest * FrameworksCoreTests:PropertyInvalidatedCacheTests * FrameworksCoreTests:IpcDataCacheTest * CtsOsTestCases:IpcDataCacheTest * ServiceBluetoothTests Change-Id: I86c084e9aff0f7d26f30d77b79f723e80650213c --- .../android/app/PropertyInvalidatedCache.java | 810 +++++++++++------- .../app/PropertyInvalidatedCacheTests.java | 70 +- .../src/android/os/IpcDataCacheTest.java | 73 +- 3 files changed, 597 insertions(+), 356 deletions(-) diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java index c17da249f322..e4d3baa2f05a 100644 --- a/core/java/android/app/PropertyInvalidatedCache.java +++ b/core/java/android/app/PropertyInvalidatedCache.java @@ -16,6 +16,8 @@ package android.app; +import static android.text.TextUtils.formatSimple; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; @@ -30,11 +32,10 @@ import android.text.TextUtils; import android.util.Log; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; import com.android.internal.util.FastPrintWriter; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; @@ -42,12 +43,14 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.Set; import java.util.WeakHashMap; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; /** @@ -224,12 +227,24 @@ public class PropertyInvalidatedCache { } /** - * Reserved nonce values. Use isReservedNonce() to test for a reserved value. Note - * that all values cause the cache to be skipped. + * Reserved nonce values. Use isReservedNonce() to test for a reserved value. Note that all + * reserved values cause the cache to be skipped. */ + // This is the initial value of all cache keys. It is changed when a cache is invalidated. private static final int NONCE_UNSET = 0; + // This value is used in two ways. First, it is used internally to indicate that the cache is + // disabled for the current query. Secondly, it is used to globally disable the cache across + // the entire system. Once a cache is disabled, there is no way to enable it again. The + // global behavior is unused and will likely be removed in the future. private static final int NONCE_DISABLED = 1; + // The cache is corked, which means that clients must act as though the cache is always + // invalid. This is used when the server is processing updates that continuously invalidate + // caches. Rather than issuing individual invalidations (which has a performance penalty), + // the server corks the caches at the start of the process and uncorks at the end of the + // process. private static final int NONCE_CORKED = 2; + // The cache is bypassed for the current query. Unlike UNSET and CORKED, this value is never + // written to global store. private static final int NONCE_BYPASS = 3; private static boolean isReservedNonce(long n) { @@ -237,15 +252,27 @@ public class PropertyInvalidatedCache { } /** - * The names of the nonces + * The names of the reserved nonces. */ private static final String[] sNonceName = new String[]{ "unset", "disabled", "corked", "bypass" }; + // The standard tag for logging. private static final String TAG = "PropertyInvalidatedCache"; + + // Set this true to enable very chatty logging. Never commit this true. private static final boolean DEBUG = false; + + // Set this true to enable cache verification. On every cache hit, the cache will compare the + // cached value to a value pulled directly from the source. This completely negates any + // performance advantage of the cache. Enable it only to test if a particular cache is not + // being properly invalidated. private static final boolean VERIFY = false; + // The test mode. This is only used to ensure that the test functions setTestMode() and + // testPropertyName() are used correctly. + private static boolean sTestMode = false; + /** * The object-private lock. */ @@ -276,23 +303,6 @@ public class PropertyInvalidatedCache { */ private static final Object sCorkLock = new Object(); - /** - * Record the number of invalidate or cork calls that were nops because the cache was already - * corked. This is static because invalidation is done in a static context. Entries are - * indexed by the cache property. - */ - @GuardedBy("sCorkLock") - private static final HashMap sCorkedInvalidates = new HashMap<>(); - - /** - * A map of cache keys that we've "corked". (The values are counts.) When a cache key is - * corked, we skip the cache invalidate when the cache key is in the unset state --- that - * is, when a cache key is corked, an invalidation does not enable the cache if somebody - * else hasn't disabled it. - */ - @GuardedBy("sCorkLock") - private static final HashMap sCorks = new HashMap<>(); - /** * A lock for the global list of caches and cache keys. This must never be taken inside mLock * or sCorkLock. @@ -300,9 +310,11 @@ public class PropertyInvalidatedCache { private static final Object sGlobalLock = new Object(); /** - * A map of cache keys that have been disabled in the local process. When a key is - * disabled locally, existing caches are disabled and the key is saved in this map. - * Future cache instances that use the same key will be disabled in their constructor. + * A map of cache keys that have been disabled in the local process. When a key is disabled + * locally, existing caches are disabled and the key is saved in this map. Future cache + * instances that use the same key will be disabled in their constructor. Note that "disabled" + * means the cache is not used in this process. Invalidation still proceeds normally, because + * the cache may be used in other processes. */ @GuardedBy("sGlobalLock") private static final HashSet sDisabledKeys = new HashSet<>(); @@ -314,14 +326,6 @@ public class PropertyInvalidatedCache { @GuardedBy("sGlobalLock") private static final WeakHashMap sCaches = new WeakHashMap<>(); - /** - * Counts of the number of times a cache key was invalidated. Invalidation occurs in a static - * context with no cache object available, so this is a static map. Entries are indexed by - * the cache property. - */ - @GuardedBy("sGlobalLock") - private static final HashMap sInvalidates = new HashMap<>(); - /** * If sEnabled is false then all cache operations are stubbed out. Set * it to false inside test processes. @@ -333,12 +337,6 @@ public class PropertyInvalidatedCache { */ private final String mPropertyName; - /** - * Handle to the {@code mPropertyName} property, transitioning to non-{@code null} once the - * property exists on the system. - */ - private volatile SystemProperties.Handle mPropertyHandle; - /** * The name by which this cache is known. This should normally be the * binder call that is being cached, but the constructors default it to @@ -369,7 +367,13 @@ public class PropertyInvalidatedCache { private final LinkedHashMap mCache; /** - * The last value of the {@code mPropertyHandle} that we observed. + * The nonce handler for this cache. + */ + @GuardedBy("mLock") + private final NonceHandler mNonce; + + /** + * The last nonce value that was observed. */ @GuardedBy("mLock") private long mLastSeenNonce = NONCE_UNSET; @@ -384,6 +388,358 @@ public class PropertyInvalidatedCache { */ private final int mMaxEntries; + /** + * A class to manage cache keys. There is a single instance of this class for each unique key + * that is shared by all cache instances that use that key. This class is abstract; subclasses + * use different storage mechanisms for the nonces. + */ + private static abstract class NonceHandler { + // The name of the nonce. + final String mName; + + // A lock to synchronize corking and invalidation. + protected final Object mLock = new Object(); + + // Count the number of times the property name was invalidated. + @GuardedBy("mLock") + private int mInvalidated = 0; + + // Count the number of times invalidate or cork calls were nops because the cache was + // already corked. + @GuardedBy("mLock") + private int mCorkedInvalidates = 0; + + // Count the number of corks against this property name. This is not a statistic. It + // increases when the property is corked and decreases when the property is uncorked. + // Invalidation requests are ignored when the cork count is greater than zero. + @GuardedBy("mLock") + private int mCorks = 0; + + // True if this handler is in test mode. If it is in test mode, then nonces are stored + // and retrieved from mTestNonce. + @GuardedBy("mLock") + private boolean mTestMode = false; + + /** + * The local value of the handler, used during testing but also used directly by the + * NonceLocal handler. + */ + @GuardedBy("mLock") + protected long mTestNonce = NONCE_UNSET; + + /** + * The methods to get and set a nonce from whatever storage is being used. mLock may be + * held when these methods are called. Implementations that take locks must behave as + * though mLock could be held. + */ + abstract long getNonceInternal(); + abstract void setNonceInternal(long value); + + NonceHandler(@NonNull String name) { + mName = name; + } + + /** + * Get a nonce from storage. If the handler is in test mode, the nonce is returned from + * the local mTestNonce. + */ + long getNonce() { + synchronized (mLock) { + if (mTestMode) return mTestNonce; + } + return getNonceInternal(); + } + + /** + * Write a nonce to storage. If the handler is in test mode, the nonce is written to the + * local mTestNonce and storage is not affected. + */ + void setNonce(long val) { + synchronized (mLock) { + if (mTestMode) { + mTestNonce = val; + return; + } + } + setNonceInternal(val); + } + + /** + * Write the invalidation nonce for the property. + */ + void invalidate() { + if (!sEnabled) { + if (DEBUG) { + Log.d(TAG, formatSimple("cache invalidate %s suppressed", mName)); + } + return; + } + + synchronized (mLock) { + if (mCorks > 0) { + if (DEBUG) { + Log.d(TAG, "ignoring invalidation due to cork: " + mName); + } + mCorkedInvalidates++; + return; + } + + final long nonce = getNonce(); + if (nonce == NONCE_DISABLED) { + if (DEBUG) { + Log.d(TAG, "refusing to invalidate disabled cache: " + mName); + } + return; + } + + long newValue; + do { + newValue = NoPreloadHolder.next(); + } while (isReservedNonce(newValue)); + if (DEBUG) { + Log.d(TAG, formatSimple( + "invalidating cache [%s]: [%s] -> [%s]", + mName, nonce, Long.toString(newValue))); + } + // There is a small race with concurrent disables here. A compare-and-exchange + // property operation would be required to eliminate the race condition. + setNonce(newValue); + mInvalidated++; + } + } + + void cork() { + if (!sEnabled) { + if (DEBUG) { + Log.d(TAG, formatSimple("cache corking %s suppressed", mName)); + } + return; + } + + synchronized (mLock) { + int numberCorks = mCorks; + if (DEBUG) { + Log.d(TAG, formatSimple( + "corking %s: numberCorks=%s", mName, numberCorks)); + } + + // If we're the first ones to cork this cache, set the cache to the corked state so + // existing caches talk directly to their services while we've corked updates. + // Make sure we don't clobber a disabled cache value. + + // TODO: we can skip this property write and leave the cache enabled if the + // caller promises not to make observable changes to the cache backing state before + // uncorking the cache, e.g., by holding a read lock across the cork-uncork pair. + // Implement this more dangerous mode of operation if necessary. + if (numberCorks == 0) { + final long nonce = getNonce(); + if (nonce != NONCE_UNSET && nonce != NONCE_DISABLED) { + setNonce(NONCE_CORKED); + } + } else { + mCorkedInvalidates++; + } + mCorks++; + if (DEBUG) { + Log.d(TAG, "corked: " + mName); + } + } + } + + void uncork() { + if (!sEnabled) { + if (DEBUG) { + Log.d(TAG, formatSimple("cache uncorking %s suppressed", mName)); + } + return; + } + + synchronized (mLock) { + int numberCorks = --mCorks; + if (DEBUG) { + Log.d(TAG, formatSimple( + "uncorking %s: numberCorks=%s", mName, numberCorks)); + } + + if (numberCorks < 0) { + throw new AssertionError("cork underflow: " + mName); + } + if (numberCorks == 0) { + // The property is fully uncorked and can be invalidated normally. + invalidate(); + if (DEBUG) { + Log.d(TAG, "uncorked: " + mName); + } + } + } + } + + /** + * Globally (that is, system-wide) disable all caches that use this key. There is no way + * to re-enable these caches. + */ + void disable() { + if (!sEnabled) { + return; + } + synchronized (mLock) { + setNonce(NONCE_DISABLED); + } + } + + /** + * Put this handler in or out of test mode. Regardless of the current and next mode, the + * test nonce variable is reset to UNSET. + */ + void setTestMode(boolean mode) { + synchronized (mLock) { + mTestMode = mode; + mTestNonce = NONCE_UNSET; + } + } + + /** + * Return the statistics associated with the key. These statistics are not associated + * with any individual cache. + */ + record Stats(int invalidated, int corkedInvalidates) {} + Stats getStats() { + synchronized (mLock) { + return new Stats(mInvalidated, mCorkedInvalidates); + } + } + } + + /** + * Manage nonces that are stored in a system property. + */ + private static final class NonceSysprop extends NonceHandler { + // A handle to the property, for fast lookups. + private volatile SystemProperties.Handle mHandle; + + NonceSysprop(@NonNull String name) { + super(name); + } + + /** + * Retrieve the nonce from the system property. If the handle is null, this method + * attempts to create a handle. If handle creation fails, the method returns UNSET. If + * the handle is not null, the method returns a value read via the handle. This read + * occurs outside any lock. + */ + @Override + long getNonceInternal() { + if (mHandle == null) { + synchronized (mLock) { + if (mHandle == null) { + mHandle = SystemProperties.find(mName); + if (mHandle == null) { + return NONCE_UNSET; + } + } + } + } + return mHandle.getLong(NONCE_UNSET); + } + + /** + * Write a nonce to a system property. + */ + @Override + void setNonceInternal(long value) { + // Failing to set the nonce is a fatal error. Failures setting a system property have + // been reported; given that the failure is probably transient, this function includes + // a retry. + final String str = Long.toString(value); + RuntimeException failure = null; + for (int attempt = 0; attempt < PROPERTY_FAILURE_RETRY_LIMIT; attempt++) { + try { + SystemProperties.set(mName, str); + if (attempt > 0) { + // This log is not guarded. Based on known bug reports, it should + // occur once a week or less. The purpose of the log message is to + // identify the retries as a source of delay that might be otherwise + // be attributed to the cache itself. + Log.w(TAG, "Nonce set after " + attempt + " tries"); + } + return; + } catch (RuntimeException e) { + if (failure == null) { + failure = e; + } + try { + Thread.sleep(PROPERTY_FAILURE_RETRY_DELAY_MILLIS); + } catch (InterruptedException x) { + // Ignore this exception. The desired delay is only approximate and + // there is no issue if the sleep sometimes terminates early. + } + } + } + // This point is reached only if SystemProperties.set() fails at least once. + // Rethrow the first exception that was received. + throw failure; + } + } + + /** + * SystemProperties and shared storage are protected and cannot be written by random + * processes. So, for testing purposes, the NonceLocal handler stores the nonce locally. The + * NonceLocal uses the mTestNonce in the superclass, regardless of test mode. + */ + private static class NonceLocal extends NonceHandler { + // The saved nonce. + private long mValue; + + NonceLocal(@NonNull String name) { + super(name); + } + + @Override + long getNonceInternal() { + return mTestNonce; + } + + @Override + void setNonceInternal(long value) { + mTestNonce = value; + } + } + + /** + * Complete key prefixes. + */ + private static final String PREFIX_TEST = CACHE_KEY_PREFIX + "." + MODULE_TEST + "."; + + /** + * A static list of nonce handlers, indexed by name. NonceHandlers can be safely shared by + * multiple threads, and can therefore be shared by multiple instances of the same cache, and + * with static calls (see {@link #invalidateCache}. Addition and removal are guarded by the + * global lock, to ensure that duplicates are not created. + */ + private static final ConcurrentHashMap sHandlers + = new ConcurrentHashMap<>(); + + /** + * Return the proper nonce handler, based on the property name. + */ + private static NonceHandler getNonceHandler(@NonNull String name) { + NonceHandler h = sHandlers.get(name); + if (h == null) { + synchronized (sGlobalLock) { + h = sHandlers.get(name); + if (h == null) { + if (name.startsWith(PREFIX_TEST)) { + h = new NonceLocal(name); + } else { + h = new NonceSysprop(name); + } + sHandlers.put(name, h); + } + } + } + return h; + } + /** * Make a new property invalidated cache. This constructor names the cache after the * property name. New clients should prefer the constructor that takes an explicit @@ -417,6 +773,7 @@ public class PropertyInvalidatedCache { mPropertyName = propertyName; validateCacheKey(mPropertyName); mCacheName = cacheName; + mNonce = getNonceHandler(mPropertyName); mMaxEntries = maxEntries; mComputer = new DefaultComputer<>(this); mCache = createMap(); @@ -441,6 +798,7 @@ public class PropertyInvalidatedCache { mPropertyName = createPropertyName(module, api); validateCacheKey(mPropertyName); mCacheName = cacheName; + mNonce = getNonceHandler(mPropertyName); mMaxEntries = maxEntries; mComputer = computer; mCache = createMap(); @@ -484,130 +842,69 @@ public class PropertyInvalidatedCache { } /** - * SystemProperties are protected and cannot be written (or read, usually) by random - * processes. So, for testing purposes, the methods have a bypass mode that reads and - * writes to a HashMap and does not go out to the SystemProperties at all. - */ - - // If true, the cache might be under test. If false, there is no testing in progress. - private static volatile boolean sTesting = false; - - // If sTesting is true then keys that are under test are in this map. - private static final HashMap sTestingPropertyMap = new HashMap<>(); - - /** - * Enable or disable testing. The testing property map is cleared every time this - * method is called. + * Enable or disable testing. The protocol requires that the mode toggle: for instance, it is + * illegal to clear the test mode if the test mode is already off. The purpose is solely to + * ensure that test clients do not forget to use the test mode properly, even though the + * current logic does not care. * @hide */ @TestApi public static void setTestMode(boolean mode) { - sTesting = mode; - synchronized (sTestingPropertyMap) { - sTestingPropertyMap.clear(); + synchronized (sGlobalLock) { + if (sTestMode == mode) { + throw new IllegalStateException("cannot set test mode redundantly: mode=" + mode); + } + sTestMode = mode; + if (mode) { + // No action when testing begins. + } else { + resetAfterTestLocked(); + } } } /** - * Enable testing the specific cache key. Only keys in the map are subject to testing. - * There is no method to stop testing a property name. Just disable the test mode. + * Clean up when testing ends. All handlers are reset out of test mode. NonceLocal handlers + * (MODULE_TEST) are reset to the NONCE_UNSET state. This has no effect on any other handlers + * that were not originally in test mode. */ - private static void testPropertyName(@NonNull String name) { - synchronized (sTestingPropertyMap) { - sTestingPropertyMap.put(name, (long) NONCE_UNSET); + @GuardedBy("sGlobalLock") + private static void resetAfterTestLocked() { + for (Iterator e = sHandlers.keys().asIterator(); e.hasNext(); ) { + String s = e.next(); + final NonceHandler h = sHandlers.get(s); + h.setTestMode(false); } } /** - * Enable testing the specific cache key. Only keys in the map are subject to testing. - * There is no method to stop testing a property name. Just disable the test mode. + * Enable testing the specific cache key. This API allows a test process to invalidate caches + * for which it would not otherwise have permission. Caches in test mode do NOT write their + * values to the system properties. The effect is local to the current process. Test mode + * must be true when this method is called. * @hide */ @TestApi public void testPropertyName() { - testPropertyName(mPropertyName); - } - - // Read the system property associated with the current cache. This method uses the - // handle for faster reading. - private long getCurrentNonce() { - if (sTesting) { - synchronized (sTestingPropertyMap) { - Long n = sTestingPropertyMap.get(mPropertyName); - if (n != null) { - return n; - } - } - } - - SystemProperties.Handle handle = mPropertyHandle; - if (handle == null) { - handle = SystemProperties.find(mPropertyName); - if (handle == null) { - return NONCE_UNSET; - } - mPropertyHandle = handle; - } - return handle.getLong(NONCE_UNSET); - } - - // Write the nonce in a static context. No handle is available. - private static void setNonce(String name, long val) { - if (sTesting) { - synchronized (sTestingPropertyMap) { - Long n = sTestingPropertyMap.get(name); - if (n != null) { - sTestingPropertyMap.put(name, val); - return; - } - } - } - RuntimeException failure = null; - for (int attempt = 0; attempt < PROPERTY_FAILURE_RETRY_LIMIT; attempt++) { - try { - SystemProperties.set(name, Long.toString(val)); - if (attempt > 0) { - // This log is not guarded. Based on known bug reports, it should - // occur once a week or less. The purpose of the log message is to - // identify the retries as a source of delay that might be otherwise - // be attributed to the cache itself. - Log.w(TAG, "Nonce set after " + attempt + " tries"); - } - return; - } catch (RuntimeException e) { - if (failure == null) { - failure = e; - } - try { - Thread.sleep(PROPERTY_FAILURE_RETRY_DELAY_MILLIS); - } catch (InterruptedException x) { - // Ignore this exception. The desired delay is only approximate and - // there is no issue if the sleep sometimes terminates early. - } + synchronized (sGlobalLock) { + if (sTestMode == false) { + throw new IllegalStateException("cannot test property name with test mode off"); } + mNonce.setTestMode(true); } - // This point is reached only if SystemProperties.set() fails at least once. - // Rethrow the first exception that was received. - throw failure; } - // Set the nonce in a static context. No handle is available. - private static long getNonce(String name) { - if (sTesting) { - synchronized (sTestingPropertyMap) { - Long n = sTestingPropertyMap.get(name); - if (n != null) { - return n; - } - } - } - return SystemProperties.getLong(name, NONCE_UNSET); + // Read the nonce associated with the current cache. + @GuardedBy("mLock") + private long getCurrentNonce() { + return mNonce.getNonce(); } /** - * Forget all cached values. - * TODO(216112648) remove this as a public API. Clients should invalidate caches, not clear - * them. + * Forget all cached values. This is used by a client when the server exits. Since the + * server has exited, the cache values are no longer valid, but the server is no longer + * present to invalidate the cache. Note that this is not necessary if the server is + * system_server, because the entire operating system reboots if that process exits. * @hide */ public final void clear() { @@ -674,7 +971,7 @@ public class PropertyInvalidatedCache { } /** - * Disable the use of this cache in this process. This method is using internally and during + * Disable the use of this cache in this process. This method is used internally and during * testing. To disable a cache in normal code, use disableLocal(). A disabled cache cannot * be re-enabled. * @hide @@ -783,7 +1080,7 @@ public class PropertyInvalidatedCache { if (DEBUG) { if (!mDisabled) { - Log.d(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "cache %s %s for %s", cacheName(), sNonceName[(int) currentNonce], queryToString(query))); } @@ -798,7 +1095,7 @@ public class PropertyInvalidatedCache { if (cachedResult != null) mHits++; } else { if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "clearing cache %s of %d entries because nonce changed [%s] -> [%s]", cacheName(), mCache.size(), mLastSeenNonce, currentNonce)); @@ -824,7 +1121,7 @@ public class PropertyInvalidatedCache { if (currentNonce != afterRefreshNonce) { currentNonce = afterRefreshNonce; if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "restarting %s %s because nonce changed in refresh", cacheName(), queryToString(query))); @@ -895,20 +1192,18 @@ public class PropertyInvalidatedCache { * @param name Name of the cache-key property to invalidate */ private static void disableSystemWide(@NonNull String name) { - if (!sEnabled) { - return; - } - setNonce(name, NONCE_DISABLED); + getNonceHandler(name).disable(); } /** - * Non-static convenience version of invalidateCache() for situations in which only a single - * PropertyInvalidatedCache is keyed on a particular property value. + * Non-static version of invalidateCache() for situations in which a cache instance is + * available. This is slightly faster than than the static versions because it does not have + * to look up the NonceHandler for a given property name. * @hide */ @TestApi public void invalidateCache() { - invalidateCache(mPropertyName); + mNonce.invalidate(); } /** @@ -931,59 +1226,7 @@ public class PropertyInvalidatedCache { * @hide */ public static void invalidateCache(@NonNull String name) { - if (!sEnabled) { - if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( - "cache invalidate %s suppressed", name)); - } - return; - } - - // Take the cork lock so invalidateCache() racing against corkInvalidations() doesn't - // clobber a cork-written NONCE_UNSET with a cache key we compute before the cork. - // The property service is single-threaded anyway, so we don't lose any concurrency by - // taking the cork lock around cache invalidations. If we see contention on this lock, - // we're invalidating too often. - synchronized (sCorkLock) { - Integer numberCorks = sCorks.get(name); - if (numberCorks != null && numberCorks > 0) { - if (DEBUG) { - Log.d(TAG, "ignoring invalidation due to cork: " + name); - } - final long count = sCorkedInvalidates.getOrDefault(name, (long) 0); - sCorkedInvalidates.put(name, count + 1); - return; - } - invalidateCacheLocked(name); - } - } - - @GuardedBy("sCorkLock") - private static void invalidateCacheLocked(@NonNull String name) { - // There's no race here: we don't require that values strictly increase, but instead - // only that each is unique in a single runtime-restart session. - final long nonce = getNonce(name); - if (nonce == NONCE_DISABLED) { - if (DEBUG) { - Log.d(TAG, "refusing to invalidate disabled cache: " + name); - } - return; - } - - long newValue; - do { - newValue = NoPreloadHolder.next(); - } while (isReservedNonce(newValue)); - if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple( - "invalidating cache [%s]: [%s] -> [%s]", - name, nonce, Long.toString(newValue))); - } - // There is a small race with concurrent disables here. A compare-and-exchange - // property operation would be required to eliminate the race condition. - setNonce(name, newValue); - long invalidateCount = sInvalidates.getOrDefault(name, (long) 0); - sInvalidates.put(name, ++invalidateCount); + getNonceHandler(name).invalidate(); } /** @@ -1000,43 +1243,7 @@ public class PropertyInvalidatedCache { * @hide */ public static void corkInvalidations(@NonNull String name) { - if (!sEnabled) { - if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( - "cache cork %s suppressed", name)); - } - return; - } - - synchronized (sCorkLock) { - int numberCorks = sCorks.getOrDefault(name, 0); - if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple( - "corking %s: numberCorks=%s", name, numberCorks)); - } - - // If we're the first ones to cork this cache, set the cache to the corked state so - // existing caches talk directly to their services while we've corked updates. - // Make sure we don't clobber a disabled cache value. - - // TODO(dancol): we can skip this property write and leave the cache enabled if the - // caller promises not to make observable changes to the cache backing state before - // uncorking the cache, e.g., by holding a read lock across the cork-uncork pair. - // Implement this more dangerous mode of operation if necessary. - if (numberCorks == 0) { - final long nonce = getNonce(name); - if (nonce != NONCE_UNSET && nonce != NONCE_DISABLED) { - setNonce(name, NONCE_CORKED); - } - } else { - final long count = sCorkedInvalidates.getOrDefault(name, (long) 0); - sCorkedInvalidates.put(name, count + 1); - } - sCorks.put(name, numberCorks + 1); - if (DEBUG) { - Log.d(TAG, "corked: " + name); - } - } + getNonceHandler(name).cork(); } /** @@ -1048,34 +1255,7 @@ public class PropertyInvalidatedCache { * @hide */ public static void uncorkInvalidations(@NonNull String name) { - if (!sEnabled) { - if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( - "cache uncork %s suppressed", name)); - } - return; - } - - synchronized (sCorkLock) { - int numberCorks = sCorks.getOrDefault(name, 0); - if (DEBUG) { - Log.d(TAG, TextUtils.formatSimple( - "uncorking %s: numberCorks=%s", name, numberCorks)); - } - - if (numberCorks < 1) { - throw new AssertionError("cork underflow: " + name); - } - if (numberCorks == 1) { - sCorks.remove(name); - invalidateCacheLocked(name); - if (DEBUG) { - Log.d(TAG, "uncorked: " + name); - } - } else { - sCorks.put(name, numberCorks - 1); - } - } + getNonceHandler(name).uncork(); } /** @@ -1104,6 +1284,8 @@ public class PropertyInvalidatedCache { @GuardedBy("mLock") private Handler mHandler; + private NonceHandler mNonce; + public AutoCorker(@NonNull String propertyName) { this(propertyName, DEFAULT_AUTO_CORK_DELAY_MS); } @@ -1117,31 +1299,35 @@ public class PropertyInvalidatedCache { } public void autoCork() { + synchronized (mLock) { + if (mNonce == null) { + mNonce = getNonceHandler(mPropertyName); + } + } + if (getLooper() == null) { // We're not ready to auto-cork yet, so just invalidate the cache immediately. if (DEBUG) { Log.w(TAG, "invalidating instead of autocorking early in init: " + mPropertyName); } - PropertyInvalidatedCache.invalidateCache(mPropertyName); + mNonce.invalidate(); return; } synchronized (mLock) { boolean alreadyQueued = mUncorkDeadlineMs >= 0; if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "autoCork %s mUncorkDeadlineMs=%s", mPropertyName, mUncorkDeadlineMs)); } mUncorkDeadlineMs = SystemClock.uptimeMillis() + mAutoCorkDelayMs; if (!alreadyQueued) { getHandlerLocked().sendEmptyMessageAtTime(0, mUncorkDeadlineMs); - PropertyInvalidatedCache.corkInvalidations(mPropertyName); + mNonce.cork(); } else { - synchronized (sCorkLock) { - final long count = sCorkedInvalidates.getOrDefault(mPropertyName, (long) 0); - sCorkedInvalidates.put(mPropertyName, count + 1); - } + // Count this as a corked invalidation. + mNonce.invalidate(); } } } @@ -1149,7 +1335,7 @@ public class PropertyInvalidatedCache { private void handleMessage(Message msg) { synchronized (mLock) { if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "handleMsesage %s mUncorkDeadlineMs=%s", mPropertyName, mUncorkDeadlineMs)); } @@ -1161,7 +1347,7 @@ public class PropertyInvalidatedCache { if (mUncorkDeadlineMs > nowMs) { mUncorkDeadlineMs = nowMs + mAutoCorkDelayMs; if (DEBUG) { - Log.w(TAG, TextUtils.formatSimple( + Log.d(TAG, formatSimple( "scheduling uncork at %s", mUncorkDeadlineMs)); } @@ -1169,10 +1355,10 @@ public class PropertyInvalidatedCache { return; } if (DEBUG) { - Log.w(TAG, "automatic uncorking " + mPropertyName); + Log.d(TAG, "automatic uncorking " + mPropertyName); } mUncorkDeadlineMs = -1; - PropertyInvalidatedCache.uncorkInvalidations(mPropertyName); + mNonce.uncork(); } } @@ -1207,7 +1393,7 @@ public class PropertyInvalidatedCache { Result resultToCompare = recompute(query); boolean nonceChanged = (getCurrentNonce() != mLastSeenNonce); if (!nonceChanged && !resultEquals(proposedResult, resultToCompare)) { - Log.e(TAG, TextUtils.formatSimple( + Log.e(TAG, formatSimple( "cache %s inconsistent for %s is %s should be %s", cacheName(), queryToString(query), proposedResult, resultToCompare)); @@ -1284,17 +1470,9 @@ public class PropertyInvalidatedCache { /** * Returns a list of caches alive at the current time. */ - @GuardedBy("sGlobalLock") private static @NonNull ArrayList getActiveCaches() { - return new ArrayList(sCaches.keySet()); - } - - /** - * Returns a list of the active corks in a process. - */ - private static @NonNull ArrayList> getActiveCorks() { - synchronized (sCorkLock) { - return new ArrayList>(sCorks.entrySet()); + synchronized (sGlobalLock) { + return new ArrayList(sCaches.keySet()); } } @@ -1361,32 +1539,27 @@ public class PropertyInvalidatedCache { return; } - long invalidateCount; - long corkedInvalidates; - synchronized (sCorkLock) { - invalidateCount = sInvalidates.getOrDefault(mPropertyName, (long) 0); - corkedInvalidates = sCorkedInvalidates.getOrDefault(mPropertyName, (long) 0); - } + NonceHandler.Stats stats = mNonce.getStats(); synchronized (mLock) { - pw.println(TextUtils.formatSimple(" Cache Name: %s", cacheName())); - pw.println(TextUtils.formatSimple(" Property: %s", mPropertyName)); + pw.println(formatSimple(" Cache Name: %s", cacheName())); + pw.println(formatSimple(" Property: %s", mPropertyName)); final long skips = mSkips[NONCE_CORKED] + mSkips[NONCE_UNSET] + mSkips[NONCE_DISABLED] + mSkips[NONCE_BYPASS]; - pw.println(TextUtils.formatSimple( + pw.println(formatSimple( " Hits: %d, Misses: %d, Skips: %d, Clears: %d", mHits, mMisses, skips, mClears)); - pw.println(TextUtils.formatSimple( + pw.println(formatSimple( " Skip-corked: %d, Skip-unset: %d, Skip-bypass: %d, Skip-other: %d", mSkips[NONCE_CORKED], mSkips[NONCE_UNSET], mSkips[NONCE_BYPASS], mSkips[NONCE_DISABLED])); - pw.println(TextUtils.formatSimple( + pw.println(formatSimple( " Nonce: 0x%016x, Invalidates: %d, CorkedInvalidates: %d", - mLastSeenNonce, invalidateCount, corkedInvalidates)); - pw.println(TextUtils.formatSimple( + mLastSeenNonce, stats.invalidated, stats.corkedInvalidates)); + pw.println(formatSimple( " Current Size: %d, Max Size: %d, HW Mark: %d, Overflows: %d", mCache.size(), mMaxEntries, mHighWaterMark, mMissOverflow)); - pw.println(TextUtils.formatSimple(" Enabled: %s", mDisabled ? "false" : "true")); + pw.println(formatSimple(" Enabled: %s", mDisabled ? "false" : "true")); pw.println(""); // No specific cache was requested. This is the default, and no details @@ -1404,23 +1577,7 @@ public class PropertyInvalidatedCache { String key = Objects.toString(entry.getKey()); String value = Objects.toString(entry.getValue()); - pw.println(TextUtils.formatSimple(" Key: %s\n Value: %s\n", key, value)); - } - } - } - - /** - * Dump the corking status. - */ - @GuardedBy("sCorkLock") - private static void dumpCorkInfo(PrintWriter pw) { - ArrayList> activeCorks = getActiveCorks(); - if (activeCorks.size() > 0) { - pw.println(" Corking Status:"); - for (int i = 0; i < activeCorks.size(); i++) { - Map.Entry entry = activeCorks.get(i); - pw.println(TextUtils.formatSimple(" Property Name: %s Count: %d", - entry.getKey(), entry.getValue())); + pw.println(formatSimple(" Key: %s\n Value: %s\n", key, value)); } } } @@ -1441,14 +1598,7 @@ public class PropertyInvalidatedCache { // then only that cache is reported. boolean detail = anyDetailed(args); - ArrayList activeCaches; - synchronized (sGlobalLock) { - activeCaches = getActiveCaches(); - if (!detail) { - dumpCorkInfo(pw); - } - } - + ArrayList activeCaches = getActiveCaches(); for (int i = 0; i < activeCaches.size(); i++) { PropertyInvalidatedCache currentCache = activeCaches.get(i); currentCache.dumpContents(pw, detail, args); diff --git a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java index b5ee1302fc1d..dcea5b299829 100644 --- a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java +++ b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java @@ -19,6 +19,8 @@ package android.app; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; import android.platform.test.annotations.IgnoreUnderRavenwood; import android.platform.test.ravenwood.RavenwoodRule; @@ -26,6 +28,7 @@ import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.filters.SmallTest; import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -84,14 +87,20 @@ public class PropertyInvalidatedCacheTests { public Boolean apply(Integer x) { return mServer.query(x); } + @Override public boolean shouldBypassCache(Integer x) { return x % 13 == 0; } } - // Clear the test mode after every test, in case this process is used for other - // tests. This also resets the test property map. + // Prepare for testing. + @Before + public void setUp() throws Exception { + PropertyInvalidatedCache.setTestMode(true); + } + + // Ensure all test configurations are cleared. @After public void tearDown() throws Exception { PropertyInvalidatedCache.setTestMode(false); @@ -111,9 +120,6 @@ public class PropertyInvalidatedCacheTests { new PropertyInvalidatedCache<>(4, MODULE, API, "cache1", new ServerQuery(tester)); - PropertyInvalidatedCache.setTestMode(true); - testCache.testPropertyName(); - tester.verify(0); assertEquals(tester.value(3), testCache.query(3)); tester.verify(1); @@ -223,22 +229,16 @@ public class PropertyInvalidatedCacheTests { TestCache(String module, String api) { this(module, api, new TestQuery()); - setTestMode(true); - testPropertyName(); } TestCache(String module, String api, TestQuery query) { super(4, module, api, api, query); mQuery = query; - setTestMode(true); - testPropertyName(); } public int getRecomputeCount() { return mQuery.getRecomputeCount(); } - - } @Test @@ -375,4 +375,52 @@ public class PropertyInvalidatedCacheTests { PropertyInvalidatedCache.MODULE_BLUETOOTH, "getState"); assertEquals(n1, "cache_key.bluetooth.get_state"); } + + // Verify that test mode works properly. + @Test + public void testTestMode() { + // Create a cache that will write a system nonce. + TestCache sysCache = new TestCache(PropertyInvalidatedCache.MODULE_SYSTEM, "mode1"); + try { + // Invalidate the cache, which writes the system property. There must be a permission + // failure. + sysCache.invalidateCache(); + fail("expected permission failure"); + } catch (RuntimeException e) { + // The expected exception is a bare RuntimeException. The test does not attempt to + // validate the text of the exception message. + } + + sysCache.testPropertyName(); + // Invalidate the cache. This must succeed because the property has been marked for + // testing. + sysCache.invalidateCache(); + + // Create a cache that uses MODULE_TEST. Invalidation succeeds whether or not the + // property is tagged as being tested. + TestCache testCache = new TestCache(PropertyInvalidatedCache.MODULE_TEST, "mode2"); + testCache.invalidateCache(); + testCache.testPropertyName(); + testCache.invalidateCache(); + + // Clear test mode. This fails if test mode is not enabled. + PropertyInvalidatedCache.setTestMode(false); + try { + PropertyInvalidatedCache.setTestMode(false); + fail("expected an IllegalStateException"); + } catch (IllegalStateException e) { + // The expected exception. + } + // Configuring a property for testing must fail if test mode is false. + TestCache cache2 = new TestCache(PropertyInvalidatedCache.MODULE_SYSTEM, "mode3"); + try { + cache2.testPropertyName(); + fail("expected an IllegalStateException"); + } catch (IllegalStateException e) { + // The expected exception. + } + + // Re-enable test mode (so that the cleanup for the test does not throw). + PropertyInvalidatedCache.setTestMode(true); + } } diff --git a/core/tests/coretests/src/android/os/IpcDataCacheTest.java b/core/tests/coretests/src/android/os/IpcDataCacheTest.java index 64f77b309829..5c56fdcd4a2a 100644 --- a/core/tests/coretests/src/android/os/IpcDataCacheTest.java +++ b/core/tests/coretests/src/android/os/IpcDataCacheTest.java @@ -17,6 +17,7 @@ package android.os; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; import android.multiuser.Flags; import android.platform.test.annotations.IgnoreUnderRavenwood; @@ -26,6 +27,7 @@ import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.filters.SmallTest; import org.junit.After; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -92,14 +94,20 @@ public class IpcDataCacheTest { public Boolean apply(Integer x) { return mServer.query(x); } + @Override public boolean shouldBypassCache(Integer x) { return x % 13 == 0; } } - // Clear the test mode after every test, in case this process is used for other - // tests. This also resets the test property map. + // Prepare for testing. + @Before + public void setUp() throws Exception { + IpcDataCache.setTestMode(true); + } + + // Ensure all test configurations are cleared. @After public void tearDown() throws Exception { IpcDataCache.setTestMode(false); @@ -119,9 +127,6 @@ public class IpcDataCacheTest { new IpcDataCache<>(4, MODULE, API, "testCache1", new ServerQuery(tester)); - IpcDataCache.setTestMode(true); - testCache.testPropertyName(); - tester.verify(0); assertEquals(tester.value(3), testCache.query(3)); tester.verify(1); @@ -165,9 +170,6 @@ public class IpcDataCacheTest { IpcDataCache testCache = new IpcDataCache<>(config, (x) -> tester.query(x, x % 10 == 9)); - IpcDataCache.setTestMode(true); - testCache.testPropertyName(); - tester.verify(0); assertEquals(tester.value(3), testCache.query(3)); tester.verify(1); @@ -205,9 +207,6 @@ public class IpcDataCacheTest { IpcDataCache testCache = new IpcDataCache<>(config, (x) -> tester.query(x), (x) -> x % 9 == 0); - IpcDataCache.setTestMode(true); - testCache.testPropertyName(); - tester.verify(0); assertEquals(tester.value(3), testCache.query(3)); tester.verify(1); @@ -313,8 +312,6 @@ public class IpcDataCacheTest { TestCache(String module, String api, TestQuery query) { super(4, module, api, "testCache7", query); mQuery = query; - setTestMode(true); - testPropertyName(); } TestCache(IpcDataCache.Config c) { @@ -324,8 +321,6 @@ public class IpcDataCacheTest { TestCache(IpcDataCache.Config c, TestQuery query) { super(c, query); mQuery = query; - setTestMode(true); - testPropertyName(); } int getRecomputeCount() { @@ -456,4 +451,52 @@ public class IpcDataCacheTest { TestCache ec = new TestCache(e); assertEquals(ec.isDisabled(), true); } + + // Verify that test mode works properly. + @Test + public void testTestMode() { + // Create a cache that will write a system nonce. + TestCache sysCache = new TestCache(IpcDataCache.MODULE_SYSTEM, "mode1"); + try { + // Invalidate the cache, which writes the system property. There must be a permission + // failure. + sysCache.invalidateCache(); + fail("expected permission failure"); + } catch (RuntimeException e) { + // The expected exception is a bare RuntimeException. The test does not attempt to + // validate the text of the exception message. + } + + sysCache.testPropertyName(); + // Invalidate the cache. This must succeed because the property has been marked for + // testing. + sysCache.invalidateCache(); + + // Create a cache that uses MODULE_TEST. Invalidation succeeds whether or not the + // property is tagged as being tested. + TestCache testCache = new TestCache(IpcDataCache.MODULE_TEST, "mode2"); + testCache.invalidateCache(); + testCache.testPropertyName(); + testCache.invalidateCache(); + + // Clear test mode. This fails if test mode is not enabled. + IpcDataCache.setTestMode(false); + try { + IpcDataCache.setTestMode(false); + fail("expected an IllegalStateException"); + } catch (IllegalStateException e) { + // The expected exception. + } + // Configuring a property for testing must fail if test mode is false. + TestCache cache2 = new TestCache(IpcDataCache.MODULE_SYSTEM, "mode3"); + try { + cache2.testPropertyName(); + fail("expected an IllegalStateException"); + } catch (IllegalStateException e) { + // The expected exception. + } + + // Re-enable test mode (so that the cleanup for the test does not throw). + IpcDataCache.setTestMode(true); + } } -- GitLab From a70a0155dd5b7337dfb56690c03b43ff36f1fdd9 Mon Sep 17 00:00:00 2001 From: Ziyang Cheng Date: Thu, 26 Sep 2024 14:32:44 +0000 Subject: [PATCH 074/459] Deprecate the constructor of RecognitionConfig. Bug: 368042125 Bug: 370580176 Flag: android.media.soundtrigger.manager_api Test: atest SoundTriggerTest. Test: Successfully load the generic sound model and verify sound trigger event could be triggered correctly on Pixel Watch devices. Change-Id: I05499a7c99864c18414cbcf4827ab8bd7ad9bdaf --- core/api/test-current.txt | 3 +- .../hardware/soundtrigger/ConversionUtil.java | 20 ++++++----- .../hardware/soundtrigger/SoundTrigger.java | 33 +++++++++---------- .../voice/AlwaysOnHotwordDetector.java | 23 +++++++++---- .../soundtrigger/SoundTriggerDetector.java | 13 +++++--- .../soundtrigger/ConversionUtilTest.java | 21 ++++++++---- 6 files changed, 67 insertions(+), 46 deletions(-) diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 5e4485c33233..99ab10faf933 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -1889,8 +1889,7 @@ package android.hardware.soundtrigger { } @FlaggedApi("android.media.soundtrigger.manager_api") public static final class SoundTrigger.RecognitionConfig implements android.os.Parcelable { - ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[], int); - ctor public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]); + ctor @Deprecated public SoundTrigger.RecognitionConfig(boolean, boolean, @Nullable android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionExtra[], @Nullable byte[]); } public static class SoundTrigger.RecognitionEvent { diff --git a/core/java/android/hardware/soundtrigger/ConversionUtil.java b/core/java/android/hardware/soundtrigger/ConversionUtil.java index 22ae67672950..2ba107805569 100644 --- a/core/java/android/hardware/soundtrigger/ConversionUtil.java +++ b/core/java/android/hardware/soundtrigger/ConversionUtil.java @@ -40,6 +40,7 @@ import android.os.SharedMemory; import android.system.ErrnoException; import java.nio.ByteBuffer; +import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; import java.util.UUID; @@ -170,17 +171,18 @@ public class ConversionUtil { public static SoundTrigger.RecognitionConfig aidl2apiRecognitionConfig( RecognitionConfig aidlConfig) { - var keyphrases = - new SoundTrigger.KeyphraseRecognitionExtra[aidlConfig.phraseRecognitionExtras.length]; - int i = 0; + var keyphrases = new ArrayList( + aidlConfig.phraseRecognitionExtras.length); for (var extras : aidlConfig.phraseRecognitionExtras) { - keyphrases[i++] = aidl2apiPhraseRecognitionExtra(extras); + keyphrases.add(aidl2apiPhraseRecognitionExtra(extras)); } - return new SoundTrigger.RecognitionConfig(aidlConfig.captureRequested, - false /** allowMultipleTriggers **/, - keyphrases, - Arrays.copyOf(aidlConfig.data, aidlConfig.data.length), - aidl2apiAudioCapabilities(aidlConfig.audioCapabilities)); + return new SoundTrigger.RecognitionConfig.Builder() + .setCaptureRequested(aidlConfig.captureRequested) + .setAllowMultipleTriggers(false) + .setKeyphrases(keyphrases) + .setData(Arrays.copyOf(aidlConfig.data, aidlConfig.data.length)) + .setAudioCapabilities(aidl2apiAudioCapabilities(aidlConfig.audioCapabilities)) + .build(); } public static PhraseRecognitionExtra api2aidlPhraseRecognitionExtra( diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index 05e91e447a43..a1e7567faead 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -1529,8 +1529,6 @@ public class SoundTrigger { * config that can be used by * {@link SoundTriggerModule#startRecognition(int, RecognitionConfig)} * - * @deprecated should use builder-based constructor instead. - * TODO(b/368042125): remove this method. * @param captureRequested Whether the DSP should capture the trigger sound. * @param allowMultipleTriggers Whether the service should restart listening after the DSP * triggers. @@ -1538,15 +1536,10 @@ public class SoundTrigger { * @param data Opaque data for use by system applications who know about voice engine * internals, typically during enrollment. * @param audioCapabilities Bit field encoding of the AudioCapabilities. - * - * @hide */ - @Deprecated - @SuppressWarnings("Todo") - @TestApi - public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, - @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases, - @Nullable byte[] data, int audioCapabilities) { + private RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, + @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data, + int audioCapabilities) { this.mCaptureRequested = captureRequested; this.mAllowMultipleTriggers = allowMultipleTriggers; this.mKeyphrases = keyphrases != null ? keyphrases : new KeyphraseRecognitionExtra[0]; @@ -1558,6 +1551,7 @@ public class SoundTrigger { * Constructor for {@link RecognitionConfig} without audioCapabilities. The * audioCapabilities is set to 0. * + * @deprecated Use {@link Builder} instead. * @param captureRequested Whether the DSP should capture the trigger sound. * @param allowMultipleTriggers Whether the service should restart listening after the DSP * triggers. @@ -1567,10 +1561,10 @@ public class SoundTrigger { * @hide */ @UnsupportedAppUsage + @Deprecated @TestApi public RecognitionConfig(boolean captureRequested, boolean allowMultipleTriggers, - @SuppressLint("ArrayReturn") @Nullable KeyphraseRecognitionExtra[] keyphrases, - @Nullable byte[] data) { + @Nullable KeyphraseRecognitionExtra[] keyphrases, @Nullable byte[] data) { this(captureRequested, allowMultipleTriggers, keyphrases, data, 0); } @@ -1718,7 +1712,7 @@ public class SoundTrigger { /** * Sets capture requested state. - * @param captureRequested The new requested state. + * @param captureRequested Whether the DSP should capture the trigger sound. * @return the same Builder instance. */ public @NonNull Builder setCaptureRequested(boolean captureRequested) { @@ -1728,7 +1722,8 @@ public class SoundTrigger { /** * Sets allow multiple triggers state. - * @param allowMultipleTriggers The new allow multiple triggers state. + * @param allowMultipleTriggers Whether the service should restart listening after the + * DSP triggers. * @return the same Builder instance. */ public @NonNull Builder setAllowMultipleTriggers(boolean allowMultipleTriggers) { @@ -1738,7 +1733,8 @@ public class SoundTrigger { /** * Sets the keyphrases field. - * @param keyphrases The new keyphrases. + * @param keyphrases The list of keyphrase specific data associated with this + * recognition session. * @return the same Builder instance. */ public @NonNull Builder setKeyphrases( @@ -1749,7 +1745,9 @@ public class SoundTrigger { /** * Sets the data field. - * @param data The new data. + * @param data Opaque data provided to the DSP associated with this recognition session, + * which is used by system applications who know about voice engine + * internals, typically during enrollment. * @return the same Builder instance. */ public @NonNull Builder setData(@Nullable byte[] data) { @@ -1759,7 +1757,8 @@ public class SoundTrigger { /** * Sets the audio capabilities field. - * @param audioCapabilities The new audio capabilities. + * @param audioCapabilities The bit field encoding of the audio capabilities associated + * with this recognition session. * @return the same Builder instance. */ public @NonNull Builder setAudioCapabilities(int audioCapabilities) { diff --git a/core/java/android/service/voice/AlwaysOnHotwordDetector.java b/core/java/android/service/voice/AlwaysOnHotwordDetector.java index ccc17ecccbf9..2e660fc1f157 100644 --- a/core/java/android/service/voice/AlwaysOnHotwordDetector.java +++ b/core/java/android/service/voice/AlwaysOnHotwordDetector.java @@ -73,6 +73,7 @@ import com.android.internal.infra.AndroidFuture; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashSet; @@ -1513,10 +1514,11 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { "Recognition for the given keyphrase is not supported"); } - KeyphraseRecognitionExtra[] recognitionExtra = new KeyphraseRecognitionExtra[1]; + List recognitionExtra = + new ArrayList(1); // TODO: Do we need to do something about the confidence level here? - recognitionExtra[0] = new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(), - mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0]); + recognitionExtra.add(new KeyphraseRecognitionExtra(mKeyphraseMetadata.getId(), + mKeyphraseMetadata.getRecognitionModeFlags(), 0, new ConfidenceLevel[0])); boolean captureTriggerAudio = (recognitionFlags&RECOGNITION_FLAG_CAPTURE_TRIGGER_AUDIO) != 0; boolean allowMultipleTriggers = @@ -1534,10 +1536,17 @@ public class AlwaysOnHotwordDetector extends AbstractDetector { int code; try { code = mSoundTriggerSession.startRecognition( - mKeyphraseMetadata.getId(), mLocale.toLanguageTag(), mInternalCallback, - new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers, - recognitionExtra, data, audioCapabilities), - runInBatterySaver); + mKeyphraseMetadata.getId(), + mLocale.toLanguageTag(), + mInternalCallback, + new RecognitionConfig.Builder() + .setCaptureRequested(captureTriggerAudio) + .setAllowMultipleTriggers(allowMultipleTriggers) + .setKeyphrases(recognitionExtra) + .setData(data) + .setAudioCapabilities(audioCapabilities) + .build(), + runInBatterySaver); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/media/java/android/media/soundtrigger/SoundTriggerDetector.java b/media/java/android/media/soundtrigger/SoundTriggerDetector.java index afa0a3271906..65e83b9bf204 100644 --- a/media/java/android/media/soundtrigger/SoundTriggerDetector.java +++ b/media/java/android/media/soundtrigger/SoundTriggerDetector.java @@ -323,10 +323,15 @@ public final class SoundTriggerDetector { int status; try { - status = mSoundTriggerSession.startRecognition(mSoundModel, - mRecognitionCallback, new RecognitionConfig(captureTriggerAudio, - allowMultipleTriggers, null, null, audioCapabilities), - runInBatterySaver); + status = mSoundTriggerSession.startRecognition( + mSoundModel, + mRecognitionCallback, + new RecognitionConfig.Builder() + .setCaptureRequested(captureTriggerAudio) + .setAllowMultipleTriggers(allowMultipleTriggers) + .setAudioCapabilities(audioCapabilities) + .build(), + runInBatterySaver); } catch (RemoteException e) { return false; } diff --git a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java index ff2ce15a7946..6dba96766b48 100644 --- a/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java +++ b/services/tests/voiceinteractiontests/src/com/android/server/soundtrigger/ConversionUtilTest.java @@ -41,6 +41,8 @@ import androidx.test.runner.AndroidJUnit4; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; @RunWith(AndroidJUnit4.class) @@ -62,18 +64,23 @@ public class ConversionUtilTest { final int flags = SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_ECHO_CANCELLATION | SoundTrigger.ModuleProperties.AUDIO_CAPABILITY_NOISE_SUPPRESSION; final var data = new byte[] {0x11, 0x22}; - final var keyphrases = new SoundTrigger.KeyphraseRecognitionExtra[2]; - keyphrases[0] = new SoundTrigger.KeyphraseRecognitionExtra(99, + final var keyphrases = new ArrayList(2); + keyphrases.add(new SoundTrigger.KeyphraseRecognitionExtra(99, RECOGNITION_MODE_VOICE_TRIGGER | RECOGNITION_MODE_USER_IDENTIFICATION, 13, new ConfidenceLevel[] {new ConfidenceLevel(9999, 50), - new ConfidenceLevel(5000, 80)}); - keyphrases[1] = new SoundTrigger.KeyphraseRecognitionExtra(101, + new ConfidenceLevel(5000, 80)})); + keyphrases.add(new SoundTrigger.KeyphraseRecognitionExtra(101, RECOGNITION_MODE_GENERIC, 8, new ConfidenceLevel[] { new ConfidenceLevel(7777, 30), - new ConfidenceLevel(2222, 60)}); + new ConfidenceLevel(2222, 60)})); - var apiconfig = new SoundTrigger.RecognitionConfig(true, false /** must be false **/, - keyphrases, data, flags); + var apiconfig = new SoundTrigger.RecognitionConfig.Builder() + .setCaptureRequested(true) + .setAllowMultipleTriggers(false) // must be false + .setKeyphrases(keyphrases) + .setData(data) + .setAudioCapabilities(flags) + .build(); assertEquals(apiconfig, aidl2apiRecognitionConfig(api2aidlRecognitionConfig(apiconfig))); } -- GitLab From 7aac258abbca311d358b673ecc7d79e98956394c Mon Sep 17 00:00:00 2001 From: Matt Buckley Date: Fri, 18 Oct 2024 11:22:12 -0700 Subject: [PATCH 075/459] Fix blocking call on FMQ critical path Prevent fmq creation from blocking session creation and delaying boosts on the critical path. Bug: 315894228 Test: atest PerformanceHintNativeTestCases Flag: android.os.adpf_use_fmq_channel_fixed Change-Id: I7c431ab1b35bb3f1a3afb681e20054702e185d5f --- native/android/performance_hint.cpp | 45 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/native/android/performance_hint.cpp b/native/android/performance_hint.cpp index 095d7d1145ae..15f77cebf3ba 100644 --- a/native/android/performance_hint.cpp +++ b/native/android/performance_hint.cpp @@ -39,6 +39,7 @@ #include #include +#include #include #include #include @@ -104,6 +105,7 @@ private: size_t mAvailableSlots GUARDED_BY(sHintMutex) = 0; bool mHalSupported = true; HalMessageQueue::MemTransaction mFmqTransaction GUARDED_BY(sHintMutex); + std::future mChannelCreationFinished; }; struct APerformanceHintManager { @@ -218,6 +220,8 @@ APerformanceHintManager::~APerformanceHintManager() { } APerformanceHintManager* APerformanceHintManager::getInstance() { + static std::once_flag creationFlag; + static APerformanceHintManager* instance = nullptr; if (gHintManagerForTesting) { return gHintManagerForTesting.get(); } @@ -226,7 +230,7 @@ APerformanceHintManager* APerformanceHintManager::getInstance() { std::shared_ptr(create(*gIHintManagerForTesting)); return gHintManagerForTesting.get(); } - static APerformanceHintManager* instance = create(nullptr); + std::call_once(creationFlag, []() { instance = create(nullptr); }); return instance; } @@ -522,25 +526,28 @@ bool FMQWrapper::isSupported() { } bool FMQWrapper::startChannel(IHintManager* manager) { - if (isSupported() && !isActive()) { - std::optional config; - auto ret = manager->getSessionChannel(mToken, &config); - if (ret.isOk() && config.has_value()) { - std::scoped_lock lock{sHintMutex}; - mQueue = std::make_shared(config->channelDescriptor, true); - if (config->eventFlagDescriptor.has_value()) { - mFlagQueue = std::make_shared(*config->eventFlagDescriptor, true); - android::hardware::EventFlag::createEventFlag(mFlagQueue->getEventFlagWord(), - &mEventFlag); - mWriteMask = config->writeFlagBitmask; + if (isSupported() && !isActive() && manager->isRemote()) { + mChannelCreationFinished = std::async(std::launch::async, [&, this, manager]() { + std::optional config; + auto ret = manager->getSessionChannel(mToken, &config); + if (ret.isOk() && config.has_value()) { + std::scoped_lock lock{sHintMutex}; + mQueue = std::make_shared(config->channelDescriptor, true); + if (config->eventFlagDescriptor.has_value()) { + mFlagQueue = std::make_shared(*config->eventFlagDescriptor, true); + android::hardware::EventFlag::createEventFlag(mFlagQueue->getEventFlagWord(), + &mEventFlag); + mWriteMask = config->writeFlagBitmask; + } + updatePersistentTransaction(); + } else if (ret.isOk() && !config.has_value()) { + ALOGV("FMQ channel enabled but unsupported."); + setUnsupported(); + } else { + ALOGE("%s: FMQ channel initialization failed: %s", __FUNCTION__, ret.getMessage()); } - updatePersistentTransaction(); - } else if (ret.isOk() && !config.has_value()) { - ALOGV("FMQ channel enabled but unsupported."); - setUnsupported(); - } else { - ALOGE("%s: FMQ channel initialization failed: %s", __FUNCTION__, ret.getMessage()); - } + return true; + }); } return isActive(); } -- GitLab From 1d3827d255e9e1e14ccdbbec8d1bca301fb47a2b Mon Sep 17 00:00:00 2001 From: Matthew Sedam Date: Fri, 18 Oct 2024 21:57:20 +0000 Subject: [PATCH 076/459] [Service] Cleanup CHRE 24Q3 flags Bug: N/A Change-Id: I00ce2e958e56f8cc225a7db1776fd0c0a0638420 Flag: EXEMPT flag cleanup Test: Presubmits --- core/api/system-current.txt | 14 ++++---- .../hardware/location/ContextHubClient.java | 11 +++--- .../hardware/location/ContextHubInfo.java | 36 +++++++++---------- .../hardware/location/ContextHubManager.java | 4 +-- .../location/ContextHubTransaction.java | 14 +++----- .../hardware/location/NanoAppMessage.java | 16 +++++---- .../contexthub/ContextHubClientBroker.java | 12 ++----- .../contexthub/ContextHubClientManager.java | 2 +- .../contexthub/ContextHubEventLogger.java | 4 --- .../contexthub/ContextHubService.java | 16 +++------ .../contexthub/IContextHubWrapper.java | 20 ++++------- .../contexthub/ContextHubEventLoggerTest.java | 2 -- 12 files changed, 58 insertions(+), 93 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 207f4b57e8bf..caec0b2fd72a 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6054,7 +6054,7 @@ package android.hardware.location { method @NonNull public android.hardware.location.ContextHubInfo getAttachedHub(); method @IntRange(from=0, to=65535) public int getId(); method @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public int sendMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage); - method @FlaggedApi("android.chre.flags.reliable_message") @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction sendReliableMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage); + method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) public android.hardware.location.ContextHubTransaction sendReliableMessageToNanoApp(@NonNull android.hardware.location.NanoAppMessage); } public class ContextHubClientCallback { @@ -6090,7 +6090,7 @@ package android.hardware.location { method public String getToolchain(); method public int getToolchainVersion(); method public String getVendor(); - method @FlaggedApi("android.chre.flags.reliable_message") public boolean supportsReliableMessages(); + method public boolean supportsReliableMessages(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } @@ -6174,7 +6174,7 @@ package android.hardware.location { field public static final int RESULT_FAILED_BAD_PARAMS = 2; // 0x2 field public static final int RESULT_FAILED_BUSY = 4; // 0x4 field public static final int RESULT_FAILED_HAL_UNAVAILABLE = 8; // 0x8 - field @FlaggedApi("android.chre.flags.reliable_message") public static final int RESULT_FAILED_NOT_SUPPORTED = 9; // 0x9 + field public static final int RESULT_FAILED_NOT_SUPPORTED = 9; // 0x9 field public static final int RESULT_FAILED_SERVICE_INTERNAL_FAILURE = 7; // 0x7 field public static final int RESULT_FAILED_TIMEOUT = 6; // 0x6 field public static final int RESULT_FAILED_UNINITIALIZED = 3; // 0x3 @@ -6184,7 +6184,7 @@ package android.hardware.location { field public static final int TYPE_ENABLE_NANOAPP = 2; // 0x2 field public static final int TYPE_LOAD_NANOAPP = 0; // 0x0 field public static final int TYPE_QUERY_NANOAPPS = 4; // 0x4 - field @FlaggedApi("android.chre.flags.reliable_message") public static final int TYPE_RELIABLE_MESSAGE = 5; // 0x5 + field public static final int TYPE_RELIABLE_MESSAGE = 5; // 0x5 field public static final int TYPE_UNLOAD_NANOAPP = 1; // 0x1 } @@ -6367,15 +6367,15 @@ package android.hardware.location { public final class NanoAppMessage implements android.os.Parcelable { method public static android.hardware.location.NanoAppMessage createMessageFromNanoApp(long, int, byte[], boolean); - method @FlaggedApi("android.chre.flags.reliable_message") @NonNull public static android.hardware.location.NanoAppMessage createMessageFromNanoApp(long, int, @NonNull byte[], boolean, boolean, int); + method @NonNull public static android.hardware.location.NanoAppMessage createMessageFromNanoApp(long, int, @NonNull byte[], boolean, boolean, int); method public static android.hardware.location.NanoAppMessage createMessageToNanoApp(long, int, byte[]); method public int describeContents(); method public byte[] getMessageBody(); - method @FlaggedApi("android.chre.flags.reliable_message") public int getMessageSequenceNumber(); + method public int getMessageSequenceNumber(); method public int getMessageType(); method public long getNanoAppId(); method public boolean isBroadcastMessage(); - method @FlaggedApi("android.chre.flags.reliable_message") public boolean isReliable(); + method public boolean isReliable(); method public void writeToParcel(android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; } diff --git a/core/java/android/hardware/location/ContextHubClient.java b/core/java/android/hardware/location/ContextHubClient.java index 953086de2d15..538e2fb7fe3e 100644 --- a/core/java/android/hardware/location/ContextHubClient.java +++ b/core/java/android/hardware/location/ContextHubClient.java @@ -194,23 +194,20 @@ public class ContextHubClient implements Closeable { /** * Sends a reliable message to a nanoapp. * - * This method is similar to {@link ContextHubClient#sendMessageToNanoApp} with the + *

This method is similar to {@link ContextHubClient#sendMessageToNanoApp} with the * difference that it expects the message to be acknowledged by CHRE. * - * The transaction succeeds after we received an ACK from CHRE without error. - * In all other cases the transaction will fail. + *

The transaction succeeds after we received an ACK from CHRE without error. In all other + * cases the transaction will fail. */ @RequiresPermission(android.Manifest.permission.ACCESS_CONTEXT_HUB) @NonNull - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) public ContextHubTransaction sendReliableMessageToNanoApp( @NonNull NanoAppMessage message) { ContextHubTransaction transaction = new ContextHubTransaction<>(ContextHubTransaction.TYPE_RELIABLE_MESSAGE); - if (!Flags.reliableMessageImplementation() || - !mAttachedHub.supportsReliableMessages() || - message.isBroadcastMessage()) { + if (!mAttachedHub.supportsReliableMessages() || message.isBroadcastMessage()) { transaction.setResponse(new ContextHubTransaction.Response( ContextHubTransaction.RESULT_FAILED_NOT_SUPPORTED, null)); return transaction; diff --git a/core/java/android/hardware/location/ContextHubInfo.java b/core/java/android/hardware/location/ContextHubInfo.java index d9349701bf7d..858ec23ebed8 100644 --- a/core/java/android/hardware/location/ContextHubInfo.java +++ b/core/java/android/hardware/location/ContextHubInfo.java @@ -99,8 +99,7 @@ public class ContextHubInfo implements Parcelable { mSleepPowerDrawMw = 0; mPeakPowerDrawMw = 0; mMaxPacketLengthBytes = contextHub.maxSupportedMessageLengthBytes; - mSupportsReliableMessages = Flags.reliableMessageImplementation() - && contextHub.supportsReliableMessages; + mSupportsReliableMessages = contextHub.supportsReliableMessages; mChrePlatformId = contextHub.chrePlatformId; mChreApiMajorVersion = contextHub.chreApiMajorVersion; mChreApiMinorVersion = contextHub.chreApiMinorVersion; @@ -124,7 +123,6 @@ public class ContextHubInfo implements Parcelable { * * @return whether reliable messages are supported. */ - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) public boolean supportsReliableMessages() { return mSupportsReliableMessages; } @@ -364,22 +362,22 @@ public class ContextHubInfo implements Parcelable { boolean isEqual = false; if (object instanceof ContextHubInfo) { ContextHubInfo other = (ContextHubInfo) object; - isEqual = (other.getId() == mId) - && other.getName().equals(mName) - && other.getVendor().equals(mVendor) - && other.getToolchain().equals(mToolchain) - && (other.getToolchainVersion() == mToolchainVersion) - && (other.getStaticSwVersion() == getStaticSwVersion()) - && (other.getChrePlatformId() == mChrePlatformId) - && (other.getPeakMips() == mPeakMips) - && (other.getStoppedPowerDrawMw() == mStoppedPowerDrawMw) - && (other.getSleepPowerDrawMw() == mSleepPowerDrawMw) - && (other.getPeakPowerDrawMw() == mPeakPowerDrawMw) - && (other.getMaxPacketLengthBytes() == mMaxPacketLengthBytes) - && (!Flags.reliableMessage() - || (other.supportsReliableMessages() == mSupportsReliableMessages)) - && Arrays.equals(other.getSupportedSensors(), mSupportedSensors) - && Arrays.equals(other.getMemoryRegions(), mMemoryRegions); + isEqual = + (other.getId() == mId) + && other.getName().equals(mName) + && other.getVendor().equals(mVendor) + && other.getToolchain().equals(mToolchain) + && (other.getToolchainVersion() == mToolchainVersion) + && (other.getStaticSwVersion() == getStaticSwVersion()) + && (other.getChrePlatformId() == mChrePlatformId) + && (other.getPeakMips() == mPeakMips) + && (other.getStoppedPowerDrawMw() == mStoppedPowerDrawMw) + && (other.getSleepPowerDrawMw() == mSleepPowerDrawMw) + && (other.getPeakPowerDrawMw() == mPeakPowerDrawMw) + && (other.getMaxPacketLengthBytes() == mMaxPacketLengthBytes) + && (other.supportsReliableMessages() == mSupportsReliableMessages) + && Arrays.equals(other.getSupportedSensors(), mSupportedSensors) + && Arrays.equals(other.getMemoryRegions(), mMemoryRegions); } return isEqual; diff --git a/core/java/android/hardware/location/ContextHubManager.java b/core/java/android/hardware/location/ContextHubManager.java index 218b02315fc8..6284e7061b88 100644 --- a/core/java/android/hardware/location/ContextHubManager.java +++ b/core/java/android/hardware/location/ContextHubManager.java @@ -750,9 +750,7 @@ public final class ContextHubManager { executor.execute( () -> { callback.onMessageFromNanoApp(client, message); - if (Flags.reliableMessage() - && Flags.reliableMessageImplementation() - && message.isReliable()) { + if (message.isReliable()) { client.reliableMessageCallbackFinished( message.getMessageSequenceNumber(), ErrorCode.OK); } else { diff --git a/core/java/android/hardware/location/ContextHubTransaction.java b/core/java/android/hardware/location/ContextHubTransaction.java index 4060f4c1b462..bd87b5cb6d54 100644 --- a/core/java/android/hardware/location/ContextHubTransaction.java +++ b/core/java/android/hardware/location/ContextHubTransaction.java @@ -69,7 +69,6 @@ public class ContextHubTransaction { public static final int TYPE_ENABLE_NANOAPP = 2; public static final int TYPE_DISABLE_NANOAPP = 3; public static final int TYPE_QUERY_NANOAPPS = 4; - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) public static final int TYPE_RELIABLE_MESSAGE = 5; /** @@ -123,10 +122,8 @@ public class ContextHubTransaction { * Failure mode when the Context Hub HAL was not available. */ public static final int RESULT_FAILED_HAL_UNAVAILABLE = 8; - /** - * Failure mode when the operation is not supported. - */ - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) + + /** Failure mode when the operation is not supported. */ public static final int RESULT_FAILED_NOT_SUPPORTED = 9; /** @@ -232,11 +229,8 @@ public class ContextHubTransaction { return upperCase ? "Disable" : "disable"; case ContextHubTransaction.TYPE_QUERY_NANOAPPS: return upperCase ? "Query" : "query"; - case ContextHubTransaction.TYPE_RELIABLE_MESSAGE: { - if (Flags.reliableMessage()) { - return upperCase ? "Reliable Message" : "reliable message"; - } - } + case ContextHubTransaction.TYPE_RELIABLE_MESSAGE: + return upperCase ? "Reliable Message" : "reliable message"; default: return upperCase ? "Unknown" : "unknown"; } diff --git a/core/java/android/hardware/location/NanoAppMessage.java b/core/java/android/hardware/location/NanoAppMessage.java index ec0adda38d10..32b9283ecd2e 100644 --- a/core/java/android/hardware/location/NanoAppMessage.java +++ b/core/java/android/hardware/location/NanoAppMessage.java @@ -97,7 +97,7 @@ public final class NanoAppMessage implements Parcelable { /** * Creates a NanoAppMessage object sent from a nanoapp. * - * This factory method is intended only to be used by the Context Hub Service when delivering + *

This factory method is intended only to be used by the Context Hub Service when delivering * messages from a nanoapp to clients. * * @param sourceNanoAppId the ID of the nanoapp that the message was sent from @@ -106,12 +106,14 @@ public final class NanoAppMessage implements Parcelable { * @param broadcasted {@code true} if the message was broadcasted, {@code false} otherwise * @param isReliable if the NanoAppMessage is reliable * @param messageSequenceNumber the message sequence number of the NanoAppMessage - * * @return the NanoAppMessage object */ - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) - public static @NonNull NanoAppMessage createMessageFromNanoApp(long sourceNanoAppId, - int messageType, @NonNull byte[] messageBody, boolean broadcasted, boolean isReliable, + public static @NonNull NanoAppMessage createMessageFromNanoApp( + long sourceNanoAppId, + int messageType, + @NonNull byte[] messageBody, + boolean broadcasted, + boolean isReliable, int messageSequenceNumber) { return new NanoAppMessage(sourceNanoAppId, messageType, messageBody, broadcasted, isReliable, messageSequenceNumber); @@ -147,18 +149,18 @@ public final class NanoAppMessage implements Parcelable { /** * Returns if the message is reliable. The default value is {@code false} + * * @return {@code true} if the message is reliable, {@code false} otherwise */ - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) public boolean isReliable() { return mIsReliable; } /** * Returns the message sequence number. The default value is 0 + * * @return the message sequence number of the message */ - @FlaggedApi(Flags.FLAG_RELIABLE_MESSAGE) public int getMessageSequenceNumber() { return mMessageSequenceNumber; } diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java index 598901e33305..556cc03b3abd 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubClientBroker.java @@ -500,7 +500,7 @@ public class ContextHubClientBroker extends IContextHubClient.Stub checkNanoappPermsAsync(); } - if (!Flags.reliableMessageImplementation() || transactionCallback == null) { + if (transactionCallback == null) { try { result = mContextHubProxy.sendMessageToContextHub(mHostEndPointId, mAttachedContextHubInfo.getId(), message); @@ -671,10 +671,8 @@ public class ContextHubClientBroker extends IContextHubClient.Stub .putExtra(ContextHubManager.EXTRA_MESSAGE, message); Consumer onFinishedCallback = (Byte error) -> sendMessageDeliveryStatusToContextHub(message.getMessageSequenceNumber(), error); - return sendPendingIntent(supplier, nanoAppId, - Flags.reliableMessageImplementation() && message.isReliable() - ? onFinishedCallback - : null); + return sendPendingIntent( + supplier, nanoAppId, message.isReliable() ? onFinishedCallback : null); } /** @@ -1284,10 +1282,6 @@ public class ContextHubClientBroker extends IContextHubClient.Stub } private void sendMessageDeliveryStatusToContextHub(int messageSequenceNumber, byte errorCode) { - if (!Flags.reliableMessageImplementation()) { - return; - } - MessageDeliveryStatus status = new MessageDeliveryStatus(); status.messageSequenceNumber = messageSequenceNumber; status.errorCode = errorCode; diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java b/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java index 7285151ee598..0fdd0ae641df 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubClientManager.java @@ -236,7 +236,7 @@ import java.util.function.Consumer; } if (message.isBroadcastMessage()) { - if (Flags.reliableMessageImplementation() && message.isReliable()) { + if (message.isReliable()) { Log.e(TAG, "Received reliable broadcast message from " + message.getNanoAppId()); return ErrorCode.PERMANENT_ERROR; } diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubEventLogger.java b/services/core/java/com/android/server/location/contexthub/ContextHubEventLogger.java index e1b1416169cd..53a02cd1b677 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubEventLogger.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubEventLogger.java @@ -333,10 +333,6 @@ public class ContextHubEventLogger { */ public synchronized void logReliableMessageToNanoappStatus( int messageSequenceNumber, byte errorCode) { - if (!Flags.reliableMessage()) { - return; - } - for (NanoappMessageEvent event : mMessageToNanoappQueue) { if (event.message.isReliable() && event.message.getMessageSequenceNumber() diff --git a/services/core/java/com/android/server/location/contexthub/ContextHubService.java b/services/core/java/com/android/server/location/contexthub/ContextHubService.java index ed69f7ad32f6..acc8f6634f5c 100644 --- a/services/core/java/com/android/server/location/contexthub/ContextHubService.java +++ b/services/core/java/com/android/server/location/contexthub/ContextHubService.java @@ -228,9 +228,8 @@ public class ContextHubService extends IContextHubService.Stub { // Only process the message normally if not using test mode manager or if // the test mode manager call returned false as this indicates it did not // process the message. - boolean useTestModeManager = Flags.reliableMessageImplementation() - && Flags.reliableMessageTestModeBehavior() - && mIsTestModeEnabled.get(); + boolean useTestModeManager = + Flags.reliableMessageTestModeBehavior() && mIsTestModeEnabled.get(); if (!useTestModeManager || !mTestModeManager.handleNanoappMessage(() -> { handleClientMessageCallback(mContextHubId, hostEndpointId, @@ -945,8 +944,7 @@ public class ContextHubService extends IContextHubService.Stub { private void handleClientMessageCallback(int contextHubId, short hostEndpointId, NanoAppMessage message, List nanoappPermissions, List messagePermissions) { - if (!Flags.reliableMessageImplementation() - || !Flags.reliableMessageDuplicateDetectionService()) { + if (!Flags.reliableMessageDuplicateDetectionService()) { byte errorCode = mClientManager.onMessageFromNanoApp(contextHubId, hostEndpointId, message, nanoappPermissions, messagePermissions); if (message.isReliable() && errorCode != ErrorCode.OK) { @@ -1040,12 +1038,8 @@ public class ContextHubService extends IContextHubService.Stub { * @param messageSequenceNumber the message sequence number * @param errorCode the error code, one of the enum ErrorCode */ - private void sendMessageDeliveryStatusToContextHub(int contextHubId, - int messageSequenceNumber, byte errorCode) { - if (!Flags.reliableMessageImplementation()) { - return; - } - + private void sendMessageDeliveryStatusToContextHub( + int contextHubId, int messageSequenceNumber, byte errorCode) { MessageDeliveryStatus status = new MessageDeliveryStatus(); status.messageSequenceNumber = messageSequenceNumber; status.errorCode = errorCode; diff --git a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java index a8ad41853d34..5e9277ac0faf 100644 --- a/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java +++ b/services/core/java/com/android/server/location/contexthub/IContextHubWrapper.java @@ -494,16 +494,11 @@ public abstract class IContextHubWrapper { } public void handleMessageDeliveryStatus( - char hostEndpointId, - MessageDeliveryStatus messageDeliveryStatus) { - if (Flags.reliableMessageImplementation()) { - mHandler.post(() -> { - mCallback.handleMessageDeliveryStatus(messageDeliveryStatus); - }); - } else { - Log.w(TAG, "handleMessageDeliveryStatus called when the " - + "reliableMessageImplementation flag is disabled"); - } + char hostEndpointId, MessageDeliveryStatus messageDeliveryStatus) { + mHandler.post( + () -> { + mCallback.handleMessageDeliveryStatus(messageDeliveryStatus); + }); } public byte[] getUuid() { @@ -682,9 +677,8 @@ public abstract class IContextHubWrapper { // Only process the message normally if not using test mode manager or if // the test mode manager call returned false as this indicates it did not // process the message. - boolean useTestModeManager = Flags.reliableMessageImplementation() - && Flags.reliableMessageTestModeBehavior() - && mIsTestModeEnabled.get(); + boolean useTestModeManager = + Flags.reliableMessageTestModeBehavior() && mIsTestModeEnabled.get(); if (!useTestModeManager || !mTestModeManager.sendMessageToContextHub( sendMessage, message)) { try { diff --git a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEventLoggerTest.java b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEventLoggerTest.java index 41cb6fd99d9b..e1dcc99d3851 100644 --- a/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEventLoggerTest.java +++ b/services/tests/servicestests/src/com/android/server/location/contexthub/ContextHubEventLoggerTest.java @@ -128,8 +128,6 @@ public class ContextHubEventLoggerTest { } @Test - @EnableFlags({Flags.FLAG_RELIABLE_MESSAGE, - Flags.FLAG_RELIABLE_MESSAGE_IMPLEMENTATION}) public void testLogReliableMessageToNanoappStatus() { NanoAppMessage message1 = NanoAppMessage.createMessageToNanoApp(1, 0, new byte[] {0x00, 0x11, 0x22, 0x33}); -- GitLab From 6a5d10025192224322734e7fcb7f7c8e9fe2e331 Mon Sep 17 00:00:00 2001 From: Wenhui Yang Date: Tue, 8 Oct 2024 03:22:56 +0000 Subject: [PATCH 077/459] Introduce getChildSurfacePackage() and clearChildSurfacePackage() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add a way to determine whether there’s embedded content inside a SurfaceView with a SurfacePackage. setChildSurfacePackage absorbs RemoteException today, and we have no way to know whether the call succeeded. Adding such APIs improves testability. Bug: 341021569 Test: SurfaceViewTest Flag: android.view.flags.surface_view_get_surface_package Change-Id: I60d33cecf0c3ecb7a7595baa0e2010e78c23faca --- core/api/current.txt | 2 + core/java/android/view/SurfaceView.java | 46 ++++++++++++++++++- .../android/view/flags/view_flags.aconfig | 8 ++++ 3 files changed, 55 insertions(+), 1 deletion(-) diff --git a/core/api/current.txt b/core/api/current.txt index ff203848fa3a..b95295cd4ad9 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52657,6 +52657,8 @@ package android.view { ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int); ctor public SurfaceView(android.content.Context, android.util.AttributeSet, int, int); method public void applyTransactionToFrame(@NonNull android.view.SurfaceControl.Transaction); + method @FlaggedApi("android.view.flags.surface_view_get_surface_package") public void clearChildSurfacePackage(); + method @FlaggedApi("android.view.flags.surface_view_get_surface_package") @Nullable public android.view.SurfaceControlViewHost.SurfacePackage getChildSurfacePackage(); method @FlaggedApi("android.view.flags.surface_view_set_composition_order") public int getCompositionOrder(); method public android.view.SurfaceHolder getHolder(); method @Deprecated @Nullable public android.os.IBinder getHostToken(); diff --git a/core/java/android/view/SurfaceView.java b/core/java/android/view/SurfaceView.java index 82235d252a72..9cad3e58fa02 100644 --- a/core/java/android/view/SurfaceView.java +++ b/core/java/android/view/SurfaceView.java @@ -16,6 +16,7 @@ package android.view; +import static android.view.flags.Flags.FLAG_SURFACE_VIEW_GET_SURFACE_PACKAGE; import static android.view.flags.Flags.FLAG_SURFACE_VIEW_SET_COMPOSITION_ORDER; import static android.view.WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; import static android.view.WindowManagerPolicyConstants.APPLICATION_MEDIA_OVERLAY_SUBLAYER; @@ -27,6 +28,7 @@ import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; import android.compat.annotation.UnsupportedAppUsage; import android.content.Context; import android.content.res.CompatibilityInfo.Translator; @@ -2112,7 +2114,7 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall } /** - * Display the view-hierarchy embedded within a {@link SurfaceControlViewHost.SurfacePackage} + * Displays the view-hierarchy embedded within a {@link SurfaceControlViewHost.SurfacePackage} * within this SurfaceView. * * This can be called independently of the SurfaceView lifetime callbacks. SurfaceView @@ -2132,6 +2134,8 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall * SurfaceView the underlying {@link SurfaceControlViewHost} remains managed by it's original * remote-owner. * + * Users can call {@link SurfaceView#clearChildSurfacePackage} to clear the package. + * * @param p The SurfacePackage to embed. */ public void setChildSurfacePackage(@NonNull SurfaceControlViewHost.SurfacePackage p) { @@ -2155,6 +2159,46 @@ public class SurfaceView extends View implements ViewRootImpl.SurfaceChangedCall invalidate(); } + /** + * Returns the {@link SurfaceControlViewHost.SurfacePackage} that was set on this SurfaceView. + * + * Note: This method will return {@code null} if + * {@link #setChildSurfacePackage(SurfaceControlViewHost.SurfacePackage)} + * has not been called or if {@link #clearChildSurfacePackage()} has been called. + * + * @see #setChildSurfacePackage(SurfaceControlViewHost.SurfacePackage) + */ + @SuppressLint("GetterSetterNullability") + @FlaggedApi(FLAG_SURFACE_VIEW_GET_SURFACE_PACKAGE) + public @Nullable SurfaceControlViewHost.SurfacePackage getChildSurfacePackage() { + return mSurfacePackage; + } + + /** + * Clears the {@link SurfaceControlViewHost.SurfacePackage} that was set on this SurfaceView. + * This hides any content rendered by the provided + * {@link SurfaceControlViewHost.SurfacePackage}. + * + * @see #setChildSurfacePackage(SurfaceControlViewHost.SurfacePackage) + */ + @FlaggedApi(FLAG_SURFACE_VIEW_GET_SURFACE_PACKAGE) + public void clearChildSurfacePackage() { + if (mSurfacePackage != null) { + mSurfaceControlViewHostParent.detach(); + mEmbeddedWindowParams.clear(); + + // Reparent the SurfaceControl to remove the content on screen. + final SurfaceControl sc = mSurfacePackage.getSurfaceControl(); + final SurfaceControl.Transaction transaction = new Transaction(); + transaction.reparent(sc, null); + mSurfacePackage.release(); + applyTransactionOnVriDraw(transaction); + + mSurfacePackage = null; + invalidate(); + } + } + private void reparentSurfacePackage(SurfaceControl.Transaction t, SurfaceControlViewHost.SurfacePackage p) { final SurfaceControl sc = p.getSurfaceControl(); diff --git a/core/java/android/view/flags/view_flags.aconfig b/core/java/android/view/flags/view_flags.aconfig index bb61ae49259c..1b86f96d7eb7 100644 --- a/core/java/android/view/flags/view_flags.aconfig +++ b/core/java/android/view/flags/view_flags.aconfig @@ -118,6 +118,14 @@ flag { is_fixed_read_only: true } +flag { + name: "surface_view_get_surface_package" + namespace: "window_surfaces" + description: "Add APIs to manage SurfacePackage of the parent SurfaceView." + bug: "341021569" + is_fixed_read_only: true +} + flag { name: "use_refactored_round_scrollbar" namespace: "wear_frameworks" -- GitLab From 8cb788c15f555b606bed8c68e0825f378407048a Mon Sep 17 00:00:00 2001 From: Chandru S Date: Thu, 17 Oct 2024 07:38:06 +0000 Subject: [PATCH 078/459] Update sysuiResTag for user switcher UI elements Bug: 310005730 Bug: 372089608 Test: MultiUsersUiTest and SingleUserUiCheck e2e tests pass locally Flag: com.android.systemui.compose_bouncer Change-Id: Ib4cf2ed2cc4f3f8716f55e0b1b61409dab6b6e52 --- .../bouncer/ui/composable/BouncerContent.kt | 13 +++++-------- .../bouncer/ui/composable/BouncerContentTest.kt | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt index c1c3b1fb6c5a..d08df26ea8da 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/bouncer/ui/composable/BouncerContent.kt @@ -371,10 +371,7 @@ private fun BesideUserSwitcherLayout( .motionTestValues { animatedAlpha(animatedOffset) exportAs MotionTestValues.alpha } } - UserSwitcher( - viewModel = viewModel, - modifier = Modifier.weight(1f).swappable().testTag("UserSwitcher"), - ) + UserSwitcher(viewModel = viewModel, modifier = Modifier.weight(1f).swappable()) FoldAware( modifier = Modifier.weight(1f).swappable(inversed = true).testTag("FoldAware"), @@ -738,7 +735,7 @@ private fun UserSwitcher(viewModel: BouncerSceneContentViewModel, modifier: Modi Column( horizontalAlignment = Alignment.CenterHorizontally, verticalArrangement = Arrangement.Center, - modifier = modifier, + modifier = modifier.sysuiResTag("UserSwitcher"), ) { selectedUserImage?.let { Image( @@ -781,7 +778,7 @@ private fun UserSwitcher(viewModel: BouncerSceneContentViewModel, modifier: Modi Icon( imageVector = Icons.Default.KeyboardArrowDown, contentDescription = null, - modifier = Modifier.size(32.dp), + modifier = Modifier.size(32.dp).sysuiResTag("user_switcher_anchor"), ) } @@ -819,11 +816,11 @@ private fun UserSwitcherDropdownMenu( expanded = isExpanded, onDismissRequest = onDismissed, offset = DpOffset(x = 0.dp, y = -UserSwitcherDropdownHeight), - modifier = - Modifier.width(UserSwitcherDropdownWidth).sysuiResTag("user_switcher_dropdown"), + modifier = Modifier.width(UserSwitcherDropdownWidth).sysuiResTag("user_list_dropdown"), ) { items.forEach { userSwitcherDropdownItem -> DropdownMenuItem( + modifier = Modifier.sysuiResTag("user_switcher_item"), leadingIcon = { Icon( icon = userSwitcherDropdownItem.icon, diff --git a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerContentTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerContentTest.kt index fd550b05fdc9..6e36d42bd99f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerContentTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bouncer/ui/composable/BouncerContentTest.kt @@ -88,7 +88,7 @@ class BouncerContentTest : SysuiTestCase() { }, layout = BouncerSceneLayout.BESIDE_USER_SWITCHER, modifier = Modifier.fillMaxSize().testTag("BouncerContent"), - dialogFactory = bouncerDialogFactory + dialogFactory = bouncerDialogFactory, ) } } @@ -110,11 +110,19 @@ class BouncerContentTest : SysuiTestCase() { } } ) { - feature(hasTestTag("UserSwitcher"), positionInRoot, "userSwitcher_pos") - feature(hasTestTag("UserSwitcher"), alpha, "userSwitcher_alpha") + feature( + hasTestTag("com.android.systemui:id/UserSwitcher"), + positionInRoot, + "userSwitcher_pos", + ) + feature( + hasTestTag("com.android.systemui:id/UserSwitcher"), + alpha, + "userSwitcher_alpha", + ) feature(hasTestTag("FoldAware"), positionInRoot, "foldAware_pos") feature(hasTestTag("FoldAware"), alpha, "foldAware_alpha") - } + }, ) assertThat(motion).timeSeriesMatchesGolden() -- GitLab From cafac86b67ad058acf46438b5048e44b42d81557 Mon Sep 17 00:00:00 2001 From: Mark Fasheh Date: Fri, 18 Oct 2024 17:16:04 +0000 Subject: [PATCH 079/459] Update boot image profile for MessageQueue We see drastically different performance depending on what MessageQueue is in use. Mark the whole class for AOT compilation so we can do proper A/B comparisons between MessageQueue implementations. Flag: EXEMPT resource only update Test: compile Bug: 338098106 Change-Id: I10c60486d3cc88193bb7f3bba830cccf02212892 --- boot/boot-image-profile-extra.txt | 4 ++++ .../android/os/ConcurrentMessageQueue/MessageQueue.java | 7 +++++++ core/java/android/os/LegacyMessageQueue/MessageQueue.java | 4 ++++ core/java/android/os/LockedMessageQueue/MessageQueue.java | 7 +++++++ .../os/SemiConcurrentMessageQueue/MessageQueue.java | 7 +++++++ 5 files changed, 29 insertions(+) diff --git a/boot/boot-image-profile-extra.txt b/boot/boot-image-profile-extra.txt index e3b187e0a66d..11ca1dcc181e 100644 --- a/boot/boot-image-profile-extra.txt +++ b/boot/boot-image-profile-extra.txt @@ -19,3 +19,7 @@ # methods are latency sensitive is difficult. For example, this method is executed # in the system server, not on the UI thread of an app. HSPLandroid/graphics/Color;->luminance()F + +# For now, compile all methods in MessageQueue to avoid performance cliffs for +# flagged/evolving hot code paths. See: b/338098106 +HSPLandroid/os/MessageQueue;->* diff --git a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java index b2d926044869..adf7966f1ec9 100644 --- a/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java +++ b/core/java/android/os/ConcurrentMessageQueue/MessageQueue.java @@ -29,6 +29,8 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import dalvik.annotation.optimization.NeverCompile; + import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1331,6 +1333,7 @@ public final class MessageQueue { mMatchAllFutureMessages, true); } + @NeverCompile private void printPriorityQueueNodes() { Iterator iterator = mPriorityQueue.iterator(); @@ -1342,6 +1345,7 @@ public final class MessageQueue { } } + @NeverCompile private int dumpPriorityQueue(ConcurrentSkipListSet queue, Printer pw, String prefix, Handler h, int n) { int count = 0; @@ -1357,6 +1361,7 @@ public final class MessageQueue { return count; } + @NeverCompile void dump(Printer pw, String prefix, Handler h) { long now = SystemClock.uptimeMillis(); int n = 0; @@ -1387,6 +1392,7 @@ public final class MessageQueue { + ", quitting=" + (boolean) sQuitting.getVolatile(this) + ")"); } + @NeverCompile private int dumpPriorityQueue(ConcurrentSkipListSet queue, ProtoOutputStream proto) { int count = 0; @@ -1399,6 +1405,7 @@ public final class MessageQueue { return count; } + @NeverCompile void dumpDebug(ProtoOutputStream proto, long fieldId) { final long messageQueueToken = proto.start(fieldId); diff --git a/core/java/android/os/LegacyMessageQueue/MessageQueue.java b/core/java/android/os/LegacyMessageQueue/MessageQueue.java index 4474e7e91fdc..9f7b0b71ae95 100644 --- a/core/java/android/os/LegacyMessageQueue/MessageQueue.java +++ b/core/java/android/os/LegacyMessageQueue/MessageQueue.java @@ -28,6 +28,8 @@ import android.util.Printer; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; +import dalvik.annotation.optimization.NeverCompile; + import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1106,6 +1108,7 @@ public final class MessageQueue { } } + @NeverCompile void dump(Printer pw, String prefix, Handler h) { synchronized (this) { pw.println(prefix + "(MessageQueue is using Legacy implementation)"); @@ -1122,6 +1125,7 @@ public final class MessageQueue { } } + @NeverCompile void dumpDebug(ProtoOutputStream proto, long fieldId) { final long messageQueueToken = proto.start(fieldId); synchronized (this) { diff --git a/core/java/android/os/LockedMessageQueue/MessageQueue.java b/core/java/android/os/LockedMessageQueue/MessageQueue.java index f1affce58a5c..f3eec13cb20f 100644 --- a/core/java/android/os/LockedMessageQueue/MessageQueue.java +++ b/core/java/android/os/LockedMessageQueue/MessageQueue.java @@ -30,6 +30,8 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import dalvik.annotation.optimization.NeverCompile; + import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -294,6 +296,7 @@ public final class MessageQueue { * Keep this for manual debugging. It's easier to pepper the code with this function * than MessageQueue.dump() */ + @NeverCompile void print() { Log.v(TAG, "heap num elem: " + mNumElements + " mHeap.length " + mHeap.length); for (int i = 0; i < mNumElements; i++) { @@ -1209,6 +1212,7 @@ public final class MessageQueue { sMatchAllFutureMessages, true); } + @NeverCompile int dumpPriorityQueue(Printer pw, String prefix, Handler h, MessageHeap priorityQueue) { int n = 0; long now = SystemClock.uptimeMillis(); @@ -1222,6 +1226,7 @@ public final class MessageQueue { return n; } + @NeverCompile void dumpPriorityQueue(ProtoOutputStream proto, MessageHeap priorityQueue) { for (int i = 0; i < priorityQueue.numElements(); i++) { Message m = priorityQueue.getMessageAt(i); @@ -1229,6 +1234,7 @@ public final class MessageQueue { } } + @NeverCompile void dump(Printer pw, String prefix, Handler h) { synchronized (this) { pw.println(prefix + "(MessageQueue is using Locked implementation)"); @@ -1240,6 +1246,7 @@ public final class MessageQueue { } } + @NeverCompile void dumpDebug(ProtoOutputStream proto, long fieldId) { final long messageQueueToken = proto.start(fieldId); synchronized (this) { diff --git a/core/java/android/os/SemiConcurrentMessageQueue/MessageQueue.java b/core/java/android/os/SemiConcurrentMessageQueue/MessageQueue.java index 80c24a9003e8..f45bc42b865f 100644 --- a/core/java/android/os/SemiConcurrentMessageQueue/MessageQueue.java +++ b/core/java/android/os/SemiConcurrentMessageQueue/MessageQueue.java @@ -29,6 +29,8 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.annotations.GuardedBy; +import dalvik.annotation.optimization.NeverCompile; + import java.io.FileDescriptor; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1249,6 +1251,7 @@ public final class MessageQueue { mMatchAllFutureMessages, true); } + @NeverCompile private void printPriorityQueueNodes() { Iterator iterator = mPriorityQueue.iterator(); @@ -1260,6 +1263,7 @@ public final class MessageQueue { } } + @NeverCompile private int dumpPriorityQueue(PriorityQueue queue, Printer pw, String prefix, Handler h, int n) { int count = 0; @@ -1275,6 +1279,7 @@ public final class MessageQueue { return count; } + @NeverCompile void dump(Printer pw, String prefix, Handler h) { long now = SystemClock.uptimeMillis(); int n = 0; @@ -1307,6 +1312,7 @@ public final class MessageQueue { + ", quitting=" + (boolean) sQuitting.getVolatile(this) + ")"); } + @NeverCompile private int dumpPriorityQueue(PriorityQueue queue, ProtoOutputStream proto) { int count = 0; @@ -1318,6 +1324,7 @@ public final class MessageQueue { return count; } + @NeverCompile void dumpDebug(ProtoOutputStream proto, long fieldId) { final long messageQueueToken = proto.start(fieldId); -- GitLab From f7eba82552d9d064cc794aa035098d1d59c17167 Mon Sep 17 00:00:00 2001 From: Jared Duke Date: Fri, 4 Oct 2024 22:51:27 +0000 Subject: [PATCH 080/459] Integrate system feature codegen into SystemServer + framework Reroute feature queries in SystemServer init for the following APIS: * hasFeatureWatch * hasFeatureAutomotive * hasFeatureEmbedded Also handle related queries in ApplicationPackageManager for such features. The current codegen is a no-op with respect to this behavior as RELEASE_USE_SYSTEM_FEATURE_BUILD_FLAGS is flagged as off, and these features are not yet defined at compile time. A follow-up change will refactor additional feature types and queries to use the new helper API, with some supportive lint checks where appropriate. This usage remains restricted to internal platform targets. Bug: 203143243 Test: atest FrameworksServicesTests FrameworksCoreTests Flag: build.RELEASE_USE_SYSTEM_FEATURE_BUILD_FLAGS Change-Id: I3d82c9d775b23106238dd4bb067d69465332de85 --- core/java/android/app/ApplicationPackageManager.java | 11 +++++++++++ services/java/com/android/server/SystemServer.java | 10 ++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 5956e2bde242..7a9553258006 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -129,6 +129,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.Immutable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.SomeArgs; +import com.android.internal.pm.RoSystemFeatures; import com.android.internal.util.UserIcons; import dalvik.system.VMRuntime; @@ -818,6 +819,16 @@ public class ApplicationPackageManager extends PackageManager { @Override public Boolean recompute(HasSystemFeatureQuery query) { try { + // As an optimization, check first to see if the feature was defined at + // compile-time as either available or unavailable. + // TODO(b/203143243): Consider hoisting this optimization out of the cache + // after the trunk stable (build) flag has soaked and more features are + // defined at compile-time. + Boolean maybeHasSystemFeature = + RoSystemFeatures.maybeHasFeature(query.name, query.version); + if (maybeHasSystemFeature != null) { + return maybeHasSystemFeature.booleanValue(); + } return ActivityThread.currentActivityThread().getPackageManager(). hasSystemFeature(query.name, query.version); } catch (RemoteException e) { diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index b676fa2455b1..cae941f98abf 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -104,6 +104,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.notification.SystemNotificationChannels; import com.android.internal.os.BinderInternal; import com.android.internal.os.RuntimeInit; +import com.android.internal.pm.RoSystemFeatures; import com.android.internal.policy.AttributeCache; import com.android.internal.util.ConcurrentUtils; import com.android.internal.util.EmergencyAffordanceManager; @@ -1465,8 +1466,7 @@ public final class SystemServer implements Dumpable { boolean disableCameraService = SystemProperties.getBoolean("config.disable_cameraservice", false); - boolean isWatch = context.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_WATCH); + boolean isWatch = RoSystemFeatures.hasFeatureWatch(context); boolean isArc = context.getPackageManager().hasSystemFeature( "org.chromium.arc"); @@ -2708,7 +2708,7 @@ public final class SystemServer implements Dumpable { t.traceEnd(); } - if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_EMBEDDED)) { + if (RoSystemFeatures.hasFeatureEmbedded(context)) { t.traceBegin("StartIoTSystemService"); mSystemServiceManager.startService(IOT_SERVICE_CLASS); t.traceEnd(); @@ -3077,9 +3077,7 @@ public final class SystemServer implements Dumpable { }, WEBVIEW_PREPARATION); } - boolean isAutomotive = mPackageManager - .hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE); - if (isAutomotive) { + if (RoSystemFeatures.hasFeatureAutomotive(context)) { t.traceBegin("StartCarServiceHelperService"); final SystemService cshs = mSystemServiceManager .startService(CAR_SERVICE_HELPER_SERVICE_CLASS); -- GitLab From bddee3a49c094ce954bec7891e0fca8075477755 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Thu, 17 Oct 2024 15:16:21 -0700 Subject: [PATCH 081/459] Fix initialization of display stats on multi-screen devices Bug: 363857767 Test: atest PowerStatsTests // on a foldable device Flag: EXEMPT_bugfix Change-Id: Ie2ac98755f70f5bc3477e1b48ee758d20adbf9ad --- .../internal/os/LongArrayMultiStateCounter.java | 9 +++++++-- .../android/server/power/stats/BatteryStatsImpl.java | 3 --- .../processor/AmbientDisplayPowerStatsProcessor.java | 12 +++++++----- .../stats/processor/ScreenPowerStatsProcessor.java | 9 +++++---- .../server/power/stats/MockBatteryStatsImpl.java | 9 ++++++++- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/core/java/com/android/internal/os/LongArrayMultiStateCounter.java b/core/java/com/android/internal/os/LongArrayMultiStateCounter.java index dfb2884044f5..489721fbc10e 100644 --- a/core/java/com/android/internal/os/LongArrayMultiStateCounter.java +++ b/core/java/com/android/internal/os/LongArrayMultiStateCounter.java @@ -105,7 +105,7 @@ public final class LongArrayMultiStateCounter implements Parcelable { public void setValues(long[] array) { if (array.length != mLength) { throw new IllegalArgumentException( - "Invalid array length: " + mLength + ", expected: " + mLength); + "Invalid array length: " + array.length + ", expected: " + mLength); } native_setValues(mNativeObject, array); } @@ -116,7 +116,7 @@ public final class LongArrayMultiStateCounter implements Parcelable { public void getValues(long[] array) { if (array.length != mLength) { throw new IllegalArgumentException( - "Invalid array length: " + mLength + ", expected: " + mLength); + "Invalid array length: " + array.length + ", expected: " + mLength); } native_getValues(mNativeObject, array); } @@ -347,6 +347,11 @@ public final class LongArrayMultiStateCounter implements Parcelable { throw new IllegalArgumentException( "State: " + state + ", outside the range: [0-" + mStateCount + "]"); } + if (longArrayContainer.mLength != mLength) { + throw new IllegalArgumentException( + "Invalid array length: " + longArrayContainer.mLength + + ", expected: " + mLength); + } native_getCounts(mNativeObject, longArrayContainer.mNativeObject, state); } diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 936fadf0b12a..f9baf88d797a 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -11479,9 +11479,6 @@ public class BatteryStatsImpl extends BatteryStats { mOnBatteryTimeBase); } - mPerDisplayBatteryStats = new DisplayBatteryStats[1]; - mPerDisplayBatteryStats[0] = new DisplayBatteryStats(mClock, mOnBatteryTimeBase); - mInteractiveTimer = new StopwatchTimer(mClock, null, -10, null, mOnBatteryTimeBase); mPowerSaveModeEnabledTimer = new StopwatchTimer(mClock, null, -2, null, mOnBatteryTimeBase); diff --git a/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java index 32dfdf915bca..5f93bdf07f47 100644 --- a/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/AmbientDisplayPowerStatsProcessor.java @@ -50,12 +50,14 @@ class AmbientDisplayPowerStatsProcessor extends PowerStatsProcessor { return; } - if (mScreenPowerStatsDescriptor == null) { - mScreenPowerStatsDescriptor = screenStats.getPowerStatsDescriptor(); - if (mScreenPowerStatsDescriptor == null) { - return; - } + PowerStats.Descriptor screenDescriptor = screenStats.getPowerStatsDescriptor(); + if (screenDescriptor == null) { + return; + } + if (mScreenPowerStatsDescriptor == null + || !mScreenPowerStatsDescriptor.equals(screenDescriptor)) { + mScreenPowerStatsDescriptor = screenDescriptor; mScreenPowerStatsLayout = new ScreenPowerStatsLayout(mScreenPowerStatsDescriptor); mTmpScreenStats = new long[mScreenPowerStatsDescriptor.statsArrayLength]; } diff --git a/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java index b295e309d4fb..8e7498f38fcb 100644 --- a/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/ScreenPowerStatsProcessor.java @@ -89,14 +89,15 @@ class ScreenPowerStatsProcessor extends PowerStatsProcessor { return true; } - mLastUsedDescriptor = descriptor; - mStatsLayout = new ScreenPowerStatsLayout(descriptor); - if (mStatsLayout.getDisplayCount() != mDisplayCount) { - Slog.e(TAG, "Incompatible number of displays: " + mStatsLayout.getDisplayCount() + ScreenPowerStatsLayout statsLayout = new ScreenPowerStatsLayout(descriptor); + if (statsLayout.getDisplayCount() != mDisplayCount) { + Slog.e(TAG, "Incompatible number of displays: " + statsLayout.getDisplayCount() + ", expected: " + mDisplayCount); return false; } + mLastUsedDescriptor = descriptor; + mStatsLayout = statsLayout; mTmpDeviceStatsArray = new long[descriptor.statsArrayLength]; mTmpUidStatsArray = new long[descriptor.uidStatsArrayLength]; return true; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java index 2c03f9d1a9aa..c2ddc0a25e9a 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/MockBatteryStatsImpl.java @@ -17,6 +17,7 @@ package com.android.server.power.stats; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.app.usage.NetworkStatsManager; @@ -81,7 +82,7 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { Handler handler, PowerStatsUidResolver powerStatsUidResolver) { super(config, clock, new MonotonicClock(0, clock), historyDirectory, handler, mock(PlatformIdleStateCallback.class), mock(EnergyStatsRetriever.class), - mock(UserInfoProvider.class), mock(PowerProfile.class), + mock(UserInfoProvider.class), mockPowerProfile(), new CpuScalingPolicies(new SparseArray<>(), new SparseArray<>()), powerStatsUidResolver, mock(FrameworkStatsLogger.class), mock(BatteryStatsHistory.TraceDelegate.class), @@ -97,6 +98,12 @@ public class MockBatteryStatsImpl extends BatteryStatsImpl { mKernelWakelockReader = null; } + private static PowerProfile mockPowerProfile() { + PowerProfile powerProfile = mock(PowerProfile.class); + when(powerProfile.getNumDisplays()).thenReturn(1); + return powerProfile; + } + public void initMeasuredEnergyStats(String[] customBucketNames) { final boolean[] supportedStandardBuckets = new boolean[EnergyConsumerStats.NUMBER_STANDARD_POWER_BUCKETS]; -- GitLab From 9835370d0faab117693c1c804c200e995d880919 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Fri, 4 Oct 2024 14:28:06 -0700 Subject: [PATCH 082/459] Consistently close BatteryUsageStats objects Bug: 371614748 Test: atest PowerStatsTests; atest PowerStatsTestRavenwood Flag: EXEMPT_bugfix Change-Id: Ibdd49c3dccb899330d6bd05c311669cac281fb06 --- core/java/android/os/BatteryUsageStats.java | 62 ++++++++++++++++++- .../server/am/BatteryStatsService.java | 15 +++-- .../AccumulatedBatteryUsageStatsSection.java | 5 ++ .../stats/BatteryUsageStatsProvider.java | 42 +++++++------ .../power/stats/BatteryUsageStatsSection.java | 11 ++++ .../server/power/stats/PowerStatsSpan.java | 15 ++++- .../server/power/stats/PowerStatsStore.java | 7 ++- .../stats/processor/PowerStatsExporter.java | 26 ++++---- .../power/stats/BatteryStatsImplTest.java | 2 + .../power/stats/BatteryStatsManagerTest.java | 4 +- .../stats/BatteryUsageStatsAtomTest.java | 11 +++- .../stats/BatteryUsageStatsProviderTest.java | 36 ++++++++--- .../power/stats/BatteryUsageStatsRule.java | 13 ++++ .../power/stats/BatteryUsageStatsTest.java | 40 +++++++++--- 14 files changed, 223 insertions(+), 66 deletions(-) diff --git a/core/java/android/os/BatteryUsageStats.java b/core/java/android/os/BatteryUsageStats.java index ddcb5c60ab80..6c3c2852c7e7 100644 --- a/core/java/android/os/BatteryUsageStats.java +++ b/core/java/android/os/BatteryUsageStats.java @@ -24,6 +24,8 @@ import android.util.Range; import android.util.SparseArray; import android.util.proto.ProtoOutputStream; +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BatteryStatsHistory; import com.android.internal.os.BatteryStatsHistoryIterator; import com.android.internal.os.MonotonicClock; @@ -43,7 +45,9 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Contains a snapshot of battery attribution data, on a per-subsystem and per-UID basis. @@ -126,6 +130,12 @@ public final class BatteryUsageStats implements Parcelable, Closeable { // Max window size. CursorWindow uses only as much memory as needed. private static final long BATTERY_CONSUMER_CURSOR_WINDOW_SIZE = 20_000_000; // bytes + /** + * Used by tests to ensure all BatteryUsageStats instances are closed. + */ + @VisibleForTesting + public static boolean DEBUG_INSTANCE_COUNT; + private static final int STATSD_PULL_ATOM_MAX_BYTES = 45000; private static final int[] UID_USAGE_TIME_PROCESS_STATES = { @@ -153,7 +163,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { private final List mUserBatteryConsumers; private final AggregateBatteryConsumer[] mAggregateBatteryConsumers; private final BatteryStatsHistory mBatteryStatsHistory; - private BatteryConsumer.BatteryConsumerDataLayout mBatteryConsumerDataLayout; + private final BatteryConsumer.BatteryConsumerDataLayout mBatteryConsumerDataLayout; private CursorWindow mBatteryConsumersCursorWindow; private BatteryUsageStats(@NonNull Builder builder) { @@ -873,6 +883,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { @Override public void close() throws IOException { + onCursorWindowReleased(mBatteryConsumersCursorWindow); mBatteryConsumersCursorWindow.close(); mBatteryConsumersCursorWindow = null; } @@ -880,6 +891,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { @Override protected void finalize() throws Throwable { if (mBatteryConsumersCursorWindow != null) { + // Do not decrement sOpenCusorWindowCount. All instances should be closed explicitly mBatteryConsumersCursorWindow.close(); } super.finalize(); @@ -934,6 +946,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { boolean includesPowerStateData, double minConsumedPowerThreshold) { mBatteryConsumersCursorWindow = new CursorWindow(null, BATTERY_CONSUMER_CURSOR_WINDOW_SIZE); + onCursorWindowAllocated(mBatteryConsumersCursorWindow); mBatteryConsumerDataLayout = BatteryConsumer.createBatteryConsumerDataLayout( customPowerComponentNames, includePowerModels, includeProcessStateData, includeScreenStateData, includesPowerStateData); @@ -996,6 +1009,7 @@ public final class BatteryUsageStats implements Parcelable, Closeable { */ public void discard() { mBatteryConsumersCursorWindow.close(); + onCursorWindowReleased(mBatteryConsumersCursorWindow); } /** @@ -1264,4 +1278,50 @@ public final class BatteryUsageStats implements Parcelable, Closeable { } } } + + @GuardedBy("BatteryUsageStats.class") + private static Map sInstances; + + private static void onCursorWindowAllocated(CursorWindow window) { + if (!DEBUG_INSTANCE_COUNT) { + return; + } + + synchronized (BatteryUsageStats.class) { + if (sInstances == null) { + sInstances = new HashMap<>(); + } + sInstances.put(window, new Exception()); + } + } + + private static void onCursorWindowReleased(CursorWindow window) { + if (!DEBUG_INSTANCE_COUNT) { + return; + } + + synchronized (BatteryUsageStats.class) { + sInstances.remove(window); + } + } + + /** + * Used by tests to ensure all BatteryUsageStats instances are closed. + */ + @VisibleForTesting + public static void assertAllInstancesClosed() { + if (!DEBUG_INSTANCE_COUNT) { + throw new IllegalStateException("DEBUG_INSTANCE_COUNT is false"); + } + + synchronized (BatteryUsageStats.class) { + if (!sInstances.isEmpty()) { + Exception callSite = sInstances.entrySet().iterator().next().getValue(); + int count = sInstances.size(); + sInstances.clear(); + throw new IllegalStateException( + "Instances of BatteryUsageStats not closed: " + count, callSite); + } + } + } } diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c47cad955202..28b606c931fa 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -3178,12 +3178,15 @@ public final class BatteryStatsService extends IBatteryStats.Stub mStats.collectPowerStatsSamples(); } - BatteryUsageStats batteryUsageStats = - mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query); - if (proto) { - batteryUsageStats.dumpToProto(fd); - } else { - batteryUsageStats.dump(pw, " "); + try (BatteryUsageStats batteryUsageStats = + mBatteryUsageStatsProvider.getBatteryUsageStats(mStats, query)) { + if (proto) { + batteryUsageStats.dumpToProto(fd); + } else { + batteryUsageStats.dump(pw, " "); + } + } catch (IOException e) { + Slog.e(TAG, "Cannot close BatteryUsageStats", e); } } diff --git a/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java b/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java index dd6d5dbf753c..c0a06fcfdeaa 100644 --- a/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java +++ b/services/core/java/com/android/server/power/stats/AccumulatedBatteryUsageStatsSection.java @@ -51,6 +51,11 @@ class AccumulatedBatteryUsageStatsSection extends PowerStatsSpan.Section { mBatteryUsageStats.build().dump(ipw, ""); } + @Override + public void close() { + mBatteryUsageStats.discard(); + } + static class Reader implements PowerStatsSpan.SectionReader { @Override public String getType() { diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index 265f1dfce90f..b996c43d3dd5 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -295,7 +295,8 @@ public class BatteryUsageStatsProvider { stats.builder = ((AccumulatedBatteryUsageStatsSection) section) .getBatteryUsageStatsBuilder(); stats.startWallClockTime = powerStatsSpan.getMetadata().getStartTime(); - stats.startMonotonicTime = powerStatsSpan.getMetadata().getStartMonotonicTime(); + stats.startMonotonicTime = + powerStatsSpan.getMetadata().getStartMonotonicTime(); stats.endMonotonicTime = powerStatsSpan.getMetadata().getEndMonotonicTime(); break; } @@ -484,29 +485,30 @@ public class BatteryUsageStatsProvider { continue; } - PowerStatsSpan powerStatsSpan = mPowerStatsStore.loadPowerStatsSpan( - spanMetadata.getId(), BatteryUsageStatsSection.TYPE); - if (powerStatsSpan == null) { - continue; - } - - for (PowerStatsSpan.Section section : powerStatsSpan.getSections()) { - BatteryUsageStats snapshot = - ((BatteryUsageStatsSection) section).getBatteryUsageStats(); - if (!Arrays.equals(snapshot.getCustomPowerComponentNames(), - customEnergyConsumerNames)) { - Log.w(TAG, "Ignoring older BatteryUsageStats snapshot, which has different " - + "custom power components: " - + Arrays.toString(snapshot.getCustomPowerComponentNames())); + try (PowerStatsSpan powerStatsSpan = mPowerStatsStore.loadPowerStatsSpan( + spanMetadata.getId(), BatteryUsageStatsSection.TYPE)) { + if (powerStatsSpan == null) { continue; } - if (includeProcessStateData && !snapshot.isProcessStateDataIncluded()) { - Log.w(TAG, "Ignoring older BatteryUsageStats snapshot, which " - + " does not include process state data"); - continue; + for (PowerStatsSpan.Section section : powerStatsSpan.getSections()) { + BatteryUsageStats snapshot = + ((BatteryUsageStatsSection) section).getBatteryUsageStats(); + if (!Arrays.equals(snapshot.getCustomPowerComponentNames(), + customEnergyConsumerNames)) { + Log.w(TAG, "Ignoring older BatteryUsageStats snapshot, which has different " + + "custom power components: " + + Arrays.toString(snapshot.getCustomPowerComponentNames())); + continue; + } + + if (includeProcessStateData && !snapshot.isProcessStateDataIncluded()) { + Log.w(TAG, "Ignoring older BatteryUsageStats snapshot, which " + + " does not include process state data"); + continue; + } + builder.add(snapshot); } - builder.add(snapshot); } } return builder.build(); diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java index af3652475376..eb896e9d4eee 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsSection.java @@ -18,6 +18,7 @@ package com.android.server.power.stats; import android.os.BatteryUsageStats; import android.util.IndentingPrintWriter; +import android.util.Slog; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; @@ -28,6 +29,7 @@ import java.io.IOException; class BatteryUsageStatsSection extends PowerStatsSpan.Section { public static final String TYPE = "battery-usage-stats"; + private static final String TAG = "BatteryUsageStatsSection"; private final BatteryUsageStats mBatteryUsageStats; @@ -50,6 +52,15 @@ class BatteryUsageStatsSection extends PowerStatsSpan.Section { mBatteryUsageStats.dump(ipw, ""); } + @Override + public void close() { + try { + mBatteryUsageStats.close(); + } catch (IOException e) { + Slog.e(TAG, "Closing BatteryUsageStats", e); + } + } + static class Reader implements PowerStatsSpan.SectionReader { @Override public String getType() { diff --git a/services/core/java/com/android/server/power/stats/PowerStatsSpan.java b/services/core/java/com/android/server/power/stats/PowerStatsSpan.java index 5105272e6980..4f560cf68f8e 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsSpan.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsSpan.java @@ -51,7 +51,7 @@ import java.util.Set; /** * Contains power stats of various kinds, aggregated over a time span. */ -public class PowerStatsSpan { +public class PowerStatsSpan implements AutoCloseable { private static final String TAG = "PowerStatsStore"; /** @@ -321,6 +321,13 @@ public class PowerStatsSpan { public void dump(IndentingPrintWriter ipw) { ipw.println(mType); } + + /** + * Closes the section, releasing any resources it held. Once closed, the Section + * should not be used. + */ + public void close() { + } } /** @@ -484,4 +491,10 @@ public class PowerStatsSpan { ipw.decreaseIndent(); } } + @Override + public void close() { + for (int i = 0; i < mSections.size(); i++) { + mSections.get(i).close(); + } + } } diff --git a/services/core/java/com/android/server/power/stats/PowerStatsStore.java b/services/core/java/com/android/server/power/stats/PowerStatsStore.java index 3673617f6104..d83d355fce31 100644 --- a/services/core/java/com/android/server/power/stats/PowerStatsStore.java +++ b/services/core/java/com/android/server/power/stats/PowerStatsStore.java @@ -331,9 +331,10 @@ public class PowerStatsStore { ipw.increaseIndent(); List contents = getTableOfContents(); for (PowerStatsSpan.Metadata metadata : contents) { - PowerStatsSpan span = loadPowerStatsSpan(metadata.getId()); - if (span != null) { - span.dump(ipw); + try (PowerStatsSpan span = loadPowerStatsSpan(metadata.getId())) { + if (span != null) { + span.dump(ipw); + } } } ipw.decreaseIndent(); diff --git a/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java index c8170a1982bb..b2442c81b2e5 100644 --- a/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java +++ b/services/core/java/com/android/server/power/stats/processor/PowerStatsExporter.java @@ -105,19 +105,19 @@ class PowerStatsExporter { maxEndTime = spanMaxTime; } - PowerStatsSpan span = mPowerStatsStore.loadPowerStatsSpan(metadata.getId(), - AggregatedPowerStatsSection.TYPE); - if (span == null) { - Slog.e(TAG, "Could not read PowerStatsStore section " + metadata); - continue; - } - List sections = span.getSections(); - for (int k = 0; k < sections.size(); k++) { - hasStoredSpans = true; - PowerStatsSpan.Section section = sections.get(k); - populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder, - ((AggregatedPowerStatsSection) section).getAggregatedPowerStats()); - // TODO(b/371614748): close the builder + try (PowerStatsSpan span = mPowerStatsStore.loadPowerStatsSpan(metadata.getId(), + AggregatedPowerStatsSection.TYPE)) { + if (span == null) { + Slog.e(TAG, "Could not read PowerStatsStore section " + metadata); + continue; + } + List sections = span.getSections(); + for (int k = 0; k < sections.size(); k++) { + hasStoredSpans = true; + PowerStatsSpan.Section section = sections.get(k); + populateBatteryUsageStatsBuilder(batteryUsageStatsBuilder, + ((AggregatedPowerStatsSection) section).getAggregatedPowerStats()); + } } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java index 177f30a79ebc..0a1fc3184fca 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsImplTest.java @@ -987,5 +987,7 @@ public class BatteryStatsImplTest { BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE) .getUsageDurationMillis(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) .isEqualTo(60000); + + span.close(); } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsManagerTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsManagerTest.java index 9a64ce19254b..94997b29cdd5 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsManagerTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryStatsManagerTest.java @@ -41,7 +41,7 @@ public class BatteryStatsManagerTest { public final RavenwoodRule mRavenwood = new RavenwoodRule(); @Test - public void testBatteryUsageStatsDataConsistency() { + public void testBatteryUsageStatsDataConsistency() throws Exception { BatteryStatsManager bsm = getContext().getSystemService(BatteryStatsManager.class); BatteryUsageStats stats = bsm.getBatteryUsageStats( new BatteryUsageStatsQuery.Builder().setMaxStatsAgeMs( @@ -70,5 +70,7 @@ public class BatteryStatsManagerTest { } } } + + stats.close(); } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java index 7d2bc178b993..813dd841b2b9 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsAtomTest.java @@ -64,7 +64,7 @@ public class BatteryUsageStatsAtomTest { private static final int UID_3 = 4000; @Test - public void testAtom_BatteryUsageStatsPerUid() { + public void testAtom_BatteryUsageStatsPerUid() throws Exception { final BatteryUsageStats bus = buildBatteryUsageStats(); BatteryStatsService.FrameworkStatsLogger statsLogger = mock(BatteryStatsService.FrameworkStatsLogger.class); @@ -72,6 +72,8 @@ public class BatteryUsageStatsAtomTest { List actual = new ArrayList<>(); new BatteryStatsService.StatsPerUidLogger(statsLogger).logStats(bus, actual); + bus.close(); + if (DEBUG) { System.out.println(mockingDetails(statsLogger).printInvocations()); } @@ -284,7 +286,7 @@ public class BatteryUsageStatsAtomTest { } @Test - public void testAtom_BatteryUsageStatsAtomsProto() { + public void testAtom_BatteryUsageStatsAtomsProto() throws Exception { final BatteryUsageStats bus = buildBatteryUsageStats(); final byte[] bytes = bus.getStatsProto(); BatteryUsageStatsAtomsProto proto; @@ -347,6 +349,7 @@ public class BatteryUsageStatsAtomTest { // UID_3 - Should be none, since no interesting data (done last for debugging convenience). assertEquals(3, proto.uidBatteryConsumers.length); + bus.close(); } private void assertSameBatteryConsumer(String message, BatteryConsumer consumer, @@ -582,7 +585,7 @@ public class BatteryUsageStatsAtomTest { } @Test - public void testLargeAtomTruncated() { + public void testLargeAtomTruncated() throws Exception { final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[0], true, false, false, false, 0); // If not truncated, this BatteryUsageStats object would generate a proto buffer @@ -618,6 +621,8 @@ public class BatteryUsageStatsAtomTest { assertThat(bytes.length).isGreaterThan(20000); assertThat(bytes.length).isLessThan(50000); + batteryUsageStats.close(); + BatteryUsageStatsAtomsProto proto; try { proto = BatteryUsageStatsAtomsProto.parseFrom(bytes); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java index e9d95fcbccea..87a26d0c68e7 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java @@ -94,7 +94,7 @@ public class BatteryUsageStatsProviderTest { } @Test - public void test_getBatteryUsageStats() { + public void test_getBatteryUsageStats() throws IOException { final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false); final List uidBatteryConsumers = @@ -121,24 +121,27 @@ public class BatteryUsageStatsProviderTest { assertThat(batteryUsageStats.getStatsStartTimestamp()).isEqualTo(12345); assertThat(batteryUsageStats.getStatsEndTimestamp()).isEqualTo(180 * MINUTE_IN_MS); + batteryUsageStats.close(); } @Test - public void batteryLevelInfo_charging() { + public void batteryLevelInfo_charging() throws IOException { final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(true); assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0); assertThat(batteryUsageStats.getChargeTimeRemainingMs()).isEqualTo(1_200_000); + batteryUsageStats.close(); } @Test - public void batteryLevelInfo_onBattery() { + public void batteryLevelInfo_onBattery() throws IOException { final BatteryUsageStats batteryUsageStats = prepareBatteryUsageStats(false); assertThat(batteryUsageStats.getBatteryCapacity()).isEqualTo(4000.0); assertThat(batteryUsageStats.getBatteryTimeRemainingMs()).isEqualTo(600_000); + batteryUsageStats.close(); } @Test - public void test_selectPowerComponents() { + public void test_selectPowerComponents() throws IOException { BatteryStatsImpl batteryStats = prepareBatteryStats(false); BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, @@ -163,6 +166,8 @@ public class BatteryUsageStatsProviderTest { assertThat( uidBatteryConsumer.getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) .isEqualTo(0); + + batteryUsageStats.close(); } private BatteryStatsImpl prepareBatteryStats(boolean plugInAtTheEnd) { @@ -274,7 +279,7 @@ public class BatteryUsageStatsProviderTest { } @Test - public void testWriteAndReadHistory() { + public void testWriteAndReadHistory() throws IOException { MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); synchronized (batteryStats) { batteryStats.setRecordAllHistoryLocked(true); @@ -306,6 +311,8 @@ public class BatteryUsageStatsProviderTest { Parcel in = Parcel.obtain(); batteryUsageStats.writeToParcel(in, 0); + batteryUsageStats.close(); + final byte[] bytes = in.marshall(); Parcel out = Parcel.obtain(); @@ -349,10 +356,12 @@ public class BatteryUsageStatsProviderTest { assertThat(iterator.hasNext()).isFalse(); assertThat(iterator.next()).isNull(); + + unparceled.close(); } @Test - public void testWriteAndReadHistoryTags() { + public void testWriteAndReadHistoryTags() throws IOException { MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); synchronized (batteryStats) { batteryStats.setRecordAllHistoryLocked(true); @@ -400,6 +409,8 @@ public class BatteryUsageStatsProviderTest { assertThat(parcel.dataSize()).isAtMost(128_000); } + batteryUsageStats.close(); + parcel.setDataPosition(0); BatteryUsageStats unparceled = parcel.readParcelable(getClass().getClassLoader(), @@ -461,7 +472,7 @@ public class BatteryUsageStatsProviderTest { } @Test - public void testAggregateBatteryStats() { + public void testAggregateBatteryStats() throws IOException { BatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); setTime(5 * MINUTE_IN_MS); @@ -563,6 +574,8 @@ public class BatteryUsageStatsProviderTest { .getConsumedPower(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT)) .isWithin(0.1) .of(180.0); + + stats.close(); } @Test @@ -689,6 +702,8 @@ public class BatteryUsageStatsProviderTest { .isEqualTo(60 * MINUTE_IN_MS); assertThat(count[0]).isEqualTo(expectedNumberOfUpdates); + + stats.close(); } private void setTime(long timeMs) { @@ -733,6 +748,7 @@ public class BatteryUsageStatsProviderTest { .isWithin(PRECISION).of(8.33333); assertThat(uid.getConsumedPower(componentId1)) .isWithin(PRECISION).of(8.33333); + stats.close(); return null; }).when(powerStatsStore).storeBatteryUsageStatsAsync(anyLong(), any()); @@ -750,7 +766,7 @@ public class BatteryUsageStatsProviderTest { } @Test - public void testAggregateBatteryStats_incompatibleSnapshot() { + public void testAggregateBatteryStats_incompatibleSnapshot() throws IOException { MockBatteryStatsImpl batteryStats = mStatsRule.getBatteryStats(); batteryStats.initMeasuredEnergyStats(new String[]{"FOO", "BAR"}); @@ -776,6 +792,8 @@ public class BatteryUsageStatsProviderTest { when(powerStatsStore.loadPowerStatsSpan(1, BatteryUsageStatsSection.TYPE)) .thenReturn(span1); + span1.close(); + BatteryUsageStatsProvider provider = new BatteryUsageStatsProvider(mContext, mock(PowerAttributor.class), mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), powerStatsStore, 0, mMockClock); @@ -787,5 +805,7 @@ public class BatteryUsageStatsProviderTest { assertThat(stats.getCustomPowerComponentNames()) .isEqualTo(batteryStats.getCustomEnergyConsumerNames()); assertThat(stats.getStatsDuration()).isEqualTo(1234); + + stats.close(); } } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java index 52675f6f6cb7..383616eb59eb 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsRule.java @@ -323,6 +323,7 @@ public class BatteryUsageStatsRule implements TestRule { } private void before() { + BatteryUsageStats.DEBUG_INSTANCE_COUNT = true; HandlerThread bgThread = new HandlerThread("bg thread"); bgThread.setUncaughtExceptionHandler((thread, throwable)-> { mThrowable = throwable; @@ -338,6 +339,10 @@ public class BatteryUsageStatsRule implements TestRule { private void after() throws Throwable { waitForBackgroundThread(); + if (mBatteryUsageStats != null) { + mBatteryUsageStats.close(); + } + BatteryUsageStats.assertAllInstancesClosed(); } public void waitForBackgroundThread() throws Throwable { @@ -409,6 +414,14 @@ public class BatteryUsageStatsRule implements TestRule { } BatteryUsageStats apply(BatteryUsageStatsQuery query, PowerCalculator... calculators) { + if (mBatteryUsageStats != null) { + try { + mBatteryUsageStats.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } + mBatteryUsageStats = null; + } final String[] customPowerComponentNames = mBatteryStats.getCustomEnergyConsumerNames(); final boolean includePowerModels = (query.getFlags() & BatteryUsageStatsQuery.FLAG_BATTERY_USAGE_STATS_INCLUDE_POWER_MODELS) != 0; diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java index 88624f28a2e5..1b6b8c49461e 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsTest.java @@ -76,22 +76,25 @@ public class BatteryUsageStatsTest { private static final int APP_UID2 = 314; @Test - public void testBuilder() { + public void testBuilder() throws Exception { BatteryUsageStats batteryUsageStats = buildBatteryUsageStats1(true).build(); assertBatteryUsageStats1(batteryUsageStats, true); + batteryUsageStats.close(); } @Test - public void testBuilder_noProcessStateData() { + public void testBuilder_noProcessStateData() throws Exception { BatteryUsageStats batteryUsageStats = buildBatteryUsageStats1(false).build(); assertBatteryUsageStats1(batteryUsageStats, false); + batteryUsageStats.close(); } @Test - public void testParcelability_smallNumberOfUids() { + public void testParcelability_smallNumberOfUids() throws Exception { final BatteryUsageStats outBatteryUsageStats = buildBatteryUsageStats1(true).build(); final Parcel parcel = Parcel.obtain(); parcel.writeParcelable(outBatteryUsageStats, 0); + outBatteryUsageStats.close(); assertThat(parcel.dataSize()).isLessThan(100000); @@ -101,10 +104,11 @@ public class BatteryUsageStatsTest { parcel.readParcelable(getClass().getClassLoader()); assertThat(inBatteryUsageStats).isNotNull(); assertBatteryUsageStats1(inBatteryUsageStats, true); + inBatteryUsageStats.close(); } @Test - public void testParcelability_largeNumberOfUids() { + public void testParcelability_largeNumberOfUids() throws Exception { final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[0]); @@ -141,22 +145,27 @@ public class BatteryUsageStatsTest { assertThat(uidBatteryConsumer).isNotNull(); assertThat(uidBatteryConsumer.getConsumedPower()).isEqualTo(i * 100); } + inBatteryUsageStats.close(); + outBatteryUsageStats.close(); } @Test - public void testDefaultSessionDuration() { + public void testDefaultSessionDuration() throws Exception { final BatteryUsageStats stats = buildBatteryUsageStats1(true).setStatsDuration(10000).build(); assertThat(stats.getStatsDuration()).isEqualTo(10000); + stats.close(); } @Test - public void testDump() { + public void testDump() throws Exception { final BatteryUsageStats stats = buildBatteryUsageStats1(true).build(); final StringWriter out = new StringWriter(); try (PrintWriter pw = new PrintWriter(out)) { stats.dump(pw, " "); } + stats.close(); + final String dump = out.toString(); assertThat(dump).contains("Capacity: 4000"); @@ -187,12 +196,14 @@ public class BatteryUsageStatsTest { } @Test - public void testDumpNoScreenOrPowerState() { + public void testDumpNoScreenOrPowerState() throws Exception { final BatteryUsageStats stats = buildBatteryUsageStats1(true, false, false).build(); final StringWriter out = new StringWriter(); try (PrintWriter pw = new PrintWriter(out)) { stats.dump(pw, " "); } + stats.close(); + final String dump = out.toString(); assertThat(dump).contains("Capacity: 4000"); @@ -222,7 +233,7 @@ public class BatteryUsageStatsTest { } @Test - public void testAdd() { + public void testAdd() throws Exception { final BatteryUsageStats stats1 = buildBatteryUsageStats1(false).build(); final BatteryUsageStats stats2 = buildBatteryUsageStats2(new String[]{"FOO"}, true).build(); final BatteryUsageStats sum = @@ -261,24 +272,31 @@ public class BatteryUsageStatsTest { assertAggregateBatteryConsumer(sum, BatteryUsageStats.AGGREGATE_BATTERY_CONSUMER_SCOPE_DEVICE, 40211, 40422, 40633, 40844); + stats1.close(); + stats2.close(); + sum.close(); } @Test - public void testAdd_customComponentMismatch() { + public void testAdd_customComponentMismatch() throws Exception { final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[]{"FOO"}, true, true, true, true, 0); final BatteryUsageStats stats = buildBatteryUsageStats2(new String[]{"BAR"}, false).build(); assertThrows(IllegalArgumentException.class, () -> builder.add(stats)); + stats.close(); + builder.discard(); } @Test - public void testAdd_processStateDataMismatch() { + public void testAdd_processStateDataMismatch() throws Exception { final BatteryUsageStats.Builder builder = new BatteryUsageStats.Builder(new String[]{"FOO"}, true, true, true, true, 0); final BatteryUsageStats stats = buildBatteryUsageStats2(new String[]{"FOO"}, false).build(); assertThrows(IllegalArgumentException.class, () -> builder.add(stats)); + stats.close(); + builder.discard(); } @Test @@ -290,12 +308,14 @@ public class BatteryUsageStatsTest { final BatteryUsageStats stats = buildBatteryUsageStats1(true).build(); stats.writeXml(serializer); serializer.endDocument(); + stats.close(); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); TypedXmlPullParser parser = Xml.newBinaryPullParser(); parser.setInput(in, StandardCharsets.UTF_8.name()); final BatteryUsageStats fromXml = BatteryUsageStats.createFromXml(parser); assertBatteryUsageStats1(fromXml, true); + fromXml.close(); } private BatteryUsageStats.Builder buildBatteryUsageStats1(boolean includeUserBatteryConsumer) { -- GitLab From b24eb1940bf233af710eca31dd37a9a27f55bf88 Mon Sep 17 00:00:00 2001 From: Yan Yan Date: Wed, 2 Oct 2024 17:26:55 -0700 Subject: [PATCH 083/459] Replace utility classes This commit replaces utility classes that will no longer be accessible after VCN moves out of the platform Bug: 369703242 Test: atest CtsVcnTestCases && atest FrameworksVcnTests Flag: EXEMPT code refactoring; no functional change Change-Id: Ia5c987c25728a1ef6ac4aeda02e1c9339c2a3af9 --- .../vcn/VcnCellUnderlyingNetworkTemplate.java | 2 +- core/java/android/net/vcn/VcnManager.java | 8 +++---- .../net/vcn/VcnUnderlyingNetworkTemplate.java | 2 +- .../vcn/VcnWifiUnderlyingNetworkTemplate.java | 2 +- .../android/server/VcnManagementService.java | 23 ++++++++++--------- .../vcn/TelephonySubscriptionTracker.java | 2 +- .../core/java/com/android/server/vcn/Vcn.java | 2 +- .../server/vcn/VcnGatewayConnection.java | 2 +- .../server/vcn/VcnNetworkProvider.java | 2 +- .../UnderlyingNetworkController.java | 2 +- .../UnderlyingNetworkEvaluator.java | 2 +- .../UnderlyingNetworkRecord.java | 2 +- 12 files changed, 26 insertions(+), 25 deletions(-) diff --git a/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java index 46cf0163c0e5..c0398ce1fcf1 100644 --- a/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java +++ b/core/java/android/net/vcn/VcnCellUnderlyingNetworkTemplate.java @@ -40,9 +40,9 @@ import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.server.vcn.util.PersistableBundleUtils; diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java index 1c9be6fb4b82..f275714e2cf5 100644 --- a/core/java/android/net/vcn/VcnManager.java +++ b/core/java/android/net/vcn/VcnManager.java @@ -28,13 +28,13 @@ import android.content.Context; import android.content.pm.PackageManager; import android.net.LinkProperties; import android.net.NetworkCapabilities; -import android.os.Binder; import android.os.ParcelUuid; import android.os.RemoteException; import android.os.ServiceSpecificException; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; +import com.android.net.module.util.BinderUtils; import java.io.IOException; import java.lang.annotation.Retention; @@ -711,7 +711,7 @@ public class VcnManager { @Override public void onPolicyChanged() { - Binder.withCleanCallingIdentity( + BinderUtils.withCleanCallingIdentity( () -> mExecutor.execute(() -> mListener.onPolicyChanged())); } } @@ -734,7 +734,7 @@ public class VcnManager { @Override public void onVcnStatusChanged(@VcnStatusCode int statusCode) { - Binder.withCleanCallingIdentity( + BinderUtils.withCleanCallingIdentity( () -> mExecutor.execute(() -> mCallback.onStatusChanged(statusCode))); } @@ -747,7 +747,7 @@ public class VcnManager { @Nullable String exceptionMessage) { final Throwable cause = createThrowableByClassName(exceptionClass, exceptionMessage); - Binder.withCleanCallingIdentity( + BinderUtils.withCleanCallingIdentity( () -> mExecutor.execute( () -> diff --git a/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java index edf2c093bc8b..16114dd135af 100644 --- a/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java +++ b/core/java/android/net/vcn/VcnUnderlyingNetworkTemplate.java @@ -21,10 +21,10 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.os.PersistableBundle; +import android.util.IndentingPrintWriter; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import java.lang.annotation.Retention; diff --git a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java index 2e6b09f032fb..c7b2f188ba96 100644 --- a/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java +++ b/core/java/android/net/vcn/VcnWifiUnderlyingNetworkTemplate.java @@ -29,9 +29,9 @@ import android.net.NetworkCapabilities; import android.net.vcn.VcnUnderlyingNetworkTemplate.MatchCriteria; import android.os.PersistableBundle; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import com.android.internal.annotations.VisibleForTesting; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.vcn.util.PersistableBundleUtils; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java index 947f6b73d32a..51c768b80eff 100644 --- a/services/core/java/com/android/server/VcnManagementService.java +++ b/services/core/java/com/android/server/VcnManagementService.java @@ -75,6 +75,7 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.LocalLog; import android.util.Log; import android.util.Slog; @@ -82,7 +83,7 @@ import android.util.Slog; import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; +import com.android.net.module.util.BinderUtils; import com.android.net.module.util.LocationPermissionChecker; import com.android.net.module.util.PermissionUtils; import com.android.server.vcn.TelephonySubscriptionTracker; @@ -448,7 +449,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { final UserHandle userHandle = UserHandle.getUserHandleForUid(uid); final UserManager userManager = mContext.getSystemService(UserManager.class); - Binder.withCleanCallingIdentity( + BinderUtils.withCleanCallingIdentity( () -> { if (!Objects.equals(userManager.getMainUser(), userHandle)) { throw new SecurityException( @@ -468,7 +469,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { // TODO (b/172619301): Check based on events propagated from CarrierPrivilegesTracker final SubscriptionManager subMgr = mContext.getSystemService(SubscriptionManager.class); final List subscriptionInfos = new ArrayList<>(); - Binder.withCleanCallingIdentity( + BinderUtils.withCleanCallingIdentity( () -> { List subsInGroup = subMgr.getSubscriptionsInGroup(subscriptionGroup); @@ -700,7 +701,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @GuardedBy("mLock") private void notifyAllPolicyListenersLocked() { for (final PolicyListenerBinderDeath policyListener : mRegisteredPolicyListeners.values()) { - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { try { policyListener.mListener.onPolicyChanged(); } catch (RemoteException e) { @@ -715,7 +716,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { @NonNull ParcelUuid subGroup, @VcnStatusCode int statusCode) { for (final VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) { if (isCallbackPermissioned(cbInfo, subGroup)) { - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { try { cbInfo.mCallback.onVcnStatusChanged(statusCode); } catch (RemoteException e) { @@ -795,7 +796,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { enforceManageTestNetworksForTestMode(config); enforceCallingUserAndCarrierPrivilege(subscriptionGroup, opPkgName); - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { synchronized (mLock) { mConfigs.put(subscriptionGroup, config); startOrUpdateVcnLocked(subscriptionGroup, config); @@ -853,7 +854,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { .checkPackage(mDeps.getBinderCallingUid(), opPkgName); enforceCarrierPrivilegeOrProvisioningPackage(subscriptionGroup, opPkgName); - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { synchronized (mLock) { stopAndClearVcnConfigInternalLocked(subscriptionGroup); writeConfigsToDiskLocked(); @@ -991,7 +992,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { android.Manifest.permission.NETWORK_FACTORY, android.Manifest.permission.MANAGE_TEST_NETWORKS); - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { PolicyListenerBinderDeath listenerBinderDeath = new PolicyListenerBinderDeath(listener); synchronized (mLock) { @@ -1018,7 +1019,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { android.Manifest.permission.NETWORK_FACTORY, android.Manifest.permission.MANAGE_TEST_NETWORKS); - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { synchronized (mLock) { PolicyListenerBinderDeath listenerBinderDeath = mRegisteredPolicyListeners.remove(listener.asBinder()); @@ -1082,7 +1083,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { + " MANAGE_TEST_NETWORKS"); } - return Binder.withCleanCallingIdentity(() -> { + return BinderUtils.withCleanCallingIdentity(() -> { // Defensive copy in case this call is in-process and the given NetworkCapabilities // mutates final NetworkCapabilities ncCopy = new NetworkCapabilities(networkCapabilities); @@ -1521,7 +1522,7 @@ public class VcnManagementService extends IVcnManagementService.Stub { // Notify all registered StatusCallbacks for this subGroup for (VcnStatusCallbackInfo cbInfo : mRegisteredStatusCallbacks.values()) { if (isCallbackPermissioned(cbInfo, mSubGroup)) { - Binder.withCleanCallingIdentity(() -> { + BinderUtils.withCleanCallingIdentity(() -> { try { cbInfo.mCallback.onGatewayConnectionError( gatewayConnectionName, diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java index 1e82b8999834..baf84cf4aa8b 100644 --- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java +++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java @@ -40,11 +40,11 @@ import android.telephony.TelephonyManager; import android.telephony.TelephonyManager.CarrierPrivilegesCallback; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper; import java.util.ArrayList; diff --git a/services/core/java/com/android/server/vcn/Vcn.java b/services/core/java/com/android/server/vcn/Vcn.java index 5bc2c2dface9..1fba29779f0f 100644 --- a/services/core/java/com/android/server/vcn/Vcn.java +++ b/services/core/java/com/android/server/vcn/Vcn.java @@ -47,11 +47,11 @@ import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.VcnManagementService.VcnCallback; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; import com.android.server.vcn.util.LogUtils; diff --git a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java index a81ad22ddf4a..189b6089186e 100644 --- a/services/core/java/com/android/server/vcn/VcnGatewayConnection.java +++ b/services/core/java/com/android/server/vcn/VcnGatewayConnection.java @@ -90,11 +90,11 @@ import android.os.SystemClock; import android.provider.Settings; import android.telephony.TelephonyManager; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.State; import com.android.internal.util.StateMachine; import com.android.internal.util.WakeupMessage; diff --git a/services/core/java/com/android/server/vcn/VcnNetworkProvider.java b/services/core/java/com/android/server/vcn/VcnNetworkProvider.java index 31ee2477fa64..78ff432f5423 100644 --- a/services/core/java/com/android/server/vcn/VcnNetworkProvider.java +++ b/services/core/java/com/android/server/vcn/VcnNetworkProvider.java @@ -36,11 +36,11 @@ import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import java.util.Objects; import java.util.Set; diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java index ad5bc7294f85..0b9b677df16a 100644 --- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java +++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkController.java @@ -46,11 +46,11 @@ import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; import com.android.server.vcn.VcnContext; import com.android.server.vcn.routeselection.UnderlyingNetworkEvaluator.NetworkEvaluatorCallback; diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java index 53b0751d196e..448a7ebfffd8 100644 --- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java +++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkEvaluator.java @@ -29,11 +29,11 @@ import android.net.vcn.VcnManager; import android.net.vcn.VcnUnderlyingNetworkTemplate; import android.os.Handler; import android.os.ParcelUuid; +import android.util.IndentingPrintWriter; import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot; import com.android.server.vcn.VcnContext; diff --git a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java index 7ab8e552722a..1945052b92df 100644 --- a/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java +++ b/services/core/java/com/android/server/vcn/routeselection/UnderlyingNetworkRecord.java @@ -22,10 +22,10 @@ import android.annotation.Nullable; import android.net.LinkProperties; import android.net.Network; import android.net.NetworkCapabilities; +import android.util.IndentingPrintWriter; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; -import com.android.internal.util.IndentingPrintWriter; import java.util.Objects; -- GitLab From ba96cccb4fae8038b60708e295e8cc0c68fe8411 Mon Sep 17 00:00:00 2001 From: Yanye Li Date: Sat, 19 Oct 2024 00:41:03 +0000 Subject: [PATCH 084/459] PowerManagerShellCommand: Avoid hardcoded package There's a way to get calling uid's package. Use it to replace currently hardcoded "com.android.shell" Bug:358729339 Change-Id: I971856ed29b7625e1faf984d09c43e2a8e91f37b Test: adb shell cmd power wakeup 10000 Flag: NONE no flag available --- .../power/PowerManagerShellCommand.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/power/PowerManagerShellCommand.java b/services/core/java/com/android/server/power/PowerManagerShellCommand.java index f69a017fc45a..35a69a29d16a 100644 --- a/services/core/java/com/android/server/power/PowerManagerShellCommand.java +++ b/services/core/java/com/android/server/power/PowerManagerShellCommand.java @@ -22,6 +22,8 @@ import android.app.IAlarmListener; import android.app.IAlarmManager; import android.content.Context; import android.content.Intent; +import android.content.pm.PackageManagerInternal; +import android.os.Binder; import android.os.PowerManager; import android.os.PowerManager.WakeLock; import android.os.PowerManagerInternal; @@ -32,6 +34,9 @@ import android.os.SystemClock; import android.util.SparseArray; import android.view.Display; +import com.android.server.LocalServices; +import com.android.server.pm.pkg.AndroidPackage; + import java.io.PrintWriter; import java.util.List; @@ -266,11 +271,18 @@ class PowerManagerShellCommand extends ShellCommand { ServiceManager.getService(Context.ALARM_SERVICE)); } try { - // This command is called by the shell, which has "com.android.shell" as package - // name. - pw.println("Schedule an alarm to wakeup in " - + delayMillis + " ms, on behalf of shell."); - mAlarmManager.set("com.android.shell", + PackageManagerInternal packageManagerInternal = + LocalServices.getService(PackageManagerInternal.class); + AndroidPackage callingPackage = + packageManagerInternal.getPackage(Binder.getCallingUid()); + if (callingPackage == null) { + pw.println("Calling uid " + Binder.getCallingUid() + " is not an android" + + " package. Cannot schedule a delayed wakeup on behalf of it."); + return -1; + } + pw.println("Schedule an alarm to wakeup in " + delayMillis + + " ms, on behalf of " + callingPackage.getPackageName()); + mAlarmManager.set(callingPackage.getPackageName(), AlarmManager.RTC_WAKEUP, wakeUpTime, 0, 0, AlarmManager.FLAG_PRIORITIZE, null, mAlarmListener, "PowerManagerShellCommand", null, null); -- GitLab From dd704c1bb5a18034bc7d0d060d26d569c777e24d Mon Sep 17 00:00:00 2001 From: Nan Wu Date: Sat, 28 Sep 2024 23:45:59 +0000 Subject: [PATCH 085/459] Abort or throw SecurityException if intent redirect detected Consolidate wtf logs for intent redirect prevention and actually abort the start or throw SecurityException. Bug: 368559093 Test: manual test Flag: android.security.prevent_intent_redirect_abort_or_throw_exception Change-Id: I2960fbe99ec7ea8417cf90e32a9194e6f0377574 --- core/java/android/content/Intent.java | 22 +++- .../security/responsible_apis_flags.aconfig | 7 ++ .../server/am/ActivityManagerService.java | 8 +- .../server/wm/ActivityStartController.java | 6 +- .../android/server/wm/ActivityStarter.java | 117 ++++++++++-------- 5 files changed, 99 insertions(+), 61 deletions(-) diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index f71952849872..f79852394f34 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -40,7 +40,10 @@ import android.app.Activity; import android.app.ActivityThread; import android.app.AppGlobals; import android.app.StatusBarManager; +import android.app.compat.CompatChanges; import android.bluetooth.BluetoothDevice; +import android.compat.annotation.ChangeId; +import android.compat.annotation.Overridable; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; import android.content.pm.ApplicationInfo; @@ -670,6 +673,11 @@ import java.util.TimeZone; public class Intent implements Parcelable, Cloneable { private static final String TAG = "Intent"; + /** @hide */ + @ChangeId + @Overridable + public static final long ENABLE_PREVENT_INTENT_REDIRECT = 29076063L; + private static final String ATTR_ACTION = "action"; private static final String TAG_CATEGORIES = "categories"; private static final String ATTR_CATEGORY = "category"; @@ -12240,7 +12248,7 @@ public class Intent implements Parcelable, Cloneable { * @hide */ public void collectExtraIntentKeys() { - if (!preventIntentRedirect()) return; + if (!isPreventIntentRedirectEnabled()) return; if (mExtras != null && !mExtras.isParcelled() && !mExtras.isEmpty()) { for (String key : mExtras.keySet()) { @@ -12257,6 +12265,14 @@ public class Intent implements Parcelable, Cloneable { } } + /** + * @hide + */ + public static boolean isPreventIntentRedirectEnabled() { + return preventIntentRedirect() && CompatChanges.isChangeEnabled( + ENABLE_PREVENT_INTENT_REDIRECT); + } + /** @hide */ public void checkCreatorToken() { if (mExtras == null) return; @@ -12331,7 +12347,7 @@ public class Intent implements Parcelable, Cloneable { out.writeInt(0); } - if (preventIntentRedirect()) { + if (isPreventIntentRedirectEnabled()) { if (mCreatorTokenInfo == null) { out.writeInt(0); } else { @@ -12398,7 +12414,7 @@ public class Intent implements Parcelable, Cloneable { mOriginalIntent = new Intent(in); } - if (preventIntentRedirect()) { + if (isPreventIntentRedirectEnabled()) { if (in.readInt() != 0) { mCreatorTokenInfo = new CreatorTokenInfo(); mCreatorTokenInfo.mCreatorToken = in.readStrongBinder(); diff --git a/core/java/android/security/responsible_apis_flags.aconfig b/core/java/android/security/responsible_apis_flags.aconfig index 5457bbee8ad3..3055a3facd5f 100644 --- a/core/java/android/security/responsible_apis_flags.aconfig +++ b/core/java/android/security/responsible_apis_flags.aconfig @@ -70,4 +70,11 @@ flag { description: "Prevent intent redirect attacks" bug: "361143368" is_fixed_read_only: true +} + +flag { + name: "prevent_intent_redirect_abort_or_throw_exception" + namespace: "responsible_apis" + description: "Prevent intent redirect attacks by aborting or throwing security exception" + bug: "361143368" } \ No newline at end of file diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 746c55f8fc9d..4b8f1c8b205f 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -60,6 +60,7 @@ import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_BACKUP; import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_INSTRUMENTATION; import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_PERSISTENT; import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_SYSTEM; +import static android.content.Intent.isPreventIntentRedirectEnabled; import static android.content.pm.ApplicationInfo.HIDDEN_API_ENFORCEMENT_DEFAULT; import static android.content.pm.PackageManager.GET_SHARED_LIBRARY_FILES; import static android.content.pm.PackageManager.MATCH_ALL; @@ -130,7 +131,6 @@ import static android.os.Process.setThreadScheduler; import static android.provider.Settings.Global.ALWAYS_FINISH_ACTIVITIES; import static android.provider.Settings.Global.DEBUG_APP; import static android.provider.Settings.Global.WAIT_FOR_DEBUGGER; -import static android.security.Flags.preventIntentRedirect; import static android.util.FeatureFlagUtils.SETTINGS_ENABLE_MONITOR_PHANTOM_PROCS; import static android.view.Display.INVALID_DISPLAY; @@ -19267,7 +19267,7 @@ public class ActivityManagerService extends IActivityManager.Stub * @hide */ public void addCreatorToken(@Nullable Intent intent, String creatorPackage) { - if (!preventIntentRedirect()) return; + if (!isPreventIntentRedirectEnabled()) return; if (intent == null || intent.getExtraIntentKeys() == null) return; for (String key : intent.getExtraIntentKeys()) { @@ -19278,7 +19278,9 @@ public class ActivityManagerService extends IActivityManager.Stub + "} does not correspond to an intent in the extra bundle."); continue; } - Slog.wtf(TAG, "A creator token is added to an intent."); + Slog.wtf(TAG, + "A creator token is added to an intent. creatorPackage: " + creatorPackage + + "; intent: " + intent); IBinder creatorToken = createIntentCreatorToken(extraIntent, creatorPackage); if (creatorToken != null) { extraIntent.setCreatorToken(creatorToken); diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index c1f5a27b81e7..a2c2dfc0a5be 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -478,10 +478,10 @@ public class ActivityStartController { intentGrants.merge(creatorIntentGrants); } } catch (SecurityException securityException) { - ActivityStarter.logForIntentRedirect( + ActivityStarter.logAndThrowExceptionForIntentRedirect( "Creator URI Grant Caused Exception.", intent, creatorUid, - creatorPackage, filterCallingUid, callingPackage); - // TODO b/368559093 - rethrow the securityException. + creatorPackage, filterCallingUid, callingPackage, + securityException); } } if ((aInfo.applicationInfo.privateFlags diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5d3ae54f0934..2c4179fb6d88 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -54,6 +54,7 @@ import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TASK; import static android.content.pm.ActivityInfo.LAUNCH_SINGLE_TOP; import static android.content.pm.ActivityInfo.launchModeToString; import static android.os.Process.INVALID_UID; +import static android.security.Flags.preventIntentRedirectAbortOrThrowException; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.WindowManager.TRANSIT_NONE; import static android.view.WindowManager.TRANSIT_OPEN; @@ -100,9 +101,11 @@ import android.app.PendingIntent; import android.app.ProfilerInfo; import android.app.WaitResult; import android.app.WindowConfiguration; +import android.app.compat.CompatChanges; import android.compat.annotation.ChangeId; import android.compat.annotation.Disabled; import android.compat.annotation.EnabledSince; +import android.compat.annotation.Overridable; import android.content.IIntentSender; import android.content.Intent; import android.content.IntentSender; @@ -188,6 +191,10 @@ class ActivityStarter { @Disabled static final long ASM_RESTRICTIONS = 230590090L; + @ChangeId + @Overridable + private static final long ENABLE_PREVENT_INTENT_REDIRECT_TAKE_ACTION = 29623414L; + private final ActivityTaskManagerService mService; private final RootWindowContainer mRootWindowContainer; private final ActivityTaskSupervisor mSupervisor; @@ -608,11 +615,10 @@ class ActivityStarter { // Check if the Intent was redirected if ((intent.getExtendedFlags() & Intent.EXTENDED_FLAG_MISSING_CREATOR_OR_INVALID_TOKEN) != 0) { - ActivityStarter.logForIntentRedirect( + ActivityStarter.logAndThrowExceptionForIntentRedirect( "Unparceled intent does not have a creator token set.", intent, - intentCreatorUid, - intentCreatorPackage, resolvedCallingUid, resolvedCallingPackage); - // TODO b/368559093 - eventually ramp up to throw SecurityException + intentCreatorUid, intentCreatorPackage, resolvedCallingUid, + resolvedCallingPackage, null); } if (IntentCreatorToken.isValid(intent)) { IntentCreatorToken creatorToken = (IntentCreatorToken) intent.getCreatorToken(); @@ -645,11 +651,10 @@ class ActivityStarter { intentGrants.merge(creatorIntentGrants); } } catch (SecurityException securityException) { - ActivityStarter.logForIntentRedirect( + ActivityStarter.logAndThrowExceptionForIntentRedirect( "Creator URI Grant Caused Exception.", intent, intentCreatorUid, intentCreatorPackage, resolvedCallingUid, - resolvedCallingPackage); - // TODO b/368559093 - rethrow the securityException. + resolvedCallingPackage, securityException); } } } else { @@ -670,11 +675,10 @@ class ActivityStarter { intentGrants.merge(creatorIntentGrants); } } catch (SecurityException securityException) { - ActivityStarter.logForIntentRedirect( + ActivityStarter.logAndThrowExceptionForIntentRedirect( "Creator URI Grant Caused Exception.", intent, intentCreatorUid, intentCreatorPackage, resolvedCallingUid, - resolvedCallingPackage); - // TODO b/368559093 - rethrow the securityException. + resolvedCallingPackage, securityException); } } } @@ -1045,7 +1049,7 @@ class ActivityStarter { int callingUid = request.callingUid; int intentCreatorUid = request.intentCreatorUid; String intentCreatorPackage = request.intentCreatorPackage; - String intentCallingPackage = request.callingPackage; + String callingPackage = request.callingPackage; String callingFeatureId = request.callingFeatureId; final int realCallingPid = request.realCallingPid; final int realCallingUid = request.realCallingUid; @@ -1130,7 +1134,7 @@ class ActivityStarter { // launched in the app flow to redirect to an activity picked by the user, where // we want the final activity to consider it to have been launched by the // previous app activity. - intentCallingPackage = sourceRecord.launchedFromPackage; + callingPackage = sourceRecord.launchedFromPackage; callingFeatureId = sourceRecord.launchedFromFeatureId; } } @@ -1152,7 +1156,7 @@ class ActivityStarter { if (packageArchiver.isIntentResolvedToArchivedApp(intent, mRequest.userId)) { err = packageArchiver .requestUnarchiveOnActivityStart( - intent, intentCallingPackage, mRequest.userId, realCallingUid); + intent, callingPackage, mRequest.userId, realCallingUid); } } } @@ -1211,7 +1215,7 @@ class ActivityStarter { boolean abort; try { abort = !mSupervisor.checkStartAnyActivityPermission(intent, aInfo, resultWho, - requestCode, callingPid, callingUid, intentCallingPackage, callingFeatureId, + requestCode, callingPid, callingUid, callingPackage, callingFeatureId, request.ignoreTargetSecurity, inTask != null, callerApp, resultRecord, resultRootTask); } catch (SecurityException e) { @@ -1239,7 +1243,7 @@ class ActivityStarter { abort |= !mService.mIntentFirewall.checkStartActivity(intent, callingUid, callingPid, resolvedType, aInfo.applicationInfo); abort |= !mService.getPermissionPolicyInternal().checkStartActivity(intent, callingUid, - intentCallingPackage); + callingPackage); if (intentCreatorUid != Request.DEFAULT_INTENT_CREATOR_UID) { try { @@ -1247,36 +1251,29 @@ class ActivityStarter { requestCode, 0, intentCreatorUid, intentCreatorPackage, "", request.ignoreTargetSecurity, inTask != null, null, resultRecord, resultRootTask)) { - logForIntentRedirect("Creator checkStartAnyActivityPermission Caused abortion.", + abort = logAndAbortForIntentRedirect( + "Creator checkStartAnyActivityPermission Caused abortion.", intent, intentCreatorUid, intentCreatorPackage, callingUid, - intentCallingPackage); - // TODO b/368559093 - set abort to true. - // abort = true; + callingPackage); } } catch (SecurityException e) { - logForIntentRedirect("Creator checkStartAnyActivityPermission Caused Exception.", - intent, intentCreatorUid, intentCreatorPackage, callingUid, - intentCallingPackage); - // TODO b/368559093 - rethrow the exception. - //throw e; - } - if (!mService.mIntentFirewall.checkStartActivity(intent, intentCreatorUid, 0, - resolvedType, aInfo.applicationInfo)) { - logForIntentRedirect("Creator IntentFirewall.checkStartActivity Caused abortion.", - intent, intentCreatorUid, intentCreatorPackage, callingUid, - intentCallingPackage); - // TODO b/368559093 - set abort to true. - // abort = true; - } - - if (!mService.getPermissionPolicyInternal().checkStartActivity(intent, intentCreatorUid, - intentCreatorPackage)) { - logForIntentRedirect( + logAndThrowExceptionForIntentRedirect( + "Creator checkStartAnyActivityPermission Caused Exception.", + intent, intentCreatorUid, intentCreatorPackage, callingUid, callingPackage, + e); + } + if (!mService.mIntentFirewall.checkStartActivity(intent, intentCreatorUid, + 0, resolvedType, aInfo.applicationInfo)) { + abort = logAndAbortForIntentRedirect( + "Creator IntentFirewall.checkStartActivity Caused abortion.", + intent, intentCreatorUid, intentCreatorPackage, callingUid, callingPackage); + } + + if (!mService.getPermissionPolicyInternal().checkStartActivity(intent, + intentCreatorUid, intentCreatorPackage)) { + abort = logAndAbortForIntentRedirect( "Creator PermissionPolicyService.checkStartActivity Caused abortion.", - intent, intentCreatorUid, intentCreatorPackage, callingUid, - intentCallingPackage); - // TODO b/368559093 - set abort to true. - // abort = true; + intent, intentCreatorUid, intentCreatorPackage, callingUid, callingPackage); } intent.removeCreatorTokenInfo(); } @@ -1296,7 +1293,7 @@ class ActivityStarter { balController.checkBackgroundActivityStart( callingUid, callingPid, - intentCallingPackage, + callingPackage, realCallingUid, realCallingPid, callerApp, @@ -1317,7 +1314,7 @@ class ActivityStarter { if (request.allowPendingRemoteAnimationRegistryLookup) { checkedOptions = mService.getActivityStartController() .getPendingRemoteAnimationRegistry() - .overrideOptionsIfNeeded(intentCallingPackage, checkedOptions); + .overrideOptionsIfNeeded(callingPackage, checkedOptions); } if (mService.mController != null) { try { @@ -1334,7 +1331,7 @@ class ActivityStarter { final TaskDisplayArea suggestedLaunchDisplayArea = computeSuggestedLaunchDisplayArea(inTask, sourceRecord, checkedOptions); mInterceptor.setStates(userId, realCallingPid, realCallingUid, startFlags, - intentCallingPackage, + callingPackage, callingFeatureId); if (mInterceptor.intercept(intent, rInfo, aInfo, resolvedType, inTask, inTaskFragment, callingPid, callingUid, checkedOptions, suggestedLaunchDisplayArea)) { @@ -1372,7 +1369,7 @@ class ActivityStarter { if (mService.getPackageManagerInternalLocked().isPermissionsReviewRequired( aInfo.packageName, userId)) { final IIntentSender target = mService.getIntentSenderLocked( - ActivityManager.INTENT_SENDER_ACTIVITY, intentCallingPackage, + ActivityManager.INTENT_SENDER_ACTIVITY, callingPackage, callingFeatureId, callingUid, userId, null, null, 0, new Intent[]{intent}, new String[]{resolvedType}, PendingIntent.FLAG_CANCEL_CURRENT @@ -1436,7 +1433,7 @@ class ActivityStarter { // app [on install success]. if (rInfo != null && rInfo.auxiliaryInfo != null) { intent = createLaunchIntent(rInfo.auxiliaryInfo, request.ephemeralIntent, - intentCallingPackage, callingFeatureId, verificationBundle, resolvedType, + callingPackage, callingFeatureId, verificationBundle, resolvedType, userId); resolvedType = null; callingUid = realCallingUid; @@ -1460,7 +1457,7 @@ class ActivityStarter { .setCaller(callerApp) .setLaunchedFromPid(callingPid) .setLaunchedFromUid(callingUid) - .setLaunchedFromPackage(intentCallingPackage) + .setLaunchedFromPackage(callingPackage) .setLaunchedFromFeature(callingFeatureId) .setIntent(intent) .setResolvedType(resolvedType) @@ -3588,16 +3585,32 @@ class ActivityStarter { pw.println(mInTaskFragment); } - static void logForIntentRedirect(String message, Intent intent, int intentCreatorUid, - String intentCreatorPackage, int callingUid, String callingPackage) { + static void logAndThrowExceptionForIntentRedirect(@NonNull String message, + @NonNull Intent intent, int intentCreatorUid, @Nullable String intentCreatorPackage, + int callingUid, @Nullable String callingPackage, + @Nullable SecurityException originalException) { + String msg = getIntentRedirectPreventedLogMessage(message, intent, intentCreatorUid, + intentCreatorPackage, callingUid, callingPackage); + Slog.wtf(TAG, msg); + if (preventIntentRedirectAbortOrThrowException() && CompatChanges.isChangeEnabled( + ENABLE_PREVENT_INTENT_REDIRECT_TAKE_ACTION, callingUid)) { + throw new SecurityException(msg, originalException); + } + } + + private static boolean logAndAbortForIntentRedirect(@NonNull String message, + @NonNull Intent intent, int intentCreatorUid, @Nullable String intentCreatorPackage, + int callingUid, @Nullable String callingPackage) { String msg = getIntentRedirectPreventedLogMessage(message, intent, intentCreatorUid, intentCreatorPackage, callingUid, callingPackage); Slog.wtf(TAG, msg); + return preventIntentRedirectAbortOrThrowException() && CompatChanges.isChangeEnabled( + ENABLE_PREVENT_INTENT_REDIRECT_TAKE_ACTION, callingUid); } - private static String getIntentRedirectPreventedLogMessage(String message, Intent intent, - int intentCreatorUid, String intentCreatorPackage, int callingUid, - String callingPackage) { + private static String getIntentRedirectPreventedLogMessage(@NonNull String message, + @NonNull Intent intent, int intentCreatorUid, @Nullable String intentCreatorPackage, + int callingUid, @Nullable String callingPackage) { return "[IntentRedirect]" + message + " intentCreatorUid: " + intentCreatorUid + "; intentCreatorPackage: " + intentCreatorPackage + "; callingUid: " + callingUid + "; callingPackage: " + callingPackage + "; intent: " + intent; -- GitLab From 4f580e682f322c72d3b5f8fc163758e011d69b8d Mon Sep 17 00:00:00 2001 From: Chen Bai Date: Tue, 15 Oct 2024 17:13:03 -0700 Subject: [PATCH 086/459] brightness: set up flag for bedtime autobrightness curve feature Flag: com.android.server.display.feature.flags.auto_brightness_mode_bedtime_wear Test: m -j Bug: 350617205 Change-Id: Idfa0e8a6e5ea78d541909387e1e5a655970c0f60 --- .../display/feature/DisplayManagerFlags.java | 15 +++++++++++++++ .../server/display/feature/display_flags.aconfig | 8 ++++++++ 2 files changed, 23 insertions(+) diff --git a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java index 07343f469ed7..c0aa4cc6fa24 100644 --- a/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +++ b/services/core/java/com/android/server/display/feature/DisplayManagerFlags.java @@ -237,6 +237,11 @@ public class DisplayManagerFlags { Flags::enableHasArrSupport ); + private final FlagState mAutoBrightnessModeBedtimeWearFlagState = new FlagState( + Flags.FLAG_AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Flags::autoBrightnessModeBedtimeWear + ); + /** * @return {@code true} if 'port' is allowed in display layout configuration file. */ @@ -503,6 +508,15 @@ public class DisplayManagerFlags { public boolean hasArrSupportFlag() { return mHasArrSupport.isEnabled(); } + + /** + * @return {@code true} if bedtime mode specific auto-brightness curve should be loaded and be + * applied when bedtime mode is enabled. + */ + public boolean isAutoBrightnessModeBedtimeWearEnabled() { + return mAutoBrightnessModeBedtimeWearFlagState.isEnabled(); + } + /** * dumps all flagstates * @param pw printWriter @@ -553,6 +567,7 @@ public class DisplayManagerFlags { pw.println(" " + mBlockAutobrightnessChangesOnStylusUsage); pw.println(" " + mIsUserRefreshRateForExternalDisplayEnabled); pw.println(" " + mHasArrSupport); + pw.println(" " + mAutoBrightnessModeBedtimeWearFlagState); } private static class FlagState { diff --git a/services/core/java/com/android/server/display/feature/display_flags.aconfig b/services/core/java/com/android/server/display/feature/display_flags.aconfig index ddb29691f42e..36cadf5271c4 100644 --- a/services/core/java/com/android/server/display/feature/display_flags.aconfig +++ b/services/core/java/com/android/server/display/feature/display_flags.aconfig @@ -422,3 +422,11 @@ flag { bug: "361433651" is_fixed_read_only: true } + +flag { + name: "auto_brightness_mode_bedtime_wear" + namespace: "wear_frameworks" + description: "Feature flag for loading and applying auto-brightness curve while wear bedtime mode enabled." + bug: "350617205" + is_fixed_read_only: true +} -- GitLab From 883b408292ffd42863c5abc05b23f4af68e3d753 Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Thu, 17 Oct 2024 18:10:48 +0000 Subject: [PATCH 087/459] Prevent task from exiting immersive twice on close When a task is closing, the full immersive handler restores its bounds and appends the transition to its list of tracked transitions. It also add a change to prevent direct enter/exit while a pending transition is in progress, to prevent the case where a onTaskInfoChanged changing the immersive state of the app re-triggers an enter/exit while another enter/exit is already in progress. Finally, it adjusts the close animation to always animate from the start bounds, since the taskInfo/end bounds can now be different even on close transitions. Flag: com.android.window.flags.enable_fully_immersive_in_desktop Bug: 373987723 Test: enter desktop immersive, close the task using the header icon, verify no crash and it animates correctly Change-Id: I068b925ca45bd68d98434e1105bf0a3716247202 --- .../DesktopFullImmersiveTransitionHandler.kt | 2 +- .../DesktopMixedTransitionHandler.kt | 4 +-- .../desktopmode/DesktopTasksController.kt | 8 +++++- .../FreeformTaskTransitionHandler.java | 9 ++++--- .../FreeformTaskTransitionStarter.java | 3 ++- .../DesktopModeWindowDecorViewModel.java | 11 ++++++-- .../wm/shell/windowdecor/TaskOperations.java | 5 ++-- ...sktopFullImmersiveTransitionHandlerTest.kt | 27 ++++++++++++++++--- .../DesktopMixedTransitionHandlerTest.kt | 3 +++ .../desktopmode/DesktopTasksControllerTest.kt | 17 ++++++------ 10 files changed, 64 insertions(+), 25 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt index 320c003f41eb..9d4926b47def 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt @@ -71,7 +71,7 @@ class DesktopFullImmersiveTransitionHandler( /** Whether there is an immersive transition that hasn't completed yet. */ private val inProgress: Boolean - get() = state != null + get() = state != null || pendingExternalExitTransitions.isNotEmpty() private val rectEvaluator = RectEvaluator() diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index 435019929cbd..df9fc59b925e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -58,9 +58,9 @@ class DesktopMixedTransitionHandler( freeformTaskTransitionHandler.startMinimizedModeTransition(wct) /** Starts close transition and handles or delegates desktop task close animation. */ - override fun startRemoveTransition(wct: WindowContainerTransaction?) { + override fun startRemoveTransition(wct: WindowContainerTransaction?): IBinder { requireNotNull(wct) - transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, /* handler= */ this) + return transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, /* handler= */ this) } /** Returns null, as it only handles transitions started from Shell. */ diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 29e302a0f0cc..1d17cd62c0d2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -461,7 +461,12 @@ class DesktopTasksController( * @param displayId display id of the window that's being closed * @param taskId task id of the window that's being closed */ - fun onDesktopWindowClose(wct: WindowContainerTransaction, displayId: Int, taskId: Int) { + fun onDesktopWindowClose( + wct: WindowContainerTransaction, + displayId: Int, + taskInfo: RunningTaskInfo, + ): ((IBinder) -> Unit)? { + val taskId = taskInfo.taskId if (taskRepository.isOnlyVisibleNonClosingTask(taskId)) { removeWallpaperActivity(wct) } @@ -472,6 +477,7 @@ class DesktopTasksController( taskId ) ) + return immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo) } fun minimizeTask(taskInfo: RunningTaskInfo) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java index 6aaf001d46f3..58337ece0991 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionHandler.java @@ -99,9 +99,11 @@ public class FreeformTaskTransitionHandler @Override - public void startRemoveTransition(WindowContainerTransaction wct) { + public IBinder startRemoveTransition(WindowContainerTransaction wct) { final int type = WindowManager.TRANSIT_CLOSE; - mPendingTransitionTokens.add(mTransitions.startTransition(type, wct, this)); + final IBinder transition = mTransitions.startTransition(type, wct, this); + mPendingTransitionTokens.add(transition); + return transition; } @Override @@ -229,8 +231,7 @@ public class FreeformTaskTransitionHandler SurfaceControl.Transaction t = new SurfaceControl.Transaction(); SurfaceControl sc = change.getLeash(); finishT.hide(sc); - Rect startBounds = new Rect(change.getTaskInfo().configuration.windowConfiguration - .getBounds()); + final Rect startBounds = new Rect(change.getStartAbsBounds()); animator.addUpdateListener(animation -> { t.setPosition(sc, startBounds.left, startBounds.top + (animation.getAnimatedFraction() * screenHeight)); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java index ea68a694c3b9..5984d486f838 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionStarter.java @@ -48,6 +48,7 @@ public interface FreeformTaskTransitionStarter { * * @param wct the {@link WindowContainerTransaction} that closes the task * + * @return the started transition */ - void startRemoveTransition(WindowContainerTransaction wct); + IBinder startRemoveTransition(WindowContainerTransaction wct); } \ No newline at end of file diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index 9e089b2460f6..a06b4a2e09d4 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -56,6 +56,7 @@ import android.graphics.Rect; import android.graphics.Region; import android.hardware.input.InputManager; import android.os.Handler; +import android.os.IBinder; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; @@ -133,6 +134,7 @@ import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; import kotlin.Pair; import kotlin.Unit; +import kotlin.jvm.functions.Function1; import kotlinx.coroutines.ExperimentalCoroutinesApi; @@ -767,8 +769,13 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, SplitScreenController.EXIT_REASON_DESKTOP_MODE); } else { WindowContainerTransaction wct = new WindowContainerTransaction(); - mDesktopTasksController.onDesktopWindowClose(wct, mDisplayId, mTaskId); - mTaskOperations.closeTask(mTaskToken, wct); + final Function1 runOnTransitionStart = + mDesktopTasksController.onDesktopWindowClose( + wct, mDisplayId, decoration.mTaskInfo); + final IBinder transition = mTaskOperations.closeTask(mTaskToken, wct); + if (transition != null && runOnTransitionStart != null) { + runOnTransitionStart.invoke(transition); + } } } else if (id == R.id.back_button) { mTaskOperations.injectBackKey(mDisplayId); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java index 61b93932013c..bc85d2b40748 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/TaskOperations.java @@ -76,13 +76,14 @@ class TaskOperations { closeTask(taskToken, new WindowContainerTransaction()); } - void closeTask(WindowContainerToken taskToken, WindowContainerTransaction wct) { + IBinder closeTask(WindowContainerToken taskToken, WindowContainerTransaction wct) { wct.removeTask(taskToken); if (Transitions.ENABLE_SHELL_TRANSITIONS) { - mTransitionStarter.startRemoveTransition(wct); + return mTransitionStarter.startRemoveTransition(wct); } else { mSyncQueue.queue(wct); } + return null; } IBinder minimizeTask(WindowContainerToken taskToken) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt index b13746814f58..ef99b000d759 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt @@ -52,6 +52,7 @@ import org.mockito.Mockito.mock import org.mockito.kotlin.any import org.mockito.kotlin.eq import org.mockito.kotlin.mock +import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @@ -366,7 +367,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId) + immersiveHandler.exitImmersiveIfApplicable(wct, task) assertThat(wct.hasBoundsChange(task.token)).isFalse() } @@ -384,12 +385,12 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId)?.invoke(transition) + immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(transition) assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId - }).isFalse() + }).isTrue() } @Test @@ -405,7 +406,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(wct, task.taskId)?.invoke(transition) + immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(transition) assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY @@ -565,6 +566,24 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { ).isTrue() } + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersive_pendingExit_doesNotExitAgain() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + desktopRepository.setTaskInFullImmersiveState( + displayId = task.displayId, + taskId = task.taskId, + immersive = true + ) + immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(Binder()) + + immersiveHandler.moveTaskToNonImmersive(task) + + verify(mockTransitions, never()).startTransition(any(), any(), any()) + } + private fun createTransitionInfo( @TransitionType type: Int = TRANSIT_CHANGE, @TransitionFlags flags: Int = 0, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt index 07de0716200c..81d59d586dd3 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt @@ -21,6 +21,7 @@ import android.app.WindowConfiguration.ACTIVITY_TYPE_STANDARD import android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM import android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN import android.app.WindowConfiguration.WindowingMode +import android.os.Binder import android.os.Handler import android.os.IBinder import android.testing.AndroidTestingRunner @@ -107,6 +108,8 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { @Test fun startRemoveTransition_startsCloseTransition() { val wct = WindowContainerTransaction() + whenever(transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, mixedHandler)) + .thenReturn(Binder()) mixedHandler.startRemoveTransition(wct) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 113990e9d7d2..af51e32b2086 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -1480,8 +1480,9 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun onDesktopWindowClose_noActiveTasks() { + val task = setUpFreeformTask(active = false) val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = 1) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) // Doesn't modify transaction assertThat(wct.hierarchyOps).isEmpty() } @@ -1490,7 +1491,7 @@ class DesktopTasksControllerTest : ShellTestCase() { fun onDesktopWindowClose_singleActiveTask_noWallpaperActivityToken() { val task = setUpFreeformTask() val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) // Doesn't modify transaction assertThat(wct.hierarchyOps).isEmpty() } @@ -1502,7 +1503,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.wallpaperActivityToken = wallpaperToken val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) // Adds remove wallpaper operation wct.assertRemoveAt(index = 0, wallpaperToken) } @@ -1515,7 +1516,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.addClosingTask(DEFAULT_DISPLAY, task.taskId) val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) // Doesn't modify transaction assertThat(wct.hierarchyOps).isEmpty() } @@ -1528,7 +1529,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.minimizeTask(DEFAULT_DISPLAY, task.taskId) val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task) // Doesn't modify transaction assertThat(wct.hierarchyOps).isEmpty() } @@ -1541,7 +1542,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.wallpaperActivityToken = wallpaperToken val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task1.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task1) // Doesn't modify transaction assertThat(wct.hierarchyOps).isEmpty() } @@ -1555,7 +1556,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.addClosingTask(DEFAULT_DISPLAY, task2.taskId) val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task1.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task1) // Adds remove wallpaper operation wct.assertRemoveAt(index = 0, wallpaperToken) } @@ -1569,7 +1570,7 @@ class DesktopTasksControllerTest : ShellTestCase() { taskRepository.minimizeTask(DEFAULT_DISPLAY, task2.taskId) val wct = WindowContainerTransaction() - controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, taskId = task1.taskId) + controller.onDesktopWindowClose(wct, displayId = DEFAULT_DISPLAY, task1) // Adds remove wallpaper operation wct.assertRemoveAt(index = 0, wallpaperToken) } -- GitLab From 8994356aa2939bf074b70d797f1ca8570054892d Mon Sep 17 00:00:00 2001 From: Chen Bai Date: Mon, 7 Oct 2024 16:20:10 -0700 Subject: [PATCH 088/459] brightness: add loading logic of bedtime autobrightness curve Add a logic to load autobrightness curve specific for bedtime mode. The loading logic is basically parallel to other curve's loading loigc. - Add enumeration "bedtime" to AutoBrightnessModeName - Add AutomaticBrightnessMode "AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR" Flag: com.android.server.display.feature.flags.auto_brightness_mode_bedtime_wear Test: DisplayDeviceConfigTest Bug: 359606740 Change-Id: I421fd2f983ae3ed9637cc8a7d2ada11a50aa36e1 --- .../AutomaticBrightnessController.java | 4 +- .../display/BrightnessMappingStrategy.java | 3 +- .../display/DisplayPowerController.java | 11 +++ .../DisplayBrightnessMappingConfig.java | 4 + .../display-device-config.xsd | 1 + .../display-device-config/schema/current.txt | 1 + .../display/DisplayDeviceConfigTest.java | 75 +++++++++++++++++++ 7 files changed, 97 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/display/AutomaticBrightnessController.java b/services/core/java/com/android/server/display/AutomaticBrightnessController.java index 774041152d3e..448c42b71731 100644 --- a/services/core/java/com/android/server/display/AutomaticBrightnessController.java +++ b/services/core/java/com/android/server/display/AutomaticBrightnessController.java @@ -82,7 +82,8 @@ public class AutomaticBrightnessController { @IntDef(prefix = { "AUTO_BRIGHTNESS_MODE_" }, value = { AUTO_BRIGHTNESS_MODE_DEFAULT, AUTO_BRIGHTNESS_MODE_IDLE, - AUTO_BRIGHTNESS_MODE_DOZE + AUTO_BRIGHTNESS_MODE_DOZE, + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR }) @Retention(RetentionPolicy.SOURCE) public @interface AutomaticBrightnessMode{} @@ -90,6 +91,7 @@ public class AutomaticBrightnessController { public static final int AUTO_BRIGHTNESS_MODE_DEFAULT = 0; public static final int AUTO_BRIGHTNESS_MODE_IDLE = 1; public static final int AUTO_BRIGHTNESS_MODE_DOZE = 2; + public static final int AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR = 3; public static final int AUTO_BRIGHTNESS_MODE_MAX = AUTO_BRIGHTNESS_MODE_DOZE; // How long the current sensor reading is assumed to be valid beyond the current time. diff --git a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java index 6a019f3d024c..570d5d0fc134 100644 --- a/services/core/java/com/android/server/display/BrightnessMappingStrategy.java +++ b/services/core/java/com/android/server/display/BrightnessMappingStrategy.java @@ -18,6 +18,7 @@ package com.android.server.display; import static android.text.TextUtils.formatSimple; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; @@ -114,7 +115,7 @@ public abstract class BrightnessMappingStrategy { luxLevels = getLuxLevels(context.getResources().getIntArray( com.android.internal.R.array.config_autoBrightnessLevelsIdle)); } - case AUTO_BRIGHTNESS_MODE_DOZE -> { + case AUTO_BRIGHTNESS_MODE_DOZE, AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR -> { luxLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevelsLux(mode, preset); brightnessLevels = displayDeviceConfig.getAutoBrightnessBrighteningLevels(mode, preset); diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 42a62f098b6a..019e1ee8349f 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -19,6 +19,7 @@ package com.android.server.display; import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_OFF; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; @@ -1086,6 +1087,16 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call brightnessMappers.put(AUTO_BRIGHTNESS_MODE_DOZE, dozeModeBrightnessMapper); } + if (mFlags.areAutoBrightnessModesEnabled() + && mFlags.isAutoBrightnessModeBedtimeWearEnabled()) { + BrightnessMappingStrategy bedtimeBrightnessMapper = + BrightnessMappingStrategy.create(context, mDisplayDeviceConfig, + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, mDisplayWhiteBalanceController); + if (bedtimeBrightnessMapper != null) { + brightnessMappers.put(AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, bedtimeBrightnessMapper); + } + } + float userLux = BrightnessMappingStrategy.INVALID_LUX; float userNits = BrightnessMappingStrategy.INVALID_NITS; if (mAutomaticBrightnessController != null) { diff --git a/services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java b/services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java index e0bdda511df3..458438c3f0b0 100644 --- a/services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java +++ b/services/core/java/com/android/server/display/config/DisplayBrightnessMappingConfig.java @@ -16,6 +16,7 @@ package com.android.server.display.config; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; @@ -247,6 +248,9 @@ public class DisplayBrightnessMappingConfig { case AUTO_BRIGHTNESS_MODE_DOZE -> { return AutoBrightnessModeName.doze.getRawName(); } + case AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR -> { + return AutoBrightnessModeName.bedtime_wear.getRawName(); + } default -> throw new IllegalArgumentException("Unknown auto-brightness mode: " + mode); } } diff --git a/services/core/xsd/display-device-config/display-device-config.xsd b/services/core/xsd/display-device-config/display-device-config.xsd index 20c69ac93f63..6eac826f282c 100644 --- a/services/core/xsd/display-device-config/display-device-config.xsd +++ b/services/core/xsd/display-device-config/display-device-config.xsd @@ -955,6 +955,7 @@ + diff --git a/services/core/xsd/display-device-config/schema/current.txt b/services/core/xsd/display-device-config/schema/current.txt index a8f18b3d2eee..a29e42cb480d 100644 --- a/services/core/xsd/display-device-config/schema/current.txt +++ b/services/core/xsd/display-device-config/schema/current.txt @@ -21,6 +21,7 @@ package com.android.server.display.config { public enum AutoBrightnessModeName { method public String getRawName(); enum_constant public static final com.android.server.display.config.AutoBrightnessModeName _default; + enum_constant public static final com.android.server.display.config.AutoBrightnessModeName bedtime_wear; enum_constant public static final com.android.server.display.config.AutoBrightnessModeName doze; enum_constant public static final com.android.server.display.config.AutoBrightnessModeName idle; } diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java index 2220f439f6c8..2fd135e5f57a 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayDeviceConfigTest.java @@ -18,6 +18,7 @@ package com.android.server.display; import static com.android.internal.display.BrightnessSynchronizer.brightnessIntToFloat; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; import static com.android.server.display.config.SensorData.TEMPERATURE_TYPE_SKIN; @@ -885,6 +886,34 @@ public final class DisplayDeviceConfigTest { mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels( AUTO_BRIGHTNESS_MODE_DOZE, Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_DIM), SMALL_DELTA); + + // Wear Bedtime mode curve + assertArrayEquals(new float[]{0.0f, 10.0f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_DIM), ZERO_DELTA); + assertArrayEquals(new float[]{0.20f, 0.30f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_DIM), SMALL_DELTA); + + assertArrayEquals(new float[]{0.0f, 20.0f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL), ZERO_DELTA); + assertArrayEquals(new float[]{0.30f, 0.65f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_NORMAL), SMALL_DELTA); + + assertArrayEquals(new float[]{0.0f, 30.0f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevelsLux( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_BRIGHT), ZERO_DELTA); + assertArrayEquals(new float[]{0.65f, 0.95f}, + mDisplayDeviceConfig.getAutoBrightnessBrighteningLevels( + AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + Settings.System.SCREEN_BRIGHTNESS_AUTOMATIC_BRIGHT), SMALL_DELTA); } @Test @@ -1296,6 +1325,51 @@ public final class DisplayDeviceConfigTest { + "\n"; } + private String getBedTimeModeWearCurveConfig() { + return "\n" + + "bedtime_wear\n" + + "dim\n" + + "\n" + + "\n" + + "0\n" + + "0.2\n" + + "\n" + + "\n" + + "10\n" + + "0.3\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "bedtime_wear\n" + + "normal\n" + + "\n" + + "\n" + + "0\n" + + "0.3\n" + + "\n" + + "\n" + + "20\n" + + "0.65\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "bedtime_wear\n" + + "bright\n" + + "\n" + + "\n" + + "0\n" + + "0.65\n" + + "\n" + + "\n" + + "30\n" + + "0.95\n" + + "\n" + + "\n" + + "\n"; + } + private String getPowerThrottlingConfig() { return "\n" + "0.1\n" @@ -1481,6 +1555,7 @@ public final class DisplayDeviceConfigTest { + "\n" + "\n" + "\n" + + getBedTimeModeWearCurveConfig() + "1000\n" + "\n" + getPowerThrottlingConfig() -- GitLab From 4fa5446f3dde8a691c02f61806ae75d706101170 Mon Sep 17 00:00:00 2001 From: Xin Guan Date: Sat, 19 Oct 2024 02:00:56 +0000 Subject: [PATCH 089/459] JobScheduler: Enforce quota to jobs started from TOP state Jobs started when the app was on TOP proc state are not exempted from quota controller after the app leaves the top states Bug: 374323858 Test: atest CtsJobSchedulerTestCases Test: atest FrameworksMockingServicesTests:com.android.server.job.controllers.QuotaControllerTest Flag: com.android.server.job.enforce_quota_policy_to_top_started_jobs Change-Id: I31b565da698d73f1f989098d5afb62315cc34782 --- apex/jobscheduler/service/aconfig/job.aconfig | 7 + .../job/controllers/QuotaController.java | 12 +- .../job/controllers/QuotaControllerTest.java | 475 +++++++++++++++++- 3 files changed, 488 insertions(+), 6 deletions(-) diff --git a/apex/jobscheduler/service/aconfig/job.aconfig b/apex/jobscheduler/service/aconfig/job.aconfig index 98e53ab97872..810be8fc4220 100644 --- a/apex/jobscheduler/service/aconfig/job.aconfig +++ b/apex/jobscheduler/service/aconfig/job.aconfig @@ -88,4 +88,11 @@ flag { namespace: "backstage_power" description: "Adjust quota default parameters" bug: "347058927" +} + +flag { + name: "enforce_quota_policy_to_top_started_jobs" + namespace: "backstage_power" + description: "Apply the quota policy to jobs started when the app was in TOP state" + bug: "374323858" } \ No newline at end of file diff --git a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java index 885bad5e31c8..37e2fe2e46f1 100644 --- a/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java +++ b/apex/jobscheduler/service/java/com/android/server/job/controllers/QuotaController.java @@ -619,7 +619,7 @@ public final class QuotaController extends StateController { } final int uid = jobStatus.getSourceUid(); - if (mTopAppCache.get(uid)) { + if (!Flags.enforceQuotaPolicyToTopStartedJobs() && mTopAppCache.get(uid)) { if (DEBUG) { Slog.d(TAG, jobStatus.toShortString() + " is top started job"); } @@ -656,7 +656,9 @@ public final class QuotaController extends StateController { timer.stopTrackingJob(jobStatus); } } - mTopStartedJobs.remove(jobStatus); + if (!Flags.enforceQuotaPolicyToTopStartedJobs()) { + mTopStartedJobs.remove(jobStatus); + } } @Override @@ -767,7 +769,7 @@ public final class QuotaController extends StateController { /** @return true if the job was started while the app was in the TOP state. */ private boolean isTopStartedJobLocked(@NonNull final JobStatus jobStatus) { - return mTopStartedJobs.contains(jobStatus); + return !Flags.enforceQuotaPolicyToTopStartedJobs() && mTopStartedJobs.contains(jobStatus); } /** Returns the maximum amount of time this job could run for. */ @@ -4379,11 +4381,13 @@ public final class QuotaController extends StateController { @Override public void dumpControllerStateLocked(final IndentingPrintWriter pw, final Predicate predicate) { - pw.println("Flags: "); + pw.println("Aconfig Flags:"); pw.println(" " + Flags.FLAG_ADJUST_QUOTA_DEFAULT_CONSTANTS + ": " + Flags.adjustQuotaDefaultConstants()); pw.println(" " + Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_FGS_JOBS + ": " + Flags.enforceQuotaPolicyToFgsJobs()); + pw.println(" " + Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS + + ": " + Flags.enforceQuotaPolicyToTopStartedJobs()); pw.println(); pw.println("Current elapsed time: " + sElapsedRealtimeClock.millis()); diff --git a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java index 5c718d982476..b2fe138e3342 100644 --- a/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/job/controllers/QuotaControllerTest.java @@ -1726,6 +1726,8 @@ public class QuotaControllerTest { } // Top-started job + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Top-stared jobs are out of quota enforcement. setProcessState(ActivityManager.PROCESS_STATE_TOP); synchronized (mQuotaController.mLock) { trackJobs(job, jobDefIWF, jobHigh); @@ -1755,6 +1757,38 @@ public class QuotaControllerTest { assertEquals(timeUntilQuotaConsumedMs, mQuotaController.getMaxJobExecutionTimeMsLocked(jobHigh)); } + + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Quota is enforced for top-started job after the process leaves TOP/BTOP state. + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + trackJobs(job, jobDefIWF, jobHigh); + mQuotaController.prepareForExecutionLocked(job); + mQuotaController.prepareForExecutionLocked(jobDefIWF); + mQuotaController.prepareForExecutionLocked(jobHigh); + } + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + synchronized (mQuotaController.mLock) { + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked((job))); + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked((jobDefIWF))); + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked((jobHigh))); + mQuotaController.maybeStopTrackingJobLocked(job, null); + mQuotaController.maybeStopTrackingJobLocked(jobDefIWF, null); + mQuotaController.maybeStopTrackingJobLocked(jobHigh, null); + } + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + synchronized (mQuotaController.mLock) { + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(jobDefIWF)); + assertEquals(timeUntilQuotaConsumedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(jobHigh)); + } } @Test @@ -1824,6 +1858,7 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Top-started job setProcessState(ActivityManager.PROCESS_STATE_TOP); synchronized (mQuotaController.mLock) { @@ -1831,6 +1866,7 @@ public class QuotaControllerTest { } setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); synchronized (mQuotaController.mLock) { + // Top-started job is out of quota enforcement. assertEquals(mQcConstants.EJ_LIMIT_ACTIVE_MS / 2, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); mQuotaController.maybeStopTrackingJobLocked(job, null); @@ -1842,6 +1878,28 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Top-started job + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(job); + } + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + synchronized (mQuotaController.mLock) { + // Top-started job is enforced by quota policy after the app leaves the TOP state. + // The max execution time should be the total EJ session limit of the RARE bucket + // minus the time has been used. + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS - timeUsedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + mQuotaController.maybeStopTrackingJobLocked(job, null); + } + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + synchronized (mQuotaController.mLock) { + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS - timeUsedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + } + // Test used quota rolling out of window. synchronized (mQuotaController.mLock) { mQuotaController.clearAppStatsLocked(SOURCE_USER_ID, SOURCE_PACKAGE); @@ -1856,6 +1914,7 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Top-started job setProcessState(ActivityManager.PROCESS_STATE_TOP); synchronized (mQuotaController.mLock) { @@ -1864,6 +1923,7 @@ public class QuotaControllerTest { } setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); synchronized (mQuotaController.mLock) { + // Top-started job is out of quota enforcement. assertEquals(mQcConstants.EJ_LIMIT_ACTIVE_MS / 2, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); mQuotaController.maybeStopTrackingJobLocked(job, null); @@ -1874,6 +1934,28 @@ public class QuotaControllerTest { assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Top-started job + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStartTrackingJobLocked(job, null); + mQuotaController.prepareForExecutionLocked(job); + } + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + synchronized (mQuotaController.mLock) { + // Top-started job is enforced by quota policy after the app leaves the TOP state. + // The max execution time should be the total EJ session limit of the RARE bucket. + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + mQuotaController.maybeStopTrackingJobLocked(job, null); + } + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + synchronized (mQuotaController.mLock) { + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + } } @Test @@ -1902,6 +1984,7 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Top-started job setProcessState(ActivityManager.PROCESS_STATE_TOP); synchronized (mQuotaController.mLock) { @@ -1909,6 +1992,7 @@ public class QuotaControllerTest { } setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); synchronized (mQuotaController.mLock) { + // Top-started job is out of quota enforcement. assertEquals(mQcConstants.EJ_LIMIT_ACTIVE_MS / 2, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); mQuotaController.maybeStopTrackingJobLocked(job, null); @@ -1920,6 +2004,27 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Top-started job + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(job); + } + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + synchronized (mQuotaController.mLock) { + // Top-started job is enforced by quota policy after the app leaves the TOP state. + // The max execution time should be the total EJ session limit of the RARE bucket. + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS - timeUsedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + mQuotaController.maybeStopTrackingJobLocked(job, null); + } + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + synchronized (mQuotaController.mLock) { + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS - timeUsedMs, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + } + // Test used quota rolling out of window. synchronized (mQuotaController.mLock) { mQuotaController.clearAppStatsLocked(SOURCE_USER_ID, SOURCE_PACKAGE); @@ -1935,6 +2040,7 @@ public class QuotaControllerTest { mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Top-started job setProcessState(ActivityManager.PROCESS_STATE_TOP); synchronized (mQuotaController.mLock) { @@ -1943,6 +2049,7 @@ public class QuotaControllerTest { } setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); synchronized (mQuotaController.mLock) { + // Top-started job is out of quota enforcement. assertEquals(mQcConstants.EJ_LIMIT_ACTIVE_MS / 2, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); mQuotaController.maybeStopTrackingJobLocked(job, null); @@ -1953,6 +2060,28 @@ public class QuotaControllerTest { assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, mQuotaController.getMaxJobExecutionTimeMsLocked(job)); } + + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + // Top-started job + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStartTrackingJobLocked(job, null); + mQuotaController.prepareForExecutionLocked(job); + } + setProcessState(ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND); + synchronized (mQuotaController.mLock) { + // Top-started job is enforced by quota policy after the app leaves the TOP state. + // The max execution time should be the total EJ session limit of the RARE bucket. + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + mQuotaController.maybeStopTrackingJobLocked(job, null); + } + + setProcessState(ActivityManager.PROCESS_STATE_RECEIVER); + synchronized (mQuotaController.mLock) { + assertEquals(mQcConstants.EJ_LIMIT_RARE_MS, + mQuotaController.getMaxJobExecutionTimeMsLocked(job)); + } } /** @@ -4608,6 +4737,7 @@ public class QuotaControllerTest { assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); advanceElapsedClock(SECOND_IN_MILLIS); + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Bg job starts while inactive, spans an entire active session, and ends after the // active session. @@ -4686,8 +4816,66 @@ public class QuotaControllerTest { mQuotaController.maybeStopTrackingJobLocked(jobBg2, null); mQuotaController.maybeStopTrackingJobLocked(jobFg1, null); } + // jobBg2 and jobFg1 are counted, jobTop is not counted. expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 2)); assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); + + advanceElapsedClock(SECOND_IN_MILLIS); + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + + // Bg job 1 starts, then top job starts. Bg job 1 job ends. Then app goes to + // foreground_service and a new job starts. Shortly after, uid goes + // "inactive" and then bg job 2 starts. Then top job ends, followed by bg and fg jobs. + // This should result in two TimingSessions: + // * The first should have a count of 1 + // * The second should have a count of 2, which accounts for the bg2 and fg and top jobs. + // Top started jobs are not quota free any more if the process leaves TOP/BTOP state. + start = JobSchedulerService.sElapsedRealtimeClock.millis(); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStartTrackingJobLocked(jobBg1, null); + mQuotaController.maybeStartTrackingJobLocked(jobBg2, null); + mQuotaController.maybeStartTrackingJobLocked(jobFg1, null); + mQuotaController.maybeStartTrackingJobLocked(jobTop, null); + } + setProcessState(ActivityManager.PROCESS_STATE_LAST_ACTIVITY); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg1); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1)); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobBg1, jobBg1); + } + advanceElapsedClock(5 * SECOND_IN_MILLIS); + setProcessState(getProcessStateQuotaFreeThreshold()); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobFg1); + } + advanceElapsedClock(5 * SECOND_IN_MILLIS); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + advanceElapsedClock(10 * SECOND_IN_MILLIS); // UID "inactive" now + start = JobSchedulerService.sElapsedRealtimeClock.millis(); + setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg2); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobTop, null); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobBg2, null); + mQuotaController.maybeStopTrackingJobLocked(jobFg1, null); + } + // jobBg2, jobFg1 and jobTop are counted. + expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 3)); + assertEquals(expected, mQuotaController.getTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); } /** @@ -4807,7 +4995,8 @@ public class QuotaControllerTest { * Tests that TOP jobs aren't stopped when an app runs out of quota. */ @Test - public void testTracking_OutOfQuota_ForegroundAndBackground() { + @DisableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS) + public void testTracking_OutOfQuota_ForegroundAndBackground_DisableTopStartedJobsThrottling() { setDischarging(); JobStatus jobBg = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 1); @@ -4851,6 +5040,7 @@ public class QuotaControllerTest { // Go to a background state. setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING); advanceElapsedClock(remainingTimeMs / 2 + 1); + // Only Bg job will be changed from in-quota to out-of-quota. inOrder.verify(mJobSchedulerService, timeout(remainingTimeMs / 2 + 2 * SECOND_IN_MILLIS).times(1)) .onControllerStateChanged(argThat(jobs -> jobs.size() == 1)); @@ -4896,6 +5086,105 @@ public class QuotaControllerTest { assertFalse(jobBg2.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); } + /** + * Tests that TOP jobs are stopped when an app runs out of quota. + */ + @Test + @EnableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS) + public void testTracking_OutOfQuota_ForegroundAndBackground_EnableTopStartedJobsThrottling() { + setDischarging(); + + JobStatus jobBg = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 1); + JobStatus jobTop = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 2); + trackJobs(jobBg, jobTop); + setStandbyBucket(WORKING_INDEX, jobTop, jobBg); // 2 hour window + // Now the package only has 20 seconds to run. + final long remainingTimeMs = 20 * SECOND_IN_MILLIS; + mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE, + createTimingSession( + JobSchedulerService.sElapsedRealtimeClock.millis() - HOUR_IN_MILLIS, + 10 * MINUTE_IN_MILLIS - remainingTimeMs, 1), false); + + InOrder inOrder = inOrder(mJobSchedulerService); + + // UID starts out inactive. + setProcessState(ActivityManager.PROCESS_STATE_SERVICE); + // Start the job. + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg); + } + advanceElapsedClock(remainingTimeMs / 2); + // New job starts after UID is in the foreground. Since the app is now in the foreground, it + // should continue to have remainingTimeMs / 2 time remaining. + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop); + } + advanceElapsedClock(remainingTimeMs); + + // Wait for some extra time to allow for job processing. + inOrder.verify(mJobSchedulerService, + timeout(remainingTimeMs + 2 * SECOND_IN_MILLIS).times(0)) + .onControllerStateChanged(argThat(jobs -> jobs.size() > 0)); + synchronized (mQuotaController.mLock) { + assertEquals(remainingTimeMs / 2, + mQuotaController.getRemainingExecutionTimeLocked(jobBg)); + assertEquals(remainingTimeMs / 2, + mQuotaController.getRemainingExecutionTimeLocked(jobTop)); + } + // Go to a background state. + setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING); + advanceElapsedClock(remainingTimeMs / 2 + 1); + // Both Bg and Top jobs should be changed from in-quota to out-of-quota + inOrder.verify(mJobSchedulerService, + timeout(remainingTimeMs / 2 + 2 * SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 2)); + // Top job should NOT be allowed to run. + assertFalse(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertFalse(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + + // New jobs to run. + JobStatus jobBg2 = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 3); + JobStatus jobTop2 = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 4); + JobStatus jobFg = createJobStatus("testTracking_OutOfQuota_ForegroundAndBackground", 5); + setStandbyBucket(WORKING_INDEX, jobBg2, jobTop2, jobFg); + + advanceElapsedClock(20 * SECOND_IN_MILLIS); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + // Both Bg and Top jobs should be changed from out-of-quota to in-quota. + inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 2)); + trackJobs(jobFg, jobTop); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop); + } + assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertTrue(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertTrue(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + + // App still in foreground so everything should be in quota. + advanceElapsedClock(20 * SECOND_IN_MILLIS); + setProcessState(getProcessStateQuotaFreeThreshold()); + assertTrue(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertTrue(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertTrue(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + + advanceElapsedClock(20 * SECOND_IN_MILLIS); + // App is in background so everything should be out of quota. + setProcessState(ActivityManager.PROCESS_STATE_SERVICE); + // Bg, Fg and Top jobs should be changed from in-quota to out-of-quota. + inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 3)); + // App is now in background and out of quota. Fg should now change to out of quota + // since it wasn't started. Top should now changed to out of quota even it started + // when the app was in TOP. + assertFalse(jobTop.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertFalse(jobFg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + assertFalse(jobBg.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + trackJobs(jobBg2); + assertFalse(jobBg2.isConstraintSatisfied(JobStatus.CONSTRAINT_WITHIN_QUOTA)); + } + /** * Tests that a job is properly updated and JobSchedulerService is notified when a job reaches * its quota. @@ -6280,6 +6569,7 @@ public class QuotaControllerTest { mQuotaController.getEJTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); advanceElapsedClock(SECOND_IN_MILLIS); + mSetFlagsRule.disableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); // Bg job 1 starts, then top job starts. Bg job 1 job ends. Then app goes to // foreground_service and a new job starts. Shortly after, uid goes @@ -6333,6 +6623,63 @@ public class QuotaControllerTest { expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 2)); assertEquals(expected, mQuotaController.getEJTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); + + advanceElapsedClock(SECOND_IN_MILLIS); + mSetFlagsRule.enableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS); + + // Bg job 1 starts, then top job starts. Bg job 1 job ends. Then app goes to + // foreground_service and a new job starts. Shortly after, uid goes + // "inactive" and then bg job 2 starts. Then top job ends, followed by bg and fg jobs. + // This should result in two TimingSessions: + // * The first should have a count of 1 + // * The second should have a count of 3, which accounts for the bg2, fg and top jobs. + // Top started jobs are not quota free any more if the process leaves TOP/BTOP state. + start = JobSchedulerService.sElapsedRealtimeClock.millis(); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStartTrackingJobLocked(jobBg1, null); + mQuotaController.maybeStartTrackingJobLocked(jobBg2, null); + mQuotaController.maybeStartTrackingJobLocked(jobFg1, null); + mQuotaController.maybeStartTrackingJobLocked(jobTop, null); + } + setProcessState(ActivityManager.PROCESS_STATE_LAST_ACTIVITY); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg1); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + expected.add(createTimingSession(start, 10 * SECOND_IN_MILLIS, 1)); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobBg1, jobBg1); + } + advanceElapsedClock(5 * SECOND_IN_MILLIS); + setProcessState(getProcessStateQuotaFreeThreshold()); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobFg1); + } + advanceElapsedClock(5 * SECOND_IN_MILLIS); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + advanceElapsedClock(10 * SECOND_IN_MILLIS); // UID "inactive" now + start = JobSchedulerService.sElapsedRealtimeClock.millis(); + setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg2); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobTop, null); + } + advanceElapsedClock(10 * SECOND_IN_MILLIS); + synchronized (mQuotaController.mLock) { + mQuotaController.maybeStopTrackingJobLocked(jobBg2, null); + mQuotaController.maybeStopTrackingJobLocked(jobFg1, null); + } + expected.add(createTimingSession(start, 20 * SECOND_IN_MILLIS, 3)); + assertEquals(expected, + mQuotaController.getEJTimingSessions(SOURCE_USER_ID, SOURCE_PACKAGE)); } /** @@ -6701,7 +7048,8 @@ public class QuotaControllerTest { * Tests that expedited jobs aren't stopped when an app runs out of quota. */ @Test - public void testEJTracking_OutOfQuota_ForegroundAndBackground() { + @DisableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS) + public void testEJTracking_OutOfQuota_ForegroundAndBackground_DisableTopStartedJobsThrottling() { setDischarging(); setDeviceConfigLong(QcConstants.KEY_EJ_GRACE_PERIOD_TOP_APP_MS, 0); @@ -6812,6 +7160,129 @@ public class QuotaControllerTest { } } + /** + * Tests that expedited jobs are stopped when an app runs out of quota. + */ + @Test + @EnableFlags(Flags.FLAG_ENFORCE_QUOTA_POLICY_TO_TOP_STARTED_JOBS) + public void testEJTracking_OutOfQuota_ForegroundAndBackground_EnableTopStartedJobsThrottling() { + setDischarging(); + setDeviceConfigLong(QcConstants.KEY_EJ_GRACE_PERIOD_TOP_APP_MS, 0); + + JobStatus jobBg = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 1); + JobStatus jobTop = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 2); + JobStatus jobUnstarted = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 3); + trackJobs(jobBg, jobTop, jobUnstarted); + setStandbyBucket(WORKING_INDEX, jobTop, jobBg, jobUnstarted); + // Now the package only has 20 seconds to run. + final long remainingTimeMs = 20 * SECOND_IN_MILLIS; + mQuotaController.saveTimingSession(SOURCE_USER_ID, SOURCE_PACKAGE, + createTimingSession( + JobSchedulerService.sElapsedRealtimeClock.millis() - HOUR_IN_MILLIS, + mQcConstants.EJ_LIMIT_WORKING_MS - remainingTimeMs, 1), true); + + InOrder inOrder = inOrder(mJobSchedulerService); + + // UID starts out inactive. + setProcessState(ActivityManager.PROCESS_STATE_SERVICE); + // Start the job. + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobBg); + } + advanceElapsedClock(remainingTimeMs / 2); + // New job starts after UID is in the foreground. Since the app is now in the foreground, it + // should continue to have remainingTimeMs / 2 time remaining. + setProcessState(ActivityManager.PROCESS_STATE_TOP); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop); + } + advanceElapsedClock(remainingTimeMs); + + // Wait for some extra time to allow for job processing. + inOrder.verify(mJobSchedulerService, + timeout(remainingTimeMs + 2 * SECOND_IN_MILLIS).times(0)) + .onControllerStateChanged(argThat(jobs -> jobs.size() > 0)); + synchronized (mQuotaController.mLock) { + assertEquals(remainingTimeMs / 2, + mQuotaController.getRemainingEJExecutionTimeLocked( + SOURCE_USER_ID, SOURCE_PACKAGE)); + } + // Go to a background state. + setProcessState(ActivityManager.PROCESS_STATE_TOP_SLEEPING); + advanceElapsedClock(remainingTimeMs / 2 + 1); + // Bg, Top and jobUnstarted should be changed from in-quota to out-of-quota. + inOrder.verify(mJobSchedulerService, + timeout(remainingTimeMs / 2 + 2 * SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 3)); + // Top should still NOT be "in quota" even it started before the app + // ran on top out of quota. + assertFalse(jobBg.isExpeditedQuotaApproved()); + assertFalse(jobTop.isExpeditedQuotaApproved()); + assertFalse(jobUnstarted.isExpeditedQuotaApproved()); + synchronized (mQuotaController.mLock) { + assertTrue( + 0 >= mQuotaController + .getRemainingEJExecutionTimeLocked(SOURCE_USER_ID, SOURCE_PACKAGE)); + } + + // New jobs to run. + JobStatus jobBg2 = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 4); + JobStatus jobTop2 = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 5); + JobStatus jobFg = + createExpeditedJobStatus("testEJTracking_OutOfQuota_ForegroundAndBackground", 6); + setStandbyBucket(WORKING_INDEX, jobBg2, jobTop2, jobFg); + + advanceElapsedClock(20 * SECOND_IN_MILLIS); + setProcessState(ActivityManager.PROCESS_STATE_TOP); + // Confirm QC recognizes that jobUnstarted has changed from out-of-quota to in-quota. + // jobBg, jobFg and jobUnstarted are changed from out-of-quota to in-quota. + inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 3)); + trackJobs(jobTop2, jobFg); + synchronized (mQuotaController.mLock) { + mQuotaController.prepareForExecutionLocked(jobTop2); + } + assertTrue(jobTop.isExpeditedQuotaApproved()); + assertTrue(jobTop2.isExpeditedQuotaApproved()); + assertTrue(jobFg.isExpeditedQuotaApproved()); + assertTrue(jobBg.isExpeditedQuotaApproved()); + assertTrue(jobUnstarted.isExpeditedQuotaApproved()); + + // App still in foreground so everything should be in quota. + advanceElapsedClock(20 * SECOND_IN_MILLIS); + setProcessState(getProcessStateQuotaFreeThreshold()); + assertTrue(jobTop.isExpeditedQuotaApproved()); + assertTrue(jobTop2.isExpeditedQuotaApproved()); + assertTrue(jobFg.isExpeditedQuotaApproved()); + assertTrue(jobBg.isExpeditedQuotaApproved()); + assertTrue(jobUnstarted.isExpeditedQuotaApproved()); + + advanceElapsedClock(20 * SECOND_IN_MILLIS); + setProcessState(ActivityManager.PROCESS_STATE_SERVICE); + // Bg, Fg, Top, Top2 and jobUnstarted should be changed from in-quota to out-of-quota + inOrder.verify(mJobSchedulerService, timeout(SECOND_IN_MILLIS).times(1)) + .onControllerStateChanged(argThat(jobs -> jobs.size() == 5)); + // App is now in background and out of quota. Fg should now change to out of quota since it + // wasn't started. Top should change to out of quota as the app leaves TOP state. + assertFalse(jobTop.isExpeditedQuotaApproved()); + assertFalse(jobTop2.isExpeditedQuotaApproved()); + assertFalse(jobFg.isExpeditedQuotaApproved()); + assertFalse(jobBg.isExpeditedQuotaApproved()); + trackJobs(jobBg2); + assertFalse(jobBg2.isExpeditedQuotaApproved()); + assertFalse(jobUnstarted.isExpeditedQuotaApproved()); + synchronized (mQuotaController.mLock) { + assertTrue( + 0 >= mQuotaController + .getRemainingEJExecutionTimeLocked(SOURCE_USER_ID, SOURCE_PACKAGE)); + } + } + /** * Tests that Timers properly track overlapping top and background jobs. */ -- GitLab From 3d28d17497beeb52ad1b1892f3a59715da7aee66 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Sat, 19 Oct 2024 15:19:55 -0700 Subject: [PATCH 090/459] Cleanup released sqlite flags Remove the simple_sql_comment_scanner flag and any code that is subsequently unreachable. A few comments have been updated. Remove the sqlite_allow_temp_tables flag. Comments have been updated to remove references to the flagging. Flag: EXEMPT flag-cleanup Test: atest * FrameworksCoreTests:android.database * CtsDatabaseTestCases Bug: 347726805 Bug: 347725835 Change-Id: I56969e85e780c924a98700875253dd898452a608 --- core/java/android/database/DatabaseUtils.java | 55 +------------------ .../database/sqlite/SQLiteConnection.java | 15 ++--- .../android/database/sqlite/flags.aconfig | 16 ------ .../database/sqlite/SQLiteDatabaseTest.java | 1 - 4 files changed, 6 insertions(+), 81 deletions(-) diff --git a/core/java/android/database/DatabaseUtils.java b/core/java/android/database/DatabaseUtils.java index 3c4307c63cf7..0d583dedeb74 100644 --- a/core/java/android/database/DatabaseUtils.java +++ b/core/java/android/database/DatabaseUtils.java @@ -48,8 +48,6 @@ import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * Static utility methods for dealing with databases and {@link Cursor}s. @@ -1576,49 +1574,6 @@ public class DatabaseUtils { db.close(); } - /** - * The legacy prefix matcher. - */ - private static String getSqlStatementPrefixSimple(@NonNull String sql) { - sql = sql.trim(); - if (sql.length() < 3) { - return null; - } - return sql.substring(0, 3).toUpperCase(Locale.ROOT); - } - - /** - * A regular expression that matches the first three characters in a SQL statement, after - * skipping past comments and whitespace. PREFIX_GROUP_NUM is the regex group that contains - * the matching prefix string. If PREFIX_REGEX is changed, PREFIX_GROUP_NUM may require an - * update too. - */ - private static final String PREFIX_REGEX = - "(" // Zero-or more... - + "\\s+" // Leading space - + "|" - + "--.*?\n" // Line comment - + "|" - + "/\\*[\\w\\W]*?\\*/" // Block comment - + ")*" - + "(\\w\\w\\w)"; // Three word-characters - private static final int PREFIX_GROUP_NUM = 2; - private static final Pattern sPrefixPattern = Pattern.compile(PREFIX_REGEX); - - /** - * Return the three-letter prefix of a SQL statement, skipping past whitespace and comments. - * Comments either start with "--" and run to the end of the line or are C-style block - * comments. The function returns null if a prefix could not be found. - */ - private static String getSqlStatementPrefixExtendedRegex(String sql) { - Matcher m = sPrefixPattern.matcher(sql); - if (m.lookingAt()) { - return m.group(PREFIX_GROUP_NUM).toUpperCase(Locale.ROOT); - } else { - return null; - } - } - /** * Return the index of the first character past comments and whitespace. -1 is returned if * a comment is malformed. @@ -1719,15 +1674,7 @@ public class DatabaseUtils { * @hide */ public static int getSqlStatementTypeExtended(@NonNull String sql) { - if (Flags.simpleSqlCommentScanner()) { - return categorizeStatement(getSqlStatementPrefixExtendedNoRegex(sql), sql); - } else { - int type = categorizeStatement(getSqlStatementPrefixSimple(sql), sql); - if (type == STATEMENT_COMMENT) { - type = categorizeStatement(getSqlStatementPrefixExtendedRegex(sql), sql); - } - return type; - } + return categorizeStatement(getSqlStatementPrefixExtendedNoRegex(sql), sql); } /** diff --git a/core/java/android/database/sqlite/SQLiteConnection.java b/core/java/android/database/sqlite/SQLiteConnection.java index 914aa51e5314..d77e6280d19c 100644 --- a/core/java/android/database/sqlite/SQLiteConnection.java +++ b/core/java/android/database/sqlite/SQLiteConnection.java @@ -129,9 +129,6 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen // Restrict this connection to read-only operations. private boolean mOnlyAllowReadOnlyOperations; - // Allow this connection to treat updates to temporary tables as read-only operations. - private boolean mAllowTempTableRetry = Flags.sqliteAllowTempTables(); - // The number of times attachCancellationSignal has been called. // Because SQLite statement execution can be reentrant, we keep track of how many // times we have attempted to attach a cancellation signal to the connection so that @@ -1281,19 +1278,17 @@ public final class SQLiteConnection implements CancellationSignal.OnCancelListen /** * Verify that the statement is read-only, if the connection only allows read-only - * operations. If the connection allows updates to temporary tables, then the statement is - * read-only if the only updates are to temporary tables. + * operations. If the statement is not read-only, then check if the statement only modifies + * temp tables, in which case it is treated the same as a read-only statement and is allowed. * @param statement The statement to check. * @throws SQLiteException if the statement could update the database inside a read-only * transaction. */ void throwIfStatementForbidden(PreparedStatement statement) { if (mOnlyAllowReadOnlyOperations && !statement.mReadOnly) { - if (mAllowTempTableRetry) { - statement.mReadOnly = - nativeUpdatesTempOnly(mConnectionPtr, statement.mStatementPtr); - if (statement.mReadOnly) return; - } + statement.mReadOnly = + nativeUpdatesTempOnly(mConnectionPtr, statement.mStatementPtr); + if (statement.mReadOnly) return; throw new SQLiteException("Cannot execute this statement because it " + "might modify the database but the connection is read-only."); diff --git a/core/java/android/database/sqlite/flags.aconfig b/core/java/android/database/sqlite/flags.aconfig index 285f984faab7..d5a7db82d456 100644 --- a/core/java/android/database/sqlite/flags.aconfig +++ b/core/java/android/database/sqlite/flags.aconfig @@ -9,19 +9,3 @@ flag { description: "SQLite APIs held back for Android 15" bug: "279043253" } - -flag { - name: "sqlite_allow_temp_tables" - namespace: "system_performance" - is_fixed_read_only: true - description: "Permit updates to TEMP tables in read-only transactions" - bug: "317993835" -} - -flag { - name: "simple_sql_comment_scanner" - namespace: "system_performance" - is_fixed_read_only: true - description: "Scan SQL comments by hand instead of with a regex" - bug: "329118560" -} diff --git a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java index 9d477094692a..d5479ea3310d 100644 --- a/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java +++ b/core/tests/coretests/src/android/database/sqlite/SQLiteDatabaseTest.java @@ -358,7 +358,6 @@ public class SQLiteDatabaseTest { assertTrue("ReadThread failed with errors: " + errors, errors.isEmpty()); } - @RequiresFlagsEnabled(Flags.FLAG_SQLITE_ALLOW_TEMP_TABLES) @Test public void testTempTable() { boolean allowed; -- GitLab From 6970b5628e45049eea2d1bdcce2ac99994a55f9b Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Sun, 20 Oct 2024 11:46:08 +0900 Subject: [PATCH 091/459] Use old JNI on robolectric environment Bug: 361260253 Test: N/A Flag: com.android.text.flags.typeface_redesign Change-Id: I3b78b4400785438e09b3882d106d22e4bba5cf49 --- graphics/java/android/graphics/text/PositionedGlyphs.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/graphics/java/android/graphics/text/PositionedGlyphs.java b/graphics/java/android/graphics/text/PositionedGlyphs.java index ed17fdefcb53..792e248ce839 100644 --- a/graphics/java/android/graphics/text/PositionedGlyphs.java +++ b/graphics/java/android/graphics/text/PositionedGlyphs.java @@ -24,6 +24,7 @@ import android.annotation.NonNull; import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.fonts.Font; +import android.os.Build; import com.android.internal.util.Preconditions; import com.android.text.flags.Flags; @@ -53,6 +54,8 @@ public final class PositionedGlyphs { Typeface.class.getClassLoader(), nReleaseFunc()); } + private static boolean sIsRobolectric = Build.FINGERPRINT.equals("robolectric"); + private final long mLayoutPtr; private final float mXOffset; private final float mYOffset; @@ -252,7 +255,7 @@ public final class PositionedGlyphs { mXOffset = xOffset; mYOffset = yOffset; - if (Flags.typefaceRedesign()) { + if (!sIsRobolectric && Flags.typefaceRedesign()) { int fontCount = nGetFontCount(layoutPtr); mFonts = new ArrayList<>(fontCount); for (int i = 0; i < fontCount; ++i) { -- GitLab From 024f141dd3e92b26812c951c57108e154e8a078f Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Sun, 20 Oct 2024 13:59:35 +0900 Subject: [PATCH 092/459] Remove RELEASE_PACKAGE_VARIABLE_NOTO_SANS_CJK dependency Bug: 364533012 Test: m Flag: EXEMPT removing RELEASE_PACKAGE_VARIABLE_NOTO_SANS_CJK Change-Id: I7bc1ba843d71e33c52540daefdcb1d925902313e --- data/fonts/Android.bp | 15 +- data/fonts/font_fallback.xml | 950 --------------- data/fonts/font_fallback_cjkvf.xml | 966 --------------- data/fonts/fonts.xml | 140 ++- data/fonts/fonts_cjkvf.xml | 1795 ---------------------------- 5 files changed, 137 insertions(+), 3729 deletions(-) delete mode 100644 data/fonts/font_fallback.xml delete mode 100644 data/fonts/font_fallback_cjkvf.xml delete mode 100644 data/fonts/fonts_cjkvf.xml diff --git a/data/fonts/Android.bp b/data/fonts/Android.bp index 4edf52bae161..0964aab43380 100644 --- a/data/fonts/Android.bp +++ b/data/fonts/Android.bp @@ -53,22 +53,9 @@ soong_config_bool_variable { name: "use_var_font", } -soong_config_module_type { - name: "prebuilt_fonts_xml", - module_type: "prebuilt_etc", - config_namespace: "noto_sans_cjk_config", - bool_variables: ["use_var_font"], - properties: ["src"], -} - -prebuilt_fonts_xml { +prebuilt_etc { name: "fonts.xml", src: "fonts.xml", - soong_config_variables: { - use_var_font: { - src: "fonts_cjkvf.xml", - }, - }, } prebuilt_etc { diff --git a/data/fonts/font_fallback.xml b/data/fonts/font_fallback.xml deleted file mode 100644 index ae50da18119f..000000000000 --- a/data/fonts/font_fallback.xml +++ /dev/null @@ -1,950 +0,0 @@ - - - - - - Roboto-Regular.ttf - - - - - - - - - - - - - - - - - Roboto-Regular.ttf - - - - - - - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - NotoSerif-BoldItalic.ttf - - - - - - - - - - - - - DroidSansMono.ttf - - - - - - CutiveMono.ttf - - - - - - ComingSoon.ttf - - - - DancingScript-Regular.ttf - - - - CarroisGothicSC-Regular.ttf - - - - SourceSansPro-Regular.ttf - SourceSansPro-Italic.ttf - SourceSansPro-SemiBold.ttf - SourceSansPro-SemiBoldItalic.ttf - SourceSansPro-Bold.ttf - SourceSansPro-BoldItalic.ttf - - - - - RobotoFlex-Regular.ttf - - - - - - - - NotoNaskhArabic-Regular.ttf - - NotoNaskhArabic-Bold.ttf - - - - NotoNaskhArabicUI-Regular.ttf - - NotoNaskhArabicUI-Bold.ttf - - - - NotoSansEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - - - NotoSansHebrew-Regular.ttf - - NotoSansHebrew-Bold.ttf - NotoSerifHebrew-Regular.ttf - NotoSerifHebrew-Bold.ttf - - - NotoSansThai-Regular.ttf - - NotoSansThai-Bold.ttf - - NotoSerifThai-Regular.ttf - - NotoSerifThai-Bold.ttf - - - - NotoSansThaiUI-Regular.ttf - - NotoSansThaiUI-Bold.ttf - - - - NotoSansArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - - - NotoSansGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - - - NotoSansDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - - - NotoSansDevanagariUI-VF.ttf - - - - - - - NotoSansGujarati-Regular.ttf - - NotoSansGujarati-Bold.ttf - - NotoSerifGujarati-VF.ttf - - - - - NotoSansGujaratiUI-Regular.ttf - - NotoSansGujaratiUI-Bold.ttf - - - - NotoSansGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - - - NotoSansGurmukhiUI-VF.ttf - - - - - NotoSansTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - - - NotoSansTamilUI-VF.ttf - - - - - NotoSansMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - - - NotoSansMalayalamUI-VF.ttf - - - - - NotoSansBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - - - NotoSansBengaliUI-VF.ttf - - - - - NotoSansTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - - - NotoSansTeluguUI-VF.ttf - - - - - NotoSansKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - - - NotoSansKannadaUI-VF.ttf - - - - NotoSansOriya-Regular.ttf - - NotoSansOriya-Bold.ttf - - - - NotoSansOriyaUI-Regular.ttf - - NotoSansOriyaUI-Bold.ttf - - - - NotoSansSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - - - NotoSansSinhalaUI-VF.ttf - - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - NotoSerifKhmer-Regular.otf - NotoSerifKhmer-Bold.otf - - - - NotoSansKhmerUI-Regular.ttf - - NotoSansKhmerUI-Bold.ttf - - - NotoSansLao-Regular.ttf - - NotoSansLao-Bold.ttf - - NotoSerifLao-Regular.ttf - - NotoSerifLao-Bold.ttf - - - NotoSansLaoUI-Regular.ttf - - NotoSansLaoUI-Bold.ttf - - - NotoSansMyanmar-Regular.otf - NotoSansMyanmar-Medium.otf - NotoSansMyanmar-Bold.otf - NotoSerifMyanmar-Regular.otf - NotoSerifMyanmar-Bold.otf - - - NotoSansMyanmarUI-Regular.otf - NotoSansMyanmarUI-Medium.otf - NotoSansMyanmarUI-Bold.otf - - - - NotoSansThaana-Regular.ttf - - NotoSansThaana-Bold.ttf - - - NotoSansCham-Regular.ttf - - NotoSansCham-Bold.ttf - - - NotoSansAhom-Regular.otf - - - - NotoSansAdlam-VF.ttf - - - - - NotoSansAvestan-Regular.ttf - - - - - NotoSansBalinese-Regular.ttf - - - - NotoSansBamum-Regular.ttf - - - - NotoSansBatak-Regular.ttf - - - - - NotoSansBrahmi-Regular.ttf - - - - - NotoSansBuginese-Regular.ttf - - - - NotoSansBuhid-Regular.ttf - - - - - NotoSansCanadianAboriginal-Regular.ttf - - - - - NotoSansCarian-Regular.ttf - - - - NotoSansChakma-Regular.otf - - - NotoSansCherokee-Regular.ttf - - - - NotoSansCoptic-Regular.ttf - - - - - NotoSansCuneiform-Regular.ttf - - - - - NotoSansCypriot-Regular.ttf - - - - - NotoSansDeseret-Regular.ttf - - - - - NotoSansEgyptianHieroglyphs-Regular.ttf - - - - NotoSansElbasan-Regular.otf - - - - NotoSansGlagolitic-Regular.ttf - - - - - NotoSansGothic-Regular.ttf - - - - - NotoSansHanunoo-Regular.ttf - - - - - NotoSansImperialAramaic-Regular.ttf - - - - - NotoSansInscriptionalPahlavi-Regular.ttf - - - - - NotoSansInscriptionalParthian-Regular.ttf - - - - NotoSansJavanese-Regular.otf - - - - NotoSansKaithi-Regular.ttf - - - - - NotoSansKayahLi-Regular.ttf - - - - - NotoSansKharoshthi-Regular.ttf - - - - - NotoSansLepcha-Regular.ttf - - - - NotoSansLimbu-Regular.ttf - - - - - NotoSansLinearB-Regular.ttf - - - - NotoSansLisu-Regular.ttf - - - - - NotoSansLycian-Regular.ttf - - - - - NotoSansLydian-Regular.ttf - - - - - NotoSansMandaic-Regular.ttf - - - - - NotoSansMeeteiMayek-Regular.ttf - - - - - NotoSansNewTaiLue-Regular.ttf - - - - NotoSansNKo-Regular.ttf - - - - NotoSansOgham-Regular.ttf - - - - - NotoSansOlChiki-Regular.ttf - - - - - NotoSansOldItalic-Regular.ttf - - - - - NotoSansOldPersian-Regular.ttf - - - - - NotoSansOldSouthArabian-Regular.ttf - - - - - NotoSansOldTurkic-Regular.ttf - - - - NotoSansOsage-Regular.ttf - - - - NotoSansOsmanya-Regular.ttf - - - - - NotoSansPhoenician-Regular.ttf - - - - - NotoSansRejang-Regular.ttf - - - - NotoSansRunic-Regular.ttf - - - - - NotoSansSamaritan-Regular.ttf - - - - - NotoSansSaurashtra-Regular.ttf - - - - - NotoSansShavian-Regular.ttf - - - - - NotoSansSundanese-Regular.ttf - - - - - NotoSansSylotiNagri-Regular.ttf - - - - - - NotoSansSyriacEstrangela-Regular.ttf - - - - - NotoSansSyriacEastern-Regular.ttf - - - - - NotoSansSyriacWestern-Regular.ttf - - - - - NotoSansTagalog-Regular.ttf - - - - - NotoSansTagbanwa-Regular.ttf - - - - - NotoSansTaiTham-Regular.ttf - - - - - NotoSansTaiViet-Regular.ttf - - - - - NotoSerifTibetan-VF.ttf - - - - NotoSansTifinagh-Regular.otf - - - - NotoSansUgaritic-Regular.ttf - - - - NotoSansVai-Regular.ttf - - - - NotoSansSymbols-Regular-Subsetted.ttf - - - - NotoSansCJK-Regular.ttc - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - NotoSerifCJK-Regular.ttc - - - - - NotoSerifHentaigana.ttf - - - - - - NotoSansCJK-Regular.ttc - - NotoSerifCJK-Regular.ttc - - - - NotoColorEmoji.ttf - - - NotoColorEmojiFlags.ttf - - - NotoSansSymbols-Regular-Subsetted2.ttf - - - - NotoSansTaiLe-Regular.ttf - - - - NotoSansYi-Regular.ttf - - - - NotoSansMongolian-Regular.ttf - - - - - NotoSansPhagsPa-Regular.ttf - - - - NotoSansAnatolianHieroglyphs-Regular.otf - - - NotoSansBassaVah-Regular.otf - - - NotoSansBhaiksuki-Regular.otf - - - NotoSansHatran-Regular.otf - - - NotoSansLinearA-Regular.otf - - - NotoSansManichaean-Regular.otf - - - NotoSansMarchen-Regular.otf - - - NotoSansMeroitic-Regular.otf - - - NotoSansMiao-Regular.otf - - - NotoSansMro-Regular.otf - - - NotoSansMultani-Regular.otf - - - NotoSansNabataean-Regular.otf - - - NotoSansNewa-Regular.otf - - - NotoSansOldNorthArabian-Regular.otf - - - NotoSansOldPermic-Regular.otf - - - NotoSansPahawhHmong-Regular.otf - - - NotoSansPalmyrene-Regular.otf - - - NotoSansPauCinHau-Regular.otf - - - NotoSansSharada-Regular.otf - - - NotoSansSoraSompeng-Regular.otf - - - NotoSansGunjalaGondi-Regular.otf - - - NotoSansHanifiRohingya-Regular.otf - - - NotoSansKhojki-Regular.otf - - - NotoSansMasaramGondi-Regular.otf - - - NotoSansWancho-Regular.otf - - - NotoSansWarangCiti-Regular.otf - - - NotoSansGrantha-Regular.ttf - - - NotoSansModi-Regular.ttf - - - NotoSerifDogra-Regular.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - - NotoSansSoyombo-VF.ttf - - - - - NotoSansTakri-VF.ttf - - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - - NotoSerifYezidi-VF.ttf - - - diff --git a/data/fonts/font_fallback_cjkvf.xml b/data/fonts/font_fallback_cjkvf.xml deleted file mode 100644 index 407d70410bbc..000000000000 --- a/data/fonts/font_fallback_cjkvf.xml +++ /dev/null @@ -1,966 +0,0 @@ - - - - - - Roboto-Regular.ttf - - - - - - - - - - - - - - - - - Roboto-Regular.ttf - - - - - - - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - NotoSerif-BoldItalic.ttf - - - - - - - - - - - - - DroidSansMono.ttf - - - - - - CutiveMono.ttf - - - - - - ComingSoon.ttf - - - - DancingScript-Regular.ttf - - - - CarroisGothicSC-Regular.ttf - - - - SourceSansPro-Regular.ttf - SourceSansPro-Italic.ttf - SourceSansPro-SemiBold.ttf - SourceSansPro-SemiBoldItalic.ttf - SourceSansPro-Bold.ttf - SourceSansPro-BoldItalic.ttf - - - - - RobotoFlex-Regular.ttf - - - - - - - - NotoNaskhArabic-Regular.ttf - - NotoNaskhArabic-Bold.ttf - - - - NotoNaskhArabicUI-Regular.ttf - - NotoNaskhArabicUI-Bold.ttf - - - - NotoSansEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - - - NotoSansHebrew-Regular.ttf - - NotoSansHebrew-Bold.ttf - NotoSerifHebrew-Regular.ttf - NotoSerifHebrew-Bold.ttf - - - NotoSansThai-Regular.ttf - - NotoSansThai-Bold.ttf - - NotoSerifThai-Regular.ttf - - NotoSerifThai-Bold.ttf - - - - NotoSansThaiUI-Regular.ttf - - NotoSansThaiUI-Bold.ttf - - - - NotoSansArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - - - NotoSansGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - - - NotoSansDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - - - NotoSansDevanagariUI-VF.ttf - - - - - - - NotoSansGujarati-Regular.ttf - - NotoSansGujarati-Bold.ttf - - NotoSerifGujarati-VF.ttf - - - - - NotoSansGujaratiUI-Regular.ttf - - NotoSansGujaratiUI-Bold.ttf - - - - NotoSansGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - - - NotoSansGurmukhiUI-VF.ttf - - - - - NotoSansTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - - - NotoSansTamilUI-VF.ttf - - - - - NotoSansMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - - - NotoSansMalayalamUI-VF.ttf - - - - - NotoSansBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - - - NotoSansBengaliUI-VF.ttf - - - - - NotoSansTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - - - NotoSansTeluguUI-VF.ttf - - - - - NotoSansKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - - - NotoSansKannadaUI-VF.ttf - - - - NotoSansOriya-Regular.ttf - - NotoSansOriya-Bold.ttf - - - - NotoSansOriyaUI-Regular.ttf - - NotoSansOriyaUI-Bold.ttf - - - - NotoSansSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - - - NotoSansSinhalaUI-VF.ttf - - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - NotoSerifKhmer-Regular.otf - NotoSerifKhmer-Bold.otf - - - - NotoSansKhmerUI-Regular.ttf - - NotoSansKhmerUI-Bold.ttf - - - NotoSansLao-Regular.ttf - - NotoSansLao-Bold.ttf - - NotoSerifLao-Regular.ttf - - NotoSerifLao-Bold.ttf - - - NotoSansLaoUI-Regular.ttf - - NotoSansLaoUI-Bold.ttf - - - NotoSansMyanmar-Regular.otf - NotoSansMyanmar-Medium.otf - NotoSansMyanmar-Bold.otf - NotoSerifMyanmar-Regular.otf - NotoSerifMyanmar-Bold.otf - - - NotoSansMyanmarUI-Regular.otf - NotoSansMyanmarUI-Medium.otf - NotoSansMyanmarUI-Bold.otf - - - - NotoSansThaana-Regular.ttf - - NotoSansThaana-Bold.ttf - - - NotoSansCham-Regular.ttf - - NotoSansCham-Bold.ttf - - - NotoSansAhom-Regular.otf - - - - NotoSansAdlam-VF.ttf - - - - - NotoSansAvestan-Regular.ttf - - - - - NotoSansBalinese-Regular.ttf - - - - NotoSansBamum-Regular.ttf - - - - NotoSansBatak-Regular.ttf - - - - - NotoSansBrahmi-Regular.ttf - - - - - NotoSansBuginese-Regular.ttf - - - - NotoSansBuhid-Regular.ttf - - - - - NotoSansCanadianAboriginal-Regular.ttf - - - - - NotoSansCarian-Regular.ttf - - - - NotoSansChakma-Regular.otf - - - NotoSansCherokee-Regular.ttf - - - - NotoSansCoptic-Regular.ttf - - - - - NotoSansCuneiform-Regular.ttf - - - - - NotoSansCypriot-Regular.ttf - - - - - NotoSansDeseret-Regular.ttf - - - - - NotoSansEgyptianHieroglyphs-Regular.ttf - - - - NotoSansElbasan-Regular.otf - - - - NotoSansGlagolitic-Regular.ttf - - - - - NotoSansGothic-Regular.ttf - - - - - NotoSansHanunoo-Regular.ttf - - - - - NotoSansImperialAramaic-Regular.ttf - - - - - NotoSansInscriptionalPahlavi-Regular.ttf - - - - - NotoSansInscriptionalParthian-Regular.ttf - - - - NotoSansJavanese-Regular.otf - - - - NotoSansKaithi-Regular.ttf - - - - - NotoSansKayahLi-Regular.ttf - - - - - NotoSansKharoshthi-Regular.ttf - - - - - NotoSansLepcha-Regular.ttf - - - - NotoSansLimbu-Regular.ttf - - - - - NotoSansLinearB-Regular.ttf - - - - NotoSansLisu-Regular.ttf - - - - - NotoSansLycian-Regular.ttf - - - - - NotoSansLydian-Regular.ttf - - - - - NotoSansMandaic-Regular.ttf - - - - - NotoSansMeeteiMayek-Regular.ttf - - - - - NotoSansNewTaiLue-Regular.ttf - - - - NotoSansNKo-Regular.ttf - - - - NotoSansOgham-Regular.ttf - - - - - NotoSansOlChiki-Regular.ttf - - - - - NotoSansOldItalic-Regular.ttf - - - - - NotoSansOldPersian-Regular.ttf - - - - - NotoSansOldSouthArabian-Regular.ttf - - - - - NotoSansOldTurkic-Regular.ttf - - - - NotoSansOsage-Regular.ttf - - - - NotoSansOsmanya-Regular.ttf - - - - - NotoSansPhoenician-Regular.ttf - - - - - NotoSansRejang-Regular.ttf - - - - NotoSansRunic-Regular.ttf - - - - - NotoSansSamaritan-Regular.ttf - - - - - NotoSansSaurashtra-Regular.ttf - - - - - NotoSansShavian-Regular.ttf - - - - - NotoSansSundanese-Regular.ttf - - - - - NotoSansSylotiNagri-Regular.ttf - - - - - - NotoSansSyriacEstrangela-Regular.ttf - - - - - NotoSansSyriacEastern-Regular.ttf - - - - - NotoSansSyriacWestern-Regular.ttf - - - - - NotoSansTagalog-Regular.ttf - - - - - NotoSansTagbanwa-Regular.ttf - - - - - NotoSansTaiTham-Regular.ttf - - - - - NotoSansTaiViet-Regular.ttf - - - - - NotoSerifTibetan-VF.ttf - - - - NotoSansTifinagh-Regular.otf - - - - NotoSansUgaritic-Regular.ttf - - - - NotoSansVai-Regular.ttf - - - - NotoSansSymbols-Regular-Subsetted.ttf - - - - NotoSansCJK-Regular.ttc - - - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - - - NotoSerifCJK-Regular.ttc - - - - - NotoSerifHentaigana.ttf - - - - - - NotoSansCJK-Regular.ttc - - - - NotoSerifCJK-Regular.ttc - - - - NotoColorEmoji.ttf - - - NotoColorEmojiFlags.ttf - - - NotoSansSymbols-Regular-Subsetted2.ttf - - - - NotoSansTaiLe-Regular.ttf - - - - NotoSansYi-Regular.ttf - - - - NotoSansMongolian-Regular.ttf - - - - - NotoSansPhagsPa-Regular.ttf - - - - NotoSansAnatolianHieroglyphs-Regular.otf - - - NotoSansBassaVah-Regular.otf - - - NotoSansBhaiksuki-Regular.otf - - - NotoSansHatran-Regular.otf - - - NotoSansLinearA-Regular.otf - - - NotoSansManichaean-Regular.otf - - - NotoSansMarchen-Regular.otf - - - NotoSansMeroitic-Regular.otf - - - NotoSansMiao-Regular.otf - - - NotoSansMro-Regular.otf - - - NotoSansMultani-Regular.otf - - - NotoSansNabataean-Regular.otf - - - NotoSansNewa-Regular.otf - - - NotoSansOldNorthArabian-Regular.otf - - - NotoSansOldPermic-Regular.otf - - - NotoSansPahawhHmong-Regular.otf - - - NotoSansPalmyrene-Regular.otf - - - NotoSansPauCinHau-Regular.otf - - - NotoSansSharada-Regular.otf - - - NotoSansSoraSompeng-Regular.otf - - - NotoSansGunjalaGondi-Regular.otf - - - NotoSansHanifiRohingya-Regular.otf - - - NotoSansKhojki-Regular.otf - - - NotoSansMasaramGondi-Regular.otf - - - NotoSansWancho-Regular.otf - - - NotoSansWarangCiti-Regular.otf - - - NotoSansGrantha-Regular.ttf - - - NotoSansModi-Regular.ttf - - - NotoSerifDogra-Regular.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - - NotoSansSoyombo-VF.ttf - - - - - NotoSansTakri-VF.ttf - - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - - NotoSerifYezidi-VF.ttf - - - diff --git a/data/fonts/fonts.xml b/data/fonts/fonts.xml index d1aa8e9734c2..8cbc3000c250 100644 --- a/data/fonts/fonts.xml +++ b/data/fonts/fonts.xml @@ -1409,24 +1409,123 @@ NotoSansSymbols-Regular-Subsetted.ttf - + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + NotoSerifCJK-Regular.ttc - + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + NotoSansCJK-Regular.ttc + NotoSerifCJK-Regular.ttc - + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + NotoSerifCJK-Regular.ttc @@ -1443,8 +1542,41 @@ - + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + + NotoSansCJK-Regular.ttc + + + NotoSansCJK-Regular.ttc + NotoSerifCJK-Regular.ttc diff --git a/data/fonts/fonts_cjkvf.xml b/data/fonts/fonts_cjkvf.xml deleted file mode 100644 index 8cbc3000c250..000000000000 --- a/data/fonts/fonts_cjkvf.xml +++ /dev/null @@ -1,1795 +0,0 @@ - - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - - - - - - - - - - - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - Roboto-Regular.ttf - - - - - - - - - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - NotoSerif-BoldItalic.ttf - - - - - - - - - - - - - DroidSansMono.ttf - - - - - - CutiveMono.ttf - - - - - - ComingSoon.ttf - - - - DancingScript-Regular.ttf - - - DancingScript-Regular.ttf - - - - - - CarroisGothicSC-Regular.ttf - - - - SourceSansPro-Regular.ttf - SourceSansPro-Italic.ttf - SourceSansPro-SemiBold.ttf - SourceSansPro-SemiBoldItalic.ttf - SourceSansPro-Bold.ttf - SourceSansPro-BoldItalic.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - RobotoFlex-Regular.ttf - - - - - - - - - - NotoNaskhArabic-Regular.ttf - - NotoNaskhArabic-Bold.ttf - - - - NotoNaskhArabicUI-Regular.ttf - - NotoNaskhArabicUI-Bold.ttf - - - - NotoSansEthiopic-VF.ttf - - - - NotoSansEthiopic-VF.ttf - - - - NotoSansEthiopic-VF.ttf - - - - NotoSansEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - NotoSerifEthiopic-VF.ttf - - - - - - NotoSansHebrew-Regular.ttf - - NotoSansHebrew-Bold.ttf - NotoSerifHebrew-Regular.ttf - NotoSerifHebrew-Bold.ttf - - - NotoSansThai-Regular.ttf - - NotoSansThai-Bold.ttf - - NotoSerifThai-Regular.ttf - - NotoSerifThai-Bold.ttf - - - - NotoSansThaiUI-Regular.ttf - - NotoSansThaiUI-Bold.ttf - - - - NotoSansArmenian-VF.ttf - - - - NotoSansArmenian-VF.ttf - - - - NotoSansArmenian-VF.ttf - - - - NotoSansArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - NotoSerifArmenian-VF.ttf - - - - - - NotoSansGeorgian-VF.ttf - - - - NotoSansGeorgian-VF.ttf - - - - NotoSansGeorgian-VF.ttf - - - - NotoSansGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - NotoSerifGeorgian-VF.ttf - - - - - - NotoSansDevanagari-VF.ttf - - - - NotoSansDevanagari-VF.ttf - - - - NotoSansDevanagari-VF.ttf - - - - NotoSansDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - NotoSerifDevanagari-VF.ttf - - - - - - NotoSansDevanagariUI-VF.ttf - - - - NotoSansDevanagariUI-VF.ttf - - - - NotoSansDevanagariUI-VF.ttf - - - - NotoSansDevanagariUI-VF.ttf - - - - - - - - NotoSansGujarati-Regular.ttf - - NotoSansGujarati-Bold.ttf - NotoSerifGujarati-VF.ttf - - - NotoSerifGujarati-VF.ttf - - - NotoSerifGujarati-VF.ttf - - - NotoSerifGujarati-VF.ttf - - - - - - NotoSansGujaratiUI-Regular.ttf - - NotoSansGujaratiUI-Bold.ttf - - - - NotoSansGurmukhi-VF.ttf - - - - NotoSansGurmukhi-VF.ttf - - - - NotoSansGurmukhi-VF.ttf - - - - NotoSansGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - NotoSerifGurmukhi-VF.ttf - - - - - - NotoSansGurmukhiUI-VF.ttf - - - - NotoSansGurmukhiUI-VF.ttf - - - - NotoSansGurmukhiUI-VF.ttf - - - - NotoSansGurmukhiUI-VF.ttf - - - - - - NotoSansTamil-VF.ttf - - - - NotoSansTamil-VF.ttf - - - - NotoSansTamil-VF.ttf - - - - NotoSansTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - NotoSerifTamil-VF.ttf - - - - - - NotoSansTamilUI-VF.ttf - - - - NotoSansTamilUI-VF.ttf - - - - NotoSansTamilUI-VF.ttf - - - - NotoSansTamilUI-VF.ttf - - - - - - NotoSansMalayalam-VF.ttf - - - - NotoSansMalayalam-VF.ttf - - - - NotoSansMalayalam-VF.ttf - - - - NotoSansMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - NotoSerifMalayalam-VF.ttf - - - - - - NotoSansMalayalamUI-VF.ttf - - - - NotoSansMalayalamUI-VF.ttf - - - - NotoSansMalayalamUI-VF.ttf - - - - NotoSansMalayalamUI-VF.ttf - - - - - - NotoSansBengali-VF.ttf - - - - NotoSansBengali-VF.ttf - - - - NotoSansBengali-VF.ttf - - - - NotoSansBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - NotoSerifBengali-VF.ttf - - - - - - NotoSansBengaliUI-VF.ttf - - - - NotoSansBengaliUI-VF.ttf - - - - NotoSansBengaliUI-VF.ttf - - - - NotoSansBengaliUI-VF.ttf - - - - - - NotoSansTelugu-VF.ttf - - - - NotoSansTelugu-VF.ttf - - - - NotoSansTelugu-VF.ttf - - - - NotoSansTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - NotoSerifTelugu-VF.ttf - - - - - - NotoSansTeluguUI-VF.ttf - - - - NotoSansTeluguUI-VF.ttf - - - - NotoSansTeluguUI-VF.ttf - - - - NotoSansTeluguUI-VF.ttf - - - - - - NotoSansKannada-VF.ttf - - - - NotoSansKannada-VF.ttf - - - - NotoSansKannada-VF.ttf - - - - NotoSansKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - NotoSerifKannada-VF.ttf - - - - - - NotoSansKannadaUI-VF.ttf - - - - NotoSansKannadaUI-VF.ttf - - - - NotoSansKannadaUI-VF.ttf - - - - NotoSansKannadaUI-VF.ttf - - - - - NotoSansOriya-Regular.ttf - - NotoSansOriya-Bold.ttf - - - - NotoSansOriyaUI-Regular.ttf - - NotoSansOriyaUI-Bold.ttf - - - - NotoSansSinhala-VF.ttf - - - - NotoSansSinhala-VF.ttf - - - - NotoSansSinhala-VF.ttf - - - - NotoSansSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - NotoSerifSinhala-VF.ttf - - - - - - NotoSansSinhalaUI-VF.ttf - - - - NotoSansSinhalaUI-VF.ttf - - - - NotoSansSinhalaUI-VF.ttf - - - - NotoSansSinhalaUI-VF.ttf - - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - - NotoSansKhmer-VF.ttf - - - - NotoSerifKhmer-Regular.otf - NotoSerifKhmer-Bold.otf - - - - NotoSansKhmerUI-Regular.ttf - - NotoSansKhmerUI-Bold.ttf - - - NotoSansLao-Regular.ttf - - NotoSansLao-Bold.ttf - - NotoSerifLao-Regular.ttf - - NotoSerifLao-Bold.ttf - - - NotoSansLaoUI-Regular.ttf - - NotoSansLaoUI-Bold.ttf - - - NotoSansMyanmar-Regular.otf - NotoSansMyanmar-Medium.otf - NotoSansMyanmar-Bold.otf - NotoSerifMyanmar-Regular.otf - NotoSerifMyanmar-Bold.otf - - - NotoSansMyanmarUI-Regular.otf - NotoSansMyanmarUI-Medium.otf - NotoSansMyanmarUI-Bold.otf - - - - NotoSansThaana-Regular.ttf - - NotoSansThaana-Bold.ttf - - - NotoSansCham-Regular.ttf - - NotoSansCham-Bold.ttf - - - NotoSansAhom-Regular.otf - - - - NotoSansAdlam-VF.ttf - - - - NotoSansAdlam-VF.ttf - - - - NotoSansAdlam-VF.ttf - - - - NotoSansAdlam-VF.ttf - - - - - - NotoSansAvestan-Regular.ttf - - - - - NotoSansBalinese-Regular.ttf - - - - NotoSansBamum-Regular.ttf - - - - NotoSansBatak-Regular.ttf - - - - - NotoSansBrahmi-Regular.ttf - - - - - NotoSansBuginese-Regular.ttf - - - - NotoSansBuhid-Regular.ttf - - - - - NotoSansCanadianAboriginal-Regular.ttf - - - - - NotoSansCarian-Regular.ttf - - - - NotoSansChakma-Regular.otf - - - NotoSansCherokee-Regular.ttf - - - - NotoSansCoptic-Regular.ttf - - - - - NotoSansCuneiform-Regular.ttf - - - - - NotoSansCypriot-Regular.ttf - - - - - NotoSansDeseret-Regular.ttf - - - - - NotoSansEgyptianHieroglyphs-Regular.ttf - - - - NotoSansElbasan-Regular.otf - - - - NotoSansGlagolitic-Regular.ttf - - - - - NotoSansGothic-Regular.ttf - - - - - NotoSansHanunoo-Regular.ttf - - - - - NotoSansImperialAramaic-Regular.ttf - - - - - NotoSansInscriptionalPahlavi-Regular.ttf - - - - - NotoSansInscriptionalParthian-Regular.ttf - - - - NotoSansJavanese-Regular.otf - - - - NotoSansKaithi-Regular.ttf - - - - - NotoSansKayahLi-Regular.ttf - - - - - NotoSansKharoshthi-Regular.ttf - - - - - NotoSansLepcha-Regular.ttf - - - - NotoSansLimbu-Regular.ttf - - - - - NotoSansLinearB-Regular.ttf - - - - NotoSansLisu-Regular.ttf - - - - - NotoSansLycian-Regular.ttf - - - - - NotoSansLydian-Regular.ttf - - - - - NotoSansMandaic-Regular.ttf - - - - - NotoSansMeeteiMayek-Regular.ttf - - - - - NotoSansNewTaiLue-Regular.ttf - - - - NotoSansNKo-Regular.ttf - - - - NotoSansOgham-Regular.ttf - - - - - NotoSansOlChiki-Regular.ttf - - - - - NotoSansOldItalic-Regular.ttf - - - - - NotoSansOldPersian-Regular.ttf - - - - - NotoSansOldSouthArabian-Regular.ttf - - - - - NotoSansOldTurkic-Regular.ttf - - - - NotoSansOsage-Regular.ttf - - - - NotoSansOsmanya-Regular.ttf - - - - - NotoSansPhoenician-Regular.ttf - - - - - NotoSansRejang-Regular.ttf - - - - NotoSansRunic-Regular.ttf - - - - - NotoSansSamaritan-Regular.ttf - - - - - NotoSansSaurashtra-Regular.ttf - - - - - NotoSansShavian-Regular.ttf - - - - - NotoSansSundanese-Regular.ttf - - - - - NotoSansSylotiNagri-Regular.ttf - - - - - - NotoSansSyriacEstrangela-Regular.ttf - - - - - NotoSansSyriacEastern-Regular.ttf - - - - - NotoSansSyriacWestern-Regular.ttf - - - - - NotoSansTagalog-Regular.ttf - - - - - NotoSansTagbanwa-Regular.ttf - - - - - NotoSansTaiTham-Regular.ttf - - - - - NotoSansTaiViet-Regular.ttf - - - - - NotoSerifTibetan-VF.ttf - - - - NotoSerifTibetan-VF.ttf - - - - NotoSerifTibetan-VF.ttf - - - - NotoSerifTibetan-VF.ttf - - - - - NotoSansTifinagh-Regular.otf - - - - NotoSansUgaritic-Regular.ttf - - - - NotoSansVai-Regular.ttf - - - - NotoSansSymbols-Regular-Subsetted.ttf - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - NotoSerifCJK-Regular.ttc - - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - NotoSerifCJK-Regular.ttc - - - - - NotoSerifHentaigana.ttf - - - - NotoSerifHentaigana.ttf - - - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - - NotoSansCJK-Regular.ttc - - - NotoSerifCJK-Regular.ttc - - - - NotoColorEmojiLegacy.ttf - - - NotoColorEmoji.ttf - - - NotoColorEmojiFlags.ttf - - - NotoSansSymbols-Regular-Subsetted2.ttf - - - - NotoSansTaiLe-Regular.ttf - - - - NotoSansYi-Regular.ttf - - - - NotoSansMongolian-Regular.ttf - - - - - NotoSansPhagsPa-Regular.ttf - - - - NotoSansAnatolianHieroglyphs-Regular.otf - - - NotoSansBassaVah-Regular.otf - - - NotoSansBhaiksuki-Regular.otf - - - NotoSansHatran-Regular.otf - - - NotoSansLinearA-Regular.otf - - - NotoSansManichaean-Regular.otf - - - NotoSansMarchen-Regular.otf - - - NotoSansMeroitic-Regular.otf - - - NotoSansMiao-Regular.otf - - - NotoSansMro-Regular.otf - - - NotoSansMultani-Regular.otf - - - NotoSansNabataean-Regular.otf - - - NotoSansNewa-Regular.otf - - - NotoSansOldNorthArabian-Regular.otf - - - NotoSansOldPermic-Regular.otf - - - NotoSansPahawhHmong-Regular.otf - - - NotoSansPalmyrene-Regular.otf - - - NotoSansPauCinHau-Regular.otf - - - NotoSansSharada-Regular.otf - - - NotoSansSoraSompeng-Regular.otf - - - NotoSansGunjalaGondi-Regular.otf - - - NotoSansHanifiRohingya-Regular.otf - - - NotoSansKhojki-Regular.otf - - - NotoSansMasaramGondi-Regular.otf - - - NotoSansWancho-Regular.otf - - - NotoSansWarangCiti-Regular.otf - - - NotoSansGrantha-Regular.ttf - - - NotoSansModi-Regular.ttf - - - NotoSerifDogra-Regular.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - NotoSansMedefaidrin-VF.ttf - - - - - - NotoSansSoyombo-VF.ttf - - - - NotoSansSoyombo-VF.ttf - - - - NotoSansSoyombo-VF.ttf - - - - NotoSansSoyombo-VF.ttf - - - - - - NotoSansTakri-VF.ttf - - - - NotoSansTakri-VF.ttf - - - - NotoSansTakri-VF.ttf - - - - NotoSansTakri-VF.ttf - - - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - NotoSerifNyiakengPuachueHmong-VF.ttf - - - - - - NotoSerifYezidi-VF.ttf - - - - NotoSerifYezidi-VF.ttf - - - - NotoSerifYezidi-VF.ttf - - - - NotoSerifYezidi-VF.ttf - - - - -- GitLab From fd6a41479aec7f1cb2a08f019be2042f0188c248 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Sat, 19 Oct 2024 21:32:32 +0800 Subject: [PATCH 093/459] Allow start custom activity for catalyst test Bug: 370394101 Flag: EXEMPT test Test: atest Change-Id: I38e3954a607e2fbb8525abc46b59b34e58d224cf --- .../preference/CatalystScreenTestCase.kt | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt index 06214eb6e743..8ef4c58d8985 100644 --- a/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt +++ b/packages/SettingsLib/Preference/testutils/com/android/settingslib/preference/CatalystScreenTestCase.kt @@ -99,15 +99,18 @@ abstract class CatalystScreenTestCase { @Suppress("UNCHECKED_CAST") val clazz = preferenceScreenCreator.fragmentClass() as Class val builder = StringBuilder() - launchFragmentScenario(clazz).use { - it.onFragment { fragment -> - taskFinished.set(true) - fragment.preferenceScreen.toString(builder) - } + launchFragment(clazz) { fragment -> + taskFinished.set(true) + fragment.preferenceScreen.toString(builder) } return builder.toString() } + protected open fun launchFragment( + fragmentClass: Class, + action: (PreferenceFragmentCompat) -> Unit, + ): Unit = launchFragmentScenario(fragmentClass).use { it.onFragment(action) } + protected open fun launchFragmentScenario(fragmentClass: Class) = FragmentScenario.launch(fragmentClass) -- GitLab From 7a998ac16c57e26ae8d56069df7698b608b4309f Mon Sep 17 00:00:00 2001 From: Chandru S Date: Wed, 16 Oct 2024 00:09:46 +0000 Subject: [PATCH 094/459] Handle keyboard/adb keyevent based authentication confirmation for password bouncer Bug: 310005730 Test: verified manually and through e2e tests 1. Enable password bouncer 2. Send a test messaging notification with inline reply option 3. Lock the device 4. Go to lockscreen, expand the notification shade, tap reply on the notificaiton 5. password bouncer shows up 6. enter the password and use `adb shell input keyevent ENTER` for sending the confirmation key 7. Password bouncer dismisses as expected and focus returns to the inline reply text box in the notification, instead of showing a black empty screen Flag: com.android.systemui.compose_bouncer Change-Id: I25538d204cc7a56c9566b7fbded1c7013bd28d10 Change-Id: Ifaaebed061205f40139f86816081b3c61f7d3c7e --- .../viewmodel/PasswordBouncerViewModelTest.kt | 38 ++++++++++++++++++- .../viewmodel/AuthMethodBouncerViewModel.kt | 8 ++++ .../viewmodel/BouncerSceneContentViewModel.kt | 6 +-- .../ui/viewmodel/PasswordBouncerViewModel.kt | 14 +++++++ .../ui/viewmodel/PinBouncerViewModel.kt | 2 +- 5 files changed, 62 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt index af3ddfca14b6..29ee87466f1a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModelTest.kt @@ -17,6 +17,9 @@ package com.android.systemui.bouncer.ui.viewmodel import android.content.pm.UserInfo +import android.platform.test.annotations.EnableFlags +import android.view.KeyEvent +import androidx.compose.ui.input.key.KeyEventType import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.compose.animation.scene.SceneKey @@ -27,6 +30,7 @@ import com.android.systemui.authentication.shared.model.AuthenticationMethodMode import com.android.systemui.bouncer.domain.interactor.bouncerInteractor import com.android.systemui.coroutines.collectLastValue import com.android.systemui.coroutines.collectValues +import com.android.systemui.flags.EnableSceneContainer import com.android.systemui.inputmethod.data.model.InputMethodModel import com.android.systemui.inputmethod.data.repository.fakeInputMethodRepository import com.android.systemui.inputmethod.domain.interactor.inputMethodInteractor @@ -67,11 +71,12 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { private val inputMethodInteractor by lazy { kosmos.inputMethodInteractor } private val isInputEnabled = MutableStateFlow(true) - private val underTest = + private val underTest by lazy { kosmos.passwordBouncerViewModelFactory.create( isInputEnabled = isInputEnabled, onIntentionalUserInput = {}, ) + } @Before fun setUp() { @@ -345,6 +350,37 @@ class PasswordBouncerViewModelTest : SysuiTestCase() { assertThat(textInputFocusRequested).isFalse() } + @EnableFlags(com.android.systemui.Flags.FLAG_COMPOSE_BOUNCER) + @Test + fun consumeConfirmKeyEvents_toPreventItFromPropagating() = + testScope.runTest { verifyConfirmKeyEventsBehavior(keyUpEventConsumed = true) } + + @EnableFlags(com.android.systemui.Flags.FLAG_COMPOSE_BOUNCER) + @EnableSceneContainer + @Test + fun noops_whenSceneContainerIsAlsoEnabled() = + testScope.runTest { verifyConfirmKeyEventsBehavior(keyUpEventConsumed = false) } + + private fun verifyConfirmKeyEventsBehavior(keyUpEventConsumed: Boolean) { + assertThat(underTest.onKeyEvent(KeyEventType.KeyDown, KeyEvent.KEYCODE_DPAD_CENTER)) + .isFalse() + assertThat(underTest.onKeyEvent(KeyEventType.KeyUp, KeyEvent.KEYCODE_DPAD_CENTER)) + .isEqualTo(keyUpEventConsumed) + + assertThat(underTest.onKeyEvent(KeyEventType.KeyDown, KeyEvent.KEYCODE_ENTER)).isFalse() + assertThat(underTest.onKeyEvent(KeyEventType.KeyUp, KeyEvent.KEYCODE_ENTER)) + .isEqualTo(keyUpEventConsumed) + + assertThat(underTest.onKeyEvent(KeyEventType.KeyDown, KeyEvent.KEYCODE_NUMPAD_ENTER)) + .isFalse() + assertThat(underTest.onKeyEvent(KeyEventType.KeyUp, KeyEvent.KEYCODE_NUMPAD_ENTER)) + .isEqualTo(keyUpEventConsumed) + + // space is ignored. + assertThat(underTest.onKeyEvent(KeyEventType.KeyUp, KeyEvent.KEYCODE_SPACE)).isFalse() + assertThat(underTest.onKeyEvent(KeyEventType.KeyDown, KeyEvent.KEYCODE_SPACE)).isFalse() + } + private fun TestScope.switchToScene(toScene: SceneKey) { val currentScene by collectLastValue(sceneInteractor.currentScene) val bouncerHidden = currentScene == Scenes.Bouncer && toScene != Scenes.Bouncer 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 148b9ea61e2c..1bcc1eeb4f12 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,6 +17,7 @@ package com.android.systemui.bouncer.ui.viewmodel import android.annotation.StringRes +import androidx.compose.ui.input.key.KeyEventType import com.android.systemui.authentication.domain.interactor.AuthenticationResult import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor @@ -122,6 +123,13 @@ sealed class AuthMethodBouncerViewModel( /** Invoked after a successful authentication. */ protected open fun onSuccessfulAuthentication() = Unit + /** + * Invoked for any key events on the bouncer. + * + * @return whether the event was consumed by this method and should not be propagated further. + */ + open fun onKeyEvent(type: KeyEventType, keyCode: Int): Boolean = false + /** Perform authentication result haptics */ private fun performAuthenticationHapticFeedback(result: AuthenticationResult) { if (result == AuthenticationResult.SKIPPED) return diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt index 5f973917440c..8427b27b78e1 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt @@ -337,10 +337,8 @@ constructor( * @return `true` when the [KeyEvent] was consumed as user input on bouncer; `false` otherwise. */ fun onKeyEvent(keyEvent: KeyEvent): Boolean { - return (authMethodViewModel.value as? PinBouncerViewModel)?.onKeyEvent( - keyEvent.type, - keyEvent.nativeKeyEvent.keyCode, - ) ?: false + return authMethodViewModel.value?.onKeyEvent(keyEvent.type, keyEvent.nativeKeyEvent.keyCode) + ?: false } data class DialogViewModel( diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt index 1427d787ea86..b8c6ab3783d5 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt @@ -16,9 +16,12 @@ package com.android.systemui.bouncer.ui.viewmodel +import android.view.KeyEvent import androidx.annotation.VisibleForTesting +import androidx.compose.ui.input.key.KeyEventType import com.android.systemui.authentication.shared.model.AuthenticationMethodModel import com.android.systemui.bouncer.domain.interactor.BouncerInteractor +import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags import com.android.systemui.inputmethod.domain.interactor.InputMethodInteractor import com.android.systemui.res.R import com.android.systemui.user.domain.interactor.SelectedUserInteractor @@ -150,6 +153,17 @@ constructor( return _password.value.toCharArray().toList() } + override fun onKeyEvent(type: KeyEventType, keyCode: Int): Boolean { + // Ignore SPACE as a confirm key to allow the space character within passwords. + val isKeyboardEnterKey = + KeyEvent.isConfirmKey(keyCode) && + keyCode != KeyEvent.KEYCODE_SPACE && + type == KeyEventType.KeyUp + // consume confirm key events while on the bouncer. This prevents it from propagating + // and avoids other parent elements from receiving it. + return isKeyboardEnterKey && ComposeBouncerFlags.isOnlyComposeBouncerEnabled() + } + override fun onSuccessfulAuthentication() { wasSuccessfullyAuthenticated = true } diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt index 0cb4260e4d7f..5c8a9a692baf 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt @@ -251,7 +251,7 @@ constructor( * * @return `true` when the [KeyEvent] was consumed as user input on bouncer; `false` otherwise. */ - fun onKeyEvent(type: KeyEventType, keyCode: Int): Boolean { + override fun onKeyEvent(type: KeyEventType, keyCode: Int): Boolean { return when (type) { KeyEventType.KeyUp -> { if (isConfirmKey(keyCode)) { -- GitLab From 572db0c63de80c419a04e6b7784015c7ebff0239 Mon Sep 17 00:00:00 2001 From: Chandru S Date: Wed, 16 Oct 2024 22:05:53 +0000 Subject: [PATCH 095/459] Handle media key events while on keyguard and bouncer This was previously handled by KeyguardSecurityContainerController which will not be active when compose bouncer is enabeld Bug: 310005730 Fixes: 374147259 Flag: com.android.systemui.compose_bouncer Flag: com.android.systemui.scene_container Test: unit tests Change-Id: I50164f57f741545d3eee2f16eb61e82886aa2756 --- .../volume/data/repository/AudioRepository.kt | 17 +- .../KeyguardKeyEventInteractorTest.kt | 3 + .../KeyguardMediaKeyInteractorTest.kt | 171 ++++++++++++++++++ .../domain/startable/BouncerStartable.kt | 43 +++++ .../shared/flag/ComposeBouncerFlags.kt | 12 +- .../viewmodel/BouncerSceneContentViewModel.kt | 3 + .../dagger/SystemUICoreStartableModule.kt | 6 + .../interactor/KeyguardKeyEventInteractor.kt | 13 +- .../interactor/KeyguardMediaKeyInteractor.kt | 103 +++++++++++ .../phone/StatusBarKeyguardViewManager.java | 1 + .../ui/viewmodel/BouncerViewModelKosmos.kt | 2 + .../KeyguardMediaKeyInteractorKosmos.kt | 29 +++ .../data/repository/AudioRepositoryKosmos.kt | 3 +- .../data/repository/FakeAudioRepository.kt | 14 ++ 14 files changed, 407 insertions(+), 13 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/bouncer/domain/startable/BouncerStartable.kt create mode 100644 packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractor.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorKosmos.kt diff --git a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt index d3c345deebad..f5e6caf0d9b9 100644 --- a/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt +++ b/packages/SettingsLib/src/com/android/settingslib/volume/data/repository/AudioRepository.kt @@ -25,6 +25,7 @@ import android.media.AudioManager.OnCommunicationDeviceChangedListener import android.media.IVolumeController import android.provider.Settings import android.util.Log +import android.view.KeyEvent import androidx.concurrent.futures.DirectExecutor import com.android.internal.util.ConcurrentUtils import com.android.settingslib.volume.data.model.VolumeControllerEvent @@ -104,6 +105,8 @@ interface AudioRepository { @AudioDeviceCategory suspend fun getBluetoothAudioDeviceCategory(bluetoothAddress: String): Int suspend fun notifyVolumeControllerVisible(isVisible: Boolean) + + fun dispatchMediaKeyEvent(event: KeyEvent) } class AudioRepositoryImpl( @@ -265,6 +268,10 @@ class AudioRepositoryImpl( } } + override fun dispatchMediaKeyEvent(event: KeyEvent) { + audioManager.dispatchMediaKeyEvent(event) + } + private fun getMinVolume(stream: AudioStream): Int = try { audioManager.getStreamMinVolume(stream.value) @@ -320,15 +327,9 @@ private class ProducingVolumeController : IVolumeController.Stub() { mutableEvents.tryEmit(VolumeControllerEvent.SetA11yMode(mode)) } - override fun displayCsdWarning( - csdWarning: Int, - displayDurationMs: Int, - ) { + override fun displayCsdWarning(csdWarning: Int, displayDurationMs: Int) { mutableEvents.tryEmit( - VolumeControllerEvent.DisplayCsdWarning( - csdWarning, - displayDurationMs, - ) + VolumeControllerEvent.DisplayCsdWarning(csdWarning, displayDurationMs) ) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt index 945e44afa455..fbdab7d40c9b 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractorTest.kt @@ -32,6 +32,7 @@ import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.shade.ShadeController import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager +import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -53,6 +54,7 @@ import org.mockito.kotlin.isNull @RunWith(AndroidJUnit4::class) class KeyguardKeyEventInteractorTest : SysuiTestCase() { @JvmField @Rule var mockitoRule = MockitoJUnit.rule() + private val kosmos = testKosmos() private val actionDownVolumeDownKeyEvent = KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_DOWN) @@ -85,6 +87,7 @@ class KeyguardKeyEventInteractorTest : SysuiTestCase() { mediaSessionLegacyHelperWrapper, backActionInteractor, powerInteractor, + kosmos.keyguardMediaKeyInteractor, ) } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorTest.kt new file mode 100644 index 000000000000..b82e1542903b --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorTest.kt @@ -0,0 +1,171 @@ +/* + * 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.keyguard.domain.interactor + +import android.platform.test.annotations.EnableFlags +import android.view.KeyEvent +import android.view.KeyEvent.ACTION_DOWN +import android.view.KeyEvent.ACTION_UP +import android.view.KeyEvent.KEYCODE_MEDIA_PAUSE +import android.view.KeyEvent.KEYCODE_MEDIA_PLAY +import android.view.KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.Flags.FLAG_COMPOSE_BOUNCER +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.testScope +import com.android.systemui.lifecycle.activateIn +import com.android.systemui.telephony.data.repository.fakeTelephonyRepository +import com.android.systemui.testKosmos +import com.android.systemui.volume.data.repository.fakeAudioRepository +import com.google.common.truth.Correspondence.transforming +import com.google.common.truth.Truth.assertThat +import kotlin.test.Test +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +@EnableFlags(FLAG_COMPOSE_BOUNCER) +class KeyguardMediaKeyInteractorTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + + private val underTest = kosmos.keyguardMediaKeyInteractor + + @Before + fun setup() { + underTest.activateIn(testScope) + } + + @Test + fun test_onKeyEvent_playPauseKeyEvents_areSkipped_whenACallIsActive() = + testScope.runTest { + kosmos.fakeTelephonyRepository.setIsInCall(true) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PLAY)) + assertEventConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PAUSE)) + assertEventConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PLAY_PAUSE)) + + assertThat(kosmos.fakeAudioRepository.dispatchedKeyEvents).isEmpty() + } + + @Test + fun test_onKeyEvent_playPauseKeyEvents_areNotSkipped_whenACallIsNotActive() = + testScope.runTest { + kosmos.fakeTelephonyRepository.setIsInCall(false) + + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PAUSE)) + assertEventConsumed(KeyEvent(ACTION_UP, KEYCODE_MEDIA_PAUSE)) + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PLAY)) + assertEventConsumed(KeyEvent(ACTION_UP, KEYCODE_MEDIA_PLAY)) + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KEYCODE_MEDIA_PLAY_PAUSE)) + assertEventConsumed(KeyEvent(ACTION_UP, KEYCODE_MEDIA_PLAY_PAUSE)) + + assertThat(kosmos.fakeAudioRepository.dispatchedKeyEvents) + .comparingElementsUsing>( + transforming({ Pair(it!!.action, it.keyCode) }, "action and keycode") + ) + .containsExactly( + Pair(ACTION_UP, KEYCODE_MEDIA_PAUSE), + Pair(ACTION_UP, KEYCODE_MEDIA_PLAY), + Pair(ACTION_UP, KEYCODE_MEDIA_PLAY_PAUSE), + ) + .inOrder() + } + + @Test + fun test_onKeyEvent_nonPlayPauseKeyEvents_areNotSkipped_whenACallIsActive() = + testScope.runTest { + kosmos.fakeTelephonyRepository.setIsInCall(true) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MUTE)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MUTE)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_STOP)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_REWIND)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_REWIND)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_RECORD)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_RECORD)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD)) + + assertEventConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK)) + assertEventConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK)) + + assertThat(kosmos.fakeAudioRepository.dispatchedKeyEvents) + .comparingElementsUsing>( + transforming({ Pair(it!!.action, it.keyCode) }, "action and keycode") + ) + .containsExactly( + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MUTE), + Pair(ACTION_UP, KeyEvent.KEYCODE_MUTE), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK), + Pair(ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_STOP), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_STOP), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_NEXT), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_NEXT), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PREVIOUS), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_PREVIOUS), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_REWIND), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_REWIND), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_RECORD), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_RECORD), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD), + Pair(ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK), + Pair(ACTION_UP, KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK), + ) + .inOrder() + } + + @Test + fun volumeKeyEvents_keyEvents_areSkipped() = + testScope.runTest { + kosmos.fakeTelephonyRepository.setIsInCall(false) + + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_UP)) + assertEventNotConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_VOLUME_UP)) + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_DOWN)) + assertEventNotConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_VOLUME_DOWN)) + assertEventNotConsumed(KeyEvent(ACTION_DOWN, KeyEvent.KEYCODE_VOLUME_MUTE)) + assertEventNotConsumed(KeyEvent(ACTION_UP, KeyEvent.KEYCODE_VOLUME_MUTE)) + } + + private fun assertEventConsumed(keyEvent: KeyEvent) { + assertThat(underTest.processMediaKeyEvent(keyEvent)).isTrue() + } + + private fun assertEventNotConsumed(keyEvent: KeyEvent) { + assertThat(underTest.processMediaKeyEvent(keyEvent)).isFalse() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/startable/BouncerStartable.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/startable/BouncerStartable.kt new file mode 100644 index 000000000000..e3cf88c94afd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/startable/BouncerStartable.kt @@ -0,0 +1,43 @@ +/* + * 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.bouncer.domain.startable + +import com.android.app.tracing.coroutines.launchTraced +import com.android.systemui.CoreStartable +import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope + +/** Starts interactors needed for the compose bouncer to work as expected. */ +@SysUISingleton +class BouncerStartable +@Inject +constructor( + private val keyguardMediaKeyInteractor: dagger.Lazy, + @Application private val scope: CoroutineScope, +) : CoreStartable { + override fun start() { + if (!ComposeBouncerFlags.isEnabled) return + + scope.launchTraced("KeyguardMediaKeyInteractor#start") { + keyguardMediaKeyInteractor.get().activate() + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/shared/flag/ComposeBouncerFlags.kt b/packages/SystemUI/src/com/android/systemui/bouncer/shared/flag/ComposeBouncerFlags.kt index 7647cf6081bf..47570a53d663 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/shared/flag/ComposeBouncerFlags.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/shared/flag/ComposeBouncerFlags.kt @@ -43,9 +43,17 @@ object ComposeBouncerFlags { fun isUnexpectedlyInLegacyMode() = RefactorFlagUtils.isUnexpectedlyInLegacyMode( isEnabled, - "SceneContainerFlag || ComposeBouncerFlag" + "SceneContainerFlag || ComposeBouncerFlag", ) + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + fun assertInLegacyMode() = + RefactorFlagUtils.assertInLegacyMode(isEnabled, "SceneContainerFlag || ComposeBouncerFlag") + /** * Returns `true` if only compose bouncer is enabled and scene container framework is not * enabled. @@ -53,7 +61,7 @@ object ComposeBouncerFlags { @Deprecated( "Avoid using this, this is meant to be used only by the glue code " + "that includes compose bouncer in legacy keyguard.", - replaceWith = ReplaceWith("isComposeBouncerOrSceneContainerEnabled()") + replaceWith = ReplaceWith("isComposeBouncerOrSceneContainerEnabled()"), ) fun isOnlyComposeBouncerEnabled(): Boolean { return !SceneContainerFlag.isEnabled && Flags.composeBouncer() diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt index 8427b27b78e1..67d312e17069 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt @@ -34,6 +34,7 @@ import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.shared.model.Text import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.keyguard.domain.interactor.KeyguardMediaKeyInteractor import com.android.systemui.lifecycle.ExclusiveActivatable import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import dagger.assisted.AssistedFactory @@ -63,6 +64,7 @@ constructor( private val patternViewModelFactory: PatternBouncerViewModel.Factory, private val passwordViewModelFactory: PasswordBouncerViewModel.Factory, private val bouncerHapticPlayer: BouncerHapticPlayer, + private val keyguardMediaKeyInteractor: KeyguardMediaKeyInteractor, ) : ExclusiveActivatable() { private val _selectedUserImage = MutableStateFlow(null) val selectedUserImage: StateFlow = _selectedUserImage.asStateFlow() @@ -337,6 +339,7 @@ constructor( * @return `true` when the [KeyEvent] was consumed as user input on bouncer; `false` otherwise. */ fun onKeyEvent(keyEvent: KeyEvent): Boolean { + if (keyguardMediaKeyInteractor.processMediaKeyEvent(keyEvent.nativeKeyEvent)) return true return authMethodViewModel.value?.onKeyEvent(keyEvent.type, keyEvent.nativeKeyEvent.keyCode) ?: false } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt index 0de919deb943..6fb6236a4ed3 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUICoreStartableModule.kt @@ -23,6 +23,7 @@ import com.android.systemui.SliceBroadcastRelayHandler import com.android.systemui.accessibility.Magnification import com.android.systemui.back.domain.interactor.BackActionInteractor import com.android.systemui.biometrics.BiometricNotificationService +import com.android.systemui.bouncer.domain.startable.BouncerStartable import com.android.systemui.clipboardoverlay.ClipboardListener import com.android.systemui.controls.dagger.StartControlsStartableModule import com.android.systemui.dagger.qualifiers.PerUser @@ -302,6 +303,11 @@ abstract class SystemUICoreStartableModule { @ClassKey(KeyguardDismissActionBinder::class) abstract fun bindKeyguardDismissActionBinder(impl: KeyguardDismissActionBinder): CoreStartable + @Binds + @IntoMap + @ClassKey(BouncerStartable::class) + abstract fun bindBouncerStartable(impl: BouncerStartable): CoreStartable + @Binds @IntoMap @ClassKey(KeyguardDismissBinder::class) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt index fcf486b5696b..d4d7e75a8b41 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardKeyEventInteractor.kt @@ -20,6 +20,7 @@ import android.content.Context import android.media.AudioManager import android.view.KeyEvent import com.android.systemui.back.domain.interactor.BackActionInteractor +import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyevent.domain.interactor.SysUIKeyEventHandler.Companion.handleAction import com.android.systemui.media.controls.util.MediaSessionLegacyHelperWrapper @@ -45,6 +46,7 @@ constructor( private val mediaSessionLegacyHelperWrapper: MediaSessionLegacyHelperWrapper, private val backActionInteractor: BackActionInteractor, private val powerInteractor: PowerInteractor, + private val keyguardMediaKeyInteractor: KeyguardMediaKeyInteractor, ) { fun dispatchKeyEvent(event: KeyEvent): Boolean { @@ -96,8 +98,15 @@ constructor( } fun interceptMediaKey(event: KeyEvent): Boolean { - return statusBarStateController.state == StatusBarState.KEYGUARD && - statusBarKeyguardViewManager.interceptMediaKey(event) + return when (statusBarStateController.state) { + StatusBarState.KEYGUARD -> + if (ComposeBouncerFlags.isEnabled) { + keyguardMediaKeyInteractor.processMediaKeyEvent(event) + } else { + statusBarKeyguardViewManager.interceptMediaKey(event) + } + else -> false + } } private fun dispatchMenuKeyEvent(): Boolean { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractor.kt new file mode 100644 index 000000000000..1404ef6a8fab --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractor.kt @@ -0,0 +1,103 @@ +/* + * 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.keyguard.domain.interactor + +import android.media.AudioManager +import android.view.KeyEvent +import com.android.settingslib.volume.data.repository.AudioRepository +import com.android.systemui.bouncer.shared.flag.ComposeBouncerFlags +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.telephony.domain.interactor.TelephonyInteractor +import javax.inject.Inject + +/** Handle media key events while on keyguard or bouncer. */ +@SysUISingleton +class KeyguardMediaKeyInteractor +@Inject +constructor( + private val telephonyInteractor: TelephonyInteractor, + private val audioRepository: AudioRepository, +) : ExclusiveActivatable() { + + /** + * Allows the media keys to work when the keyguard is showing. Forwards the relevant media keys + * to [AudioManager]. + * + * @param event The key event + * @return whether the event was consumed as a media key. + */ + fun processMediaKeyEvent(event: KeyEvent): Boolean { + if (ComposeBouncerFlags.isUnexpectedlyInLegacyMode()) { + return false + } + val keyCode = event.keyCode + if (event.action == KeyEvent.ACTION_DOWN) { + when (keyCode) { + KeyEvent.KEYCODE_MEDIA_PLAY, + KeyEvent.KEYCODE_MEDIA_PAUSE, + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> { + /* Suppress PLAY/PAUSE toggle when phone is ringing or + * in-call to avoid music playback */ + // suppress key event + return telephonyInteractor.isInCall.value + } + + KeyEvent.KEYCODE_MUTE, + KeyEvent.KEYCODE_HEADSETHOOK, + KeyEvent.KEYCODE_MEDIA_STOP, + KeyEvent.KEYCODE_MEDIA_NEXT, + KeyEvent.KEYCODE_MEDIA_PREVIOUS, + KeyEvent.KEYCODE_MEDIA_REWIND, + KeyEvent.KEYCODE_MEDIA_RECORD, + KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, + KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK -> { + audioRepository.dispatchMediaKeyEvent(event) + return true + } + + KeyEvent.KEYCODE_VOLUME_UP, + KeyEvent.KEYCODE_VOLUME_DOWN, + KeyEvent.KEYCODE_VOLUME_MUTE -> return false + } + } else if (event.action == KeyEvent.ACTION_UP) { + when (keyCode) { + KeyEvent.KEYCODE_MUTE, + KeyEvent.KEYCODE_HEADSETHOOK, + KeyEvent.KEYCODE_MEDIA_PLAY, + KeyEvent.KEYCODE_MEDIA_PAUSE, + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, + KeyEvent.KEYCODE_MEDIA_STOP, + KeyEvent.KEYCODE_MEDIA_NEXT, + KeyEvent.KEYCODE_MEDIA_PREVIOUS, + KeyEvent.KEYCODE_MEDIA_REWIND, + KeyEvent.KEYCODE_MEDIA_RECORD, + KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, + KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK -> { + audioRepository.dispatchMediaKeyEvent(event) + return true + } + } + } + return false + } + + override suspend fun onActivated(): Nothing { + // Collect to keep this flow hot for this interactor. + telephonyInteractor.isInCall.collect {} + } +} 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 74c6e72d3400..f7fea7b0d334 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java @@ -1535,6 +1535,7 @@ public class StatusBarKeyguardViewManager implements RemoteInputController.Callb } public boolean interceptMediaKey(KeyEvent event) { + ComposeBouncerFlags.assertInLegacyMode(); return mPrimaryBouncerView.getDelegate() != null && mPrimaryBouncerView.getDelegate().interceptMediaKey(event); } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt index 1b1d8c5d0f63..c77d0aab653d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/bouncer/ui/viewmodel/BouncerViewModelKosmos.kt @@ -28,6 +28,7 @@ import com.android.systemui.bouncer.domain.interactor.simBouncerInteractor import com.android.systemui.bouncer.ui.helper.BouncerHapticPlayer import com.android.systemui.haptics.msdl.bouncerHapticPlayer import com.android.systemui.inputmethod.domain.interactor.inputMethodInteractor +import com.android.systemui.keyguard.domain.interactor.keyguardMediaKeyInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.Kosmos.Fixture import com.android.systemui.user.domain.interactor.selectedUserInteractor @@ -60,6 +61,7 @@ val Kosmos.bouncerSceneContentViewModel by Fixture { patternViewModelFactory = patternBouncerViewModelFactory, passwordViewModelFactory = passwordBouncerViewModelFactory, bouncerHapticPlayer = bouncerHapticPlayer, + keyguardMediaKeyInteractor = keyguardMediaKeyInteractor, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorKosmos.kt new file mode 100644 index 000000000000..6f4787b0290b --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardMediaKeyInteractorKosmos.kt @@ -0,0 +1,29 @@ +/* + * 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.keyguard.domain.interactor + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.telephony.domain.interactor.telephonyInteractor +import com.android.systemui.volume.data.repository.audioRepository + +val Kosmos.keyguardMediaKeyInteractor: KeyguardMediaKeyInteractor by + Kosmos.Fixture { + KeyguardMediaKeyInteractor( + telephonyInteractor = telephonyInteractor, + audioRepository = audioRepository, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt index 5cf214a4e04a..712ec41bbf2d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/AudioRepositoryKosmos.kt @@ -18,4 +18,5 @@ package com.android.systemui.volume.data.repository import com.android.systemui.kosmos.Kosmos -val Kosmos.audioRepository by Kosmos.Fixture { FakeAudioRepository() } +val Kosmos.fakeAudioRepository by Kosmos.Fixture { FakeAudioRepository() } +val Kosmos.audioRepository by Kosmos.Fixture { fakeAudioRepository } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt index ba6ffd742611..16d2a18cd7b2 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/data/repository/FakeAudioRepository.kt @@ -18,6 +18,7 @@ package com.android.systemui.volume.data.repository import android.media.AudioDeviceInfo import android.media.AudioManager +import android.view.KeyEvent import com.android.settingslib.volume.data.model.VolumeControllerEvent import com.android.settingslib.volume.data.repository.AudioRepository import com.android.settingslib.volume.shared.model.AudioStream @@ -61,6 +62,15 @@ class FakeAudioRepository : AudioRepository { val isInitialized: Boolean get() = mutableIsInitialized + private val _dispatchedKeyEvents = mutableListOf() + + val dispatchedKeyEvents: List + get() { + val currentValue = _dispatchedKeyEvents.toList() + _dispatchedKeyEvents.clear() + return currentValue + } + override fun init() { mutableIsInitialized = true } @@ -145,4 +155,8 @@ class FakeAudioRepository : AudioRepository { mutableIsVolumeControllerVisible.value = isVisible } } + + override fun dispatchMediaKeyEvent(event: KeyEvent) { + _dispatchedKeyEvents.add(event) + } } -- GitLab From 2ce895088593a9785498100dd5a23c0dd52c1170 Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Sun, 20 Oct 2024 18:32:35 +0000 Subject: [PATCH 096/459] Dump immersive state in DesktopRepository Flag: com.android.window.flags.enable_fully_immersive_in_desktop Bug: 359523924 Test: dumpsys Change-Id: I87e336f12da8b674b1afcc00888a6e0dd0176de5 --- .../src/com/android/wm/shell/desktopmode/DesktopRepository.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index eeb7ac852070..443e4179b524 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -522,6 +522,7 @@ class DesktopRepository ( "${innerPrefix}freeformTasksInZOrder=${data.freeformTasksInZOrder.toDumpString()}" ) pw.println("${innerPrefix}minimizedTasks=${data.minimizedTasks.toDumpString()}") + pw.println("${innerPrefix}fullImmersiveTaskId=${data.fullImmersiveTaskId}") } } -- GitLab From 2b5c3c6cddf1ba710f5e51ab51ea9166f79327da Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Wed, 2 Oct 2024 15:57:14 +0900 Subject: [PATCH 097/459] Fullscreen Magnification updates pointer icon on non-transient change Changing pointer icon scale involves resource loading, which is expensive. Thus, we want to change the size of pointer icon only when the change is not transient, i.e., not during animation, user's gesture, moving a slider bar in settings panel, etc. In order to update it, this change adds `isScaleTransient` parameter to all the entrance point of changing fullscreen magnification scale so that when the change is actually applied, we can tell whether we should update a pointer icon size. The change itself is big, but most of them are mechanical change of method signatures and the behavior is controlled behind the aconfig flag. Bug: 355734856 Test: Enable flag, and changing scale with slider or gesture will change pointer icons. Test: atest com.android.server.accessibility.magnification Flag: com.android.server.accessibility.magnification_enlarge_pointer Change-Id: Ibd8c0aa05c047c3977f8d2e7fc5d50f2193705fa --- .../FullScreenMagnificationController.java | 93 ++++++++--- ...FullScreenMagnificationGestureHandler.java | 4 +- .../MagnificationController.java | 5 +- .../MagnificationProcessorTest.java | 5 +- ...FullScreenMagnificationControllerTest.java | 147 ++++++++++++++---- ...ScreenMagnificationGestureHandlerTest.java | 20 +-- .../MagnificationControllerTest.java | 19 +-- 7 files changed, 218 insertions(+), 75 deletions(-) diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java index 12c64c52b4a0..ce1a292fb069 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java @@ -397,7 +397,7 @@ public class FullScreenMagnificationController implements mCurrentMagnificationSpec.offsetX, mCurrentMagnificationSpec.offsetY)) { sendSpecToAnimation(mCurrentMagnificationSpec, null); } - onMagnificationChangedLocked(); + onMagnificationChangedLocked(/* isScaleTransient= */ false); } magnified.recycle(); } @@ -475,8 +475,16 @@ public class FullScreenMagnificationController implements return mIdOfLastServiceToMagnify; } + /** + * This is invoked whenever magnification change happens. + * + * @param isScaleTransient represents that if the scale is being changed and the changed + * value may be short lived and be updated again soon. + * Calling the method usually notifies input manager to update the + * cursor scale, but setting this value {@code true} prevents it. + */ @GuardedBy("mLock") - void onMagnificationChangedLocked() { + void onMagnificationChangedLocked(boolean isScaleTransient) { final float scale = getScale(); final float centerX = getCenterX(); final float centerY = getCenterY(); @@ -499,6 +507,10 @@ public class FullScreenMagnificationController implements } else { hideThumbnail(); } + + if (!isScaleTransient) { + notifyScaleForInput(mDisplayId, scale); + } } @GuardedBy("mLock") @@ -612,8 +624,9 @@ public class FullScreenMagnificationController implements * Directly Zooms out the scale to 1f with animating the transition. This method is * triggered only by service automatically, such as when user context changed. */ + @GuardedBy("mLock") void zoomOutFromService() { - setScaleAndCenter(1.0f, Float.NaN, Float.NaN, + setScaleAndCenter(1.0f, Float.NaN, Float.NaN, /* isScaleTransient= */ false, transformToStubCallback(true), AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); mZoomedOutFromService = true; @@ -641,7 +654,7 @@ public class FullScreenMagnificationController implements setActivated(false); if (changed) { spec.clear(); - onMagnificationChangedLocked(); + onMagnificationChangedLocked(/* isScaleTransient= */ false); } mIdOfLastServiceToMagnify = INVALID_SERVICE_ID; sendSpecToAnimation(spec, animationCallback); @@ -652,7 +665,7 @@ public class FullScreenMagnificationController implements } @GuardedBy("mLock") - boolean setScale(float scale, float pivotX, float pivotY, + boolean setScale(float scale, float pivotX, float pivotY, boolean isScaleTransient, boolean animate, int id) { if (!mRegistered) { return false; @@ -675,12 +688,14 @@ public class FullScreenMagnificationController implements final float centerX = normPivotX + offsetX; final float centerY = normPivotY + offsetY; mIdOfLastServiceToMagnify = id; - return setScaleAndCenter(scale, centerX, centerY, transformToStubCallback(animate), id); + return setScaleAndCenter(scale, centerX, centerY, isScaleTransient, + transformToStubCallback(animate), id); } @GuardedBy("mLock") boolean setScaleAndCenter(float scale, float centerX, float centerY, - MagnificationAnimationCallback animationCallback, int id) { + boolean isScaleTransient, MagnificationAnimationCallback animationCallback, + int id) { if (!mRegistered) { return false; } @@ -697,7 +712,7 @@ public class FullScreenMagnificationController implements + animationCallback + ", id = " + id + ")"); } boolean changed = setActivated(true); - changed |= updateMagnificationSpecLocked(scale, centerX, centerY); + changed |= updateMagnificationSpecLocked(scale, centerX, centerY, isScaleTransient); sendSpecToAnimation(mCurrentMagnificationSpec, animationCallback); if (isActivated() && (id != INVALID_SERVICE_ID)) { mIdOfLastServiceToMagnify = id; @@ -774,7 +789,9 @@ public class FullScreenMagnificationController implements * @return {@code true} if the magnification spec changed or {@code false} * otherwise */ - boolean updateMagnificationSpecLocked(float scale, float centerX, float centerY) { + @GuardedBy("mLock") + boolean updateMagnificationSpecLocked(float scale, float centerX, float centerY, + boolean isScaleTransient) { // Handle defaults. if (Float.isNaN(centerX)) { centerX = getCenterX(); @@ -802,7 +819,7 @@ public class FullScreenMagnificationController implements changed |= updateCurrentSpecWithOffsetsLocked(nonNormOffsetX, nonNormOffsetY); if (changed) { - onMagnificationChangedLocked(); + onMagnificationChangedLocked(isScaleTransient); } return changed; @@ -817,7 +834,7 @@ public class FullScreenMagnificationController implements final float nonNormOffsetX = mCurrentMagnificationSpec.offsetX - offsetX; final float nonNormOffsetY = mCurrentMagnificationSpec.offsetY - offsetY; if (updateCurrentSpecWithOffsetsLocked(nonNormOffsetX, nonNormOffsetY)) { - onMagnificationChangedLocked(); + onMagnificationChangedLocked(/* isScaleTransient= */ false); } if (id != INVALID_SERVICE_ID) { mIdOfLastServiceToMagnify = id; @@ -862,7 +879,7 @@ public class FullScreenMagnificationController implements } synchronized (mLock) { mCurrentMagnificationSpec.setTo(lastSpecSent); - onMagnificationChangedLocked(); + onMagnificationChangedLocked(/* isScaleTransient= */ false); } } }); @@ -1466,20 +1483,24 @@ public class FullScreenMagnificationController implements * @param scale the target scale, must be >= 1 * @param pivotX the screen-relative X coordinate around which to scale * @param pivotY the screen-relative Y coordinate around which to scale + * @param isScaleTransient {@code true} if the scale is for a short time and potentially changed + * soon. {@code false} otherwise. * @param animate {@code true} to animate the transition, {@code false} * to transition immediately * @param id the ID of the service requesting the change * @return {@code true} if the magnification spec changed, {@code false} if * the spec did not change */ + @SuppressWarnings("GuardedBy") + // errorprone cannot recognize an inner class guarded by an outer class member. public boolean setScale(int displayId, float scale, float pivotX, float pivotY, - boolean animate, int id) { + boolean isScaleTransient, boolean animate, int id) { synchronized (mLock) { final DisplayMagnification display = mDisplays.get(displayId); if (display == null) { return false; } - return display.setScale(scale, pivotX, pivotY, animate, id); + return display.setScale(scale, pivotX, pivotY, isScaleTransient, animate, id); } } @@ -1498,6 +1519,8 @@ public class FullScreenMagnificationController implements * @return {@code true} if the magnification spec changed, {@code false} if * the spec did not change */ + @SuppressWarnings("GuardedBy") + // errorprone cannot recognize an inner class guarded by an outer class member. public boolean setCenter(int displayId, float centerX, float centerY, boolean animate, int id) { synchronized (mLock) { final DisplayMagnification display = mDisplays.get(displayId); @@ -1505,7 +1528,7 @@ public class FullScreenMagnificationController implements return false; } return display.setScaleAndCenter(Float.NaN, centerX, centerY, - animate ? STUB_ANIMATION_CALLBACK : null, id); + /* isScaleTransient= */ false, animate ? STUB_ANIMATION_CALLBACK : null, id); } } @@ -1528,7 +1551,32 @@ public class FullScreenMagnificationController implements */ public boolean setScaleAndCenter(int displayId, float scale, float centerX, float centerY, boolean animate, int id) { - return setScaleAndCenter(displayId, scale, centerX, centerY, + return setScaleAndCenter(displayId, scale, centerX, centerY, /* isScaleTransient= */ false, + transformToStubCallback(animate), id); + } + + /** + * Sets the scale and center of the magnified region, optionally + * animating the transition. If animation is disabled, the transition + * is immediate. + * + * @param displayId The logical display id. + * @param scale the target scale, or {@link Float#NaN} to leave unchanged + * @param centerX the screen-relative X coordinate around which to + * center and scale, or {@link Float#NaN} to leave unchanged + * @param centerY the screen-relative Y coordinate around which to + * center and scale, or {@link Float#NaN} to leave unchanged + * @param isScaleTransient {@code true} if the scale is for a short time and potentially changed + * soon. {@code false} otherwise. + * @param animate {@code true} to animate the transition, {@code false} + * to transition immediately + * @param id the ID of the service requesting the change + * @return {@code true} if the magnification spec changed, {@code false} if + * the spec did not change + */ + public boolean setScaleAndCenter(int displayId, float scale, float centerX, float centerY, + boolean isScaleTransient, boolean animate, int id) { + return setScaleAndCenter(displayId, scale, centerX, centerY, isScaleTransient, transformToStubCallback(animate), id); } @@ -1543,20 +1591,25 @@ public class FullScreenMagnificationController implements * center and scale, or {@link Float#NaN} to leave unchanged * @param centerY the screen-relative Y coordinate around which to * center and scale, or {@link Float#NaN} to leave unchanged + * @param isScaleTransient {@code true} if the scale is for a short time and potentially changed + * soon. {@code false} otherwise. * @param animationCallback Called when the animation result is valid. * {@code null} to transition immediately * @param id the ID of the service requesting the change * @return {@code true} if the magnification spec changed, {@code false} if * the spec did not change */ + @SuppressWarnings("GuardedBy") + // errorprone cannot recognize an inner class guarded by an outer class member. public boolean setScaleAndCenter(int displayId, float scale, float centerX, float centerY, - MagnificationAnimationCallback animationCallback, int id) { + boolean isScaleTransient, MagnificationAnimationCallback animationCallback, int id) { synchronized (mLock) { final DisplayMagnification display = mDisplays.get(displayId); if (display == null) { return false; } - return display.setScaleAndCenter(scale, centerX, centerY, animationCallback, id); + return display.setScaleAndCenter(scale, centerX, centerY, isScaleTransient, + animationCallback, id); } } @@ -1571,6 +1624,8 @@ public class FullScreenMagnificationController implements * screen pixels. * @param id the ID of the service requesting the change */ + @SuppressWarnings("GuardedBy") + // errorprone cannot recognize an inner class guarded by an outer class member. public void offsetMagnifiedRegion(int displayId, float offsetX, float offsetY, int id) { synchronized (mLock) { final DisplayMagnification display = mDisplays.get(displayId); @@ -1669,6 +1724,8 @@ public class FullScreenMagnificationController implements * * @param displayId The logical display id. */ + @SuppressWarnings("GuardedBy") + // errorprone cannot recognize an inner class guarded by an outer class member. private void zoomOutFromService(int displayId) { synchronized (mLock) { final DisplayMagnification display = mDisplays.get(displayId); diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java index a19fdddea49c..39cecb0384b6 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandler.java @@ -617,7 +617,8 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH } if (DEBUG_PANNING_SCALING) Slog.i(mLogTag, "Scaled content to: " + scale + "x"); - mFullScreenMagnificationController.setScale(mDisplayId, scale, pivotX, pivotY, false, + mFullScreenMagnificationController.setScale(mDisplayId, scale, pivotX, pivotY, + /* isScaleTransient= */ true, /* animate= */ false, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); checkShouldDetectPassPersistedScale(); @@ -1974,6 +1975,7 @@ public class FullScreenMagnificationGestureHandler extends MagnificationGestureH /* scale= */ scale, /* centerX= */ mPivotEdge.x, /* centerY= */ mPivotEdge.y, + /* isScaleTransient= */ true, /* animate= */ true, /* id= */ AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); if (scale == 1.0f) { diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 1489d16c3764..d40e7476f7ec 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -176,7 +176,8 @@ public class MagnificationController implements MagnificationConnectionManager.C public void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { if (getFullScreenMagnificationController().isActivated(displayId)) { getFullScreenMagnificationController().setScaleAndCenter(displayId, scale, - Float.NaN, Float.NaN, false, MAGNIFICATION_GESTURE_HANDLER_ID); + Float.NaN, Float.NaN, /* isScaleTransient= */ !updatePersistence, false, + MAGNIFICATION_GESTURE_HANDLER_ID); if (updatePersistence) { getFullScreenMagnificationController().persistScale(displayId); } @@ -371,7 +372,7 @@ public class MagnificationController implements MagnificationConnectionManager.C } screenMagnificationController.setScaleAndCenter(displayId, targetScale, magnificationCenter.x, magnificationCenter.y, - magnificationAnimationCallback, id); + /* isScaleTransient= */ false, magnificationAnimationCallback, id); } else { if (screenMagnificationController.isRegistered(displayId)) { screenMagnificationController.reset(displayId, false); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java index 7829fcc4b44d..8df18a8c178b 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/MagnificationProcessorTest.java @@ -480,7 +480,7 @@ public class MagnificationProcessorTest { if (config.getMode() == MAGNIFICATION_MODE_FULLSCREEN) { mFullScreenMagnificationControllerStub.resetAndStubMethods(); mMockFullScreenMagnificationController.setScaleAndCenter(displayId, config.getScale(), - config.getCenterX(), config.getCenterY(), false, SERVICE_ID); + config.getCenterX(), config.getCenterY(), true, false, SERVICE_ID); mMagnificationManagerStub.deactivateIfNeed(); } else if (config.getMode() == MAGNIFICATION_MODE_WINDOW) { mMagnificationManagerStub.resetAndStubMethods(); @@ -529,6 +529,9 @@ public class MagnificationProcessorTest { mCenterY = invocation.getArgument(3); return true; }; + doAnswer(enableMagnificationStubAnswer).when( + mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), anyFloat(), + anyFloat(), anyFloat(), anyBoolean(), anyBoolean(), eq(SERVICE_ID)); doAnswer(enableMagnificationStubAnswer).when( mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), anyFloat(), anyFloat(), anyFloat(), anyBoolean(), eq(SERVICE_ID)); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java index 76553ba0120f..5985abc344a2 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java @@ -289,10 +289,11 @@ public class FullScreenMagnificationControllerTest { mFullScreenMagnificationController.magnificationRegionContains(displayId, 100, 100)); assertFalse(mFullScreenMagnificationController.reset(displayId, true)); - assertFalse(mFullScreenMagnificationController.setScale(displayId, 2, 100, 100, true, 0)); + assertFalse( + mFullScreenMagnificationController.setScale(displayId, 2, 100, 100, true, true, 0)); assertFalse(mFullScreenMagnificationController.setCenter(displayId, 100, 100, false, 1)); assertFalse(mFullScreenMagnificationController.setScaleAndCenter(displayId, - 1.5f, 100, 100, false, 2)); + 1.5f, 100, 100, true, false, 2)); assertTrue(mFullScreenMagnificationController.getIdOfLastServiceToMagnify(displayId) < 0); mFullScreenMagnificationController.getMagnificationRegion(displayId, new Region()); @@ -317,7 +318,7 @@ public class FullScreenMagnificationControllerTest { final float scale = 2.0f; final PointF center = INITIAL_MAGNIFICATION_BOUNDS_CENTER; assertFalse(mFullScreenMagnificationController - .setScale(TEST_DISPLAY, scale, center.x, center.y, false, SERVICE_ID_1)); + .setScale(TEST_DISPLAY, scale, center.x, center.y, true, false, SERVICE_ID_1)); assertFalse(mFullScreenMagnificationController.isActivated(TEST_DISPLAY)); } @@ -335,7 +336,7 @@ public class FullScreenMagnificationControllerTest { final PointF center = INITIAL_MAGNIFICATION_BOUNDS_CENTER; final PointF offsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, center, scale); assertTrue(mFullScreenMagnificationController - .setScale(displayId, scale, center.x, center.y, false, SERVICE_ID_1)); + .setScale(displayId, scale, center.x, center.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); final MagnificationSpec expectedSpec = getMagnificationSpec(scale, offsets); @@ -361,7 +362,7 @@ public class FullScreenMagnificationControllerTest { float scale = 2.0f; PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; assertTrue(mFullScreenMagnificationController - .setScale(displayId, scale, pivotPoint.x, pivotPoint.y, true, SERVICE_ID_1)); + .setScale(displayId, scale, pivotPoint.x, pivotPoint.y, true, true, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); // New center should be halfway between original center and pivot @@ -409,7 +410,7 @@ public class FullScreenMagnificationControllerTest { float scale = 2.0f; assertTrue(mFullScreenMagnificationController.setScale(displayId, scale, INITIAL_MAGNIFICATION_BOUNDS.centerX(), INITIAL_MAGNIFICATION_BOUNDS.centerY(), - false, SERVICE_ID_1)); + true, false, SERVICE_ID_1)); Mockito.reset(mMockWindowManager); PointF newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; @@ -444,7 +445,7 @@ public class FullScreenMagnificationControllerTest { MagnificationSpec endSpec = getMagnificationSpec(scale, offsets); assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, scale, - newCenter.x, newCenter.y, mAnimationCallback, SERVICE_ID_1)); + newCenter.x, newCenter.y, true, mAnimationCallback, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); assertEquals(newCenter.x, mFullScreenMagnificationController.getCenterX(displayId), 0.5); @@ -490,11 +491,11 @@ public class FullScreenMagnificationControllerTest { final PointF center = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; final float targetScale = 2.0f; assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, - targetScale, center.x, center.y, false, SERVICE_ID_1)); + targetScale, center.x, center.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); assertFalse(mFullScreenMagnificationController.setScaleAndCenter(displayId, - targetScale, center.x, center.y, mAnimationCallback, SERVICE_ID_1)); + targetScale, center.x, center.y, true, mAnimationCallback, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); verify(mMockValueAnimator, never()).start(); @@ -520,7 +521,7 @@ public class FullScreenMagnificationControllerTest { assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, MagnificationScaleProvider.MAX_SCALE + 1.0f, - newCenter.x, newCenter.y, false, SERVICE_ID_1)); + newCenter.x, newCenter.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); assertEquals(newCenter.x, mFullScreenMagnificationController.getCenterX(displayId), 0.5); @@ -531,7 +532,7 @@ public class FullScreenMagnificationControllerTest { // Verify that we can't zoom below 1x assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, 0.5f, INITIAL_MAGNIFICATION_BOUNDS_CENTER.x, INITIAL_MAGNIFICATION_BOUNDS_CENTER.y, - false, SERVICE_ID_1)); + true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); assertEquals(INITIAL_MAGNIFICATION_BOUNDS_CENTER.x, @@ -555,7 +556,7 @@ public class FullScreenMagnificationControllerTest { // Off the edge to the top and left assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, - scale, -100f, -200f, false, SERVICE_ID_1)); + scale, -100f, -200f, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); PointF newCenter = INITIAL_BOUNDS_UPPER_LEFT_2X_CENTER; @@ -569,7 +570,7 @@ public class FullScreenMagnificationControllerTest { // Off the edge to the bottom and right assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, scale, INITIAL_MAGNIFICATION_BOUNDS.right + 1, INITIAL_MAGNIFICATION_BOUNDS.bottom + 1, - false, SERVICE_ID_1)); + true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); newCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; newOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, newCenter, scale); @@ -623,7 +624,7 @@ public class FullScreenMagnificationControllerTest { PointF startOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, startCenter, scale); // First zoom in assertTrue(mFullScreenMagnificationController - .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, false, + .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); Mockito.reset(mMockWindowManager); @@ -677,7 +678,7 @@ public class FullScreenMagnificationControllerTest { // Upper left edges PointF ulCenter = INITIAL_BOUNDS_UPPER_LEFT_2X_CENTER; assertTrue(mFullScreenMagnificationController - .setScaleAndCenter(displayId, scale, ulCenter.x, ulCenter.y, false, + .setScaleAndCenter(displayId, scale, ulCenter.x, ulCenter.y, true, false, SERVICE_ID_1)); Mockito.reset(mMockWindowManager); MagnificationSpec ulSpec = getCurrentMagnificationSpec(displayId); @@ -689,7 +690,7 @@ public class FullScreenMagnificationControllerTest { // Lower right edges PointF lrCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; assertTrue(mFullScreenMagnificationController - .setScaleAndCenter(displayId, scale, lrCenter.x, lrCenter.y, false, + .setScaleAndCenter(displayId, scale, lrCenter.x, lrCenter.y, true, false, SERVICE_ID_1)); Mockito.reset(mMockWindowManager); MagnificationSpec lrSpec = getCurrentMagnificationSpec(displayId); @@ -714,7 +715,7 @@ public class FullScreenMagnificationControllerTest { float scale = 2.0f; // First zoom in assertTrue(mFullScreenMagnificationController - .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, false, + .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); @@ -757,7 +758,7 @@ public class FullScreenMagnificationControllerTest { PointF startOffsets = computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, startCenter, scale); // First zoom in assertTrue(mFullScreenMagnificationController - .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, false, + .setScaleAndCenter(displayId, scale, startCenter.x, startCenter.y, true, false, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); @@ -790,12 +791,12 @@ public class FullScreenMagnificationControllerTest { register(displayId); PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER; assertTrue(mFullScreenMagnificationController - .setScale(displayId, 2.0f, startCenter.x, startCenter.y, false, + .setScale(displayId, 2.0f, startCenter.x, startCenter.y, true, false, SERVICE_ID_1)); assertEquals(SERVICE_ID_1, mFullScreenMagnificationController.getIdOfLastServiceToMagnify(displayId)); assertTrue(mFullScreenMagnificationController - .setScale(displayId, 1.5f, startCenter.x, startCenter.y, false, + .setScale(displayId, 1.5f, startCenter.x, startCenter.y, true, false, SERVICE_ID_2)); assertEquals(SERVICE_ID_2, mFullScreenMagnificationController.getIdOfLastServiceToMagnify(displayId)); @@ -813,10 +814,10 @@ public class FullScreenMagnificationControllerTest { register(displayId); PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER; mFullScreenMagnificationController - .setScale(displayId, 2.0f, startCenter.x, startCenter.y, false, + .setScale(displayId, 2.0f, startCenter.x, startCenter.y, true, false, SERVICE_ID_1); mFullScreenMagnificationController - .setScale(displayId, 1.5f, startCenter.x, startCenter.y, false, + .setScale(displayId, 1.5f, startCenter.x, startCenter.y, true, false, SERVICE_ID_2); assertFalse(mFullScreenMagnificationController.resetIfNeeded(displayId, SERVICE_ID_1)); checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ true, displayId); @@ -877,7 +878,7 @@ public class FullScreenMagnificationControllerTest { float scale = 2.5f; PointF firstCenter = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, - scale, firstCenter.x, firstCenter.y, mAnimationCallback, SERVICE_ID_1)); + scale, firstCenter.x, firstCenter.y, true, mAnimationCallback, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); Mockito.reset(mMockValueAnimator); // Stubs the logic after the animation is started. @@ -1080,7 +1081,7 @@ public class FullScreenMagnificationControllerTest { float scale = 2.0f; // setting animate parameter to true is differ from zoomIn2xToMiddle() mFullScreenMagnificationController.setScale(displayId, scale, startCenter.x, startCenter.y, - true, SERVICE_ID_1); + true, true, SERVICE_ID_1); MagnificationSpec startSpec = getCurrentMagnificationSpec(displayId); MagnificationCallbacks callbacks = getMagnificationCallbacks(displayId); Mockito.reset(mMockWindowManager); @@ -1111,7 +1112,7 @@ public class FullScreenMagnificationControllerTest { PointF startCenter = OTHER_BOUNDS_LOWER_RIGHT_2X_CENTER; float scale = 2.0f; mFullScreenMagnificationController.setScale(displayId, scale, startCenter.x, startCenter.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); mMessageCapturingHandler.sendAllMessages(); MagnificationSpec startSpec = getCurrentMagnificationSpec(displayId); verify(mMockWindowManager).setMagnificationSpec(eq(displayId), argThat(closeTo(startSpec))); @@ -1152,7 +1153,7 @@ public class FullScreenMagnificationControllerTest { PointF startCenter = OTHER_BOUNDS_LOWER_RIGHT_2X_CENTER; float scale = 2.0f; mFullScreenMagnificationController.setScale(displayId, scale, startCenter.x, startCenter.y, - true, SERVICE_ID_1); + true, true, SERVICE_ID_1); mMessageCapturingHandler.sendAllMessages(); MagnificationSpec startSpec = getCurrentMagnificationSpec(displayId); when(mMockValueAnimator.isRunning()).thenReturn(true); @@ -1339,7 +1340,7 @@ public class FullScreenMagnificationControllerTest { scale, computeOffsets(INITIAL_MAGNIFICATION_BOUNDS, firstCenter, scale)); assertTrue(mFullScreenMagnificationController.setScaleAndCenter(displayId, - scale, firstCenter.x, firstCenter.y, true, SERVICE_ID_1)); + scale, firstCenter.x, firstCenter.y, true, true, SERVICE_ID_1)); mMessageCapturingHandler.sendAllMessages(); assertEquals(firstCenter.x, mFullScreenMagnificationController.getCenterX(displayId), 0.5); @@ -1408,7 +1409,7 @@ public class FullScreenMagnificationControllerTest { register(DISPLAY_0); final float scale = 1.0f; mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, scale, Float.NaN, Float.NaN, true, SERVICE_ID_1); + DISPLAY_0, scale, Float.NaN, Float.NaN, true, true, SERVICE_ID_1); checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ false, DISPLAY_0); verify(mMockWindowManager).setFullscreenMagnificationActivated(DISPLAY_0, true); @@ -1453,7 +1454,7 @@ public class FullScreenMagnificationControllerTest { PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; mFullScreenMagnificationController.setScale(TEST_DISPLAY, 1.0f, pivotPoint.x, pivotPoint.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); mFullScreenMagnificationController.persistScale(TEST_DISPLAY); // persistScale may post a task to a background thread. Let's wait for it completes. @@ -1468,10 +1469,10 @@ public class FullScreenMagnificationControllerTest { register(DISPLAY_1); final PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; mFullScreenMagnificationController.setScale(DISPLAY_0, 3.0f, pivotPoint.x, pivotPoint.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); mFullScreenMagnificationController.persistScale(DISPLAY_0); mFullScreenMagnificationController.setScale(DISPLAY_1, 4.0f, pivotPoint.x, pivotPoint.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); mFullScreenMagnificationController.persistScale(DISPLAY_1); // persistScale may post a task to a background thread. Let's wait for it completes. @@ -1489,7 +1490,10 @@ public class FullScreenMagnificationControllerTest { PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; mFullScreenMagnificationController.setScale(TEST_DISPLAY, 4.0f, pivotPoint.x, pivotPoint.y, - true, SERVICE_ID_1); + /* isScaleTransient= */ true, /* animate= */ false, SERVICE_ID_1); + verify(mMockInputManager, never()).setAccessibilityPointerIconScaleFactor(anyInt(), + anyFloat()); + mFullScreenMagnificationController.persistScale(TEST_DISPLAY); // persistScale may post a task to a background thread. Let's wait for it completes. @@ -1499,6 +1503,81 @@ public class FullScreenMagnificationControllerTest { verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, 4.0f); } + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void setScale_setNonTransientScale_notifyInput() { + register(TEST_DISPLAY); + + PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScale(TEST_DISPLAY, 4.0f, pivotPoint.x, pivotPoint.y, + /* isScaleTransient= */ false, /* animate= */ false, SERVICE_ID_1); + + verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, 4.0f); + } + + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void setScaleAndCenter_setTransientScale_notNotifyInput() { + register(TEST_DISPLAY); + + PointF point = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, 3.0f, point.x, + point.y, /* isScaleTransient= */ true, /* animate= */ false, SERVICE_ID_1); + + verify(mRequestObserver).onFullScreenMagnificationChanged(anyInt(), any(Region.class), + any(MagnificationConfig.class)); + verify(mMockInputManager, never()).setAccessibilityPointerIconScaleFactor(anyInt(), + anyFloat()); + } + + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void setScaleAndCenter_setNonTransientScale_notifyInput() { + register(TEST_DISPLAY); + + PointF point = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, 3.0f, point.x, + point.y, /* isScaleTransient= */ false, /* animate= */ false, SERVICE_ID_1); + + verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, 3.0f); + } + + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void setCenter_notNotifyInput() { + register(TEST_DISPLAY); + + PointF point = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScale(TEST_DISPLAY, 2.0f, point.x, point.y, + /* isScaleTransient= */ true, /* animate= */ false, SERVICE_ID_1); + mFullScreenMagnificationController.setCenter(TEST_DISPLAY, point.x, point.y, false, + SERVICE_ID_1); + + // Note that setCenter doesn't change scale, so it's not necessary to notify the input + // manager, but we currently do. The input manager skips redundant computation if the + // notified scale is the same as the previous call. + verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, + 2.0f); + } + + @Test + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + public void offsetMagnifiedRegion_notNotifyInput() { + register(TEST_DISPLAY); + + PointF point = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; + mFullScreenMagnificationController.setScale(TEST_DISPLAY, 2.0f, point.x, point.y, + /* isScaleTransient= */ true, /* animate= */ false, SERVICE_ID_1); + mFullScreenMagnificationController.offsetMagnifiedRegion(TEST_DISPLAY, 100, 50, + SERVICE_ID_1); + + // Note that setCenter doesn't change scale, so it's not necessary to notify the input + // manager, but we currently do. The input manager skips redundant computation if the + // notified scale is the same as the previous call. + verify(mMockInputManager).setAccessibilityPointerIconScaleFactor(TEST_DISPLAY, + 2.0f); + } + @Test public void testOnContextChanged_alwaysOnFeatureDisabled_resetMagnification() { setScaleToMagnifying(); @@ -1556,7 +1635,7 @@ public class FullScreenMagnificationControllerTest { PointF pivotPoint = INITIAL_BOUNDS_LOWER_RIGHT_2X_CENTER; mFullScreenMagnificationController.setScale(DISPLAY_0, scale, pivotPoint.x, pivotPoint.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); } private void initMockWindowManager() { @@ -1599,7 +1678,7 @@ public class FullScreenMagnificationControllerTest { PointF startCenter = INITIAL_MAGNIFICATION_BOUNDS_CENTER; float scale = 2.0f; mFullScreenMagnificationController.setScale(displayId, scale, startCenter.x, startCenter.y, - false, SERVICE_ID_1); + true, false, SERVICE_ID_1); checkActivatedAndMagnifying(/* activated= */ true, /* magnifying= */ true, displayId); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java index 00b7de818c12..217bb2e582d5 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationGestureHandlerTest.java @@ -1346,7 +1346,7 @@ public class FullScreenMagnificationGestureHandlerTest { Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, persistedScale, UserHandle.USER_SYSTEM); mFullScreenMagnificationController.setScale(DISPLAY_0, scale, DEFAULT_X, - DEFAULT_Y, /* animate= */ false, + DEFAULT_Y, true, /* animate= */ false, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); mMgh.transitionTo(mMgh.mPanningScalingState); @@ -1367,7 +1367,7 @@ public class FullScreenMagnificationGestureHandlerTest { Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, persistedScale, UserHandle.USER_SYSTEM); mFullScreenMagnificationController.setScale(DISPLAY_0, scale, DEFAULT_X, - DEFAULT_Y, /* animate= */ false, + DEFAULT_Y, true, /* animate= */ false, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); mMgh.transitionTo(mMgh.mPanningScalingState); @@ -1404,7 +1404,7 @@ public class FullScreenMagnificationGestureHandlerTest { mFullScreenMagnificationController.getPersistedScale(DISPLAY_0); mFullScreenMagnificationController.setScale(DISPLAY_0, persistedScale, DEFAULT_X, - DEFAULT_Y, /* animate= */ false, + DEFAULT_Y, true, /* animate= */ false, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); mMgh.transitionTo(mMgh.mPanningScalingState); @@ -1441,7 +1441,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 5.6f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); centerX = mFullScreenMagnificationController.getCenterX(DISPLAY_0); centerY = mFullScreenMagnificationController.getCenterY(DISPLAY_0); @@ -1533,7 +1533,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 6.2f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); MotionEvent event = mouseEvent(centerX, centerY, ACTION_HOVER_MOVE); send(event, InputDevice.SOURCE_MOUSE); fastForward(20); @@ -1574,7 +1574,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 4.0f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); // HOVER_MOVE should change magnifier viewport. MotionEvent event = motionEvent(centerX + 20, centerY, ACTION_HOVER_MOVE); @@ -1618,7 +1618,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 5.3f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); MotionEvent event = motionEvent(centerX, centerY, ACTION_HOVER_MOVE); send(event, source); fastForward(20); @@ -1652,7 +1652,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 2.7f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); MotionEvent event = motionEvent(centerX, centerY, ACTION_HOVER_MOVE); send(event, source); fastForward(20); @@ -1688,7 +1688,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 3.8f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); centerX = mFullScreenMagnificationController.getCenterX(DISPLAY_0); centerY = mFullScreenMagnificationController.getCenterY(DISPLAY_0); @@ -1725,7 +1725,7 @@ public class FullScreenMagnificationGestureHandlerTest { (INITIAL_MAGNIFICATION_BOUNDS.top + INITIAL_MAGNIFICATION_BOUNDS.height()) / 2.0f; float scale = 4.0f; // value is unimportant but unique among tests to increase coverage. mFullScreenMagnificationController.setScaleAndCenter( - DISPLAY_0, centerX, centerY, scale, /* animate= */ false, 1); + DISPLAY_0, centerX, centerY, scale, true, /* animate= */ false, 1); centerX = mFullScreenMagnificationController.getCenterX(DISPLAY_0); centerY = mFullScreenMagnificationController.getCenterY(DISPLAY_0); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index d70e1fe1d9d1..8164ef9314d9 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -421,7 +421,7 @@ public class MagnificationControllerTest { assertTrue(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY)); verify(mScreenMagnificationController, never()).setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, - true, MAGNIFICATION_GESTURE_HANDLER_ID); + true, true, MAGNIFICATION_GESTURE_HANDLER_ID); verify(mTransitionCallBack).onResult(TEST_DISPLAY, false); } @@ -471,7 +471,7 @@ public class MagnificationControllerTest { assertFalse(mMagnificationConnectionManager.isWindowMagnifierEnabled(TEST_DISPLAY)); verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), eq(DEFAULT_SCALE), eq(MAGNIFIED_CENTER_X), eq(MAGNIFIED_CENTER_Y), - any(MagnificationAnimationCallback.class), eq(TEST_SERVICE_ID)); + eq(false), any(MagnificationAnimationCallback.class), eq(TEST_SERVICE_ID)); } @Test @@ -488,7 +488,7 @@ public class MagnificationControllerTest { verify(mScreenMagnificationController, never()).setScaleAndCenter(anyInt(), anyFloat(), anyFloat(), anyFloat(), - anyBoolean(), anyInt()); + anyBoolean(), anyBoolean(), anyInt()); } @Test @@ -550,7 +550,7 @@ public class MagnificationControllerTest { config, animate, TEST_SERVICE_ID); verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), /* scale= */ anyFloat(), /* centerX= */ anyFloat(), /* centerY= */ anyFloat(), - mCallbackArgumentCaptor.capture(), /* id= */ anyInt()); + anyBoolean(), mCallbackArgumentCaptor.capture(), /* id= */ anyInt()); mCallbackArgumentCaptor.getValue().onResult(true); mMockConnection.invokeCallbacks(); @@ -620,7 +620,7 @@ public class MagnificationControllerTest { @Test public void magnifyThroughExternalRequest_showMagnificationButton() { mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE, - MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, false, TEST_SERVICE_ID); + MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, true, false, TEST_SERVICE_ID); // The first time is trigger when fullscreen mode is activated. // The second time is triggered when magnification spec is changed. @@ -642,7 +642,7 @@ public class MagnificationControllerTest { mMagnificationController.onPerformScaleAction(TEST_DISPLAY, newScale, updatePersistence); verify(mScreenMagnificationController).setScaleAndCenter(eq(TEST_DISPLAY), eq(newScale), - anyFloat(), anyFloat(), anyBoolean(), anyInt()); + anyFloat(), anyFloat(), anyBoolean(), anyBoolean(), anyInt()); verify(mScreenMagnificationController).persistScale(eq(TEST_DISPLAY)); } @@ -685,7 +685,7 @@ public class MagnificationControllerTest { final MagnificationConfig config = obtainMagnificationConfig(MODE_FULLSCREEN); mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, config.getScale(), config.getCenterX(), config.getCenterY(), - true, TEST_SERVICE_ID); + true, true, TEST_SERVICE_ID); // The notify method is triggered when setting magnification enabled. // The setScaleAndCenter call should not trigger notify method due to same scale and center. @@ -934,7 +934,7 @@ public class MagnificationControllerTest { public void onWindowModeActivated_fullScreenIsActivatedByExternal_fullScreenIsDisabled() { mScreenMagnificationController.setScaleAndCenter(TEST_DISPLAY, DEFAULT_SCALE, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y, - true, TEST_SERVICE_ID); + true, true, TEST_SERVICE_ID); mMagnificationController.onWindowMagnificationActivationState(TEST_DISPLAY, true); @@ -1321,7 +1321,8 @@ public class MagnificationControllerTest { } if (mode == MODE_FULLSCREEN) { mScreenMagnificationController.setScaleAndCenter(displayId, DEFAULT_SCALE, centerX, - centerY, true, AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); + centerY, true, true, + AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID); } else { mMagnificationConnectionManager.enableWindowMagnification(displayId, DEFAULT_SCALE, centerX, centerY, null, TEST_SERVICE_ID); -- GitLab From 80e7d124804521479bf0d5b476118d555cb09707 Mon Sep 17 00:00:00 2001 From: lijilou Date: Tue, 8 Oct 2024 21:12:44 +0800 Subject: [PATCH 098/459] Notification: The updateLightsLocked method should be called by the NMS.mNotificationLock lock. The crash log as below: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.PHONE_STATE flg=0x1000010 (has extras) } in com.android.server.notification.NotificationAttentionHelper$3@b85964e at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1905) at android.app.LoadedApk$ReceiverDispatcher$Args.$r8$lambda$mcNAAl1SQ4MyJPyDg8TJ2x2h0Rk(Unknown Source:0) at android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:959) at android.os.Handler.dispatchMessage(Handler.java:100) at android.os.Looper.loopOnce(Looper.java:249) at android.os.Looper.loop(Looper.java:337) at com.android.server.SystemServer.run(SystemServer.java:1065) at com.android.server.SystemServer.main(SystemServer.java:724) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:593) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:913) Caused by: java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 0 at jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64) at jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70) at jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266) at java.util.Objects.checkIndex(Objects.java:359) at java.util.ArrayList.get(ArrayList.java:434) at com.android.server.notification.NotificationAttentionHelper.updateLightsLocked(NotificationAttentionHelper.java:899) at com.android.server.notification.NotificationAttentionHelper$3.onReceive(NotificationAttentionHelper.java:1641) at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1892) ... 11 more Test: OEM monkey test Bug:372183860 Change-Id: Ic87ec55c0ab2f430055ffa6850963298d7b5493b --- .../NotificationAttentionHelper.java | 50 +++++++++++++------ .../NotificationManagerService.java | 8 +-- .../NotificationAttentionHelperTest.java | 7 +-- 3 files changed, 43 insertions(+), 22 deletions(-) diff --git a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java index a7e14d9baea2..980f40ee4a9a 100644 --- a/services/core/java/com/android/server/notification/NotificationAttentionHelper.java +++ b/services/core/java/com/android/server/notification/NotificationAttentionHelper.java @@ -79,6 +79,7 @@ import com.android.server.lights.LogicalLight; import java.io.PrintWriter; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import com.android.internal.annotations.GuardedBy; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -119,6 +120,8 @@ public final class NotificationAttentionHelper { ); private final Context mContext; + //This is NMS.mNotificationLock. + private final Object mLock; private final PackageManager mPackageManager; private final TelephonyManager mTelephonyManager; private final UserManager mUm; @@ -132,6 +135,7 @@ public final class NotificationAttentionHelper { private VibratorHelper mVibratorHelper; // The last key in this list owns the hardware. + @GuardedBy("mLock") ArrayList mLights = new ArrayList<>(); private LogicalLight mNotificationLight; private LogicalLight mAttentionLight; @@ -149,8 +153,10 @@ public final class NotificationAttentionHelper { private String mVibrateNotificationKey; private boolean mSystemReady; private boolean mInCallStateOffHook = false; + @GuardedBy("mLock") private boolean mScreenOn = true; private boolean mUserPresent = false; + @GuardedBy("mLock") private boolean mNotificationPulseEnabled; private final Uri mInCallNotificationUri; private final AudioAttributes mInCallNotificationAudioAttributes; @@ -166,12 +172,13 @@ public final class NotificationAttentionHelper { private final PolitenessStrategy mStrategy; private int mCurrentWorkProfileId = UserHandle.USER_NULL; - public NotificationAttentionHelper(Context context, LightsManager lightsManager, + public NotificationAttentionHelper(Context context, Object lock, LightsManager lightsManager, AccessibilityManager accessibilityManager, PackageManager packageManager, UserManager userManager, NotificationUsageStats usageStats, NotificationManagerPrivate notificationManagerPrivate, ZenModeHelper zenModeHelper, SystemUiSystemPropertiesFlags.FlagResolver flagResolver) { mContext = context; + mLock = lock; mPackageManager = packageManager; mTelephonyManager = context.getSystemService(TelephonyManager.class); mAccessibilityManager = accessibilityManager; @@ -315,9 +322,11 @@ public final class NotificationAttentionHelper { private void loadUserSettings() { boolean pulseEnabled = Settings.System.getIntForUser(mContext.getContentResolver(), Settings.System.NOTIFICATION_LIGHT_PULSE, 0, UserHandle.USER_CURRENT) != 0; - if (mNotificationPulseEnabled != pulseEnabled) { - mNotificationPulseEnabled = pulseEnabled; - updateLightsLocked(); + synchronized (mLock) { + if (mNotificationPulseEnabled != pulseEnabled) { + mNotificationPulseEnabled = pulseEnabled; + updateLightsLocked(); + } } if (Flags.politeNotifications()) { @@ -1063,7 +1072,8 @@ public final class NotificationAttentionHelper { } } - public void dump(PrintWriter pw, String prefix, NotificationManagerService.DumpFilter filter) { + public void dumpLocked(PrintWriter pw, String prefix, + NotificationManagerService.DumpFilter filter) { pw.println("\n Notification attention state:"); pw.print(prefix); pw.println(" mSoundNotificationKey=" + mSoundNotificationKey); @@ -1591,16 +1601,22 @@ public final class NotificationAttentionHelper { if (action.equals(Intent.ACTION_SCREEN_ON)) { // Keep track of screen on/off state, but do not turn off the notification light // until user passes through the lock screen or views the notification. - mScreenOn = true; - updateLightsLocked(); + synchronized (mLock) { + mScreenOn = true; + updateLightsLocked(); + } } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { - mScreenOn = false; - mUserPresent = false; - updateLightsLocked(); + synchronized (mLock) { + mScreenOn = false; + mUserPresent = false; + updateLightsLocked(); + } } else if (action.equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)) { mInCallStateOffHook = TelephonyManager.EXTRA_STATE_OFFHOOK .equals(intent.getStringExtra(TelephonyManager.EXTRA_STATE)); - updateLightsLocked(); + synchronized (mLock) { + updateLightsLocked(); + } } else if (action.equals(Intent.ACTION_USER_PRESENT)) { mUserPresent = true; // turn off LED when user passes through lock screen @@ -1662,9 +1678,11 @@ public final class NotificationAttentionHelper { Settings.System.NOTIFICATION_LIGHT_PULSE, 0, UserHandle.USER_CURRENT) != 0; - if (mNotificationPulseEnabled != pulseEnabled) { - mNotificationPulseEnabled = pulseEnabled; - updateLightsLocked(); + synchronized (mLock) { + if (mNotificationPulseEnabled != pulseEnabled) { + mNotificationPulseEnabled = pulseEnabled; + updateLightsLocked(); + } } } if (Flags.politeNotifications()) { @@ -1747,7 +1765,9 @@ public final class NotificationAttentionHelper { @VisibleForTesting void setScreenOn(boolean on) { - mScreenOn = on; + synchronized (mLock) { + mScreenOn = on; + } } @VisibleForTesting diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index b436c8b42edf..c83351ddebea 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -2573,9 +2573,9 @@ public class NotificationManagerService extends SystemService { mToastRateLimiter = toastRateLimiter; - mAttentionHelper = new NotificationAttentionHelper(getContext(), lightsManager, - mAccessibilityManager, mPackageManagerClient, userManager, usageStats, - mNotificationManagerPrivate, mZenModeHelper, flagResolver); + mAttentionHelper = new NotificationAttentionHelper(getContext(), mNotificationLock, + lightsManager, mAccessibilityManager, mPackageManagerClient, userManager, + usageStats, mNotificationManagerPrivate, mZenModeHelper, flagResolver); // register for various Intents. // If this is called within a test, make sure to unregister the intent receivers by @@ -6916,7 +6916,7 @@ public class NotificationManagerService extends SystemService { pw.println(" mMaxPackageEnqueueRate=" + mMaxPackageEnqueueRate); pw.println(" hideSilentStatusBar=" + mPreferencesHelper.shouldHideSilentStatusIcons()); - mAttentionHelper.dump(pw, " ", filter); + mAttentionHelper.dumpLocked(pw, " ", filter); } pw.println(" mArchive=" + mArchive.toString()); mArchive.dumpImpl(pw, filter); diff --git a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java index 3da80314e6d4..2429ff334efe 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/NotificationAttentionHelperTest.java @@ -243,9 +243,10 @@ public class NotificationAttentionHelperTest extends UiServiceTestCase { } private void initAttentionHelper(TestableFlagResolver flagResolver) { - mAttentionHelper = new NotificationAttentionHelper(getContext(), mock(LightsManager.class), - mAccessibilityManager, mPackageManager, mUserManager, mUsageStats, - mService.mNotificationManagerPrivate, mock(ZenModeHelper.class), flagResolver); + mAttentionHelper = new NotificationAttentionHelper(getContext(), new Object(), + mock(LightsManager.class),mAccessibilityManager, mPackageManager, + mUserManager, mUsageStats, mService.mNotificationManagerPrivate, + mock(ZenModeHelper.class), flagResolver); mAttentionHelper.onSystemReady(); mAttentionHelper.setVibratorHelper(spy(new VibratorHelper(getContext()))); mAttentionHelper.setAudioManager(mAudioManager); -- GitLab From 03a951634b2e3bfb496c8fdc23d95e35191216c9 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Mon, 14 Oct 2024 16:02:09 -0700 Subject: [PATCH 099/459] AudioService: fix permission for addOnDevicesForAttributesChanged Bug: 352303112 Flag: EXEMPT security Test: atest CtsMediaAudioTestCases:DevicesForAttributesTest Change-Id: I10eba687a2e33fe5d9bb39c32c20761ab82d8f50 --- media/java/android/media/IAudioService.aidl | 1 + services/core/java/com/android/server/audio/AudioService.java | 2 ++ 2 files changed, 3 insertions(+) diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index 02ca307eb2ee..c22b67462af2 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -471,6 +471,7 @@ interface IAudioService { List getDevicesForAttributesUnprotected(in AudioAttributes attributes); + @EnforcePermission(anyOf = {"MODIFY_AUDIO_ROUTING", "QUERY_AUDIO_STATE"}) void addOnDevicesForAttributesChangedListener(in AudioAttributes attributes, in IDevicesForAttributesCallback callback); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 37a2fba8fcb5..78a1fa768879 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -3567,8 +3567,10 @@ public class AudioService extends IAudioService.Stub * @see AudioManager#addOnDevicesForAttributesChangedListener( * AudioAttributes, Executor, OnDevicesForAttributesChangedListener) */ + @android.annotation.EnforcePermission(anyOf = { MODIFY_AUDIO_ROUTING, QUERY_AUDIO_STATE }) public void addOnDevicesForAttributesChangedListener(AudioAttributes attributes, IDevicesForAttributesCallback callback) { + super.addOnDevicesForAttributesChangedListener_enforcePermission(); mAudioSystem.addOnDevicesForAttributesChangedListener( attributes, false /* forVolume */, callback); } -- GitLab From 2b1a1bcc2b4954dca2a96438ea29cd9527ba286f Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 21 Oct 2024 04:27:05 +0000 Subject: [PATCH 100/459] Skip initializing unused system bar painter SystemBarBackgroundPainter invokes getSystemUiContext, that may trigger initializing a window context and load resources. The operation could cost ~5ms due to attachWindowContextToDisplayContent. Since flag drawSnapshotAspectRatioMatch is introduced, there is no longer a case that the snapshot starting window need to draw bars background. So its initialization can be skipped as well. Bug: 297502610 Flag: EXEMPT reduce unnecessary invocation Test: Task snapshot starting window is normal from hot launch app. (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7913d2598f0dcc32dce069b98de04f795ac83fc3) Merged-In: Id6fa10da245845d5ed5f78558ab2f4193d2c7133 Change-Id: Id6fa10da245845d5ed5f78558ab2f4193d2c7133 --- core/java/android/window/SnapshotDrawerUtils.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/java/android/window/SnapshotDrawerUtils.java b/core/java/android/window/SnapshotDrawerUtils.java index 4c8bad6d0aff..bc663498467a 100644 --- a/core/java/android/window/SnapshotDrawerUtils.java +++ b/core/java/android/window/SnapshotDrawerUtils.java @@ -152,9 +152,11 @@ public class SnapshotDrawerUtils { @VisibleForTesting public void setFrames(Rect frame, Rect systemBarInsets) { mFrame.set(frame); - mSystemBarInsets.set(systemBarInsets); mSizeMismatch = (mFrame.width() != mSnapshotW || mFrame.height() != mSnapshotH); - mSystemBarBackgroundPainter.setInsets(systemBarInsets); + if (!Flags.drawSnapshotAspectRatioMatch() && systemBarInsets != null) { + mSystemBarInsets.set(systemBarInsets); + mSystemBarBackgroundPainter.setInsets(systemBarInsets); + } } private void drawSnapshot(boolean releaseAfterDraw) { @@ -396,9 +398,12 @@ public class SnapshotDrawerUtils { final ActivityManager.RunningTaskInfo runningTaskInfo = info.taskInfo; final ActivityManager.TaskDescription taskDescription = getOrCreateTaskDescription(runningTaskInfo); - drawSurface.initiateSystemBarPainter(lp.flags, lp.privateFlags, - attrs.insetsFlags.appearance, taskDescription, info.requestedVisibleTypes); - final Rect systemBarInsets = getSystemBarInsets(windowBounds, topWindowInsetsState); + Rect systemBarInsets = null; + if (!Flags.drawSnapshotAspectRatioMatch()) { + drawSurface.initiateSystemBarPainter(lp.flags, lp.privateFlags, + attrs.insetsFlags.appearance, taskDescription, info.requestedVisibleTypes); + systemBarInsets = getSystemBarInsets(windowBounds, topWindowInsetsState); + } drawSurface.setFrames(windowBounds, systemBarInsets); drawSurface.drawSnapshot(releaseAfterDraw); } -- GitLab From 139a4479eeb437ccfc4d7b760b89e3e0b5096f65 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Mon, 21 Oct 2024 03:32:03 +0000 Subject: [PATCH 101/459] Consider letterbox offset as size mismatch If there is non zero letterbox offset, that means the activity window is not aligned with the task, then it still needs to undo the offset to snapshot. E.g. window position is (50,0), then the snapshot should be (-50,0) because task snapshot already contains the offset. Bug: 372482710 Flag: EXEMPT bugfix Test: Set config_highResTaskSnapshotScale to 1. Hot launch an activity with LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER. The snapshot buffer layer should align with app window. Change-Id: I47dba6148f0c1cd610b5003f7e6fc97ae5f7404b --- core/java/android/window/SnapshotDrawerUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/java/android/window/SnapshotDrawerUtils.java b/core/java/android/window/SnapshotDrawerUtils.java index bc663498467a..5dc687561011 100644 --- a/core/java/android/window/SnapshotDrawerUtils.java +++ b/core/java/android/window/SnapshotDrawerUtils.java @@ -152,7 +152,9 @@ public class SnapshotDrawerUtils { @VisibleForTesting public void setFrames(Rect frame, Rect systemBarInsets) { mFrame.set(frame); - mSizeMismatch = (mFrame.width() != mSnapshotW || mFrame.height() != mSnapshotH); + final Rect letterboxInsets = mSnapshot.getLetterboxInsets(); + mSizeMismatch = (mFrame.width() != mSnapshotW || mFrame.height() != mSnapshotH) + || letterboxInsets.left != 0 || letterboxInsets.top != 0; if (!Flags.drawSnapshotAspectRatioMatch() && systemBarInsets != null) { mSystemBarInsets.set(systemBarInsets); mSystemBarBackgroundPainter.setInsets(systemBarInsets); -- GitLab From 0edb30349e68f2ae7cdb2f477b60b54cce29f2ce Mon Sep 17 00:00:00 2001 From: Zhenhua Deng Date: Mon, 21 Oct 2024 06:18:01 +0000 Subject: [PATCH 102/459] Improve the release of predict_back animaton leash Seems the predict_back nimation leash cant be released in time after gesture animation already finsihed, and it will keep for long time it may cause SurfaceFlinger memory loading high and layer count too much. Flag: EXEMPT bugfix Bug: 370247136 Test: repeatly open settings and gesture predict back to home launcher (cherry picked from https://partner-android-review.googlesource.com/q/commit:7c1a0cf0be835656dbc9897535b5ee55ba1ea33f) Merged-In: I51845842decf47a79da755418c61a227eae6474a Change-Id: I51845842decf47a79da755418c61a227eae6474a --- .../wm/shell/back/BackAnimationRunner.java | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java index 9ca9b730fb06..4569cf31dab1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java @@ -26,6 +26,7 @@ import android.util.Log; import android.view.IRemoteAnimationFinishedCallback; import android.view.IRemoteAnimationRunner; import android.view.RemoteAnimationTarget; +import android.view.SurfaceControl; import android.window.IBackAnimationRunner; import android.window.IOnBackInvokedCallback; @@ -34,6 +35,8 @@ import com.android.internal.jank.Cuj.CujType; import com.android.internal.jank.InteractionJankMonitor; import com.android.wm.shell.shared.annotations.ShellMainThread; +import java.lang.ref.WeakReference; + /** * Used to register the animation callback and runner, it will trigger result if gesture was finish * before it received IBackAnimationRunner#onAnimationStart, so the controller could continue @@ -101,6 +104,40 @@ public class BackAnimationRunner { return mCallback; } + private Runnable mFinishedCallback; + private RemoteAnimationTarget[] mApps; + private IRemoteAnimationFinishedCallback mRemoteCallback; + + private static class RemoteAnimationFinishedStub extends IRemoteAnimationFinishedCallback.Stub { + //the binder callback should not hold strong reference to it to avoid memory leak. + private WeakReference mRunnerRef; + + private RemoteAnimationFinishedStub(BackAnimationRunner runner) { + mRunnerRef = new WeakReference<>(runner); + } + + @Override + public void onAnimationFinished() { + BackAnimationRunner runner = mRunnerRef.get(); + if (runner == null) { + return; + } + if (runner.shouldMonitorCUJ(runner.mApps)) { + InteractionJankMonitor.getInstance().end(runner.mCujType); + } + + runner.mFinishedCallback.run(); + for (int i = runner.mApps.length - 1; i >= 0; --i) { + SurfaceControl sc = runner.mApps[i].leash; + if (sc != null && sc.isValid()) { + sc.release(); + } + } + runner.mApps = null; + runner.mFinishedCallback = null; + } + } + /** * Called from {@link IBackAnimationRunner}, it will deliver these * {@link RemoteAnimationTarget}s to the corresponding runner. @@ -108,16 +145,9 @@ public class BackAnimationRunner { void startAnimation(RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, Runnable finishedCallback) { InteractionJankMonitor interactionJankMonitor = InteractionJankMonitor.getInstance(); - final IRemoteAnimationFinishedCallback callback = - new IRemoteAnimationFinishedCallback.Stub() { - @Override - public void onAnimationFinished() { - if (shouldMonitorCUJ(apps)) { - interactionJankMonitor.end(mCujType); - } - finishedCallback.run(); - } - }; + mFinishedCallback = finishedCallback; + mApps = apps; + if (mRemoteCallback == null) mRemoteCallback = new RemoteAnimationFinishedStub(this); mWaitingAnimation = false; if (shouldMonitorCUJ(apps)) { interactionJankMonitor.begin( @@ -125,7 +155,7 @@ public class BackAnimationRunner { } try { getRunner().onAnimationStart(TRANSIT_OLD_UNSET, apps, wallpapers, - nonApps, callback); + nonApps, mRemoteCallback); } catch (RemoteException e) { Log.w(TAG, "Failed call onAnimationStart", e); } -- GitLab From 4e39bcfeb856159395295eeebcde4ba6fdde1e01 Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Mon, 21 Oct 2024 15:46:08 +0900 Subject: [PATCH 103/459] Fix preupload warnings Flag: EXEMPT format changes only Bug: None Test: None Change-Id: I28d9d808702cd0b4966dc0bc9a9b648a9f86bd52 --- .../android/wm/shell/desktopmode/DesktopTasksController.kt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 3f6dc94d6a3f..711b1c67e575 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -515,7 +515,6 @@ class DesktopTasksController( wct.setWindowingMode(task.token, WINDOWING_MODE_UNDEFINED) transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) - } private fun exitSplitIfApplicable(wct: WindowContainerTransaction, taskInfo: RunningTaskInfo) { @@ -657,7 +656,6 @@ class DesktopTasksController( wct.reparent(task.token, displayAreaInfo.token, true /* onTop */) transitions.startTransition(TRANSIT_CHANGE, wct, null /* handler */) - } /** Moves a task in/out of full immersive state within the desktop. */ @@ -733,7 +731,6 @@ class DesktopTasksController( val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) toggleResizeDesktopTaskTransitionHandler.startTransition(wct) - } private fun getMaximizeBounds(taskInfo: RunningTaskInfo, stableBounds: Rect): Rect { @@ -845,7 +842,6 @@ class DesktopTasksController( val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) toggleResizeDesktopTaskTransitionHandler.startTransition(wct, currentDragBounds) - } @VisibleForTesting -- GitLab From 7e28dff226b28edcf254cb6f6bdd4be9bc799280 Mon Sep 17 00:00:00 2001 From: Wenhao Wang Date: Wed, 16 Oct 2024 10:13:05 -0700 Subject: [PATCH 104/459] [Forensic] Add BackupTransportConnector The ForensicService uses the BackupTransportConnector to send commands to the BackupTransport binder service. Three commands are as following: 1. Initialize 2. AddData 3. Release The BackupTransportConnector is also in charge of bind and unbind the BackupTransport binder service. The config_forensicBackupTransport is used to specify the BackupTransport binder service. It's empty on AOSP. GMS overlay file will include a BackupTransport binder service on GMS Core for GMS devices. Bug: 365994454 Test: atest ForensicServiceTest Flag: android.security.afl_api Ignore-AOSP-First: security feature Change-Id: Ib40f9b0ba2655a9c1fc4de0a104211661082086a --- .../security/forensic/ForensicEvent.aidl | 20 +++ .../security/forensic/ForensicEvent.java | 84 ++++++++++ .../security/forensic/IBackupTransport.aidl | 41 +++++ core/res/res/values/config.xml | 3 + core/res/res/values/symbols.xml | 3 + .../forensic/BackupTransportConnection.java | 153 ++++++++++++++++++ .../security/forensic/ForensicService.java | 14 ++ .../forensic/ForensicServiceTest.java | 41 ++++- 8 files changed, 357 insertions(+), 2 deletions(-) create mode 100644 core/java/android/security/forensic/ForensicEvent.aidl create mode 100644 core/java/android/security/forensic/ForensicEvent.java create mode 100644 core/java/android/security/forensic/IBackupTransport.aidl create mode 100644 services/core/java/com/android/server/security/forensic/BackupTransportConnection.java diff --git a/core/java/android/security/forensic/ForensicEvent.aidl b/core/java/android/security/forensic/ForensicEvent.aidl new file mode 100644 index 000000000000..a321fb0cb939 --- /dev/null +++ b/core/java/android/security/forensic/ForensicEvent.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.security.forensic; + +/** {@hide} */ +parcelable ForensicEvent; diff --git a/core/java/android/security/forensic/ForensicEvent.java b/core/java/android/security/forensic/ForensicEvent.java new file mode 100644 index 000000000000..9cbc5ecea962 --- /dev/null +++ b/core/java/android/security/forensic/ForensicEvent.java @@ -0,0 +1,84 @@ +/* + * 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.security.forensic; + +import android.annotation.FlaggedApi; +import android.annotation.NonNull; +import android.os.Parcel; +import android.os.Parcelable; +import android.security.Flags; +import android.util.ArrayMap; + +import java.util.Map; + +/** + * A class that represents a forensic event. + * @hide + */ +@FlaggedApi(Flags.FLAG_AFL_API) +public final class ForensicEvent implements Parcelable { + private static final String TAG = "ForensicEvent"; + + @NonNull + private final String mType; + + @NonNull + private final Map mKeyValuePairs; + + public static final @NonNull Parcelable.Creator CREATOR = + new Parcelable.Creator<>() { + public ForensicEvent createFromParcel(Parcel in) { + return new ForensicEvent(in); + } + + public ForensicEvent[] newArray(int size) { + return new ForensicEvent[size]; + } + }; + + public ForensicEvent(@NonNull String type, @NonNull Map keyValuePairs) { + mType = type; + mKeyValuePairs = keyValuePairs; + } + + private ForensicEvent(@NonNull Parcel in) { + mType = in.readString(); + mKeyValuePairs = new ArrayMap<>(in.readInt()); + in.readMap(mKeyValuePairs, getClass().getClassLoader(), String.class, String.class); + } + + @Override + public void writeToParcel(@NonNull Parcel out, int flags) { + out.writeString(mType); + out.writeInt(mKeyValuePairs.size()); + out.writeMap(mKeyValuePairs); + } + + @FlaggedApi(Flags.FLAG_AFL_API) + @Override + public int describeContents() { + return 0; + } + + @Override + public String toString() { + return "ForensicEvent{" + + "mType=" + mType + + ", mKeyValuePairs=" + mKeyValuePairs + + '}'; + } +} diff --git a/core/java/android/security/forensic/IBackupTransport.aidl b/core/java/android/security/forensic/IBackupTransport.aidl new file mode 100644 index 000000000000..c2cbc83ba1b3 --- /dev/null +++ b/core/java/android/security/forensic/IBackupTransport.aidl @@ -0,0 +1,41 @@ +/* + * Copyright 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.forensic; +import android.security.forensic.ForensicEvent; + +import com.android.internal.infra.AndroidFuture; + +/** {@hide} */ +oneway interface IBackupTransport { + /** + * Initialize the server side. + */ + void initialize(in AndroidFuture resultFuture); + + /** + * Send forensic logging data to the backup destination. + * The data is a list of ForensicEvent. + * The ForensicEvent is an abstract class that represents + * different type of events. + */ + void addData(in List events, in AndroidFuture resultFuture); + + /** + * Release the binder to the server. + */ + void release(in AndroidFuture resultFuture); +} diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 91b482051065..9072f84f43a0 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -7172,4 +7172,7 @@ com\u002eandroid\u002esettings + + + diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 0348b4685a66..3ad3b54eb78c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5634,4 +5634,7 @@ + + + diff --git a/services/core/java/com/android/server/security/forensic/BackupTransportConnection.java b/services/core/java/com/android/server/security/forensic/BackupTransportConnection.java new file mode 100644 index 000000000000..caca011b6549 --- /dev/null +++ b/services/core/java/com/android/server/security/forensic/BackupTransportConnection.java @@ -0,0 +1,153 @@ +/* + * 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.server.security.forensic; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import android.os.RemoteException; +import android.os.UserHandle; +import android.security.forensic.ForensicEvent; +import android.security.forensic.IBackupTransport; +import android.text.TextUtils; +import android.util.Slog; + +import com.android.internal.infra.AndroidFuture; + +import java.util.List; +import java.util.concurrent.CancellationException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; + +public class BackupTransportConnection implements ServiceConnection { + private static final String TAG = "BackupTransportConnection"; + private static final long FUTURE_TIMEOUT_MILLIS = 60 * 1000; // 1 mins + private final Context mContext; + private String mForensicBackupTransportConfig; + volatile IBackupTransport mService; + + public BackupTransportConnection(Context context) { + mContext = context; + mService = null; + } + + /** + * Initialize the BackupTransport binder service. + * @return Whether the initialization succeed. + */ + public boolean initialize() { + if (!bindService()) { + return false; + } + AndroidFuture resultFuture = new AndroidFuture<>(); + try { + mService.initialize(resultFuture); + } catch (RemoteException e) { + Slog.e(TAG, "Remote Exception", e); + unbindService(); + return false; + } + Integer result = getFutureResult(resultFuture); + if (result != null && result == 0) { + return true; + } else { + unbindService(); + return false; + } + } + + /** + * Add data to the BackupTransport binder service. + * @param data List of ForensicEvent. + * @return Whether the data is added to the binder service. + */ + public boolean addData(List data) { + AndroidFuture resultFuture = new AndroidFuture<>(); + try { + mService.addData(data, resultFuture); + } catch (RemoteException e) { + Slog.e(TAG, "Remote Exception", e); + return false; + } + Integer result = getFutureResult(resultFuture); + return result != null && result == 0; + } + + /** + * Release the BackupTransport binder service. + */ + public void release() { + AndroidFuture resultFuture = new AndroidFuture<>(); + try { + mService.release(resultFuture); + } catch (RemoteException e) { + Slog.e(TAG, "Remote Exception", e); + } finally { + unbindService(); + } + } + + private T getFutureResult(AndroidFuture future) { + try { + return future.get(FUTURE_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); + } catch (InterruptedException | ExecutionException | TimeoutException + | CancellationException e) { + Slog.w(TAG, "Failed to get result from transport:", e); + return null; + } + } + + private boolean bindService() { + mForensicBackupTransportConfig = mContext.getString( + com.android.internal.R.string.config_forensicBackupTransport); + if (TextUtils.isEmpty(mForensicBackupTransportConfig)) { + return false; + } + + ComponentName serviceComponent = + ComponentName.unflattenFromString(mForensicBackupTransportConfig); + if (serviceComponent == null) { + return false; + } + + Intent intent = new Intent().setComponent(serviceComponent); + boolean result = mContext.bindServiceAsUser( + intent, this, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM); + if (!result) { + unbindService(); + } + return result; + } + + private void unbindService() { + mContext.unbindService(this); + mService = null; + } + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + mService = IBackupTransport.Stub.asInterface(service); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + mService = null; + } +} diff --git a/services/core/java/com/android/server/security/forensic/ForensicService.java b/services/core/java/com/android/server/security/forensic/ForensicService.java index 07639d1a3945..20c648eb61c2 100644 --- a/services/core/java/com/android/server/security/forensic/ForensicService.java +++ b/services/core/java/com/android/server/security/forensic/ForensicService.java @@ -63,6 +63,7 @@ public class ForensicService extends SystemService { private final Context mContext; private final Handler mHandler; + private final BackupTransportConnection mBackupTransportConnection; private final BinderService mBinderService; private final ArrayList mStateMonitors = new ArrayList<>(); @@ -77,6 +78,7 @@ public class ForensicService extends SystemService { super(injector.getContext()); mContext = injector.getContext(); mHandler = new EventHandler(injector.getLooper(), this); + mBackupTransportConnection = injector.getBackupTransportConnection(); mBinderService = new BinderService(this); } @@ -221,6 +223,10 @@ public class ForensicService extends SystemService { private void enable(IForensicServiceCommandCallback callback) throws RemoteException { switch (mState) { case STATE_VISIBLE: + if (!mBackupTransportConnection.initialize()) { + callback.onFailure(ERROR_BACKUP_TRANSPORT_UNAVAILABLE); + break; + } mState = STATE_ENABLED; notifyStateMonitors(); callback.onSuccess(); @@ -236,6 +242,7 @@ public class ForensicService extends SystemService { private void disable(IForensicServiceCommandCallback callback) throws RemoteException { switch (mState) { case STATE_ENABLED: + mBackupTransportConnection.release(); mState = STATE_VISIBLE; notifyStateMonitors(); callback.onSuccess(); @@ -266,6 +273,8 @@ public class ForensicService extends SystemService { Context getContext(); Looper getLooper(); + + BackupTransportConnection getBackupTransportConnection(); } private static final class InjectorImpl implements Injector { @@ -289,6 +298,11 @@ public class ForensicService extends SystemService { serviceThread.start(); return serviceThread.getLooper(); } + + @Override + public BackupTransportConnection getBackupTransportConnection() { + return new BackupTransportConnection(mContext); + } } } diff --git a/services/tests/security/forensic/src/com/android/server/security/forensic/ForensicServiceTest.java b/services/tests/security/forensic/src/com/android/server/security/forensic/ForensicServiceTest.java index 7aa2e0f609a7..2b55303bd89f 100644 --- a/services/tests/security/forensic/src/com/android/server/security/forensic/ForensicServiceTest.java +++ b/services/tests/security/forensic/src/com/android/server/security/forensic/ForensicServiceTest.java @@ -19,6 +19,9 @@ package com.android.server.security.forensic; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; import android.annotation.SuppressLint; import android.content.Context; @@ -50,7 +53,8 @@ public class ForensicServiceTest { IForensicServiceCommandCallback.ErrorCode.DATA_SOURCE_UNAVAILABLE; @Mock - private Context mContextSpy; + private Context mContext; + private BackupTransportConnection mBackupTransportConnection; private ForensicService mForensicService; private TestLooper mTestLooper; @@ -63,7 +67,7 @@ public class ForensicServiceTest { mTestLooper = new TestLooper(); mLooper = mTestLooper.getLooper(); - mForensicService = new ForensicService(new MockInjector(mContextSpy)); + mForensicService = new ForensicService(new MockInjector(mContext)); mForensicService.onStart(); } @@ -253,6 +257,8 @@ public class ForensicServiceTest { assertEquals(STATE_VISIBLE, scb1.mState); assertEquals(STATE_VISIBLE, scb2.mState); + doReturn(true).when(mBackupTransportConnection).initialize(); + CommandCallback ccb = new CommandCallback(); mForensicService.getBinderService().enable(ccb); mTestLooper.dispatchAll(); @@ -261,6 +267,29 @@ public class ForensicServiceTest { assertNull(ccb.mErrorCode); } + @Test + public void testEnable_FromVisible_TwoMonitors_BackupTransportUnavailable() + throws RemoteException { + mForensicService.setState(STATE_VISIBLE); + StateCallback scb1 = new StateCallback(); + StateCallback scb2 = new StateCallback(); + mForensicService.getBinderService().monitorState(scb1); + mForensicService.getBinderService().monitorState(scb2); + mTestLooper.dispatchAll(); + assertEquals(STATE_VISIBLE, scb1.mState); + assertEquals(STATE_VISIBLE, scb2.mState); + + doReturn(false).when(mBackupTransportConnection).initialize(); + + CommandCallback ccb = new CommandCallback(); + mForensicService.getBinderService().enable(ccb); + mTestLooper.dispatchAll(); + assertEquals(STATE_VISIBLE, scb1.mState); + assertEquals(STATE_VISIBLE, scb2.mState); + assertNotNull(ccb.mErrorCode); + assertEquals(ERROR_BACKUP_TRANSPORT_UNAVAILABLE, ccb.mErrorCode.intValue()); + } + @Test public void testEnable_FromEnabled_TwoMonitors() throws RemoteException { mForensicService.setState(STATE_ENABLED); @@ -330,6 +359,8 @@ public class ForensicServiceTest { assertEquals(STATE_ENABLED, scb1.mState); assertEquals(STATE_ENABLED, scb2.mState); + doNothing().when(mBackupTransportConnection).release(); + CommandCallback ccb = new CommandCallback(); mForensicService.getBinderService().disable(ccb); mTestLooper.dispatchAll(); @@ -356,6 +387,12 @@ public class ForensicServiceTest { return mLooper; } + @Override + public BackupTransportConnection getBackupTransportConnection() { + mBackupTransportConnection = spy(new BackupTransportConnection(mContext)); + return mBackupTransportConnection; + } + } private static class StateCallback extends IForensicServiceStateCallback.Stub { -- GitLab From 6ae62adeea6ff08186775a893fe81c986feddfde Mon Sep 17 00:00:00 2001 From: Vadim Caen Date: Mon, 21 Oct 2024 10:27:36 +0200 Subject: [PATCH 105/459] Add Flag for connected display recording Bug: 362720120 Flag: com.android.media.projection.flags.media_projection_connected_display Test: N/A Change-Id: I7fa186dd3184836093f0925a639ba03ddc540b30 --- media/java/android/media/flags/projection.aconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/media/java/android/media/flags/projection.aconfig b/media/java/android/media/flags/projection.aconfig index 9a9a0735d089..17d1ff6a86a7 100644 --- a/media/java/android/media/flags/projection.aconfig +++ b/media/java/android/media/flags/projection.aconfig @@ -10,3 +10,11 @@ flag { bug: "323008518" is_fixed_read_only: true } + +flag { + name: "media_projection_connected_display" + namespace: "virtual_devices" + description: "Enable recording connected display" + bug: "362720120" + is_exported: true +} -- GitLab From c08c296025a17b72e9a7ac15df8936080505d17e Mon Sep 17 00:00:00 2001 From: Anna Bauza Date: Thu, 17 Oct 2024 07:50:04 +0000 Subject: [PATCH 106/459] Cache getProfileParent to reduce high volume of binder calls. Test: atest UserManagerTest Flag: android.multiuser.cache_profile_parent_read_only Bug: 350417399 Change-Id: I2555d4e7495f0a73734ae22f0d7aa246bf2cc44e --- core/java/android/os/UserManager.java | 31 +++++++++++++++---- .../android/server/pm/UserManagerService.java | 6 ++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java index bd3da0d56cbd..f1b65c895699 100644 --- a/core/java/android/os/UserManager.java +++ b/core/java/android/os/UserManager.java @@ -5600,14 +5600,30 @@ public class UserManager { android.Manifest.permission.MANAGE_USERS, android.Manifest.permission.INTERACT_ACROSS_USERS }) + @CachedProperty(api = "user_manager_users") public @Nullable UserHandle getProfileParent(@NonNull UserHandle user) { - UserInfo info = getProfileParent(user.getIdentifier()); - - if (info == null) { - return null; + if (android.multiuser.Flags.cacheProfileParentReadOnly()) { + final UserHandle userHandle = UserManagerCache.getProfileParent( + (UserHandle query) -> { + UserInfo info = getProfileParent(query.getIdentifier()); + // TODO: Remove when b/372923336 is fixed + if (info == null) { + return UserHandle.of(UserHandle.USER_NULL); + } + return UserHandle.of(info.id); + }, + user); + if (userHandle.getIdentifier() == UserHandle.USER_NULL) { + return null; + } + return userHandle; + } else { + UserInfo info = getProfileParent(user.getIdentifier()); + if (info == null) { + return null; + } + return UserHandle.of(info.id); } - - return UserHandle.of(info.id); } /** @@ -6422,6 +6438,9 @@ public class UserManager { */ public static final void invalidateCacheOnUserListChange() { UserManagerCache.invalidateUserSerialNumber(); + if (android.multiuser.Flags.cacheProfileParentReadOnly()) { + UserManagerCache.invalidateProfileParent(); + } } /** diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index daf413bb30b3..bcebfcdcfe08 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -5789,6 +5789,9 @@ public class UserManagerService extends IUserManager.Stub { } userInfo.partial = false; + if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) { + UserManager.invalidateCacheOnUserListChange(); + } synchronized (mPackagesLock) { writeUserLP(userData); } @@ -6367,6 +6370,9 @@ public class UserManagerService extends IUserManager.Stub { // on next startup, in case the runtime stops now before stopping and // removing the user completely. userData.info.partial = true; + if (android.multiuser.Flags.invalidateCacheOnUsersChangedReadOnly()) { + UserManager.invalidateCacheOnUserListChange(); + } // Mark it as disabled, so that it isn't returned any more when // profiles are queried. userData.info.flags |= UserInfo.FLAG_DISABLED; -- GitLab From 4816fa8ae8801cd3f780787c55755ce42a46d924 Mon Sep 17 00:00:00 2001 From: art-benchmark-service Date: Fri, 18 Oct 2024 07:28:46 -0700 Subject: [PATCH 107/459] Update boot image and system server profiles [M80C35P56S0PP] Bug: 254051423 Test: go/art-benchmark?p=BootImageProfileId:41298&f=CandidateName:in:41302 = Perf stats = (lower is better) Regular update to the boot image profiles. Benchmark shows improvements for Apps startup and memory, boot memory and boot time, but with an increase of code size by 629KB which could be an acceptable cost given the improvmenet in the other metrics. Avg % [Confidence interval min-max %] App Startup: -1.43 [-3.4, 0.53] App RSS: 0.23 [-0.44, 0.89] App Anon RSS + Swap: -0.79 [-2.55, 0.96] Memory(PSS): -1.07 [-3.16, 1.03] Memory(RSS): -0.97 [-1.94, 0] Memory(Private-dirty): -1.47 [-6.05, 3.12] Boot time: -1.11 [-1.59, -0.62] Code size: 629KB (0.701%) Ignore-AOSP-First: Boot image profiles Flag: EXEMPT resource only update BYPASS_INCLUSIVE_LANGUAGE_REASON: Profile of existing code =Generation Strategy= method_threshold: 0.8 image_class_threshold: 0.35 preloaded_classes_threshold: 0.56 priority_packages_thresholds { key: "service-appsearch.jar.prof:CLASS:android" value: 0.025 } priority_packages_thresholds { key: "service-appsearch.jar.prof:METHOD:android" value: 0.057142857 } priority_packages_thresholds { key: "service-art.jar.prof:CLASS:android" value: 0.025 } priority_packages_thresholds { key: "service-art.jar.prof:METHOD:android" value: 0.057142857 } priority_packages_thresholds { key: "service-connectivity.jar.prof:CLASS:android" value: 0.025 } priority_packages_thresholds { key: "service-connectivity.jar.prof:METHOD:android" value: 0.057142857 } priority_packages_thresholds { key: "service-wifi.jar.prof:CLASS:android" value: 0.025 } priority_packages_thresholds { key: "service-wifi.jar.prof:METHOD:android" value: 0.057142857 } priority_packages_thresholds { key: "services.jar.prof:CLASS:android" value: 0.025 } priority_packages_thresholds { key: "services.jar.prof:METHOD:android" value: 0.057142857 } =Profile stats= Data info: - total aggregations: 4270 - number of (device types, builds): 130 File preloaded-classes - hot methods: 0 added, 0 removed - methods: 0 added, 0 removed - classes: 398 added, 355 removed - totals now: 0 hot methods, 0 methods, 17805 classes - totals before: 0 hot methods, 0 methods, 17762 classes per package info as csv (selected): package_name, hot_a, hot_r, cl_a, cl_r, hot_num, cl_num android, 0, 0, 268, 253, 0, 10387 com.android, 0, 0, 65, 18, 0, 3562 java, 0, 0, 36, 71, 0, 2083 android.view, 0, 0, 32, 58, 0, 1116 android.hardware, 0, 0, 5, 7, 0, 871 android.animation, 0, 0, 5, 5, 0, 89 android.app, 0, 0, 26, 29, 0, 1177 android.content, 0, 0, 9, 15, 0, 626 android.graphics, 0, 0, 11, 7, 0, 372 android.icu, 0, 0, 11, 19, 0, 1489 android.media, 0, 0, 9, 12, 0, 625 android.net, 0, 0, 0, 5, 0, 216 android.widget, 0, 0, 22, 41, 0, 424 File boot-image-profile.txt - hot methods: 1121 added, 1294 removed - methods: 1121 added, 1294 removed - classes: 423 added, 326 removed - totals now: 22324 hot methods, 22324 methods, 14639 classes - totals before: 22497 hot methods, 22497 methods, 14542 classes per package info as csv (selected): package_name, hot_a, hot_r, cl_a, cl_r, hot_num, cl_num android, 1062, 1216, 335, 301, 20834, 10394 com.android, 59, 78, 84, 24, 1393, 3155 java, 0, 0, 0, 1, 2, 114 android.view, 204, 260, 40, 60, 3359, 1120 android.hardware, 5, 23, 9, 16, 466, 871 android.animation, 65, 65, 5, 5, 413, 89 android.app, 62, 86, 40, 37, 2912, 1181 android.content, 87, 97, 10, 22, 1906, 629 android.graphics, 73, 74, 8, 7, 1974, 372 android.icu, 128, 100, 30, 26, 2076, 1489 android.media, 12, 14, 12, 15, 790, 630 android.net, 23, 26, 0, 4, 249, 218 android.widget, 62, 67, 23, 41, 1399, 425 File preloaded-classes - hot methods: 0 added, 0 removed - methods: 0 added, 0 removed - classes: 324 added, 270 removed - totals now: 0 hot methods, 0 methods, 14584 classes - totals before: 0 hot methods, 0 methods, 14530 classes per package info as csv (selected): package_name, hot_a, hot_r, cl_a, cl_r, hot_num, cl_num android, 0, 0, 267, 253, 0, 10355 com.android, 0, 0, 57, 17, 0, 3142 android.view, 0, 0, 32, 58, 0, 1116 android.hardware, 0, 0, 5, 7, 0, 871 android.animation, 0, 0, 5, 5, 0, 89 android.app, 0, 0, 26, 29, 0, 1177 android.content, 0, 0, 9, 15, 0, 626 android.graphics, 0, 0, 11, 7, 0, 372 android.icu, 0, 0, 11, 19, 0, 1489 android.media, 0, 0, 9, 12, 0, 625 android.net, 0, 0, 0, 5, 0, 216 android.widget, 0, 0, 22, 41, 0, 424 File art-profile - hot methods: 2259 added, 2069 removed - methods: 2259 added, 2069 removed - classes: 1618 added, 3 removed - totals now: 4140 hot methods, 4140 methods, 1697 classes - totals before: 3950 hot methods, 3950 methods, 82 classes per package info as csv (selected): package_name, hot_a, hot_r, cl_a, cl_r, hot_num, cl_num android, 12, 12, 17, 1, 21, 17 com.android, 2247, 2057, 1567, 2, 4119, 1646 android.hardware, 10, 10, 8, 0, 18, 8 android.content, 0, 0, 3, 0, 1, 3 android.net, 2, 2, 3, 0, 2, 3 InternalReferenceRawProfileId: 41298 InternalReferenceCandidateProfileId: 41302 Test: build & benchmark Change-Id: Id6e9863dbeef2bc9ea4d8855e5d640dd81d16f8e --- boot/boot-image-profile.txt | 3166 +++++++++--------- boot/preloaded-classes | 594 ++-- config/preloaded-classes | 753 +++-- services/art-profile | 6081 +++++++++++++++++++++++------------ 4 files changed, 6210 insertions(+), 4384 deletions(-) diff --git a/boot/boot-image-profile.txt b/boot/boot-image-profile.txt index 854d4ee3dd9c..74b2f84b84a5 100644 --- a/boot/boot-image-profile.txt +++ b/boot/boot-image-profile.txt @@ -53,7 +53,6 @@ HSPLandroid/accounts/AccountManager$AccountKeyData;->equals(Ljava/lang/Object;)Z HSPLandroid/accounts/AccountManager$AccountKeyData;->hashCode()I HSPLandroid/accounts/AccountManager$AmsTask$1;->(Landroid/accounts/AccountManager;)V HSPLandroid/accounts/AccountManager$AmsTask$Response;->(Landroid/accounts/AccountManager$AmsTask;)V -HSPLandroid/accounts/AccountManager$AmsTask$Response;->(Landroid/accounts/AccountManager$AmsTask;Landroid/accounts/AccountManager$AmsTask$Response-IA;)V HSPLandroid/accounts/AccountManager$AmsTask$Response;->onResult(Landroid/os/Bundle;)V HSPLandroid/accounts/AccountManager$AmsTask;->(Landroid/accounts/AccountManager;Landroid/app/Activity;Landroid/os/Handler;Landroid/accounts/AccountManagerCallback;)V HSPLandroid/accounts/AccountManager$AmsTask;->done()V @@ -124,19 +123,19 @@ HSPLandroid/accounts/IAccountManagerResponse$Stub;->onTransact(ILandroid/os/Parc HSPLandroid/animation/AnimationHandler$$ExternalSyntheticLambda0;->(Landroid/animation/AnimationHandler;)V HSPLandroid/animation/AnimationHandler$$ExternalSyntheticLambda0;->doFrame(J)V HSPLandroid/animation/AnimationHandler$1;->(Landroid/animation/AnimationHandler;)V -HSPLandroid/animation/AnimationHandler$1;->doFrame(J)V+]Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider;Landroid/animation/AnimationHandler$MyFrameCallbackProvider;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/AnimationHandler$1;->doFrame(J)V HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->(Landroid/animation/AnimationHandler;)V -HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->getFrameTime()J+]Landroid/view/Choreographer;Landroid/view/Choreographer; -HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->getFrameTime()J +HSPLandroid/animation/AnimationHandler$MyFrameCallbackProvider;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V HSPLandroid/animation/AnimationHandler;->()V HSPLandroid/animation/AnimationHandler;->addAnimationFrameCallback(Landroid/animation/AnimationHandler$AnimationFrameCallback;J)V -HSPLandroid/animation/AnimationHandler;->autoCancelBasedOn(Landroid/animation/ObjectAnimator;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/animation/AnimationHandler;->cleanUpList()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/animation/AnimationHandler;->doAnimationFrame(J)V+]Landroid/animation/AnimationHandler$AnimationFrameCallback;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator;,Lcom/android/internal/dynamicanimation/animation/SpringAnimation;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/AnimationHandler;->autoCancelBasedOn(Landroid/animation/ObjectAnimator;)V +HSPLandroid/animation/AnimationHandler;->cleanUpList()V +HSPLandroid/animation/AnimationHandler;->doAnimationFrame(J)V HSPLandroid/animation/AnimationHandler;->getAnimationCount()I HSPLandroid/animation/AnimationHandler;->getInstance()Landroid/animation/AnimationHandler; HSPLandroid/animation/AnimationHandler;->getProvider()Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider; -HSPLandroid/animation/AnimationHandler;->isCallbackDue(Landroid/animation/AnimationHandler$AnimationFrameCallback;J)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/animation/AnimationHandler;->isCallbackDue(Landroid/animation/AnimationHandler$AnimationFrameCallback;J)Z HSPLandroid/animation/AnimationHandler;->isPauseBgAnimationsEnabledInSystemProperties()Z HSPLandroid/animation/AnimationHandler;->removeCallback(Landroid/animation/AnimationHandler$AnimationFrameCallback;)V HSPLandroid/animation/AnimationHandler;->requestAnimatorsEnabled(ZLjava/lang/Object;)V @@ -157,7 +156,7 @@ HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;-> HSPLandroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;->call(Ljava/lang/Object;Ljava/lang/Object;Z)V HSPLandroid/animation/Animator$AnimatorCaller;->()V HSPLandroid/animation/Animator$AnimatorCaller;->lambda$static$0(Landroid/animation/Animator$AnimatorListener;Landroid/animation/Animator;Z)V -HSPLandroid/animation/Animator$AnimatorCaller;->lambda$static$4(Landroid/animation/ValueAnimator$AnimatorUpdateListener;Landroid/animation/ValueAnimator;Z)V+]Landroid/animation/ValueAnimator$AnimatorUpdateListener;missing_types +HSPLandroid/animation/Animator$AnimatorCaller;->lambda$static$4(Landroid/animation/ValueAnimator$AnimatorUpdateListener;Landroid/animation/ValueAnimator;Z)V HSPLandroid/animation/Animator$AnimatorConstantState;->(Landroid/animation/Animator;)V HSPLandroid/animation/Animator$AnimatorConstantState;->getChangingConfigurations()I HSPLandroid/animation/Animator$AnimatorConstantState;->newInstance()Landroid/animation/Animator; @@ -168,7 +167,7 @@ HSPLandroid/animation/Animator;->()V HSPLandroid/animation/Animator;->addListener(Landroid/animation/Animator$AnimatorListener;)V HSPLandroid/animation/Animator;->addPauseListener(Landroid/animation/Animator$AnimatorPauseListener;)V HSPLandroid/animation/Animator;->appendChangingConfigurations(I)V -HSPLandroid/animation/Animator;->callOnList(Ljava/util/ArrayList;Landroid/animation/Animator$AnimatorCaller;Ljava/lang/Object;Z)V+]Landroid/animation/Animator$AnimatorCaller;Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda6;,Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda2;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference; +HSPLandroid/animation/Animator;->callOnList(Ljava/util/ArrayList;Landroid/animation/Animator$AnimatorCaller;Ljava/lang/Object;Z)V HSPLandroid/animation/Animator;->clone()Landroid/animation/Animator; HSPLandroid/animation/Animator;->createConstantState()Landroid/content/res/ConstantState; HSPLandroid/animation/Animator;->getBackgroundPauseDelay()J @@ -180,7 +179,7 @@ HSPLandroid/animation/Animator;->notifyListeners(Landroid/animation/Animator$Ani HSPLandroid/animation/Animator;->notifyStartListeners(Z)V HSPLandroid/animation/Animator;->pause()V HSPLandroid/animation/Animator;->removeAllListeners()V -HSPLandroid/animation/Animator;->removeListener(Landroid/animation/Animator$AnimatorListener;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/Animator;->removeListener(Landroid/animation/Animator$AnimatorListener;)V HSPLandroid/animation/Animator;->setAllowRunningAsynchronously(Z)V HSPLandroid/animation/AnimatorInflater$PathDataEvaluator;->evaluate(FLandroid/util/PathParser$PathData;Landroid/util/PathParser$PathData;)Landroid/util/PathParser$PathData; HSPLandroid/animation/AnimatorInflater$PathDataEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; @@ -202,53 +201,53 @@ HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationCancel(Landroid/anima HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorListenerAdapter;->onAnimationStart(Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet$1;->(Landroid/animation/AnimatorSet;)V -HSPLandroid/animation/AnimatorSet$1;->onAnimationEnd(Landroid/animation/Animator;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/animation/AnimatorSet$1;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet$2;->(Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;)V HSPLandroid/animation/AnimatorSet$2;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet$3;->(Landroid/animation/AnimatorSet;)V -HSPLandroid/animation/AnimatorSet$3;->compare(Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;)I+]Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent; +HSPLandroid/animation/AnimatorSet$3;->compare(Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;)I HSPLandroid/animation/AnimatorSet$3;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroid/animation/AnimatorSet$AnimationEvent;->(Landroid/animation/AnimatorSet$Node;I)V -HSPLandroid/animation/AnimatorSet$AnimationEvent;->getTime()J+]Landroid/animation/Animator;Landroid/animation/ObjectAnimator; +HSPLandroid/animation/AnimatorSet$AnimationEvent;->getTime()J HSPLandroid/animation/AnimatorSet$Builder;->(Landroid/animation/AnimatorSet;Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet$Builder;->after(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder; HSPLandroid/animation/AnimatorSet$Builder;->before(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder; HSPLandroid/animation/AnimatorSet$Builder;->with(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder; HSPLandroid/animation/AnimatorSet$Node;->(Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet$Node;->addChild(Landroid/animation/AnimatorSet$Node;)V -HSPLandroid/animation/AnimatorSet$Node;->addParent(Landroid/animation/AnimatorSet$Node;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node; +HSPLandroid/animation/AnimatorSet$Node;->addParent(Landroid/animation/AnimatorSet$Node;)V HSPLandroid/animation/AnimatorSet$Node;->addParents(Ljava/util/ArrayList;)V -HSPLandroid/animation/AnimatorSet$Node;->addSibling(Landroid/animation/AnimatorSet$Node;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node; -HSPLandroid/animation/AnimatorSet$Node;->clone()Landroid/animation/AnimatorSet$Node;+]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet$Node;->addSibling(Landroid/animation/AnimatorSet$Node;)V +HSPLandroid/animation/AnimatorSet$Node;->clone()Landroid/animation/AnimatorSet$Node; HSPLandroid/animation/AnimatorSet$SeekState;->(Landroid/animation/AnimatorSet;)V HSPLandroid/animation/AnimatorSet$SeekState;->getPlayTimeNormalized()J HSPLandroid/animation/AnimatorSet$SeekState;->isActive()Z HSPLandroid/animation/AnimatorSet$SeekState;->reset()V -HSPLandroid/animation/AnimatorSet;->()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->()V HSPLandroid/animation/AnimatorSet;->addAnimationCallback(J)V -HSPLandroid/animation/AnimatorSet;->addAnimationEndListener()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->addAnimationEndListener()V HSPLandroid/animation/AnimatorSet;->cancel()V HSPLandroid/animation/AnimatorSet;->clone()Landroid/animation/Animator; -HSPLandroid/animation/AnimatorSet;->clone()Landroid/animation/AnimatorSet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator; -HSPLandroid/animation/AnimatorSet;->createDependencyGraph()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/AnimatorSet$AnimationEvent;Landroid/animation/AnimatorSet$AnimationEvent;]Landroid/animation/AnimatorSet$Node;Landroid/animation/AnimatorSet$Node;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator; -HSPLandroid/animation/AnimatorSet;->doAnimationFrame(J)Z+]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/animation/AnimatorSet;->end()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator; -HSPLandroid/animation/AnimatorSet;->endAnimation()V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/AnimatorSet;->clone()Landroid/animation/AnimatorSet; +HSPLandroid/animation/AnimatorSet;->createDependencyGraph()V +HSPLandroid/animation/AnimatorSet;->doAnimationFrame(J)Z +HSPLandroid/animation/AnimatorSet;->end()V +HSPLandroid/animation/AnimatorSet;->endAnimation()V HSPLandroid/animation/AnimatorSet;->ensureChildStartAndEndTimes()[J HSPLandroid/animation/AnimatorSet;->findLatestEventIdForTime(J)I HSPLandroid/animation/AnimatorSet;->findNextIndex(J[J)I HSPLandroid/animation/AnimatorSet;->findSiblings(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)V HSPLandroid/animation/AnimatorSet;->getChangingConfigurations()I -HSPLandroid/animation/AnimatorSet;->getChildAnimations()Ljava/util/ArrayList;+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/animation/AnimatorSet;->getNodeForAnimation(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/AnimatorSet;->getChildAnimations()Ljava/util/ArrayList; +HSPLandroid/animation/AnimatorSet;->getNodeForAnimation(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Node; HSPLandroid/animation/AnimatorSet;->getStartAndEndTimes(Landroid/util/LongArray;J)V HSPLandroid/animation/AnimatorSet;->getStartDelay()J HSPLandroid/animation/AnimatorSet;->getTotalDuration()J -HSPLandroid/animation/AnimatorSet;->handleAnimationEvents(IIJ)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; -HSPLandroid/animation/AnimatorSet;->initAnimation()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->handleAnimationEvents(IIJ)V +HSPLandroid/animation/AnimatorSet;->initAnimation()V HSPLandroid/animation/AnimatorSet;->initChildren()V -HSPLandroid/animation/AnimatorSet;->isEmptySet(Landroid/animation/AnimatorSet;)Z+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/animation/AnimatorSet;->isInitialized()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->isEmptySet(Landroid/animation/AnimatorSet;)Z +HSPLandroid/animation/AnimatorSet;->isInitialized()Z HSPLandroid/animation/AnimatorSet;->isRunning()Z HSPLandroid/animation/AnimatorSet;->isStarted()Z HSPLandroid/animation/AnimatorSet;->play(Landroid/animation/Animator;)Landroid/animation/AnimatorSet$Builder; @@ -258,40 +257,40 @@ HSPLandroid/animation/AnimatorSet;->playTogether([Landroid/animation/Animator;)V HSPLandroid/animation/AnimatorSet;->pulseAnimationFrame(J)Z HSPLandroid/animation/AnimatorSet;->pulseFrame(Landroid/animation/AnimatorSet$Node;J)V HSPLandroid/animation/AnimatorSet;->removeAnimationCallback()V -HSPLandroid/animation/AnimatorSet;->removeAnimationEndListener()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->removeAnimationEndListener()V HSPLandroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/Animator; HSPLandroid/animation/AnimatorSet;->setDuration(J)Landroid/animation/AnimatorSet; HSPLandroid/animation/AnimatorSet;->setInterpolator(Landroid/animation/TimeInterpolator;)V HSPLandroid/animation/AnimatorSet;->setStartDelay(J)V -HSPLandroid/animation/AnimatorSet;->setTarget(Ljava/lang/Object;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/animation/AnimatorSet;->setTarget(Ljava/lang/Object;)V HSPLandroid/animation/AnimatorSet;->shouldPlayTogether()Z HSPLandroid/animation/AnimatorSet;->skipToEndValue(Z)V -HSPLandroid/animation/AnimatorSet;->sortAnimationEvents()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->sortAnimationEvents()V HSPLandroid/animation/AnimatorSet;->start()V -HSPLandroid/animation/AnimatorSet;->start(ZZ)V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; -HSPLandroid/animation/AnimatorSet;->startAnimation()V+]Landroid/animation/AnimatorSet;Landroid/animation/AnimatorSet;]Landroid/animation/AnimatorSet$SeekState;Landroid/animation/AnimatorSet$SeekState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->start(ZZ)V +HSPLandroid/animation/AnimatorSet;->startAnimation()V HSPLandroid/animation/AnimatorSet;->startWithoutPulsing(Z)V -HSPLandroid/animation/AnimatorSet;->updateAnimatorsDuration()V+]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator; -HSPLandroid/animation/AnimatorSet;->updatePlayTime(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator;,Landroid/animation/AnimatorSet;,Landroid/animation/ValueAnimator; +HSPLandroid/animation/AnimatorSet;->updateAnimatorsDuration()V +HSPLandroid/animation/AnimatorSet;->updatePlayTime(Landroid/animation/AnimatorSet$Node;Ljava/util/ArrayList;)V HSPLandroid/animation/ArgbEvaluator;->()V HSPLandroid/animation/ArgbEvaluator;->evaluate(FLjava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/animation/ArgbEvaluator;->getInstance()Landroid/animation/ArgbEvaluator; HSPLandroid/animation/FloatKeyframeSet;->([Landroid/animation/Keyframe$FloatKeyframe;)V HSPLandroid/animation/FloatKeyframeSet;->clone()Landroid/animation/FloatKeyframeSet; HSPLandroid/animation/FloatKeyframeSet;->clone()Landroid/animation/Keyframes; -HSPLandroid/animation/FloatKeyframeSet;->getFloatValue(F)F+]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe$FloatKeyframe;Landroid/animation/Keyframe$FloatKeyframe; +HSPLandroid/animation/FloatKeyframeSet;->getFloatValue(F)F HSPLandroid/animation/FloatKeyframeSet;->getValue(F)Ljava/lang/Object; HSPLandroid/animation/IntKeyframeSet;->([Landroid/animation/Keyframe$IntKeyframe;)V -HSPLandroid/animation/IntKeyframeSet;->clone()Landroid/animation/IntKeyframeSet;+]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe; +HSPLandroid/animation/IntKeyframeSet;->clone()Landroid/animation/IntKeyframeSet; HSPLandroid/animation/IntKeyframeSet;->clone()Landroid/animation/Keyframes; HSPLandroid/animation/IntKeyframeSet;->getIntValue(F)I HSPLandroid/animation/Keyframe$FloatKeyframe;->(F)V HSPLandroid/animation/Keyframe$FloatKeyframe;->(FF)V -HSPLandroid/animation/Keyframe$FloatKeyframe;->clone()Landroid/animation/Keyframe$FloatKeyframe;+]Landroid/animation/Keyframe$FloatKeyframe;Landroid/animation/Keyframe$FloatKeyframe; +HSPLandroid/animation/Keyframe$FloatKeyframe;->clone()Landroid/animation/Keyframe$FloatKeyframe; HSPLandroid/animation/Keyframe$FloatKeyframe;->clone()Landroid/animation/Keyframe; HSPLandroid/animation/Keyframe$FloatKeyframe;->getFloatValue()F HSPLandroid/animation/Keyframe$FloatKeyframe;->getValue()Ljava/lang/Object; -HSPLandroid/animation/Keyframe$FloatKeyframe;->setValue(Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/Float;]Ljava/lang/Float;Ljava/lang/Float; +HSPLandroid/animation/Keyframe$FloatKeyframe;->setValue(Ljava/lang/Object;)V HSPLandroid/animation/Keyframe$IntKeyframe;->(FI)V HSPLandroid/animation/Keyframe$IntKeyframe;->clone()Landroid/animation/Keyframe$IntKeyframe; HSPLandroid/animation/Keyframe$IntKeyframe;->clone()Landroid/animation/Keyframe; @@ -313,11 +312,11 @@ HSPLandroid/animation/Keyframe;->ofObject(FLjava/lang/Object;)Landroid/animation HSPLandroid/animation/Keyframe;->setInterpolator(Landroid/animation/TimeInterpolator;)V HSPLandroid/animation/Keyframe;->setValueWasSetOnStart(Z)V HSPLandroid/animation/Keyframe;->valueWasSetOnStart()Z -HSPLandroid/animation/KeyframeSet;->([Landroid/animation/Keyframe;)V+]Landroid/animation/Keyframe;Landroid/animation/Keyframe$ObjectKeyframe;,Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe; +HSPLandroid/animation/KeyframeSet;->([Landroid/animation/Keyframe;)V HSPLandroid/animation/KeyframeSet;->clone()Landroid/animation/KeyframeSet; HSPLandroid/animation/KeyframeSet;->clone()Landroid/animation/Keyframes; HSPLandroid/animation/KeyframeSet;->getKeyframes()Ljava/util/List; -HSPLandroid/animation/KeyframeSet;->getValue(F)Ljava/lang/Object;+]Landroid/animation/Keyframe;Landroid/animation/Keyframe$ObjectKeyframe; +HSPLandroid/animation/KeyframeSet;->getValue(F)Ljava/lang/Object; HSPLandroid/animation/KeyframeSet;->ofFloat([F)Landroid/animation/KeyframeSet; HSPLandroid/animation/KeyframeSet;->ofInt([I)Landroid/animation/KeyframeSet; HSPLandroid/animation/KeyframeSet;->ofObject([Ljava/lang/Object;)Landroid/animation/KeyframeSet; @@ -351,20 +350,20 @@ HSPLandroid/animation/LayoutTransition;->setAnimator(ILandroid/animation/Animato HSPLandroid/animation/LayoutTransition;->setDuration(J)V HSPLandroid/animation/LayoutTransition;->setInterpolator(ILandroid/animation/TimeInterpolator;)V HSPLandroid/animation/LayoutTransition;->setStartDelay(IJ)V -HSPLandroid/animation/LayoutTransition;->setupChangeAnimation(Landroid/view/ViewGroup;ILandroid/animation/Animator;JLandroid/view/View;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/view/View;missing_types]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;]Landroid/animation/Animator;Landroid/animation/ObjectAnimator; +HSPLandroid/animation/LayoutTransition;->setupChangeAnimation(Landroid/view/ViewGroup;ILandroid/animation/Animator;JLandroid/view/View;)V HSPLandroid/animation/LayoutTransition;->showChild(Landroid/view/ViewGroup;Landroid/view/View;I)V HSPLandroid/animation/LayoutTransition;->startChangingAnimations()V HSPLandroid/animation/ObjectAnimator;->()V HSPLandroid/animation/ObjectAnimator;->(Ljava/lang/Object;Landroid/util/Property;)V HSPLandroid/animation/ObjectAnimator;->(Ljava/lang/Object;Ljava/lang/String;)V -HSPLandroid/animation/ObjectAnimator;->animateValue(F)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder; +HSPLandroid/animation/ObjectAnimator;->animateValue(F)V HSPLandroid/animation/ObjectAnimator;->clone()Landroid/animation/Animator; HSPLandroid/animation/ObjectAnimator;->clone()Landroid/animation/ObjectAnimator; -HSPLandroid/animation/ObjectAnimator;->getNameForTrace()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator; -HSPLandroid/animation/ObjectAnimator;->getPropertyName()Ljava/lang/String;+]Landroid/util/Property;missing_types +HSPLandroid/animation/ObjectAnimator;->getNameForTrace()Ljava/lang/String; +HSPLandroid/animation/ObjectAnimator;->getPropertyName()Ljava/lang/String; HSPLandroid/animation/ObjectAnimator;->getTarget()Ljava/lang/Object; HSPLandroid/animation/ObjectAnimator;->hasSameTargetAndProperties(Landroid/animation/Animator;)Z -HSPLandroid/animation/ObjectAnimator;->initAnimation()V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder; +HSPLandroid/animation/ObjectAnimator;->initAnimation()V HSPLandroid/animation/ObjectAnimator;->isInitialized()Z HSPLandroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Landroid/util/Property;[F)Landroid/animation/ObjectAnimator; HSPLandroid/animation/ObjectAnimator;->ofFloat(Ljava/lang/Object;Ljava/lang/String;[F)Landroid/animation/ObjectAnimator; @@ -377,12 +376,12 @@ HSPLandroid/animation/ObjectAnimator;->setAutoCancel(Z)V HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/Animator; HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/ObjectAnimator; HSPLandroid/animation/ObjectAnimator;->setDuration(J)Landroid/animation/ValueAnimator; -HSPLandroid/animation/ObjectAnimator;->setFloatValues([F)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator; +HSPLandroid/animation/ObjectAnimator;->setFloatValues([F)V HSPLandroid/animation/ObjectAnimator;->setIntValues([I)V HSPLandroid/animation/ObjectAnimator;->setObjectValues([Ljava/lang/Object;)V HSPLandroid/animation/ObjectAnimator;->setProperty(Landroid/util/Property;)V HSPLandroid/animation/ObjectAnimator;->setPropertyName(Ljava/lang/String;)V -HSPLandroid/animation/ObjectAnimator;->setTarget(Ljava/lang/Object;)V+]Landroid/animation/ObjectAnimator;Landroid/animation/ObjectAnimator; +HSPLandroid/animation/ObjectAnimator;->setTarget(Ljava/lang/Object;)V HSPLandroid/animation/ObjectAnimator;->setupEndValues()V HSPLandroid/animation/ObjectAnimator;->setupStartValues()V HSPLandroid/animation/ObjectAnimator;->shouldAutoCancel(Landroid/animation/AnimationHandler$AnimationFrameCallback;)Z @@ -399,28 +398,28 @@ HSPLandroid/animation/PathKeyframes;->interpolateInRange(FII)Landroid/graphics/P HSPLandroid/animation/PropertyValuesHolder$1;->getValueAtFraction(F)Ljava/lang/Object; HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->(Landroid/util/Property;[F)V HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->(Ljava/lang/String;[F)V -HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes$FloatKeyframes;Landroid/animation/FloatKeyframeSet; +HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->calculateValue(F)V HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object; -HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V+]Landroid/util/FloatProperty;Landroid/view/View$2;,Landroid/view/View$12;,Landroid/view/View$13;,Landroid/view/View$5; +HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setFloatValues([F)V HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setProperty(Landroid/util/Property;)V -HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Long;Ljava/lang/Long; +HSPLandroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->(Ljava/lang/String;[I)V -HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes$IntKeyframes;Landroid/animation/IntKeyframeSet; +HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->calculateValue(F)V HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object; HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setIntValues([I)V -HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Long;Ljava/lang/Long; +HSPLandroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;->setupSetter(Ljava/lang/Class;)V HSPLandroid/animation/PropertyValuesHolder$PropertyValues;->()V -HSPLandroid/animation/PropertyValuesHolder;->(Landroid/util/Property;)V+]Landroid/util/Property;missing_types +HSPLandroid/animation/PropertyValuesHolder;->(Landroid/util/Property;)V HSPLandroid/animation/PropertyValuesHolder;->(Ljava/lang/String;)V HSPLandroid/animation/PropertyValuesHolder;->(Ljava/lang/String;Landroid/animation/PropertyValuesHolder-IA;)V -HSPLandroid/animation/PropertyValuesHolder;->calculateValue(F)V+]Landroid/animation/Keyframes;Landroid/animation/KeyframeSet; -HSPLandroid/animation/PropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder;+]Landroid/animation/Keyframes;Landroid/animation/KeyframeSet;,Landroid/animation/IntKeyframeSet;,Landroid/animation/FloatKeyframeSet; +HSPLandroid/animation/PropertyValuesHolder;->calculateValue(F)V +HSPLandroid/animation/PropertyValuesHolder;->clone()Landroid/animation/PropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder;->convertBack(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/animation/PropertyValuesHolder;->getAnimatedValue()Ljava/lang/Object; HSPLandroid/animation/PropertyValuesHolder;->getMethodName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; @@ -434,7 +433,7 @@ HSPLandroid/animation/PropertyValuesHolder;->ofFloat(Ljava/lang/String;[F)Landro HSPLandroid/animation/PropertyValuesHolder;->ofInt(Ljava/lang/String;[I)Landroid/animation/PropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder;->ofKeyframes(Ljava/lang/String;Landroid/animation/Keyframes;)Landroid/animation/PropertyValuesHolder; HSPLandroid/animation/PropertyValuesHolder;->ofObject(Ljava/lang/String;Landroid/animation/TypeEvaluator;[Ljava/lang/Object;)Landroid/animation/PropertyValuesHolder; -HSPLandroid/animation/PropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V+]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder; +HSPLandroid/animation/PropertyValuesHolder;->setAnimatedValue(Ljava/lang/Object;)V HSPLandroid/animation/PropertyValuesHolder;->setEvaluator(Landroid/animation/TypeEvaluator;)V HSPLandroid/animation/PropertyValuesHolder;->setFloatValues([F)V HSPLandroid/animation/PropertyValuesHolder;->setIntValues([I)V @@ -443,10 +442,10 @@ HSPLandroid/animation/PropertyValuesHolder;->setProperty(Landroid/util/Property; HSPLandroid/animation/PropertyValuesHolder;->setPropertyName(Ljava/lang/String;)V HSPLandroid/animation/PropertyValuesHolder;->setupEndValue(Ljava/lang/Object;)V HSPLandroid/animation/PropertyValuesHolder;->setupGetter(Ljava/lang/Class;)V -HSPLandroid/animation/PropertyValuesHolder;->setupSetterAndGetter(Ljava/lang/Object;)V+]Ljava/lang/Object;missing_types]Landroid/animation/Keyframes;Landroid/animation/IntKeyframeSet;,Landroid/animation/FloatKeyframeSet;,Landroid/animation/KeyframeSet;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe;,Landroid/animation/Keyframe$FloatKeyframe;,Landroid/animation/Keyframe$ObjectKeyframe;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;]Landroid/util/Property;missing_types]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method; +HSPLandroid/animation/PropertyValuesHolder;->setupSetterAndGetter(Ljava/lang/Object;)V HSPLandroid/animation/PropertyValuesHolder;->setupSetterOrGetter(Ljava/lang/Class;Ljava/util/HashMap;Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/reflect/Method; HSPLandroid/animation/PropertyValuesHolder;->setupStartValue(Ljava/lang/Object;)V -HSPLandroid/animation/PropertyValuesHolder;->setupValue(Ljava/lang/Object;Landroid/animation/Keyframe;)V+]Ljava/lang/Object;missing_types]Ljava/lang/reflect/Method;Ljava/lang/reflect/Method;]Landroid/animation/Keyframe;Landroid/animation/Keyframe$IntKeyframe; +HSPLandroid/animation/PropertyValuesHolder;->setupValue(Ljava/lang/Object;Landroid/animation/Keyframe;)V HSPLandroid/animation/StateListAnimator$1;->(Landroid/animation/StateListAnimator;)V HSPLandroid/animation/StateListAnimator$1;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/animation/StateListAnimator$StateListAnimatorConstantState;->(Landroid/animation/StateListAnimator;)V @@ -472,18 +471,18 @@ HSPLandroid/animation/TimeAnimator;->setTimeListener(Landroid/animation/TimeAnim HSPLandroid/animation/ValueAnimator;->()V HSPLandroid/animation/ValueAnimator;->addAnimationCallback(J)V HSPLandroid/animation/ValueAnimator;->addUpdateListener(Landroid/animation/ValueAnimator$AnimatorUpdateListener;)V -HSPLandroid/animation/ValueAnimator;->animateBasedOnTime(J)Z+]Landroid/animation/ValueAnimator;Landroid/animation/ObjectAnimator;,Landroid/animation/ValueAnimator; -HSPLandroid/animation/ValueAnimator;->animateValue(F)V+]Landroid/animation/TimeInterpolator;missing_types]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;,Landroid/animation/ObjectAnimator; +HSPLandroid/animation/ValueAnimator;->animateBasedOnTime(J)Z +HSPLandroid/animation/ValueAnimator;->animateValue(F)V HSPLandroid/animation/ValueAnimator;->areAnimatorsEnabled()Z HSPLandroid/animation/ValueAnimator;->cancel()V HSPLandroid/animation/ValueAnimator;->clampFraction(F)F HSPLandroid/animation/ValueAnimator;->clone()Landroid/animation/Animator; -HSPLandroid/animation/ValueAnimator;->clone()Landroid/animation/ValueAnimator;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$IntPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder;,Landroid/animation/PropertyValuesHolder; -HSPLandroid/animation/ValueAnimator;->doAnimationFrame(J)Z+]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator;,Landroid/animation/ObjectAnimator; +HSPLandroid/animation/ValueAnimator;->clone()Landroid/animation/ValueAnimator; +HSPLandroid/animation/ValueAnimator;->doAnimationFrame(J)Z HSPLandroid/animation/ValueAnimator;->end()V HSPLandroid/animation/ValueAnimator;->endAnimation()V HSPLandroid/animation/ValueAnimator;->getAnimatedFraction()F -HSPLandroid/animation/ValueAnimator;->getAnimatedValue()Ljava/lang/Object;+]Landroid/animation/PropertyValuesHolder;Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder; +HSPLandroid/animation/ValueAnimator;->getAnimatedValue()Ljava/lang/Object; HSPLandroid/animation/ValueAnimator;->getAnimationHandler()Landroid/animation/AnimationHandler; HSPLandroid/animation/ValueAnimator;->getCurrentAnimationsCount()I HSPLandroid/animation/ValueAnimator;->getCurrentIteration(F)I @@ -640,7 +639,7 @@ HSPLandroid/app/Activity;->onTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroid/app/Activity;->onTrimMemory(I)V HSPLandroid/app/Activity;->onUserInteraction()V HSPLandroid/app/Activity;->onUserLeaveHint()V -HSPLandroid/app/Activity;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/WindowManager;Landroid/view/WindowManagerImpl; +HSPLandroid/app/Activity;->onWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HSPLandroid/app/Activity;->onWindowFocusChanged(Z)V HSPLandroid/app/Activity;->overridePendingTransition(II)V HSPLandroid/app/Activity;->overridePendingTransition(III)V @@ -701,8 +700,6 @@ HSPLandroid/app/ActivityClient;->reportSizeConfigurations(Landroid/os/IBinder;La HSPLandroid/app/ActivityClient;->setActivityClientController(Landroid/app/IActivityClientController;)Landroid/app/IActivityClientController; HSPLandroid/app/ActivityClient;->setRequestedOrientation(Landroid/os/IBinder;I)V HSPLandroid/app/ActivityClient;->setTaskDescription(Landroid/os/IBinder;Landroid/app/ActivityManager$TaskDescription;)V -HSPLandroid/app/ActivityManager$3;->create()Landroid/app/IActivityManager; -HSPLandroid/app/ActivityManager$3;->create()Ljava/lang/Object; HSPLandroid/app/ActivityManager$AppTask;->getTaskInfo()Landroid/app/ActivityManager$RecentTaskInfo; HSPLandroid/app/ActivityManager$MemoryInfo;->()V HSPLandroid/app/ActivityManager$MemoryInfo;->readFromParcel(Landroid/os/Parcel;)V @@ -717,7 +714,6 @@ HSPLandroid/app/ActivityManager$RunningAppProcessInfo$1;->createFromParcel(Landr HSPLandroid/app/ActivityManager$RunningAppProcessInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->()V HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->(Landroid/os/Parcel;)V -HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->(Landroid/os/Parcel;Landroid/app/ActivityManager$RunningAppProcessInfo-IA;)V HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->importanceToProcState(I)I HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->procStateToImportance(I)I HSPLandroid/app/ActivityManager$RunningAppProcessInfo;->procStateToImportanceForClient(ILandroid/content/Context;)I @@ -827,7 +823,6 @@ HSPLandroid/app/ActivityThread$AppBindData;->()V HSPLandroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;->()V HSPLandroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/app/ActivityThread$ApplicationThread;->(Landroid/app/ActivityThread;)V -HSPLandroid/app/ActivityThread$ApplicationThread;->(Landroid/app/ActivityThread;Landroid/app/ActivityThread$ApplicationThread-IA;)V HSPLandroid/app/ActivityThread$ApplicationThread;->clearDnsCache()V HSPLandroid/app/ActivityThread$ApplicationThread;->dispatchPackageBroadcast(I[Ljava/lang/String;)V HSPLandroid/app/ActivityThread$ApplicationThread;->dumpCacheInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V @@ -869,9 +864,8 @@ HSPLandroid/app/ActivityThread$DumpResourcesData;->()V HSPLandroid/app/ActivityThread$GcIdler;->(Landroid/app/ActivityThread;)V HSPLandroid/app/ActivityThread$GcIdler;->queueIdle()Z HSPLandroid/app/ActivityThread$H;->(Landroid/app/ActivityThread;)V -HSPLandroid/app/ActivityThread$H;->handleMessage(Landroid/os/Message;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor; +HSPLandroid/app/ActivityThread$H;->handleMessage(Landroid/os/Message;)V HSPLandroid/app/ActivityThread$Idler;->(Landroid/app/ActivityThread;)V -HSPLandroid/app/ActivityThread$Idler;->(Landroid/app/ActivityThread;Landroid/app/ActivityThread$Idler-IA;)V HSPLandroid/app/ActivityThread$Idler;->queueIdle()Z HSPLandroid/app/ActivityThread$Profiler;->()V HSPLandroid/app/ActivityThread$ProviderKey;->(Ljava/lang/String;I)V @@ -936,7 +930,7 @@ HSPLandroid/app/ActivityThread;->getFloatCoreSetting(Ljava/lang/String;F)F HSPLandroid/app/ActivityThread;->getGetProviderKey(Ljava/lang/String;I)Landroid/app/ActivityThread$ProviderKey; HSPLandroid/app/ActivityThread;->getHandler()Landroid/os/Handler; HSPLandroid/app/ActivityThread;->getInstrumentation()Landroid/app/Instrumentation; -HSPLandroid/app/ActivityThread;->getIntCoreSetting(Ljava/lang/String;I)I+]Landroid/os/Bundle;Landroid/os/Bundle; +HSPLandroid/app/ActivityThread;->getIntCoreSetting(Ljava/lang/String;I)I HSPLandroid/app/ActivityThread;->getIntentBeingBroadcast()Landroid/content/Intent; HSPLandroid/app/ActivityThread;->getLooper()Landroid/os/Looper; HSPLandroid/app/ActivityThread;->getOperationTypeFromBackupMode(I)I @@ -958,7 +952,7 @@ HSPLandroid/app/ActivityThread;->handleBindApplication(Landroid/app/ActivityThre HSPLandroid/app/ActivityThread;->handleBindService(Landroid/app/ActivityThread$BindServiceData;)V HSPLandroid/app/ActivityThread;->handleConfigurationChanged(Landroid/content/res/Configuration;I)V HSPLandroid/app/ActivityThread;->handleCreateBackupAgent(Landroid/app/ActivityThread$CreateBackupAgentData;)V -HSPLandroid/app/ActivityThread;->handleCreateService(Landroid/app/ActivityThread$CreateServiceData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Ljava/util/List;Ljava/util/Collections$EmptyList;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/IActivityManager;Landroid/app/IActivityManager$Stub$Proxy; +HSPLandroid/app/ActivityThread;->handleCreateService(Landroid/app/ActivityThread$CreateServiceData;)V HSPLandroid/app/ActivityThread;->handleDestroyBackupAgent(Landroid/app/ActivityThread$CreateBackupAgentData;)V HSPLandroid/app/ActivityThread;->handleDispatchPackageBroadcast(I[Ljava/lang/String;)V HSPLandroid/app/ActivityThread;->handleDumpGfxInfo(Landroid/app/ActivityThread$DumpComponentInfo;)V @@ -998,7 +992,6 @@ HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/Activi HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/ComponentInfo;Ljava/lang/String;)Z HSPLandroid/app/ActivityThread;->isProtectedComponent(Landroid/content/pm/ServiceInfo;)Z HSPLandroid/app/ActivityThread;->isSystem()Z -HSPLandroid/app/ActivityThread;->lambda$getGetProviderKey$3(Landroid/app/ActivityThread$ProviderKey;)Landroid/app/ActivityThread$ProviderKey; HSPLandroid/app/ActivityThread;->main([Ljava/lang/String;)V HSPLandroid/app/ActivityThread;->onCoreSettingsChange()V HSPLandroid/app/ActivityThread;->peekPackageInfo(Ljava/lang/String;Z)Landroid/app/LoadedApk; @@ -1073,7 +1066,7 @@ HSPLandroid/app/AppComponentFactory;->instantiateProvider(Ljava/lang/ClassLoader HSPLandroid/app/AppComponentFactory;->instantiateReceiver(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/content/BroadcastReceiver; HSPLandroid/app/AppComponentFactory;->instantiateService(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Intent;)Landroid/app/Service; HSPLandroid/app/AppGlobals;->getInitialApplication()Landroid/app/Application; -HSPLandroid/app/AppGlobals;->getIntCoreSetting(Ljava/lang/String;I)I+]Landroid/app/ActivityThread;Landroid/app/ActivityThread; +HSPLandroid/app/AppGlobals;->getIntCoreSetting(Ljava/lang/String;I)I HSPLandroid/app/AppGlobals;->getPackageManager()Landroid/content/pm/IPackageManager; HSPLandroid/app/AppOpsManager$1;->onNoted(Landroid/app/SyncNotedAppOp;)V HSPLandroid/app/AppOpsManager$1;->onSelfNoted(Landroid/app/SyncNotedAppOp;)V @@ -1128,7 +1121,7 @@ HSPLandroid/app/AppOpsManager;->opToDefaultMode(I)I HSPLandroid/app/AppOpsManager;->opToPermission(I)Ljava/lang/String; HSPLandroid/app/AppOpsManager;->opToPublicName(I)Ljava/lang/String; HSPLandroid/app/AppOpsManager;->opToSwitch(I)I -HSPLandroid/app/AppOpsManager;->pauseNotedAppOpsCollection()Landroid/app/AppOpsManager$PausedNotedAppOpsCollection;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal; +HSPLandroid/app/AppOpsManager;->pauseNotedAppOpsCollection()Landroid/app/AppOpsManager$PausedNotedAppOpsCollection; HSPLandroid/app/AppOpsManager;->permissionToOp(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/app/AppOpsManager;->permissionToOpCode(Ljava/lang/String;)I HSPLandroid/app/AppOpsManager;->prefixParcelWithAppOpsIfNeeded(Landroid/os/Parcel;)V @@ -1212,7 +1205,6 @@ HSPLandroid/app/ApplicationExitInfo;->getRss()J HSPLandroid/app/ApplicationExitInfo;->getStatus()I HSPLandroid/app/ApplicationExitInfo;->getTimestamp()J HSPLandroid/app/ApplicationLoaders$CachedClassLoader;->()V -HSPLandroid/app/ApplicationLoaders$CachedClassLoader;->(Landroid/app/ApplicationLoaders$CachedClassLoader-IA;)V HSPLandroid/app/ApplicationLoaders;->addNative(Ljava/lang/ClassLoader;Ljava/util/Collection;)V HSPLandroid/app/ApplicationLoaders;->createAndCacheNonBootclasspathSystemClassLoader(Landroid/content/pm/SharedLibraryInfo;)V HSPLandroid/app/ApplicationLoaders;->createAndCacheNonBootclasspathSystemClassLoaders(Ljava/util/List;)V @@ -1237,6 +1229,7 @@ HSPLandroid/app/ApplicationPackageManager$HasSystemFeatureQuery;->hashCode()I HSPLandroid/app/ApplicationPackageManager$ResourceName;->(Ljava/lang/String;I)V HSPLandroid/app/ApplicationPackageManager$ResourceName;->equals(Ljava/lang/Object;)Z HSPLandroid/app/ApplicationPackageManager$ResourceName;->hashCode()I +HSPLandroid/app/ApplicationPackageManager;->(Landroid/app/ContextImpl;Landroid/content/pm/IPackageManager;)V HSPLandroid/app/ApplicationPackageManager;->addOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V HSPLandroid/app/ApplicationPackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/app/ApplicationPackageManager;->checkSignatures(II)I @@ -1266,7 +1259,7 @@ HSPLandroid/app/ApplicationPackageManager;->getInstalledPackages(Landroid/conten HSPLandroid/app/ApplicationPackageManager;->getInstalledPackagesAsUser(II)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->getInstalledPackagesAsUser(Landroid/content/pm/PackageManager$PackageInfoFlags;I)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/app/ApplicationPackageManager;->getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/ApplicationPackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/Intent;Landroid/content/Intent; +HSPLandroid/app/ApplicationPackageManager;->getLaunchIntentForPackage(Ljava/lang/String;)Landroid/content/Intent; HSPLandroid/app/ApplicationPackageManager;->getModuleInfo(Ljava/lang/String;I)Landroid/content/pm/ModuleInfo; HSPLandroid/app/ApplicationPackageManager;->getNameForUid(I)Ljava/lang/String; HSPLandroid/app/ApplicationPackageManager;->getPackageInfo(Ljava/lang/String;I)Landroid/content/pm/PackageInfo; @@ -1290,7 +1283,7 @@ HSPLandroid/app/ApplicationPackageManager;->getProviderInfo(Landroid/content/Com HSPLandroid/app/ApplicationPackageManager;->getReceiverInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ActivityInfo; HSPLandroid/app/ApplicationPackageManager;->getReceiverInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ActivityInfo; HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/Resources; -HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;Landroid/content/res/Configuration;)Landroid/content/res/Resources;+]Landroid/app/ActivityThread;Landroid/app/ActivityThread;]Ljava/lang/Object;Ljava/lang/String; +HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Landroid/content/pm/ApplicationInfo;Landroid/content/res/Configuration;)Landroid/content/res/Resources; HSPLandroid/app/ApplicationPackageManager;->getResourcesForApplication(Ljava/lang/String;)Landroid/content/res/Resources; HSPLandroid/app/ApplicationPackageManager;->getServiceInfo(Landroid/content/ComponentName;I)Landroid/content/pm/ServiceInfo; HSPLandroid/app/ApplicationPackageManager;->getServiceInfo(Landroid/content/ComponentName;Landroid/content/pm/PackageManager$ComponentInfoFlags;)Landroid/content/pm/ServiceInfo; @@ -1300,7 +1293,7 @@ HSPLandroid/app/ApplicationPackageManager;->getSystemSharedLibraryNames()[Ljava/ HSPLandroid/app/ApplicationPackageManager;->getText(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Ljava/lang/CharSequence; HSPLandroid/app/ApplicationPackageManager;->getUserBadgeColor(Landroid/os/UserHandle;Z)I HSPLandroid/app/ApplicationPackageManager;->getUserBadgedIcon(Landroid/graphics/drawable/Drawable;Landroid/os/UserHandle;)Landroid/graphics/drawable/Drawable; -HSPLandroid/app/ApplicationPackageManager;->getUserId()I+]Landroid/app/ContextImpl;Landroid/app/ContextImpl; +HSPLandroid/app/ApplicationPackageManager;->getUserId()I HSPLandroid/app/ApplicationPackageManager;->getUserManager()Landroid/os/UserManager; HSPLandroid/app/ApplicationPackageManager;->getXml(Ljava/lang/String;ILandroid/content/pm/ApplicationInfo;)Landroid/content/res/XmlResourceParser; HSPLandroid/app/ApplicationPackageManager;->handlePackageBroadcast(I[Ljava/lang/String;Z)V @@ -1325,7 +1318,7 @@ HSPLandroid/app/ApplicationPackageManager;->queryBroadcastReceiversAsUser(Landro HSPLandroid/app/ApplicationPackageManager;->queryIntentActivities(Landroid/content/Intent;I)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->queryIntentActivities(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;II)Ljava/util/List; -HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List;+]Landroid/content/pm/IPackageManager;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager$ResolveInfoFlags;Landroid/content/pm/PackageManager$ResolveInfoFlags;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/content/Intent;Landroid/content/Intent; +HSPLandroid/app/ApplicationPackageManager;->queryIntentActivitiesAsUser(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;I)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProviders(Landroid/content/Intent;I)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProviders(Landroid/content/Intent;Landroid/content/pm/PackageManager$ResolveInfoFlags;)Ljava/util/List; HSPLandroid/app/ApplicationPackageManager;->queryIntentContentProvidersAsUser(Landroid/content/Intent;II)Ljava/util/List; @@ -1413,7 +1406,7 @@ HSPLandroid/app/ContextImpl$ApplicationContentResolver;->releaseProvider(Landroi HSPLandroid/app/ContextImpl$ApplicationContentResolver;->releaseUnstableProvider(Landroid/content/IContentProvider;)Z HSPLandroid/app/ContextImpl$ApplicationContentResolver;->resolveUserIdFromAuthority(Ljava/lang/String;)I HSPLandroid/app/ContextImpl$ApplicationContentResolver;->unstableProviderDied(Landroid/content/IContentProvider;)V -HSPLandroid/app/ContextImpl;->(Landroid/app/ContextImpl;Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/ContextParams;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;Landroid/os/IBinder;Landroid/os/UserHandle;ILjava/lang/ClassLoader;Ljava/lang/String;IZ)V+]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/ContextParams;Landroid/content/ContextParams; +HSPLandroid/app/ContextImpl;->(Landroid/app/ContextImpl;Landroid/app/ActivityThread;Landroid/app/LoadedApk;Landroid/content/ContextParams;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;Landroid/os/IBinder;Landroid/os/UserHandle;ILjava/lang/ClassLoader;Ljava/lang/String;IZ)V HSPLandroid/app/ContextImpl;->bindIsolatedService(Landroid/content/Intent;ILjava/lang/String;Ljava/util/concurrent/Executor;Landroid/content/ServiceConnection;)Z HSPLandroid/app/ContextImpl;->bindService(Landroid/content/Intent;Landroid/content/ServiceConnection;I)Z HSPLandroid/app/ContextImpl;->bindServiceAsUser(Landroid/content/Intent;Landroid/content/ServiceConnection;ILandroid/os/Handler;Landroid/os/UserHandle;)Z @@ -1433,7 +1426,7 @@ HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landr HSPLandroid/app/ContextImpl;->createAppContext(Landroid/app/ActivityThread;Landroid/app/LoadedApk;Ljava/lang/String;)Landroid/app/ContextImpl; HSPLandroid/app/ContextImpl;->createApplicationContext(Landroid/content/pm/ApplicationInfo;I)Landroid/content/Context; HSPLandroid/app/ContextImpl;->createAttributionContext(Ljava/lang/String;)Landroid/content/Context; -HSPLandroid/app/ContextImpl;->createAttributionSource(Ljava/lang/String;Landroid/content/AttributionSource;Ljava/util/Set;ZI)Landroid/content/AttributionSource;+]Ljava/util/Set;missing_types]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/app/ContextImpl;Landroid/app/ContextImpl; +HSPLandroid/app/ContextImpl;->createAttributionSource(Ljava/lang/String;Landroid/content/AttributionSource;Ljava/util/Set;ZI)Landroid/content/AttributionSource; HSPLandroid/app/ContextImpl;->createConfigurationContext(Landroid/content/res/Configuration;)Landroid/content/Context; HSPLandroid/app/ContextImpl;->createContext(Landroid/content/ContextParams;)Landroid/content/Context; HSPLandroid/app/ContextImpl;->createContextAsUser(Landroid/os/UserHandle;I)Landroid/content/Context; @@ -1468,7 +1461,7 @@ HSPLandroid/app/ContextImpl;->fileList()[Ljava/lang/String; HSPLandroid/app/ContextImpl;->finalize()V HSPLandroid/app/ContextImpl;->getActivityToken()Landroid/os/IBinder; HSPLandroid/app/ContextImpl;->getApplicationContext()Landroid/content/Context; -HSPLandroid/app/ContextImpl;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;+]Landroid/app/LoadedApk;Landroid/app/LoadedApk; +HSPLandroid/app/ContextImpl;->getApplicationInfo()Landroid/content/pm/ApplicationInfo; HSPLandroid/app/ContextImpl;->getAssets()Landroid/content/res/AssetManager; HSPLandroid/app/ContextImpl;->getAssociatedDisplayId()I HSPLandroid/app/ContextImpl;->getAttributionSource()Landroid/content/AttributionSource; @@ -1512,11 +1505,11 @@ HSPLandroid/app/ContextImpl;->getPackageResourcePath()Ljava/lang/String; HSPLandroid/app/ContextImpl;->getPreferencesDir()Ljava/io/File; HSPLandroid/app/ContextImpl;->getReceiverRestrictedContext()Landroid/content/Context; HSPLandroid/app/ContextImpl;->getResources()Landroid/content/res/Resources; -HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/ContextImpl;Landroid/app/ContextImpl; -HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/LoadedApk;Landroid/app/LoadedApk;]Landroid/app/ContextImpl;Landroid/app/ContextImpl; -HSPLandroid/app/ContextImpl;->getSharedPreferencesCacheLocked()Landroid/util/ArrayMap;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/ContextImpl;Landroid/app/ContextImpl; +HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/io/File;I)Landroid/content/SharedPreferences; +HSPLandroid/app/ContextImpl;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; +HSPLandroid/app/ContextImpl;->getSharedPreferencesCacheLocked()Landroid/util/ArrayMap; HSPLandroid/app/ContextImpl;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File; -HSPLandroid/app/ContextImpl;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/app/ContextImpl;Landroid/app/ContextImpl; +HSPLandroid/app/ContextImpl;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HSPLandroid/app/ContextImpl;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String; HSPLandroid/app/ContextImpl;->getTheme()Landroid/content/res/Resources$Theme; HSPLandroid/app/ContextImpl;->getThemeResId()I @@ -1539,6 +1532,7 @@ HSPLandroid/app/ContextImpl;->openFileOutput(Ljava/lang/String;I)Ljava/io/FileOu HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;)Landroid/database/sqlite/SQLiteDatabase; HSPLandroid/app/ContextImpl;->openOrCreateDatabase(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;)Landroid/database/sqlite/SQLiteDatabase; HSPLandroid/app/ContextImpl;->performFinalCleanup(Ljava/lang/String;Ljava/lang/String;)V +HSPLandroid/app/ContextImpl;->registerAttributionSourceIfNeeded(Landroid/content/AttributionSource;Z)Landroid/content/AttributionSource; HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;)Landroid/content/Intent; HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;I)Landroid/content/Intent; HSPLandroid/app/ContextImpl;->registerReceiver(Landroid/content/BroadcastReceiver;Landroid/content/IntentFilter;Ljava/lang/String;Landroid/os/Handler;)Landroid/content/Intent; @@ -1817,7 +1811,6 @@ HSPLandroid/app/FragmentTransaction;->()V HSPLandroid/app/FragmentTransition;->addToFirstInLastOut(Landroid/app/BackStackRecord;Landroid/app/BackStackRecord$Op;Landroid/util/SparseArray;ZZ)V HSPLandroid/app/FragmentTransition;->calculateFragments(Landroid/app/BackStackRecord;Landroid/util/SparseArray;Z)V HSPLandroid/app/FragmentTransition;->startTransitions(Landroid/app/FragmentManagerImpl;Ljava/util/ArrayList;Ljava/util/ArrayList;IIZ)V -HSPLandroid/app/GameManager;->(Landroid/content/Context;Landroid/os/Handler;)V HSPLandroid/app/GameManager;->isAngleEnabled(Ljava/lang/String;)Z HSPLandroid/app/IActivityClientController$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/app/IActivityClientController$Stub$Proxy;->activityDestroyed(Landroid/os/IBinder;)V @@ -1846,9 +1839,8 @@ HSPLandroid/app/IActivityManager$Stub$Proxy;->bindServiceInstance(Landroid/app/I HSPLandroid/app/IActivityManager$Stub$Proxy;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I HSPLandroid/app/IActivityManager$Stub$Proxy;->cancelIntentSender(Landroid/content/IIntentSender;)V HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermission(Ljava/lang/String;II)I -HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermissionForDevice(Ljava/lang/String;III)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/app/IActivityManager$Stub$Proxy;Landroid/app/IActivityManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/IActivityManager$Stub$Proxy;->checkPermissionForDevice(Ljava/lang/String;III)I HSPLandroid/app/IActivityManager$Stub$Proxy;->checkUriPermission(Landroid/net/Uri;IIIILandroid/os/IBinder;)I -HSPLandroid/app/IActivityManager$Stub$Proxy;->finishAttachApplication(J)V HSPLandroid/app/IActivityManager$Stub$Proxy;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V HSPLandroid/app/IActivityManager$Stub$Proxy;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder; HSPLandroid/app/IActivityManager$Stub$Proxy;->getCurrentUser()Landroid/content/pm/UserInfo; @@ -1875,7 +1867,7 @@ HSPLandroid/app/IActivityManager$Stub$Proxy;->registerStrictModeCallback(Landroi HSPLandroid/app/IActivityManager$Stub$Proxy;->registerUidObserver(Landroid/app/IUidObserver;IILjava/lang/String;)V HSPLandroid/app/IActivityManager$Stub$Proxy;->removeContentProvider(Landroid/os/IBinder;Z)V HSPLandroid/app/IActivityManager$Stub$Proxy;->revokeUriPermission(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/net/Uri;II)V -HSPLandroid/app/IActivityManager$Stub$Proxy;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/app/IActivityManager$Stub$Proxy;Landroid/app/IActivityManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/IActivityManager$Stub$Proxy;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V HSPLandroid/app/IActivityManager$Stub$Proxy;->setRenderThread(I)V HSPLandroid/app/IActivityManager$Stub$Proxy;->setServiceForeground(Landroid/content/ComponentName;Landroid/os/IBinder;ILandroid/app/Notification;II)V HSPLandroid/app/IActivityManager$Stub$Proxy;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;I)Landroid/content/ComponentName; @@ -2046,7 +2038,6 @@ HSPLandroid/app/LoadedApk$ReceiverDispatcher;->getIIntentReceiver()Landroid/cont HSPLandroid/app/LoadedApk$ReceiverDispatcher;->performReceive(Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIILjava/lang/String;)V HSPLandroid/app/LoadedApk$ReceiverDispatcher;->validate(Landroid/content/Context;Landroid/os/Handler;)V HSPLandroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;->()V -HSPLandroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo;->(Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA;)V HSPLandroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;->(Landroid/app/LoadedApk$ServiceDispatcher;Landroid/content/ComponentName;Landroid/os/IBinder;)V HSPLandroid/app/LoadedApk$ServiceDispatcher$DeathMonitor;->binderDied()V HSPLandroid/app/LoadedApk$ServiceDispatcher$InnerConnection;->(Landroid/app/LoadedApk$ServiceDispatcher;)V @@ -2070,7 +2061,6 @@ HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->getClassLoaderForSplit(Lja HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->getSplitPathsForSplit(Ljava/lang/String;)[Ljava/lang/String; HSPLandroid/app/LoadedApk$SplitDependencyLoaderImpl;->isSplitCached(I)Z HSPLandroid/app/LoadedApk$WarningContextClassLoader;->()V -HSPLandroid/app/LoadedApk$WarningContextClassLoader;->(Landroid/app/LoadedApk$WarningContextClassLoader-IA;)V HSPLandroid/app/LoadedApk;->-$$Nest$fgetmClassLoader(Landroid/app/LoadedApk;)Ljava/lang/ClassLoader; HSPLandroid/app/LoadedApk;->-$$Nest$fgetmLock(Landroid/app/LoadedApk;)Ljava/lang/Object; HSPLandroid/app/LoadedApk;->-$$Nest$fgetmSplitNames(Landroid/app/LoadedApk;)[Ljava/lang/String; @@ -2266,7 +2256,7 @@ HSPLandroid/app/Notification$Style;->restoreFromExtras(Landroid/os/Bundle;)V HSPLandroid/app/Notification$Style;->setBuilder(Landroid/app/Notification$Builder;)V HSPLandroid/app/Notification$Style;->validate(Landroid/content/Context;)V HSPLandroid/app/Notification;->()V -HSPLandroid/app/Notification;->(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/Notification;->(Landroid/os/Parcel;)V HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/Context;Landroid/app/Notification;)V HSPLandroid/app/Notification;->addFieldsFromContext(Landroid/content/pm/ApplicationInfo;Landroid/app/Notification;)V HSPLandroid/app/Notification;->areStyledNotificationsVisiblyDifferent(Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;)Z @@ -2291,7 +2281,7 @@ HSPLandroid/app/Notification;->isForegroundService()Z HSPLandroid/app/Notification;->isGroupChild()Z HSPLandroid/app/Notification;->isGroupSummary()Z HSPLandroid/app/Notification;->isMediaNotification()Z -HSPLandroid/app/Notification;->readFromParcelImpl(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/graphics/drawable/Icon$1;,Landroid/app/PendingIntent$1;,Landroid/media/AudioAttributes$1;]Landroid/graphics/drawable/Icon;Landroid/graphics/drawable/Icon;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/Notification;->readFromParcelImpl(Landroid/os/Parcel;)V HSPLandroid/app/Notification;->reduceImageSizes(Landroid/content/Context;)V HSPLandroid/app/Notification;->reduceImageSizesForRemoteView(Landroid/widget/RemoteViews;Landroid/content/Context;Z)V HSPLandroid/app/Notification;->removeTextSizeSpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; @@ -2301,10 +2291,10 @@ HSPLandroid/app/Notification;->suppressAlertingDueToGrouping()Z HSPLandroid/app/Notification;->toString()Ljava/lang/String; HSPLandroid/app/Notification;->visibilityToString(I)Ljava/lang/String; HSPLandroid/app/Notification;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/app/Notification;->writeToParcelImpl(Landroid/os/Parcel;I)V+]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/media/AudioAttributes;Landroid/media/AudioAttributes;]Landroid/graphics/drawable/Icon;Landroid/graphics/drawable/Icon;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/Notification;->writeToParcelImpl(Landroid/os/Parcel;I)V HSPLandroid/app/NotificationChannel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/NotificationChannel; -HSPLandroid/app/NotificationChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/app/NotificationChannel$1;Landroid/app/NotificationChannel$1; -HSPLandroid/app/NotificationChannel;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/net/Uri$1;,Landroid/media/AudioAttributes$1;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/net/Uri;Landroid/net/Uri$StringUri; +HSPLandroid/app/NotificationChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; +HSPLandroid/app/NotificationChannel;->(Landroid/os/Parcel;)V HSPLandroid/app/NotificationChannel;->(Ljava/lang/String;Ljava/lang/CharSequence;I)V HSPLandroid/app/NotificationChannel;->canBubble()Z HSPLandroid/app/NotificationChannel;->canBypassDnd()Z @@ -2323,7 +2313,7 @@ HSPLandroid/app/NotificationChannel;->getLockscreenVisibility()I HSPLandroid/app/NotificationChannel;->getName()Ljava/lang/CharSequence; HSPLandroid/app/NotificationChannel;->getOriginalImportance()I HSPLandroid/app/NotificationChannel;->getSound()Landroid/net/Uri; -HSPLandroid/app/NotificationChannel;->getTrimmedString(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/app/NotificationChannel;->getTrimmedString(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/app/NotificationChannel;->getUserLockedFields()I HSPLandroid/app/NotificationChannel;->getVibrationPattern()[J HSPLandroid/app/NotificationChannel;->hasUserSetImportance()Z @@ -2389,7 +2379,6 @@ HSPLandroid/app/NotificationManager;->notify(ILandroid/app/Notification;)V HSPLandroid/app/NotificationManager;->notify(Ljava/lang/String;ILandroid/app/Notification;)V HSPLandroid/app/NotificationManager;->notifyAsUser(Ljava/lang/String;ILandroid/app/Notification;Landroid/os/UserHandle;)V HSPLandroid/app/NotificationManager;->zenModeToInterruptionFilter(I)I -HSPLandroid/app/PendingIntent$$ExternalSyntheticLambda3;->get()Ljava/lang/Object; HSPLandroid/app/PendingIntent$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/PendingIntent; HSPLandroid/app/PendingIntent$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/PendingIntent$FinishedDispatcher;->(Landroid/app/PendingIntent;Landroid/app/PendingIntent$OnFinished;Landroid/os/Handler;)V @@ -2459,7 +2448,7 @@ HSPLandroid/app/PropertyInvalidatedCache;->-$$Nest$fputmHighWaterMark(Landroid/a HSPLandroid/app/PropertyInvalidatedCache;->(ILjava/lang/String;)V HSPLandroid/app/PropertyInvalidatedCache;->(ILjava/lang/String;Ljava/lang/String;)V HSPLandroid/app/PropertyInvalidatedCache;->(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/app/PropertyInvalidatedCache$QueryHandler;)V -HSPLandroid/app/PropertyInvalidatedCache;->bypass(Ljava/lang/Object;)Z+]Landroid/app/PropertyInvalidatedCache$QueryHandler;Landroid/app/PropertyInvalidatedCache$DefaultComputer; +HSPLandroid/app/PropertyInvalidatedCache;->bypass(Ljava/lang/Object;)Z HSPLandroid/app/PropertyInvalidatedCache;->cacheName()Ljava/lang/String; HSPLandroid/app/PropertyInvalidatedCache;->clear()V HSPLandroid/app/PropertyInvalidatedCache;->createMap()Ljava/util/LinkedHashMap; @@ -2467,14 +2456,12 @@ HSPLandroid/app/PropertyInvalidatedCache;->createPropertyName(Ljava/lang/String; HSPLandroid/app/PropertyInvalidatedCache;->disableLocal()V HSPLandroid/app/PropertyInvalidatedCache;->dumpCacheInfo(Landroid/os/ParcelFileDescriptor;[Ljava/lang/String;)V HSPLandroid/app/PropertyInvalidatedCache;->getActiveCaches()Ljava/util/ArrayList; -HSPLandroid/app/PropertyInvalidatedCache;->getActiveCorks()Ljava/util/ArrayList; -HSPLandroid/app/PropertyInvalidatedCache;->getCurrentNonce()J+]Landroid/os/SystemProperties$Handle;Landroid/os/SystemProperties$Handle; +HSPLandroid/app/PropertyInvalidatedCache;->getCurrentNonce()J HSPLandroid/app/PropertyInvalidatedCache;->invalidateCache(Ljava/lang/String;)V -HSPLandroid/app/PropertyInvalidatedCache;->invalidateCacheLocked(Ljava/lang/String;)V HSPLandroid/app/PropertyInvalidatedCache;->isDisabled()Z HSPLandroid/app/PropertyInvalidatedCache;->isReservedNonce(J)Z HSPLandroid/app/PropertyInvalidatedCache;->maybeCheckConsistency(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/app/PropertyInvalidatedCache;->query(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Landroid/app/PropertyInvalidatedCache$1;]Landroid/app/PropertyInvalidatedCache;megamorphic_types +HSPLandroid/app/PropertyInvalidatedCache;->query(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/app/PropertyInvalidatedCache;->recompute(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/app/PropertyInvalidatedCache;->refresh(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/app/PropertyInvalidatedCache;->registerCache()V @@ -2483,7 +2470,7 @@ HSPLandroid/app/QueuedWork$QueuedWorkHandler;->handleMessage(Landroid/os/Message HSPLandroid/app/QueuedWork;->-$$Nest$smprocessPendingWork()V HSPLandroid/app/QueuedWork;->addFinisher(Ljava/lang/Runnable;)V HSPLandroid/app/QueuedWork;->getHandler()Landroid/os/Handler; -HSPLandroid/app/QueuedWork;->handlerRemoveMessages(I)V+]Landroid/os/Handler;Landroid/app/QueuedWork$QueuedWorkHandler; +HSPLandroid/app/QueuedWork;->handlerRemoveMessages(I)V HSPLandroid/app/QueuedWork;->hasPendingWork()Z HSPLandroid/app/QueuedWork;->processPendingWork()V HSPLandroid/app/QueuedWork;->queue(Ljava/lang/Runnable;Z)V @@ -2512,17 +2499,15 @@ HSPLandroid/app/RemoteInput;->getChoices()[Ljava/lang/CharSequence; HSPLandroid/app/RemoteInput;->getEditChoicesBeforeSending()I HSPLandroid/app/RemoteInput;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/app/ResourcesManager$ActivityResource;->()V -HSPLandroid/app/ResourcesManager$ActivityResource;->(Landroid/app/ResourcesManager$ActivityResource-IA;)V HSPLandroid/app/ResourcesManager$ActivityResources;->()V -HSPLandroid/app/ResourcesManager$ActivityResources;->(Landroid/app/ResourcesManager$ActivityResources-IA;)V HSPLandroid/app/ResourcesManager$ApkAssetsSupplier;->(Landroid/app/ResourcesManager;)V HSPLandroid/app/ResourcesManager$ApkAssetsSupplier;->load(Landroid/app/ResourcesManager$ApkKey;)Landroid/content/res/ApkAssets; HSPLandroid/app/ResourcesManager$ApkKey;->(Ljava/lang/String;ZZ)V -HSPLandroid/app/ResourcesManager$ApkKey;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/String; -HSPLandroid/app/ResourcesManager$ApkKey;->hashCode()I+]Ljava/lang/Object;Ljava/lang/String; +HSPLandroid/app/ResourcesManager$ApkKey;->equals(Ljava/lang/Object;)Z +HSPLandroid/app/ResourcesManager$ApkKey;->hashCode()I +HSPLandroid/app/ResourcesManager$PathCollector;->(Landroid/content/res/ResourcesKey;)V +HSPLandroid/app/ResourcesManager$PathCollector;->collectedKey()Landroid/content/res/ResourcesKey;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLandroid/app/ResourcesManager$UpdateHandler;->(Landroid/app/ResourcesManager;)V -HSPLandroid/app/ResourcesManager$UpdateHandler;->(Landroid/app/ResourcesManager;Landroid/app/ResourcesManager$UpdateHandler-IA;)V -HSPLandroid/app/ResourcesManager;->-$$Nest$mloadApkAssets(Landroid/app/ResourcesManager;Landroid/app/ResourcesManager$ApkKey;)Landroid/content/res/ApkAssets; HSPLandroid/app/ResourcesManager;->()V HSPLandroid/app/ResourcesManager;->addApplicationPathsLocked(Ljava/lang/String;[Ljava/lang/String;)V HSPLandroid/app/ResourcesManager;->appendLibAssetsForMainAssetPath(Ljava/lang/String;[Ljava/lang/String;)V @@ -2543,8 +2528,8 @@ HSPLandroid/app/ResourcesManager;->createResources(Landroid/content/res/Resource HSPLandroid/app/ResourcesManager;->createResourcesForActivity(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Landroid/content/res/Configuration;Ljava/lang/Integer;Ljava/lang/ClassLoader;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/Resources; HSPLandroid/app/ResourcesManager;->createResourcesForActivityLocked(Landroid/os/IBinder;Landroid/content/res/Configuration;Ljava/lang/Integer;Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources; HSPLandroid/app/ResourcesManager;->createResourcesImpl(Landroid/content/res/ResourcesKey;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/ResourcesImpl; -HSPLandroid/app/ResourcesManager;->createResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources;+]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/app/ResourcesManager;->extractApkKeys(Landroid/content/res/ResourcesKey;)Ljava/util/ArrayList;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/app/ResourcesManager;->createResourcesLocked(Ljava/lang/ClassLoader;Landroid/content/res/ResourcesImpl;Landroid/content/res/CompatibilityInfo;)Landroid/content/res/Resources; +HSPLandroid/app/ResourcesManager;->extractApkKeys(Landroid/content/res/ResourcesKey;)Ljava/util/ArrayList; HSPLandroid/app/ResourcesManager;->findKeyForResourceImplLocked(Landroid/content/res/ResourcesImpl;)Landroid/content/res/ResourcesKey; HSPLandroid/app/ResourcesManager;->findOrCreateResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;)Landroid/content/res/ResourcesImpl; HSPLandroid/app/ResourcesManager;->findOrCreateResourcesImplForKeyLocked(Landroid/content/res/ResourcesKey;Landroid/app/ResourcesManager$ApkAssetsSupplier;)Landroid/content/res/ResourcesImpl; @@ -2571,6 +2556,8 @@ HSPLandroid/app/ResourcesManager;->rebaseActivityOverrideConfig(Landroid/app/Res HSPLandroid/app/ResourcesManager;->rebaseKeyForActivity(Landroid/os/IBinder;Landroid/content/res/ResourcesKey;Z)V HSPLandroid/app/ResourcesManager;->rebaseKeyForDisplay(Landroid/content/res/ResourcesKey;I)V HSPLandroid/app/ResourcesManager;->redirectResourcesToNewImplLocked(Landroid/util/ArrayMap;)V +HSPLandroid/app/ResourcesManager;->registerAllResourcesReference(Landroid/content/res/Resources;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/app/ResourcesManager;->updateResourceImplWithRegisteredLibs(Landroid/content/res/ResourcesImpl;)I+]Landroid/app/ResourcesManager$SharedLibraryAssets;Landroid/app/ResourcesManager$SharedLibraryAssets;]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl; HSPLandroid/app/ResourcesManager;->updateResourcesForActivity(Landroid/os/IBinder;Landroid/content/res/Configuration;I)V HSPLandroid/app/ResultInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/ResultInfo; HSPLandroid/app/ResultInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -2617,7 +2604,7 @@ HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->(Landroid/app/SharedPre HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->apply()V HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->clear()Landroid/content/SharedPreferences$Editor; HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->commit()Z -HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->commitToMemory()Landroid/app/SharedPreferencesImpl$MemoryCommitResult;+]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/lang/Object;Ljava/lang/String;,Ljava/lang/Boolean;,Ljava/lang/Long;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Set;Ljava/util/HashMap$EntrySet; +HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->commitToMemory()Landroid/app/SharedPreferencesImpl$MemoryCommitResult; HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->notifyListeners(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;)V HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putBoolean(Ljava/lang/String;Z)Landroid/content/SharedPreferences$Editor; HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putFloat(Ljava/lang/String;F)Landroid/content/SharedPreferences$Editor; @@ -2627,7 +2614,6 @@ HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putString(Ljava/lang/String;L HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->putStringSet(Ljava/lang/String;Ljava/util/Set;)Landroid/content/SharedPreferences$Editor; HSPLandroid/app/SharedPreferencesImpl$EditorImpl;->remove(Ljava/lang/String;)Landroid/content/SharedPreferences$Editor; HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;->(JZLjava/util/List;Ljava/util/Set;Ljava/util/Map;)V -HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;->(JZLjava/util/List;Ljava/util/Set;Ljava/util/Map;Landroid/app/SharedPreferencesImpl$MemoryCommitResult-IA;)V HSPLandroid/app/SharedPreferencesImpl$MemoryCommitResult;->setDiskWriteResult(ZZ)V HSPLandroid/app/SharedPreferencesImpl$SharedPreferencesThreadFactory;->newThread(Ljava/lang/Runnable;)Ljava/lang/Thread; HSPLandroid/app/SharedPreferencesImpl;->-$$Nest$fgetmCurrentMemoryStateGeneration(Landroid/app/SharedPreferencesImpl;)J @@ -2662,7 +2648,7 @@ HSPLandroid/app/SharedPreferencesImpl;->registerOnSharedPreferenceChangeListener HSPLandroid/app/SharedPreferencesImpl;->startLoadFromDisk()V HSPLandroid/app/SharedPreferencesImpl;->startReloadIfChangedUnexpectedly()V HSPLandroid/app/SharedPreferencesImpl;->unregisterOnSharedPreferenceChangeListener(Landroid/content/SharedPreferences$OnSharedPreferenceChangeListener;)V -HSPLandroid/app/SharedPreferencesImpl;->writeToFile(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Z)V+]Ljava/io/File;Ljava/io/File;]Lcom/android/internal/util/ExponentiallyBucketedHistogram;Lcom/android/internal/util/ExponentiallyBucketedHistogram;]Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Landroid/app/SharedPreferencesImpl$MemoryCommitResult;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream; +HSPLandroid/app/SharedPreferencesImpl;->writeToFile(Landroid/app/SharedPreferencesImpl$MemoryCommitResult;Z)V HSPLandroid/app/StackTrace;->(Ljava/lang/String;)V HSPLandroid/app/StatusBarManager;->(Landroid/content/Context;)V HSPLandroid/app/SyncNotedAppOp$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/SyncNotedAppOp; @@ -2781,16 +2767,13 @@ HSPLandroid/app/SystemServiceRegistry$64;->createService(Landroid/app/ContextImp HSPLandroid/app/SystemServiceRegistry$65;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$66;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$67;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; -HSPLandroid/app/SystemServiceRegistry$68;->createService(Landroid/app/ContextImpl;)Landroid/companion/virtual/VirtualDeviceManager;+]Landroid/app/ContextImpl;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources; HSPLandroid/app/SystemServiceRegistry$68;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; -HSPLandroid/app/SystemServiceRegistry$71;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$74;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$75;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$77;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$78;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$7;->createService(Landroid/app/ContextImpl;)Landroid/app/AlarmManager; HSPLandroid/app/SystemServiceRegistry$7;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; -HSPLandroid/app/SystemServiceRegistry$83;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$84;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$85;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$86;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; @@ -2810,11 +2793,11 @@ HSPLandroid/app/SystemServiceRegistry$97;->createService(Landroid/app/ContextImp HSPLandroid/app/SystemServiceRegistry$98;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$99;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$9;->createService(Landroid/app/ContextImpl;)Ljava/lang/Object; -HSPLandroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object;+]Landroid/app/SystemServiceRegistry$CachedServiceFetcher;megamorphic_types]Ljava/lang/Object;[Ljava/lang/Object; +HSPLandroid/app/SystemServiceRegistry$CachedServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry$StaticServiceFetcher;->getService(Landroid/app/ContextImpl;)Ljava/lang/Object; HSPLandroid/app/SystemServiceRegistry;->createServiceCache()[Ljava/lang/Object; -HSPLandroid/app/SystemServiceRegistry;->getSystemService(Landroid/app/ContextImpl;Ljava/lang/String;)Ljava/lang/Object;+]Landroid/app/SystemServiceRegistry$ServiceFetcher;megamorphic_types -HSPLandroid/app/SystemServiceRegistry;->getSystemServiceFetcher(Ljava/lang/String;)Landroid/app/SystemServiceRegistry$ServiceFetcher;+]Ljava/util/Map;Landroid/util/ArrayMap; +HSPLandroid/app/SystemServiceRegistry;->getSystemService(Landroid/app/ContextImpl;Ljava/lang/String;)Ljava/lang/Object; +HSPLandroid/app/SystemServiceRegistry;->getSystemServiceFetcher(Ljava/lang/String;)Landroid/app/SystemServiceRegistry$ServiceFetcher; HSPLandroid/app/SystemServiceRegistry;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String; HSPLandroid/app/TaskInfo;->()V HSPLandroid/app/TaskInfo;->getWindowingMode()I @@ -2837,7 +2820,6 @@ HSPLandroid/app/UiModeManager$1;->(Landroid/app/UiModeManager;)V HSPLandroid/app/UiModeManager$Globals;->-$$Nest$fgetmService(Landroid/app/UiModeManager$Globals;)Landroid/app/IUiModeManager; HSPLandroid/app/UiModeManager$Globals;->(Landroid/app/IUiModeManager;)V HSPLandroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager;->()V -HSPLandroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager;->(Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager-IA;)V HSPLandroid/app/UiModeManager;->(Landroid/content/Context;)V HSPLandroid/app/UiModeManager;->getActiveProjectionTypes()I HSPLandroid/app/UiModeManager;->getCurrentModeType()I @@ -2862,13 +2844,13 @@ HSPLandroid/app/WallpaperManager;->initGlobals(Landroid/app/IWallpaperManager;La HSPLandroid/app/WallpaperManager;->setWallpaperZoomOut(Landroid/os/IBinder;F)V HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/WindowConfiguration; HSPLandroid/app/WindowConfiguration$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/app/WindowConfiguration;->()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/app/WindowConfiguration;->()V HSPLandroid/app/WindowConfiguration;->(Landroid/os/Parcel;)V HSPLandroid/app/WindowConfiguration;->activityTypeToString(I)Ljava/lang/String; -HSPLandroid/app/WindowConfiguration;->areConfigurationsEqualForDisplay(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/app/WindowConfiguration;->areConfigurationsEqualForDisplay(Landroid/content/res/Configuration;Landroid/content/res/Configuration;)Z HSPLandroid/app/WindowConfiguration;->canReceiveKeys()Z HSPLandroid/app/WindowConfiguration;->compareTo(Landroid/app/WindowConfiguration;)I -HSPLandroid/app/WindowConfiguration;->diff(Landroid/app/WindowConfiguration;Z)J+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/app/WindowConfiguration;->diff(Landroid/app/WindowConfiguration;Z)J HSPLandroid/app/WindowConfiguration;->equals(Ljava/lang/Object;)Z HSPLandroid/app/WindowConfiguration;->getActivityType()I HSPLandroid/app/WindowConfiguration;->getAppBounds()Landroid/graphics/Rect; @@ -2877,7 +2859,6 @@ HSPLandroid/app/WindowConfiguration;->getDisplayRotation()I HSPLandroid/app/WindowConfiguration;->getMaxBounds()Landroid/graphics/Rect; HSPLandroid/app/WindowConfiguration;->getRotation()I HSPLandroid/app/WindowConfiguration;->getWindowingMode()I -HSPLandroid/app/WindowConfiguration;->hasWindowDecorCaption()Z HSPLandroid/app/WindowConfiguration;->hasWindowShadow()Z HSPLandroid/app/WindowConfiguration;->inMultiWindowMode(I)Z HSPLandroid/app/WindowConfiguration;->isFloating(I)Z @@ -2885,20 +2866,19 @@ HSPLandroid/app/WindowConfiguration;->readFromParcel(Landroid/os/Parcel;)V HSPLandroid/app/WindowConfiguration;->setActivityType(I)V HSPLandroid/app/WindowConfiguration;->setAlwaysOnTop(I)V HSPLandroid/app/WindowConfiguration;->setAppBounds(IIII)V -HSPLandroid/app/WindowConfiguration;->setAppBounds(Landroid/graphics/Rect;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; -HSPLandroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/app/WindowConfiguration;->setAppBounds(Landroid/graphics/Rect;)V +HSPLandroid/app/WindowConfiguration;->setBounds(Landroid/graphics/Rect;)V HSPLandroid/app/WindowConfiguration;->setDisplayRotation(I)V -HSPLandroid/app/WindowConfiguration;->setDisplayWindowingMode(I)V -HSPLandroid/app/WindowConfiguration;->setMaxBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/app/WindowConfiguration;->setMaxBounds(Landroid/graphics/Rect;)V HSPLandroid/app/WindowConfiguration;->setRotation(I)V -HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;)V HSPLandroid/app/WindowConfiguration;->setTo(Landroid/app/WindowConfiguration;I)V -HSPLandroid/app/WindowConfiguration;->setToDefaults()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/app/WindowConfiguration;->setToDefaults()V HSPLandroid/app/WindowConfiguration;->setWindowingMode(I)V HSPLandroid/app/WindowConfiguration;->tasksAreFloating()Z HSPLandroid/app/WindowConfiguration;->toString()Ljava/lang/String; HSPLandroid/app/WindowConfiguration;->unset()V -HSPLandroid/app/WindowConfiguration;->updateFrom(Landroid/app/WindowConfiguration;)I+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/app/WindowConfiguration;->updateFrom(Landroid/app/WindowConfiguration;)I HSPLandroid/app/WindowConfiguration;->windowingModeToString(I)Ljava/lang/String; HSPLandroid/app/WindowConfiguration;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/app/admin/DevicePolicyManager$$ExternalSyntheticLambda5;->(Landroid/app/admin/DevicePolicyManager;)V @@ -3164,10 +3144,10 @@ HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->newArray(I)[Landroid/app/job/J HSPLandroid/app/job/JobInfo$TriggerContentUri$1;->newArray(I)[Ljava/lang/Object; HSPLandroid/app/job/JobInfo$TriggerContentUri;->(Landroid/net/Uri;I)V HSPLandroid/app/job/JobInfo$TriggerContentUri;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/app/job/JobInfo;->(Landroid/app/job/JobInfo$Builder;)V+]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Landroid/os/Bundle;Landroid/os/Bundle; +HSPLandroid/app/job/JobInfo;->(Landroid/app/job/JobInfo$Builder;)V HSPLandroid/app/job/JobInfo;->(Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo-IA;)V -HSPLandroid/app/job/JobInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/net/NetworkRequest$1;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/app/job/JobInfo;->enforceValidity(ZZZZ)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/ComponentName;Landroid/content/ComponentName; +HSPLandroid/app/job/JobInfo;->(Landroid/os/Parcel;)V +HSPLandroid/app/job/JobInfo;->enforceValidity(ZZZZ)V HSPLandroid/app/job/JobInfo;->getExtras()Landroid/os/PersistableBundle; HSPLandroid/app/job/JobInfo;->getFlags()I HSPLandroid/app/job/JobInfo;->getFlexMillis()J @@ -3186,7 +3166,7 @@ HSPLandroid/app/job/JobInfo;->isPersisted()Z HSPLandroid/app/job/JobInfo;->isRequireCharging()Z HSPLandroid/app/job/JobInfo;->isRequireDeviceIdle()Z HSPLandroid/app/job/JobInfo;->validateTraceTag(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/app/job/JobInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/job/JobInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/job/JobParameters; HSPLandroid/app/job/JobParameters$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/job/JobParameters;->(Landroid/os/Parcel;)V @@ -3265,13 +3245,11 @@ HSPLandroid/app/prediction/IPredictionCallback$Stub;->asInterface(Landroid/os/IB HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ActivityConfigurationChangeItem; HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/servertransaction/ActivityConfigurationChangeItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V -HSPLandroid/app/servertransaction/ActivityLifecycleItem;->()V HSPLandroid/app/servertransaction/ActivityRelaunchItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V HSPLandroid/app/servertransaction/ActivityResultItem$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ActivityResultItem; HSPLandroid/app/servertransaction/ActivityResultItem$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/servertransaction/ActivityResultItem;->execute(Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread$ActivityClientRecord;Landroid/app/servertransaction/PendingTransactionActions;)V HSPLandroid/app/servertransaction/ActivityResultItem;->getPostExecutionState()I -HSPLandroid/app/servertransaction/ActivityTransactionItem;->()V HSPLandroid/app/servertransaction/ClientTransaction$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/servertransaction/ClientTransaction; HSPLandroid/app/servertransaction/ClientTransaction$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/servertransaction/ClientTransaction;->(Landroid/os/Parcel;)V @@ -3340,16 +3318,13 @@ HSPLandroid/app/servertransaction/TransactionExecutor;->(Landroid/app/Clie HSPLandroid/app/servertransaction/TransactionExecutor;->cycleToPath(Landroid/app/ActivityThread$ActivityClientRecord;ILandroid/app/servertransaction/ClientTransaction;)V HSPLandroid/app/servertransaction/TransactionExecutor;->cycleToPath(Landroid/app/ActivityThread$ActivityClientRecord;IZLandroid/app/servertransaction/ClientTransaction;)V HSPLandroid/app/servertransaction/TransactionExecutor;->execute(Landroid/app/servertransaction/ClientTransaction;)V -HSPLandroid/app/servertransaction/TransactionExecutor;->executeCallbacks(Landroid/app/servertransaction/ClientTransaction;)V -HSPLandroid/app/servertransaction/TransactionExecutor;->executeLifecycleState(Landroid/app/servertransaction/ClientTransaction;)V -HSPLandroid/app/servertransaction/TransactionExecutor;->executeNonLifecycleItem(Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransactionItem;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/app/servertransaction/TransactionExecutorHelper;Landroid/app/servertransaction/TransactionExecutorHelper;]Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Landroid/content/Context;missing_types]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap;]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor; -HSPLandroid/app/servertransaction/TransactionExecutor;->executeTransactionItems(Landroid/app/servertransaction/ClientTransaction;)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Ljava/util/List;Ljava/util/ArrayList;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types +HSPLandroid/app/servertransaction/TransactionExecutor;->executeNonLifecycleItem(Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransactionItem;Z)V+]Landroid/app/ClientTransactionHandler;Landroid/app/ActivityThread;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Landroid/app/servertransaction/TransactionExecutor;Landroid/app/servertransaction/TransactionExecutor;]Landroid/app/servertransaction/TransactionExecutorHelper;Landroid/app/servertransaction/TransactionExecutorHelper;]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap; +HSPLandroid/app/servertransaction/TransactionExecutor;->executeTransactionItems(Landroid/app/servertransaction/ClientTransaction;)V+]Landroid/app/servertransaction/ClientTransaction;Landroid/app/servertransaction/ClientTransaction;]Landroid/app/servertransaction/ClientTransactionItem;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; HSPLandroid/app/servertransaction/TransactionExecutor;->performLifecycleSequence(Landroid/app/ActivityThread$ActivityClientRecord;Landroid/util/IntArray;Landroid/app/servertransaction/ClientTransaction;)V HSPLandroid/app/servertransaction/TransactionExecutorHelper;->()V HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getClosestOfStates(Landroid/app/ActivityThread$ActivityClientRecord;[I)I HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getClosestPreExecutionState(Landroid/app/ActivityThread$ActivityClientRecord;I)I HSPLandroid/app/servertransaction/TransactionExecutorHelper;->getLifecyclePath(IIZ)Landroid/util/IntArray; -HSPLandroid/app/servertransaction/TransactionExecutorHelper;->lastCallbackRequestingState(Landroid/app/servertransaction/ClientTransaction;)I HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->getPinnedSlices(Ljava/lang/String;)[Landroid/net/Uri; HSPLandroid/app/slice/ISliceManager$Stub$Proxy;->grantSlicePermission(Ljava/lang/String;Ljava/lang/String;Landroid/net/Uri;)V @@ -3416,7 +3391,7 @@ HSPLandroid/app/usage/AppStandbyInfo$1;->createFromParcel(Landroid/os/Parcel;)La HSPLandroid/app/usage/AppStandbyInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/usage/AppStandbyInfo;->(Ljava/lang/String;I)V HSPLandroid/app/usage/AppStandbyInfo;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/app/usage/IStorageStatsManager$Stub$Proxy;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Landroid/app/usage/IStorageStatsManager$Stub$Proxy;Landroid/app/usage/IStorageStatsManager$Stub$Proxy;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/app/usage/IStorageStatsManager$Stub$Proxy;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats; HSPLandroid/app/usage/IStorageStatsManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/usage/IStorageStatsManager; HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/app/usage/IUsageStatsManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; @@ -3441,7 +3416,7 @@ HSPLandroid/app/usage/UsageEvents;->(Landroid/os/Parcel;)V HSPLandroid/app/usage/UsageEvents;->getNextEvent(Landroid/app/usage/UsageEvents$Event;)Z HSPLandroid/app/usage/UsageEvents;->hasNextEvent()Z HSPLandroid/app/usage/UsageEvents;->readEventFromParcel(Landroid/os/Parcel;Landroid/app/usage/UsageEvents$Event;)V -HSPLandroid/app/usage/UsageStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/UsageStats;+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HSPLandroid/app/usage/UsageStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/app/usage/UsageStats; HSPLandroid/app/usage/UsageStats$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/app/usage/UsageStats$1;->readBundleToEventMap(Landroid/os/Bundle;Landroid/util/ArrayMap;)V HSPLandroid/app/usage/UsageStats;->()V @@ -3466,7 +3441,7 @@ HSPLandroid/appwidget/AppWidgetProvider;->()V HSPLandroid/appwidget/AppWidgetProvider;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V HSPLandroid/appwidget/AppWidgetProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/appwidget/AppWidgetProviderInfo; HSPLandroid/appwidget/AppWidgetProviderInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/appwidget/AppWidgetProviderInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/appwidget/AppWidgetProviderInfo;->(Landroid/os/Parcel;)V HSPLandroid/appwidget/AppWidgetProviderInfo;->getProfile()Landroid/os/UserHandle; HSPLandroid/appwidget/AppWidgetProviderInfo;->updateDimensions(Landroid/util/DisplayMetrics;)V HSPLandroid/appwidget/AppWidgetProviderInfo;->writeToParcel(Landroid/os/Parcel;I)V @@ -3477,10 +3452,8 @@ HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy;->getDeviceIdForD HSPLandroid/companion/virtual/IVirtualDeviceManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/companion/virtual/IVirtualDeviceManager; HSPLandroid/companion/virtual/VirtualDeviceManager;->(Landroid/companion/virtual/IVirtualDeviceManager;Landroid/content/Context;)V HSPLandroid/companion/virtual/VirtualDeviceManager;->getDeviceIdForDisplayId(I)I -HSPLandroid/companion/virtual/flags/FeatureFlagsImpl;->()V HSPLandroid/companion/virtual/flags/FeatureFlagsImpl;->enableNativeVdm()Z -HSPLandroid/companion/virtual/flags/Flags;->()V -HSPLandroid/companion/virtual/flags/Flags;->enableNativeVdm()Z+]Landroid/companion/virtual/flags/FeatureFlags;Landroid/companion/virtual/flags/FeatureFlagsImpl; +HSPLandroid/companion/virtual/flags/Flags;->enableNativeVdm()Z HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->cancelSync(Landroid/content/ISyncContext;)V HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->isCallerSystem()Z HSPLandroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl;->startSync(Landroid/content/ISyncContext;Ljava/lang/String;Landroid/accounts/Account;Landroid/os/Bundle;)V @@ -3507,7 +3480,6 @@ HSPLandroid/content/AttributionSource$ScopedParcelState;->close()V HSPLandroid/content/AttributionSource$ScopedParcelState;->getParcel()Landroid/os/Parcel; HSPLandroid/content/AttributionSource;->()V HSPLandroid/content/AttributionSource;->(IILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;[Ljava/lang/String;ILandroid/content/AttributionSource;)V -HSPLandroid/content/AttributionSource;->(IILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;[Ljava/lang/String;Landroid/content/AttributionSource;)V HSPLandroid/content/AttributionSource;->(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;ILandroid/content/AttributionSource;)V HSPLandroid/content/AttributionSource;->(ILjava/lang/String;Ljava/lang/String;)V HSPLandroid/content/AttributionSource;->(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;)V @@ -3622,19 +3594,17 @@ HSPLandroid/content/ComponentName;->hashCode()I HSPLandroid/content/ComponentName;->readFromParcel(Landroid/os/Parcel;)Landroid/content/ComponentName; HSPLandroid/content/ComponentName;->toShortString()Ljava/lang/String; HSPLandroid/content/ComponentName;->toString()Ljava/lang/String; -HSPLandroid/content/ComponentName;->unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/content/ComponentName;->unflattenFromString(Ljava/lang/String;)Landroid/content/ComponentName; HSPLandroid/content/ComponentName;->writeToParcel(Landroid/content/ComponentName;Landroid/os/Parcel;)V HSPLandroid/content/ComponentName;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/ContentCaptureOptions$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions; HSPLandroid/content/ContentCaptureOptions$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;->()V HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1;->apply(I)Ljava/lang/Object; -HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;->(Landroid/os/Parcel;)V -HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->-$$Nest$smcreateFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions$ContentProtectionOptions; HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->(ZILjava/util/List;Ljava/util/List;I)V HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentCaptureOptions$ContentProtectionOptions; -HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->createGroupsFromParcel(Landroid/os/Parcel;)Ljava/util/List;+]Ljava/util/stream/Stream;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$11;,Ljava/util/stream/ReferencePipeline$15;,Ljava/util/stream/IntPipeline$1;]Ljava/util/stream/IntStream;Ljava/util/stream/IntPipeline$Head;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->createGroupsFromParcel(Landroid/os/Parcel;)Ljava/util/List; HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->lambda$createGroupsFromParcel$0(I)Ljava/util/ArrayList; HSPLandroid/content/ContentCaptureOptions$ContentProtectionOptions;->writeToParcel(Landroid/os/Parcel;)V HSPLandroid/content/ContentCaptureOptions;->(IIIIILandroid/util/ArraySet;)V @@ -3746,7 +3716,7 @@ HSPLandroid/content/ContentProviderOperation$Builder;->withValue(Ljava/lang/Stri HSPLandroid/content/ContentProviderOperation$Builder;->withValues(Landroid/content/ContentValues;)Landroid/content/ContentProviderOperation$Builder; HSPLandroid/content/ContentProviderOperation;->(Landroid/content/ContentProviderOperation$Builder;)V HSPLandroid/content/ContentProviderOperation;->apply(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult; -HSPLandroid/content/ContentProviderOperation;->applyInternal(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult;+]Landroid/content/ContentProviderOperation;Landroid/content/ContentProviderOperation; +HSPLandroid/content/ContentProviderOperation;->applyInternal(Landroid/content/ContentProvider;[Landroid/content/ContentProviderResult;I)Landroid/content/ContentProviderResult; HSPLandroid/content/ContentProviderOperation;->getUri()Landroid/net/Uri; HSPLandroid/content/ContentProviderOperation;->isInsert()Z HSPLandroid/content/ContentProviderOperation;->isReadOperation()Z @@ -3758,7 +3728,7 @@ HSPLandroid/content/ContentProviderOperation;->newInsert(Landroid/net/Uri;)Landr HSPLandroid/content/ContentProviderOperation;->newUpdate(Landroid/net/Uri;)Landroid/content/ContentProviderOperation$Builder; HSPLandroid/content/ContentProviderOperation;->resolveExtrasBackReferences([Landroid/content/ContentProviderResult;I)Landroid/os/Bundle; HSPLandroid/content/ContentProviderOperation;->resolveSelectionArgsBackReferences([Landroid/content/ContentProviderResult;I)[Ljava/lang/String; -HSPLandroid/content/ContentProviderOperation;->resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/ContentValues;Landroid/content/ContentValues; +HSPLandroid/content/ContentProviderOperation;->resolveValueBackReferences([Landroid/content/ContentProviderResult;I)Landroid/content/ContentValues; HSPLandroid/content/ContentProviderOperation;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/ContentProviderProxy;->(Landroid/os/IBinder;)V HSPLandroid/content/ContentProviderProxy;->asBinder()Landroid/os/IBinder; @@ -3767,7 +3737,7 @@ HSPLandroid/content/ContentProviderProxy;->createCancellationSignal()Landroid/os HSPLandroid/content/ContentProviderProxy;->delete(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/os/Bundle;)I HSPLandroid/content/ContentProviderProxy;->insert(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)Landroid/net/Uri; HSPLandroid/content/ContentProviderProxy;->openTypedAssetFile(Landroid/content/AttributionSource;Landroid/net/Uri;Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/content/res/AssetFileDescriptor; -HSPLandroid/content/ContentProviderProxy;->query(Landroid/content/AttributionSource;Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/database/Cursor;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/os/Parcelable$Creator;Landroid/database/BulkCursorDescriptor$1;]Landroid/database/IBulkCursor;Landroid/database/BulkCursorProxy;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/ICancellationSignal;Landroid/os/ICancellationSignal$Stub$Proxy;]Landroid/database/BulkCursorToCursorAdaptor;Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri; +HSPLandroid/content/ContentProviderProxy;->query(Landroid/content/AttributionSource;Landroid/net/Uri;[Ljava/lang/String;Landroid/os/Bundle;Landroid/os/ICancellationSignal;)Landroid/database/Cursor; HSPLandroid/content/ContentProviderProxy;->update(Landroid/content/AttributionSource;Landroid/net/Uri;Landroid/content/ContentValues;Landroid/os/Bundle;)I HSPLandroid/content/ContentProviderResult$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/ContentProviderResult; HSPLandroid/content/ContentProviderResult$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -3901,7 +3871,7 @@ HSPLandroid/content/Context;->getToken(Landroid/content/Context;)Landroid/os/IBi HSPLandroid/content/Context;->isAutofillCompatibilityEnabled()Z HSPLandroid/content/Context;->obtainStyledAttributes(I[I)Landroid/content/res/TypedArray; HSPLandroid/content/Context;->obtainStyledAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; -HSPLandroid/content/Context;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/Context;missing_types +HSPLandroid/content/Context;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray; HSPLandroid/content/Context;->obtainStyledAttributes([I)Landroid/content/res/TypedArray; HSPLandroid/content/Context;->registerComponentCallbacks(Landroid/content/ComponentCallbacks;)V HSPLandroid/content/Context;->unregisterComponentCallbacks(Landroid/content/ComponentCallbacks;)V @@ -3950,7 +3920,7 @@ HSPLandroid/content/ContextWrapper;->enforcePermission(Ljava/lang/String;IILjava HSPLandroid/content/ContextWrapper;->fileList()[Ljava/lang/String; HSPLandroid/content/ContextWrapper;->getActivityToken()Landroid/os/IBinder; HSPLandroid/content/ContextWrapper;->getApplicationContext()Landroid/content/Context; -HSPLandroid/content/ContextWrapper;->getApplicationInfo()Landroid/content/pm/ApplicationInfo;+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getApplicationInfo()Landroid/content/pm/ApplicationInfo; HSPLandroid/content/ContextWrapper;->getAssets()Landroid/content/res/AssetManager; HSPLandroid/content/ContextWrapper;->getAttributionSource()Landroid/content/AttributionSource; HSPLandroid/content/ContextWrapper;->getAttributionTag()Ljava/lang/String; @@ -3961,13 +3931,13 @@ HSPLandroid/content/ContextWrapper;->getBasePackageName()Ljava/lang/String; HSPLandroid/content/ContextWrapper;->getCacheDir()Ljava/io/File; HSPLandroid/content/ContextWrapper;->getClassLoader()Ljava/lang/ClassLoader; HSPLandroid/content/ContextWrapper;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions; -HSPLandroid/content/ContextWrapper;->getContentResolver()Landroid/content/ContentResolver;+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getContentResolver()Landroid/content/ContentResolver; HSPLandroid/content/ContextWrapper;->getDataDir()Ljava/io/File; HSPLandroid/content/ContextWrapper;->getDatabasePath(Ljava/lang/String;)Ljava/io/File; HSPLandroid/content/ContextWrapper;->getDeviceId()I HSPLandroid/content/ContextWrapper;->getDir(Ljava/lang/String;I)Ljava/io/File; HSPLandroid/content/ContextWrapper;->getDisplay()Landroid/view/Display; -HSPLandroid/content/ContextWrapper;->getDisplayId()I+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getDisplayId()I HSPLandroid/content/ContextWrapper;->getDisplayNoVerify()Landroid/view/Display; HSPLandroid/content/ContextWrapper;->getExternalCacheDir()Ljava/io/File; HSPLandroid/content/ContextWrapper;->getExternalCacheDirs()[Ljava/io/File; @@ -3983,15 +3953,15 @@ HSPLandroid/content/ContextWrapper;->getNextAutofillId()I HSPLandroid/content/ContextWrapper;->getNoBackupFilesDir()Ljava/io/File; HSPLandroid/content/ContextWrapper;->getOpPackageName()Ljava/lang/String; HSPLandroid/content/ContextWrapper;->getPackageCodePath()Ljava/lang/String; -HSPLandroid/content/ContextWrapper;->getPackageManager()Landroid/content/pm/PackageManager;+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getPackageManager()Landroid/content/pm/PackageManager; HSPLandroid/content/ContextWrapper;->getPackageName()Ljava/lang/String; HSPLandroid/content/ContextWrapper;->getPackageResourcePath()Ljava/lang/String; HSPLandroid/content/ContextWrapper;->getResources()Landroid/content/res/Resources; -HSPLandroid/content/ContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences;+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getSharedPreferences(Ljava/lang/String;I)Landroid/content/SharedPreferences; HSPLandroid/content/ContextWrapper;->getSharedPreferencesPath(Ljava/lang/String;)Ljava/io/File; -HSPLandroid/content/ContextWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/content/Context;missing_types -HSPLandroid/content/ContextWrapper;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String;+]Landroid/content/Context;missing_types -HSPLandroid/content/ContextWrapper;->getTheme()Landroid/content/res/Resources$Theme;+]Landroid/content/Context;missing_types +HSPLandroid/content/ContextWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; +HSPLandroid/content/ContextWrapper;->getSystemServiceName(Ljava/lang/Class;)Ljava/lang/String; +HSPLandroid/content/ContextWrapper;->getTheme()Landroid/content/res/Resources$Theme; HSPLandroid/content/ContextWrapper;->getUser()Landroid/os/UserHandle; HSPLandroid/content/ContextWrapper;->getUserId()I HSPLandroid/content/ContextWrapper;->getWindowContextToken()Landroid/os/IBinder; @@ -4083,7 +4053,7 @@ HSPLandroid/content/Intent;->(Landroid/os/Parcel;)V HSPLandroid/content/Intent;->(Ljava/lang/String;)V HSPLandroid/content/Intent;->(Ljava/lang/String;Landroid/net/Uri;)V HSPLandroid/content/Intent;->(Ljava/lang/String;Landroid/net/Uri;Landroid/content/Context;Ljava/lang/Class;)V -HSPLandroid/content/Intent;->addCategory(Ljava/lang/String;)Landroid/content/Intent;+]Ljava/lang/String;Ljava/lang/String;]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLandroid/content/Intent;->addCategory(Ljava/lang/String;)Landroid/content/Intent; HSPLandroid/content/Intent;->addFlags(I)Landroid/content/Intent; HSPLandroid/content/Intent;->cloneFilter()Landroid/content/Intent; HSPLandroid/content/Intent;->filterEquals(Landroid/content/Intent;)Z @@ -4148,8 +4118,8 @@ HSPLandroid/content/Intent;->putExtras(Landroid/content/Intent;)Landroid/content HSPLandroid/content/Intent;->putExtras(Landroid/os/Bundle;)Landroid/content/Intent; HSPLandroid/content/Intent;->putParcelableArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent; HSPLandroid/content/Intent;->putStringArrayListExtra(Ljava/lang/String;Ljava/util/ArrayList;)Landroid/content/Intent; -HSPLandroid/content/Intent;->readFromParcel(Landroid/os/Parcel;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/os/Parcelable$Creator;Landroid/net/Uri$1;,Landroid/graphics/Rect$1;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/content/Intent;Landroid/content/Intent; -HSPLandroid/content/Intent;->removeCategory(Ljava/lang/String;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLandroid/content/Intent;->readFromParcel(Landroid/os/Parcel;)V +HSPLandroid/content/Intent;->removeCategory(Ljava/lang/String;)V HSPLandroid/content/Intent;->removeExtra(Ljava/lang/String;)V HSPLandroid/content/Intent;->replaceExtras(Landroid/os/Bundle;)Landroid/content/Intent; HSPLandroid/content/Intent;->resolveActivity(Landroid/content/pm/PackageManager;)Landroid/content/ComponentName; @@ -4174,13 +4144,13 @@ HSPLandroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Inte HSPLandroid/content/Intent;->setSelector(Landroid/content/Intent;)V HSPLandroid/content/Intent;->setSourceBounds(Landroid/graphics/Rect;)V HSPLandroid/content/Intent;->setType(Ljava/lang/String;)Landroid/content/Intent; -HSPLandroid/content/Intent;->toShortString(Ljava/lang/StringBuilder;ZZZZ)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName; +HSPLandroid/content/Intent;->toShortString(Ljava/lang/StringBuilder;ZZZZ)V HSPLandroid/content/Intent;->toString()Ljava/lang/String; HSPLandroid/content/Intent;->toString(Ljava/lang/StringBuilder;)V HSPLandroid/content/Intent;->toUri(I)Ljava/lang/String; HSPLandroid/content/Intent;->toUriFragment(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V HSPLandroid/content/Intent;->toUriInner(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V -HSPLandroid/content/Intent;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/Intent;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/IntentFilter$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/content/IntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/IntentFilter; HSPLandroid/content/IntentFilter$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -4244,7 +4214,7 @@ HSPLandroid/content/IntentFilter;->setOrder(I)V HSPLandroid/content/IntentFilter;->setPriority(I)V HSPLandroid/content/IntentFilter;->setVisibilityToInstantApp(I)V HSPLandroid/content/IntentFilter;->typesIterator()Ljava/util/Iterator; -HSPLandroid/content/IntentFilter;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/IntentFilter;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/IntentSender;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/LocusId; HSPLandroid/content/LocusId$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -4320,7 +4290,7 @@ HSPLandroid/content/UriMatcher;->(I)V HSPLandroid/content/UriMatcher;->(ILjava/lang/String;)V HSPLandroid/content/UriMatcher;->addURI(Ljava/lang/String;Ljava/lang/String;I)V HSPLandroid/content/UriMatcher;->createChild(Ljava/lang/String;)Landroid/content/UriMatcher; -HSPLandroid/content/UriMatcher;->match(Landroid/net/Uri;)I+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Landroid/net/Uri$PathSegments;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri; +HSPLandroid/content/UriMatcher;->match(Landroid/net/Uri;)I HSPLandroid/content/om/OverlayInfo;->ensureValidState()V HSPLandroid/content/om/OverlayInfo;->isEnabled()Z HSPLandroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ActivityInfo; @@ -4328,7 +4298,7 @@ HSPLandroid/content/pm/ActivityInfo$1;->createFromParcel(Landroid/os/Parcel;)Lja HSPLandroid/content/pm/ActivityInfo$1;->newArray(I)[Landroid/content/pm/ActivityInfo; HSPLandroid/content/pm/ActivityInfo$1;->newArray(I)[Ljava/lang/Object; HSPLandroid/content/pm/ActivityInfo$WindowLayout;->(Landroid/os/Parcel;)V -HSPLandroid/content/pm/ActivityInfo;->(Landroid/os/Parcel;)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLandroid/content/pm/ActivityInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ActivityInfo;->activityInfoConfigNativeToJava(I)I HSPLandroid/content/pm/ActivityInfo;->getRealConfigChanged()I HSPLandroid/content/pm/ActivityInfo;->getThemeResource()I @@ -4347,7 +4317,7 @@ HSPLandroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;) HSPLandroid/content/pm/ApplicationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/content/pm/ApplicationInfo;->()V HSPLandroid/content/pm/ApplicationInfo;->(Landroid/content/pm/ApplicationInfo;)V -HSPLandroid/content/pm/ApplicationInfo;->(Landroid/os/Parcel;)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/Set;Ljava/util/Collections$EmptySet; +HSPLandroid/content/pm/ApplicationInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ApplicationInfo;->(Landroid/os/Parcel;Landroid/content/pm/ApplicationInfo-IA;)V HSPLandroid/content/pm/ApplicationInfo;->getAllApkPaths()[Ljava/lang/String; HSPLandroid/content/pm/ApplicationInfo;->getApplicationInfo()Landroid/content/pm/ApplicationInfo; @@ -4384,15 +4354,15 @@ HSPLandroid/content/pm/ApplicationInfo;->setSplitCodePaths([Ljava/lang/String;)V HSPLandroid/content/pm/ApplicationInfo;->setSplitResourcePaths([Ljava/lang/String;)V HSPLandroid/content/pm/ApplicationInfo;->setVersionCode(J)V HSPLandroid/content/pm/ApplicationInfo;->toString()Ljava/lang/String; -HSPLandroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;Lcom/android/internal/util/Parcelling$BuiltIn$ForStringSet;]Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;Lcom/android/internal/util/Parcelling$BuiltIn$ForBoolean;]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/UUID;Ljava/util/UUID; +HSPLandroid/content/pm/ApplicationInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/Attribution$1;->()V HSPLandroid/content/pm/Attribution;->()V HSPLandroid/content/pm/BaseParceledListSlice$1;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z -HSPLandroid/content/pm/BaseParceledListSlice;->(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V+]Landroid/content/pm/BaseParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/BaseParceledListSlice;->(Landroid/os/Parcel;Ljava/lang/ClassLoader;)V HSPLandroid/content/pm/BaseParceledListSlice;->(Ljava/util/List;)V HSPLandroid/content/pm/BaseParceledListSlice;->getList()Ljava/util/List; HSPLandroid/content/pm/BaseParceledListSlice;->readCreator(Landroid/os/Parcelable$Creator;Landroid/os/Parcel;Ljava/lang/ClassLoader;)Ljava/lang/Object; -HSPLandroid/content/pm/BaseParceledListSlice;->readVerifyAndAddElement(Landroid/os/Parcelable$Creator;Landroid/os/Parcel;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class;+]Ljava/lang/Object;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HSPLandroid/content/pm/BaseParceledListSlice;->readVerifyAndAddElement(Landroid/os/Parcelable$Creator;Landroid/os/Parcel;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class; HSPLandroid/content/pm/BaseParceledListSlice;->verifySameType(Ljava/lang/Class;Ljava/lang/Class;)V HSPLandroid/content/pm/BaseParceledListSlice;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/Checksum$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/Checksum; @@ -4402,12 +4372,12 @@ HSPLandroid/content/pm/Checksum;->getType()I HSPLandroid/content/pm/Checksum;->getValue()[B HSPLandroid/content/pm/ComponentInfo;->()V HSPLandroid/content/pm/ComponentInfo;->(Landroid/content/pm/ComponentInfo;)V -HSPLandroid/content/pm/ComponentInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ApplicationInfo$1;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/ComponentInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ComponentInfo;->getApplicationInfo()Landroid/content/pm/ApplicationInfo; HSPLandroid/content/pm/ComponentInfo;->getComponentName()Landroid/content/ComponentName; HSPLandroid/content/pm/ComponentInfo;->getIconResource()I HSPLandroid/content/pm/ComponentInfo;->isEnabled()Z -HSPLandroid/content/pm/ComponentInfo;->loadUnsafeLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; +HSPLandroid/content/pm/ComponentInfo;->loadUnsafeLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence; HSPLandroid/content/pm/ComponentInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/ConfigurationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ConfigurationInfo; HSPLandroid/content/pm/ConfigurationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -4416,13 +4386,9 @@ HSPLandroid/content/pm/CrossProfileApps;->(Landroid/content/Context;Landro HSPLandroid/content/pm/CrossProfileApps;->getTargetUserProfiles()Ljava/util/List; HSPLandroid/content/pm/FallbackCategoryProvider;->getFallbackCategory(Ljava/lang/String;)I HSPLandroid/content/pm/FallbackCategoryProvider;->loadFallbacks()V -HSPLandroid/content/pm/FeatureFlagsImpl;->()V -HSPLandroid/content/pm/FeatureFlagsImpl;->relativeReferenceIntentFilters()Z HSPLandroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/FeatureInfo; HSPLandroid/content/pm/FeatureInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/content/pm/FeatureInfo;->(Landroid/os/Parcel;)V -HSPLandroid/content/pm/Flags;->()V -HSPLandroid/content/pm/Flags;->relativeReferenceIntentFilters()Z+]Landroid/content/pm/FeatureFlags;Landroid/content/pm/FeatureFlagsImpl; HSPLandroid/content/pm/ICrossProfileApps$Stub$Proxy;->asBinder()Landroid/os/IBinder; HSPLandroid/content/pm/ICrossProfileApps$Stub$Proxy;->getTargetUserProfiles(Ljava/lang/String;)Ljava/util/List; HSPLandroid/content/pm/ICrossProfileApps$Stub;->asInterface(Landroid/os/IBinder;)Landroid/content/pm/ICrossProfileApps; @@ -4444,7 +4410,7 @@ HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->(Landroid/os/IBinder;) HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getActivityInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo; -HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationEnabledSetting(Ljava/lang/String;I)I+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationEnabledSetting(Ljava/lang/String;I)I HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getHomeActivities(Ljava/util/List;)Landroid/content/ComponentName; @@ -4452,7 +4418,7 @@ HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledApplications(JI) HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstalledPackages(JI)Landroid/content/pm/ParceledListSlice; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getInstallerPackageName(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getNameForUid(I)Ljava/lang/String; -HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageInstaller()Landroid/content/pm/IPackageInstaller; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackageUid(Ljava/lang/String;JI)I HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->getPackagesForUid(I)[Ljava/lang/String; @@ -4470,7 +4436,7 @@ HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->lambda$notifyDexLoad$1(Landr HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackageUse(Ljava/lang/String;I)V HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->notifyPackagesReplacedReceived([Ljava/lang/String;)V -HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/content/pm/IPackageManager$Stub$Proxy;Landroid/content/pm/IPackageManager$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentContentProviders(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice; HSPLandroid/content/pm/IPackageManager$Stub$Proxy;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice; @@ -4522,7 +4488,7 @@ HSPLandroid/content/pm/ModuleInfo;->getPackageName()Ljava/lang/String; HSPLandroid/content/pm/PackageInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/PackageInfo; HSPLandroid/content/pm/PackageInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/content/pm/PackageInfo;->()V -HSPLandroid/content/pm/PackageInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ApplicationInfo$1;,Landroid/content/pm/SigningInfo$1;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/PackageInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/PackageInfo;->(Landroid/os/Parcel;Landroid/content/pm/PackageInfo-IA;)V HSPLandroid/content/pm/PackageInfo;->composeLongVersionCode(II)J HSPLandroid/content/pm/PackageInfo;->getLongVersionCode()J @@ -4546,7 +4512,7 @@ HSPLandroid/content/pm/PackageInstaller;->getSessionInfo(I)Landroid/content/pm/P HSPLandroid/content/pm/PackageInstaller;->registerSessionCallback(Landroid/content/pm/PackageInstaller$SessionCallback;Landroid/os/Handler;)V HSPLandroid/content/pm/PackageItemInfo;->()V HSPLandroid/content/pm/PackageItemInfo;->(Landroid/content/pm/PackageItemInfo;)V -HSPLandroid/content/pm/PackageItemInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/PackageItemInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/PackageItemInfo;->forceSafeLabels()V HSPLandroid/content/pm/PackageItemInfo;->loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable; HSPLandroid/content/pm/PackageItemInfo;->loadLabel(Landroid/content/pm/PackageManager;)Ljava/lang/CharSequence; @@ -4557,7 +4523,7 @@ HSPLandroid/content/pm/PackageItemInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/PackageManager$2;->recompute(Landroid/content/pm/PackageManager$ApplicationInfoQuery;)Landroid/content/pm/ApplicationInfo; HSPLandroid/content/pm/PackageManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/content/pm/PackageManager$3;->recompute(Landroid/content/pm/PackageManager$PackageInfoQuery;)Landroid/content/pm/PackageInfo; -HSPLandroid/content/pm/PackageManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/content/pm/PackageManager$3;Landroid/content/pm/PackageManager$3; +HSPLandroid/content/pm/PackageManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/content/pm/PackageManager$ApplicationInfoFlags;->(J)V HSPLandroid/content/pm/PackageManager$ApplicationInfoFlags;->of(J)Landroid/content/pm/PackageManager$ApplicationInfoFlags; HSPLandroid/content/pm/PackageManager$ApplicationInfoQuery;->(Ljava/lang/String;JI)V @@ -4704,7 +4670,7 @@ HSPLandroid/content/pm/RegisteredServicesCache;->containsType(Ljava/util/ArrayLi HSPLandroid/content/pm/ResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ResolveInfo; HSPLandroid/content/pm/ResolveInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/content/pm/ResolveInfo;->()V -HSPLandroid/content/pm/ResolveInfo;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Landroid/content/pm/ServiceInfo$1;,Landroid/content/pm/ActivityInfo$1;,Landroid/text/TextUtils$1;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/ResolveInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ResolveInfo;->(Landroid/os/Parcel;Landroid/content/pm/ResolveInfo-IA;)V HSPLandroid/content/pm/ResolveInfo;->getComponentInfo()Landroid/content/pm/ComponentInfo; HSPLandroid/content/pm/ResolveInfo;->loadIcon(Landroid/content/pm/PackageManager;)Landroid/graphics/drawable/Drawable; @@ -4717,8 +4683,8 @@ HSPLandroid/content/pm/ServiceInfo$1;->newArray(I)[Ljava/lang/Object; HSPLandroid/content/pm/ServiceInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ServiceInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SharedLibraryInfo; -HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/content/pm/SharedLibraryInfo$1;Landroid/content/pm/SharedLibraryInfo$1; -HSPLandroid/content/pm/SharedLibraryInfo;->(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/SharedLibraryInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; +HSPLandroid/content/pm/SharedLibraryInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/SharedLibraryInfo;->(Landroid/os/Parcel;Landroid/content/pm/SharedLibraryInfo-IA;)V HSPLandroid/content/pm/SharedLibraryInfo;->(Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;JILandroid/content/pm/VersionedPackage;Ljava/util/List;Ljava/util/List;Z)V HSPLandroid/content/pm/SharedLibraryInfo;->addDependency(Landroid/content/pm/SharedLibraryInfo;)V @@ -4728,7 +4694,7 @@ HSPLandroid/content/pm/SharedLibraryInfo;->getName()Ljava/lang/String; HSPLandroid/content/pm/SharedLibraryInfo;->getPath()Ljava/lang/String; HSPLandroid/content/pm/SharedLibraryInfo;->isNative()Z HSPLandroid/content/pm/SharedLibraryInfo;->isSdk()Z -HSPLandroid/content/pm/SharedLibraryInfo;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/SharedLibraryInfo;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/ShortcutInfo; HSPLandroid/content/pm/ShortcutInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/content/pm/ShortcutInfo$Builder;->(Landroid/content/Context;Ljava/lang/String;)V @@ -4741,7 +4707,7 @@ HSPLandroid/content/pm/ShortcutInfo$Builder;->setLongLabel(Ljava/lang/CharSequen HSPLandroid/content/pm/ShortcutInfo$Builder;->setLongLived(Z)Landroid/content/pm/ShortcutInfo$Builder; HSPLandroid/content/pm/ShortcutInfo$Builder;->setRank(I)Landroid/content/pm/ShortcutInfo$Builder; HSPLandroid/content/pm/ShortcutInfo$Builder;->setShortLabel(Ljava/lang/CharSequence;)Landroid/content/pm/ShortcutInfo$Builder; -HSPLandroid/content/pm/ShortcutInfo;->(Landroid/content/pm/ShortcutInfo$Builder;)V+]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo; +HSPLandroid/content/pm/ShortcutInfo;->(Landroid/content/pm/ShortcutInfo$Builder;)V HSPLandroid/content/pm/ShortcutInfo;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/ShortcutInfo;->addFlags(I)V HSPLandroid/content/pm/ShortcutInfo;->cloneCapabilityBindings(Ljava/util/Map;)Ljava/util/Map; @@ -4805,7 +4771,7 @@ HSPLandroid/content/pm/Signature;->toChars([C[I)[C HSPLandroid/content/pm/Signature;->toCharsString()Ljava/lang/String; HSPLandroid/content/pm/SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SigningDetails; HSPLandroid/content/pm/SigningDetails$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/content/pm/SigningDetails;->(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/SigningDetails;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/SigningDetails;->getSignatures()[Landroid/content/pm/Signature; HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/SigningInfo; HSPLandroid/content/pm/SigningInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -4838,14 +4804,15 @@ HSPLandroid/content/pm/UserPackage;->hashCode()I HSPLandroid/content/pm/UserPackage;->of(ILjava/lang/String;)Landroid/content/pm/UserPackage; HSPLandroid/content/pm/UserProperties;->isPresent(J)Z HSPLandroid/content/pm/VersionedPackage$1;->createFromParcel(Landroid/os/Parcel;)Landroid/content/pm/VersionedPackage; -HSPLandroid/content/pm/VersionedPackage$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/content/pm/VersionedPackage$1;Landroid/content/pm/VersionedPackage$1; -HSPLandroid/content/pm/VersionedPackage;->(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/content/pm/VersionedPackage$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; +HSPLandroid/content/pm/VersionedPackage;->(Landroid/os/Parcel;)V HSPLandroid/content/pm/VersionedPackage;->(Landroid/os/Parcel;Landroid/content/pm/VersionedPackage-IA;)V HSPLandroid/content/pm/VersionedPackage;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/pm/dex/ArtManager;->getCurrentProfilePath(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String; HSPLandroid/content/pm/dex/ArtManager;->getProfileName(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/content/pm/dex/ArtManager;->getReferenceProfilePath(Ljava/lang/String;ILjava/lang/String;)Ljava/lang/String; HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLite(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;I)Landroid/content/pm/parsing/result/ParseResult; +HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLite(Landroid/content/pm/parsing/result/ParseInput;Ljava/lang/String;Landroid/content/res/XmlResourceParser;Landroid/content/pm/SigningDetails;I)Landroid/content/pm/parsing/result/ParseResult; HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseApkLiteInner(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;Ljava/io/FileDescriptor;Ljava/lang/String;I)Landroid/content/pm/parsing/result/ParseResult; HSPLandroid/content/pm/parsing/ApkLiteParseUtils;->parseMonolithicPackageLite(Landroid/content/pm/parsing/result/ParseInput;Ljava/io/File;I)Landroid/content/pm/parsing/result/ParseResult; HSPLandroid/content/pm/parsing/result/ParseTypeImpl;->(Landroid/content/pm/parsing/result/ParseInput$Callback;)V @@ -4873,7 +4840,7 @@ HSPLandroid/content/res/ApkAssets;->dump(Ljava/io/PrintWriter;Ljava/lang/String; HSPLandroid/content/res/ApkAssets;->finalize()V HSPLandroid/content/res/ApkAssets;->getAssetPath()Ljava/lang/String; HSPLandroid/content/res/ApkAssets;->getDebugName()Ljava/lang/String; -HSPLandroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock; +HSPLandroid/content/res/ApkAssets;->getStringFromPool(I)Ljava/lang/CharSequence; HSPLandroid/content/res/ApkAssets;->isUpToDate()Z HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;)Landroid/content/res/ApkAssets; HSPLandroid/content/res/ApkAssets;->loadFromPath(Ljava/lang/String;I)Landroid/content/res/ApkAssets; @@ -4895,7 +4862,6 @@ HSPLandroid/content/res/AssetFileDescriptor;->getParcelFileDescriptor()Landroid/ HSPLandroid/content/res/AssetFileDescriptor;->getStartOffset()J HSPLandroid/content/res/AssetFileDescriptor;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/res/AssetManager$AssetInputStream;->(Landroid/content/res/AssetManager;J)V -HSPLandroid/content/res/AssetManager$AssetInputStream;->(Landroid/content/res/AssetManager;JLandroid/content/res/AssetManager$AssetInputStream-IA;)V HSPLandroid/content/res/AssetManager$AssetInputStream;->available()I HSPLandroid/content/res/AssetManager$AssetInputStream;->close()V HSPLandroid/content/res/AssetManager$AssetInputStream;->ensureOpen()V @@ -4908,7 +4874,7 @@ HSPLandroid/content/res/AssetManager$AssetInputStream;->read([B)I HSPLandroid/content/res/AssetManager$AssetInputStream;->read([BII)I HSPLandroid/content/res/AssetManager$Builder;->()V HSPLandroid/content/res/AssetManager$Builder;->addApkAssets(Landroid/content/res/ApkAssets;)Landroid/content/res/AssetManager$Builder; -HSPLandroid/content/res/AssetManager$Builder;->build()Landroid/content/res/AssetManager;+]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/content/res/AssetManager$Builder;->build()Landroid/content/res/AssetManager; HSPLandroid/content/res/AssetManager;->-$$Nest$fgetmObject(Landroid/content/res/AssetManager;)J HSPLandroid/content/res/AssetManager;->-$$Nest$fputmApkAssets(Landroid/content/res/AssetManager;[Landroid/content/res/ApkAssets;)V HSPLandroid/content/res/AssetManager;->-$$Nest$fputmLoaders(Landroid/content/res/AssetManager;[Landroid/content/res/loader/ResourcesLoader;)V @@ -4920,7 +4886,6 @@ HSPLandroid/content/res/AssetManager;->-$$Nest$smnativeAssetRead(J[BII)I HSPLandroid/content/res/AssetManager;->()V HSPLandroid/content/res/AssetManager;->(Z)V HSPLandroid/content/res/AssetManager;->(ZLandroid/content/res/AssetManager-IA;)V -HSPLandroid/content/res/AssetManager;->addAssetPathInternal(Ljava/lang/String;ZZ)I HSPLandroid/content/res/AssetManager;->applyStyle(JIILandroid/content/res/XmlBlock$Parser;[IJJ)V HSPLandroid/content/res/AssetManager;->applyStyleToTheme(JIZ)V HSPLandroid/content/res/AssetManager;->close()V @@ -4940,7 +4905,7 @@ HSPLandroid/content/res/AssetManager;->getLoaders()Ljava/util/List; HSPLandroid/content/res/AssetManager;->getLocales()[Ljava/lang/String; HSPLandroid/content/res/AssetManager;->getNonSystemLocales()[Ljava/lang/String; HSPLandroid/content/res/AssetManager;->getParentThemeIdentifier(I)I -HSPLandroid/content/res/AssetManager;->getPooledStringForCookie(II)Ljava/lang/CharSequence;+]Landroid/content/res/ApkAssets;Landroid/content/res/ApkAssets;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/content/res/AssetManager;->getPooledStringForCookie(II)Ljava/lang/CharSequence; HSPLandroid/content/res/AssetManager;->getResourceArray(I[I)I HSPLandroid/content/res/AssetManager;->getResourceArraySize(I)I HSPLandroid/content/res/AssetManager;->getResourceBagText(II)Ljava/lang/CharSequence; @@ -4953,7 +4918,7 @@ HSPLandroid/content/res/AssetManager;->getResourceStringArray(I)[Ljava/lang/Stri HSPLandroid/content/res/AssetManager;->getResourceText(I)Ljava/lang/CharSequence; HSPLandroid/content/res/AssetManager;->getResourceTextArray(I)[Ljava/lang/CharSequence; HSPLandroid/content/res/AssetManager;->getResourceTypeName(I)Ljava/lang/String; -HSPLandroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z+]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/content/res/AssetManager;->getResourceValue(IILandroid/util/TypedValue;Z)Z HSPLandroid/content/res/AssetManager;->getSizeConfigurations()[Landroid/content/res/Configuration; HSPLandroid/content/res/AssetManager;->getSystem()Landroid/content/res/AssetManager; HSPLandroid/content/res/AssetManager;->getThemeValue(JILandroid/util/TypedValue;Z)Z @@ -4966,7 +4931,7 @@ HSPLandroid/content/res/AssetManager;->openFd(Ljava/lang/String;)Landroid/conten HSPLandroid/content/res/AssetManager;->openNonAsset(ILjava/lang/String;I)Ljava/io/InputStream; HSPLandroid/content/res/AssetManager;->openNonAssetFd(ILjava/lang/String;)Landroid/content/res/AssetFileDescriptor; HSPLandroid/content/res/AssetManager;->openNonAssetFd(Ljava/lang/String;)Landroid/content/res/AssetFileDescriptor; -HSPLandroid/content/res/AssetManager;->openXmlBlockAsset(ILjava/lang/String;)Landroid/content/res/XmlBlock;+]Ljava/lang/Object;Landroid/content/res/XmlBlock; +HSPLandroid/content/res/AssetManager;->openXmlBlockAsset(ILjava/lang/String;)Landroid/content/res/XmlBlock; HSPLandroid/content/res/AssetManager;->openXmlResourceParser(ILjava/lang/String;)Landroid/content/res/XmlResourceParser; HSPLandroid/content/res/AssetManager;->rebaseTheme(JLandroid/content/res/AssetManager;[I[ZI)Landroid/content/res/AssetManager; HSPLandroid/content/res/AssetManager;->releaseTheme(J)V @@ -5043,7 +5008,7 @@ HSPLandroid/content/res/Configuration;->getGrammaticalGender()I HSPLandroid/content/res/Configuration;->getLayoutDirection()I HSPLandroid/content/res/Configuration;->getLocales()Landroid/os/LocaleList; HSPLandroid/content/res/Configuration;->getScreenLayoutNoDirection(I)I -HSPLandroid/content/res/Configuration;->hashCode()I+]Landroid/os/LocaleList;Landroid/os/LocaleList; +HSPLandroid/content/res/Configuration;->hashCode()I HSPLandroid/content/res/Configuration;->isLayoutSizeAtLeast(I)Z HSPLandroid/content/res/Configuration;->isOtherSeqNewer(Landroid/content/res/Configuration;)Z HSPLandroid/content/res/Configuration;->isScreenRound()Z @@ -5056,12 +5021,12 @@ HSPLandroid/content/res/Configuration;->resetScreenLayout(I)I HSPLandroid/content/res/Configuration;->setLayoutDirection(Ljava/util/Locale;)V HSPLandroid/content/res/Configuration;->setLocale(Ljava/util/Locale;)V HSPLandroid/content/res/Configuration;->setLocales(Landroid/os/LocaleList;)V -HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V+]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;)V HSPLandroid/content/res/Configuration;->setTo(Landroid/content/res/Configuration;II)V -HSPLandroid/content/res/Configuration;->setToDefaults()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/content/res/Configuration;->setToDefaults()V HSPLandroid/content/res/Configuration;->toString()Ljava/lang/String; HSPLandroid/content/res/Configuration;->unset()V -HSPLandroid/content/res/Configuration;->updateFrom(Landroid/content/res/Configuration;)I+]Ljava/lang/Object;Ljava/util/Locale;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/content/res/Configuration;->updateFrom(Landroid/content/res/Configuration;)I HSPLandroid/content/res/Configuration;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/content/res/ConfigurationBoundResourceCache;->()V HSPLandroid/content/res/ConfigurationBoundResourceCache;->get(JLandroid/content/res/Resources$Theme;)Ljava/lang/Object; @@ -5080,7 +5045,7 @@ HSPLandroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resour HSPLandroid/content/res/DrawableCache;->shouldInvalidateEntry(Landroid/graphics/drawable/Drawable$ConstantState;I)Z HSPLandroid/content/res/DrawableCache;->shouldInvalidateEntry(Ljava/lang/Object;I)Z HSPLandroid/content/res/FeatureFlagsImpl;->defaultLocale()Z -HSPLandroid/content/res/Flags;->defaultLocale()Z+]Landroid/content/res/FeatureFlags;Landroid/content/res/FeatureFlagsImpl; +HSPLandroid/content/res/Flags;->defaultLocale()Z HSPLandroid/content/res/FontResourcesParser;->parse(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry; HSPLandroid/content/res/FontResourcesParser;->readFamilies(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry; HSPLandroid/content/res/FontResourcesParser;->readFamily(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/Resources;)Landroid/content/res/FontResourcesParser$FamilyResourceEntry; @@ -5100,7 +5065,6 @@ HSPLandroid/content/res/Resources$$ExternalSyntheticLambda0;->test(Ljava/lang/Ob HSPLandroid/content/res/Resources$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V HSPLandroid/content/res/Resources$NotFoundException;->(Ljava/lang/String;)V HSPLandroid/content/res/Resources$Theme;->(Landroid/content/res/Resources;)V -HSPLandroid/content/res/Resources$Theme;->(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme-IA;)V HSPLandroid/content/res/Resources$Theme;->applyStyle(IZ)V HSPLandroid/content/res/Resources$Theme;->equals(Ljava/lang/Object;)Z HSPLandroid/content/res/Resources$Theme;->getAppliedStyleResId()I @@ -5111,7 +5075,7 @@ HSPLandroid/content/res/Resources$Theme;->getResources()Landroid/content/res/Res HSPLandroid/content/res/Resources$Theme;->getTheme()[Ljava/lang/String; HSPLandroid/content/res/Resources$Theme;->hashCode()I HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes(I[I)Landroid/content/res/TypedArray; -HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/ResourcesImpl$ThemeImpl;Landroid/content/res/ResourcesImpl$ThemeImpl; +HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes(Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray; HSPLandroid/content/res/Resources$Theme;->obtainStyledAttributes([I)Landroid/content/res/TypedArray; HSPLandroid/content/res/Resources$Theme;->rebase()V HSPLandroid/content/res/Resources$Theme;->rebase(Landroid/content/res/ResourcesImpl;)V @@ -5119,16 +5083,16 @@ HSPLandroid/content/res/Resources$Theme;->resolveAttribute(ILandroid/util/TypedV HSPLandroid/content/res/Resources$Theme;->resolveAttributes([I[I)Landroid/content/res/TypedArray; HSPLandroid/content/res/Resources$Theme;->setImpl(Landroid/content/res/ResourcesImpl$ThemeImpl;)V HSPLandroid/content/res/Resources$Theme;->setTo(Landroid/content/res/Resources$Theme;)V -HSPLandroid/content/res/Resources$Theme;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLandroid/content/res/Resources$Theme;->toString()Ljava/lang/String; HSPLandroid/content/res/Resources$ThemeKey;->()V HSPLandroid/content/res/Resources$ThemeKey;->append(IZ)V HSPLandroid/content/res/Resources$ThemeKey;->clone()Landroid/content/res/Resources$ThemeKey; -HSPLandroid/content/res/Resources$ThemeKey;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/content/res/Resources$ThemeKey;]Landroid/content/res/Resources$ThemeKey;Landroid/content/res/Resources$ThemeKey; +HSPLandroid/content/res/Resources$ThemeKey;->equals(Ljava/lang/Object;)Z HSPLandroid/content/res/Resources$ThemeKey;->hashCode()I HSPLandroid/content/res/Resources$ThemeKey;->moveToLast(I)V -HSPLandroid/content/res/Resources$ThemeKey;->setTo(Landroid/content/res/Resources$ThemeKey;)V+][I[I][Z[Z +HSPLandroid/content/res/Resources$ThemeKey;->setTo(Landroid/content/res/Resources$ThemeKey;)V HSPLandroid/content/res/Resources;->(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;)V -HSPLandroid/content/res/Resources;->(Ljava/lang/ClassLoader;)V+]Ljava/util/Set;Ljava/util/Collections$SynchronizedSet; +HSPLandroid/content/res/Resources;->(Ljava/lang/ClassLoader;)V HSPLandroid/content/res/Resources;->addLoaders([Landroid/content/res/loader/ResourcesLoader;)V HSPLandroid/content/res/Resources;->checkCallbacksRegistered()V HSPLandroid/content/res/Resources;->cleanupThemeReferences()V @@ -5137,7 +5101,7 @@ HSPLandroid/content/res/Resources;->dumpHistory(Ljava/io/PrintWriter;Ljava/lang/ HSPLandroid/content/res/Resources;->finishPreloading()V HSPLandroid/content/res/Resources;->getAnimation(I)Landroid/content/res/XmlResourceParser; HSPLandroid/content/res/Resources;->getAnimatorCache()Landroid/content/res/ConfigurationBoundResourceCache; -HSPLandroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl; +HSPLandroid/content/res/Resources;->getAssets()Landroid/content/res/AssetManager; HSPLandroid/content/res/Resources;->getAttributeSetSourceResId(Landroid/util/AttributeSet;)I HSPLandroid/content/res/Resources;->getBoolean(I)Z HSPLandroid/content/res/Resources;->getClassLoader()Ljava/lang/ClassLoader; @@ -5146,12 +5110,12 @@ HSPLandroid/content/res/Resources;->getColor(ILandroid/content/res/Resources$The HSPLandroid/content/res/Resources;->getColorStateList(I)Landroid/content/res/ColorStateList; HSPLandroid/content/res/Resources;->getColorStateList(ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; HSPLandroid/content/res/Resources;->getCompatibilityInfo()Landroid/content/res/CompatibilityInfo; -HSPLandroid/content/res/Resources;->getConfiguration()Landroid/content/res/Configuration;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl; +HSPLandroid/content/res/Resources;->getConfiguration()Landroid/content/res/Configuration; HSPLandroid/content/res/Resources;->getDimension(I)F HSPLandroid/content/res/Resources;->getDimensionPixelOffset(I)I HSPLandroid/content/res/Resources;->getDimensionPixelSize(I)I HSPLandroid/content/res/Resources;->getDisplayAdjustments()Landroid/view/DisplayAdjustments; -HSPLandroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl; +HSPLandroid/content/res/Resources;->getDisplayMetrics()Landroid/util/DisplayMetrics; HSPLandroid/content/res/Resources;->getDrawable(I)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/Resources;->getDrawable(ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/Resources;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable; @@ -5192,7 +5156,7 @@ HSPLandroid/content/res/Resources;->loadXmlResourceParser(ILjava/lang/String;)La HSPLandroid/content/res/Resources;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser; HSPLandroid/content/res/Resources;->newTheme()Landroid/content/res/Resources$Theme; HSPLandroid/content/res/Resources;->obtainAttributes(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; -HSPLandroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray;+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/content/res/Resources;->obtainAttributes(Landroid/util/AttributeSet;[I)Landroid/content/res/TypedArray; HSPLandroid/content/res/Resources;->obtainTempTypedValue()Landroid/util/TypedValue; HSPLandroid/content/res/Resources;->obtainTypedArray(I)Landroid/content/res/TypedArray; HSPLandroid/content/res/Resources;->openRawResource(I)Ljava/io/InputStream; @@ -5220,11 +5184,10 @@ HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda1;->onHeaderDecode HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2;->()V HSPLandroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2;->get()Ljava/lang/Object; HSPLandroid/content/res/ResourcesImpl$LookupStack;->()V -HSPLandroid/content/res/ResourcesImpl$LookupStack;->(Landroid/content/res/ResourcesImpl$LookupStack-IA;)V HSPLandroid/content/res/ResourcesImpl$LookupStack;->contains(I)Z HSPLandroid/content/res/ResourcesImpl$LookupStack;->pop()V HSPLandroid/content/res/ResourcesImpl$LookupStack;->push(I)V -HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->(Landroid/content/res/ResourcesImpl;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->(Landroid/content/res/ResourcesImpl;)V HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->applyStyle(IZ)V HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->finalize()V HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getAppliedStyleResId()I @@ -5232,17 +5195,17 @@ HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getChangingConfigurations()I HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getKey()Landroid/content/res/Resources$ThemeKey; HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getParentThemeIdentifier(I)I HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->getTheme()[Ljava/lang/String; -HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->obtainStyledAttributes(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->obtainStyledAttributes(Landroid/content/res/Resources$Theme;Landroid/util/AttributeSet;[III)Landroid/content/res/TypedArray; HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->rebase()V HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->rebase(Landroid/content/res/AssetManager;)V HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->resolveAttribute(ILandroid/util/TypedValue;Z)Z HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->resolveAttributes(Landroid/content/res/Resources$Theme;[I[I)Landroid/content/res/TypedArray; HSPLandroid/content/res/ResourcesImpl$ThemeImpl;->setTo(Landroid/content/res/ResourcesImpl$ThemeImpl;)V HSPLandroid/content/res/ResourcesImpl;->-$$Nest$sfgetsThemeRegistry()Llibcore/util/NativeAllocationRegistry; -HSPLandroid/content/res/ResourcesImpl;->(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;Landroid/view/DisplayAdjustments;)V+]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl; +HSPLandroid/content/res/ResourcesImpl;->(Landroid/content/res/AssetManager;Landroid/util/DisplayMetrics;Landroid/content/res/Configuration;Landroid/view/DisplayAdjustments;)V HSPLandroid/content/res/ResourcesImpl;->adjustLanguageTag(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/content/res/ResourcesImpl;->attrForQuantityCode(Ljava/lang/String;)I -HSPLandroid/content/res/ResourcesImpl;->cacheDrawable(Landroid/util/TypedValue;ZLandroid/content/res/DrawableCache;Landroid/content/res/Resources$Theme;ZJLandroid/graphics/drawable/Drawable;I)V+]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/content/res/ResourcesImpl;->cacheDrawable(Landroid/util/TypedValue;ZLandroid/content/res/DrawableCache;Landroid/content/res/Resources$Theme;ZJLandroid/graphics/drawable/Drawable;I)V HSPLandroid/content/res/ResourcesImpl;->calcConfigChanges(Landroid/content/res/Configuration;)I HSPLandroid/content/res/ResourcesImpl;->decodeImageDrawable(Landroid/content/res/AssetManager$AssetInputStream;Landroid/content/res/Resources;Landroid/util/TypedValue;)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/ResourcesImpl;->dump(Ljava/io/PrintWriter;Ljava/lang/String;)V @@ -5273,18 +5236,18 @@ HSPLandroid/content/res/ResourcesImpl;->lambda$new$0()Landroid/content/res/Resou HSPLandroid/content/res/ResourcesImpl;->loadColorStateList(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ColorStateList; HSPLandroid/content/res/ResourcesImpl;->loadComplexColor(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor; HSPLandroid/content/res/ResourcesImpl;->loadComplexColorForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;ILandroid/content/res/Resources$Theme;)Landroid/content/res/ComplexColor; -HSPLandroid/content/res/ResourcesImpl;->loadComplexColorFromName(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;I)Landroid/content/res/ComplexColor;+]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache; -HSPLandroid/content/res/ResourcesImpl;->loadDrawable(Landroid/content/res/Resources;Landroid/util/TypedValue;IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;+]Landroid/graphics/drawable/Drawable$ConstantState;megamorphic_types]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/content/res/ResourcesImpl;->loadComplexColorFromName(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Landroid/util/TypedValue;I)Landroid/content/res/ComplexColor; +HSPLandroid/content/res/ResourcesImpl;->loadDrawable(Landroid/content/res/Resources;Landroid/util/TypedValue;IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/ResourcesImpl;->loadDrawableForCookie(Landroid/content/res/Resources;Landroid/util/TypedValue;II)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/ResourcesImpl;->loadFont(Landroid/content/res/Resources;Landroid/util/TypedValue;I)Landroid/graphics/Typeface; HSPLandroid/content/res/ResourcesImpl;->loadXmlDrawable(Landroid/content/res/Resources;Landroid/util/TypedValue;IILjava/lang/String;)Landroid/graphics/drawable/Drawable; -HSPLandroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser;+]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/XmlBlock;Landroid/content/res/XmlBlock; +HSPLandroid/content/res/ResourcesImpl;->loadXmlResourceParser(Ljava/lang/String;IILjava/lang/String;)Landroid/content/res/XmlResourceParser; HSPLandroid/content/res/ResourcesImpl;->newThemeImpl()Landroid/content/res/ResourcesImpl$ThemeImpl; HSPLandroid/content/res/ResourcesImpl;->openRawResource(ILandroid/util/TypedValue;)Ljava/io/InputStream; HSPLandroid/content/res/ResourcesImpl;->openRawResourceFd(ILandroid/util/TypedValue;)Landroid/content/res/AssetFileDescriptor; HSPLandroid/content/res/ResourcesImpl;->startPreloading()V -HSPLandroid/content/res/ResourcesImpl;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache; -HSPLandroid/content/res/ResourcesImpl;->updateConfigurationImpl(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Z)V+]Landroid/content/res/ResourcesImpl;Landroid/content/res/ResourcesImpl;]Landroid/app/ResourcesManager;Landroid/app/ResourcesManager;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Ljava/util/Locale;Ljava/util/Locale;]Landroid/content/res/DrawableCache;Landroid/content/res/DrawableCache;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/os/LocaleList;Landroid/os/LocaleList;]Landroid/util/DisplayMetrics;Landroid/util/DisplayMetrics;]Landroid/content/res/ConfigurationBoundResourceCache;Landroid/content/res/ConfigurationBoundResourceCache;]Ljava/lang/Object;Ljava/util/Locale; +HSPLandroid/content/res/ResourcesImpl;->updateConfiguration(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;)V +HSPLandroid/content/res/ResourcesImpl;->updateConfigurationImpl(Landroid/content/res/Configuration;Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Z)V HSPLandroid/content/res/ResourcesImpl;->verifyPreloadConfig(IIILjava/lang/String;)Z HSPLandroid/content/res/ResourcesKey;->(Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/content/res/Configuration;Landroid/content/res/CompatibilityInfo;[Landroid/content/res/loader/ResourcesLoader;)V HSPLandroid/content/res/ResourcesKey;->equals(Ljava/lang/Object;)Z @@ -5295,7 +5258,7 @@ HSPLandroid/content/res/StringBlock;->applyStyles(Ljava/lang/String;[ILandroid/c HSPLandroid/content/res/StringBlock;->close()V HSPLandroid/content/res/StringBlock;->finalize()V HSPLandroid/content/res/StringBlock;->get(I)Ljava/lang/CharSequence; -HSPLandroid/content/res/StringBlock;->getSequence(I)Ljava/lang/CharSequence;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLandroid/content/res/StringBlock;->getSequence(I)Ljava/lang/CharSequence; HSPLandroid/content/res/ThemedResourceCache;->()V HSPLandroid/content/res/ThemedResourceCache;->get(JLandroid/content/res/Resources$Theme;)Ljava/lang/Object; HSPLandroid/content/res/ThemedResourceCache;->getGeneration()I @@ -5310,15 +5273,15 @@ HSPLandroid/content/res/TypedArray;->(Landroid/content/res/Resources;)V HSPLandroid/content/res/TypedArray;->extractThemeAttrs()[I HSPLandroid/content/res/TypedArray;->extractThemeAttrs([I)[I HSPLandroid/content/res/TypedArray;->getBoolean(IZ)Z -HSPLandroid/content/res/TypedArray;->getChangingConfigurations()I+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/content/res/TypedArray;->getChangingConfigurations()I HSPLandroid/content/res/TypedArray;->getColor(II)I -HSPLandroid/content/res/TypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList;+]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLandroid/content/res/TypedArray;->getColorStateList(I)Landroid/content/res/ColorStateList; HSPLandroid/content/res/TypedArray;->getComplexColor(I)Landroid/content/res/ComplexColor; HSPLandroid/content/res/TypedArray;->getDimension(IF)F HSPLandroid/content/res/TypedArray;->getDimensionPixelOffset(II)I HSPLandroid/content/res/TypedArray;->getDimensionPixelSize(II)I -HSPLandroid/content/res/TypedArray;->getDrawable(I)Landroid/graphics/drawable/Drawable;+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; -HSPLandroid/content/res/TypedArray;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable;+]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLandroid/content/res/TypedArray;->getDrawable(I)Landroid/graphics/drawable/Drawable; +HSPLandroid/content/res/TypedArray;->getDrawableForDensity(II)Landroid/graphics/drawable/Drawable; HSPLandroid/content/res/TypedArray;->getFloat(IF)F HSPLandroid/content/res/TypedArray;->getFont(I)Landroid/graphics/Typeface; HSPLandroid/content/res/TypedArray;->getFraction(IIIF)F @@ -5328,12 +5291,12 @@ HSPLandroid/content/res/TypedArray;->getInt(II)I HSPLandroid/content/res/TypedArray;->getInteger(II)I HSPLandroid/content/res/TypedArray;->getLayoutDimension(II)I HSPLandroid/content/res/TypedArray;->getLayoutDimension(ILjava/lang/String;)I -HSPLandroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String;+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/content/res/TypedArray;->getNonConfigurationString(II)Ljava/lang/String; HSPLandroid/content/res/TypedArray;->getNonResourceString(I)Ljava/lang/String; HSPLandroid/content/res/TypedArray;->getPositionDescription()Ljava/lang/String; HSPLandroid/content/res/TypedArray;->getResourceId(II)I HSPLandroid/content/res/TypedArray;->getResources()Landroid/content/res/Resources; -HSPLandroid/content/res/TypedArray;->getString(I)Ljava/lang/String;+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/content/res/TypedArray;->getString(I)Ljava/lang/String; HSPLandroid/content/res/TypedArray;->getText(I)Ljava/lang/CharSequence; HSPLandroid/content/res/TypedArray;->getTextArray(I)[Ljava/lang/CharSequence; HSPLandroid/content/res/TypedArray;->getType(I)I @@ -5342,11 +5305,11 @@ HSPLandroid/content/res/TypedArray;->getValueAt(ILandroid/util/TypedValue;)Z HSPLandroid/content/res/TypedArray;->hasValue(I)Z HSPLandroid/content/res/TypedArray;->hasValueOrEmpty(I)Z HSPLandroid/content/res/TypedArray;->length()I -HSPLandroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence;+]Landroid/content/res/XmlBlock$Parser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager;]Landroid/content/res/Validator;Landroid/content/res/Validator; -HSPLandroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; +HSPLandroid/content/res/TypedArray;->loadStringValueAt(I)Ljava/lang/CharSequence; +HSPLandroid/content/res/TypedArray;->obtain(Landroid/content/res/Resources;I)Landroid/content/res/TypedArray; HSPLandroid/content/res/TypedArray;->peekValue(I)Landroid/util/TypedValue; -HSPLandroid/content/res/TypedArray;->recycle()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; -HSPLandroid/content/res/TypedArray;->resize(I)V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime; +HSPLandroid/content/res/TypedArray;->recycle()V +HSPLandroid/content/res/TypedArray;->resize(I)V HSPLandroid/content/res/XmlBlock$Parser;->(Landroid/content/res/XmlBlock;JLandroid/content/res/XmlBlock;)V HSPLandroid/content/res/XmlBlock$Parser;->close()V HSPLandroid/content/res/XmlBlock$Parser;->finalize()V @@ -5359,20 +5322,20 @@ HSPLandroid/content/res/XmlBlock$Parser;->getAttributeName(I)Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getAttributeNameResource(I)I HSPLandroid/content/res/XmlBlock$Parser;->getAttributeResourceValue(II)I HSPLandroid/content/res/XmlBlock$Parser;->getAttributeResourceValue(Ljava/lang/String;Ljava/lang/String;I)I -HSPLandroid/content/res/XmlBlock$Parser;->getAttributeValue(I)Ljava/lang/String;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock; +HSPLandroid/content/res/XmlBlock$Parser;->getAttributeValue(I)Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getAttributeValue(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getClassAttribute()Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getDepth()I HSPLandroid/content/res/XmlBlock$Parser;->getEventType()I HSPLandroid/content/res/XmlBlock$Parser;->getLineNumber()I -HSPLandroid/content/res/XmlBlock$Parser;->getName()Ljava/lang/String;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock; -HSPLandroid/content/res/XmlBlock$Parser;->getPooledString(I)Ljava/lang/CharSequence;+]Landroid/content/res/StringBlock;Landroid/content/res/StringBlock; +HSPLandroid/content/res/XmlBlock$Parser;->getName()Ljava/lang/String; +HSPLandroid/content/res/XmlBlock$Parser;->getPooledString(I)Ljava/lang/CharSequence; HSPLandroid/content/res/XmlBlock$Parser;->getPositionDescription()Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getSequenceString(Ljava/lang/CharSequence;)Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->getSourceResId()I HSPLandroid/content/res/XmlBlock$Parser;->getText()Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->isEmptyElementTag()Z -HSPLandroid/content/res/XmlBlock$Parser;->next()I+]Landroid/content/res/XmlBlock$Parser;Landroid/content/res/XmlBlock$Parser;]Landroid/content/res/Validator;Landroid/content/res/Validator; +HSPLandroid/content/res/XmlBlock$Parser;->next()I HSPLandroid/content/res/XmlBlock$Parser;->nextTag()I HSPLandroid/content/res/XmlBlock$Parser;->nextText()Ljava/lang/String; HSPLandroid/content/res/XmlBlock$Parser;->require(ILjava/lang/String;Ljava/lang/String;)V @@ -5399,29 +5362,29 @@ HSPLandroid/content/type/DefaultMimeMapFactory;->lambda$create$0(Ljava/lang/Clas HSPLandroid/content/type/DefaultMimeMapFactory;->parseTypes(Llibcore/content/type/MimeMap$Builder;Ljava/util/function/Function;Ljava/lang/String;)V HSPLandroid/database/AbstractCursor$SelfContentObserver;->(Landroid/database/AbstractCursor;)V HSPLandroid/database/AbstractCursor$SelfContentObserver;->onChange(Z)V -HSPLandroid/database/AbstractCursor;->()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; -HSPLandroid/database/AbstractCursor;->checkPosition()V+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor; -HSPLandroid/database/AbstractCursor;->close()V+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;,Landroid/database/MatrixCursor;]Landroid/database/ContentObservable;Landroid/database/ContentObservable;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; +HSPLandroid/database/AbstractCursor;->()V +HSPLandroid/database/AbstractCursor;->checkPosition()V +HSPLandroid/database/AbstractCursor;->close()V HSPLandroid/database/AbstractCursor;->fillWindow(ILandroid/database/CursorWindow;)V -HSPLandroid/database/AbstractCursor;->finalize()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; -HSPLandroid/database/AbstractCursor;->getColumnCount()I+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor; +HSPLandroid/database/AbstractCursor;->finalize()V +HSPLandroid/database/AbstractCursor;->getColumnCount()I HSPLandroid/database/AbstractCursor;->getColumnIndex(Ljava/lang/String;)I HSPLandroid/database/AbstractCursor;->getColumnIndexOrThrow(Ljava/lang/String;)I -HSPLandroid/database/AbstractCursor;->getColumnName(I)Ljava/lang/String;+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor; +HSPLandroid/database/AbstractCursor;->getColumnName(I)Ljava/lang/String; HSPLandroid/database/AbstractCursor;->getExtras()Landroid/os/Bundle; HSPLandroid/database/AbstractCursor;->getPosition()I HSPLandroid/database/AbstractCursor;->getWantsAllOnMoveCalls()Z HSPLandroid/database/AbstractCursor;->getWindow()Landroid/database/CursorWindow; -HSPLandroid/database/AbstractCursor;->isAfterLast()Z+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/AbstractCursor;->isAfterLast()Z HSPLandroid/database/AbstractCursor;->isClosed()Z HSPLandroid/database/AbstractCursor;->isLast()Z HSPLandroid/database/AbstractCursor;->move(I)Z HSPLandroid/database/AbstractCursor;->moveToFirst()Z HSPLandroid/database/AbstractCursor;->moveToLast()Z -HSPLandroid/database/AbstractCursor;->moveToNext()Z+]Landroid/database/AbstractCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/MatrixCursor;,Landroid/database/BulkCursorToCursorAdaptor; -HSPLandroid/database/AbstractCursor;->moveToPosition(I)Z+]Landroid/database/AbstractCursor;missing_types +HSPLandroid/database/AbstractCursor;->moveToNext()Z +HSPLandroid/database/AbstractCursor;->moveToPosition(I)Z HSPLandroid/database/AbstractCursor;->onChange(Z)V -HSPLandroid/database/AbstractCursor;->onDeactivateOrClose()V+]Landroid/database/DataSetObservable;Landroid/database/DataSetObservable; +HSPLandroid/database/AbstractCursor;->onDeactivateOrClose()V HSPLandroid/database/AbstractCursor;->onMove(II)Z HSPLandroid/database/AbstractCursor;->registerContentObserver(Landroid/database/ContentObserver;)V HSPLandroid/database/AbstractCursor;->registerDataSetObserver(Landroid/database/DataSetObserver;)V @@ -5432,18 +5395,18 @@ HSPLandroid/database/AbstractCursor;->unregisterContentObserver(Landroid/databas HSPLandroid/database/AbstractWindowedCursor;->()V HSPLandroid/database/AbstractWindowedCursor;->checkPosition()V HSPLandroid/database/AbstractWindowedCursor;->clearOrCreateWindow(Ljava/lang/String;)V -HSPLandroid/database/AbstractWindowedCursor;->closeWindow()V+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/AbstractWindowedCursor;->closeWindow()V HSPLandroid/database/AbstractWindowedCursor;->getBlob(I)[B -HSPLandroid/database/AbstractWindowedCursor;->getDouble(I)D+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/AbstractWindowedCursor;->getDouble(I)D HSPLandroid/database/AbstractWindowedCursor;->getFloat(I)F -HSPLandroid/database/AbstractWindowedCursor;->getInt(I)I+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/AbstractWindowedCursor;->getLong(I)J+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String;+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/AbstractWindowedCursor;->getInt(I)I +HSPLandroid/database/AbstractWindowedCursor;->getLong(I)J +HSPLandroid/database/AbstractWindowedCursor;->getString(I)Ljava/lang/String; HSPLandroid/database/AbstractWindowedCursor;->getType(I)I HSPLandroid/database/AbstractWindowedCursor;->getWindow()Landroid/database/CursorWindow; HSPLandroid/database/AbstractWindowedCursor;->hasWindow()Z -HSPLandroid/database/AbstractWindowedCursor;->isNull(I)Z+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/AbstractWindowedCursor;->onDeactivateOrClose()V+]Landroid/database/AbstractWindowedCursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/AbstractWindowedCursor;->isNull(I)Z +HSPLandroid/database/AbstractWindowedCursor;->onDeactivateOrClose()V HSPLandroid/database/AbstractWindowedCursor;->setWindow(Landroid/database/CursorWindow;)V HSPLandroid/database/BulkCursorDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Landroid/database/BulkCursorDescriptor; HSPLandroid/database/BulkCursorDescriptor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -5464,7 +5427,7 @@ HSPLandroid/database/BulkCursorToCursorAdaptor;->getColumnNames()[Ljava/lang/Str HSPLandroid/database/BulkCursorToCursorAdaptor;->getCount()I HSPLandroid/database/BulkCursorToCursorAdaptor;->getObserver()Landroid/database/IContentObserver; HSPLandroid/database/BulkCursorToCursorAdaptor;->initialize(Landroid/database/BulkCursorDescriptor;)V -HSPLandroid/database/BulkCursorToCursorAdaptor;->onMove(II)Z+]Landroid/database/IBulkCursor;Landroid/database/BulkCursorProxy;]Landroid/database/BulkCursorToCursorAdaptor;Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/BulkCursorToCursorAdaptor;->onMove(II)Z HSPLandroid/database/BulkCursorToCursorAdaptor;->throwIfCursorIsClosed()V HSPLandroid/database/ContentObservable;->()V HSPLandroid/database/ContentObservable;->dispatchChange(ZLandroid/net/Uri;)V @@ -5503,21 +5466,21 @@ HSPLandroid/database/CursorWindow$1;->newArray(I)[Ljava/lang/Object; HSPLandroid/database/CursorWindow;->(Landroid/os/Parcel;)V HSPLandroid/database/CursorWindow;->(Landroid/os/Parcel;Landroid/database/CursorWindow-IA;)V HSPLandroid/database/CursorWindow;->(Ljava/lang/String;)V -HSPLandroid/database/CursorWindow;->(Ljava/lang/String;J)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/database/CursorWindow;->(Ljava/lang/String;J)V HSPLandroid/database/CursorWindow;->allocRow()Z HSPLandroid/database/CursorWindow;->clear()V -HSPLandroid/database/CursorWindow;->dispose()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; -HSPLandroid/database/CursorWindow;->finalize()V+]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; +HSPLandroid/database/CursorWindow;->dispose()V +HSPLandroid/database/CursorWindow;->finalize()V HSPLandroid/database/CursorWindow;->getBlob(II)[B HSPLandroid/database/CursorWindow;->getCursorWindowSize()I -HSPLandroid/database/CursorWindow;->getDouble(II)D+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/CursorWindow;->getDouble(II)D HSPLandroid/database/CursorWindow;->getFloat(II)F -HSPLandroid/database/CursorWindow;->getInt(II)I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/CursorWindow;->getLong(II)J+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/CursorWindow;->getNumRows()I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/CursorWindow;->getInt(II)I +HSPLandroid/database/CursorWindow;->getLong(II)J +HSPLandroid/database/CursorWindow;->getNumRows()I HSPLandroid/database/CursorWindow;->getStartPosition()I -HSPLandroid/database/CursorWindow;->getString(II)Ljava/lang/String;+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; -HSPLandroid/database/CursorWindow;->getType(II)I+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/CursorWindow;->getString(II)Ljava/lang/String; +HSPLandroid/database/CursorWindow;->getType(II)I HSPLandroid/database/CursorWindow;->newFromParcel(Landroid/os/Parcel;)Landroid/database/CursorWindow; HSPLandroid/database/CursorWindow;->onAllReferencesReleased()V HSPLandroid/database/CursorWindow;->putLong(JII)Z @@ -5536,16 +5499,16 @@ HSPLandroid/database/CursorWrapper;->getColumnName(I)Ljava/lang/String; HSPLandroid/database/CursorWrapper;->getColumnNames()[Ljava/lang/String; HSPLandroid/database/CursorWrapper;->getCount()I HSPLandroid/database/CursorWrapper;->getExtras()Landroid/os/Bundle; -HSPLandroid/database/CursorWrapper;->getInt(I)I+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/content/ContentProviderClient$CursorWrapperInner;,Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/CursorWrapper;->getInt(I)I HSPLandroid/database/CursorWrapper;->getLong(I)J HSPLandroid/database/CursorWrapper;->getPosition()I HSPLandroid/database/CursorWrapper;->getString(I)Ljava/lang/String; HSPLandroid/database/CursorWrapper;->getType(I)I HSPLandroid/database/CursorWrapper;->getWrappedCursor()Landroid/database/Cursor; -HSPLandroid/database/CursorWrapper;->isAfterLast()Z+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;,Landroid/content/ContentProviderClient$CursorWrapperInner;,Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/CursorWrapper;->isAfterLast()Z HSPLandroid/database/CursorWrapper;->isClosed()Z HSPLandroid/database/CursorWrapper;->isLast()Z -HSPLandroid/database/CursorWrapper;->isNull(I)Z+]Landroid/database/Cursor;Landroid/database/BulkCursorToCursorAdaptor; +HSPLandroid/database/CursorWrapper;->isNull(I)Z HSPLandroid/database/CursorWrapper;->moveToFirst()Z HSPLandroid/database/CursorWrapper;->moveToLast()Z HSPLandroid/database/CursorWrapper;->moveToNext()Z @@ -5553,12 +5516,12 @@ HSPLandroid/database/CursorWrapper;->moveToPosition(I)Z HSPLandroid/database/CursorWrapper;->registerContentObserver(Landroid/database/ContentObserver;)V HSPLandroid/database/DataSetObservable;->()V HSPLandroid/database/DataSetObservable;->notifyChanged()V -HSPLandroid/database/DataSetObservable;->notifyInvalidated()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/DataSetObservable;->notifyInvalidated()V HSPLandroid/database/DataSetObserver;->()V -HSPLandroid/database/DatabaseUtils;->appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLandroid/database/DatabaseUtils;->categorizeStatement(Ljava/lang/String;Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/database/DatabaseUtils;->appendEscapedSQLString(Ljava/lang/StringBuilder;Ljava/lang/String;)V +HSPLandroid/database/DatabaseUtils;->categorizeStatement(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/database/DatabaseUtils;->cursorFillWindow(Landroid/database/Cursor;ILandroid/database/CursorWindow;)V -HSPLandroid/database/DatabaseUtils;->getSqlStatementPrefixSimple(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/database/DatabaseUtils;->getSqlStatementPrefixSimple(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/DatabaseUtils;->getSqlStatementType(Ljava/lang/String;)I HSPLandroid/database/DatabaseUtils;->getSqlStatementTypeExtended(Ljava/lang/String;)I HSPLandroid/database/DatabaseUtils;->getTypeOfObject(Ljava/lang/Object;)I @@ -5610,30 +5573,27 @@ HSPLandroid/database/MergeCursor;->getString(I)Ljava/lang/String; HSPLandroid/database/MergeCursor;->onMove(II)Z HSPLandroid/database/Observable;->()V HSPLandroid/database/Observable;->registerObserver(Ljava/lang/Object;)V -HSPLandroid/database/Observable;->unregisterAll()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/Observable;->unregisterAll()V HSPLandroid/database/Observable;->unregisterObserver(Ljava/lang/Object;)V HSPLandroid/database/sqlite/FeatureFlagsImpl;->()V HSPLandroid/database/sqlite/FeatureFlagsImpl;->sqliteAllowTempTables()Z HSPLandroid/database/sqlite/Flags;->()V -HSPLandroid/database/sqlite/Flags;->sqliteAllowTempTables()Z+]Landroid/database/sqlite/FeatureFlags;Landroid/database/sqlite/FeatureFlagsImpl; +HSPLandroid/database/sqlite/Flags;->sqliteAllowTempTables()Z HSPLandroid/database/sqlite/SQLiteClosable;->()V HSPLandroid/database/sqlite/SQLiteClosable;->acquireReference()V -HSPLandroid/database/sqlite/SQLiteClosable;->close()V+]Landroid/database/sqlite/SQLiteClosable;Landroid/database/CursorWindow;,Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteDatabase;,Landroid/database/sqlite/SQLiteQuery; -HSPLandroid/database/sqlite/SQLiteClosable;->releaseReference()V+]Landroid/database/sqlite/SQLiteClosable;Landroid/database/CursorWindow;,Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteDatabase;,Landroid/database/sqlite/SQLiteQuery; +HSPLandroid/database/sqlite/SQLiteClosable;->close()V +HSPLandroid/database/sqlite/SQLiteClosable;->releaseReference()V HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->getTruncateSize()J HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->init(Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->initIfNeeded()V HSPLandroid/database/sqlite/SQLiteCompatibilityWalFlags;->isLegacyCompatibilityWalEnabled()Z -HSPLandroid/database/sqlite/SQLiteConnection$Operation;->()V -HSPLandroid/database/sqlite/SQLiteConnection$Operation;->(Landroid/database/sqlite/SQLiteConnection$Operation-IA;)V HSPLandroid/database/sqlite/SQLiteConnection$Operation;->describe(Ljava/lang/StringBuilder;Z)V HSPLandroid/database/sqlite/SQLiteConnection$Operation;->getTraceMethodName()Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->(Landroid/database/sqlite/SQLiteConnectionPool;)V -HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->beginOperation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->beginOperation(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)I HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->dump(Landroid/util/Printer;)V HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperation(I)V HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLog(I)Z -HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLogLocked(I)Z+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool; +HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->endOperationDeferLogLocked(I)Z HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->failOperation(ILjava/lang/Exception;)V HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->getOperationLocked(I)Landroid/database/sqlite/SQLiteConnection$Operation; HSPLandroid/database/sqlite/SQLiteConnection$OperationLog;->newOperationCookieLocked(I)I @@ -5645,46 +5605,46 @@ HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->createStat HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->entryRemoved(ZLjava/lang/String;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->getLastSeqNum()J -HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->getStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; +HSPLandroid/database/sqlite/SQLiteConnection$PreparedStatementCache;->getStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement; HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$fgetmConnectionPtr(Landroid/database/sqlite/SQLiteConnection;)J HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$mfinalizePreparedStatement(Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnection;->-$$Nest$smnativePrepareStatement(JLjava/lang/String;)J -HSPLandroid/database/sqlite/SQLiteConnection;->(Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteDatabaseConfiguration;IZ)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;]Ldalvik/system/CloseGuard;Ldalvik/system/CloseGuard; +HSPLandroid/database/sqlite/SQLiteConnection;->(Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteDatabaseConfiguration;IZ)V HSPLandroid/database/sqlite/SQLiteConnection;->acquirePreparedStatement(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement; -HSPLandroid/database/sqlite/SQLiteConnection;->acquirePreparedStatementLI(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement;+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; -HSPLandroid/database/sqlite/SQLiteConnection;->applyBlockGuardPolicy(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration;]Ldalvik/system/BlockGuard$Policy;Ldalvik/system/BlockGuard$1;,Landroid/os/StrictMode$AndroidBlockGuardPolicy; -HSPLandroid/database/sqlite/SQLiteConnection;->attachCancellationSignal(Landroid/os/CancellationSignal;)V+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal; -HSPLandroid/database/sqlite/SQLiteConnection;->bindArguments(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/Number;Ljava/lang/Integer;,Ljava/lang/Double;,Ljava/lang/Long; +HSPLandroid/database/sqlite/SQLiteConnection;->acquirePreparedStatementLI(Ljava/lang/String;)Landroid/database/sqlite/SQLiteConnection$PreparedStatement; +HSPLandroid/database/sqlite/SQLiteConnection;->applyBlockGuardPolicy(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V +HSPLandroid/database/sqlite/SQLiteConnection;->attachCancellationSignal(Landroid/os/CancellationSignal;)V +HSPLandroid/database/sqlite/SQLiteConnection;->bindArguments(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;[Ljava/lang/Object;)V HSPLandroid/database/sqlite/SQLiteConnection;->canonicalizeSyncMode(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteConnection;->checkDatabaseWiped()V HSPLandroid/database/sqlite/SQLiteConnection;->close()V HSPLandroid/database/sqlite/SQLiteConnection;->collectDbStats(Ljava/util/ArrayList;)V -HSPLandroid/database/sqlite/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal; +HSPLandroid/database/sqlite/SQLiteConnection;->detachCancellationSignal(Landroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteConnection;->dispose(Z)V HSPLandroid/database/sqlite/SQLiteConnection;->dumpUnsafe(Landroid/util/Printer;Z)V -HSPLandroid/database/sqlite/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; -HSPLandroid/database/sqlite/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; -HSPLandroid/database/sqlite/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZLandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; +HSPLandroid/database/sqlite/SQLiteConnection;->execute(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V +HSPLandroid/database/sqlite/SQLiteConnection;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)I +HSPLandroid/database/sqlite/SQLiteConnection;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZLandroid/os/CancellationSignal;)I HSPLandroid/database/sqlite/SQLiteConnection;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J -HSPLandroid/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; -HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String;+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; +HSPLandroid/database/sqlite/SQLiteConnection;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)J +HSPLandroid/database/sqlite/SQLiteConnection;->executeForString(Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteConnection;->executePerConnectionSqlFromConfiguration(I)V HSPLandroid/database/sqlite/SQLiteConnection;->finalize()V HSPLandroid/database/sqlite/SQLiteConnection;->finalizePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnection;->getConnectionId()I HSPLandroid/database/sqlite/SQLiteConnection;->getMainDbStatsUnsafe(IJJ)Landroid/database/sqlite/SQLiteDebug$DbStats; HSPLandroid/database/sqlite/SQLiteConnection;->isCacheable(I)Z -HSPLandroid/database/sqlite/SQLiteConnection;->isPreparedStatementInCache(Ljava/lang/String;)Z+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; +HSPLandroid/database/sqlite/SQLiteConnection;->isPreparedStatementInCache(Ljava/lang/String;)Z HSPLandroid/database/sqlite/SQLiteConnection;->isPrimaryConnection()Z HSPLandroid/database/sqlite/SQLiteConnection;->maybeTruncateWalFile()V HSPLandroid/database/sqlite/SQLiteConnection;->obtainPreparedStatement(Ljava/lang/String;JIIZJ)Landroid/database/sqlite/SQLiteConnection$PreparedStatement; -HSPLandroid/database/sqlite/SQLiteConnection;->open()V+]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; +HSPLandroid/database/sqlite/SQLiteConnection;->open()V HSPLandroid/database/sqlite/SQLiteConnection;->open(Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteDatabaseConfiguration;IZ)Landroid/database/sqlite/SQLiteConnection; -HSPLandroid/database/sqlite/SQLiteConnection;->prepare(Ljava/lang/String;Landroid/database/sqlite/SQLiteStatementInfo;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/database/sqlite/SQLiteConnection$OperationLog;Landroid/database/sqlite/SQLiteConnection$OperationLog; +HSPLandroid/database/sqlite/SQLiteConnection;->prepare(Ljava/lang/String;Landroid/database/sqlite/SQLiteStatementInfo;)V HSPLandroid/database/sqlite/SQLiteConnection;->reconfigure(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLandroid/database/sqlite/SQLiteConnection;->recyclePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnection;->releasePreparedStatement(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V -HSPLandroid/database/sqlite/SQLiteConnection;->releasePreparedStatementLI(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V+]Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; +HSPLandroid/database/sqlite/SQLiteConnection;->releasePreparedStatementLI(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnection;->setAutoCheckpointInterval()V HSPLandroid/database/sqlite/SQLiteConnection;->setCustomFunctionsFromConfiguration()V HSPLandroid/database/sqlite/SQLiteConnection;->setForeignKeyModeFromConfiguration()V @@ -5698,14 +5658,13 @@ HSPLandroid/database/sqlite/SQLiteConnection;->setSyncMode(Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteConnection;->setSyncModeFromConfiguration()V HSPLandroid/database/sqlite/SQLiteConnection;->throwIfStatementForbidden(Landroid/database/sqlite/SQLiteConnection$PreparedStatement;)V HSPLandroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->()V -HSPLandroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;->(Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter-IA;)V HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionAcquired(Landroid/database/sqlite/SQLiteConnection;)V HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionClosed(Landroid/database/sqlite/SQLiteConnection;)V HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->connectionReleased(Landroid/database/sqlite/SQLiteConnection;)V HSPLandroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler;->handleMessage(Landroid/os/Message;)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Landroid/database/sqlite/SQLiteConnection; -HSPLandroid/database/sqlite/SQLiteConnectionPool;->clearAcquiredConnectionsPreparedStatementCache()V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/Iterator;Ljava/util/WeakHashMap$KeyIterator;]Ljava/util/Set;Ljava/util/WeakHashMap$KeySet; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->clearAcquiredConnectionsPreparedStatementCache()V HSPLandroid/database/sqlite/SQLiteConnectionPool;->close()V HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableConnectionLocked(I)Z HSPLandroid/database/sqlite/SQLiteConnectionPool;->closeAvailableConnectionsAndLogExceptionsLocked()V @@ -5719,13 +5678,13 @@ HSPLandroid/database/sqlite/SQLiteConnectionPool;->discardAcquiredConnectionsLoc HSPLandroid/database/sqlite/SQLiteConnectionPool;->dispose(Z)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->dump(Landroid/util/Printer;ZLandroid/util/ArraySet;)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->finalize()V -HSPLandroid/database/sqlite/SQLiteConnectionPool;->finishAcquireConnectionLocked(Landroid/database/sqlite/SQLiteConnection;I)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->finishAcquireConnectionLocked(Landroid/database/sqlite/SQLiteConnection;I)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->getPath()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteConnectionPool;->getPriority(I)I HSPLandroid/database/sqlite/SQLiteConnectionPool;->isSessionBlockingImportantConnectionWaitersLocked(ZI)Z HSPLandroid/database/sqlite/SQLiteConnectionPool;->markAcquiredConnectionsLocked(Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->obtainConnectionWaiterLocked(Ljava/lang/Thread;JIZLjava/lang/String;I)Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter; -HSPLandroid/database/sqlite/SQLiteConnectionPool;->onStatementExecuted(J)V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->onStatementExecuted(J)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->open()V HSPLandroid/database/sqlite/SQLiteConnectionPool;->open(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)Landroid/database/sqlite/SQLiteConnectionPool; HSPLandroid/database/sqlite/SQLiteConnectionPool;->openConnectionLocked(Landroid/database/sqlite/SQLiteDatabaseConfiguration;Z)Landroid/database/sqlite/SQLiteConnection; @@ -5733,24 +5692,24 @@ HSPLandroid/database/sqlite/SQLiteConnectionPool;->reconfigure(Landroid/database HSPLandroid/database/sqlite/SQLiteConnectionPool;->reconfigureAllConnectionsLocked()V HSPLandroid/database/sqlite/SQLiteConnectionPool;->recycleConnectionLocked(Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus;)Z HSPLandroid/database/sqlite/SQLiteConnectionPool;->recycleConnectionWaiterLocked(Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter;)V -HSPLandroid/database/sqlite/SQLiteConnectionPool;->releaseConnection(Landroid/database/sqlite/SQLiteConnection;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->releaseConnection(Landroid/database/sqlite/SQLiteConnection;)V HSPLandroid/database/sqlite/SQLiteConnectionPool;->setMaxConnectionPoolSizeLocked()V HSPLandroid/database/sqlite/SQLiteConnectionPool;->shouldYieldConnection(Landroid/database/sqlite/SQLiteConnection;I)Z HSPLandroid/database/sqlite/SQLiteConnectionPool;->throwIfClosedLocked()V -HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Landroid/database/sqlite/SQLiteConnection;+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquireNonPrimaryConnectionLocked(Ljava/lang/String;I)Landroid/database/sqlite/SQLiteConnection; HSPLandroid/database/sqlite/SQLiteConnectionPool;->tryAcquirePrimaryConnectionLocked(I)Landroid/database/sqlite/SQLiteConnection; -HSPLandroid/database/sqlite/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Landroid/database/sqlite/SQLiteConnection;+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean; +HSPLandroid/database/sqlite/SQLiteConnectionPool;->waitForConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)Landroid/database/sqlite/SQLiteConnection; HSPLandroid/database/sqlite/SQLiteConnectionPool;->wakeConnectionWaitersLocked()V HSPLandroid/database/sqlite/SQLiteConstraintException;->(Ljava/lang/String;)V -HSPLandroid/database/sqlite/SQLiteCursor;->(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery; -HSPLandroid/database/sqlite/SQLiteCursor;->close()V+]Landroid/database/sqlite/SQLiteCursorDriver;Landroid/database/sqlite/SQLiteDirectCursorDriver;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery; -HSPLandroid/database/sqlite/SQLiteCursor;->fillWindow(I)V+]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteCursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteCursor;->(Landroid/database/sqlite/SQLiteCursorDriver;Ljava/lang/String;Landroid/database/sqlite/SQLiteQuery;)V +HSPLandroid/database/sqlite/SQLiteCursor;->close()V +HSPLandroid/database/sqlite/SQLiteCursor;->fillWindow(I)V HSPLandroid/database/sqlite/SQLiteCursor;->finalize()V -HSPLandroid/database/sqlite/SQLiteCursor;->getColumnIndex(Ljava/lang/String;)I+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Map;Ljava/util/HashMap; +HSPLandroid/database/sqlite/SQLiteCursor;->getColumnIndex(Ljava/lang/String;)I HSPLandroid/database/sqlite/SQLiteCursor;->getColumnNames()[Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteCursor;->getCount()I -HSPLandroid/database/sqlite/SQLiteCursor;->getDatabase()Landroid/database/sqlite/SQLiteDatabase;+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery; -HSPLandroid/database/sqlite/SQLiteCursor;->onMove(II)Z+]Landroid/database/CursorWindow;Landroid/database/CursorWindow; +HSPLandroid/database/sqlite/SQLiteCursor;->getDatabase()Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteCursor;->onMove(II)Z HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0;->(Landroid/database/sqlite/SQLiteDatabase;)V HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0;->get()Ljava/lang/Object; HSPLandroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda2;->()V @@ -5775,8 +5734,7 @@ HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmLookasideSl HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmOpenFlags(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)I HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->-$$Nest$fgetmSyncMode(Landroid/database/sqlite/SQLiteDatabase$OpenParams;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->(ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V -HSPLandroid/database/sqlite/SQLiteDatabase$OpenParams;->(ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$OpenParams-IA;)V -HSPLandroid/database/sqlite/SQLiteDatabase;->(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V+]Landroid/database/sqlite/SQLiteDatabaseConfiguration;Landroid/database/sqlite/SQLiteDatabaseConfiguration; +HSPLandroid/database/sqlite/SQLiteDatabase;->(Ljava/lang/String;ILandroid/database/sqlite/SQLiteDatabase$CursorFactory;Landroid/database/DatabaseErrorHandler;IIJLjava/lang/String;Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction()V HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransaction(Landroid/database/sqlite/SQLiteTransactionListener;Z)V HSPLandroid/database/sqlite/SQLiteDatabase;->beginTransactionNonExclusive()V @@ -5797,7 +5755,7 @@ HSPLandroid/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteDatabase;->execSQL(Ljava/lang/String;[Ljava/lang/Object;)V HSPLandroid/database/sqlite/SQLiteDatabase;->executeSql(Ljava/lang/String;[Ljava/lang/Object;)I HSPLandroid/database/sqlite/SQLiteDatabase;->finalize()V -HSPLandroid/database/sqlite/SQLiteDatabase;->findEditTable(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/database/sqlite/SQLiteDatabase;->findEditTable(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteDatabase;->getActiveDatabasePools()Ljava/util/ArrayList; HSPLandroid/database/sqlite/SQLiteDatabase;->getActiveDatabases()Ljava/util/ArrayList; HSPLandroid/database/sqlite/SQLiteDatabase;->getFileTimestamps(Ljava/lang/String;)Ljava/lang/String; @@ -5805,9 +5763,9 @@ HSPLandroid/database/sqlite/SQLiteDatabase;->getMaximumSize()J HSPLandroid/database/sqlite/SQLiteDatabase;->getPageSize()J HSPLandroid/database/sqlite/SQLiteDatabase;->getPath()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadDefaultConnectionFlags(Z)I -HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal; +HSPLandroid/database/sqlite/SQLiteDatabase;->getThreadSession()Landroid/database/sqlite/SQLiteSession; HSPLandroid/database/sqlite/SQLiteDatabase;->getVersion()I -HSPLandroid/database/sqlite/SQLiteDatabase;->inTransaction()Z+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteDatabase;->inTransaction()Z HSPLandroid/database/sqlite/SQLiteDatabase;->insert(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J HSPLandroid/database/sqlite/SQLiteDatabase;->insertOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J HSPLandroid/database/sqlite/SQLiteDatabase;->insertWithOnConflict(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;I)J @@ -5828,11 +5786,11 @@ HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang HSPLandroid/database/sqlite/SQLiteDatabase;->query(Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteDatabase;->query(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; -HSPLandroid/database/sqlite/SQLiteDatabase;->queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteDatabase;->queryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteDatabase;->rawQuery(Ljava/lang/String;[Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; -HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; -HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteCursorDriver;Landroid/database/sqlite/SQLiteDirectCursorDriver;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)Landroid/database/Cursor; +HSPLandroid/database/sqlite/SQLiteDatabase;->rawQueryWithFactory(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteDatabase;->releaseMemory()I HSPLandroid/database/sqlite/SQLiteDatabase;->replace(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J HSPLandroid/database/sqlite/SQLiteDatabase;->replaceOrThrow(Ljava/lang/String;Ljava/lang/String;Landroid/content/ContentValues;)J @@ -5840,26 +5798,26 @@ HSPLandroid/database/sqlite/SQLiteDatabase;->setForeignKeyConstraintsEnabled(Z)V HSPLandroid/database/sqlite/SQLiteDatabase;->setTransactionSuccessful()V HSPLandroid/database/sqlite/SQLiteDatabase;->throwIfNotOpenLocked()V HSPLandroid/database/sqlite/SQLiteDatabase;->update(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;)I -HSPLandroid/database/sqlite/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ContentValues;Landroid/content/ContentValues;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HSPLandroid/database/sqlite/SQLiteDatabase;->updateWithOnConflict(Ljava/lang/String;Landroid/content/ContentValues;Ljava/lang/String;[Ljava/lang/String;I)I HSPLandroid/database/sqlite/SQLiteDatabase;->validateSql(Ljava/lang/String;Landroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedHelper(ZJ)Z HSPLandroid/database/sqlite/SQLiteDatabase;->yieldIfContendedSafely(J)Z HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->(Ljava/lang/String;I)V -HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isInMemoryDb()Z HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isLegacyCompatibilityWalEnabled()Z HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isReadOnlyDatabase()Z HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->isWalEnabledInternal()Z HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->resolveJournalMode()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->resolveSyncMode()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->stripPathForLogs(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->updateParametersFrom(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/database/sqlite/SQLiteDatabaseConfiguration;->updateParametersFrom(Landroid/database/sqlite/SQLiteDatabaseConfiguration;)V HSPLandroid/database/sqlite/SQLiteDebug$NoPreloadHolder;->()V HSPLandroid/database/sqlite/SQLiteDebug;->getDatabaseInfo()Landroid/database/sqlite/SQLiteDebug$PagerStats; HSPLandroid/database/sqlite/SQLiteDebug;->shouldLogSlowQuery(J)Z HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Ljava/lang/String;Landroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->cursorClosed()V -HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor;+]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery; +HSPLandroid/database/sqlite/SQLiteDirectCursorDriver;->query(Landroid/database/sqlite/SQLiteDatabase$CursorFactory;[Ljava/lang/String;)Landroid/database/Cursor; HSPLandroid/database/sqlite/SQLiteException;->(Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteGlobal;->checkDbWipe()Z HSPLandroid/database/sqlite/SQLiteGlobal;->getDefaultJournalMode()Ljava/lang/String; @@ -5876,7 +5834,7 @@ HSPLandroid/database/sqlite/SQLiteOpenHelper;->(Landroid/content/Context;L HSPLandroid/database/sqlite/SQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;IILandroid/database/DatabaseErrorHandler;)V HSPLandroid/database/sqlite/SQLiteOpenHelper;->(Landroid/content/Context;Ljava/lang/String;Landroid/database/sqlite/SQLiteDatabase$CursorFactory;ILandroid/database/DatabaseErrorHandler;)V HSPLandroid/database/sqlite/SQLiteOpenHelper;->close()V -HSPLandroid/database/sqlite/SQLiteOpenHelper;->getDatabaseLocked(Z)Landroid/database/sqlite/SQLiteDatabase;+]Ljava/io/File;Ljava/io/File;]Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteOpenHelper;->getDatabaseLocked(Z)Landroid/database/sqlite/SQLiteDatabase; HSPLandroid/database/sqlite/SQLiteOpenHelper;->getDatabaseName()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteOpenHelper;->getReadableDatabase()Landroid/database/sqlite/SQLiteDatabase; HSPLandroid/database/sqlite/SQLiteOpenHelper;->getWritableDatabase()Landroid/database/sqlite/SQLiteDatabase; @@ -5886,9 +5844,9 @@ HSPLandroid/database/sqlite/SQLiteOpenHelper;->setFilePermissionsForDb(Ljava/lan HSPLandroid/database/sqlite/SQLiteOpenHelper;->setIdleConnectionTimeout(J)V HSPLandroid/database/sqlite/SQLiteOpenHelper;->setOpenParamsBuilder(Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder;)V HSPLandroid/database/sqlite/SQLiteOpenHelper;->setWriteAheadLoggingEnabled(Z)V -HSPLandroid/database/sqlite/SQLiteProgram;->(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteProgram;->(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;Landroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteProgram;->bind(ILjava/lang/Object;)V -HSPLandroid/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V+]Landroid/database/sqlite/SQLiteProgram;Landroid/database/sqlite/SQLiteQuery;,Landroid/database/sqlite/SQLiteStatement; +HSPLandroid/database/sqlite/SQLiteProgram;->bindAllArgsAsStrings([Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteProgram;->bindBlob(I[B)V HSPLandroid/database/sqlite/SQLiteProgram;->bindDouble(ID)V HSPLandroid/database/sqlite/SQLiteProgram;->bindLong(IJ)V @@ -5897,19 +5855,19 @@ HSPLandroid/database/sqlite/SQLiteProgram;->bindString(ILjava/lang/String;)V HSPLandroid/database/sqlite/SQLiteProgram;->clearBindings()V HSPLandroid/database/sqlite/SQLiteProgram;->getBindArgs()[Ljava/lang/Object; HSPLandroid/database/sqlite/SQLiteProgram;->getColumnNames()[Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteProgram;->getConnectionFlags()I+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteProgram;->getConnectionFlags()I HSPLandroid/database/sqlite/SQLiteProgram;->getDatabase()Landroid/database/sqlite/SQLiteDatabase; -HSPLandroid/database/sqlite/SQLiteProgram;->getSession()Landroid/database/sqlite/SQLiteSession;+]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase; +HSPLandroid/database/sqlite/SQLiteProgram;->getSession()Landroid/database/sqlite/SQLiteSession; HSPLandroid/database/sqlite/SQLiteProgram;->getSql()Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteProgram;->onAllReferencesReleased()V+]Landroid/database/sqlite/SQLiteProgram;Landroid/database/sqlite/SQLiteStatement;,Landroid/database/sqlite/SQLiteQuery; +HSPLandroid/database/sqlite/SQLiteProgram;->onAllReferencesReleased()V HSPLandroid/database/sqlite/SQLiteQuery;->(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;Landroid/os/CancellationSignal;)V -HSPLandroid/database/sqlite/SQLiteQuery;->fillWindow(Landroid/database/CursorWindow;IIZ)I+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/CursorWindow;Landroid/database/CursorWindow;]Landroid/database/sqlite/SQLiteQuery;Landroid/database/sqlite/SQLiteQuery; +HSPLandroid/database/sqlite/SQLiteQuery;->fillWindow(Landroid/database/CursorWindow;IIZ)I HSPLandroid/database/sqlite/SQLiteQueryBuilder;->()V -HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendClause(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendClause(Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;)V +HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendColumns(Ljava/lang/StringBuilder;[Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteQueryBuilder;->appendWhere(Ljava/lang/CharSequence;)V HSPLandroid/database/sqlite/SQLiteQueryBuilder;->buildQuery([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteQueryBuilder;->buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/database/sqlite/SQLiteQueryBuilder;->buildQueryString(ZLjava/lang/String;[Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeProjection([Ljava/lang/String;)[Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeSingleProjection(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteQueryBuilder;->computeSingleProjectionOrThrow(Ljava/lang/String;)Ljava/lang/String; @@ -5927,27 +5885,26 @@ HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setStrict(Z)V HSPLandroid/database/sqlite/SQLiteQueryBuilder;->setTables(Ljava/lang/String;)V HSPLandroid/database/sqlite/SQLiteQueryBuilder;->wrap(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteSession$Transaction;->()V -HSPLandroid/database/sqlite/SQLiteSession$Transaction;->(Landroid/database/sqlite/SQLiteSession$Transaction-IA;)V HSPLandroid/database/sqlite/SQLiteSession;->(Landroid/database/sqlite/SQLiteConnectionPool;)V -HSPLandroid/database/sqlite/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool; +HSPLandroid/database/sqlite/SQLiteSession;->acquireConnection(Ljava/lang/String;ILandroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteSession;->beginTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteSession;->beginTransactionUnchecked(ILandroid/database/sqlite/SQLiteTransactionListener;ILandroid/os/CancellationSignal;)V -HSPLandroid/database/sqlite/SQLiteSession;->closeOpenDependents()V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLandroid/database/sqlite/SQLiteSession;->closeOpenDependents()V HSPLandroid/database/sqlite/SQLiteSession;->endTransaction(Landroid/os/CancellationSignal;)V HSPLandroid/database/sqlite/SQLiteSession;->endTransactionUnchecked(Landroid/os/CancellationSignal;Z)V -HSPLandroid/database/sqlite/SQLiteSession;->execute(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection; -HSPLandroid/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection; -HSPLandroid/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZILandroid/os/CancellationSignal;)I+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection; +HSPLandroid/database/sqlite/SQLiteSession;->execute(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)V +HSPLandroid/database/sqlite/SQLiteSession;->executeForChangedRowCount(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)I +HSPLandroid/database/sqlite/SQLiteSession;->executeForCursorWindow(Ljava/lang/String;[Ljava/lang/Object;Landroid/database/CursorWindow;IIZILandroid/os/CancellationSignal;)I HSPLandroid/database/sqlite/SQLiteSession;->executeForLastInsertedRowId(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J HSPLandroid/database/sqlite/SQLiteSession;->executeForLong(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)J HSPLandroid/database/sqlite/SQLiteSession;->executeForString(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Ljava/lang/String; -HSPLandroid/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z+]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal; +HSPLandroid/database/sqlite/SQLiteSession;->executeSpecial(Ljava/lang/String;[Ljava/lang/Object;ILandroid/os/CancellationSignal;)Z HSPLandroid/database/sqlite/SQLiteSession;->hasNestedTransaction()Z HSPLandroid/database/sqlite/SQLiteSession;->hasTransaction()Z HSPLandroid/database/sqlite/SQLiteSession;->obtainTransaction(ILandroid/database/sqlite/SQLiteTransactionListener;)Landroid/database/sqlite/SQLiteSession$Transaction; -HSPLandroid/database/sqlite/SQLiteSession;->prepare(Ljava/lang/String;ILandroid/os/CancellationSignal;Landroid/database/sqlite/SQLiteStatementInfo;)V+]Landroid/database/sqlite/SQLiteConnection;Landroid/database/sqlite/SQLiteConnection;]Landroid/os/CancellationSignal;Landroid/os/CancellationSignal; +HSPLandroid/database/sqlite/SQLiteSession;->prepare(Ljava/lang/String;ILandroid/os/CancellationSignal;Landroid/database/sqlite/SQLiteStatementInfo;)V HSPLandroid/database/sqlite/SQLiteSession;->recycleTransaction(Landroid/database/sqlite/SQLiteSession$Transaction;)V -HSPLandroid/database/sqlite/SQLiteSession;->releaseConnection()V+]Landroid/database/sqlite/SQLiteConnectionPool;Landroid/database/sqlite/SQLiteConnectionPool; +HSPLandroid/database/sqlite/SQLiteSession;->releaseConnection()V HSPLandroid/database/sqlite/SQLiteSession;->setTransactionSuccessful()V HSPLandroid/database/sqlite/SQLiteSession;->throwIfNestedTransaction()V HSPLandroid/database/sqlite/SQLiteSession;->throwIfNoTransaction()V @@ -5955,15 +5912,14 @@ HSPLandroid/database/sqlite/SQLiteSession;->throwIfTransactionMarkedSuccessful() HSPLandroid/database/sqlite/SQLiteSession;->yieldTransaction(JZLandroid/os/CancellationSignal;)Z HSPLandroid/database/sqlite/SQLiteSession;->yieldTransactionUnchecked(JLandroid/os/CancellationSignal;)Z HSPLandroid/database/sqlite/SQLiteStatement;->(Landroid/database/sqlite/SQLiteDatabase;Ljava/lang/String;[Ljava/lang/Object;)V -HSPLandroid/database/sqlite/SQLiteStatement;->execute()V+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement; +HSPLandroid/database/sqlite/SQLiteStatement;->execute()V HSPLandroid/database/sqlite/SQLiteStatement;->executeInsert()J -HSPLandroid/database/sqlite/SQLiteStatement;->executeUpdateDelete()I+]Landroid/database/sqlite/SQLiteSession;Landroid/database/sqlite/SQLiteSession;]Landroid/database/sqlite/SQLiteStatement;Landroid/database/sqlite/SQLiteStatement; +HSPLandroid/database/sqlite/SQLiteStatement;->executeUpdateDelete()I HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForLong()J HSPLandroid/database/sqlite/SQLiteStatement;->simpleQueryForString()Ljava/lang/String; HSPLandroid/database/sqlite/SQLiteStatementInfo;->()V HSPLandroid/ddm/DdmHandle;->putString(Ljava/nio/ByteBuffer;Ljava/lang/String;)V HSPLandroid/ddm/DdmHandleAppName$Names;->(Ljava/lang/String;Ljava/lang/String;)V -HSPLandroid/ddm/DdmHandleAppName$Names;->(Ljava/lang/String;Ljava/lang/String;Landroid/ddm/DdmHandleAppName$Names-IA;)V HSPLandroid/ddm/DdmHandleAppName;->sendAPNM(Ljava/lang/String;Ljava/lang/String;I)V HSPLandroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;I)V HSPLandroid/ddm/DdmHandleAppName;->setAppName(Ljava/lang/String;Ljava/lang/String;I)V @@ -6000,25 +5956,25 @@ HSPLandroid/graphics/BaseCanvas;->throwIfHasHwFeaturesInSwMode(Landroid/graphics HSPLandroid/graphics/BaseCanvas;->throwIfHasHwFeaturesInSwMode(Landroid/graphics/Shader;)V HSPLandroid/graphics/BaseCanvas;->throwIfHwBitmapInSwMode(Landroid/graphics/Bitmap;)V HSPLandroid/graphics/BaseRecordingCanvas;->(J)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V+]Landroid/graphics/BaseRecordingCanvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/graphics/BaseRecordingCanvas;->drawArc(Landroid/graphics/RectF;FFZLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawBitmap(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawBitmap(Landroid/graphics/Bitmap;Landroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Paint;)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawCircle(FFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint; +HSPLandroid/graphics/BaseRecordingCanvas;->drawCircle(FFFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawColor(I)V HSPLandroid/graphics/BaseRecordingCanvas;->drawColor(ILandroid/graphics/PorterDuff$Mode;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawLine(FFFFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawOval(FFFFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawOval(Landroid/graphics/RectF;Landroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawPatch(Landroid/graphics/NinePatch;Landroid/graphics/Rect;Landroid/graphics/Paint;)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/Path;Landroid/graphics/Path; -HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(FFFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint; -HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V+]Landroid/graphics/BaseRecordingCanvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/graphics/BaseRecordingCanvas;->drawPath(Landroid/graphics/Path;Landroid/graphics/Paint;)V +HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(FFFFLandroid/graphics/Paint;)V +HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(Landroid/graphics/Rect;Landroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawRect(Landroid/graphics/RectF;Landroid/graphics/Paint;)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(FFFFFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint; +HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(FFFFFFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawRoundRect(Landroid/graphics/RectF;FFLandroid/graphics/Paint;)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/Layout$Ellipsizer; +HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/CharSequence;IIFFLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawText(Ljava/lang/String;FFLandroid/graphics/Paint;)V -HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/SpannableString; +HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun(Ljava/lang/CharSequence;IIIIFFZLandroid/graphics/Paint;)V HSPLandroid/graphics/BaseRecordingCanvas;->drawTextRun([CIIIIFFZLandroid/graphics/Paint;)V HSPLandroid/graphics/Bitmap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Bitmap; HSPLandroid/graphics/Bitmap$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -6257,6 +6213,8 @@ HSPLandroid/graphics/Compatibility;->()V HSPLandroid/graphics/Compatibility;->getTargetSdkVersion()I HSPLandroid/graphics/Compatibility;->setTargetSdkVersion(I)V HSPLandroid/graphics/DrawFilter;->()V +HSPLandroid/graphics/FontListParser;->readFamily(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/util/Map;Z)Landroid/text/FontConfig$FontFamily; +HSPLandroid/graphics/FontListParser;->readFont(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;Ljava/util/Map;Z)Landroid/text/FontConfig$Font; HSPLandroid/graphics/FrameInfo;->()V HSPLandroid/graphics/FrameInfo;->addFlags(J)V HSPLandroid/graphics/FrameInfo;->markAnimationsStart()V @@ -6323,8 +6281,8 @@ HSPLandroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0;-> HSPLandroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0;->run()V HSPLandroid/graphics/HardwareRendererObserver;->(Landroid/graphics/HardwareRendererObserver$OnFrameMetricsAvailableListener;[JLandroid/os/Handler;Z)V HSPLandroid/graphics/HardwareRendererObserver;->getNativeInstance()J -HSPLandroid/graphics/HardwareRendererObserver;->invokeDataAvailable(Ljava/lang/ref/WeakReference;)Z+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; -HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V+]Landroid/os/Handler;Landroid/os/Handler;,Landroid/view/ViewRootImpl$ViewRootHandler; +HSPLandroid/graphics/HardwareRendererObserver;->invokeDataAvailable(Ljava/lang/ref/WeakReference;)Z +HSPLandroid/graphics/HardwareRendererObserver;->notifyDataAvailable()V HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->(Landroid/content/res/AssetManager$AssetInputStream;Landroid/content/res/Resources;Landroid/util/TypedValue;)V HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->createImageDecoder(Z)Landroid/graphics/ImageDecoder; HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->getDensity()I @@ -6333,13 +6291,11 @@ HSPLandroid/graphics/ImageDecoder$AssetInputStreamSource;->toString()Ljava/lang/ HSPLandroid/graphics/ImageDecoder$ImageDecoderSourceTrace;->(Landroid/graphics/ImageDecoder;)V HSPLandroid/graphics/ImageDecoder$ImageDecoderSourceTrace;->close()V HSPLandroid/graphics/ImageDecoder$ImageInfo;->(Landroid/util/Size;ZLjava/lang/String;Landroid/graphics/ColorSpace;)V -HSPLandroid/graphics/ImageDecoder$ImageInfo;->(Landroid/util/Size;ZLjava/lang/String;Landroid/graphics/ColorSpace;Landroid/graphics/ImageDecoder$ImageInfo-IA;)V HSPLandroid/graphics/ImageDecoder$InputStreamSource;->(Landroid/content/res/Resources;Ljava/io/InputStream;I)V HSPLandroid/graphics/ImageDecoder$InputStreamSource;->createImageDecoder(Z)Landroid/graphics/ImageDecoder; HSPLandroid/graphics/ImageDecoder$InputStreamSource;->getDensity()I HSPLandroid/graphics/ImageDecoder$InputStreamSource;->getResources()Landroid/content/res/Resources; HSPLandroid/graphics/ImageDecoder$Source;->()V -HSPLandroid/graphics/ImageDecoder$Source;->(Landroid/graphics/ImageDecoder$Source-IA;)V HSPLandroid/graphics/ImageDecoder$Source;->computeDstDensity()I HSPLandroid/graphics/ImageDecoder;->-$$Nest$smdescribeDecoderForTrace(Landroid/graphics/ImageDecoder;)Ljava/lang/String; HSPLandroid/graphics/ImageDecoder;->(JIIZZ)V @@ -6369,7 +6325,7 @@ HSPLandroid/graphics/Insets$1;->createFromParcel(Landroid/os/Parcel;)Landroid/gr HSPLandroid/graphics/Insets$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/graphics/Insets;->(IIII)V HSPLandroid/graphics/Insets;->(IIIILandroid/graphics/Insets-IA;)V -HSPLandroid/graphics/Insets;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Insets; +HSPLandroid/graphics/Insets;->equals(Ljava/lang/Object;)Z HSPLandroid/graphics/Insets;->hashCode()I HSPLandroid/graphics/Insets;->max(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets; HSPLandroid/graphics/Insets;->min(Landroid/graphics/Insets;Landroid/graphics/Insets;)Landroid/graphics/Insets; @@ -6389,11 +6345,11 @@ HSPLandroid/graphics/LeakyTypefaceStorage;->writeTypefaceToParcel(Landroid/graph HSPLandroid/graphics/LinearGradient;->(FFFFIILandroid/graphics/Shader$TileMode;)V HSPLandroid/graphics/LinearGradient;->(FFFFJJLandroid/graphics/Shader$TileMode;)V HSPLandroid/graphics/LinearGradient;->(FFFF[I[FLandroid/graphics/Shader$TileMode;)V -HSPLandroid/graphics/LinearGradient;->(FFFF[J[FLandroid/graphics/Shader$TileMode;)V+][J[J +HSPLandroid/graphics/LinearGradient;->(FFFF[J[FLandroid/graphics/Shader$TileMode;)V HSPLandroid/graphics/LinearGradient;->(FFFF[J[FLandroid/graphics/Shader$TileMode;Landroid/graphics/ColorSpace;)V HSPLandroid/graphics/LinearGradient;->createNativeInstance(JZ)J HSPLandroid/graphics/MaskFilter;->finalize()V -HSPLandroid/graphics/Matrix;->()V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry; +HSPLandroid/graphics/Matrix;->()V HSPLandroid/graphics/Matrix;->(Landroid/graphics/Matrix;)V HSPLandroid/graphics/Matrix;->checkPointArrays([FI[FII)V HSPLandroid/graphics/Matrix;->equals(Ljava/lang/Object;)Z @@ -6402,7 +6358,7 @@ HSPLandroid/graphics/Matrix;->invert(Landroid/graphics/Matrix;)Z HSPLandroid/graphics/Matrix;->isIdentity()Z HSPLandroid/graphics/Matrix;->mapPoints([F)V HSPLandroid/graphics/Matrix;->mapPoints([FI[FII)V -HSPLandroid/graphics/Matrix;->mapRect(Landroid/graphics/RectF;)Z+]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/graphics/Matrix;->mapRect(Landroid/graphics/RectF;)Z HSPLandroid/graphics/Matrix;->mapRect(Landroid/graphics/RectF;Landroid/graphics/RectF;)Z HSPLandroid/graphics/Matrix;->ni()J HSPLandroid/graphics/Matrix;->postConcat(Landroid/graphics/Matrix;)Z @@ -6438,18 +6394,18 @@ HSPLandroid/graphics/Outline;->()V HSPLandroid/graphics/Outline;->isEmpty()Z HSPLandroid/graphics/Outline;->setAlpha(F)V HSPLandroid/graphics/Outline;->setConvexPath(Landroid/graphics/Path;)V -HSPLandroid/graphics/Outline;->setEmpty()V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/graphics/Outline;->setEmpty()V HSPLandroid/graphics/Outline;->setOval(IIII)V HSPLandroid/graphics/Outline;->setOval(Landroid/graphics/Rect;)V HSPLandroid/graphics/Outline;->setPath(Landroid/graphics/Path;)V -HSPLandroid/graphics/Outline;->setRect(IIII)V+]Landroid/graphics/Outline;Landroid/graphics/Outline; +HSPLandroid/graphics/Outline;->setRect(IIII)V HSPLandroid/graphics/Outline;->setRect(Landroid/graphics/Rect;)V -HSPLandroid/graphics/Outline;->setRoundRect(IIIIF)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/Outline;Landroid/graphics/Outline; +HSPLandroid/graphics/Outline;->setRoundRect(IIIIF)V HSPLandroid/graphics/Outline;->setRoundRect(Landroid/graphics/Rect;F)V HSPLandroid/graphics/Paint$FontMetrics;->()V HSPLandroid/graphics/Paint$FontMetricsInt;->()V HSPLandroid/graphics/Paint;->()V -HSPLandroid/graphics/Paint;->(I)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;,Landroid/text/TextPaint;]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry; +HSPLandroid/graphics/Paint;->(I)V HSPLandroid/graphics/Paint;->(Landroid/graphics/Paint;)V HSPLandroid/graphics/Paint;->ascent()F HSPLandroid/graphics/Paint;->descent()F @@ -6461,14 +6417,14 @@ HSPLandroid/graphics/Paint;->getFlags()I HSPLandroid/graphics/Paint;->getFontFeatureSettings()Ljava/lang/String; HSPLandroid/graphics/Paint;->getFontMetrics()Landroid/graphics/Paint$FontMetrics; HSPLandroid/graphics/Paint;->getFontMetrics(Landroid/graphics/Paint$FontMetrics;)F -HSPLandroid/graphics/Paint;->getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt;+]Landroid/graphics/Paint;Landroid/text/TextPaint; +HSPLandroid/graphics/Paint;->getFontMetricsInt()Landroid/graphics/Paint$FontMetricsInt; HSPLandroid/graphics/Paint;->getFontMetricsInt(Landroid/graphics/Paint$FontMetricsInt;)I HSPLandroid/graphics/Paint;->getFontMetricsInt(Ljava/lang/CharSequence;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V HSPLandroid/graphics/Paint;->getFontVariationSettings()Ljava/lang/String; HSPLandroid/graphics/Paint;->getHinting()I HSPLandroid/graphics/Paint;->getLetterSpacing()F HSPLandroid/graphics/Paint;->getMaskFilter()Landroid/graphics/MaskFilter; -HSPLandroid/graphics/Paint;->getNativeInstance()J+]Landroid/graphics/ColorFilter;Landroid/graphics/PorterDuffColorFilter;,Landroid/graphics/BlendModeColorFilter;]Landroid/graphics/Paint;missing_types]Landroid/graphics/Shader;Landroid/graphics/LinearGradient;,Landroid/graphics/drawable/RippleShader;,Landroid/graphics/BitmapShader;,Landroid/graphics/RadialGradient; +HSPLandroid/graphics/Paint;->getNativeInstance()J HSPLandroid/graphics/Paint;->getRunAdvance(Ljava/lang/CharSequence;IIIIZI)F HSPLandroid/graphics/Paint;->getRunAdvance([CIIIIZI)F HSPLandroid/graphics/Paint;->getRunCharacterAdvance(Ljava/lang/CharSequence;IIIIZI[FI)F @@ -6486,7 +6442,7 @@ HSPLandroid/graphics/Paint;->getStrokeMiter()F HSPLandroid/graphics/Paint;->getStrokeWidth()F HSPLandroid/graphics/Paint;->getStyle()Landroid/graphics/Paint$Style; HSPLandroid/graphics/Paint;->getTextAlign()Landroid/graphics/Paint$Align; -HSPLandroid/graphics/Paint;->getTextBounds(Ljava/lang/CharSequence;IILandroid/graphics/Rect;)V+]Landroid/graphics/Paint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/SpannableString; +HSPLandroid/graphics/Paint;->getTextBounds(Ljava/lang/CharSequence;IILandroid/graphics/Rect;)V HSPLandroid/graphics/Paint;->getTextBounds(Ljava/lang/String;IILandroid/graphics/Rect;)V HSPLandroid/graphics/Paint;->getTextBounds([CIILandroid/graphics/Rect;)V HSPLandroid/graphics/Paint;->getTextLocale()Ljava/util/Locale; @@ -6506,7 +6462,7 @@ HSPLandroid/graphics/Paint;->installXfermode(Landroid/graphics/Xfermode;)Landroi HSPLandroid/graphics/Paint;->isAntiAlias()Z HSPLandroid/graphics/Paint;->isDither()Z HSPLandroid/graphics/Paint;->isElegantTextHeight()Z -HSPLandroid/graphics/Paint;->isFilterBitmap()Z+]Landroid/graphics/Paint;missing_types +HSPLandroid/graphics/Paint;->isFilterBitmap()Z HSPLandroid/graphics/Paint;->measureText(Ljava/lang/CharSequence;II)F HSPLandroid/graphics/Paint;->measureText(Ljava/lang/String;)F HSPLandroid/graphics/Paint;->measureText(Ljava/lang/String;II)F @@ -6540,14 +6496,14 @@ HSPLandroid/graphics/Paint;->setStrokeMiter(F)V HSPLandroid/graphics/Paint;->setStrokeWidth(F)V HSPLandroid/graphics/Paint;->setStyle(Landroid/graphics/Paint$Style;)V HSPLandroid/graphics/Paint;->setTextAlign(Landroid/graphics/Paint$Align;)V -HSPLandroid/graphics/Paint;->setTextLocales(Landroid/os/LocaleList;)V+]Landroid/os/LocaleList;Landroid/os/LocaleList; +HSPLandroid/graphics/Paint;->setTextLocales(Landroid/os/LocaleList;)V HSPLandroid/graphics/Paint;->setTextScaleX(F)V HSPLandroid/graphics/Paint;->setTextSize(F)V HSPLandroid/graphics/Paint;->setTextSkewX(F)V HSPLandroid/graphics/Paint;->setTypeface(Landroid/graphics/Typeface;)Landroid/graphics/Typeface; HSPLandroid/graphics/Paint;->setUnderlineText(Z)V HSPLandroid/graphics/Paint;->setXfermode(Landroid/graphics/Xfermode;)Landroid/graphics/Xfermode; -HSPLandroid/graphics/Paint;->syncTextLocalesWithMinikin()V+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/os/LocaleList;Landroid/os/LocaleList; +HSPLandroid/graphics/Paint;->syncTextLocalesWithMinikin()V HSPLandroid/graphics/PaintFlagsDrawFilter;->(II)V HSPLandroid/graphics/Path;->()V HSPLandroid/graphics/Path;->(Landroid/graphics/Path;)V @@ -6556,7 +6512,7 @@ HSPLandroid/graphics/Path;->addArc(Landroid/graphics/RectF;FF)V HSPLandroid/graphics/Path;->addCircle(FFFLandroid/graphics/Path$Direction;)V HSPLandroid/graphics/Path;->addOval(FFFFLandroid/graphics/Path$Direction;)V HSPLandroid/graphics/Path;->addOval(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V -HSPLandroid/graphics/Path;->addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/graphics/Path;->addPath(Landroid/graphics/Path;Landroid/graphics/Matrix;)V HSPLandroid/graphics/Path;->addRect(FFFFLandroid/graphics/Path$Direction;)V HSPLandroid/graphics/Path;->addRect(Landroid/graphics/RectF;Landroid/graphics/Path$Direction;)V HSPLandroid/graphics/Path;->addRoundRect(FFFFFFLandroid/graphics/Path$Direction;)V @@ -6566,9 +6522,9 @@ HSPLandroid/graphics/Path;->addRoundRect(Landroid/graphics/RectF;[FLandroid/grap HSPLandroid/graphics/Path;->approximate(F)[F HSPLandroid/graphics/Path;->arcTo(FFFFFFZ)V HSPLandroid/graphics/Path;->arcTo(Landroid/graphics/RectF;FF)V -HSPLandroid/graphics/Path;->arcTo(Landroid/graphics/RectF;FFZ)V+]Landroid/graphics/Path;Landroid/graphics/Path; +HSPLandroid/graphics/Path;->arcTo(Landroid/graphics/RectF;FFZ)V HSPLandroid/graphics/Path;->close()V -HSPLandroid/graphics/Path;->computeBounds(Landroid/graphics/RectF;Z)V+]Landroid/graphics/Path;Landroid/graphics/Path; +HSPLandroid/graphics/Path;->computeBounds(Landroid/graphics/RectF;Z)V HSPLandroid/graphics/Path;->cubicTo(FFFFFF)V HSPLandroid/graphics/Path;->getFillType()Landroid/graphics/Path$FillType; HSPLandroid/graphics/Path;->isConvex()Z @@ -6580,11 +6536,11 @@ HSPLandroid/graphics/Path;->op(Landroid/graphics/Path;Landroid/graphics/Path$Op; HSPLandroid/graphics/Path;->op(Landroid/graphics/Path;Landroid/graphics/Path;Landroid/graphics/Path$Op;)Z HSPLandroid/graphics/Path;->rLineTo(FF)V HSPLandroid/graphics/Path;->readOnlyNI()J -HSPLandroid/graphics/Path;->reset()V+]Landroid/graphics/Path;Landroid/graphics/Path; +HSPLandroid/graphics/Path;->reset()V HSPLandroid/graphics/Path;->rewind()V HSPLandroid/graphics/Path;->set(Landroid/graphics/Path;)V HSPLandroid/graphics/Path;->setFillType(Landroid/graphics/Path$FillType;)V -HSPLandroid/graphics/Path;->transform(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/graphics/Path;->transform(Landroid/graphics/Matrix;)V HSPLandroid/graphics/Path;->transform(Landroid/graphics/Matrix;Landroid/graphics/Path;)V HSPLandroid/graphics/PathMeasure;->()V HSPLandroid/graphics/PathMeasure;->(Landroid/graphics/Path;Z)V @@ -6607,7 +6563,7 @@ HSPLandroid/graphics/Point;->()V HSPLandroid/graphics/Point;->(II)V HSPLandroid/graphics/Point;->(Landroid/graphics/Point;)V HSPLandroid/graphics/Point;->equals(II)Z -HSPLandroid/graphics/Point;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Point; +HSPLandroid/graphics/Point;->equals(Ljava/lang/Object;)Z HSPLandroid/graphics/Point;->hashCode()I HSPLandroid/graphics/Point;->offset(II)V HSPLandroid/graphics/Point;->readFromParcel(Landroid/os/Parcel;)V @@ -6641,8 +6597,8 @@ HSPLandroid/graphics/RecordingCanvas;->finishRecording(Landroid/graphics/RenderN HSPLandroid/graphics/RecordingCanvas;->getHeight()I HSPLandroid/graphics/RecordingCanvas;->getWidth()I HSPLandroid/graphics/RecordingCanvas;->isHardwareAccelerated()Z -HSPLandroid/graphics/RecordingCanvas;->obtain(Landroid/graphics/RenderNode;II)Landroid/graphics/RecordingCanvas;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; -HSPLandroid/graphics/RecordingCanvas;->recycle()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; +HSPLandroid/graphics/RecordingCanvas;->obtain(Landroid/graphics/RenderNode;II)Landroid/graphics/RecordingCanvas; +HSPLandroid/graphics/RecordingCanvas;->recycle()V HSPLandroid/graphics/RecordingCanvas;->throwIfCannotDraw(Landroid/graphics/Bitmap;)V HSPLandroid/graphics/Rect$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Rect; HSPLandroid/graphics/Rect$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -6655,7 +6611,7 @@ HSPLandroid/graphics/Rect;->centerX()I HSPLandroid/graphics/Rect;->centerY()I HSPLandroid/graphics/Rect;->contains(II)Z HSPLandroid/graphics/Rect;->contains(Landroid/graphics/Rect;)Z -HSPLandroid/graphics/Rect;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/graphics/Rect; +HSPLandroid/graphics/Rect;->equals(Ljava/lang/Object;)Z HSPLandroid/graphics/Rect;->exactCenterX()F HSPLandroid/graphics/Rect;->exactCenterY()F HSPLandroid/graphics/Rect;->hashCode()I @@ -6695,7 +6651,7 @@ HSPLandroid/graphics/RectF;->equals(Ljava/lang/Object;)Z HSPLandroid/graphics/RectF;->height()F HSPLandroid/graphics/RectF;->inset(FF)V HSPLandroid/graphics/RectF;->intersect(FFFF)Z -HSPLandroid/graphics/RectF;->intersect(Landroid/graphics/RectF;)Z+]Landroid/graphics/RectF;Landroid/graphics/RectF; +HSPLandroid/graphics/RectF;->intersect(Landroid/graphics/RectF;)Z HSPLandroid/graphics/RectF;->isEmpty()Z HSPLandroid/graphics/RectF;->offset(FF)V HSPLandroid/graphics/RectF;->offsetTo(FF)V @@ -6706,7 +6662,7 @@ HSPLandroid/graphics/RectF;->set(Landroid/graphics/Rect;)V HSPLandroid/graphics/RectF;->set(Landroid/graphics/RectF;)V HSPLandroid/graphics/RectF;->setEmpty()V HSPLandroid/graphics/RectF;->union(FFFF)V -HSPLandroid/graphics/RectF;->union(Landroid/graphics/RectF;)V+]Landroid/graphics/RectF;Landroid/graphics/RectF; +HSPLandroid/graphics/RectF;->union(Landroid/graphics/RectF;)V HSPLandroid/graphics/RectF;->width()F HSPLandroid/graphics/Region$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/Region; HSPLandroid/graphics/Region$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -6742,10 +6698,10 @@ HSPLandroid/graphics/RenderNode;->beginRecording(II)Landroid/graphics/RecordingC HSPLandroid/graphics/RenderNode;->clearStretch()Z HSPLandroid/graphics/RenderNode;->create(Ljava/lang/String;Landroid/graphics/RenderNode$AnimationHost;)Landroid/graphics/RenderNode; HSPLandroid/graphics/RenderNode;->discardDisplayList()V -HSPLandroid/graphics/RenderNode;->endRecording()V+]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/graphics/RenderNode;->endRecording()V HSPLandroid/graphics/RenderNode;->getClipToOutline()Z HSPLandroid/graphics/RenderNode;->getElevation()F -HSPLandroid/graphics/RenderNode;->getMatrix(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/graphics/RenderNode;->getMatrix(Landroid/graphics/Matrix;)V HSPLandroid/graphics/RenderNode;->getPivotY()F HSPLandroid/graphics/RenderNode;->getRotationX()F HSPLandroid/graphics/RenderNode;->getRotationY()F @@ -6817,7 +6773,7 @@ HSPLandroid/graphics/TextureLayer;->(Landroid/graphics/HardwareRenderer;J) HSPLandroid/graphics/TextureLayer;->close()V HSPLandroid/graphics/TextureLayer;->detachSurfaceTexture()V HSPLandroid/graphics/Typeface$Builder;->build()Landroid/graphics/Typeface; -HSPLandroid/graphics/Typeface$Builder;->createAssetUid(Landroid/content/res/AssetManager;Ljava/lang/String;I[Landroid/graphics/fonts/FontVariationAxis;IILjava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/content/res/AssetManager;Landroid/content/res/AssetManager; +HSPLandroid/graphics/Typeface$Builder;->createAssetUid(Landroid/content/res/AssetManager;Ljava/lang/String;I[Landroid/graphics/fonts/FontVariationAxis;IILjava/lang/String;)Ljava/lang/String; HSPLandroid/graphics/Typeface$CustomFallbackBuilder;->(Landroid/graphics/fonts/FontFamily;)V HSPLandroid/graphics/Typeface$CustomFallbackBuilder;->build()Landroid/graphics/Typeface; HSPLandroid/graphics/Typeface$CustomFallbackBuilder;->setStyle(Landroid/graphics/fonts/FontStyle;)Landroid/graphics/Typeface$CustomFallbackBuilder; @@ -6942,7 +6898,7 @@ HSPLandroid/graphics/drawable/AnimatedVectorDrawable$2;->onAnimationEnd(Landroid HSPLandroid/graphics/drawable/AnimatedVectorDrawable$2;->onAnimationStart(Landroid/animation/Animator;)V HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;->(IFLjava/lang/String;)V HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState$PendingAnimator;->newInstance(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/animation/Animator; -HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->(Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;Landroid/graphics/drawable/Drawable$Callback;Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/Drawable$ConstantState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/graphics/drawable/VectorDrawable;Landroid/graphics/drawable/VectorDrawable; +HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->(Landroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;Landroid/graphics/drawable/Drawable$Callback;Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->addPendingAnimator(IFLjava/lang/String;)V HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->addTargetAnimator(Ljava/lang/String;Landroid/animation/Animator;)V HSPLandroid/graphics/drawable/AnimatedVectorDrawable$AnimatedVectorDrawableState;->canApplyTheme()Z @@ -7096,7 +7052,7 @@ HSPLandroid/graphics/drawable/ColorDrawable;->(Landroid/graphics/drawable/ HSPLandroid/graphics/drawable/ColorDrawable;->(Landroid/graphics/drawable/ColorDrawable$ColorState;Landroid/content/res/Resources;Landroid/graphics/drawable/ColorDrawable-IA;)V HSPLandroid/graphics/drawable/ColorDrawable;->canApplyTheme()Z HSPLandroid/graphics/drawable/ColorDrawable;->clearMutated()V -HSPLandroid/graphics/drawable/ColorDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/drawable/ColorDrawable;Landroid/graphics/drawable/ColorDrawable;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/graphics/drawable/ColorDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/ColorDrawable;->getAlpha()I HSPLandroid/graphics/drawable/ColorDrawable;->getChangingConfigurations()I HSPLandroid/graphics/drawable/ColorDrawable;->getColor()I @@ -7111,7 +7067,7 @@ HSPLandroid/graphics/drawable/ColorDrawable;->setAlpha(I)V HSPLandroid/graphics/drawable/ColorDrawable;->setColor(I)V HSPLandroid/graphics/drawable/ColorDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V HSPLandroid/graphics/drawable/ColorDrawable;->setTintList(Landroid/content/res/ColorStateList;)V -HSPLandroid/graphics/drawable/ColorDrawable;->updateLocalState(Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/ColorDrawable;Landroid/graphics/drawable/ColorDrawable; +HSPLandroid/graphics/drawable/ColorDrawable;->updateLocalState(Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/ColorDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/Drawable$ConstantState;->()V HSPLandroid/graphics/drawable/Drawable$ConstantState;->canApplyTheme()Z @@ -7127,7 +7083,7 @@ HSPLandroid/graphics/drawable/Drawable;->createFromXmlForDensity(Landroid/conten HSPLandroid/graphics/drawable/Drawable;->createFromXmlInner(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; HSPLandroid/graphics/drawable/Drawable;->createFromXmlInnerForDensity(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable; HSPLandroid/graphics/drawable/Drawable;->getBounds()Landroid/graphics/Rect; -HSPLandroid/graphics/drawable/Drawable;->getCallback()Landroid/graphics/drawable/Drawable$Callback;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; +HSPLandroid/graphics/drawable/Drawable;->getCallback()Landroid/graphics/drawable/Drawable$Callback; HSPLandroid/graphics/drawable/Drawable;->getChangingConfigurations()I HSPLandroid/graphics/drawable/Drawable;->getColorFilter()Landroid/graphics/ColorFilter; HSPLandroid/graphics/drawable/Drawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState; @@ -7137,14 +7093,14 @@ HSPLandroid/graphics/drawable/Drawable;->getIntrinsicHeight()I HSPLandroid/graphics/drawable/Drawable;->getIntrinsicWidth()I HSPLandroid/graphics/drawable/Drawable;->getLayoutDirection()I HSPLandroid/graphics/drawable/Drawable;->getLevel()I -HSPLandroid/graphics/drawable/Drawable;->getMinimumHeight()I+]Landroid/graphics/drawable/Drawable;missing_types -HSPLandroid/graphics/drawable/Drawable;->getMinimumWidth()I+]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/graphics/drawable/Drawable;->getMinimumHeight()I +HSPLandroid/graphics/drawable/Drawable;->getMinimumWidth()I HSPLandroid/graphics/drawable/Drawable;->getOutline(Landroid/graphics/Outline;)V HSPLandroid/graphics/drawable/Drawable;->getPadding(Landroid/graphics/Rect;)Z HSPLandroid/graphics/drawable/Drawable;->getState()[I HSPLandroid/graphics/drawable/Drawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/Drawable;->inflateWithAttributes(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/TypedArray;I)V -HSPLandroid/graphics/drawable/Drawable;->invalidateSelf()V+]Landroid/graphics/drawable/Drawable$Callback;missing_types]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/graphics/drawable/Drawable;->invalidateSelf()V HSPLandroid/graphics/drawable/Drawable;->isProjected()Z HSPLandroid/graphics/drawable/Drawable;->isStateful()Z HSPLandroid/graphics/drawable/Drawable;->isVisible()Z @@ -7162,7 +7118,7 @@ HSPLandroid/graphics/drawable/Drawable;->scaleFromDensity(IIIZ)I HSPLandroid/graphics/drawable/Drawable;->scheduleSelf(Ljava/lang/Runnable;J)V HSPLandroid/graphics/drawable/Drawable;->setAutoMirrored(Z)V HSPLandroid/graphics/drawable/Drawable;->setBounds(IIII)V -HSPLandroid/graphics/drawable/Drawable;->setBounds(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/graphics/drawable/Drawable;->setBounds(Landroid/graphics/Rect;)V HSPLandroid/graphics/drawable/Drawable;->setCallback(Landroid/graphics/drawable/Drawable$Callback;)V HSPLandroid/graphics/drawable/Drawable;->setChangingConfigurations(I)V HSPLandroid/graphics/drawable/Drawable;->setColorFilter(ILandroid/graphics/PorterDuff$Mode;)V @@ -7171,20 +7127,19 @@ HSPLandroid/graphics/drawable/Drawable;->setHotspot(FF)V HSPLandroid/graphics/drawable/Drawable;->setLayoutDirection(I)Z HSPLandroid/graphics/drawable/Drawable;->setLevel(I)Z HSPLandroid/graphics/drawable/Drawable;->setSrcDensityOverride(I)V -HSPLandroid/graphics/drawable/Drawable;->setState([I)Z+]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/graphics/drawable/Drawable;->setState([I)Z HSPLandroid/graphics/drawable/Drawable;->setTint(I)V HSPLandroid/graphics/drawable/Drawable;->setTintList(Landroid/content/res/ColorStateList;)V HSPLandroid/graphics/drawable/Drawable;->setTintMode(Landroid/graphics/PorterDuff$Mode;)V HSPLandroid/graphics/drawable/Drawable;->setVisible(ZZ)Z HSPLandroid/graphics/drawable/Drawable;->unscheduleSelf(Ljava/lang/Runnable;)V -HSPLandroid/graphics/drawable/Drawable;->updateBlendModeFilter(Landroid/graphics/BlendModeColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter;+]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/graphics/BlendModeColorFilter;Landroid/graphics/BlendModeColorFilter;]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/graphics/drawable/Drawable;->updateBlendModeFilter(Landroid/graphics/BlendModeColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/BlendMode;)Landroid/graphics/BlendModeColorFilter; HSPLandroid/graphics/drawable/Drawable;->updateTintFilter(Landroid/graphics/PorterDuffColorFilter;Landroid/content/res/ColorStateList;Landroid/graphics/PorterDuff$Mode;)Landroid/graphics/PorterDuffColorFilter; HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->()V -HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->(Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback-IA;)V HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->unwrap()Landroid/graphics/drawable/Drawable$Callback; HSPLandroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;->wrap(Landroid/graphics/drawable/Drawable$Callback;)Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback; -HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;Landroid/graphics/drawable/DrawableContainer;Landroid/content/res/Resources;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->(Landroid/graphics/drawable/DrawableContainer$DrawableContainerState;Landroid/graphics/drawable/DrawableContainer;Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->addChild(Landroid/graphics/drawable/Drawable;)I HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->applyTheme(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/DrawableContainer$DrawableContainerState;->canApplyTheme()Z @@ -7227,7 +7182,7 @@ HSPLandroid/graphics/drawable/DrawableContainer;->getOpacity()I HSPLandroid/graphics/drawable/DrawableContainer;->getOpticalInsets()Landroid/graphics/Insets; HSPLandroid/graphics/drawable/DrawableContainer;->getOutline(Landroid/graphics/Outline;)V HSPLandroid/graphics/drawable/DrawableContainer;->getPadding(Landroid/graphics/Rect;)Z -HSPLandroid/graphics/drawable/DrawableContainer;->initializeDrawableForDisplay(Landroid/graphics/drawable/Drawable;)V+]Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback;]Landroid/graphics/drawable/DrawableContainer;Landroid/graphics/drawable/AnimatedStateListDrawable;,Lcom/android/internal/graphics/drawable/AnimationScaleListDrawable;,Landroid/graphics/drawable/StateListDrawable;]Landroid/graphics/drawable/Drawable;megamorphic_types +HSPLandroid/graphics/drawable/DrawableContainer;->initializeDrawableForDisplay(Landroid/graphics/drawable/Drawable;)V HSPLandroid/graphics/drawable/DrawableContainer;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/graphics/drawable/DrawableContainer;->isAutoMirrored()Z HSPLandroid/graphics/drawable/DrawableContainer;->isStateful()Z @@ -7294,7 +7249,7 @@ HSPLandroid/graphics/drawable/DrawableWrapper;->updateLocalState(Landroid/conten HSPLandroid/graphics/drawable/DrawableWrapper;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->-$$Nest$mcomputeOpacity(Landroid/graphics/drawable/GradientDrawable$GradientState;)V HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->(Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/content/res/Resources;)V -HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V+]Landroid/graphics/drawable/GradientDrawable$GradientState;Landroid/graphics/drawable/GradientDrawable$GradientState; +HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->(Landroid/graphics/drawable/GradientDrawable$Orientation;[I)V HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->applyDensityScaling(II)V HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->canApplyTheme()Z HSPLandroid/graphics/drawable/GradientDrawable$GradientState;->computeOpacity()V @@ -7315,7 +7270,7 @@ HSPLandroid/graphics/drawable/GradientDrawable;->applyTheme(Landroid/content/res HSPLandroid/graphics/drawable/GradientDrawable;->applyThemeChildElements(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/GradientDrawable;->canApplyTheme()Z HSPLandroid/graphics/drawable/GradientDrawable;->clearMutated()V -HSPLandroid/graphics/drawable/GradientDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;,Landroid/graphics/Canvas; +HSPLandroid/graphics/drawable/GradientDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/GradientDrawable;->ensureValidRect()Z HSPLandroid/graphics/drawable/GradientDrawable;->getChangingConfigurations()I HSPLandroid/graphics/drawable/GradientDrawable;->getColorFilter()Landroid/graphics/ColorFilter; @@ -7336,7 +7291,7 @@ HSPLandroid/graphics/drawable/GradientDrawable;->mutate()Landroid/graphics/drawa HSPLandroid/graphics/drawable/GradientDrawable;->onBoundsChange(Landroid/graphics/Rect;)V HSPLandroid/graphics/drawable/GradientDrawable;->onLevelChange(I)Z HSPLandroid/graphics/drawable/GradientDrawable;->onStateChange([I)Z -HSPLandroid/graphics/drawable/GradientDrawable;->setAlpha(I)V+]Landroid/graphics/drawable/GradientDrawable;Landroid/graphics/drawable/GradientDrawable; +HSPLandroid/graphics/drawable/GradientDrawable;->setAlpha(I)V HSPLandroid/graphics/drawable/GradientDrawable;->setColor(I)V HSPLandroid/graphics/drawable/GradientDrawable;->setColor(Landroid/content/res/ColorStateList;)V HSPLandroid/graphics/drawable/GradientDrawable;->setColorFilter(Landroid/graphics/ColorFilter;)V @@ -7357,7 +7312,7 @@ HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawablePadding(L HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableSize(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableSolid(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/GradientDrawable;->updateGradientDrawableStroke(Landroid/content/res/TypedArray;)V -HSPLandroid/graphics/drawable/GradientDrawable;->updateLocalState(Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/GradientDrawable;Landroid/graphics/drawable/GradientDrawable;]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/graphics/Paint;Landroid/graphics/Paint; +HSPLandroid/graphics/drawable/GradientDrawable;->updateLocalState(Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/GradientDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/Icon$1;->createFromParcel(Landroid/os/Parcel;)Landroid/graphics/drawable/Icon; HSPLandroid/graphics/drawable/Icon$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -7398,7 +7353,7 @@ HSPLandroid/graphics/drawable/InsetDrawable;->(Landroid/graphics/drawable/ HSPLandroid/graphics/drawable/InsetDrawable;->(Landroid/graphics/drawable/InsetDrawable$InsetState;Landroid/content/res/Resources;Landroid/graphics/drawable/InsetDrawable-IA;)V HSPLandroid/graphics/drawable/InsetDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/InsetDrawable;->getInset(Landroid/content/res/TypedArray;ILandroid/graphics/drawable/InsetDrawable$InsetValue;)Landroid/graphics/drawable/InsetDrawable$InsetValue; -HSPLandroid/graphics/drawable/InsetDrawable;->getInsets(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/InsetDrawable;Landroid/graphics/drawable/InsetDrawable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/InsetDrawable$InsetValue;Landroid/graphics/drawable/InsetDrawable$InsetValue; +HSPLandroid/graphics/drawable/InsetDrawable;->getInsets(Landroid/graphics/Rect;)V HSPLandroid/graphics/drawable/InsetDrawable;->getIntrinsicHeight()I HSPLandroid/graphics/drawable/InsetDrawable;->getIntrinsicWidth()I HSPLandroid/graphics/drawable/InsetDrawable;->getOpacity()I @@ -7410,7 +7365,7 @@ HSPLandroid/graphics/drawable/InsetDrawable;->onBoundsChange(Landroid/graphics/R HSPLandroid/graphics/drawable/InsetDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/InsetDrawable;->verifyRequiredAttributes(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->(I)V -HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;Landroid/graphics/drawable/LayerDrawable;Landroid/content/res/Resources;)V+]Landroid/graphics/drawable/Drawable$ConstantState;missing_types]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;Landroid/graphics/drawable/LayerDrawable;Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->applyDensityScaling(II)V HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->canApplyTheme()Z HSPLandroid/graphics/drawable/LayerDrawable$ChildDrawable;->setDensity(I)V @@ -7483,7 +7438,7 @@ HSPLandroid/graphics/drawable/LayerDrawable;->setTintList(Landroid/content/res/C HSPLandroid/graphics/drawable/LayerDrawable;->setVisible(ZZ)Z HSPLandroid/graphics/drawable/LayerDrawable;->suspendChildInvalidation()V HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerBounds(Landroid/graphics/Rect;)V -HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerBoundsInternal(Landroid/graphics/Rect;)V+]Landroid/graphics/drawable/LayerDrawable;Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/RippleDrawable;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerBoundsInternal(Landroid/graphics/Rect;)V HSPLandroid/graphics/drawable/LayerDrawable;->updateLayerFromTypedArray(Landroid/graphics/drawable/LayerDrawable$ChildDrawable;Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/LayerDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/NinePatchDrawable$$ExternalSyntheticLambda0;->onHeaderDecoded(Landroid/graphics/ImageDecoder;Landroid/graphics/ImageDecoder$ImageInfo;Landroid/graphics/ImageDecoder$Source;)V @@ -7594,21 +7549,21 @@ HSPLandroid/graphics/drawable/RippleDrawable;->createConstantState(Landroid/grap HSPLandroid/graphics/drawable/RippleDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/RippleDrawable;->drawBackgroundAndRipples(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/RippleDrawable;->drawContent(Landroid/graphics/Canvas;)V -HSPLandroid/graphics/drawable/RippleDrawable;->drawPatterned(Landroid/graphics/Canvas;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;Landroid/graphics/drawable/RippleAnimationSession$AnimationProperties;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/RippleAnimationSession;Landroid/graphics/drawable/RippleAnimationSession; +HSPLandroid/graphics/drawable/RippleDrawable;->drawPatterned(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/RippleDrawable;->drawPatternedBackground(Landroid/graphics/Canvas;FF)V HSPLandroid/graphics/drawable/RippleDrawable;->exitPatternedAnimation()V HSPLandroid/graphics/drawable/RippleDrawable;->exitPatternedBackgroundAnimation()V HSPLandroid/graphics/drawable/RippleDrawable;->getComputedRadius()I HSPLandroid/graphics/drawable/RippleDrawable;->getConstantState()Landroid/graphics/drawable/Drawable$ConstantState; -HSPLandroid/graphics/drawable/RippleDrawable;->getDirtyBounds()Landroid/graphics/Rect;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable; +HSPLandroid/graphics/drawable/RippleDrawable;->getDirtyBounds()Landroid/graphics/Rect; HSPLandroid/graphics/drawable/RippleDrawable;->getMaskType()I HSPLandroid/graphics/drawable/RippleDrawable;->getOpacity()I -HSPLandroid/graphics/drawable/RippleDrawable;->getOutline(Landroid/graphics/Outline;)V+]Landroid/graphics/Outline;Landroid/graphics/Outline;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/StateListDrawable; +HSPLandroid/graphics/drawable/RippleDrawable;->getOutline(Landroid/graphics/Outline;)V HSPLandroid/graphics/drawable/RippleDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/RippleDrawable;->invalidateSelf()V HSPLandroid/graphics/drawable/RippleDrawable;->invalidateSelf(Z)V HSPLandroid/graphics/drawable/RippleDrawable;->isBounded()Z -HSPLandroid/graphics/drawable/RippleDrawable;->isProjected()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/RippleDrawable;Landroid/graphics/drawable/RippleDrawable; +HSPLandroid/graphics/drawable/RippleDrawable;->isProjected()Z HSPLandroid/graphics/drawable/RippleDrawable;->isStateful()Z HSPLandroid/graphics/drawable/RippleDrawable;->jumpToCurrentState()V HSPLandroid/graphics/drawable/RippleDrawable;->mutate()Landroid/graphics/drawable/Drawable; @@ -7687,7 +7642,7 @@ HSPLandroid/graphics/drawable/ScaleDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroid/graphics/drawable/ScaleDrawable;->getPercent(Landroid/content/res/TypedArray;IF)F HSPLandroid/graphics/drawable/ScaleDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/ScaleDrawable;->mutateConstantState()Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState; -HSPLandroid/graphics/drawable/ScaleDrawable;->onBoundsChange(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/ScaleDrawable;Landroid/graphics/drawable/ScaleDrawable;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/StateListDrawable; +HSPLandroid/graphics/drawable/ScaleDrawable;->onBoundsChange(Landroid/graphics/Rect;)V HSPLandroid/graphics/drawable/ScaleDrawable;->onLevelChange(I)Z HSPLandroid/graphics/drawable/ScaleDrawable;->updateLocalState()V HSPLandroid/graphics/drawable/ScaleDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V @@ -7765,12 +7720,12 @@ HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->getPropertyIndex(Ljava/ HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->inflate(Landroid/content/res/Resources;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->isStateful()Z HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->onStateChange([I)Z -HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/content/res/ComplexColor;Landroid/content/res/ColorStateList;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/graphics/drawable/VectorDrawable$VFullPath;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->-$$Nest$fgetmChangingConfigurations(Landroid/graphics/drawable/VectorDrawable$VGroup;)I HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->-$$Nest$fgetmNativePtr(Landroid/graphics/drawable/VectorDrawable$VGroup;)J HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->()V -HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->(Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->addChild(Landroid/graphics/drawable/VectorDrawable$VObject;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/drawable/VectorDrawable$VObject;Landroid/graphics/drawable/VectorDrawable$VGroup;,Landroid/graphics/drawable/VectorDrawable$VFullPath; +HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->(Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/util/ArrayMap;)V +HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->addChild(Landroid/graphics/drawable/VectorDrawable$VObject;)V HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->applyTheme(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->canApplyTheme()Z HSPLandroid/graphics/drawable/VectorDrawable$VGroup;->getGroupName()Ljava/lang/String; @@ -7790,7 +7745,7 @@ HSPLandroid/graphics/drawable/VectorDrawable$VPath;->(Landroid/graphics/dr HSPLandroid/graphics/drawable/VectorDrawable$VPath;->getPathName()Ljava/lang/String; HSPLandroid/graphics/drawable/VectorDrawable$VPath;->getProperty(Ljava/lang/String;)Landroid/util/Property; HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->-$$Nest$mcreateNativeTree(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VGroup;)V -HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;)V HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->applyDensityScaling(II)V HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->applyTheme(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->canApplyTheme()Z @@ -7805,7 +7760,7 @@ HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->isStateful()Z HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->newDrawable()Landroid/graphics/drawable/Drawable; HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->newDrawable(Landroid/content/res/Resources;)Landroid/graphics/drawable/Drawable; HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->onStateChange([I)Z -HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->onTreeConstructionFinished()V+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup; +HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->onTreeConstructionFinished()V HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setAlpha(F)Z HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setDensity(I)Z HSPLandroid/graphics/drawable/VectorDrawable$VectorDrawableState;->setViewportSize(FF)V @@ -7831,7 +7786,7 @@ HSPLandroid/graphics/drawable/VectorDrawable;->-$$Nest$smnUpdateGroupProperties( HSPLandroid/graphics/drawable/VectorDrawable;->()V HSPLandroid/graphics/drawable/VectorDrawable;->(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/content/res/Resources;)V HSPLandroid/graphics/drawable/VectorDrawable;->(Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/content/res/Resources;Landroid/graphics/drawable/VectorDrawable-IA;)V -HSPLandroid/graphics/drawable/VectorDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/content/res/ColorStateList;Landroid/content/res/ColorStateList;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/graphics/drawable/VectorDrawable;->applyTheme(Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/VectorDrawable;->canApplyTheme()Z HSPLandroid/graphics/drawable/VectorDrawable;->clearMutated()V HSPLandroid/graphics/drawable/VectorDrawable;->computeVectorSize()V @@ -7846,8 +7801,8 @@ HSPLandroid/graphics/drawable/VectorDrawable;->getNativeTree()J HSPLandroid/graphics/drawable/VectorDrawable;->getOpacity()I HSPLandroid/graphics/drawable/VectorDrawable;->getPixelSize()F HSPLandroid/graphics/drawable/VectorDrawable;->getTargetByName(Ljava/lang/String;)Ljava/lang/Object; -HSPLandroid/graphics/drawable/VectorDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime;]Lcom/android/internal/util/VirtualRefBasePtr;Lcom/android/internal/util/VirtualRefBasePtr;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup; -HSPLandroid/graphics/drawable/VectorDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/XmlBlock$Parser;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Stack;Ljava/util/Stack;]Landroid/graphics/drawable/VectorDrawable$VGroup;Landroid/graphics/drawable/VectorDrawable$VGroup;]Landroid/graphics/drawable/VectorDrawable$VFullPath;Landroid/graphics/drawable/VectorDrawable$VFullPath; +HSPLandroid/graphics/drawable/VectorDrawable;->inflate(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V +HSPLandroid/graphics/drawable/VectorDrawable;->inflateChildElements(Landroid/content/res/Resources;Lorg/xmlpull/v1/XmlPullParser;Landroid/util/AttributeSet;Landroid/content/res/Resources$Theme;)V HSPLandroid/graphics/drawable/VectorDrawable;->isAutoMirrored()Z HSPLandroid/graphics/drawable/VectorDrawable;->isStateful()Z HSPLandroid/graphics/drawable/VectorDrawable;->mutate()Landroid/graphics/drawable/Drawable; @@ -7861,7 +7816,7 @@ HSPLandroid/graphics/drawable/VectorDrawable;->setTintBlendMode(Landroid/graphic HSPLandroid/graphics/drawable/VectorDrawable;->setTintList(Landroid/content/res/ColorStateList;)V HSPLandroid/graphics/drawable/VectorDrawable;->updateColorFilters(Landroid/graphics/BlendMode;Landroid/content/res/ColorStateList;)V HSPLandroid/graphics/drawable/VectorDrawable;->updateLocalState(Landroid/content/res/Resources;)V -HSPLandroid/graphics/drawable/VectorDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V+]Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;Landroid/graphics/drawable/VectorDrawable$VectorDrawableState;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/graphics/drawable/VectorDrawable;->updateStateFromTypedArray(Landroid/content/res/TypedArray;)V HSPLandroid/graphics/drawable/shapes/OvalShape;->()V HSPLandroid/graphics/drawable/shapes/OvalShape;->draw(Landroid/graphics/Canvas;Landroid/graphics/Paint;)V HSPLandroid/graphics/drawable/shapes/OvalShape;->getOutline(Landroid/graphics/Outline;)V @@ -7967,7 +7922,6 @@ HSPLandroid/hardware/HardwareBuffer;->isClosed()Z HSPLandroid/hardware/ICameraService$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/hardware/ICameraService$Stub$Proxy;->addListener(Landroid/hardware/ICameraServiceListener;)[Landroid/hardware/CameraStatus; HSPLandroid/hardware/ICameraService$Stub$Proxy;->asBinder()Landroid/os/IBinder; -HSPLandroid/hardware/ICameraService$Stub$Proxy;->getCameraCharacteristics(Ljava/lang/String;IZ)Landroid/hardware/camera2/impl/CameraMetadataNative; HSPLandroid/hardware/ICameraService$Stub$Proxy;->getConcurrentCameraIds()[Landroid/hardware/camera2/utils/ConcurrentCameraIdCombination; HSPLandroid/hardware/ICameraService$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/ICameraService; HSPLandroid/hardware/ICameraServiceListener$Stub;->getMaxTransactionId()I @@ -8015,7 +7969,7 @@ HSPLandroid/hardware/SystemSensorManager$BaseEventQueue;->removeSensor(Landroid/ HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->(Landroid/hardware/SensorEventListener;Landroid/os/Looper;Landroid/hardware/SystemSensorManager;Ljava/lang/String;)V HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->addSensorEvent(Landroid/hardware/Sensor;)V HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->dispatchAdditionalInfoEvent(III[F[I)V -HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->dispatchSensorEvent(I[FIJ)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->dispatchSensorEvent(I[FIJ)V HSPLandroid/hardware/SystemSensorManager$SensorEventQueue;->removeSensorEvent(Landroid/hardware/Sensor;)V HSPLandroid/hardware/SystemSensorManager$TriggerEventQueue;->addSensorEvent(Landroid/hardware/Sensor;)V HSPLandroid/hardware/SystemSensorManager$TriggerEventQueue;->dispatchSensorEvent(I[FIJ)V @@ -8050,29 +8004,19 @@ HSPLandroid/hardware/camera2/CameraCharacteristics;->overrideProperty(Landroid/h HSPLandroid/hardware/camera2/CameraManager$AvailabilityCallback;->()V HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$1;->compare(Ljava/lang/String;Ljava/lang/String;)I -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal$3;->(Landroid/hardware/camera2/CameraManager$CameraManagerGlobal;Landroid/hardware/camera2/CameraManager$AvailabilityCallback;)V HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->asBinder()Landroid/os/IBinder; -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->cameraIdHasConcurrentStreamsLocked(Ljava/lang/String;)Z HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->connectCameraServiceLocked()V -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->extractCameraIdListLocked()[Ljava/lang/String; HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->get()Landroid/hardware/camera2/CameraManager$CameraManagerGlobal; -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->getCameraIdList()[Ljava/lang/String; HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->getCameraService()Landroid/hardware/ICameraService; HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onCameraAccessPrioritiesChanged()V -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onStatusChanged(ILjava/lang/String;)V -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onStatusChangedLocked(ILjava/lang/String;)V -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onTorchStatusChanged(ILjava/lang/String;)V -HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->onTorchStatusChangedLocked(ILjava/lang/String;)V HSPLandroid/hardware/camera2/CameraManager$CameraManagerGlobal;->postSingleAccessPriorityChangeUpdate(Landroid/hardware/camera2/CameraManager$AvailabilityCallback;Ljava/util/concurrent/Executor;)V HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->addDeviceStateListener(Landroid/hardware/camera2/CameraManager$DeviceStateListener;)V -HSPLandroid/hardware/camera2/CameraManager$FoldStateListener;->handleStateChange(I)V HSPLandroid/hardware/camera2/CameraManager;->(Landroid/content/Context;)V HSPLandroid/hardware/camera2/CameraManager;->getCameraCharacteristics(Ljava/lang/String;)Landroid/hardware/camera2/CameraCharacteristics; HSPLandroid/hardware/camera2/CameraManager;->getCameraIdList()[Ljava/lang/String; HSPLandroid/hardware/camera2/CameraManager;->getDisplaySize()Landroid/util/Size; HSPLandroid/hardware/camera2/CameraManager;->getPhysicalCameraMultiResolutionConfigs(Ljava/lang/String;Landroid/hardware/camera2/impl/CameraMetadataNative;Landroid/hardware/ICameraService;)Ljava/util/Map; HSPLandroid/hardware/camera2/CameraManager;->registerDeviceStateListener(Landroid/hardware/camera2/CameraCharacteristics;)V -HSPLandroid/hardware/camera2/CameraManager;->shouldOverrideToPortrait(Landroid/content/Context;)Z HSPLandroid/hardware/camera2/CameraMetadata;->()V HSPLandroid/hardware/camera2/CameraMetadata;->setNativeInstance(Landroid/hardware/camera2/impl/CameraMetadataNative;)V HSPLandroid/hardware/camera2/impl/CameraDeviceImpl$CameraHandlerExecutor;->execute(Ljava/lang/Runnable;)V @@ -8150,18 +8094,15 @@ HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWra HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2;->run()V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper;->(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;Ljava/util/concurrent/Executor;)V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;->(Landroid/hardware/devicestate/DeviceStateManagerGlobal;)V -HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;->(Landroid/hardware/devicestate/DeviceStateManagerGlobal;Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA;)V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback;->onDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateInfo;)V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->-$$Nest$mhandleDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateManagerGlobal;Landroid/hardware/devicestate/DeviceStateInfo;)V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->(Landroid/hardware/devicestate/IDeviceStateManager;)V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->findCallbackLocked(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;)I HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->getInstance()Landroid/hardware/devicestate/DeviceStateManagerGlobal; HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->handleDeviceStateInfoChanged(Landroid/hardware/devicestate/DeviceStateInfo;)V -HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->registerCallbackIfNeededLocked()V HSPLandroid/hardware/devicestate/DeviceStateManagerGlobal;->registerDeviceStateCallback(Landroid/hardware/devicestate/DeviceStateManager$DeviceStateCallback;Ljava/util/concurrent/Executor;)V HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; -HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy;->registerCallback(Landroid/hardware/devicestate/IDeviceStateManagerCallback;)V HSPLandroid/hardware/devicestate/IDeviceStateManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/hardware/devicestate/IDeviceStateManager; HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->()V HSPLandroid/hardware/devicestate/IDeviceStateManagerCallback$Stub;->asBinder()Landroid/os/IBinder; @@ -8200,7 +8141,6 @@ HSPLandroid/hardware/display/DeviceProductInfo;->equals(Ljava/lang/Object;)Z HSPLandroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2;->()V HSPLandroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2;->test(Ljava/lang/Object;)Z HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->()V -HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->(Landroid/hardware/display/DisplayManager$WeakDisplayCache-IA;)V HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->get(I)Landroid/view/Display; HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->put(Landroid/view/Display;)V HSPLandroid/hardware/display/DisplayManager$WeakDisplayCache;->removeStaleEntries()V @@ -8219,11 +8159,9 @@ HSPLandroid/hardware/display/DisplayManagerGlobal$1;->(Landroid/hardware/d HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Integer;)Landroid/view/DisplayInfo; HSPLandroid/hardware/display/DisplayManagerGlobal$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0;->run()V -HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->(Landroid/hardware/display/DisplayManager$DisplayListener;Ljava/util/concurrent/Executor;JLjava/lang/String;)V HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->clearEvents()V -HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->handleDisplayEventInner(IILandroid/view/DisplayInfo;Z)V+]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Landroid/hardware/display/DisplayManager$DisplayListener;missing_types +HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate;->handleDisplayEventInner(IILandroid/view/DisplayInfo;Z)V+]Landroid/hardware/display/DisplayManager$DisplayListener;megamorphic_types HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;->(Landroid/hardware/display/DisplayManagerGlobal;)V -HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;->(Landroid/hardware/display/DisplayManagerGlobal;Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA;)V HSPLandroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;->onDisplayEvent(II)V HSPLandroid/hardware/display/DisplayManagerGlobal;->-$$Nest$fgetmDm(Landroid/hardware/display/DisplayManagerGlobal;)Landroid/hardware/display/IDisplayManager; HSPLandroid/hardware/display/DisplayManagerGlobal;->(Landroid/hardware/display/IDisplayManager;)V @@ -8235,7 +8173,7 @@ HSPLandroid/hardware/display/DisplayManagerGlobal;->getCompatibleDisplay(ILandro HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayIds()[I HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayIds(Z)[I HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayInfo(I)Landroid/view/DisplayInfo; -HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayInfoLocked(I)Landroid/view/DisplayInfo;+]Landroid/app/PropertyInvalidatedCache;Landroid/hardware/display/DisplayManagerGlobal$1; +HSPLandroid/hardware/display/DisplayManagerGlobal;->getDisplayInfoLocked(I)Landroid/view/DisplayInfo; HSPLandroid/hardware/display/DisplayManagerGlobal;->getInstance()Landroid/hardware/display/DisplayManagerGlobal; HSPLandroid/hardware/display/DisplayManagerGlobal;->getLooperForHandler(Landroid/os/Handler;)Landroid/os/Looper; HSPLandroid/hardware/display/DisplayManagerGlobal;->getPreferredWideGamutColorSpace()Landroid/graphics/ColorSpace; @@ -8244,7 +8182,7 @@ HSPLandroid/hardware/display/DisplayManagerGlobal;->getWifiDisplayStatus()Landro HSPLandroid/hardware/display/DisplayManagerGlobal;->initExtraLogging()Z HSPLandroid/hardware/display/DisplayManagerGlobal;->maybeLogAllDisplayListeners()V HSPLandroid/hardware/display/DisplayManagerGlobal;->registerCallbackIfNeededLocked()V -HSPLandroid/hardware/display/DisplayManagerGlobal;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Ljava/util/concurrent/Executor;JLjava/lang/String;)V+]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; +HSPLandroid/hardware/display/DisplayManagerGlobal;->registerDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;Ljava/util/concurrent/Executor;JLjava/lang/String;)V HSPLandroid/hardware/display/DisplayManagerGlobal;->registerNativeChoreographerForRefreshRateCallbacks()V HSPLandroid/hardware/display/DisplayManagerGlobal;->unregisterDisplayListener(Landroid/hardware/display/DisplayManager$DisplayListener;)V HSPLandroid/hardware/display/DisplayManagerGlobal;->updateCallbackIfNeededLocked()V @@ -8310,7 +8248,6 @@ HSPLandroid/hardware/input/InputManager;->registerInputDeviceListener(Landroid/h HSPLandroid/hardware/input/InputManager;->unregisterInputDeviceListener(Landroid/hardware/input/InputManager$InputDeviceListener;)V HSPLandroid/hardware/input/InputManagerGlobal$InputDeviceListenerDelegate;->(Landroid/hardware/input/InputManager$InputDeviceListener;Landroid/os/Handler;)V HSPLandroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener;->(Landroid/hardware/input/InputManagerGlobal;)V -HSPLandroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener;->(Landroid/hardware/input/InputManagerGlobal;Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener-IA;)V HSPLandroid/hardware/input/InputManagerGlobal;->(Landroid/hardware/input/IInputManager;)V HSPLandroid/hardware/input/InputManagerGlobal;->getInputDevice(I)Landroid/view/InputDevice; HSPLandroid/hardware/input/InputManagerGlobal;->getInputDeviceIds()[I @@ -8362,7 +8299,7 @@ HSPLandroid/hardware/location/NanoAppMessage;->getNanoAppId()J HSPLandroid/hardware/location/NanoAppMessage;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/location/NanoAppState; HSPLandroid/hardware/location/NanoAppState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/hardware/location/NanoAppState;->(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/hardware/location/NanoAppState;->(Landroid/os/Parcel;)V HSPLandroid/hardware/location/NanoAppState;->getNanoAppId()J HSPLandroid/hardware/security/keymint/KeyParameter$1;->()V HSPLandroid/hardware/security/keymint/KeyParameter$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/security/keymint/KeyParameter; @@ -8453,6 +8390,8 @@ HSPLandroid/icu/impl/CalendarUtil$CalendarPreferences;->getCalendarTypeForRegion HSPLandroid/icu/impl/CalendarUtil;->getCalendarType(Landroid/icu/util/ULocale;)Ljava/lang/String; HSPLandroid/icu/impl/CaseMapImpl;->appendUnchanged(Ljava/lang/CharSequence;IILjava/lang/Appendable;ILandroid/icu/text/Edits;)V HSPLandroid/icu/impl/CaseMapImpl;->applyEdits(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;Landroid/icu/text/Edits;)Ljava/lang/String; +HSPLandroid/icu/impl/CaseMapImpl;->fold(ILjava/lang/CharSequence;)Ljava/lang/String; +HSPLandroid/icu/impl/CaseMapImpl;->internalToLower(IILjava/lang/CharSequence;IILandroid/icu/impl/CaseMapImpl$StringContextIterator;Ljava/lang/Appendable;Landroid/icu/text/Edits;)V HSPLandroid/icu/impl/CaseMapImpl;->internalToUpper(IILjava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)V HSPLandroid/icu/impl/CaseMapImpl;->toUpper(IILjava/lang/CharSequence;Ljava/lang/Appendable;Landroid/icu/text/Edits;)Ljava/lang/Appendable; HSPLandroid/icu/impl/CharacterIteration;->nextTrail32(Ljava/text/CharacterIterator;I)I @@ -8466,6 +8405,10 @@ HSPLandroid/icu/impl/CurrencyData$CurrencySpacingInfo;->setSymbolIfNull(Landroid HSPLandroid/icu/impl/DateNumberFormat;->(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/icu/impl/DateNumberFormat;->getDigits()[C HSPLandroid/icu/impl/DateNumberFormat;->initialize(Landroid/icu/util/ULocale;Ljava/lang/String;Ljava/lang/String;)V +HSPLandroid/icu/impl/DayPeriodRules$DayPeriod;->fromStringOrNull(Ljava/lang/CharSequence;)Landroid/icu/impl/DayPeriodRules$DayPeriod; +HSPLandroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->parseHour(Ljava/lang/String;)I +HSPLandroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->processRules(Landroid/icu/impl/UResource$Table;Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)V +HSPLandroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink;->setDayPeriodForHoursFromCutoffs()V HSPLandroid/icu/impl/FormattedStringBuilder;->()V HSPLandroid/icu/impl/FormattedStringBuilder;->(I)V HSPLandroid/icu/impl/FormattedStringBuilder;->(Landroid/icu/impl/FormattedStringBuilder;)V @@ -8475,7 +8418,7 @@ HSPLandroid/icu/impl/FormattedStringBuilder;->copyFrom(Landroid/icu/impl/Formatt HSPLandroid/icu/impl/FormattedStringBuilder;->fieldAt(I)Ljava/lang/Object; HSPLandroid/icu/impl/FormattedStringBuilder;->getCapacity()I HSPLandroid/icu/impl/FormattedStringBuilder;->insert(ILjava/lang/CharSequence;IILjava/lang/Object;)I -HSPLandroid/icu/impl/FormattedStringBuilder;->insert(ILjava/lang/CharSequence;Ljava/lang/Object;)I+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/icu/impl/FormattedStringBuilder;->insert(ILjava/lang/CharSequence;Ljava/lang/Object;)I HSPLandroid/icu/impl/FormattedStringBuilder;->insert(I[C[Ljava/lang/Object;)I HSPLandroid/icu/impl/FormattedStringBuilder;->insertCodePoint(IILjava/lang/Object;)I HSPLandroid/icu/impl/FormattedStringBuilder;->length()I @@ -8486,8 +8429,8 @@ HSPLandroid/icu/impl/FormattedStringBuilder;->toFieldArray()[Ljava/lang/Object; HSPLandroid/icu/impl/FormattedStringBuilder;->toString()Ljava/lang/String; HSPLandroid/icu/impl/FormattedStringBuilder;->unwrapField(Ljava/lang/Object;)Ljava/text/Format$Field; HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->isIntOrGroup(Ljava/lang/Object;)Z -HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextFieldPosition(Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;)Z+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition;]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition; -HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextPosition(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/text/ConstrainedFieldPosition;Ljava/text/Format$Field;)Z+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition; +HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextFieldPosition(Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;)Z +HSPLandroid/icu/impl/FormattedValueStringBuilderImpl;->nextPosition(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/text/ConstrainedFieldPosition;Ljava/text/Format$Field;)Z HSPLandroid/icu/impl/Grego;->dayOfWeek(J)I HSPLandroid/icu/impl/Grego;->dayToFields(J[I)[I HSPLandroid/icu/impl/Grego;->fieldsToDay(III)J @@ -8507,7 +8450,7 @@ HSPLandroid/icu/impl/ICUBinary$PackageDataFile;->addBaseNamesInFolder(Ljava/lang HSPLandroid/icu/impl/ICUBinary$PackageDataFile;->getData(Ljava/lang/String;)Ljava/nio/ByteBuffer; HSPLandroid/icu/impl/ICUBinary;->addBaseNamesInFileFolder(Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V HSPLandroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;Ljava/nio/ByteBuffer;I)I -HSPLandroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;[BI)I+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/icu/impl/ICUBinary;->compareKeys(Ljava/lang/CharSequence;[BI)I HSPLandroid/icu/impl/ICUBinary;->getBytes(Ljava/nio/ByteBuffer;II)[B HSPLandroid/icu/impl/ICUBinary;->getChars(Ljava/nio/ByteBuffer;II)[C HSPLandroid/icu/impl/ICUBinary;->getData(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;)Ljava/nio/ByteBuffer; @@ -8533,7 +8476,6 @@ HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->get HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo;->getSymbol(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/impl/ICUCurrencyDisplayInfoProvider;->getInstance(Landroid/icu/util/ULocale;Z)Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo; HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->()V -HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->(Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector-IA;)V HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->collect(Ljava/lang/String;Ljava/lang/String;JJIZ)V HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->collects()I HSPLandroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector;->getList()Ljava/util/List; @@ -8543,7 +8485,7 @@ HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->add(Ljava/lang/Object;)V HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->create()Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList; HSPLandroid/icu/impl/ICUCurrencyMetaInfo$UniqueList;->list()Ljava/util/List; HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collect(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List; -HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collectRegion(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;ILandroid/icu/impl/ICUResourceBundle;)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundle;Landroid/icu/impl/ICUResourceBundleImpl$ResourceString;,Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;,Landroid/icu/impl/ICUResourceBundleImpl$ResourceArray;]Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector; +HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->collectRegion(Landroid/icu/impl/ICUCurrencyMetaInfo$Collector;Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;ILandroid/icu/impl/ICUResourceBundle;)V HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencies(Landroid/icu/text/CurrencyMetaInfo$CurrencyFilter;)Ljava/util/List; HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->currencyDigits(Ljava/lang/String;Landroid/icu/util/Currency$CurrencyUsage;)Landroid/icu/text/CurrencyMetaInfo$CurrencyDigits; HSPLandroid/icu/impl/ICUCurrencyMetaInfo;->getDate(Landroid/icu/impl/ICUResourceBundle;JZ)J @@ -8551,9 +8493,9 @@ HSPLandroid/icu/impl/ICUData;->checkStreamForBinaryData(Ljava/io/InputStream;Lja HSPLandroid/icu/impl/ICUData;->getStream(Ljava/lang/ClassLoader;Ljava/lang/String;Z)Ljava/io/InputStream; HSPLandroid/icu/impl/ICULocaleService$ICUResourceBundleFactory;->getSupportedIDs()Ljava/util/Set; HSPLandroid/icu/impl/ICULocaleService$ICUResourceBundleFactory;->loader()Ljava/lang/ClassLoader; -HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->createWithCanonical(Landroid/icu/util/ULocale;Ljava/lang/String;I)Landroid/icu/impl/ICULocaleService$LocaleKey; -HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentDescriptor()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/ICULocaleService$LocaleKey;Landroid/icu/impl/ICULocaleService$LocaleKey; +HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentDescriptor()Ljava/lang/String; HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentID()Ljava/lang/String; HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->currentLocale()Landroid/icu/util/ULocale; HSPLandroid/icu/impl/ICULocaleService$LocaleKey;->fallback()Z @@ -8581,25 +8523,23 @@ HSPLandroid/icu/impl/ICUResourceBundle$5;->(Ljava/lang/String;Ljava/lang/S HSPLandroid/icu/impl/ICUResourceBundle$5;->load()Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle$AvailEntry;->getFullLocaleNameSet()Ljava/util/Set; HSPLandroid/icu/impl/ICUResourceBundle$Loader;->()V -HSPLandroid/icu/impl/ICUResourceBundle$Loader;->(Landroid/icu/impl/ICUResourceBundle$Loader-IA;)V HSPLandroid/icu/impl/ICUResourceBundle$WholeBundle;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundleReader;)V HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$mgetNoFallback(Landroid/icu/impl/ICUResourceBundle;)Z HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$sfgetDEBUG()Z -HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$smgetParentLocaleID(Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/ICUResourceBundle$OpenType;)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundle;->-$$Nest$sminstantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V HSPLandroid/icu/impl/ICUResourceBundle;->(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V HSPLandroid/icu/impl/ICUResourceBundle;->addBundleBaseNamesFromClassLoader(Ljava/lang/String;Ljava/lang/ClassLoader;Ljava/util/Set;)V HSPLandroid/icu/impl/ICUResourceBundle;->at(I)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->at(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle; -HSPLandroid/icu/impl/ICUResourceBundle;->countPathKeys(Ljava/lang/String;)I+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/ICUResourceBundle;->countPathKeys(Ljava/lang/String;)I HSPLandroid/icu/impl/ICUResourceBundle;->createBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->createFullLocaleNameSet(Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/util/Set; HSPLandroid/icu/impl/ICUResourceBundle;->equals(Ljava/lang/Object;)Z HSPLandroid/icu/impl/ICUResourceBundle;->findResourceWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->findResourceWithFallback([Ljava/lang/String;ILandroid/icu/impl/ICUResourceBundle;Landroid/icu/util/UResourceBundle;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Ljava/lang/String;+]Landroid/icu/impl/ICUResourceBundleReader$Container;Landroid/icu/impl/ICUResourceBundleReader$Table;,Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundle;Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader; +HSPLandroid/icu/impl/ICUResourceBundle;->findStringWithFallback(Ljava/lang/String;Landroid/icu/util/UResourceBundle;Landroid/icu/util/UResourceBundle;)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->findTopLevel(Ljava/lang/String;)Landroid/icu/util/UResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->findWithFallback(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle; @@ -8632,7 +8572,7 @@ HSPLandroid/icu/impl/ICUResourceBundle;->getResPathKeys([Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundle;->getStringWithFallback(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundle;->getULocale()Landroid/icu/util/ULocale; HSPLandroid/icu/impl/ICUResourceBundle;->getWithFallback(Ljava/lang/String;)Landroid/icu/impl/ICUResourceBundle; -HSPLandroid/icu/impl/ICUResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/ICUResourceBundle$OpenType;Landroid/icu/impl/ICUResourceBundle$OpenType;]Landroid/icu/impl/CacheBase;Landroid/icu/impl/ICUResourceBundle$1; +HSPLandroid/icu/impl/ICUResourceBundle;->instantiateBundle(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;Landroid/icu/impl/ICUResourceBundle$OpenType;)Landroid/icu/impl/ICUResourceBundle; HSPLandroid/icu/impl/ICUResourceBundle;->setParent(Ljava/util/ResourceBundle;)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceArray;->getStringArray()[Ljava/lang/String; @@ -8644,22 +8584,22 @@ HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceBinary;->getBinary([B)[B HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->createBundleObject(ILjava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle; -HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getContainerResource(I)I+]Landroid/icu/impl/ICUResourceBundleReader$Container;Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16; +HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getContainerResource(I)I HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getSize()I HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceContainer;->getString(I)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceInt;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceInt;->getInt()I HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceIntVector;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceIntVector;->getIntVector()[I -HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader; +HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->getString()Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceString;->getType()I HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->(Landroid/icu/impl/ICUResourceBundle$WholeBundle;I)V -HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V+]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader; +HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->findString(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->getType()I HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGet(ILjava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle; -HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGet(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle;+]Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;Landroid/icu/impl/ICUResourceBundleImpl$ResourceTable;]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table;,Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16; +HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGet(Ljava/lang/String;Ljava/util/HashMap;Landroid/icu/util/UResourceBundle;)Landroid/icu/util/UResourceBundle; HSPLandroid/icu/impl/ICUResourceBundleImpl$ResourceTable;->handleGetObject(Ljava/lang/String;)Ljava/lang/Object; HSPLandroid/icu/impl/ICUResourceBundleImpl;->(Landroid/icu/impl/ICUResourceBundle$WholeBundle;)V HSPLandroid/icu/impl/ICUResourceBundleImpl;->(Landroid/icu/impl/ICUResourceBundleImpl;Ljava/lang/String;I)V @@ -8672,7 +8612,7 @@ HSPLandroid/icu/impl/ICUResourceBundleReader$Array32;->getContainerResource(Land HSPLandroid/icu/impl/ICUResourceBundleReader$Array;->()V HSPLandroid/icu/impl/ICUResourceBundleReader$Array;->getValue(ILandroid/icu/impl/UResource$Value;)Z HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->()V -HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainer16Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I+]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer; +HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainer16Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainer32Resource(Landroid/icu/impl/ICUResourceBundleReader;I)I HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I HSPLandroid/icu/impl/ICUResourceBundleReader$Container;->getSize()I @@ -8690,23 +8630,25 @@ HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getStringArray()[Ljav HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getStringArray(Landroid/icu/impl/ICUResourceBundleReader$Array;)[Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getTable()Landroid/icu/impl/UResource$Table; HSPLandroid/icu/impl/ICUResourceBundleReader$ReaderValue;->getType()I -HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->get(I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level; -HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level; +HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->(II)V +HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->get(I)Ljava/lang/Object; +HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object; HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->(I)V HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->findSimple(I)I -HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->get(I)Ljava/lang/Object;+]Ljava/lang/ref/SoftReference;Ljava/lang/ref/SoftReference;]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level; +HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->get(I)Ljava/lang/Object; HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->makeKey(I)I -HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache$Level; +HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfAbsent(ILjava/lang/Object;I)Ljava/lang/Object; HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->putIfCleared([Ljava/lang/Object;ILjava/lang/Object;I)Ljava/lang/Object; HSPLandroid/icu/impl/ICUResourceBundleReader$ResourceCache;->storeDirectly(I)Z HSPLandroid/icu/impl/ICUResourceBundleReader$Table1632;->(Landroid/icu/impl/ICUResourceBundleReader;I)V HSPLandroid/icu/impl/ICUResourceBundleReader$Table1632;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I +HSPLandroid/icu/impl/ICUResourceBundleReader$Table16;->(Landroid/icu/impl/ICUResourceBundleReader;I)V HSPLandroid/icu/impl/ICUResourceBundleReader$Table16;->getContainerResource(Landroid/icu/impl/ICUResourceBundleReader;I)I HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->()V HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->findTableItem(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/CharSequence;)I HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->findValue(Ljava/lang/CharSequence;Landroid/icu/impl/UResource$Value;)Z HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getKey(Landroid/icu/impl/ICUResourceBundleReader;I)Ljava/lang/String; -HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getKeyAndValue(ILandroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)Z+]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table1632;,Landroid/icu/impl/ICUResourceBundleReader$Table16; +HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getKeyAndValue(ILandroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Value;)Z HSPLandroid/icu/impl/ICUResourceBundleReader$Table;->getResource(Landroid/icu/impl/ICUResourceBundleReader;Ljava/lang/String;)I HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$fgetb16BitUnits(Landroid/icu/impl/ICUResourceBundleReader;)Ljava/nio/CharBuffer; HSPLandroid/icu/impl/ICUResourceBundleReader;->-$$Nest$fgetpoolStringIndex16Limit(Landroid/icu/impl/ICUResourceBundleReader;)I @@ -8730,7 +8672,7 @@ HSPLandroid/icu/impl/ICUResourceBundleReader;->getAlias(I)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleReader;->getArray(I)Landroid/icu/impl/ICUResourceBundleReader$Array; HSPLandroid/icu/impl/ICUResourceBundleReader;->getBinary(I[B)[B HSPLandroid/icu/impl/ICUResourceBundleReader;->getChars(II)[C -HSPLandroid/icu/impl/ICUResourceBundleReader;->getFullName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/icu/impl/ICUResourceBundleReader;->getFullName(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/impl/ICUResourceBundleReader;->getIndexesInt(I)I HSPLandroid/icu/impl/ICUResourceBundleReader;->getInt(I)I HSPLandroid/icu/impl/ICUResourceBundleReader;->getIntVector(I)[I @@ -8740,10 +8682,10 @@ HSPLandroid/icu/impl/ICUResourceBundleReader;->getNoFallback()Z HSPLandroid/icu/impl/ICUResourceBundleReader;->getReader(Ljava/lang/String;Ljava/lang/String;Ljava/lang/ClassLoader;)Landroid/icu/impl/ICUResourceBundleReader; HSPLandroid/icu/impl/ICUResourceBundleReader;->getResourceByteOffset(I)I HSPLandroid/icu/impl/ICUResourceBundleReader;->getRootResource()I -HSPLandroid/icu/impl/ICUResourceBundleReader;->getString(I)Ljava/lang/String;+]Landroid/icu/impl/ICUResourceBundleReader;Landroid/icu/impl/ICUResourceBundleReader; -HSPLandroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer;]Ljava/lang/CharSequence;Ljava/nio/ByteBufferAsCharBuffer; -HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table;+]Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;Landroid/icu/impl/ICUResourceBundleReader$ResourceCache;]Landroid/icu/impl/ICUResourceBundleReader$Table;Landroid/icu/impl/ICUResourceBundleReader$Table16;,Landroid/icu/impl/ICUResourceBundleReader$Table1632; -HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C+]Ljava/nio/CharBuffer;Ljava/nio/ByteBufferAsCharBuffer; +HSPLandroid/icu/impl/ICUResourceBundleReader;->getString(I)Ljava/lang/String; +HSPLandroid/icu/impl/ICUResourceBundleReader;->getStringV2(I)Ljava/lang/String; +HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable(I)Landroid/icu/impl/ICUResourceBundleReader$Table; +HSPLandroid/icu/impl/ICUResourceBundleReader;->getTable16KeyOffsets(I)[C HSPLandroid/icu/impl/ICUResourceBundleReader;->getTableKeyOffsets(I)[C HSPLandroid/icu/impl/ICUResourceBundleReader;->init(Ljava/nio/ByteBuffer;)V HSPLandroid/icu/impl/ICUResourceBundleReader;->makeKeyStringFromBytes([BI)Ljava/lang/String; @@ -8753,10 +8695,10 @@ HSPLandroid/icu/impl/ICUService$CacheEntry;->(Ljava/lang/String;Ljava/lang HSPLandroid/icu/impl/ICUService$Key;->(Ljava/lang/String;)V HSPLandroid/icu/impl/ICUService;->clearServiceCache()V HSPLandroid/icu/impl/ICUService;->getKey(Landroid/icu/impl/ICUService$Key;[Ljava/lang/String;)Ljava/lang/Object; -HSPLandroid/icu/impl/ICUService;->getKey(Landroid/icu/impl/ICUService$Key;[Ljava/lang/String;Landroid/icu/impl/ICUService$Factory;)Ljava/lang/Object;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;]Landroid/icu/impl/ICURWLock;Landroid/icu/impl/ICURWLock;]Landroid/icu/impl/ICUService$Key;Landroid/icu/impl/ICULocaleService$LocaleKey; +HSPLandroid/icu/impl/ICUService;->getKey(Landroid/icu/impl/ICUService$Key;[Ljava/lang/String;Landroid/icu/impl/ICUService$Factory;)Ljava/lang/Object; HSPLandroid/icu/impl/ICUService;->isDefault()Z -HSPLandroid/icu/impl/IDNA2003;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer; -HSPLandroid/icu/impl/IDNA2003;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer;+]Landroid/icu/text/UCharacterIterator;Landroid/icu/impl/ReplaceableUCharacterIterator;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer; +HSPLandroid/icu/impl/IDNA2003;->convertIDNToASCII(Ljava/lang/String;I)Ljava/lang/StringBuffer; +HSPLandroid/icu/impl/IDNA2003;->convertToASCII(Landroid/icu/text/UCharacterIterator;I)Ljava/lang/StringBuffer; HSPLandroid/icu/impl/IDNA2003;->getSeparatorIndex([CII)I HSPLandroid/icu/impl/IDNA2003;->isLDHChar(I)Z HSPLandroid/icu/impl/IDNA2003;->isLabelSeparator(I)Z @@ -8764,9 +8706,9 @@ HSPLandroid/icu/impl/LocaleIDParser$1;->(Landroid/icu/impl/LocaleIDParser; HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroid/icu/impl/LocaleIDParser$1;->compare(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/icu/impl/LocaleIDParser;->(Ljava/lang/String;)V -HSPLandroid/icu/impl/LocaleIDParser;->(Ljava/lang/String;Z)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/LocaleIDParser;->(Ljava/lang/String;Z)V HSPLandroid/icu/impl/LocaleIDParser;->addSeparator()V -HSPLandroid/icu/impl/LocaleIDParser;->append(C)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/icu/impl/LocaleIDParser;->append(C)V HSPLandroid/icu/impl/LocaleIDParser;->append(Ljava/lang/String;)V HSPLandroid/icu/impl/LocaleIDParser;->atTerminator()Z HSPLandroid/icu/impl/LocaleIDParser;->getBaseName()Ljava/lang/String; @@ -8790,10 +8732,10 @@ HSPLandroid/icu/impl/LocaleIDParser;->isTerminator(C)Z HSPLandroid/icu/impl/LocaleIDParser;->isTerminatorOrIDSeparator(C)Z HSPLandroid/icu/impl/LocaleIDParser;->next()C HSPLandroid/icu/impl/LocaleIDParser;->parseBaseName()V -HSPLandroid/icu/impl/LocaleIDParser;->parseCountry()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/icu/impl/LocaleIDParser;->parseCountry()I HSPLandroid/icu/impl/LocaleIDParser;->parseKeywords()I -HSPLandroid/icu/impl/LocaleIDParser;->parseLanguage()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLandroid/icu/impl/LocaleIDParser;->parseScript()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/icu/impl/LocaleIDParser;->parseLanguage()I +HSPLandroid/icu/impl/LocaleIDParser;->parseScript()I HSPLandroid/icu/impl/LocaleIDParser;->parseVariant()I HSPLandroid/icu/impl/LocaleIDParser;->reset()V HSPLandroid/icu/impl/LocaleIDParser;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)V @@ -8803,12 +8745,15 @@ HSPLandroid/icu/impl/LocaleIDParser;->skipCountry()V HSPLandroid/icu/impl/LocaleIDParser;->skipLanguage()V HSPLandroid/icu/impl/LocaleIDParser;->skipScript()V HSPLandroid/icu/impl/LocaleIDParser;->skipUntilTerminatorOrIDSeparator()V +HSPLandroid/icu/impl/LocaleIDs;->findIndex([Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/icu/impl/Norm2AllModes$ComposeNormalizer2;->spanQuickCheckYes(Ljava/lang/CharSequence;)I +HSPLandroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;->getQuickCheck(I)I HSPLandroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;->normalizeAndAppend(Ljava/lang/CharSequence;ZLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V HSPLandroid/icu/impl/Norm2AllModes$DecomposeNormalizer2;->spanQuickCheckYes(Ljava/lang/CharSequence;)I HSPLandroid/icu/impl/Norm2AllModes$NFKCSingleton;->-$$Nest$sfgetINSTANCE()Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton; HSPLandroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;->-$$Nest$fgetallModes(Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;)Landroid/icu/impl/Norm2AllModes; HSPLandroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;->-$$Nest$fgetexception(Landroid/icu/impl/Norm2AllModes$Norm2AllModesSingleton;)Ljava/lang/RuntimeException; +HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->getCombiningClass(I)I HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalize(Ljava/lang/CharSequence;Ljava/lang/StringBuilder;)Ljava/lang/StringBuilder; HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;)Ljava/lang/StringBuilder; HSPLandroid/icu/impl/Norm2AllModes$Normalizer2WithImpl;->normalizeSecondAndAppend(Ljava/lang/StringBuilder;Ljava/lang/CharSequence;Z)Ljava/lang/StringBuilder; @@ -8822,7 +8767,7 @@ HSPLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;->flushAndAppendZeroCC(Lja HSPLandroid/icu/impl/Normalizer2Impl;->addToStartSet(Landroid/icu/util/MutableCodePointTrie;II)V HSPLandroid/icu/impl/Normalizer2Impl;->composeQuickCheck(Ljava/lang/CharSequence;IIZZ)I HSPLandroid/icu/impl/Normalizer2Impl;->decompose(IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V -HSPLandroid/icu/impl/Normalizer2Impl;->decompose(Ljava/lang/CharSequence;IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)I+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/icu/impl/Normalizer2Impl;->decompose(Ljava/lang/CharSequence;IILandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)I HSPLandroid/icu/impl/Normalizer2Impl;->decomposeAndAppend(Ljava/lang/CharSequence;ZLandroid/icu/impl/Normalizer2Impl$ReorderingBuffer;)V HSPLandroid/icu/impl/Normalizer2Impl;->ensureCanonIterData()Landroid/icu/impl/Normalizer2Impl; HSPLandroid/icu/impl/Normalizer2Impl;->getRawNorm16(I)I @@ -8852,11 +8797,11 @@ HSPLandroid/icu/impl/OlsonTimeZone;->initialDstOffset()I HSPLandroid/icu/impl/OlsonTimeZone;->initialRawOffset()I HSPLandroid/icu/impl/OlsonTimeZone;->isFrozen()Z HSPLandroid/icu/impl/OlsonTimeZone;->loadRule(Landroid/icu/util/UResourceBundle;Ljava/lang/String;)Landroid/icu/util/UResourceBundle; -HSPLandroid/icu/impl/OlsonTimeZone;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/icu/impl/OlsonTimeZone;->toString()Ljava/lang/String; HSPLandroid/icu/impl/PatternProps;->isWhiteSpace(I)Z HSPLandroid/icu/impl/PatternProps;->skipWhiteSpace(Ljava/lang/CharSequence;I)I HSPLandroid/icu/impl/PatternTokenizer;->()V -HSPLandroid/icu/impl/PatternTokenizer;->next(Ljava/lang/StringBuffer;)I+]Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet; +HSPLandroid/icu/impl/PatternTokenizer;->next(Ljava/lang/StringBuffer;)I HSPLandroid/icu/impl/PatternTokenizer;->quoteLiteral(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/impl/PatternTokenizer;->setExtraQuotingCharacters(Landroid/icu/text/UnicodeSet;)Landroid/icu/impl/PatternTokenizer; HSPLandroid/icu/impl/PatternTokenizer;->setPattern(Ljava/lang/String;)Landroid/icu/impl/PatternTokenizer; @@ -8877,7 +8822,7 @@ HSPLandroid/icu/impl/RBBIDataWrapper;->get(Ljava/nio/ByteBuffer;)Landroid/icu/im HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->(Ljava/lang/String;)V HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->getLength()I HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->getText([CI)I -HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->next()I+]Landroid/icu/text/Replaceable;Landroid/icu/text/ReplaceableString; +HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->next()I HSPLandroid/icu/impl/ReplaceableUCharacterIterator;->setIndex(I)V HSPLandroid/icu/impl/RuleCharacterIterator;->_advance(I)V HSPLandroid/icu/impl/RuleCharacterIterator;->_current()I @@ -8930,7 +8875,6 @@ HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->getName(Landroid/icu/text/TimeZo HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNames;->getNameTypeIndex(Landroid/icu/text/TimeZoneNames$NameType;)I HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->-$$Nest$mgetNames(Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;)[Ljava/lang/String; HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->()V -HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->(Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader-IA;)V HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->getNames()[Ljava/lang/String; HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->loadMetaZone(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V HSPLandroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader;->loadNames(Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V @@ -8950,6 +8894,7 @@ HSPLandroid/icu/impl/TimeZoneNamesImpl;->initialize(Landroid/icu/util/ULocale;)V HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadMetaZoneNames(Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames; HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadStrings(Ljava/lang/String;)V HSPLandroid/icu/impl/TimeZoneNamesImpl;->loadTimeZoneNames(Ljava/lang/String;)Landroid/icu/impl/TimeZoneNamesImpl$ZNames; +HSPLandroid/icu/impl/Trie2$Trie2Iterator;->next()Landroid/icu/impl/Trie2$Range; HSPLandroid/icu/impl/Trie2;->()V HSPLandroid/icu/impl/Trie2;->createFromSerialized(Ljava/nio/ByteBuffer;)Landroid/icu/impl/Trie2; HSPLandroid/icu/impl/Trie2Writable;->(II)V @@ -8965,6 +8910,7 @@ HSPLandroid/icu/impl/Trie2Writable;->setIndex2Entry(II)V HSPLandroid/icu/impl/Trie2Writable;->setRange(IIIZ)Landroid/icu/impl/Trie2Writable; HSPLandroid/icu/impl/Trie2Writable;->writeBlock(II)V HSPLandroid/icu/impl/Trie2_16;->get(I)I +HSPLandroid/icu/impl/Trie2_16;->rangeEnd(III)I HSPLandroid/icu/impl/Trie2_32;->get(I)I HSPLandroid/icu/impl/Trie2_32;->getFromU16SingleLead(C)I HSPLandroid/icu/impl/UBiDiProps;->getClass(I)I @@ -8977,7 +8923,9 @@ HSPLandroid/icu/impl/UCaseProps;->isUpperOrTitleFromProps(I)Z HSPLandroid/icu/impl/UCaseProps;->propsHasException(I)Z HSPLandroid/icu/impl/UCaseProps;->toUpperOrTitle(ILandroid/icu/impl/UCaseProps$ContextIterator;Ljava/lang/Appendable;IZ)I HSPLandroid/icu/impl/UCharacterProperty$IntProperty;->getValue(I)I +HSPLandroid/icu/impl/UCharacterProperty;->addPropertyStarts(Landroid/icu/text/UnicodeSet;)Landroid/icu/text/UnicodeSet; HSPLandroid/icu/impl/UCharacterProperty;->digit(I)I +HSPLandroid/icu/impl/UCharacterProperty;->getAdditional(II)I HSPLandroid/icu/impl/UCharacterProperty;->getIntPropertyValue(II)I HSPLandroid/icu/impl/UCharacterProperty;->getNumericTypeValue(I)I HSPLandroid/icu/impl/UCharacterProperty;->getProperty(I)I @@ -9001,11 +8949,12 @@ HSPLandroid/icu/impl/UResource$Sink;->()V HSPLandroid/icu/impl/UResource$Value;->()V HSPLandroid/icu/impl/UResource$Value;->toString()Ljava/lang/String; HSPLandroid/icu/impl/Utility;->addExact(II)I -HSPLandroid/icu/impl/Utility;->appendTo(Ljava/lang/CharSequence;Ljava/lang/Appendable;)Ljava/lang/Appendable;+]Ljava/lang/Appendable;Ljava/lang/StringBuffer; +HSPLandroid/icu/impl/Utility;->appendTo(Ljava/lang/CharSequence;Ljava/lang/Appendable;)Ljava/lang/Appendable; HSPLandroid/icu/impl/Utility;->arrayEquals([BLjava/lang/Object;)Z HSPLandroid/icu/impl/Utility;->arrayRegionMatches([BI[BII)Z HSPLandroid/icu/impl/Utility;->sameObjects(Ljava/lang/Object;Ljava/lang/Object;)Z HSPLandroid/icu/impl/Utility;->shouldAlwaysBeEscaped(I)Z +HSPLandroid/icu/impl/ValidIdentifiers$ValiditySet;->(Ljava/util/Set;Z)V HSPLandroid/icu/impl/ZoneMeta$SystemTimeZoneCache;->createInstance(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/icu/impl/ZoneMeta$SystemTimeZoneCache;->createInstance(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/OlsonTimeZone; HSPLandroid/icu/impl/ZoneMeta;->findCLDRCanonicalID(Ljava/lang/String;)Ljava/lang/String; @@ -9132,9 +9081,9 @@ HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_scrt(Landroid/icu/impl HSPLandroid/icu/impl/locale/BaseLocale$Key;->-$$Nest$fget_vart(Landroid/icu/impl/locale/BaseLocale$Key;)Ljava/lang/String; HSPLandroid/icu/impl/locale/BaseLocale$Key;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/icu/impl/locale/BaseLocale$Key;->equals(Ljava/lang/Object;)Z -HSPLandroid/icu/impl/locale/BaseLocale$Key;->hashCode()I+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/locale/BaseLocale$Key;->hashCode()I HSPLandroid/icu/impl/locale/BaseLocale$Key;->normalize(Landroid/icu/impl/locale/BaseLocale$Key;)Landroid/icu/impl/locale/BaseLocale$Key; -HSPLandroid/icu/impl/locale/BaseLocale;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/locale/BaseLocale;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/icu/impl/locale/BaseLocale;->(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/icu/impl/locale/BaseLocale-IA;)V HSPLandroid/icu/impl/locale/BaseLocale;->getInstance(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/icu/impl/locale/BaseLocale; HSPLandroid/icu/impl/locale/BaseLocale;->getLanguage()Ljava/lang/String; @@ -9146,8 +9095,14 @@ HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->getBaseLocale()Landroid/icu/ HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->getLocaleExtensions()Landroid/icu/impl/locale/LocaleExtensions; HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->setLanguage(Ljava/lang/String;)Landroid/icu/impl/locale/InternalLocaleBuilder; HSPLandroid/icu/impl/locale/InternalLocaleBuilder;->setRegion(Ljava/lang/String;)Landroid/icu/impl/locale/InternalLocaleBuilder; +HSPLandroid/icu/impl/locale/KeyTypeData;->initFromResourceBundle()V +HSPLandroid/icu/impl/locale/LSR$CachedDecoder$$ExternalSyntheticLambda0;->()V +HSPLandroid/icu/impl/locale/LSR$CachedDecoder;->decode(I)[Ljava/lang/String; +HSPLandroid/icu/impl/locale/LSR$CachedDecoder;->toLanguage(I)Ljava/lang/String; +HSPLandroid/icu/impl/locale/LSR;->indexForRegion(Ljava/lang/String;)I HSPLandroid/icu/impl/locale/LanguageTag;->isLanguage(Ljava/lang/String;)Z HSPLandroid/icu/impl/locale/LanguageTag;->isRegion(Ljava/lang/String;)Z +HSPLandroid/icu/impl/locale/LikelySubtags;->maximize(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Landroid/icu/impl/locale/LSR; HSPLandroid/icu/impl/locale/LocaleExtensions;->getKeys()Ljava/util/Set; HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/ref/ReferenceQueue;)V HSPLandroid/icu/impl/locale/LocaleObjectCache$CacheEntry;->getKey()Ljava/lang/Object; @@ -9155,7 +9110,7 @@ HSPLandroid/icu/impl/locale/LocaleObjectCache;->cleanStaleEntries()V HSPLandroid/icu/impl/locale/LocaleObjectCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/icu/impl/number/AdoptingModifierStore$1;->()V HSPLandroid/icu/impl/number/AdoptingModifierStore;->(Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/Modifier;)V -HSPLandroid/icu/impl/number/AdoptingModifierStore;->getModifierWithoutPlural(Landroid/icu/impl/number/Modifier$Signum;)Landroid/icu/impl/number/Modifier;+]Landroid/icu/impl/number/Modifier$Signum;Landroid/icu/impl/number/Modifier$Signum; +HSPLandroid/icu/impl/number/AdoptingModifierStore;->getModifierWithoutPlural(Landroid/icu/impl/number/Modifier$Signum;)Landroid/icu/impl/number/Modifier; HSPLandroid/icu/impl/number/AffixUtils;->containsType(Ljava/lang/CharSequence;I)Z HSPLandroid/icu/impl/number/AffixUtils;->escape(Ljava/lang/CharSequence;)Ljava/lang/String; HSPLandroid/icu/impl/number/AffixUtils;->getFieldForType(I)Landroid/icu/text/NumberFormat$Field; @@ -9170,14 +9125,14 @@ HSPLandroid/icu/impl/number/AffixUtils;->makeTag(IIII)J HSPLandroid/icu/impl/number/AffixUtils;->nextToken(JLjava/lang/CharSequence;)J HSPLandroid/icu/impl/number/AffixUtils;->unescape(Ljava/lang/CharSequence;Landroid/icu/impl/FormattedStringBuilder;ILandroid/icu/impl/number/AffixUtils$SymbolProvider;Landroid/icu/text/NumberFormat$Field;)I HSPLandroid/icu/impl/number/AffixUtils;->unescapedCount(Ljava/lang/CharSequence;ZLandroid/icu/impl/number/AffixUtils$SymbolProvider;)I -HSPLandroid/icu/impl/number/ConstantAffixModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder; +HSPLandroid/icu/impl/number/ConstantAffixModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;ZZ)V HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->(Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;ZZLandroid/icu/impl/number/Modifier$Parameters;)V -HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder; +HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I HSPLandroid/icu/impl/number/ConstantMultiFieldModifier;->getPrefixLength()I HSPLandroid/icu/impl/number/CurrencySpacingEnabledModifier;->applyCurrencySpacing(Landroid/icu/impl/FormattedStringBuilder;IIIILandroid/icu/text/DecimalFormatSymbols;)I HSPLandroid/icu/impl/number/CurrencySpacingEnabledModifier;->applyCurrencySpacingAffix(Landroid/icu/impl/FormattedStringBuilder;IBLandroid/icu/text/DecimalFormatSymbols;)I -HSPLandroid/icu/impl/number/CustomSymbolCurrency;->resolve(Landroid/icu/util/Currency;Landroid/icu/util/ULocale;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/util/Currency;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/util/Currency;Landroid/icu/util/Currency; +HSPLandroid/icu/impl/number/CustomSymbolCurrency;->resolve(Landroid/icu/util/Currency;Landroid/icu/util/ULocale;Landroid/icu/text/DecimalFormatSymbols;)Landroid/icu/util/Currency; HSPLandroid/icu/impl/number/DecimalFormatProperties;->()V HSPLandroid/icu/impl/number/DecimalFormatProperties;->_clear()Landroid/icu/impl/number/DecimalFormatProperties; HSPLandroid/icu/impl/number/DecimalFormatProperties;->_copyFrom(Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/DecimalFormatProperties; @@ -9257,14 +9212,14 @@ HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->()V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigDecimal(Ljava/math/BigDecimal;)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToBigInteger(Ljava/math/BigInteger;)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToDoubleFast(D)V -HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToLong(J)V+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->_setToLong(J)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->adjustMagnitude(I)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->appendDigit(BIZ)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->applyMaxInteger(I)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->convertToAccurateDouble()V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->copyFrom(Landroid/icu/impl/number/DecimalQuantity;)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->fitsInLong()Z -HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getDigit(I)B+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getDigit(I)B HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getLowerDisplayMagnitude()I HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getMagnitude()I HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->getPluralOperand(Landroid/icu/text/PluralRules$Operand;)D @@ -9277,18 +9232,18 @@ HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->isZeroish()Z HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->negate()V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->populateUFieldPosition(Ljava/text/FieldPosition;)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->roundToMagnitude(ILjava/math/MathContext;)V -HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->roundToMagnitude(ILjava/math/MathContext;Z)V+]Ljava/math/MathContext;Ljava/math/MathContext;]Ljava/math/RoundingMode;Ljava/math/RoundingMode;]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->roundToMagnitude(ILjava/math/MathContext;Z)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->safeSubtract(II)I HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setMinFraction(I)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setMinInteger(I)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToBigDecimal(Ljava/math/BigDecimal;)V -HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToDouble(D)V+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToDouble(D)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToInt(I)V HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->setToLong(J)V -HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->signum()Landroid/icu/impl/number/Modifier$Signum;+]Landroid/icu/impl/number/DecimalQuantity_AbstractBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->signum()Landroid/icu/impl/number/Modifier$Signum; HSPLandroid/icu/impl/number/DecimalQuantity_AbstractBCD;->toLong(Z)J HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->()V -HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->(D)V+]Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->(D)V HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->(I)V HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->(J)V HSPLandroid/icu/impl/number/DecimalQuantity_DualStorageBCD;->(Ljava/lang/Number;)V @@ -9320,14 +9275,14 @@ HSPLandroid/icu/impl/number/MacroProps;->()V HSPLandroid/icu/impl/number/MacroProps;->fallback(Landroid/icu/impl/number/MacroProps;)V HSPLandroid/icu/impl/number/MicroProps;->(Z)V HSPLandroid/icu/impl/number/MicroProps;->clone()Ljava/lang/Object; -HSPLandroid/icu/impl/number/MicroProps;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/MicroProps; +HSPLandroid/icu/impl/number/MicroProps;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/impl/number/Modifier$Signum;->values()[Landroid/icu/impl/number/Modifier$Signum; HSPLandroid/icu/impl/number/MultiplierFormatHandler;->(Landroid/icu/number/Scale;Landroid/icu/impl/number/MicroPropsGenerator;)V HSPLandroid/icu/impl/number/MultiplierFormatHandler;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->(Landroid/icu/impl/number/AdoptingModifierStore;Landroid/icu/text/PluralRules;)V HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->addToChain(Landroid/icu/impl/number/MicroPropsGenerator;)Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier; -HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->applyToMicros(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;)V+]Landroid/icu/impl/number/AdoptingModifierStore;Landroid/icu/impl/number/AdoptingModifierStore;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; -HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroPropsGenerator;Landroid/icu/impl/number/MicroProps;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl;]Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier; +HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->applyToMicros(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;)V +HSPLandroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;->processQuantity(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/impl/number/MutablePatternModifier;->(Z)V HSPLandroid/icu/impl/number/MutablePatternModifier;->addToChain(Landroid/icu/impl/number/MicroPropsGenerator;)Landroid/icu/impl/number/MicroPropsGenerator; HSPLandroid/icu/impl/number/MutablePatternModifier;->apply(Landroid/icu/impl/FormattedStringBuilder;II)I @@ -9346,7 +9301,6 @@ HSPLandroid/icu/impl/number/MutablePatternModifier;->setPatternInfo(Landroid/icu HSPLandroid/icu/impl/number/MutablePatternModifier;->setSymbols(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/util/Currency;Landroid/icu/number/NumberFormatter$UnitWidth;Landroid/icu/text/PluralRules;)V HSPLandroid/icu/impl/number/Padder;->isValid()Z HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->(Ljava/lang/String;)V -HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->(Ljava/lang/String;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo-IA;)V HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->getEndpoints(I)J HSPLandroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;->getString(I)Ljava/lang/String; HSPLandroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;->()V @@ -9357,7 +9311,7 @@ HSPLandroid/icu/impl/number/PatternStringParser;->consumeAffix(Landroid/icu/impl HSPLandroid/icu/impl/number/PatternStringParser;->consumeExponent(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V HSPLandroid/icu/impl/number/PatternStringParser;->consumeFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V HSPLandroid/icu/impl/number/PatternStringParser;->consumeFractionFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V -HSPLandroid/icu/impl/number/PatternStringParser;->consumeIntegerFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V+]Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParserState; +HSPLandroid/icu/impl/number/PatternStringParser;->consumeIntegerFormat(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;)V HSPLandroid/icu/impl/number/PatternStringParser;->consumeLiteral(Landroid/icu/impl/number/PatternStringParser$ParserState;)V HSPLandroid/icu/impl/number/PatternStringParser;->consumePadding(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo;Landroid/icu/impl/number/Padder$PadPosition;)V HSPLandroid/icu/impl/number/PatternStringParser;->consumePattern(Landroid/icu/impl/number/PatternStringParser$ParserState;Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo;)V @@ -9370,9 +9324,9 @@ HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;->()V HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;->(Ljava/lang/String;I)V HSPLandroid/icu/impl/number/PatternStringUtils$PatternSignType;->values()[Landroid/icu/impl/number/PatternStringUtils$PatternSignType; HSPLandroid/icu/impl/number/PatternStringUtils;->patternInfoToStringBuilder(Landroid/icu/impl/number/AffixPatternProvider;ZLandroid/icu/impl/number/PatternStringUtils$PatternSignType;ZLandroid/icu/impl/StandardPlural;ZLjava/lang/StringBuilder;)V -HSPLandroid/icu/impl/number/PatternStringUtils;->propertiesToPatternString(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties; +HSPLandroid/icu/impl/number/PatternStringUtils;->propertiesToPatternString(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/lang/String; HSPLandroid/icu/impl/number/PatternStringUtils;->resolveSignDisplay(Landroid/icu/number/NumberFormatter$SignDisplay;Landroid/icu/impl/number/Modifier$Signum;)Landroid/icu/impl/number/PatternStringUtils$PatternSignType; -HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->(Landroid/icu/impl/number/DecimalFormatProperties;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties; +HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->(Landroid/icu/impl/number/DecimalFormatProperties;)V HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->charAt(II)C HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->containsSymbolType(I)Z HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->currencyAsDecimal()Z @@ -9380,7 +9334,7 @@ HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->forProperties(Landr HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->getString(I)Ljava/lang/String; HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasBody()Z HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasCurrencySign()Z -HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasNegativeSubpattern()Z+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->hasNegativeSubpattern()Z HSPLandroid/icu/impl/number/PropertiesAffixPatternProvider;->length(I)I HSPLandroid/icu/impl/number/RoundingUtils;->getMathContextOr34Digits(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/math/MathContext; HSPLandroid/icu/impl/number/RoundingUtils;->getMathContextOrUnlimited(Landroid/icu/impl/number/DecimalFormatProperties;)Ljava/math/MathContext; @@ -9410,7 +9364,7 @@ HSPLandroid/icu/impl/number/parse/AffixTokenMatcherFactory;->minusSign()Landroid HSPLandroid/icu/impl/number/parse/DecimalMatcher;->(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;I)V HSPLandroid/icu/impl/number/parse/DecimalMatcher;->getInstance(Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/Grouper;I)Landroid/icu/impl/number/parse/DecimalMatcher; HSPLandroid/icu/impl/number/parse/DecimalMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;)Z -HSPLandroid/icu/impl/number/parse/DecimalMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;I)Z+]Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/number/parse/ParsedNumber;Landroid/icu/impl/number/parse/ParsedNumber;]Landroid/icu/text/UnicodeSet;Landroid/icu/text/UnicodeSet;]Landroid/icu/impl/StringSegment;Landroid/icu/impl/StringSegment; +HSPLandroid/icu/impl/number/parse/DecimalMatcher;->match(Landroid/icu/impl/StringSegment;Landroid/icu/impl/number/parse/ParsedNumber;I)Z HSPLandroid/icu/impl/number/parse/DecimalMatcher;->postProcess(Landroid/icu/impl/number/parse/ParsedNumber;)V HSPLandroid/icu/impl/number/parse/DecimalMatcher;->smokeTest(Landroid/icu/impl/StringSegment;)Z HSPLandroid/icu/impl/number/parse/DecimalMatcher;->validateGroup(IIZ)Z @@ -9421,7 +9375,7 @@ HSPLandroid/icu/impl/number/parse/NanMatcher;->getInstance(Landroid/icu/text/Dec HSPLandroid/icu/impl/number/parse/NumberParserImpl;->(I)V HSPLandroid/icu/impl/number/parse/NumberParserImpl;->addMatcher(Landroid/icu/impl/number/parse/NumberParseMatcher;)V HSPLandroid/icu/impl/number/parse/NumberParserImpl;->addMatchers(Ljava/util/Collection;)V -HSPLandroid/icu/impl/number/parse/NumberParserImpl;->createParserFromProperties(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Z)Landroid/icu/impl/number/parse/NumberParserImpl;+]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/impl/number/parse/NumberParserImpl;Landroid/icu/impl/number/parse/NumberParserImpl;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties; +HSPLandroid/icu/impl/number/parse/NumberParserImpl;->createParserFromProperties(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Z)Landroid/icu/impl/number/parse/NumberParserImpl; HSPLandroid/icu/impl/number/parse/NumberParserImpl;->freeze()V HSPLandroid/icu/impl/number/parse/NumberParserImpl;->getParseFlags()I HSPLandroid/icu/impl/number/parse/NumberParserImpl;->parse(Ljava/lang/String;IZLandroid/icu/impl/number/parse/ParsedNumber;)V @@ -9473,6 +9427,7 @@ HSPLandroid/icu/lang/UCharacter;->isDigit(I)Z HSPLandroid/icu/lang/UCharacter;->isLowerCase(I)Z HSPLandroid/icu/lang/UScript$ScriptMetadata;->getScriptProps(I)I HSPLandroid/icu/lang/UScript;->getCodeFromName(Ljava/lang/String;)I +HSPLandroid/icu/lang/UScript;->getScript(I)I HSPLandroid/icu/lang/UScript;->isRightToLeft(I)Z HSPLandroid/icu/number/CurrencyPrecision;->withCurrency(Landroid/icu/util/Currency;)Landroid/icu/number/Precision; HSPLandroid/icu/number/FormattedNumber;->appendTo(Ljava/lang/Appendable;)Ljava/lang/Appendable; @@ -9481,33 +9436,33 @@ HSPLandroid/icu/number/IntegerWidth;->(II)V HSPLandroid/icu/number/IntegerWidth;->truncateAt(I)Landroid/icu/number/IntegerWidth; HSPLandroid/icu/number/IntegerWidth;->zeroFillTo(I)Landroid/icu/number/IntegerWidth; HSPLandroid/icu/number/LocalizedNumberFormatter;->(Landroid/icu/number/NumberFormatterSettings;ILjava/lang/Object;)V -HSPLandroid/icu/number/LocalizedNumberFormatter;->computeCompiled()Z+]Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;Ljava/util/concurrent/atomic/AtomicLongFieldUpdater$CASUpdater;]Landroid/icu/number/LocalizedNumberFormatter;Landroid/icu/number/LocalizedNumberFormatter;]Ljava/lang/Long;Ljava/lang/Long; +HSPLandroid/icu/number/LocalizedNumberFormatter;->computeCompiled()Z HSPLandroid/icu/number/LocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/LocalizedNumberFormatter; HSPLandroid/icu/number/LocalizedNumberFormatter;->create(ILjava/lang/Object;)Landroid/icu/number/NumberFormatterSettings; HSPLandroid/icu/number/LocalizedNumberFormatter;->format(D)Landroid/icu/number/FormattedNumber; HSPLandroid/icu/number/LocalizedNumberFormatter;->format(J)Landroid/icu/number/FormattedNumber; HSPLandroid/icu/number/LocalizedNumberFormatter;->format(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/number/FormattedNumber; -HSPLandroid/icu/number/LocalizedNumberFormatter;->formatImpl(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/number/NumberFormatterImpl;Landroid/icu/number/NumberFormatterImpl; +HSPLandroid/icu/number/LocalizedNumberFormatter;->formatImpl(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/number/LocalizedNumberFormatter;->getAffixImpl(ZZ)Ljava/lang/String; HSPLandroid/icu/number/NumberFormatter;->fromDecimalFormat(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/number/UnlocalizedNumberFormatter; HSPLandroid/icu/number/NumberFormatter;->with()Landroid/icu/number/UnlocalizedNumberFormatter; HSPLandroid/icu/number/NumberFormatterImpl;->(Landroid/icu/impl/number/MacroProps;)V -HSPLandroid/icu/number/NumberFormatterImpl;->format(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/number/NumberFormatterImpl;Landroid/icu/number/NumberFormatterImpl; +HSPLandroid/icu/number/NumberFormatterImpl;->format(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/number/NumberFormatterImpl;->formatStatic(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffix(BLandroid/icu/impl/StandardPlural;Landroid/icu/impl/FormattedStringBuilder;)I HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffixImpl(Landroid/icu/impl/number/MicroPropsGenerator;BLandroid/icu/impl/FormattedStringBuilder;)I HSPLandroid/icu/number/NumberFormatterImpl;->getPrefixSuffixStatic(Landroid/icu/impl/number/MacroProps;BLandroid/icu/impl/StandardPlural;Landroid/icu/impl/FormattedStringBuilder;)I -HSPLandroid/icu/number/NumberFormatterImpl;->macrosToMicroGenerator(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/MicroProps;Z)Landroid/icu/impl/number/MicroPropsGenerator;+]Landroid/icu/impl/number/MutablePatternModifier;Landroid/icu/impl/number/MutablePatternModifier;]Landroid/icu/text/NumberingSystem;Landroid/icu/text/NumberingSystem;]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl; -HSPLandroid/icu/number/NumberFormatterImpl;->preProcess(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps;+]Landroid/icu/impl/number/MicroPropsGenerator;Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/number/NumberFormatterImpl;->macrosToMicroGenerator(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/MicroProps;Z)Landroid/icu/impl/number/MicroPropsGenerator; +HSPLandroid/icu/number/NumberFormatterImpl;->preProcess(Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/number/NumberFormatterImpl;->preProcessUnsafe(Landroid/icu/impl/number/MacroProps;Landroid/icu/impl/number/DecimalQuantity;)Landroid/icu/impl/number/MicroProps; HSPLandroid/icu/number/NumberFormatterImpl;->unitIsBaseUnit(Landroid/icu/util/MeasureUnit;)Z HSPLandroid/icu/number/NumberFormatterImpl;->unitIsCurrency(Landroid/icu/util/MeasureUnit;)Z HSPLandroid/icu/number/NumberFormatterImpl;->unitIsPercent(Landroid/icu/util/MeasureUnit;)Z HSPLandroid/icu/number/NumberFormatterImpl;->unitIsPermille(Landroid/icu/util/MeasureUnit;)Z -HSPLandroid/icu/number/NumberFormatterImpl;->writeAffixes(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/FormattedStringBuilder;II)I+]Landroid/icu/impl/number/Padder;Landroid/icu/impl/number/Padder;]Landroid/icu/impl/number/Modifier;Landroid/icu/impl/number/ConstantMultiFieldModifier;,Landroid/icu/impl/number/ConstantAffixModifier; -HSPLandroid/icu/number/NumberFormatterImpl;->writeFractionDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; -HSPLandroid/icu/number/NumberFormatterImpl;->writeIntegerDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/Grouper;Landroid/icu/impl/number/Grouper;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/FormattedStringBuilder;Landroid/icu/impl/FormattedStringBuilder;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; -HSPLandroid/icu/number/NumberFormatterImpl;->writeNumber(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/number/NumberFormatterImpl;->writeAffixes(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/FormattedStringBuilder;II)I +HSPLandroid/icu/number/NumberFormatterImpl;->writeFractionDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I +HSPLandroid/icu/number/NumberFormatterImpl;->writeIntegerDigits(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I +HSPLandroid/icu/number/NumberFormatterImpl;->writeNumber(Landroid/icu/impl/number/MicroProps;Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;I)I HSPLandroid/icu/number/NumberFormatterSettings;->(Landroid/icu/number/NumberFormatterSettings;ILjava/lang/Object;)V HSPLandroid/icu/number/NumberFormatterSettings;->macros(Landroid/icu/impl/number/MacroProps;)Landroid/icu/number/NumberFormatterSettings; HSPLandroid/icu/number/NumberFormatterSettings;->perUnit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings; @@ -9515,9 +9470,9 @@ HSPLandroid/icu/number/NumberFormatterSettings;->resolve()Landroid/icu/impl/numb HSPLandroid/icu/number/NumberFormatterSettings;->unit(Landroid/icu/util/MeasureUnit;)Landroid/icu/number/NumberFormatterSettings; HSPLandroid/icu/number/NumberFormatterSettings;->unitWidth(Landroid/icu/number/NumberFormatter$UnitWidth;)Landroid/icu/number/NumberFormatterSettings; HSPLandroid/icu/number/NumberPropertyMapper;->create(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/number/UnlocalizedNumberFormatter; -HSPLandroid/icu/number/NumberPropertyMapper;->oldToNew(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/MacroProps;+]Ljava/math/MathContext;Ljava/math/MathContext;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/number/AffixPatternProvider;Landroid/icu/impl/number/PropertiesAffixPatternProvider;]Landroid/icu/number/Precision;Landroid/icu/number/Precision$FractionRounderImpl;,Landroid/icu/number/Precision$CurrencyRounderImpl;]Landroid/icu/number/IntegerWidth;Landroid/icu/number/IntegerWidth;]Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/impl/number/DecimalFormatProperties;]Landroid/icu/number/CurrencyPrecision;Landroid/icu/number/Precision$CurrencyRounderImpl;]Landroid/icu/util/Currency;Landroid/icu/util/Currency; +HSPLandroid/icu/number/NumberPropertyMapper;->oldToNew(Landroid/icu/impl/number/DecimalFormatProperties;Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/impl/number/DecimalFormatProperties;)Landroid/icu/impl/number/MacroProps; HSPLandroid/icu/number/Precision$FractionRounderImpl;->(II)V -HSPLandroid/icu/number/Precision$FractionRounderImpl;->apply(Landroid/icu/impl/number/DecimalQuantity;)V+]Landroid/icu/number/Precision$FractionRounderImpl;Landroid/icu/number/Precision$FractionRounderImpl;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/number/Precision$FractionRounderImpl;->apply(Landroid/icu/impl/number/DecimalQuantity;)V HSPLandroid/icu/number/Precision$FractionRounderImpl;->createCopy()Landroid/icu/number/Precision$FractionRounderImpl; HSPLandroid/icu/number/Precision$FractionRounderImpl;->createCopy()Landroid/icu/number/Precision; HSPLandroid/icu/number/Precision;->-$$Nest$smgetDisplayMagnitudeFraction(I)I @@ -9528,7 +9483,7 @@ HSPLandroid/icu/number/Precision;->constructFraction(II)Landroid/icu/number/Frac HSPLandroid/icu/number/Precision;->constructFromCurrency(Landroid/icu/number/CurrencyPrecision;Landroid/icu/util/Currency;)Landroid/icu/number/Precision; HSPLandroid/icu/number/Precision;->getDisplayMagnitudeFraction(I)I HSPLandroid/icu/number/Precision;->getRoundingMagnitudeFraction(I)I -HSPLandroid/icu/number/Precision;->setResolvedMinFraction(Landroid/icu/impl/number/DecimalQuantity;I)V+]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; +HSPLandroid/icu/number/Precision;->setResolvedMinFraction(Landroid/icu/impl/number/DecimalQuantity;I)V HSPLandroid/icu/number/Precision;->withLocaleData(Landroid/icu/util/Currency;)Landroid/icu/number/Precision; HSPLandroid/icu/number/Precision;->withMode(Ljava/math/MathContext;)Landroid/icu/number/Precision; HSPLandroid/icu/number/Scale;->applyTo(Landroid/icu/impl/number/DecimalQuantity;)V @@ -9543,6 +9498,7 @@ HSPLandroid/icu/platform/AndroidDataFiles;->getI18nModuleFile(Ljava/lang/String; HSPLandroid/icu/platform/AndroidDataFiles;->getI18nModuleIcuFile(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/platform/AndroidDataFiles;->getTimeZoneModuleFile(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/platform/AndroidDataFiles;->getTimeZoneModuleIcuFile(Ljava/lang/String;)Ljava/lang/String; +HSPLandroid/icu/text/AnyTransliterator;->register()V HSPLandroid/icu/text/Bidi;->(II)V HSPLandroid/icu/text/Bidi;->DirPropFlag(B)I HSPLandroid/icu/text/Bidi;->GetParaLevelAt(I)B @@ -9577,7 +9533,7 @@ HSPLandroid/icu/text/CollationKey;->toByteArray()[B HSPLandroid/icu/text/Collator$ServiceShim;->()V HSPLandroid/icu/text/Collator;->()V HSPLandroid/icu/text/Collator;->clone()Ljava/lang/Object; -HSPLandroid/icu/text/Collator;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator;+]Landroid/icu/text/Collator$ServiceShim;Landroid/icu/text/CollatorServiceShim;]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale; +HSPLandroid/icu/text/Collator;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator; HSPLandroid/icu/text/Collator;->getInstance(Ljava/util/Locale;)Landroid/icu/text/Collator; HSPLandroid/icu/text/Collator;->getShim()Landroid/icu/text/Collator$ServiceShim; HSPLandroid/icu/text/CollatorServiceShim$CService$1CollatorFactory;->handleCreate(Landroid/icu/util/ULocale;ILandroid/icu/impl/ICUService;)Ljava/lang/Object; @@ -9585,13 +9541,13 @@ HSPLandroid/icu/text/CollatorServiceShim$CService;->validateFallbackLocale()Ljav HSPLandroid/icu/text/CollatorServiceShim;->()V HSPLandroid/icu/text/CollatorServiceShim;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator; HSPLandroid/icu/text/CollatorServiceShim;->makeInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/Collator; -HSPLandroid/icu/text/ConstrainedFieldPosition;->()V+]Landroid/icu/text/ConstrainedFieldPosition;Landroid/icu/text/ConstrainedFieldPosition; +HSPLandroid/icu/text/ConstrainedFieldPosition;->()V HSPLandroid/icu/text/ConstrainedFieldPosition;->constrainField(Ljava/text/Format$Field;)V HSPLandroid/icu/text/ConstrainedFieldPosition;->getField()Ljava/text/Format$Field; HSPLandroid/icu/text/ConstrainedFieldPosition;->getFieldValue()Ljava/lang/Object; HSPLandroid/icu/text/ConstrainedFieldPosition;->getLimit()I HSPLandroid/icu/text/ConstrainedFieldPosition;->getStart()I -HSPLandroid/icu/text/ConstrainedFieldPosition;->matchesField(Ljava/text/Format$Field;Ljava/lang/Object;)Z+]Landroid/icu/text/ConstrainedFieldPosition$ConstraintType;Landroid/icu/text/ConstrainedFieldPosition$ConstraintType; +HSPLandroid/icu/text/ConstrainedFieldPosition;->matchesField(Ljava/text/Format$Field;Ljava/lang/Object;)Z HSPLandroid/icu/text/ConstrainedFieldPosition;->reset()V HSPLandroid/icu/text/ConstrainedFieldPosition;->setState(Ljava/text/Format$Field;Ljava/lang/Object;II)V HSPLandroid/icu/text/CurrencyDisplayNames;->()V @@ -9644,7 +9600,6 @@ HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/text/DateFo HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;)V HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Landroid/icu/impl/ICUResourceBundle;Ljava/lang/String;Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols;)V HSPLandroid/icu/text/DateFormatSymbols;->initializeData(Landroid/icu/util/ULocale;Ljava/lang/String;)V -HSPLandroid/icu/text/DateFormatSymbols;->loadDayPeriodStrings(Ljava/util/Map;)[Ljava/lang/String; HSPLandroid/icu/text/DateFormatSymbols;->setLocale(Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;)V HSPLandroid/icu/text/DateFormatSymbols;->setTimeSeparatorString(Ljava/lang/String;)V HSPLandroid/icu/text/DateIntervalFormat;->(Ljava/lang/String;Landroid/icu/util/ULocale;Landroid/icu/text/SimpleDateFormat;)V @@ -9690,7 +9645,7 @@ HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->fieldIsNumeric(I HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getBasePattern()Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getDistance(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;)I HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->getFieldMask()I -HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->set(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$FormatParser;Z)Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/text/DateTimePatternGenerator$VariableField;Landroid/icu/text/DateTimePatternGenerator$VariableField;]Landroid/icu/text/DateTimePatternGenerator$FormatParser;Landroid/icu/text/DateTimePatternGenerator$FormatParser;]Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;Landroid/icu/text/DateTimePatternGenerator$SkeletonFields;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLandroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;->set(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$FormatParser;Z)Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher; HSPLandroid/icu/text/DateTimePatternGenerator$DisplayWidth;->cldrKey()Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->()V HSPLandroid/icu/text/DateTimePatternGenerator$DistanceInfo;->addExtra(I)V @@ -9702,7 +9657,7 @@ HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->addVariable(Ljava/l HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->getItems()Ljava/util/List; HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->quoteLiteral(Ljava/lang/String;)Ljava/lang/Object; HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;)Landroid/icu/text/DateTimePatternGenerator$FormatParser; -HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;Z)Landroid/icu/text/DateTimePatternGenerator$FormatParser;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Landroid/icu/impl/PatternTokenizer;Landroid/icu/impl/PatternTokenizer; +HSPLandroid/icu/text/DateTimePatternGenerator$FormatParser;->set(Ljava/lang/String;Z)Landroid/icu/text/DateTimePatternGenerator$FormatParser; HSPLandroid/icu/text/DateTimePatternGenerator$PatternInfo;->()V HSPLandroid/icu/text/DateTimePatternGenerator$PatternWithMatcher;->(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)V HSPLandroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag;->(Ljava/lang/String;Z)V @@ -9745,9 +9700,9 @@ HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;I)Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator;->getBestPattern(Ljava/lang/String;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;IZ)Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator;->getBestRaw(Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;ILandroid/icu/text/DateTimePatternGenerator$DistanceInfo;Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher;)Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher; -HSPLandroid/icu/text/DateTimePatternGenerator;->getCLDRFieldAndWidthNumber(Landroid/icu/impl/UResource$Key;)I+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/UResource$Key;Landroid/icu/impl/UResource$Key; +HSPLandroid/icu/text/DateTimePatternGenerator;->getCLDRFieldAndWidthNumber(Landroid/icu/impl/UResource$Key;)I HSPLandroid/icu/text/DateTimePatternGenerator;->getCalendarTypeToUse(Landroid/icu/util/ULocale;)Ljava/lang/String; -HSPLandroid/icu/text/DateTimePatternGenerator;->getCanonicalIndex(Ljava/lang/String;Z)I+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/icu/text/DateTimePatternGenerator;->getCanonicalIndex(Ljava/lang/String;Z)I HSPLandroid/icu/text/DateTimePatternGenerator;->getDateTimeFormat()Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator;->getFieldDisplayName(ILandroid/icu/text/DateTimePatternGenerator$DisplayWidth;)Ljava/lang/String; HSPLandroid/icu/text/DateTimePatternGenerator;->getFilteredPattern(Landroid/icu/text/DateTimePatternGenerator$FormatParser;Ljava/util/BitSet;)Ljava/lang/String; @@ -9770,8 +9725,8 @@ HSPLandroid/icu/text/DateTimePatternGenerator;->setFieldDisplayName(ILandroid/ic HSPLandroid/icu/text/DecimalFormat;->(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;)V HSPLandroid/icu/text/DecimalFormat;->(Ljava/lang/String;Landroid/icu/text/DecimalFormatSymbols;I)V HSPLandroid/icu/text/DecimalFormat;->clone()Ljava/lang/Object; -HSPLandroid/icu/text/DecimalFormat;->fieldPositionHelper(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;I)V+]Ljava/text/FieldPosition;Ljava/text/DontCareFieldPosition;]Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/number/DecimalQuantity_DualStorageBCD; -HSPLandroid/icu/text/DecimalFormat;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer;+]Landroid/icu/number/LocalizedNumberFormatter;Landroid/icu/number/LocalizedNumberFormatter;]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer; +HSPLandroid/icu/text/DecimalFormat;->fieldPositionHelper(Landroid/icu/impl/number/DecimalQuantity;Landroid/icu/impl/FormattedStringBuilder;Ljava/text/FieldPosition;I)V +HSPLandroid/icu/text/DecimalFormat;->format(DLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer; HSPLandroid/icu/text/DecimalFormat;->format(JLjava/lang/StringBuffer;Ljava/text/FieldPosition;)Ljava/lang/StringBuffer; HSPLandroid/icu/text/DecimalFormat;->getDecimalFormatSymbols()Landroid/icu/text/DecimalFormatSymbols; HSPLandroid/icu/text/DecimalFormat;->getMaximumFractionDigits()I @@ -9786,7 +9741,7 @@ HSPLandroid/icu/text/DecimalFormat;->getPositiveSuffix()Ljava/lang/String; HSPLandroid/icu/text/DecimalFormat;->isParseBigDecimal()Z HSPLandroid/icu/text/DecimalFormat;->isParseIntegerOnly()Z HSPLandroid/icu/text/DecimalFormat;->parse(Ljava/lang/String;Ljava/text/ParsePosition;)Ljava/lang/Number; -HSPLandroid/icu/text/DecimalFormat;->refreshFormatter()V+]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/number/UnlocalizedNumberFormatter;Landroid/icu/number/UnlocalizedNumberFormatter;]Landroid/icu/text/DecimalFormat;Landroid/icu/text/DecimalFormat; +HSPLandroid/icu/text/DecimalFormat;->refreshFormatter()V HSPLandroid/icu/text/DecimalFormat;->setCurrency(Landroid/icu/util/Currency;)V HSPLandroid/icu/text/DecimalFormat;->setDecimalSeparatorAlwaysShown(Z)V HSPLandroid/icu/text/DecimalFormat;->setGroupingUsed(Z)V @@ -9840,7 +9795,7 @@ HSPLandroid/icu/text/DecimalFormatSymbols;->getPlusSignString()Ljava/lang/String HSPLandroid/icu/text/DecimalFormatSymbols;->getULocale()Landroid/icu/util/ULocale; HSPLandroid/icu/text/DecimalFormatSymbols;->getZeroDigit()C HSPLandroid/icu/text/DecimalFormatSymbols;->initSpacingInfo(Landroid/icu/impl/CurrencyData$CurrencySpacingInfo;)V -HSPLandroid/icu/text/DecimalFormatSymbols;->initialize(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V+]Landroid/icu/impl/CurrencyData$CurrencyDisplayInfoProvider;Landroid/icu/impl/ICUCurrencyDisplayInfoProvider;]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;]Landroid/icu/text/DecimalFormatSymbols;Landroid/icu/text/DecimalFormatSymbols;]Landroid/icu/impl/CurrencyData$CurrencyDisplayInfo;Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo; +HSPLandroid/icu/text/DecimalFormatSymbols;->initialize(Landroid/icu/util/ULocale;Landroid/icu/text/NumberingSystem;)V HSPLandroid/icu/text/DecimalFormatSymbols;->loadData(Landroid/icu/util/ULocale;)Landroid/icu/text/DecimalFormatSymbols$CacheData; HSPLandroid/icu/text/DecimalFormatSymbols;->setApproximatelySignString(Ljava/lang/String;)V HSPLandroid/icu/text/DecimalFormatSymbols;->setCurrency(Landroid/icu/util/Currency;)V @@ -9874,11 +9829,14 @@ HSPLandroid/icu/text/DecimalFormatSymbols;->setPlusSign(C)V HSPLandroid/icu/text/DecimalFormatSymbols;->setPlusSignString(Ljava/lang/String;)V HSPLandroid/icu/text/DecimalFormatSymbols;->setZeroDigit(C)V HSPLandroid/icu/text/DisplayContext;->type()Landroid/icu/text/DisplayContext$Type; +HSPLandroid/icu/text/Edits$Iterator;->next()Z HSPLandroid/icu/text/Edits$Iterator;->next(Z)Z +HSPLandroid/icu/text/Edits$Iterator;->updateNextIndexes()V HSPLandroid/icu/text/Edits;->()V HSPLandroid/icu/text/Edits;->addReplace(II)V HSPLandroid/icu/text/Edits;->addUnchanged(I)V HSPLandroid/icu/text/Edits;->append(I)V +HSPLandroid/icu/text/Edits;->getCoarseIterator()Landroid/icu/text/Edits$Iterator; HSPLandroid/icu/text/Edits;->hasChanges()Z HSPLandroid/icu/text/Edits;->lastUnit()I HSPLandroid/icu/text/Edits;->reset()V @@ -10024,7 +9982,6 @@ HSPLandroid/icu/text/RuleBasedBreakIterator;->next()I HSPLandroid/icu/text/RuleBasedBreakIterator;->preceding(I)I HSPLandroid/icu/text/RuleBasedBreakIterator;->setText(Ljava/text/CharacterIterator;)V HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;->(Landroid/icu/impl/coll/CollationData;)V -HSPLandroid/icu/text/RuleBasedCollator$CollationBuffer;->(Landroid/icu/impl/coll/CollationData;Landroid/icu/text/RuleBasedCollator$CollationBuffer-IA;)V HSPLandroid/icu/text/RuleBasedCollator$CollationKeyByteSink;->(Landroid/icu/text/RawCollationKey;)V HSPLandroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator;->()V HSPLandroid/icu/text/RuleBasedCollator$NFDIterator;->()V @@ -10036,7 +9993,7 @@ HSPLandroid/icu/text/RuleBasedCollator;->checkNotFrozen()V HSPLandroid/icu/text/RuleBasedCollator;->clone()Ljava/lang/Object; HSPLandroid/icu/text/RuleBasedCollator;->cloneAsThawed()Landroid/icu/text/RuleBasedCollator; HSPLandroid/icu/text/RuleBasedCollator;->compare(Ljava/lang/String;Ljava/lang/String;)I -HSPLandroid/icu/text/RuleBasedCollator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I+]Landroid/icu/impl/coll/CollationData;Landroid/icu/impl/coll/CollationData;]Landroid/icu/impl/coll/SharedObject$Reference;Landroid/icu/impl/coll/SharedObject$Reference;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/icu/impl/coll/CollationSettings;Landroid/icu/impl/coll/CollationSettings; +HSPLandroid/icu/text/RuleBasedCollator;->doCompare(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I HSPLandroid/icu/text/RuleBasedCollator;->freeze()Landroid/icu/text/Collator; HSPLandroid/icu/text/RuleBasedCollator;->getCollationBuffer()Landroid/icu/text/RuleBasedCollator$CollationBuffer; HSPLandroid/icu/text/RuleBasedCollator;->getCollationKey(Ljava/lang/String;)Landroid/icu/text/CollationKey; @@ -10083,6 +10040,12 @@ HSPLandroid/icu/text/TimeZoneNames;->()V HSPLandroid/icu/text/TimeZoneNames;->getDisplayName(Ljava/lang/String;Landroid/icu/text/TimeZoneNames$NameType;J)Ljava/lang/String; HSPLandroid/icu/text/TimeZoneNames;->getInstance(Landroid/icu/util/ULocale;)Landroid/icu/text/TimeZoneNames; HSPLandroid/icu/text/TimeZoneNames;->getInstance(Ljava/util/Locale;)Landroid/icu/text/TimeZoneNames; +HSPLandroid/icu/text/Transliterator;->()V +HSPLandroid/icu/text/TransliteratorIDParser;->IDtoSTV(Ljava/lang/String;)[Ljava/lang/String; +HSPLandroid/icu/text/TransliteratorIDParser;->STVtoID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; +HSPLandroid/icu/text/TransliteratorRegistry;->getAvailableVariants(Ljava/lang/String;Ljava/lang/String;)Ljava/util/Enumeration; +HSPLandroid/icu/text/TransliteratorRegistry;->registerEntry(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Object;Z)V +HSPLandroid/icu/text/TransliteratorRegistry;->registerSTV(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/icu/text/UCharacterIterator;->()V HSPLandroid/icu/text/UCharacterIterator;->getInstance(Ljava/lang/String;)Landroid/icu/text/UCharacterIterator; HSPLandroid/icu/text/UCharacterIterator;->getText()Ljava/lang/String; @@ -10096,6 +10059,7 @@ HSPLandroid/icu/text/UTF16;->charAt(Ljava/lang/String;I)I HSPLandroid/icu/text/UTF16;->charAt([CIII)I HSPLandroid/icu/text/UTF16;->getCharCount(I)I HSPLandroid/icu/text/UnicodeFilter;->()V +HSPLandroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter;->contains(I)Z HSPLandroid/icu/text/UnicodeSet;->()V HSPLandroid/icu/text/UnicodeSet;->(Landroid/icu/text/UnicodeSet;)V HSPLandroid/icu/text/UnicodeSet;->_appendToPat(Ljava/lang/Appendable;IIZ)Ljava/lang/Appendable; @@ -10108,15 +10072,17 @@ HSPLandroid/icu/text/UnicodeSet;->add_unchecked(I)Landroid/icu/text/UnicodeSet; HSPLandroid/icu/text/UnicodeSet;->add_unchecked(II)Landroid/icu/text/UnicodeSet; HSPLandroid/icu/text/UnicodeSet;->appendCodePoint(Ljava/lang/Appendable;I)V HSPLandroid/icu/text/UnicodeSet;->appendNewPattern(Ljava/lang/Appendable;ZZ)Ljava/lang/Appendable; +HSPLandroid/icu/text/UnicodeSet;->applyFilter(Landroid/icu/text/UnicodeSet$Filter;Landroid/icu/text/UnicodeSet;)V HSPLandroid/icu/text/UnicodeSet;->applyPattern(Landroid/icu/impl/RuleCharacterIterator;Landroid/icu/text/SymbolTable;Ljava/lang/Appendable;II)V HSPLandroid/icu/text/UnicodeSet;->applyPattern(Ljava/lang/String;Ljava/text/ParsePosition;Landroid/icu/text/SymbolTable;I)Landroid/icu/text/UnicodeSet; HSPLandroid/icu/text/UnicodeSet;->checkFrozen()V HSPLandroid/icu/text/UnicodeSet;->clear()Landroid/icu/text/UnicodeSet; HSPLandroid/icu/text/UnicodeSet;->clone()Ljava/lang/Object; HSPLandroid/icu/text/UnicodeSet;->compact()Landroid/icu/text/UnicodeSet; -HSPLandroid/icu/text/UnicodeSet;->contains(I)Z+]Landroid/icu/impl/BMPSet;Landroid/icu/impl/BMPSet; +HSPLandroid/icu/text/UnicodeSet;->contains(I)Z HSPLandroid/icu/text/UnicodeSet;->contains(Ljava/lang/CharSequence;)Z HSPLandroid/icu/text/UnicodeSet;->containsAll(Ljava/lang/String;)Z +HSPLandroid/icu/text/UnicodeSet;->containsNone(II)Z HSPLandroid/icu/text/UnicodeSet;->findCodePoint(I)I HSPLandroid/icu/text/UnicodeSet;->freeze()Landroid/icu/text/UnicodeSet; HSPLandroid/icu/text/UnicodeSet;->getRangeCount()I @@ -10216,6 +10182,9 @@ HSPLandroid/icu/util/Calendar;->setWeekData(Landroid/icu/util/Calendar$WeekData; HSPLandroid/icu/util/Calendar;->setWeekData(Ljava/lang/String;)V HSPLandroid/icu/util/Calendar;->weekNumber(II)I HSPLandroid/icu/util/Calendar;->weekNumber(III)I +HSPLandroid/icu/util/CaseInsensitiveString;->(Ljava/lang/String;)V +HSPLandroid/icu/util/CaseInsensitiveString;->equals(Ljava/lang/Object;)Z +HSPLandroid/icu/util/CaseInsensitiveString;->hashCode()I HSPLandroid/icu/util/CharsTrie;->(Ljava/lang/CharSequence;I)V HSPLandroid/icu/util/CharsTrie;->branchNext(III)Landroid/icu/util/BytesTrie$Result; HSPLandroid/icu/util/CharsTrie;->first(I)Landroid/icu/util/BytesTrie$Result; @@ -10234,6 +10203,7 @@ HSPLandroid/icu/util/CodePointMap$Range;->-$$Nest$fputstart(Landroid/icu/util/Co HSPLandroid/icu/util/CodePointMap$Range;->()V HSPLandroid/icu/util/CodePointMap$Range;->getEnd()I HSPLandroid/icu/util/CodePointMap$Range;->getValue()I +HSPLandroid/icu/util/CodePointMap$Range;->set(III)V HSPLandroid/icu/util/CodePointMap;->()V HSPLandroid/icu/util/CodePointMap;->getRange(ILandroid/icu/util/CodePointMap$RangeOption;ILandroid/icu/util/CodePointMap$ValueFilter;Landroid/icu/util/CodePointMap$Range;)Z HSPLandroid/icu/util/CodePointTrie$Data16;->getFromIndex(I)I @@ -10244,7 +10214,6 @@ HSPLandroid/icu/util/CodePointTrie$Data8;->([B)V HSPLandroid/icu/util/CodePointTrie$Data8;->getDataLength()I HSPLandroid/icu/util/CodePointTrie$Data8;->getFromIndex(I)I HSPLandroid/icu/util/CodePointTrie$Data;->()V -HSPLandroid/icu/util/CodePointTrie$Data;->(Landroid/icu/util/CodePointTrie$Data-IA;)V HSPLandroid/icu/util/CodePointTrie$Fast16;->bmpGet(I)I HSPLandroid/icu/util/CodePointTrie$Fast16;->get(I)I HSPLandroid/icu/util/CodePointTrie$Fast8;->([C[BIII)V @@ -10254,7 +10223,6 @@ HSPLandroid/icu/util/CodePointTrie$Fast;->cpIndex(I)I HSPLandroid/icu/util/CodePointTrie$Fast;->getType()Landroid/icu/util/CodePointTrie$Type; HSPLandroid/icu/util/CodePointTrie$Small32;->([C[IIII)V HSPLandroid/icu/util/CodePointTrie$Small;->([CLandroid/icu/util/CodePointTrie$Data;III)V -HSPLandroid/icu/util/CodePointTrie$Small;->([CLandroid/icu/util/CodePointTrie$Data;IIILandroid/icu/util/CodePointTrie$Small-IA;)V HSPLandroid/icu/util/CodePointTrie;->([CLandroid/icu/util/CodePointTrie$Data;III)V HSPLandroid/icu/util/CodePointTrie;->([CLandroid/icu/util/CodePointTrie$Data;IIILandroid/icu/util/CodePointTrie-IA;)V HSPLandroid/icu/util/CodePointTrie;->fastIndex(I)I @@ -10303,7 +10271,6 @@ HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;->()V HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;->findMostUsed()I HSPLandroid/icu/util/MutableCodePointTrie$AllSameBlocks;->findOrAdd(III)I HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->()V -HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->(Landroid/icu/util/MutableCodePointTrie$MixedBlocks-IA;)V HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->addEntry([I[CIII)V HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->extend([CIII)V HSPLandroid/icu/util/MutableCodePointTrie$MixedBlocks;->extend([IIII)V @@ -10415,19 +10382,17 @@ HSPLandroid/icu/util/ULocale$Builder;->setLanguage(Ljava/lang/String;)Landroid/i HSPLandroid/icu/util/ULocale$Builder;->setRegion(Ljava/lang/String;)Landroid/icu/util/ULocale$Builder; HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->getDefault(Landroid/icu/util/ULocale$Category;)Ljava/util/Locale; HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->toLocale(Landroid/icu/util/ULocale;)Ljava/util/Locale; -HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->toULocale(Ljava/util/Locale;)Landroid/icu/util/ULocale;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Locale;Ljava/util/Locale;]Ljava/util/Set;Ljava/util/Collections$EmptySet; +HSPLandroid/icu/util/ULocale$JDKLocaleHelper;->toULocale(Ljava/util/Locale;)Landroid/icu/util/ULocale; HSPLandroid/icu/util/ULocale;->-$$Nest$smgetInstance(Landroid/icu/impl/locale/BaseLocale;Landroid/icu/impl/locale/LocaleExtensions;)Landroid/icu/util/ULocale; HSPLandroid/icu/util/ULocale;->(Ljava/lang/String;)V HSPLandroid/icu/util/ULocale;->(Ljava/lang/String;Ljava/util/Locale;)V HSPLandroid/icu/util/ULocale;->(Ljava/lang/String;Ljava/util/Locale;Landroid/icu/util/ULocale-IA;)V HSPLandroid/icu/util/ULocale;->addLikelySubtags(Landroid/icu/util/ULocale;)Landroid/icu/util/ULocale; HSPLandroid/icu/util/ULocale;->appendTag(Ljava/lang/String;Ljava/lang/StringBuilder;)V -HSPLandroid/icu/util/ULocale;->base()Landroid/icu/impl/locale/BaseLocale;+]Landroid/icu/util/ULocale;Landroid/icu/util/ULocale;]Landroid/icu/impl/LocaleIDParser;Landroid/icu/impl/LocaleIDParser; +HSPLandroid/icu/util/ULocale;->base()Landroid/icu/impl/locale/BaseLocale; HSPLandroid/icu/util/ULocale;->canonicalize(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->createCanonical(Ljava/lang/String;)Landroid/icu/util/ULocale; -HSPLandroid/icu/util/ULocale;->createLikelySubtagsString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/icu/util/ULocale;->createTagString(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->equals(Ljava/lang/Object;)Z HSPLandroid/icu/util/ULocale;->forLocale(Ljava/util/Locale;)Landroid/icu/util/ULocale; HSPLandroid/icu/util/ULocale;->getBaseName()Ljava/lang/String; @@ -10442,7 +10407,7 @@ HSPLandroid/icu/util/ULocale;->getKeywords()Ljava/util/Iterator; HSPLandroid/icu/util/ULocale;->getKeywords(Ljava/lang/String;)Ljava/util/Iterator; HSPLandroid/icu/util/ULocale;->getLanguage()Ljava/lang/String; HSPLandroid/icu/util/ULocale;->getName()Ljava/lang/String; -HSPLandroid/icu/util/ULocale;->getName(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/icu/impl/CacheBase;Landroid/icu/util/ULocale$1; +HSPLandroid/icu/util/ULocale;->getName(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->getRegionForSupplementalData(Landroid/icu/util/ULocale;Z)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->getScript()Ljava/lang/String; HSPLandroid/icu/util/ULocale;->getScript(Ljava/lang/String;)Ljava/lang/String; @@ -10453,7 +10418,6 @@ HSPLandroid/icu/util/ULocale;->hashCode()I HSPLandroid/icu/util/ULocale;->isEmptyString(Ljava/lang/String;)Z HSPLandroid/icu/util/ULocale;->isKnownCanonicalizedLocale(Ljava/lang/String;)Z HSPLandroid/icu/util/ULocale;->isRightToLeft()Z -HSPLandroid/icu/util/ULocale;->lookupLikelySubtags(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->lscvToID(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/icu/util/ULocale;->parseTagString(Ljava/lang/String;[Ljava/lang/String;)I HSPLandroid/icu/util/ULocale;->setKeywordValue(Ljava/lang/String;Ljava/lang/String;)Landroid/icu/util/ULocale; @@ -10478,6 +10442,7 @@ HSPLandroid/icu/util/UResourceBundle;->resolveObject(Ljava/lang/String;Landroid/ HSPLandroid/icu/util/UResourceBundleIterator;->(Landroid/icu/util/UResourceBundle;)V HSPLandroid/icu/util/UResourceBundleIterator;->hasNext()Z HSPLandroid/icu/util/UResourceBundleIterator;->next()Landroid/icu/util/UResourceBundle; +HSPLandroid/icu/util/VersionInfo;->compareTo(Landroid/icu/util/VersionInfo;)I HSPLandroid/icu/util/VersionInfo;->getMajor()I HSPLandroid/internal/modules/utils/build/SdkLevel;->isAtLeastPreReleaseCodename(Ljava/lang/String;)Z HSPLandroid/internal/modules/utils/build/SdkLevel;->isAtLeastV()Z @@ -10526,7 +10491,7 @@ HSPLandroid/location/Location;->setVerticalAccuracyMeters(F)V HSPLandroid/location/Location;->toString()Ljava/lang/String; HSPLandroid/location/Location;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/media/AudioAttributes$1;->createFromParcel(Landroid/os/Parcel;)Landroid/media/AudioAttributes; -HSPLandroid/media/AudioAttributes$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/media/AudioAttributes$1;Landroid/media/AudioAttributes$1; +HSPLandroid/media/AudioAttributes$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/media/AudioAttributes$Builder;->()V HSPLandroid/media/AudioAttributes$Builder;->(Landroid/media/AudioAttributes;)V HSPLandroid/media/AudioAttributes$Builder;->addTag(Ljava/lang/String;)Landroid/media/AudioAttributes$Builder; @@ -10552,7 +10517,7 @@ HSPLandroid/media/AudioAttributes;->-$$Nest$fputmTags(Landroid/media/AudioAttrib HSPLandroid/media/AudioAttributes;->-$$Nest$fputmUsage(Landroid/media/AudioAttributes;I)V HSPLandroid/media/AudioAttributes;->()V HSPLandroid/media/AudioAttributes;->(Landroid/media/AudioAttributes-IA;)V -HSPLandroid/media/AudioAttributes;->(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/media/AudioAttributes;->(Landroid/os/Parcel;)V HSPLandroid/media/AudioAttributes;->areHapticChannelsMuted()Z HSPLandroid/media/AudioAttributes;->equals(Ljava/lang/Object;)Z HSPLandroid/media/AudioAttributes;->getAllFlags()I @@ -10606,7 +10571,6 @@ HSPLandroid/media/AudioManager$AudioPlaybackCallback;->()V HSPLandroid/media/AudioManager$AudioPlaybackCallbackInfo;->(Landroid/media/AudioManager$AudioPlaybackCallback;Landroid/os/Handler;)V HSPLandroid/media/AudioManager$AudioRecordingCallback;->()V HSPLandroid/media/AudioManager$DevRoleListeners;->(Landroid/media/AudioManager;)V -HSPLandroid/media/AudioManager$DevRoleListeners;->(Landroid/media/AudioManager;Landroid/media/AudioManager$DevRoleListeners-IA;)V HSPLandroid/media/AudioManager$NativeEventHandlerDelegate$1;->(Landroid/media/AudioManager$NativeEventHandlerDelegate;Landroid/os/Looper;Landroid/media/AudioManager;Landroid/media/AudioDeviceCallback;)V HSPLandroid/media/AudioManager$NativeEventHandlerDelegate$1;->handleMessage(Landroid/os/Message;)V HSPLandroid/media/AudioManager$NativeEventHandlerDelegate;->(Landroid/media/AudioManager;Landroid/media/AudioDeviceCallback;Landroid/os/Handler;)V @@ -10688,7 +10652,7 @@ HSPLandroid/media/AudioPlaybackConfiguration$IPlayerShell;->(Landroid/medi HSPLandroid/media/AudioPlaybackConfiguration;->getAudioAttributes()Landroid/media/AudioAttributes; HSPLandroid/media/AudioPlaybackConfiguration;->isActive()Z HSPLandroid/media/AudioPort$$ExternalSyntheticLambda0;->applyAsInt(Ljava/lang/Object;)I -HSPLandroid/media/AudioPort;->(Landroid/media/AudioHandle;ILjava/lang/String;Ljava/util/List;[Landroid/media/AudioGain;Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/stream/Stream;Ljava/util/stream/IntPipeline$4;,Ljava/util/stream/ReferencePipeline$Head;]Ljava/util/stream/IntStream;Ljava/util/stream/IntPipeline$Head;,Ljava/util/stream/ReferencePipeline$4;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Landroid/media/AudioProfile;Landroid/media/AudioProfile;]Ljava/util/Set;Ljava/util/HashSet; +HSPLandroid/media/AudioPort;->(Landroid/media/AudioHandle;ILjava/lang/String;Ljava/util/List;[Landroid/media/AudioGain;Ljava/util/List;)V HSPLandroid/media/AudioPort;->(Landroid/media/AudioHandle;ILjava/lang/String;[I[I[I[I[Landroid/media/AudioGain;)V HSPLandroid/media/AudioPort;->handle()Landroid/media/AudioHandle; HSPLandroid/media/AudioPort;->id()I @@ -10806,10 +10770,9 @@ HSPLandroid/media/MediaCodec$BufferInfo;->set(IIJI)V HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;->free()V HSPLandroid/media/MediaCodec$BufferMap$CodecBuffer;->setByteBuffer(Ljava/nio/ByteBuffer;)V HSPLandroid/media/MediaCodec$BufferMap;->()V -HSPLandroid/media/MediaCodec$BufferMap;->(Landroid/media/MediaCodec$BufferMap-IA;)V HSPLandroid/media/MediaCodec$BufferMap;->clear()V -HSPLandroid/media/MediaCodec$BufferMap;->put(ILjava/nio/ByteBuffer;)V+]Landroid/media/MediaCodec$BufferMap$CodecBuffer;Landroid/media/MediaCodec$BufferMap$CodecBuffer;]Ljava/util/Map;Ljava/util/HashMap; -HSPLandroid/media/MediaCodec$BufferMap;->remove(I)V+]Landroid/media/MediaCodec$BufferMap$CodecBuffer;Landroid/media/MediaCodec$BufferMap$CodecBuffer;]Ljava/util/Map;Ljava/util/HashMap; +HSPLandroid/media/MediaCodec$BufferMap;->put(ILjava/nio/ByteBuffer;)V +HSPLandroid/media/MediaCodec$BufferMap;->remove(I)V HSPLandroid/media/MediaCodec$CryptoInfo$Pattern;->(II)V HSPLandroid/media/MediaCodec$CryptoInfo$Pattern;->set(II)V HSPLandroid/media/MediaCodec$CryptoInfo;->()V @@ -10821,18 +10784,18 @@ HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/vie HSPLandroid/media/MediaCodec;->configure(Landroid/media/MediaFormat;Landroid/view/Surface;Landroid/media/MediaCrypto;Landroid/os/IHwBinder;I)V HSPLandroid/media/MediaCodec;->createByCodecName(Ljava/lang/String;)Landroid/media/MediaCodec; HSPLandroid/media/MediaCodec;->dequeueInputBuffer(J)I -HSPLandroid/media/MediaCodec;->dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I+]Landroid/media/MediaCodec$BufferInfo;Landroid/media/MediaCodec$BufferInfo;]Ljava/util/Map;Ljava/util/HashMap; +HSPLandroid/media/MediaCodec;->dequeueOutputBuffer(Landroid/media/MediaCodec$BufferInfo;J)I HSPLandroid/media/MediaCodec;->finalize()V HSPLandroid/media/MediaCodec;->freeAllTrackedBuffers()V -HSPLandroid/media/MediaCodec;->getInputBuffer(I)Ljava/nio/ByteBuffer;+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap; -HSPLandroid/media/MediaCodec;->getOutputBuffer(I)Ljava/nio/ByteBuffer;+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap; +HSPLandroid/media/MediaCodec;->getInputBuffer(I)Ljava/nio/ByteBuffer; +HSPLandroid/media/MediaCodec;->getOutputBuffer(I)Ljava/nio/ByteBuffer; HSPLandroid/media/MediaCodec;->getOutputFormat()Landroid/media/MediaFormat; -HSPLandroid/media/MediaCodec;->lockAndGetContext()J+]Ljava/util/concurrent/locks/Lock;Ljava/util/concurrent/locks/ReentrantLock; -HSPLandroid/media/MediaCodec;->queueInputBuffer(IIIJI)V+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap; +HSPLandroid/media/MediaCodec;->lockAndGetContext()J +HSPLandroid/media/MediaCodec;->queueInputBuffer(IIIJI)V HSPLandroid/media/MediaCodec;->release()V HSPLandroid/media/MediaCodec;->releaseOutputBuffer(IZ)V -HSPLandroid/media/MediaCodec;->releaseOutputBufferInternal(IZZJ)V+]Landroid/media/MediaCodec$BufferMap;Landroid/media/MediaCodec$BufferMap;]Ljava/util/Map;Ljava/util/HashMap; -HSPLandroid/media/MediaCodec;->setAndUnlockContext(J)V+]Ljava/util/concurrent/locks/Lock;Ljava/util/concurrent/locks/ReentrantLock; +HSPLandroid/media/MediaCodec;->releaseOutputBufferInternal(IZZJ)V +HSPLandroid/media/MediaCodec;->setAndUnlockContext(J)V HSPLandroid/media/MediaCodec;->start()V HSPLandroid/media/MediaCodec;->stop()V HSPLandroid/media/MediaCodecInfo$AudioCapabilities;->applyLevelLimits()V @@ -11327,10 +11290,8 @@ HSPLandroid/metrics/LogMaker;->setCategory(I)Landroid/metrics/LogMaker; HSPLandroid/metrics/LogMaker;->setComponentName(Landroid/content/ComponentName;)Landroid/metrics/LogMaker; HSPLandroid/metrics/LogMaker;->setSubtype(I)Landroid/metrics/LogMaker; HSPLandroid/metrics/LogMaker;->setType(I)Landroid/metrics/LogMaker; -HSPLandroid/multiuser/FeatureFlagsImpl;->()V HSPLandroid/multiuser/FeatureFlagsImpl;->enableSystemUserOnlyForServicesAndProviders()Z -HSPLandroid/multiuser/Flags;->()V -HSPLandroid/multiuser/Flags;->enableSystemUserOnlyForServicesAndProviders()Z+]Landroid/multiuser/FeatureFlags;Landroid/multiuser/FeatureFlagsImpl; +HSPLandroid/multiuser/Flags;->enableSystemUserOnlyForServicesAndProviders()Z HSPLandroid/net/Credentials;->(III)V HSPLandroid/net/Credentials;->getPid()I HSPLandroid/net/Credentials;->getUid()I @@ -11423,12 +11384,11 @@ HSPLandroid/net/TelephonyNetworkSpecifier;->equals(Ljava/lang/Object;)Z HSPLandroid/net/TelephonyNetworkSpecifier;->hashCode()I HSPLandroid/net/TelephonyNetworkSpecifier;->toString()Ljava/lang/String; HSPLandroid/net/TelephonyNetworkSpecifier;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/Uri;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/net/Uri$1;Landroid/net/Uri$1; +HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/Uri; +HSPLandroid/net/Uri$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/net/Uri$1;->newArray(I)[Landroid/net/Uri; HSPLandroid/net/Uri$1;->newArray(I)[Ljava/lang/Object; HSPLandroid/net/Uri$AbstractHierarchicalUri;->()V -HSPLandroid/net/Uri$AbstractHierarchicalUri;->(Landroid/net/Uri$AbstractHierarchicalUri-IA;)V HSPLandroid/net/Uri$AbstractHierarchicalUri;->findPortSeparator(Ljava/lang/String;)I HSPLandroid/net/Uri$AbstractHierarchicalUri;->getHost()Ljava/lang/String; HSPLandroid/net/Uri$AbstractHierarchicalUri;->getLastPathSegment()Ljava/lang/String; @@ -11459,11 +11419,11 @@ HSPLandroid/net/Uri$Builder;->path(Landroid/net/Uri$PathPart;)Landroid/net/Uri$B HSPLandroid/net/Uri$Builder;->path(Ljava/lang/String;)Landroid/net/Uri$Builder; HSPLandroid/net/Uri$Builder;->query(Landroid/net/Uri$Part;)Landroid/net/Uri$Builder; HSPLandroid/net/Uri$Builder;->scheme(Ljava/lang/String;)Landroid/net/Uri$Builder; -HSPLandroid/net/Uri$Builder;->toString()Ljava/lang/String;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri; +HSPLandroid/net/Uri$Builder;->toString()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$PathPart;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V -HSPLandroid/net/Uri$HierarchicalUri;->appendSspTo(Ljava/lang/StringBuilder;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$Part;Landroid/net/Uri$Part;,Landroid/net/Uri$Part$EmptyPart;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart; -HSPLandroid/net/Uri$HierarchicalUri;->buildUpon()Landroid/net/Uri$Builder;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder; -HSPLandroid/net/Uri$HierarchicalUri;->generatePath(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;+]Landroid/net/Uri$Part;Landroid/net/Uri$Part$EmptyPart;,Landroid/net/Uri$Part;]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri$HierarchicalUri;->appendSspTo(Ljava/lang/StringBuilder;)V +HSPLandroid/net/Uri$HierarchicalUri;->buildUpon()Landroid/net/Uri$Builder; +HSPLandroid/net/Uri$HierarchicalUri;->generatePath(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$HierarchicalUri;->getAuthority()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->getEncodedAuthority()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->getEncodedFragment()Ljava/lang/String; @@ -11476,12 +11436,11 @@ HSPLandroid/net/Uri$HierarchicalUri;->getQuery()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->getScheme()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->getSchemeSpecificPart()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->isHierarchical()Z -HSPLandroid/net/Uri$HierarchicalUri;->makeUriString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$Part;Landroid/net/Uri$Part$EmptyPart; +HSPLandroid/net/Uri$HierarchicalUri;->makeUriString()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->readFrom(Landroid/os/Parcel;)Landroid/net/Uri; HSPLandroid/net/Uri$HierarchicalUri;->toString()Ljava/lang/String; HSPLandroid/net/Uri$HierarchicalUri;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/net/Uri$OpaqueUri;->(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$Part;)V -HSPLandroid/net/Uri$OpaqueUri;->(Ljava/lang/String;Landroid/net/Uri$Part;Landroid/net/Uri$Part;Landroid/net/Uri$OpaqueUri-IA;)V HSPLandroid/net/Uri$OpaqueUri;->getEncodedSchemeSpecificPart()Ljava/lang/String; HSPLandroid/net/Uri$OpaqueUri;->getScheme()Ljava/lang/String; HSPLandroid/net/Uri$OpaqueUri;->getSchemeSpecificPart()Ljava/lang/String; @@ -11497,13 +11456,13 @@ HSPLandroid/net/Uri$Part;->isEmpty()Z HSPLandroid/net/Uri$Part;->nonNull(Landroid/net/Uri$Part;)Landroid/net/Uri$Part; HSPLandroid/net/Uri$PathPart;->(Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/net/Uri$PathPart;->appendDecodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart; -HSPLandroid/net/Uri$PathPart;->appendEncodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart; +HSPLandroid/net/Uri$PathPart;->appendEncodedSegment(Landroid/net/Uri$PathPart;Ljava/lang/String;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$PathPart;->from(Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$PathPart;->fromDecoded(Ljava/lang/String;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$PathPart;->fromEncoded(Ljava/lang/String;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$PathPart;->getEncoded()Ljava/lang/String; -HSPLandroid/net/Uri$PathPart;->getPathSegments()Landroid/net/Uri$PathSegments;+]Ljava/lang/String;Ljava/lang/String;]Landroid/net/Uri$PathSegmentsBuilder;Landroid/net/Uri$PathSegmentsBuilder;]Landroid/net/Uri$PathPart;Landroid/net/Uri$PathPart; -HSPLandroid/net/Uri$PathPart;->makeAbsolute(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri$PathPart;->getPathSegments()Landroid/net/Uri$PathSegments; +HSPLandroid/net/Uri$PathPart;->makeAbsolute(Landroid/net/Uri$PathPart;)Landroid/net/Uri$PathPart; HSPLandroid/net/Uri$PathSegments;->([Ljava/lang/String;I)V HSPLandroid/net/Uri$PathSegments;->get(I)Ljava/lang/Object; HSPLandroid/net/Uri$PathSegments;->get(I)Ljava/lang/String; @@ -11511,10 +11470,9 @@ HSPLandroid/net/Uri$PathSegments;->size()I HSPLandroid/net/Uri$PathSegmentsBuilder;->add(Ljava/lang/String;)V HSPLandroid/net/Uri$PathSegmentsBuilder;->build()Landroid/net/Uri$PathSegments; HSPLandroid/net/Uri$StringUri;->(Ljava/lang/String;)V -HSPLandroid/net/Uri$StringUri;->(Ljava/lang/String;Landroid/net/Uri$StringUri-IA;)V -HSPLandroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder;+]Landroid/net/Uri$Builder;Landroid/net/Uri$Builder;]Landroid/net/Uri$StringUri;Landroid/net/Uri$StringUri; -HSPLandroid/net/Uri$StringUri;->findFragmentSeparator()I+]Ljava/lang/String;Ljava/lang/String; -HSPLandroid/net/Uri$StringUri;->findSchemeSeparator()I+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri$StringUri;->buildUpon()Landroid/net/Uri$Builder; +HSPLandroid/net/Uri$StringUri;->findFragmentSeparator()I +HSPLandroid/net/Uri$StringUri;->findSchemeSeparator()I HSPLandroid/net/Uri$StringUri;->getAuthority()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->getAuthorityPart()Landroid/net/Uri$Part; HSPLandroid/net/Uri$StringUri;->getEncodedAuthority()Ljava/lang/String; @@ -11532,11 +11490,11 @@ HSPLandroid/net/Uri$StringUri;->getScheme()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->getSchemeSpecificPart()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->isHierarchical()Z HSPLandroid/net/Uri$StringUri;->isRelative()Z -HSPLandroid/net/Uri$StringUri;->parseAuthority(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri$StringUri;->parseAuthority(Ljava/lang/String;I)Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->parseFragment()Ljava/lang/String; -HSPLandroid/net/Uri$StringUri;->parsePath()Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; -HSPLandroid/net/Uri$StringUri;->parsePath(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; -HSPLandroid/net/Uri$StringUri;->parseQuery()Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri$StringUri;->parsePath()Ljava/lang/String; +HSPLandroid/net/Uri$StringUri;->parsePath(Ljava/lang/String;I)Ljava/lang/String; +HSPLandroid/net/Uri$StringUri;->parseQuery()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->parseScheme()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->toString()Ljava/lang/String; HSPLandroid/net/Uri$StringUri;->writeToParcel(Landroid/os/Parcel;I)V @@ -11548,25 +11506,25 @@ HSPLandroid/net/Uri;->compareTo(Landroid/net/Uri;)I HSPLandroid/net/Uri;->compareTo(Ljava/lang/Object;)I HSPLandroid/net/Uri;->decode(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/net/Uri;->encode(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/net/Uri;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/net/Uri;->encode(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/net/Uri;->equals(Ljava/lang/Object;)Z HSPLandroid/net/Uri;->fromFile(Ljava/io/File;)Landroid/net/Uri; HSPLandroid/net/Uri;->fromParts(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/net/Uri;->getBooleanQueryParameter(Ljava/lang/String;Z)Z -HSPLandroid/net/Uri;->getQueryParameter(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/net/Uri;Landroid/net/Uri$StringUri; -HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set;+]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Set;Ljava/util/LinkedHashSet;]Landroid/net/Uri;Landroid/net/Uri$StringUri; +HSPLandroid/net/Uri;->getQueryParameter(Ljava/lang/String;)Ljava/lang/String; +HSPLandroid/net/Uri;->getQueryParameterNames()Ljava/util/Set; HSPLandroid/net/Uri;->hashCode()I HSPLandroid/net/Uri;->isAbsolute()Z -HSPLandroid/net/Uri;->isAllowed(CLjava/lang/String;)Z+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/net/Uri;->isAllowed(CLjava/lang/String;)Z HSPLandroid/net/Uri;->isOpaque()Z HSPLandroid/net/Uri;->normalizeScheme()Landroid/net/Uri; HSPLandroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/net/Uri;->toSafeString()Ljava/lang/String; HSPLandroid/net/Uri;->withAppendedPath(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/net/Uri;->writeToParcel(Landroid/os/Parcel;Landroid/net/Uri;)V -HSPLandroid/net/UriCodec;->appendDecoded(Ljava/lang/StringBuilder;Ljava/lang/String;ZLjava/nio/charset/Charset;Z)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; +HSPLandroid/net/UriCodec;->appendDecoded(Ljava/lang/StringBuilder;Ljava/lang/String;ZLjava/nio/charset/Charset;Z)V HSPLandroid/net/UriCodec;->decode(Ljava/lang/String;ZLjava/nio/charset/Charset;Z)Ljava/lang/String; -HSPLandroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU; +HSPLandroid/net/UriCodec;->flushDecodingByteAccumulator(Ljava/lang/StringBuilder;Ljava/nio/charset/CharsetDecoder;Ljava/nio/ByteBuffer;Z)V HSPLandroid/net/UriCodec;->getNextCharacter(Ljava/lang/String;IILjava/lang/String;)C HSPLandroid/net/UriCodec;->hexCharToValue(C)I HSPLandroid/net/WebAddress;->(Ljava/lang/String;)V @@ -11583,7 +11541,6 @@ HSPLandroid/net/vcn/VcnTransportInfo$1;->()V HSPLandroid/net/vcn/VcnTransportInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/net/vcn/VcnTransportInfo; HSPLandroid/net/vcn/VcnTransportInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/net/vcn/VcnTransportInfo;->()V -HSPLandroid/nfc/NfcFrameworkInitializer;->setNfcServiceManager(Landroid/nfc/NfcServiceManager;)V HSPLandroid/nfc/NfcServiceManager;->()V HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Landroid/nfc/cardemulation/AidGroup; HSPLandroid/nfc/cardemulation/AidGroup$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -11610,7 +11567,6 @@ HSPLandroid/os/AsyncTask$SerialExecutor$1;->run()V HSPLandroid/os/AsyncTask$SerialExecutor;->execute(Ljava/lang/Runnable;)V HSPLandroid/os/AsyncTask$SerialExecutor;->scheduleNext()V HSPLandroid/os/AsyncTask$WorkerRunnable;->()V -HSPLandroid/os/AsyncTask$WorkerRunnable;->(Landroid/os/AsyncTask$WorkerRunnable-IA;)V HSPLandroid/os/AsyncTask;->-$$Nest$fgetmTaskInvoked(Landroid/os/AsyncTask;)Ljava/util/concurrent/atomic/AtomicBoolean; HSPLandroid/os/AsyncTask;->-$$Nest$mfinish(Landroid/os/AsyncTask;Ljava/lang/Object;)V HSPLandroid/os/AsyncTask;->-$$Nest$mpostResult(Landroid/os/AsyncTask;Ljava/lang/Object;)Ljava/lang/Object; @@ -11635,13 +11591,13 @@ HSPLandroid/os/AsyncTask;->postResultIfNotInvoked(Ljava/lang/Object;)V HSPLandroid/os/BaseBundle;->()V HSPLandroid/os/BaseBundle;->(I)V HSPLandroid/os/BaseBundle;->(Landroid/os/BaseBundle;)V -HSPLandroid/os/BaseBundle;->(Landroid/os/BaseBundle;Z)V+]Landroid/os/BaseBundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/BaseBundle;->(Landroid/os/BaseBundle;Z)V HSPLandroid/os/BaseBundle;->(Landroid/os/Parcel;I)V -HSPLandroid/os/BaseBundle;->(Ljava/lang/ClassLoader;I)V+]Ljava/lang/Object;Landroid/os/Bundle;,Landroid/os/PersistableBundle;]Ljava/lang/Class;Ljava/lang/Class; +HSPLandroid/os/BaseBundle;->(Ljava/lang/ClassLoader;I)V HSPLandroid/os/BaseBundle;->clear()V HSPLandroid/os/BaseBundle;->containsKey(Ljava/lang/String;)Z HSPLandroid/os/BaseBundle;->deepCopyValue(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;)Ljava/lang/Object; HSPLandroid/os/BaseBundle;->get(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/BaseBundle;->getArrayList(Ljava/lang/String;Ljava/lang/Class;)Ljava/util/ArrayList; HSPLandroid/os/BaseBundle;->getBoolean(Ljava/lang/String;)Z @@ -11650,9 +11606,9 @@ HSPLandroid/os/BaseBundle;->getBooleanArray(Ljava/lang/String;)[Z HSPLandroid/os/BaseBundle;->getByteArray(Ljava/lang/String;)[B HSPLandroid/os/BaseBundle;->getCharSequence(Ljava/lang/String;)Ljava/lang/CharSequence; HSPLandroid/os/BaseBundle;->getCharSequenceArray(Ljava/lang/String;)[Ljava/lang/CharSequence; -HSPLandroid/os/BaseBundle;->getFloat(Ljava/lang/String;F)F+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Float;Ljava/lang/Float;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->getFloat(Ljava/lang/String;F)F HSPLandroid/os/BaseBundle;->getInt(Ljava/lang/String;)I -HSPLandroid/os/BaseBundle;->getInt(Ljava/lang/String;I)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->getInt(Ljava/lang/String;I)I HSPLandroid/os/BaseBundle;->getIntArray(Ljava/lang/String;)[I HSPLandroid/os/BaseBundle;->getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroid/os/BaseBundle;->getLong(Ljava/lang/String;)J @@ -11662,18 +11618,18 @@ HSPLandroid/os/BaseBundle;->getSerializable(Ljava/lang/String;)Ljava/io/Serializ HSPLandroid/os/BaseBundle;->getSerializable(Ljava/lang/String;Ljava/lang/Class;)Ljava/io/Serializable; HSPLandroid/os/BaseBundle;->getString(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/os/BaseBundle;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/os/BaseBundle;->getStringArray(Ljava/lang/String;)[Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->getStringArray(Ljava/lang/String;)[Ljava/lang/String; HSPLandroid/os/BaseBundle;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList; -HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle; -HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/BaseBundle;Landroid/os/Bundle; -HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; -HSPLandroid/os/BaseBundle;->getValueAt(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Class;Ljava/lang/Class; -HSPLandroid/os/BaseBundle;->initializeFromParcelLocked(Landroid/os/Parcel;ZZ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/BaseBundle;->isEmpty()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;)Ljava/lang/Object; +HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; +HSPLandroid/os/BaseBundle;->getValue(Ljava/lang/String;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; +HSPLandroid/os/BaseBundle;->getValueAt(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; +HSPLandroid/os/BaseBundle;->initializeFromParcelLocked(Landroid/os/Parcel;ZZ)V +HSPLandroid/os/BaseBundle;->isEmpty()Z HSPLandroid/os/BaseBundle;->isEmptyParcel()Z HSPLandroid/os/BaseBundle;->isEmptyParcel(Landroid/os/Parcel;)Z HSPLandroid/os/BaseBundle;->isParcelled()Z -HSPLandroid/os/BaseBundle;->keySet()Ljava/util/Set;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->keySet()Ljava/util/Set; HSPLandroid/os/BaseBundle;->putAll(Landroid/os/PersistableBundle;)V HSPLandroid/os/BaseBundle;->putAll(Landroid/util/ArrayMap;)V HSPLandroid/os/BaseBundle;->putBoolean(Ljava/lang/String;Z)V @@ -11682,7 +11638,7 @@ HSPLandroid/os/BaseBundle;->putByteArray(Ljava/lang/String;[B)V HSPLandroid/os/BaseBundle;->putCharSequence(Ljava/lang/String;Ljava/lang/CharSequence;)V HSPLandroid/os/BaseBundle;->putCharSequenceArray(Ljava/lang/String;[Ljava/lang/CharSequence;)V HSPLandroid/os/BaseBundle;->putDouble(Ljava/lang/String;D)V -HSPLandroid/os/BaseBundle;->putFloat(Ljava/lang/String;F)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; +HSPLandroid/os/BaseBundle;->putFloat(Ljava/lang/String;F)V HSPLandroid/os/BaseBundle;->putInt(Ljava/lang/String;I)V HSPLandroid/os/BaseBundle;->putIntArray(Ljava/lang/String;[I)V HSPLandroid/os/BaseBundle;->putLong(Ljava/lang/String;J)V @@ -11692,16 +11648,16 @@ HSPLandroid/os/BaseBundle;->putString(Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/os/BaseBundle;->putStringArray(Ljava/lang/String;[Ljava/lang/String;)V HSPLandroid/os/BaseBundle;->putStringArrayList(Ljava/lang/String;Ljava/util/ArrayList;)V HSPLandroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;)V -HSPLandroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/BaseBundle;->recycleParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/BaseBundle;->readFromParcelInner(Landroid/os/Parcel;I)V +HSPLandroid/os/BaseBundle;->recycleParcel(Landroid/os/Parcel;)V HSPLandroid/os/BaseBundle;->remove(Ljava/lang/String;)V HSPLandroid/os/BaseBundle;->setClassLoader(Ljava/lang/ClassLoader;)V HSPLandroid/os/BaseBundle;->setShouldDefuse(Z)V -HSPLandroid/os/BaseBundle;->size()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/BaseBundle;Landroid/os/Bundle; -HSPLandroid/os/BaseBundle;->unparcel()V+]Landroid/os/BaseBundle;Landroid/os/Bundle;,Landroid/os/PersistableBundle; +HSPLandroid/os/BaseBundle;->size()I +HSPLandroid/os/BaseBundle;->unparcel()V HSPLandroid/os/BaseBundle;->unparcel(Z)V -HSPLandroid/os/BaseBundle;->unwrapLazyValueFromMapLocked(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/BiFunction;Landroid/os/Parcel$LazyValue;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; -HSPLandroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/BaseBundle;->unwrapLazyValueFromMapLocked(ILjava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; +HSPLandroid/os/BaseBundle;->writeToParcelInner(Landroid/os/Parcel;I)V HSPLandroid/os/BatteryManager;->(Landroid/content/Context;Lcom/android/internal/app/IBatteryStats;Landroid/os/IBatteryPropertiesRegistrar;)V HSPLandroid/os/BatteryManager;->getIntProperty(I)I HSPLandroid/os/BatteryManager;->getLongProperty(I)J @@ -11738,7 +11694,7 @@ HSPLandroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactEnded(Ljav HSPLandroid/os/Binder$PropagateWorkSourceTransactListener;->onTransactStarted(Landroid/os/IBinder;I)Ljava/lang/Object; HSPLandroid/os/Binder$ProxyTransactListener;->onTransactStarted(Landroid/os/IBinder;II)Ljava/lang/Object;+]Landroid/os/Binder$ProxyTransactListener;Landroid/os/Binder$PropagateWorkSourceTransactListener; HSPLandroid/os/Binder;->()V -HSPLandroid/os/Binder;->(Ljava/lang/String;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry; +HSPLandroid/os/Binder;->(Ljava/lang/String;)V HSPLandroid/os/Binder;->allowBlocking(Landroid/os/IBinder;)Landroid/os/IBinder; HSPLandroid/os/Binder;->attachInterface(Landroid/os/IInterface;Ljava/lang/String;)V HSPLandroid/os/Binder;->checkParcel(Landroid/os/IBinder;ILandroid/os/Parcel;Ljava/lang/String;)V @@ -11746,14 +11702,14 @@ HSPLandroid/os/Binder;->copyAllowBlocking(Landroid/os/IBinder;Landroid/os/IBinde HSPLandroid/os/Binder;->defaultBlocking(Landroid/os/IBinder;)Landroid/os/IBinder; HSPLandroid/os/Binder;->doDump(Ljava/io/FileDescriptor;Ljava/io/PrintWriter;[Ljava/lang/String;)V HSPLandroid/os/Binder;->dump(Ljava/io/FileDescriptor;[Ljava/lang/String;)V -HSPLandroid/os/Binder;->execTransact(IJJI)Z+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Binder;->execTransactInternal(ILandroid/os/Parcel;Landroid/os/Parcel;II)Z+]Landroid/os/Binder;missing_types +HSPLandroid/os/Binder;->execTransact(IJJI)Z +HSPLandroid/os/Binder;->execTransactInternal(ILandroid/os/Parcel;Landroid/os/Parcel;II)Z HSPLandroid/os/Binder;->getCallingUserHandle()Landroid/os/UserHandle; HSPLandroid/os/Binder;->getInterfaceDescriptor()Ljava/lang/String; HSPLandroid/os/Binder;->getMaxTransactionId()I HSPLandroid/os/Binder;->getSimpleDescriptor()Ljava/lang/String; HSPLandroid/os/Binder;->getTransactionName(I)Ljava/lang/String; -HSPLandroid/os/Binder;->getTransactionTraceName(I)Ljava/lang/String;+]Landroid/os/Binder;megamorphic_types]Ljava/lang/StringBuffer;Ljava/lang/StringBuffer;]Ljava/util/concurrent/atomic/AtomicReferenceArray;Ljava/util/concurrent/atomic/AtomicReferenceArray; +HSPLandroid/os/Binder;->getTransactionTraceName(I)Ljava/lang/String; HSPLandroid/os/Binder;->isBinderAlive()Z HSPLandroid/os/Binder;->isDirectlyHandlingTransaction()Z HSPLandroid/os/Binder;->isProxy(Landroid/os/IInterface;)Z @@ -11774,11 +11730,11 @@ HSPLandroid/os/BinderProxy$ProxyMap;->remove(II)V HSPLandroid/os/BinderProxy$ProxyMap;->set(JLandroid/os/BinderProxy;)V HSPLandroid/os/BinderProxy;->(J)V HSPLandroid/os/BinderProxy;->getInstance(JJ)Landroid/os/BinderProxy; -HSPLandroid/os/BinderProxy;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V+]Ljava/util/List;Ljava/util/Collections$SynchronizedRandomAccessList; +HSPLandroid/os/BinderProxy;->linkToDeath(Landroid/os/IBinder$DeathRecipient;I)V HSPLandroid/os/BinderProxy;->queryLocalInterface(Ljava/lang/String;)Landroid/os/IInterface; HSPLandroid/os/BinderProxy;->sendDeathNotice(Landroid/os/IBinder$DeathRecipient;Landroid/os/IBinder;)V -HSPLandroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/os/BinderProxy;Landroid/os/BinderProxy;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/BinderProxy;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z+]Ljava/util/List;Ljava/util/Collections$SynchronizedRandomAccessList; +HSPLandroid/os/BinderProxy;->transact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z +HSPLandroid/os/BinderProxy;->unlinkToDeath(Landroid/os/IBinder$DeathRecipient;I)Z HSPLandroid/os/BluetoothServiceManager$ServiceRegisterer;->(Ljava/lang/String;)V HSPLandroid/os/BluetoothServiceManager$ServiceRegisterer;->get()Landroid/os/IBinder; HSPLandroid/os/BluetoothServiceManager;->()V @@ -11812,7 +11768,7 @@ HSPLandroid/os/Bundle;->getFloat(Ljava/lang/String;F)F HSPLandroid/os/Bundle;->getIntegerArrayList(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroid/os/Bundle;->getParcelable(Ljava/lang/String;)Landroid/os/Parcelable; HSPLandroid/os/Bundle;->getParcelable(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; -HSPLandroid/os/Bundle;->getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable;+]Landroid/os/Bundle;Landroid/os/Bundle; +HSPLandroid/os/Bundle;->getParcelableArray(Ljava/lang/String;)[Landroid/os/Parcelable; HSPLandroid/os/Bundle;->getParcelableArray(Ljava/lang/String;Ljava/lang/Class;)[Ljava/lang/Object; HSPLandroid/os/Bundle;->getParcelableArrayList(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroid/os/Bundle;->getSerializable(Ljava/lang/String;)Ljava/io/Serializable; @@ -11820,7 +11776,7 @@ HSPLandroid/os/Bundle;->getSerializable(Ljava/lang/String;Ljava/lang/Class;)Ljav HSPLandroid/os/Bundle;->getSparseParcelableArray(Ljava/lang/String;)Landroid/util/SparseArray; HSPLandroid/os/Bundle;->getStringArrayList(Ljava/lang/String;)Ljava/util/ArrayList; HSPLandroid/os/Bundle;->hasFileDescriptors()Z -HSPLandroid/os/Bundle;->maybePrefillHasFds()V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Bundle;->maybePrefillHasFds()V HSPLandroid/os/Bundle;->putAll(Landroid/os/Bundle;)V HSPLandroid/os/Bundle;->putBinder(Ljava/lang/String;Landroid/os/IBinder;)V HSPLandroid/os/Bundle;->putBundle(Ljava/lang/String;Landroid/os/Bundle;)V @@ -11843,7 +11799,7 @@ HSPLandroid/os/Bundle;->setClassLoader(Ljava/lang/ClassLoader;)V HSPLandroid/os/Bundle;->setDefusable(Landroid/os/Bundle;Z)Landroid/os/Bundle; HSPLandroid/os/Bundle;->setDefusable(Z)V HSPLandroid/os/Bundle;->toString()Ljava/lang/String; -HSPLandroid/os/Bundle;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Bundle;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/os/CancellationSignal$Transport;->()V HSPLandroid/os/CancellationSignal$Transport;->cancel()V HSPLandroid/os/CancellationSignal;->()V @@ -11990,7 +11946,7 @@ HSPLandroid/os/FileObserver;->(Ljava/io/File;I)V HSPLandroid/os/FileObserver;->(Ljava/lang/String;I)V HSPLandroid/os/FileObserver;->(Ljava/util/List;I)V HSPLandroid/os/FileObserver;->startWatching()V -HSPLandroid/os/FileUtils;->buildValidExtFilename(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String; +HSPLandroid/os/FileUtils;->buildValidExtFilename(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/os/FileUtils;->bytesToFile(Ljava/lang/String;[B)V HSPLandroid/os/FileUtils;->closeQuietly(Ljava/lang/AutoCloseable;)V HSPLandroid/os/FileUtils;->contains(Ljava/io/File;Ljava/io/File;)Z @@ -12018,7 +11974,6 @@ HSPLandroid/os/GraphicsEnvironment;->getGlobalSettingsString(Landroid/content/Co HSPLandroid/os/GraphicsEnvironment;->getInstance()Landroid/os/GraphicsEnvironment; HSPLandroid/os/GraphicsEnvironment;->getPackageIndex(Ljava/lang/String;Ljava/util/List;)I HSPLandroid/os/GraphicsEnvironment;->getVulkanVersion(Landroid/content/pm/PackageManager;)I -HSPLandroid/os/GraphicsEnvironment;->queryAngleChoiceInternal(Landroid/content/Context;Landroid/os/Bundle;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/os/GraphicsEnvironment;->setLayerPaths(Ljava/lang/ClassLoader;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/os/GraphicsEnvironment;->setup(Landroid/content/Context;Landroid/os/Bundle;)V HSPLandroid/os/GraphicsEnvironment;->setupAngle(Landroid/content/Context;Landroid/os/Bundle;Landroid/content/pm/PackageManager;Ljava/lang/String;)Z @@ -12029,7 +11984,6 @@ HSPLandroid/os/Handler$BlockingRunnable;->(Ljava/lang/Runnable;)V HSPLandroid/os/Handler$BlockingRunnable;->postAndWait(Landroid/os/Handler;J)Z HSPLandroid/os/Handler$BlockingRunnable;->run()V HSPLandroid/os/Handler$MessengerImpl;->(Landroid/os/Handler;)V -HSPLandroid/os/Handler$MessengerImpl;->(Landroid/os/Handler;Landroid/os/Handler$MessengerImpl-IA;)V HSPLandroid/os/Handler$MessengerImpl;->send(Landroid/os/Message;)V HSPLandroid/os/Handler;->()V HSPLandroid/os/Handler;->(Landroid/os/Handler$Callback;)V @@ -12041,8 +11995,8 @@ HSPLandroid/os/Handler;->(Landroid/os/Looper;Landroid/os/Handler$Callback; HSPLandroid/os/Handler;->(Z)V HSPLandroid/os/Handler;->createAsync(Landroid/os/Looper;)Landroid/os/Handler; HSPLandroid/os/Handler;->disallowNullArgumentIfShared(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/os/Handler;->dispatchMessage(Landroid/os/Message;)V+]Landroid/os/Handler;missing_types -HSPLandroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z+]Landroid/os/Message;Landroid/os/Message;]Landroid/os/MessageQueue;Landroid/os/MessageQueue; +HSPLandroid/os/Handler;->dispatchMessage(Landroid/os/Message;)V +HSPLandroid/os/Handler;->enqueueMessage(Landroid/os/MessageQueue;Landroid/os/Message;J)Z HSPLandroid/os/Handler;->executeOrSendMessage(Landroid/os/Message;)Z HSPLandroid/os/Handler;->getIMessenger()Landroid/os/IMessenger; HSPLandroid/os/Handler;->getLooper()Landroid/os/Looper; @@ -12050,7 +12004,7 @@ HSPLandroid/os/Handler;->getMain()Landroid/os/Handler; HSPLandroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;)Landroid/os/Message; HSPLandroid/os/Handler;->getPostMessage(Ljava/lang/Runnable;Ljava/lang/Object;)Landroid/os/Message; HSPLandroid/os/Handler;->getTraceName(Landroid/os/Message;)Ljava/lang/String; -HSPLandroid/os/Handler;->handleCallback(Landroid/os/Message;)V+]Ljava/lang/Runnable;missing_types +HSPLandroid/os/Handler;->handleCallback(Landroid/os/Message;)V HSPLandroid/os/Handler;->handleMessage(Landroid/os/Message;)V HSPLandroid/os/Handler;->hasCallbacks(Ljava/lang/Runnable;)Z HSPLandroid/os/Handler;->hasMessages(I)Z @@ -12060,9 +12014,9 @@ HSPLandroid/os/Handler;->obtainMessage(I)Landroid/os/Message; HSPLandroid/os/Handler;->obtainMessage(III)Landroid/os/Message; HSPLandroid/os/Handler;->obtainMessage(IIILjava/lang/Object;)Landroid/os/Message; HSPLandroid/os/Handler;->obtainMessage(ILjava/lang/Object;)Landroid/os/Message; -HSPLandroid/os/Handler;->post(Ljava/lang/Runnable;)Z+]Landroid/os/Handler;missing_types +HSPLandroid/os/Handler;->post(Ljava/lang/Runnable;)Z HSPLandroid/os/Handler;->postAtFrontOfQueue(Ljava/lang/Runnable;)Z -HSPLandroid/os/Handler;->postAtTime(Ljava/lang/Runnable;J)Z+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler; +HSPLandroid/os/Handler;->postAtTime(Ljava/lang/Runnable;J)Z HSPLandroid/os/Handler;->postAtTime(Ljava/lang/Runnable;Ljava/lang/Object;J)Z HSPLandroid/os/Handler;->postDelayed(Ljava/lang/Runnable;IJ)Z HSPLandroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z @@ -12075,10 +12029,10 @@ HSPLandroid/os/Handler;->runWithScissors(Ljava/lang/Runnable;J)Z HSPLandroid/os/Handler;->sendEmptyMessage(I)Z HSPLandroid/os/Handler;->sendEmptyMessageAtTime(IJ)Z HSPLandroid/os/Handler;->sendEmptyMessageDelayed(IJ)Z -HSPLandroid/os/Handler;->sendMessage(Landroid/os/Message;)Z+]Landroid/os/Handler;missing_types +HSPLandroid/os/Handler;->sendMessage(Landroid/os/Message;)Z HSPLandroid/os/Handler;->sendMessageAtFrontOfQueue(Landroid/os/Message;)Z HSPLandroid/os/Handler;->sendMessageAtTime(Landroid/os/Message;J)Z -HSPLandroid/os/Handler;->sendMessageDelayed(Landroid/os/Message;J)Z+]Landroid/os/Handler;missing_types +HSPLandroid/os/Handler;->sendMessageDelayed(Landroid/os/Message;J)Z HSPLandroid/os/Handler;->toString()Ljava/lang/String; HSPLandroid/os/HandlerExecutor;->(Landroid/os/Handler;)V HSPLandroid/os/HandlerExecutor;->execute(Ljava/lang/Runnable;)V @@ -12108,7 +12062,7 @@ HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->(Landroid/os/IBind HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->asBinder()Landroid/os/IBinder; HSPLandroid/os/IBatteryPropertiesRegistrar$Stub$Proxy;->getProperty(ILandroid/os/BatteryProperty;)I HSPLandroid/os/IBatteryPropertiesRegistrar$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IBatteryPropertiesRegistrar; -HSPLandroid/os/IBinder$DeathRecipient;->binderDied(Landroid/os/IBinder;)V+]Landroid/os/IBinder$DeathRecipient;Landroid/os/RemoteCallbackList$Callback; +HSPLandroid/os/IBinder$DeathRecipient;->binderDied(Landroid/os/IBinder;)V HSPLandroid/os/IBinder;->getSuggestedMaxIpcSizeBytes()I HSPLandroid/os/ICancellationSignal$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/os/ICancellationSignal$Stub$Proxy;->asBinder()Landroid/os/IBinder; @@ -12121,7 +12075,6 @@ HSPLandroid/os/IDeviceIdentifiersPolicyService$Stub;->asInterface(Landroid/os/IB HSPLandroid/os/IDeviceIdleController$Stub$Proxy;->isPowerSaveWhitelistApp(Ljava/lang/String;)Z HSPLandroid/os/IDeviceIdleController$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IDeviceIdleController; HSPLandroid/os/IHintManager$Stub$Proxy;->(Landroid/os/IBinder;)V -HSPLandroid/os/IHintManager$Stub$Proxy;->createHintSession(Landroid/os/IBinder;[IJ)Landroid/os/IHintSession; HSPLandroid/os/IHintManager$Stub$Proxy;->getHintSessionPreferredRate()J HSPLandroid/os/IHintManager$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IHintManager; HSPLandroid/os/IHintSession$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/IHintSession; @@ -12160,7 +12113,6 @@ HSPLandroid/os/IRemoteCallback$Stub;->asInterface(Landroid/os/IBinder;)Landroid/ HSPLandroid/os/IRemoteCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z HSPLandroid/os/IServiceManager$Stub$Proxy;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V HSPLandroid/os/IServiceManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; -HSPLandroid/os/IServiceManager$Stub$Proxy;->checkService(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/IServiceManager$Stub$Proxy;->isDeclared(Ljava/lang/String;)Z HSPLandroid/os/ISystemConfig$Stub;->asInterface(Landroid/os/IBinder;)Landroid/os/ISystemConfig; HSPLandroid/os/IThermalEventListener$Stub;->()V @@ -12221,12 +12173,12 @@ HSPLandroid/os/LocaleList$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Ob HSPLandroid/os/LocaleList;->([Ljava/util/Locale;)V HSPLandroid/os/LocaleList;->computeFirstMatch(Ljava/util/Collection;Z)Ljava/util/Locale; HSPLandroid/os/LocaleList;->computeFirstMatchIndex(Ljava/util/Collection;Z)I -HSPLandroid/os/LocaleList;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/util/Locale; +HSPLandroid/os/LocaleList;->equals(Ljava/lang/Object;)Z HSPLandroid/os/LocaleList;->findFirstMatchIndex(Ljava/util/Locale;)I HSPLandroid/os/LocaleList;->forLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList; HSPLandroid/os/LocaleList;->get(I)Ljava/util/Locale; HSPLandroid/os/LocaleList;->getAdjustedDefault()Landroid/os/LocaleList; -HSPLandroid/os/LocaleList;->getDefault()Landroid/os/LocaleList;+]Ljava/lang/Object;Ljava/util/Locale; +HSPLandroid/os/LocaleList;->getDefault()Landroid/os/LocaleList; HSPLandroid/os/LocaleList;->getEmptyLocaleList()Landroid/os/LocaleList; HSPLandroid/os/LocaleList;->getFirstMatchWithEnglishSupported([Ljava/lang/String;)Ljava/util/Locale; HSPLandroid/os/LocaleList;->getLikelyScript(Ljava/util/Locale;)Ljava/lang/String; @@ -12245,11 +12197,11 @@ HSPLandroid/os/Looper;->(Z)V HSPLandroid/os/Looper;->getMainLooper()Landroid/os/Looper; HSPLandroid/os/Looper;->getQueue()Landroid/os/MessageQueue; HSPLandroid/os/Looper;->getThread()Ljava/lang/Thread; -HSPLandroid/os/Looper;->getThresholdOverride()I+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Thread;missing_types +HSPLandroid/os/Looper;->getThresholdOverride()I HSPLandroid/os/Looper;->isCurrentThread()Z HSPLandroid/os/Looper;->loop()V -HSPLandroid/os/Looper;->loopOnce(Landroid/os/Looper;JI)Z+]Landroid/os/Handler;megamorphic_types]Landroid/os/Message;Landroid/os/Message;]Landroid/os/MessageQueue;Landroid/os/MessageQueue; -HSPLandroid/os/Looper;->myLooper()Landroid/os/Looper;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal; +HSPLandroid/os/Looper;->loopOnce(Landroid/os/Looper;JI)Z +HSPLandroid/os/Looper;->myLooper()Landroid/os/Looper; HSPLandroid/os/Looper;->myQueue()Landroid/os/MessageQueue; HSPLandroid/os/Looper;->prepare()V HSPLandroid/os/Looper;->prepare(Z)V @@ -12282,7 +12234,7 @@ HSPLandroid/os/Message;->peekData()Landroid/os/Bundle; HSPLandroid/os/Message;->readFromParcel(Landroid/os/Parcel;)V HSPLandroid/os/Message;->recycle()V HSPLandroid/os/Message;->recycleUnchecked()V -HSPLandroid/os/Message;->sendToTarget()V+]Landroid/os/Handler;megamorphic_types +HSPLandroid/os/Message;->sendToTarget()V HSPLandroid/os/Message;->setAsynchronous(Z)V HSPLandroid/os/Message;->setCallback(Ljava/lang/Runnable;)Landroid/os/Message; HSPLandroid/os/Message;->setData(Landroid/os/Bundle;)V @@ -12297,22 +12249,22 @@ HSPLandroid/os/MessageQueue;->addIdleHandler(Landroid/os/MessageQueue$IdleHandle HSPLandroid/os/MessageQueue;->addOnFileDescriptorEventListener(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V HSPLandroid/os/MessageQueue;->dispatchEvents(II)I HSPLandroid/os/MessageQueue;->dispose()V -HSPLandroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z+]Landroid/os/Message;Landroid/os/Message; +HSPLandroid/os/MessageQueue;->enqueueMessage(Landroid/os/Message;J)Z HSPLandroid/os/MessageQueue;->finalize()V HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;ILjava/lang/Object;)Z HSPLandroid/os/MessageQueue;->hasMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)Z -HSPLandroid/os/MessageQueue;->next()Landroid/os/Message;+]Landroid/os/MessageQueue$IdleHandler;missing_types]Landroid/os/Message;Landroid/os/Message;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/os/MessageQueue;->next()Landroid/os/Message; HSPLandroid/os/MessageQueue;->postSyncBarrier()I -HSPLandroid/os/MessageQueue;->postSyncBarrier(J)I+]Landroid/os/Message;Landroid/os/Message; +HSPLandroid/os/MessageQueue;->postSyncBarrier(J)I HSPLandroid/os/MessageQueue;->quit(Z)V HSPLandroid/os/MessageQueue;->removeAllFutureMessagesLocked()V HSPLandroid/os/MessageQueue;->removeAllMessagesLocked()V HSPLandroid/os/MessageQueue;->removeCallbacksAndMessages(Landroid/os/Handler;Ljava/lang/Object;)V HSPLandroid/os/MessageQueue;->removeIdleHandler(Landroid/os/MessageQueue$IdleHandler;)V -HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;ILjava/lang/Object;)V+]Landroid/os/Message;Landroid/os/Message; -HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)V+]Landroid/os/Message;Landroid/os/Message; +HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;ILjava/lang/Object;)V +HSPLandroid/os/MessageQueue;->removeMessages(Landroid/os/Handler;Ljava/lang/Runnable;Ljava/lang/Object;)V HSPLandroid/os/MessageQueue;->removeOnFileDescriptorEventListener(Ljava/io/FileDescriptor;)V -HSPLandroid/os/MessageQueue;->removeSyncBarrier(I)V+]Landroid/os/Message;Landroid/os/Message; +HSPLandroid/os/MessageQueue;->removeSyncBarrier(I)V HSPLandroid/os/MessageQueue;->updateOnFileDescriptorEventListenerLocked(Ljava/io/FileDescriptor;ILandroid/os/MessageQueue$OnFileDescriptorEventListener;)V HSPLandroid/os/Messenger$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/Messenger; HSPLandroid/os/Messenger$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -12325,15 +12277,15 @@ HSPLandroid/os/Messenger;->send(Landroid/os/Message;)V HSPLandroid/os/Messenger;->writeMessengerOrNullToParcel(Landroid/os/Messenger;Landroid/os/Parcel;)V HSPLandroid/os/Messenger;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/os/Parcel$2;->(Landroid/os/Parcel;Ljava/io/InputStream;Ljava/lang/ClassLoader;)V -HSPLandroid/os/Parcel$2;->resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class;+]Ljava/io/ObjectStreamClass;Ljava/io/ObjectStreamClass; +HSPLandroid/os/Parcel$2;->resolveClass(Ljava/io/ObjectStreamClass;)Ljava/lang/Class; HSPLandroid/os/Parcel$LazyValue;->(Landroid/os/Parcel;IIILjava/lang/ClassLoader;)V -HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/os/Parcel$LazyValue;Landroid/os/Parcel$LazyValue; +HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; +HSPLandroid/os/Parcel$LazyValue;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/os/Parcel$LazyValue;->writeToParcel(Landroid/os/Parcel;)V -HSPLandroid/os/Parcel$ReadWriteHelper;->readString16(Landroid/os/Parcel;)Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel$ReadWriteHelper;->readString8(Landroid/os/Parcel;)Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel$ReadWriteHelper;->writeString16(Landroid/os/Parcel;Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel$ReadWriteHelper;->writeString8(Landroid/os/Parcel;Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel$ReadWriteHelper;->readString16(Landroid/os/Parcel;)Ljava/lang/String; +HSPLandroid/os/Parcel$ReadWriteHelper;->readString8(Landroid/os/Parcel;)Ljava/lang/String; +HSPLandroid/os/Parcel$ReadWriteHelper;->writeString16(Landroid/os/Parcel;Ljava/lang/String;)V +HSPLandroid/os/Parcel$ReadWriteHelper;->writeString8(Landroid/os/Parcel;Ljava/lang/String;)V HSPLandroid/os/Parcel;->-$$Nest$mreadValue(Landroid/os/Parcel;Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->(J)V HSPLandroid/os/Parcel;->adoptClassCookies(Landroid/os/Parcel;)V @@ -12347,20 +12299,20 @@ HSPLandroid/os/Parcel;->createByteArray()[B HSPLandroid/os/Parcel;->createException(ILjava/lang/String;)Ljava/lang/Exception; HSPLandroid/os/Parcel;->createExceptionOrNull(ILjava/lang/String;)Ljava/lang/Exception; HSPLandroid/os/Parcel;->createFloatArray()[F -HSPLandroid/os/Parcel;->createIntArray()[I+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->createLongArray()[J+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->createString16Array()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->createString8Array()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->createIntArray()[I +HSPLandroid/os/Parcel;->createLongArray()[J +HSPLandroid/os/Parcel;->createString16Array()[Ljava/lang/String; +HSPLandroid/os/Parcel;->createString8Array()[Ljava/lang/String; HSPLandroid/os/Parcel;->createStringArray()[Ljava/lang/String; -HSPLandroid/os/Parcel;->createStringArrayList()Ljava/util/ArrayList;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;missing_types]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->createStringArrayList()Ljava/util/ArrayList; +HSPLandroid/os/Parcel;->createTypedArray(Landroid/os/Parcelable$Creator;)[Ljava/lang/Object; +HSPLandroid/os/Parcel;->createTypedArrayList(Landroid/os/Parcelable$Creator;)Ljava/util/ArrayList; HSPLandroid/os/Parcel;->dataAvail()I HSPLandroid/os/Parcel;->dataPosition()I HSPLandroid/os/Parcel;->dataSize()I HSPLandroid/os/Parcel;->destroy()V HSPLandroid/os/Parcel;->enforceInterface(Ljava/lang/String;)V -HSPLandroid/os/Parcel;->enforceNoDataAvail()V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->enforceNoDataAvail()V HSPLandroid/os/Parcel;->ensureReadSquashableParcelables()V HSPLandroid/os/Parcel;->ensureWithinMemoryLimit(II)V HSPLandroid/os/Parcel;->finalize()V @@ -12382,21 +12334,21 @@ HSPLandroid/os/Parcel;->obtain(Landroid/os/IBinder;)Landroid/os/Parcel; HSPLandroid/os/Parcel;->pushAllowFds(Z)Z HSPLandroid/os/Parcel;->readArrayList(Ljava/lang/ClassLoader;)Ljava/util/ArrayList; HSPLandroid/os/Parcel;->readArrayList(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/ArrayList; -HSPLandroid/os/Parcel;->readArrayListInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/ArrayList;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;IZZLjava/lang/ClassLoader;)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readArrayListInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/ArrayList; +HSPLandroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;IZZLjava/lang/ClassLoader;)I HSPLandroid/os/Parcel;->readArrayMap(Landroid/util/ArrayMap;Ljava/lang/ClassLoader;)V HSPLandroid/os/Parcel;->readArrayMapInternal(Landroid/util/ArrayMap;ILjava/lang/ClassLoader;)V HSPLandroid/os/Parcel;->readArraySet(Ljava/lang/ClassLoader;)Landroid/util/ArraySet; HSPLandroid/os/Parcel;->readBinderList(Ljava/util/List;)V HSPLandroid/os/Parcel;->readBlob()[B -HSPLandroid/os/Parcel;->readBoolean()Z+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readBoolean()Z HSPLandroid/os/Parcel;->readBooleanArray([Z)V -HSPLandroid/os/Parcel;->readBundle()Landroid/os/Bundle;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle;+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readByte()B+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readBundle()Landroid/os/Bundle; +HSPLandroid/os/Parcel;->readBundle(Ljava/lang/ClassLoader;)Landroid/os/Bundle; +HSPLandroid/os/Parcel;->readByte()B HSPLandroid/os/Parcel;->readByteArray([B)V HSPLandroid/os/Parcel;->readCallingWorkSourceUid()I -HSPLandroid/os/Parcel;->readCharSequence()Ljava/lang/CharSequence;+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1; +HSPLandroid/os/Parcel;->readCharSequence()Ljava/lang/CharSequence; HSPLandroid/os/Parcel;->readCharSequenceArray()[Ljava/lang/CharSequence; HSPLandroid/os/Parcel;->readDouble()D HSPLandroid/os/Parcel;->readException()V @@ -12408,7 +12360,7 @@ HSPLandroid/os/Parcel;->readHashMap(Ljava/lang/ClassLoader;)Ljava/util/HashMap; HSPLandroid/os/Parcel;->readHashMapInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;Ljava/lang/Class;)Ljava/util/HashMap; HSPLandroid/os/Parcel;->readInt()I HSPLandroid/os/Parcel;->readIntArray([I)V -HSPLandroid/os/Parcel;->readLazyValue(Ljava/lang/ClassLoader;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readLazyValue(Ljava/lang/ClassLoader;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readList(Ljava/util/List;Ljava/lang/ClassLoader;)V HSPLandroid/os/Parcel;->readList(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)V HSPLandroid/os/Parcel;->readListInternal(Ljava/util/List;ILjava/lang/ClassLoader;)V @@ -12422,42 +12374,42 @@ HSPLandroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;)Landroid/os/Parce HSPLandroid/os/Parcel;->readParcelable(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readParcelableArray(Ljava/lang/ClassLoader;)[Landroid/os/Parcelable; HSPLandroid/os/Parcel;->readParcelableArray(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Ljava/lang/Object; -HSPLandroid/os/Parcel;->readParcelableArrayInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readParcelableArrayInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)[Ljava/lang/Object; HSPLandroid/os/Parcel;->readParcelableCreator(Ljava/lang/ClassLoader;)Landroid/os/Parcelable$Creator; -HSPLandroid/os/Parcel;->readParcelableCreatorInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/os/Parcelable$Creator;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Landroid/os/Parcel;]Ljava/lang/reflect/Field;Ljava/lang/reflect/Field;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readParcelableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;megamorphic_types]Landroid/os/Parcelable$ClassLoaderCreator;Landroid/content/pm/ParceledListSlice$1; +HSPLandroid/os/Parcel;->readParcelableCreatorInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/os/Parcelable$Creator; +HSPLandroid/os/Parcel;->readParcelableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;)Ljava/util/List; HSPLandroid/os/Parcel;->readParcelableList(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/List; -HSPLandroid/os/Parcel;->readParcelableListInternal(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readParcelableListInternal(Ljava/util/List;Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/util/List; HSPLandroid/os/Parcel;->readPersistableBundle()Landroid/os/PersistableBundle; HSPLandroid/os/Parcel;->readPersistableBundle(Ljava/lang/ClassLoader;)Landroid/os/PersistableBundle; HSPLandroid/os/Parcel;->readRawFileDescriptor()Ljava/io/FileDescriptor; HSPLandroid/os/Parcel;->readSerializable()Ljava/io/Serializable; -HSPLandroid/os/Parcel;->readSerializableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/io/ObjectInputStream;Landroid/os/Parcel$2;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readSerializableInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readSize()Landroid/util/Size; HSPLandroid/os/Parcel;->readSparseArray(Ljava/lang/ClassLoader;)Landroid/util/SparseArray; HSPLandroid/os/Parcel;->readSparseArray(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/util/SparseArray; HSPLandroid/os/Parcel;->readSparseArrayInternal(Ljava/lang/ClassLoader;Ljava/lang/Class;)Landroid/util/SparseArray; HSPLandroid/os/Parcel;->readSparseIntArray()Landroid/util/SparseIntArray; HSPLandroid/os/Parcel;->readSparseIntArrayInternal(Landroid/util/SparseIntArray;I)V -HSPLandroid/os/Parcel;->readSquashed(Landroid/os/Parcel$SquashReadHelper;)Landroid/os/Parcelable;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/os/Parcel$SquashReadHelper;Landroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readString()Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->readString16()Ljava/lang/String;+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper; +HSPLandroid/os/Parcel;->readSquashed(Landroid/os/Parcel$SquashReadHelper;)Landroid/os/Parcelable; +HSPLandroid/os/Parcel;->readString()Ljava/lang/String; +HSPLandroid/os/Parcel;->readString16()Ljava/lang/String; HSPLandroid/os/Parcel;->readString16Array([Ljava/lang/String;)V HSPLandroid/os/Parcel;->readString16NoHelper()Ljava/lang/String; -HSPLandroid/os/Parcel;->readString8()Ljava/lang/String;+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper; +HSPLandroid/os/Parcel;->readString8()Ljava/lang/String; HSPLandroid/os/Parcel;->readString8NoHelper()Ljava/lang/String; -HSPLandroid/os/Parcel;->readStringArray()[Ljava/lang/String;+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readStringArray()[Ljava/lang/String; HSPLandroid/os/Parcel;->readStringArray([Ljava/lang/String;)V HSPLandroid/os/Parcel;->readStringList(Ljava/util/List;)V HSPLandroid/os/Parcel;->readStrongBinder()Landroid/os/IBinder; HSPLandroid/os/Parcel;->readTypedArray([Ljava/lang/Object;Landroid/os/Parcelable$Creator;)V HSPLandroid/os/Parcel;->readTypedList(Ljava/util/List;Landroid/os/Parcelable$Creator;)V -HSPLandroid/os/Parcel;->readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object;+]Landroid/os/Parcelable$Creator;megamorphic_types]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readTypedObject(Landroid/os/Parcelable$Creator;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readValue(ILjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Object; -HSPLandroid/os/Parcel;->readValue(ILjava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readValue(ILjava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;)Ljava/lang/Object; -HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object;+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->readValue(Ljava/lang/ClassLoader;Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/os/Parcel;->recycle()V HSPLandroid/os/Parcel;->resetSqaushingState()V HSPLandroid/os/Parcel;->restoreAllowFds(Z)V @@ -12467,13 +12419,13 @@ HSPLandroid/os/Parcel;->setDataSize(I)V HSPLandroid/os/Parcel;->setReadWriteHelper(Landroid/os/Parcel$ReadWriteHelper;)V HSPLandroid/os/Parcel;->unmarshall([BII)V HSPLandroid/os/Parcel;->writeArrayMap(Landroid/util/ArrayMap;)V -HSPLandroid/os/Parcel;->writeArrayMapInternal(Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeArrayMapInternal(Landroid/util/ArrayMap;)V HSPLandroid/os/Parcel;->writeArraySet(Landroid/util/ArraySet;)V HSPLandroid/os/Parcel;->writeBinderList(Ljava/util/List;)V HSPLandroid/os/Parcel;->writeBlob([B)V -HSPLandroid/os/Parcel;->writeBoolean(Z)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeBoolean(Z)V HSPLandroid/os/Parcel;->writeBooleanArray([Z)V -HSPLandroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeBundle(Landroid/os/Bundle;)V HSPLandroid/os/Parcel;->writeByte(B)V HSPLandroid/os/Parcel;->writeByteArray([B)V HSPLandroid/os/Parcel;->writeByteArray([BII)V @@ -12492,33 +12444,33 @@ HSPLandroid/os/Parcel;->writeLongArray([J)V HSPLandroid/os/Parcel;->writeMap(Ljava/util/Map;)V HSPLandroid/os/Parcel;->writeMapInternal(Ljava/util/Map;)V HSPLandroid/os/Parcel;->writeNoException()V -HSPLandroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V+]Landroid/os/Parcelable;missing_types]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeParcelableArray([Landroid/os/Parcelable;I)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V+]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeParcelable(Landroid/os/Parcelable;I)V +HSPLandroid/os/Parcel;->writeParcelableArray([Landroid/os/Parcelable;I)V +HSPLandroid/os/Parcel;->writeParcelableCreator(Landroid/os/Parcelable;)V HSPLandroid/os/Parcel;->writeParcelableList(Ljava/util/List;I)V HSPLandroid/os/Parcel;->writePersistableBundle(Landroid/os/PersistableBundle;)V HSPLandroid/os/Parcel;->writeSerializable(Ljava/io/Serializable;)V HSPLandroid/os/Parcel;->writeSparseArray(Landroid/util/SparseArray;)V HSPLandroid/os/Parcel;->writeSparseBooleanArray(Landroid/util/SparseBooleanArray;)V HSPLandroid/os/Parcel;->writeSparseIntArray(Landroid/util/SparseIntArray;)V -HSPLandroid/os/Parcel;->writeString(Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeString16(Ljava/lang/String;)V+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper; -HSPLandroid/os/Parcel;->writeString16Array([Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeString(Ljava/lang/String;)V +HSPLandroid/os/Parcel;->writeString16(Ljava/lang/String;)V +HSPLandroid/os/Parcel;->writeString16Array([Ljava/lang/String;)V HSPLandroid/os/Parcel;->writeString16NoHelper(Ljava/lang/String;)V -HSPLandroid/os/Parcel;->writeString8(Ljava/lang/String;)V+]Landroid/os/Parcel$ReadWriteHelper;Landroid/os/Parcel$ReadWriteHelper; +HSPLandroid/os/Parcel;->writeString8(Ljava/lang/String;)V HSPLandroid/os/Parcel;->writeString8Array([Ljava/lang/String;)V HSPLandroid/os/Parcel;->writeString8NoHelper(Ljava/lang/String;)V -HSPLandroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeStringArray([Ljava/lang/String;)V HSPLandroid/os/Parcel;->writeStringList(Ljava/util/List;)V HSPLandroid/os/Parcel;->writeStrongBinder(Landroid/os/IBinder;)V -HSPLandroid/os/Parcel;->writeStrongInterface(Landroid/os/IInterface;)V+]Landroid/os/IInterface;Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;,Landroid/app/ActivityThread$ApplicationThread;,Landroid/view/ViewRootImpl$W;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeStrongInterface(Landroid/os/IInterface;)V +HSPLandroid/os/Parcel;->writeTypedArray([Landroid/os/Parcelable;I)V HSPLandroid/os/Parcel;->writeTypedArrayMap(Landroid/util/ArrayMap;I)V HSPLandroid/os/Parcel;->writeTypedList(Ljava/util/List;)V HSPLandroid/os/Parcel;->writeTypedList(Ljava/util/List;I)V -HSPLandroid/os/Parcel;->writeTypedObject(Landroid/os/Parcelable;I)V+]Landroid/os/Parcelable;Landroid/view/WindowManager$LayoutParams;,Landroid/content/Intent;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeValue(ILjava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Long;Ljava/lang/Long;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/os/Parcel;->writeValue(Ljava/lang/Object;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/Parcel;->writeTypedObject(Landroid/os/Parcelable;I)V +HSPLandroid/os/Parcel;->writeValue(ILjava/lang/Object;)V +HSPLandroid/os/Parcel;->writeValue(Ljava/lang/Object;)V HSPLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Landroid/os/ParcelFileDescriptor; HSPLandroid/os/ParcelFileDescriptor$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/os/ParcelFileDescriptor$AutoCloseInputStream;->(Landroid/os/ParcelFileDescriptor;)V @@ -12672,15 +12624,12 @@ HSPLandroid/os/RemoteCallback;->(Landroid/os/RemoteCallback$OnResultListen HSPLandroid/os/RemoteCallback;->(Landroid/os/RemoteCallback$OnResultListener;Landroid/os/Handler;)V HSPLandroid/os/RemoteCallback;->sendResult(Landroid/os/Bundle;)V HSPLandroid/os/RemoteCallback;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/os/RemoteCallbackList$Callback;->(Landroid/os/RemoteCallbackList;Landroid/os/IInterface;Ljava/lang/Object;)V -HSPLandroid/os/RemoteCallbackList$Callback;->binderDied()V HSPLandroid/os/RemoteCallbackList;->()V HSPLandroid/os/RemoteCallbackList;->beginBroadcast()I HSPLandroid/os/RemoteCallbackList;->finishBroadcast()V HSPLandroid/os/RemoteCallbackList;->getBroadcastCookie(I)Ljava/lang/Object; HSPLandroid/os/RemoteCallbackList;->getBroadcastItem(I)Landroid/os/IInterface; HSPLandroid/os/RemoteCallbackList;->kill()V -HSPLandroid/os/RemoteCallbackList;->logExcessiveCallbacks()V HSPLandroid/os/RemoteCallbackList;->onCallbackDied(Landroid/os/IInterface;)V HSPLandroid/os/RemoteCallbackList;->onCallbackDied(Landroid/os/IInterface;Ljava/lang/Object;)V HSPLandroid/os/RemoteCallbackList;->register(Landroid/os/IInterface;)Z @@ -12707,22 +12656,17 @@ HSPLandroid/os/ServiceManager;->getService(Ljava/lang/String;)Landroid/os/IBinde HSPLandroid/os/ServiceManager;->getServiceOrThrow(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/ServiceManager;->initServiceCache(Ljava/util/Map;)V HSPLandroid/os/ServiceManager;->isDeclared(Ljava/lang/String;)Z -HSPLandroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder;+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger;]Landroid/os/IServiceManager;Landroid/os/ServiceManagerProxy; +HSPLandroid/os/ServiceManager;->rawGetService(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/ServiceManager;->waitForDeclaredService(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/ServiceManagerProxy;->addService(Ljava/lang/String;Landroid/os/IBinder;ZI)V -HSPLandroid/os/ServiceManagerProxy;->checkService(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/ServiceManagerProxy;->getService(Ljava/lang/String;)Landroid/os/IBinder; HSPLandroid/os/ServiceManagerProxy;->isDeclared(Ljava/lang/String;)Z HSPLandroid/os/ServiceSpecificException;->(ILjava/lang/String;)V HSPLandroid/os/SharedMemory$1;->createFromParcel(Landroid/os/Parcel;)Landroid/os/SharedMemory; HSPLandroid/os/SharedMemory$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/os/SharedMemory$Closer;->(ILandroid/os/SharedMemory$MemoryRegistration;)V -HSPLandroid/os/SharedMemory$Closer;->(ILandroid/os/SharedMemory$MemoryRegistration;Landroid/os/SharedMemory$Closer-IA;)V HSPLandroid/os/SharedMemory$MemoryRegistration;->(I)V -HSPLandroid/os/SharedMemory$MemoryRegistration;->(ILandroid/os/SharedMemory$MemoryRegistration-IA;)V HSPLandroid/os/SharedMemory$MemoryRegistration;->acquire()Landroid/os/SharedMemory$MemoryRegistration; HSPLandroid/os/SharedMemory$Unmapper;->(JILandroid/os/SharedMemory$MemoryRegistration;)V -HSPLandroid/os/SharedMemory$Unmapper;->(JILandroid/os/SharedMemory$MemoryRegistration;Landroid/os/SharedMemory$Unmapper-IA;)V HSPLandroid/os/SharedMemory;->(Ljava/io/FileDescriptor;)V HSPLandroid/os/SharedMemory;->(Ljava/io/FileDescriptor;Landroid/os/SharedMemory-IA;)V HSPLandroid/os/SharedMemory;->checkOpen()V @@ -12766,14 +12710,13 @@ HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->handleViolationWithTimingAtt HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->lambda$handleViolationWithTimingAttempt$0(Landroid/view/IWindowManager;Ljava/util/ArrayList;)V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onCustomSlowCall(Ljava/lang/String;)V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onNetwork()V -HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onReadFromDisk()V+]Landroid/os/StrictMode$AndroidBlockGuardPolicy;Landroid/os/StrictMode$AndroidBlockGuardPolicy; +HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onReadFromDisk()V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onThreadPolicyViolation(Landroid/os/StrictMode$ViolationInfo;)V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onUnbufferedIO()V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->onWriteToDisk()V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->setThreadPolicyMask(I)V HSPLandroid/os/StrictMode$AndroidBlockGuardPolicy;->startHandlingViolationException(Landroid/os/strictmode/Violation;)V HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->()V -HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->(Landroid/os/StrictMode$AndroidCloseGuardReporter-IA;)V HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->report(Ljava/lang/String;)V HSPLandroid/os/StrictMode$AndroidCloseGuardReporter;->report(Ljava/lang/String;Ljava/lang/Throwable;)V HSPLandroid/os/StrictMode$InstanceTracker;->(Ljava/lang/Object;)V @@ -12802,13 +12745,10 @@ HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitDiskReads()Landroid/os/St HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitDiskWrites()Landroid/os/StrictMode$ThreadPolicy$Builder; HSPLandroid/os/StrictMode$ThreadPolicy$Builder;->permitUnbufferedIo()Landroid/os/StrictMode$ThreadPolicy$Builder; HSPLandroid/os/StrictMode$ThreadPolicy;->(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;)V -HSPLandroid/os/StrictMode$ThreadPolicy;->(ILandroid/os/StrictMode$OnThreadViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$ThreadPolicy-IA;)V HSPLandroid/os/StrictMode$ThreadSpanState;->()V -HSPLandroid/os/StrictMode$ThreadSpanState;->(Landroid/os/StrictMode$ThreadSpanState-IA;)V HSPLandroid/os/StrictMode$UnsafeIntentStrictModeCallback;->()V -HSPLandroid/os/StrictMode$UnsafeIntentStrictModeCallback;->(Landroid/os/StrictMode$UnsafeIntentStrictModeCallback-IA;)V HSPLandroid/os/StrictMode$ViolationInfo;->-$$Nest$fgetmViolation(Landroid/os/StrictMode$ViolationInfo;)Landroid/os/strictmode/Violation; -HSPLandroid/os/StrictMode$ViolationInfo;->(Landroid/os/Parcel;Z)V+]Ljava/util/Deque;Ljava/util/ArrayDeque;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/os/StrictMode$ViolationInfo;->(Landroid/os/Parcel;Z)V HSPLandroid/os/StrictMode$ViolationInfo;->(Landroid/os/strictmode/Violation;I)V HSPLandroid/os/StrictMode$ViolationInfo;->getStackTrace()Ljava/lang/String; HSPLandroid/os/StrictMode$ViolationInfo;->hashCode()I @@ -12836,7 +12776,6 @@ HSPLandroid/os/StrictMode$VmPolicy$Builder;->penaltyLog()Landroid/os/StrictMode$ HSPLandroid/os/StrictMode$VmPolicy$Builder;->permitActivityLeaks()Landroid/os/StrictMode$VmPolicy$Builder; HSPLandroid/os/StrictMode$VmPolicy$Builder;->permitUnsafeIntentLaunch()Landroid/os/StrictMode$VmPolicy$Builder; HSPLandroid/os/StrictMode$VmPolicy;->(ILjava/util/HashMap;Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;)V -HSPLandroid/os/StrictMode$VmPolicy;->(ILjava/util/HashMap;Landroid/os/StrictMode$OnVmViolationListener;Ljava/util/concurrent/Executor;Landroid/os/StrictMode$VmPolicy-IA;)V HSPLandroid/os/StrictMode;->-$$Nest$sfgetEMPTY_CLASS_LIMIT_MAP()Ljava/util/HashMap; HSPLandroid/os/StrictMode;->-$$Nest$sfgetLOGCAT_LOGGER()Landroid/os/StrictMode$ViolationLogger; HSPLandroid/os/StrictMode;->-$$Nest$sfgetLOG_V()Z @@ -12854,7 +12793,7 @@ HSPLandroid/os/StrictMode;->allowThreadDiskWritesMask()I HSPLandroid/os/StrictMode;->allowVmViolations()Landroid/os/StrictMode$VmPolicy; HSPLandroid/os/StrictMode;->assertConfigurationContext(Landroid/content/Context;Ljava/lang/String;)V HSPLandroid/os/StrictMode;->clampViolationTimeMap(Landroid/util/SparseLongArray;J)V -HSPLandroid/os/StrictMode;->clearGatheredViolations()V+]Ljava/lang/ThreadLocal;Landroid/os/StrictMode$1; +HSPLandroid/os/StrictMode;->clearGatheredViolations()V HSPLandroid/os/StrictMode;->decrementExpectedActivityCount(Ljava/lang/Class;)V HSPLandroid/os/StrictMode;->dropboxViolationAsync(ILandroid/os/StrictMode$ViolationInfo;)V HSPLandroid/os/StrictMode;->enterCriticalSpan(Ljava/lang/String;)Landroid/os/StrictMode$Span; @@ -12901,7 +12840,6 @@ HSPLandroid/os/SystemConfigManager;->()V HSPLandroid/os/SystemConfigManager;->getDisabledUntilUsedPreinstalledCarrierApps()Ljava/util/Set; HSPLandroid/os/SystemConfigManager;->getDisabledUntilUsedPreinstalledCarrierAssociatedAppEntries()Ljava/util/Map; HSPLandroid/os/SystemProperties$Handle;->(J)V -HSPLandroid/os/SystemProperties$Handle;->(JLandroid/os/SystemProperties$Handle-IA;)V HSPLandroid/os/SystemProperties$Handle;->getLong(J)J HSPLandroid/os/SystemProperties;->-$$Nest$smnative_get_long(JJ)J HSPLandroid/os/SystemProperties;->addChangeCallback(Ljava/lang/Runnable;)V @@ -12932,18 +12870,18 @@ HSPLandroid/os/Temperature;->(FILjava/lang/String;I)V HSPLandroid/os/Temperature;->getStatus()I HSPLandroid/os/Temperature;->isValidStatus(I)Z HSPLandroid/os/ThreadLocalWorkSource$$ExternalSyntheticLambda0;->get()Ljava/lang/Object; -HSPLandroid/os/ThreadLocalWorkSource;->getToken()J+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal; -HSPLandroid/os/ThreadLocalWorkSource;->getUid()I+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal; +HSPLandroid/os/ThreadLocalWorkSource;->getToken()J +HSPLandroid/os/ThreadLocalWorkSource;->getUid()I HSPLandroid/os/ThreadLocalWorkSource;->lambda$static$0()[I HSPLandroid/os/ThreadLocalWorkSource;->parseUidFromToken(J)I -HSPLandroid/os/ThreadLocalWorkSource;->restore(J)V+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal; -HSPLandroid/os/ThreadLocalWorkSource;->setUid(I)J+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal; +HSPLandroid/os/ThreadLocalWorkSource;->restore(J)V +HSPLandroid/os/ThreadLocalWorkSource;->setUid(I)J HSPLandroid/os/Trace;->asyncTraceBegin(JLjava/lang/String;I)V HSPLandroid/os/Trace;->asyncTraceEnd(JLjava/lang/String;I)V HSPLandroid/os/Trace;->asyncTraceForTrackBegin(JLjava/lang/String;Ljava/lang/String;I)V HSPLandroid/os/Trace;->asyncTraceForTrackEnd(JLjava/lang/String;I)V HSPLandroid/os/Trace;->beginAsyncSection(Ljava/lang/String;I)V -HSPLandroid/os/Trace;->beginSection(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/os/Trace;->beginSection(Ljava/lang/String;)V HSPLandroid/os/Trace;->endAsyncSection(Ljava/lang/String;I)V HSPLandroid/os/Trace;->endSection()V HSPLandroid/os/Trace;->instant(JLjava/lang/String;)V @@ -12985,19 +12923,7 @@ HSPLandroid/os/UserHandle;->writeToParcel(Landroid/os/UserHandle;Landroid/os/Par HSPLandroid/os/UserManager$1;->(Landroid/os/UserManager;ILjava/lang/String;)V HSPLandroid/os/UserManager$1;->bypass(Ljava/lang/Integer;)Z HSPLandroid/os/UserManager$1;->bypass(Ljava/lang/Object;)Z -HSPLandroid/os/UserManager$1;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean; HSPLandroid/os/UserManager$1;->recompute(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/os/UserManager$2;->(Landroid/os/UserManager;ILjava/lang/String;)V -HSPLandroid/os/UserManager$2;->bypass(Ljava/lang/Integer;)Z -HSPLandroid/os/UserManager$2;->bypass(Ljava/lang/Object;)Z -HSPLandroid/os/UserManager$2;->recompute(Ljava/lang/Integer;)Ljava/lang/Boolean; -HSPLandroid/os/UserManager$2;->recompute(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/os/UserManager$3;->(Landroid/os/UserManager;ILjava/lang/String;)V -HSPLandroid/os/UserManager$3;->bypass(Ljava/lang/Integer;)Z -HSPLandroid/os/UserManager$3;->bypass(Ljava/lang/Object;)Z -HSPLandroid/os/UserManager$3;->recompute(Ljava/lang/Integer;)Ljava/lang/String; -HSPLandroid/os/UserManager$3;->recompute(Ljava/lang/Object;)Ljava/lang/Object; -HSPLandroid/os/UserManager$4;->(Landroid/os/UserManager;ILjava/lang/String;)V HSPLandroid/os/UserManager;->-$$Nest$fgetmService(Landroid/os/UserManager;)Landroid/os/IUserManager; HSPLandroid/os/UserManager;->(Landroid/content/Context;Landroid/os/IUserManager;)V HSPLandroid/os/UserManager;->convertUserIdsToUserHandles([I)Ljava/util/List; @@ -13093,7 +13019,6 @@ HSPLandroid/os/WorkSource;->updateLocked(Landroid/os/WorkSource;ZZ)Z HSPLandroid/os/WorkSource;->updateUidsAndNamesLocked(Landroid/os/WorkSource;ZZ)Z HSPLandroid/os/WorkSource;->updateUidsLocked(Landroid/os/WorkSource;ZZ)Z HSPLandroid/os/WorkSource;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/os/connectivity/CellularBatteryStats;->(JJJJJJJJJLjava/lang/Long;[J[J[JJ)V HSPLandroid/os/health/HealthStats;->(Landroid/os/Parcel;)V HSPLandroid/os/health/HealthStats;->getMeasurement(I)J HSPLandroid/os/health/HealthStats;->getMeasurements(I)Ljava/util/Map; @@ -13127,7 +13052,6 @@ HSPLandroid/os/storage/IStorageManager$Stub;->asInterface(Landroid/os/IBinder;)L HSPLandroid/os/storage/StorageEventListener;->()V HSPLandroid/os/storage/StorageEventListener;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/os/storage/StorageManager$ObbActionListener;->(Landroid/os/storage/StorageManager;)V -HSPLandroid/os/storage/StorageManager$ObbActionListener;->(Landroid/os/storage/StorageManager;Landroid/os/storage/StorageManager$ObbActionListener-IA;)V HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;->(Landroid/os/storage/StorageManager;Ljava/util/concurrent/Executor;Landroid/os/storage/StorageEventListener;Landroid/os/storage/StorageManager$StorageVolumeCallback;)V HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;->onStorageStateChanged(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/os/storage/StorageManager$StorageEventListenerDelegate;->onVolumeStateChanged(Landroid/os/storage/VolumeInfo;II)V @@ -13136,7 +13060,7 @@ HSPLandroid/os/storage/StorageManager;->(Landroid/content/Context;Landroid HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/io/FileDescriptor;JI)V HSPLandroid/os/storage/StorageManager;->allocateBytes(Ljava/util/UUID;JI)V HSPLandroid/os/storage/StorageManager;->convert(Ljava/lang/String;)Ljava/util/UUID; -HSPLandroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/util/UUID; +HSPLandroid/os/storage/StorageManager;->convert(Ljava/util/UUID;)Ljava/lang/String; HSPLandroid/os/storage/StorageManager;->getAllocatableBytes(Ljava/util/UUID;I)J HSPLandroid/os/storage/StorageManager;->getStorageVolume(Ljava/io/File;I)Landroid/os/storage/StorageVolume; HSPLandroid/os/storage/StorageManager;->getStorageVolume([Landroid/os/storage/StorageVolume;Ljava/io/File;)Landroid/os/storage/StorageVolume; @@ -13225,7 +13149,7 @@ HSPLandroid/permission/PermissionManager$SplitPermissionInfo;->getTargetSdk()I HSPLandroid/permission/PermissionManager;->()V HSPLandroid/permission/PermissionManager;->(Landroid/content/Context;)V HSPLandroid/permission/PermissionManager;->addOnPermissionsChangeListener(Landroid/content/pm/PackageManager$OnPermissionsChangedListener;)V -HSPLandroid/permission/PermissionManager;->checkPermissionUncached(Ljava/lang/String;III)I+]Landroid/app/IActivityManager;Landroid/app/IActivityManager$Stub$Proxy;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/permission/PermissionManager;->checkPermissionUncached(Ljava/lang/String;III)I HSPLandroid/permission/PermissionManager;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)I HSPLandroid/permission/PermissionManager;->getPermissionInfo(Ljava/lang/String;I)Landroid/content/pm/PermissionInfo; HSPLandroid/permission/PermissionManager;->getPersistentDeviceId(I)Ljava/lang/String; @@ -13288,15 +13212,15 @@ HSPLandroid/provider/Settings$Global;->getInt(Landroid/content/ContentResolver;L HSPLandroid/provider/Settings$Global;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I HSPLandroid/provider/Settings$Global;->getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J HSPLandroid/provider/Settings$Global;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/provider/Settings$NameValueCache;Landroid/provider/Settings$NameValueCache;]Ljava/util/HashSet;Ljava/util/HashSet; +HSPLandroid/provider/Settings$Global;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String; HSPLandroid/provider/Settings$Global;->getUriFor(Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/provider/Settings$Global;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z HSPLandroid/provider/Settings$Global;->putLong(Landroid/content/ContentResolver;Ljava/lang/String;J)Z HSPLandroid/provider/Settings$Global;->putString(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;)Z HSPLandroid/provider/Settings$Global;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z HSPLandroid/provider/Settings$NameValueCache$$ExternalSyntheticLambda0;->(Landroid/provider/Settings$NameValueCache;)V -HSPLandroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Landroid/net/Uri;Landroid/net/Uri$StringUri; -HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefixStripPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map;+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Landroid/provider/Settings$GenerationTracker;Landroid/provider/Settings$GenerationTracker;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/provider/Settings$ContentProviderHolder;Landroid/provider/Settings$ContentProviderHolder;]Ljava/util/Set;Ljava/util/HashMap$EntrySet;]Ljava/lang/String;Ljava/lang/String;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;,Landroid/content/ContentProvider$Transport;]Ljava/util/List;Ljava/util/Arrays$ArrayList;]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;,Ljava/util/Arrays$ArrayItr;]Landroid/net/Uri;Landroid/net/Uri$StringUri; +HSPLandroid/provider/Settings$NameValueCache;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String; +HSPLandroid/provider/Settings$NameValueCache;->getStringsForPrefixStripPrefix(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/util/List;)Ljava/util/Map; HSPLandroid/provider/Settings$NameValueCache;->isCallerExemptFromReadableRestriction()Z HSPLandroid/provider/Settings$NameValueCache;->putStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZIZ)Z HSPLandroid/provider/Settings$NameValueTable;->getUriFor(Landroid/net/Uri;Ljava/lang/String;)Landroid/net/Uri; @@ -13307,7 +13231,7 @@ HSPLandroid/provider/Settings$Secure;->getIntForUser(Landroid/content/ContentRes HSPLandroid/provider/Settings$Secure;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I HSPLandroid/provider/Settings$Secure;->getLong(Landroid/content/ContentResolver;Ljava/lang/String;J)J HSPLandroid/provider/Settings$Secure;->getLongForUser(Landroid/content/ContentResolver;Ljava/lang/String;JI)J -HSPLandroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/ContentResolver;Landroid/app/ContextImpl$ApplicationContentResolver; +HSPLandroid/provider/Settings$Secure;->getString(Landroid/content/ContentResolver;Ljava/lang/String;)Ljava/lang/String; HSPLandroid/provider/Settings$Secure;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String; HSPLandroid/provider/Settings$Secure;->getUriFor(Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/provider/Settings$Secure;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z @@ -13322,7 +13246,7 @@ HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;L HSPLandroid/provider/Settings$System;->getInt(Landroid/content/ContentResolver;Ljava/lang/String;I)I HSPLandroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)I HSPLandroid/provider/Settings$System;->getIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)I -HSPLandroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/provider/Settings$NameValueCache;Landroid/provider/Settings$NameValueCache;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/HashSet;Ljava/util/HashSet; +HSPLandroid/provider/Settings$System;->getStringForUser(Landroid/content/ContentResolver;Ljava/lang/String;I)Ljava/lang/String; HSPLandroid/provider/Settings$System;->getUriFor(Ljava/lang/String;)Landroid/net/Uri; HSPLandroid/provider/Settings$System;->putInt(Landroid/content/ContentResolver;Ljava/lang/String;I)Z HSPLandroid/provider/Settings$System;->putIntForUser(Landroid/content/ContentResolver;Ljava/lang/String;II)Z @@ -13359,7 +13283,6 @@ HSPLandroid/security/KeyStore2;->getKeyEntry(Landroid/system/keystore2/KeyDescri HSPLandroid/security/KeyStore2;->getKeyStoreException(ILjava/lang/String;)Landroid/security/KeyStoreException; HSPLandroid/security/KeyStore2;->getService(Z)Landroid/system/keystore2/IKeystoreService; HSPLandroid/security/KeyStore2;->handleRemoteExceptionWithRetry(Landroid/security/KeyStore2$CheckedRemoteRequest;)Ljava/lang/Object; -HSPLandroid/security/KeyStore;->getInstance()Landroid/security/KeyStore; HSPLandroid/security/KeyStoreException;->(ILjava/lang/String;)V HSPLandroid/security/KeyStoreException;->(ILjava/lang/String;Ljava/lang/String;)V HSPLandroid/security/KeyStoreException;->getErrorCode()I @@ -13471,10 +13394,8 @@ HSPLandroid/security/keystore/KeystoreResponse;->getErrorCode()I HSPLandroid/security/keystore/Utils;->cloneIfNotNull(Ljava/util/Date;)Ljava/util/Date; HSPLandroid/security/keystore/Utils;->cloneIfNotNull([B)[B HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;->(Landroid/security/KeyStoreOperation;)V -HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;->(Landroid/security/KeyStoreOperation;Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA;)V HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream;->finish([B[B)[B HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;->(Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;)V -HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;->(Landroid/security/keystore2/KeyStoreCryptoOperationStreamer;Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA;)V HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer;->doFinal([BII[B)[B HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding;->()V HSPLandroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding;->finalize()V @@ -13689,18 +13610,18 @@ HSPLandroid/service/notification/NotificationListenerService$NotificationListene HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onListenerConnected(Landroid/service/notification/NotificationRankingUpdate;)V HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationChannelGroupModification(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationChannelModification(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannel;I)V -HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationPosted(Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/NotificationRankingUpdate;)V+]Landroid/os/Handler;Landroid/service/notification/NotificationListenerService$MyHandler;]Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/IStatusBarNotificationHolder$Stub$Proxy;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/os/Message;Landroid/os/Message; +HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationPosted(Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/NotificationRankingUpdate;)V HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationRankingUpdate(Landroid/service/notification/NotificationRankingUpdate;)V HSPLandroid/service/notification/NotificationListenerService$NotificationListenerWrapper;->onNotificationRemoved(Landroid/service/notification/IStatusBarNotificationHolder;Landroid/service/notification/NotificationRankingUpdate;Landroid/service/notification/NotificationStats;I)V HSPLandroid/service/notification/NotificationListenerService$Ranking;->()V -HSPLandroid/service/notification/NotificationListenerService$Ranking;->(Landroid/os/Parcel;)V+]Ljava/lang/Object;Landroid/service/notification/NotificationListenerService$Ranking;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/service/notification/NotificationListenerService$Ranking;->(Landroid/os/Parcel;)V HSPLandroid/service/notification/NotificationListenerService$Ranking;->getChannel()Landroid/app/NotificationChannel; HSPLandroid/service/notification/NotificationListenerService$Ranking;->getKey()Ljava/lang/String; -HSPLandroid/service/notification/NotificationListenerService$Ranking;->populate(Landroid/service/notification/NotificationListenerService$Ranking;)V+]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking; +HSPLandroid/service/notification/NotificationListenerService$Ranking;->populate(Landroid/service/notification/NotificationListenerService$Ranking;)V HSPLandroid/service/notification/NotificationListenerService$Ranking;->populate(Ljava/lang/String;IZIIILjava/lang/CharSequence;Ljava/lang/String;Landroid/app/NotificationChannel;Ljava/util/ArrayList;Ljava/util/ArrayList;ZIZJZLjava/util/ArrayList;Ljava/util/ArrayList;ZZZLandroid/content/pm/ShortcutInfo;IZIZ)V HSPLandroid/service/notification/NotificationListenerService$RankingMap$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/NotificationListenerService$RankingMap; HSPLandroid/service/notification/NotificationListenerService$RankingMap$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/service/notification/NotificationListenerService$RankingMap;->(Landroid/os/Parcel;)V+]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;Landroid/service/notification/NotificationListenerService$RankingMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/service/notification/NotificationListenerService$RankingMap;->(Landroid/os/Parcel;)V HSPLandroid/service/notification/NotificationListenerService$RankingMap;->getOrderedKeys()[Ljava/lang/String; HSPLandroid/service/notification/NotificationListenerService$RankingMap;->getRanking(Ljava/lang/String;Landroid/service/notification/NotificationListenerService$Ranking;)Z HSPLandroid/service/notification/NotificationListenerService;->()V @@ -13729,7 +13650,7 @@ HSPLandroid/service/notification/NotificationRankingUpdate;->(Landroid/os/ HSPLandroid/service/notification/NotificationRankingUpdate;->getRankingMap()Landroid/service/notification/NotificationListenerService$RankingMap; HSPLandroid/service/notification/StatusBarNotification$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/StatusBarNotification; HSPLandroid/service/notification/StatusBarNotification$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/service/notification/StatusBarNotification;->(Landroid/os/Parcel;)V+]Landroid/os/Parcelable$Creator;Lcom/android/internal/logging/InstanceId$1;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/service/notification/StatusBarNotification;->(Landroid/os/Parcel;)V HSPLandroid/service/notification/StatusBarNotification;->getGroupKey()Ljava/lang/String; HSPLandroid/service/notification/StatusBarNotification;->getId()I HSPLandroid/service/notification/StatusBarNotification;->getInstanceId()Lcom/android/internal/logging/InstanceId; @@ -13748,7 +13669,7 @@ HSPLandroid/service/notification/StatusBarNotification;->groupKey()Ljava/lang/St HSPLandroid/service/notification/StatusBarNotification;->isAppGroup()Z HSPLandroid/service/notification/StatusBarNotification;->isGroup()Z HSPLandroid/service/notification/StatusBarNotification;->isOngoing()Z -HSPLandroid/service/notification/StatusBarNotification;->key()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/UserHandle;Landroid/os/UserHandle; +HSPLandroid/service/notification/StatusBarNotification;->key()Ljava/lang/String; HSPLandroid/service/notification/ZenModeConfig$ZenRule$1;->createFromParcel(Landroid/os/Parcel;)Landroid/service/notification/ZenModeConfig$ZenRule; HSPLandroid/service/notification/ZenModeConfig$ZenRule$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/service/notification/ZenModeConfig$ZenRule;->(Landroid/os/Parcel;)V @@ -13930,14 +13851,11 @@ HSPLandroid/telecom/Log;->obfuscatePhoneNumber(Ljava/lang/StringBuilder;Ljava/la HSPLandroid/telecom/Log;->pii(Ljava/lang/Object;)Ljava/lang/String; HSPLandroid/telecom/Log;->piiHandle(Ljava/lang/Object;)Ljava/lang/String; HSPLandroid/telecom/Log;->v(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V -HSPLandroid/telecom/Logging/Session;->(Ljava/lang/String;Ljava/lang/String;JZLjava/lang/String;)V HSPLandroid/telecom/Logging/Session;->addChild(Landroid/telecom/Logging/Session;)V HSPLandroid/telecom/Logging/Session;->equals(Ljava/lang/Object;)Z HSPLandroid/telecom/Logging/Session;->getChildSessions()Ljava/util/ArrayList; HSPLandroid/telecom/Logging/Session;->getExecutionStartTimeMilliseconds()J -HSPLandroid/telecom/Logging/Session;->getFullMethodPath(Ljava/lang/StringBuilder;ZI)V HSPLandroid/telecom/Logging/Session;->getFullMethodPath(Z)Ljava/lang/String; -HSPLandroid/telecom/Logging/Session;->getFullSessionId(I)Ljava/lang/String; HSPLandroid/telecom/Logging/Session;->getLocalExecutionTime()J HSPLandroid/telecom/Logging/Session;->getNextChildId()Ljava/lang/String; HSPLandroid/telecom/Logging/Session;->getOwnerInfo()Ljava/lang/String; @@ -13950,7 +13868,6 @@ HSPLandroid/telecom/Logging/Session;->markSessionCompleted(J)V HSPLandroid/telecom/Logging/Session;->removeChild(Landroid/telecom/Logging/Session;)V HSPLandroid/telecom/Logging/Session;->setExecutionStartTimeMs(J)V HSPLandroid/telecom/Logging/Session;->setParentSession(Landroid/telecom/Logging/Session;)V -HSPLandroid/telecom/Logging/Session;->setSessionId(Ljava/lang/String;)V HSPLandroid/telecom/Logging/Session;->setShortMethodName(Ljava/lang/String;)V HSPLandroid/telecom/Logging/Session;->toString()Ljava/lang/String; HSPLandroid/telecom/Logging/SessionManager;->()V @@ -13958,7 +13875,6 @@ HSPLandroid/telecom/Logging/SessionManager;->cleanupStaleSessions(J)V HSPLandroid/telecom/Logging/SessionManager;->continueSession(Landroid/telecom/Logging/Session;Ljava/lang/String;)V HSPLandroid/telecom/Logging/SessionManager;->createSubsession()Landroid/telecom/Logging/Session; HSPLandroid/telecom/Logging/SessionManager;->createSubsession(Z)Landroid/telecom/Logging/Session; -HSPLandroid/telecom/Logging/SessionManager;->endParentSessions(Landroid/telecom/Logging/Session;)V HSPLandroid/telecom/Logging/SessionManager;->endSession()V HSPLandroid/telecom/Logging/SessionManager;->getSessionId()Ljava/lang/String; HSPLandroid/telecom/Logging/SessionManager;->resetStaleSessionTimer()V @@ -13996,7 +13912,7 @@ HSPLandroid/telecom/PhoneAccountHandle;->getComponentName()Landroid/content/Comp HSPLandroid/telecom/PhoneAccountHandle;->getId()Ljava/lang/String; HSPLandroid/telecom/PhoneAccountHandle;->getUserHandle()Landroid/os/UserHandle; HSPLandroid/telecom/PhoneAccountHandle;->hashCode()I -HSPLandroid/telecom/PhoneAccountHandle;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/content/ComponentName;Landroid/content/ComponentName; +HSPLandroid/telecom/PhoneAccountHandle;->toString()Ljava/lang/String; HSPLandroid/telecom/PhoneAccountHandle;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/telecom/TelecomManager;->(Landroid/content/Context;)V HSPLandroid/telecom/TelecomManager;->(Landroid/content/Context;Lcom/android/internal/telecom/ITelecomService;)V @@ -14115,7 +14031,6 @@ HSPLandroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder;->set HSPLandroid/telephony/LocationAccessPolicy;->checkAppLocationPermissionHelper(Landroid/content/Context;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;Ljava/lang/String;)Landroid/telephony/LocationAccessPolicy$LocationPermissionResult; HSPLandroid/telephony/LocationAccessPolicy;->checkLocationPermission(Landroid/content/Context;Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery;)Landroid/telephony/LocationAccessPolicy$LocationPermissionResult; HSPLandroid/telephony/LocationAccessPolicy;->getAppOpsString(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/telephony/LocationAccessPolicy;->isAppAtLeastSdkVersion(Landroid/content/Context;Ljava/lang/String;I)Z HSPLandroid/telephony/LocationAccessPolicy;->isCurrentProfile(Landroid/content/Context;I)Z HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/LteVopsSupportInfo; HSPLandroid/telephony/LteVopsSupportInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -14135,7 +14050,7 @@ HSPLandroid/telephony/ModemActivityInfo;->toString()Ljava/lang/String; HSPLandroid/telephony/NetworkRegistrationInfo$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/NetworkRegistrationInfo; HSPLandroid/telephony/NetworkRegistrationInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; -HSPLandroid/telephony/NetworkRegistrationInfo;->(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/telephony/NetworkRegistrationInfo;->(Landroid/os/Parcel;)V HSPLandroid/telephony/NetworkRegistrationInfo;->(Landroid/telephony/NetworkRegistrationInfo;)V HSPLandroid/telephony/NetworkRegistrationInfo;->domainToString(I)Ljava/lang/String; HSPLandroid/telephony/NetworkRegistrationInfo;->getAccessNetworkTechnology()I @@ -14159,7 +14074,7 @@ HSPLandroid/telephony/PhoneNumberUtils;->formatNumberToE164(Ljava/lang/String;Lj HSPLandroid/telephony/PhoneNumberUtils;->getMinMatch()I HSPLandroid/telephony/PhoneNumberUtils;->isDialable(C)Z HSPLandroid/telephony/PhoneNumberUtils;->isNonSeparator(C)Z -HSPLandroid/telephony/PhoneNumberUtils;->normalizeNumber(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/telephony/PhoneNumberUtils;->normalizeNumber(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/telephony/PhoneNumberUtils;->stripSeparators(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda10;->runOrThrow()V HSPLandroid/telephony/PhoneStateListener$IPhoneStateListenerStub$$ExternalSyntheticLambda19;->runOrThrow()V @@ -14191,7 +14106,7 @@ HSPLandroid/telephony/Rlog;->d(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/ServiceState; HSPLandroid/telephony/ServiceState$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/telephony/ServiceState;->()V -HSPLandroid/telephony/ServiceState;->(Landroid/os/Parcel;)V+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/telephony/ServiceState;->(Landroid/os/Parcel;)V HSPLandroid/telephony/ServiceState;->(Landroid/telephony/ServiceState;)V HSPLandroid/telephony/ServiceState;->copyFrom(Landroid/telephony/ServiceState;)V HSPLandroid/telephony/ServiceState;->createLocationInfoSanitizedCopy(Z)Landroid/telephony/ServiceState; @@ -14231,7 +14146,7 @@ HSPLandroid/telephony/SignalStrength;->getCellSignalStrengths(Ljava/lang/Class;) HSPLandroid/telephony/SignalStrength;->getLevel()I HSPLandroid/telephony/SignalStrength;->getPrimary()Landroid/telephony/CellSignalStrength; HSPLandroid/telephony/SignalStrength;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SubscriptionInfo;+]Landroid/os/Parcelable$Creator;Landroid/text/TextUtils$1;]Landroid/telephony/SubscriptionInfo$Builder;Landroid/telephony/SubscriptionInfo$Builder;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/telephony/SubscriptionInfo; HSPLandroid/telephony/SubscriptionInfo$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmAreUiccApplicationsEnabled(Landroid/telephony/SubscriptionInfo$Builder;)Z HSPLandroid/telephony/SubscriptionInfo$Builder;->-$$Nest$fgetmCardId(Landroid/telephony/SubscriptionInfo$Builder;)I @@ -14426,7 +14341,6 @@ HSPLandroid/telephony/TelephonyManager;->getRenouncedPermissions()Ljava/util/Set HSPLandroid/telephony/TelephonyManager;->getServiceState()Landroid/telephony/ServiceState; HSPLandroid/telephony/TelephonyManager;->getServiceState(I)Landroid/telephony/ServiceState; HSPLandroid/telephony/TelephonyManager;->getServiceStateForSubscriber(I)Landroid/telephony/ServiceState; -HSPLandroid/telephony/TelephonyManager;->getServiceStateForSubscriber(IZZ)Landroid/telephony/ServiceState; HSPLandroid/telephony/TelephonyManager;->getSignalStrength()Landroid/telephony/SignalStrength; HSPLandroid/telephony/TelephonyManager;->getSimCarrierId()I HSPLandroid/telephony/TelephonyManager;->getSimCountryIso()Ljava/lang/String; @@ -14608,9 +14522,9 @@ HSPLandroid/text/BoringLayout;->getLineTop(I)I HSPLandroid/text/BoringLayout;->getLineWidth(I)F HSPLandroid/text/BoringLayout;->getParagraphDirection(I)I HSPLandroid/text/BoringLayout;->hasAnyInterestingChars(Ljava/lang/CharSequence;I)Z -HSPLandroid/text/BoringLayout;->init(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZZZ)V+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/text/BoringLayout;->init(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/Layout$Alignment;Landroid/text/BoringLayout$Metrics;ZZZ)V HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics; -HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;ZLandroid/graphics/Paint$FontMetrics;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;+]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Spanned;megamorphic_types]Ljava/lang/CharSequence;megamorphic_types]Landroid/text/TextDirectionHeuristic;Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;,Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal; +HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;ZLandroid/graphics/Paint$FontMetrics;Landroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics;+]Landroid/text/BoringLayout$Metrics;Landroid/text/BoringLayout$Metrics;]Landroid/text/Spanned;Landroid/text/PrecomputedText;,Landroid/text/SpannableString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannedString;,Landroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;]Landroid/text/TextDirectionHeuristic;Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;,Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;]Landroid/text/TextLine;Landroid/text/TextLine;]Ljava/lang/CharSequence;megamorphic_types HSPLandroid/text/BoringLayout;->isBoring(Ljava/lang/CharSequence;Landroid/text/TextPaint;Landroid/text/TextDirectionHeuristic;ZLandroid/text/BoringLayout$Metrics;)Landroid/text/BoringLayout$Metrics; HSPLandroid/text/BoringLayout;->isFallbackLineSpacingEnabled()Z HSPLandroid/text/BoringLayout;->make(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FFLandroid/text/BoringLayout$Metrics;Z)Landroid/text/BoringLayout; @@ -14625,8 +14539,7 @@ HSPLandroid/text/CharSequenceCharacterIterator;->getEndIndex()I HSPLandroid/text/CharSequenceCharacterIterator;->getIndex()I HSPLandroid/text/CharSequenceCharacterIterator;->next()C HSPLandroid/text/CharSequenceCharacterIterator;->setIndex(I)C -HSPLandroid/text/ClientFlags;->icuBidiMigration()Z -HSPLandroid/text/DynamicLayout$Builder;->obtain(Ljava/lang/CharSequence;Landroid/text/TextPaint;I)Landroid/text/DynamicLayout$Builder;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; +HSPLandroid/text/DynamicLayout$Builder;->obtain(Ljava/lang/CharSequence;Landroid/text/TextPaint;I)Landroid/text/DynamicLayout$Builder; HSPLandroid/text/DynamicLayout$ChangeWatcher;->afterTextChanged(Landroid/text/Editable;)V HSPLandroid/text/DynamicLayout$ChangeWatcher;->beforeTextChanged(Ljava/lang/CharSequence;III)V HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V @@ -14634,29 +14547,29 @@ HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanChanged(Landroid/text/Spann HSPLandroid/text/DynamicLayout$ChangeWatcher;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V HSPLandroid/text/DynamicLayout$ChangeWatcher;->onTextChanged(Ljava/lang/CharSequence;III)V HSPLandroid/text/DynamicLayout;->(Landroid/text/DynamicLayout$Builder;)V -HSPLandroid/text/DynamicLayout;->addBlockAtOffset(I)V+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout; -HSPLandroid/text/DynamicLayout;->contentMayProtrudeFromLineTopOrBottom(Ljava/lang/CharSequence;II)Z+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/graphics/Paint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString; +HSPLandroid/text/DynamicLayout;->addBlockAtOffset(I)V +HSPLandroid/text/DynamicLayout;->contentMayProtrudeFromLineTopOrBottom(Ljava/lang/CharSequence;II)Z HSPLandroid/text/DynamicLayout;->createBlocks()V -HSPLandroid/text/DynamicLayout;->generate(Landroid/text/DynamicLayout$Builder;)V+]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Ljava/lang/CharSequence;Landroid/text/method/ReplacementTransformationMethod$SpannedReplacementCharSequence;,Landroid/text/SpannableStringBuilder;]Landroid/text/Spannable;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/DynamicLayout;->generate(Landroid/text/DynamicLayout$Builder;)V HSPLandroid/text/DynamicLayout;->getBlockEndLines()[I HSPLandroid/text/DynamicLayout;->getBlockIndices()[I HSPLandroid/text/DynamicLayout;->getBlocksAlwaysNeedToBeRedrawn()Landroid/util/ArraySet; HSPLandroid/text/DynamicLayout;->getEllipsisCount(I)I HSPLandroid/text/DynamicLayout;->getEllipsisStart(I)I HSPLandroid/text/DynamicLayout;->getEllipsizedWidth()I -HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; +HSPLandroid/text/DynamicLayout;->getEndHyphenEdit(I)I HSPLandroid/text/DynamicLayout;->getIndexFirstChangedBlock()I -HSPLandroid/text/DynamicLayout;->getLineContainsTab(I)Z+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->getLineCount()I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->getLineDescent(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->getLineDirections(I)Landroid/text/Layout$Directions;+]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector; +HSPLandroid/text/DynamicLayout;->getLineContainsTab(I)Z +HSPLandroid/text/DynamicLayout;->getLineCount()I +HSPLandroid/text/DynamicLayout;->getLineDescent(I)I +HSPLandroid/text/DynamicLayout;->getLineDirections(I)Landroid/text/Layout$Directions; HSPLandroid/text/DynamicLayout;->getLineExtra(I)I -HSPLandroid/text/DynamicLayout;->getLineStart(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->getLineTop(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; +HSPLandroid/text/DynamicLayout;->getLineStart(I)I +HSPLandroid/text/DynamicLayout;->getLineTop(I)I HSPLandroid/text/DynamicLayout;->getNumberOfBlocks()I -HSPLandroid/text/DynamicLayout;->getParagraphDirection(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->getStartHyphenEdit(I)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; -HSPLandroid/text/DynamicLayout;->reflow(Ljava/lang/CharSequence;III)V+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector;]Landroid/text/DynamicLayout;Landroid/text/DynamicLayout;]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector;]Landroid/text/StaticLayout;Landroid/text/StaticLayout;]Landroid/text/Spanned;Landroid/text/SpannableString;]Ljava/lang/CharSequence;Landroid/text/SpannableString;]Landroid/text/StaticLayout$Builder;Landroid/text/StaticLayout$Builder; +HSPLandroid/text/DynamicLayout;->getParagraphDirection(I)I +HSPLandroid/text/DynamicLayout;->getStartHyphenEdit(I)I +HSPLandroid/text/DynamicLayout;->reflow(Ljava/lang/CharSequence;III)V HSPLandroid/text/DynamicLayout;->setIndexFirstChangedBlock(I)V HSPLandroid/text/DynamicLayout;->updateAlwaysNeedsToBeRedrawn(I)V HSPLandroid/text/DynamicLayout;->updateBlocks(III)V @@ -14712,9 +14625,9 @@ HSPLandroid/text/Layout;->(Ljava/lang/CharSequence;Landroid/text/TextPaint HSPLandroid/text/Layout;->addSelection(IIIIILandroid/text/Layout$SelectionRectangleConsumer;)V HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;)V HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;Landroid/graphics/Path;Landroid/graphics/Paint;I)V -HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;I)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout; +HSPLandroid/text/Layout;->draw(Landroid/graphics/Canvas;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;I)V HSPLandroid/text/Layout;->drawBackground(Landroid/graphics/Canvas;II)V -HSPLandroid/text/Layout;->drawText(Landroid/graphics/Canvas;II)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Spanned;Landroid/text/SpannableString;]Ljava/lang/CharSequence;Landroid/text/SpannableString; +HSPLandroid/text/Layout;->drawText(Landroid/graphics/Canvas;II)V HSPLandroid/text/Layout;->drawWithoutText(Landroid/graphics/Canvas;Ljava/util/List;Ljava/util/List;Landroid/graphics/Path;Landroid/graphics/Paint;III)V HSPLandroid/text/Layout;->ellipsize(III[CILandroid/text/TextUtils$TruncateAt;)V HSPLandroid/text/Layout;->getCursorPath(ILandroid/graphics/Path;Ljava/lang/CharSequence;)V @@ -14729,27 +14642,27 @@ HSPLandroid/text/Layout;->getIndentAdjust(ILandroid/text/Layout$Alignment;)I HSPLandroid/text/Layout;->getLineBaseline(I)I HSPLandroid/text/Layout;->getLineBottom(I)I HSPLandroid/text/Layout;->getLineBottom(IZ)I -HSPLandroid/text/Layout;->getLineEnd(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout; +HSPLandroid/text/Layout;->getLineEnd(I)I HSPLandroid/text/Layout;->getLineExtent(ILandroid/text/Layout$TabStops;Z)F HSPLandroid/text/Layout;->getLineExtent(IZ)F -HSPLandroid/text/Layout;->getLineForOffset(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout; -HSPLandroid/text/Layout;->getLineForVertical(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout; +HSPLandroid/text/Layout;->getLineForOffset(I)I +HSPLandroid/text/Layout;->getLineForVertical(I)I HSPLandroid/text/Layout;->getLineLeft(I)F HSPLandroid/text/Layout;->getLineMax(I)F -HSPLandroid/text/Layout;->getLineRangeForDraw(Landroid/graphics/Canvas;)J+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/text/Layout;->getLineRangeForDraw(Landroid/graphics/Canvas;)J HSPLandroid/text/Layout;->getLineRight(I)F HSPLandroid/text/Layout;->getLineStartPos(III)I HSPLandroid/text/Layout;->getLineVisibleEnd(I)I HSPLandroid/text/Layout;->getLineWidth(I)F HSPLandroid/text/Layout;->getOffsetAtStartOf(I)I HSPLandroid/text/Layout;->getOffsetForHorizontal(IF)I -HSPLandroid/text/Layout;->getOffsetForHorizontal(IFZ)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/text/TextLine;Landroid/text/TextLine;]Landroid/text/Layout$HorizontalMeasurementProvider;Landroid/text/Layout$HorizontalMeasurementProvider; +HSPLandroid/text/Layout;->getOffsetForHorizontal(IFZ)I HSPLandroid/text/Layout;->getPaint()Landroid/text/TextPaint; -HSPLandroid/text/Layout;->getParagraphAlignment(I)Landroid/text/Layout$Alignment;+]Landroid/text/Layout;Landroid/text/DynamicLayout; -HSPLandroid/text/Layout;->getParagraphLeadingMargin(I)I+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/text/Spanned;missing_types +HSPLandroid/text/Layout;->getParagraphAlignment(I)Landroid/text/Layout$Alignment; +HSPLandroid/text/Layout;->getParagraphLeadingMargin(I)I HSPLandroid/text/Layout;->getParagraphLeft(I)I HSPLandroid/text/Layout;->getParagraphRight(I)I -HSPLandroid/text/Layout;->getParagraphSpans(Landroid/text/Spanned;IILjava/lang/Class;)[Ljava/lang/Object;+]Landroid/text/Spanned;Landroid/text/SpannableString; +HSPLandroid/text/Layout;->getParagraphSpans(Landroid/text/Spanned;IILjava/lang/Class;)[Ljava/lang/Object; HSPLandroid/text/Layout;->getPrimaryHorizontal(I)F HSPLandroid/text/Layout;->getPrimaryHorizontal(IZ)F HSPLandroid/text/Layout;->getSelection(IILandroid/text/Layout$SelectionRectangleConsumer;)V @@ -14768,8 +14681,8 @@ HSPLandroid/text/Layout;->primaryIsTrailingPrevious(I)Z HSPLandroid/text/Layout;->replaceWith(Ljava/lang/CharSequence;Landroid/text/TextPaint;ILandroid/text/Layout$Alignment;FF)V HSPLandroid/text/Layout;->shouldClampCursor(I)Z HSPLandroid/text/MeasuredParagraph;->()V -HSPLandroid/text/MeasuredParagraph;->applyMetricsAffectingSpan(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;[Landroid/text/style/MetricAffectingSpan;[Landroid/text/style/LineBreakConfigSpan;IILandroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreakConfig$Builder;Landroid/graphics/text/LineBreakConfig$Builder;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray;]Landroid/text/style/MetricAffectingSpan;missing_types -HSPLandroid/text/MeasuredParagraph;->applyStyleRun(IILandroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Landroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V+]Landroid/text/AutoGrowArray$FloatArray;Landroid/text/AutoGrowArray$FloatArray;]Landroid/graphics/text/MeasuredText$Builder;Landroid/graphics/text/MeasuredText$Builder;]Landroid/text/AutoGrowArray$ByteArray;Landroid/text/AutoGrowArray$ByteArray;]Landroid/text/TextPaint;Landroid/text/TextPaint; +HSPLandroid/text/MeasuredParagraph;->applyMetricsAffectingSpan(Landroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;[Landroid/text/style/MetricAffectingSpan;[Landroid/text/style/LineBreakConfigSpan;IILandroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V +HSPLandroid/text/MeasuredParagraph;->applyStyleRun(IILandroid/text/TextPaint;Landroid/graphics/text/LineBreakConfig;Landroid/graphics/text/MeasuredText$Builder;Landroid/text/MeasuredParagraph$StyleRunCallback;)V+]Landroid/text/AutoGrowArray$ByteArray;Landroid/text/AutoGrowArray$ByteArray;]Landroid/text/AutoGrowArray$FloatArray;Landroid/text/AutoGrowArray$FloatArray;]Landroid/text/TextPaint;Landroid/text/TextPaint; HSPLandroid/text/MeasuredParagraph;->breakText(IZF)I HSPLandroid/text/MeasuredParagraph;->buildForBidi(Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph; HSPLandroid/text/MeasuredParagraph;->buildForMeasurement(Landroid/text/TextPaint;Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;Landroid/text/MeasuredParagraph;)Landroid/text/MeasuredParagraph; @@ -14788,9 +14701,9 @@ HSPLandroid/text/MeasuredParagraph;->reset()V HSPLandroid/text/MeasuredParagraph;->resetAndAnalyzeBidi(Ljava/lang/CharSequence;IILandroid/text/TextDirectionHeuristic;)V HSPLandroid/text/PackedIntVector;->adjustValuesBelow(III)V HSPLandroid/text/PackedIntVector;->deleteAt(II)V -HSPLandroid/text/PackedIntVector;->getValue(II)I+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; +HSPLandroid/text/PackedIntVector;->getValue(II)I HSPLandroid/text/PackedIntVector;->growBuffer()V -HSPLandroid/text/PackedIntVector;->insertAt(I[I)V+]Landroid/text/PackedIntVector;Landroid/text/PackedIntVector; +HSPLandroid/text/PackedIntVector;->insertAt(I[I)V HSPLandroid/text/PackedIntVector;->moveRowGapTo(I)V HSPLandroid/text/PackedIntVector;->moveValueGapTo(II)V HSPLandroid/text/PackedIntVector;->size()I @@ -14798,7 +14711,7 @@ HSPLandroid/text/PackedIntVector;->width()I HSPLandroid/text/PackedObjectVector;->deleteAt(II)V HSPLandroid/text/PackedObjectVector;->getValue(II)Ljava/lang/Object; HSPLandroid/text/PackedObjectVector;->growBuffer()V -HSPLandroid/text/PackedObjectVector;->insertAt(I[Ljava/lang/Object;)V+]Landroid/text/PackedObjectVector;Landroid/text/PackedObjectVector; +HSPLandroid/text/PackedObjectVector;->insertAt(I[Ljava/lang/Object;)V HSPLandroid/text/PackedObjectVector;->moveRowGapTo(I)V HSPLandroid/text/PackedObjectVector;->setValue(IILjava/lang/Object;)V HSPLandroid/text/PackedObjectVector;->size()I @@ -14809,7 +14722,7 @@ HSPLandroid/text/PrecomputedText$Params;->getHyphenationFrequency()I HSPLandroid/text/PrecomputedText$Params;->getTextDirection()Landroid/text/TextDirectionHeuristic; HSPLandroid/text/PrecomputedText$Params;->getTextPaint()Landroid/text/TextPaint; HSPLandroid/text/Selection;->getSelectionEnd(Ljava/lang/CharSequence;)I -HSPLandroid/text/Selection;->getSelectionStart(Ljava/lang/CharSequence;)I+]Landroid/text/Spanned;missing_types +HSPLandroid/text/Selection;->getSelectionStart(Ljava/lang/CharSequence;)I HSPLandroid/text/Selection;->removeMemory(Landroid/text/Spannable;)V HSPLandroid/text/Selection;->removeSelection(Landroid/text/Spannable;)V HSPLandroid/text/Selection;->setSelection(Landroid/text/Spannable;I)V @@ -14819,7 +14732,7 @@ HSPLandroid/text/Selection;->updateMemory(Landroid/text/Spannable;I)V HSPLandroid/text/SpanSet;->(Ljava/lang/Class;)V HSPLandroid/text/SpanSet;->getNextTransition(II)I HSPLandroid/text/SpanSet;->hasSpansIntersecting(II)Z -HSPLandroid/text/SpanSet;->init(Landroid/text/Spanned;II)V+]Landroid/text/Spanned;Landroid/text/SpannableString; +HSPLandroid/text/SpanSet;->init(Landroid/text/Spanned;II)V HSPLandroid/text/SpanSet;->recycle()V HSPLandroid/text/Spannable$Factory;->getInstance()Landroid/text/Spannable$Factory; HSPLandroid/text/Spannable$Factory;->newSpannable(Ljava/lang/CharSequence;)Landroid/text/Spannable; @@ -14837,32 +14750,32 @@ HSPLandroid/text/SpannableString;->setSpan(Ljava/lang/Object;III)V HSPLandroid/text/SpannableString;->subSequence(II)Ljava/lang/CharSequence; HSPLandroid/text/SpannableString;->valueOf(Ljava/lang/CharSequence;)Landroid/text/SpannableString; HSPLandroid/text/SpannableStringBuilder;->()V -HSPLandroid/text/SpannableStringBuilder;->(Ljava/lang/CharSequence;)V+]Ljava/lang/CharSequence;missing_types +HSPLandroid/text/SpannableStringBuilder;->(Ljava/lang/CharSequence;)V HSPLandroid/text/SpannableStringBuilder;->(Ljava/lang/CharSequence;II)V HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/Editable; HSPLandroid/text/SpannableStringBuilder;->append(C)Landroid/text/SpannableStringBuilder; HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/Editable; -HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder;+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;)Landroid/text/SpannableStringBuilder; HSPLandroid/text/SpannableStringBuilder;->append(Ljava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder; HSPLandroid/text/SpannableStringBuilder;->calcMax(I)I -HSPLandroid/text/SpannableStringBuilder;->change(IILjava/lang/CharSequence;II)V+]Landroid/text/Spanned;Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringBuilder;->change(IILjava/lang/CharSequence;II)V HSPLandroid/text/SpannableStringBuilder;->charAt(I)C -HSPLandroid/text/SpannableStringBuilder;->checkRange(Ljava/lang/String;II)V+]Landroid/text/SpannableStringBuilder;missing_types +HSPLandroid/text/SpannableStringBuilder;->checkRange(Ljava/lang/String;II)V HSPLandroid/text/SpannableStringBuilder;->checkSortBuffer([II)[I HSPLandroid/text/SpannableStringBuilder;->clear()V HSPLandroid/text/SpannableStringBuilder;->compareSpans(II[I[I)I -HSPLandroid/text/SpannableStringBuilder;->countSpans(IILjava/lang/Class;I)I+]Ljava/lang/Class;Ljava/lang/Class; +HSPLandroid/text/SpannableStringBuilder;->countSpans(IILjava/lang/Class;I)I HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/Editable; HSPLandroid/text/SpannableStringBuilder;->delete(II)Landroid/text/SpannableStringBuilder; HSPLandroid/text/SpannableStringBuilder;->drawTextRun(Landroid/graphics/BaseCanvas;IIIIFFZLandroid/graphics/Paint;)V HSPLandroid/text/SpannableStringBuilder;->equals(Ljava/lang/Object;)Z HSPLandroid/text/SpannableStringBuilder;->getChars(II[CI)V -HSPLandroid/text/SpannableStringBuilder;->getSpanEnd(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap; -HSPLandroid/text/SpannableStringBuilder;->getSpanFlags(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap; -HSPLandroid/text/SpannableStringBuilder;->getSpanStart(Ljava/lang/Object;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap; -HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;+]Landroid/text/SpannableStringBuilder;missing_types +HSPLandroid/text/SpannableStringBuilder;->getSpanEnd(Ljava/lang/Object;)I +HSPLandroid/text/SpannableStringBuilder;->getSpanFlags(Ljava/lang/Object;)I +HSPLandroid/text/SpannableStringBuilder;->getSpanStart(Ljava/lang/Object;)I +HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object; HSPLandroid/text/SpannableStringBuilder;->getSpans(IILjava/lang/Class;Z)[Ljava/lang/Object; -HSPLandroid/text/SpannableStringBuilder;->getSpansRec(IILjava/lang/Class;I[Ljava/lang/Object;[I[IIZ)I+]Ljava/lang/Class;Ljava/lang/Class; +HSPLandroid/text/SpannableStringBuilder;->getSpansRec(IILjava/lang/Class;I[Ljava/lang/Object;[I[IIZ)I HSPLandroid/text/SpannableStringBuilder;->getTextWatcherDepth()I HSPLandroid/text/SpannableStringBuilder;->hasNonExclusiveExclusiveSpanAt(Ljava/lang/CharSequence;I)Z HSPLandroid/text/SpannableStringBuilder;->insert(ILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder; @@ -14881,48 +14794,48 @@ HSPLandroid/text/SpannableStringBuilder;->removeSpan(Ljava/lang/Object;I)V HSPLandroid/text/SpannableStringBuilder;->removeSpansForChange(IIZI)Z HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/Editable; HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;)Landroid/text/SpannableStringBuilder; -HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder;+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringBuilder;->replace(IILjava/lang/CharSequence;II)Landroid/text/SpannableStringBuilder; HSPLandroid/text/SpannableStringBuilder;->resizeFor(I)V HSPLandroid/text/SpannableStringBuilder;->resolveGap(I)I -HSPLandroid/text/SpannableStringBuilder;->restoreInvariants()V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap; +HSPLandroid/text/SpannableStringBuilder;->restoreInvariants()V HSPLandroid/text/SpannableStringBuilder;->rightChild(I)I HSPLandroid/text/SpannableStringBuilder;->sendAfterTextChanged([Landroid/text/TextWatcher;)V HSPLandroid/text/SpannableStringBuilder;->sendBeforeTextChanged([Landroid/text/TextWatcher;III)V -HSPLandroid/text/SpannableStringBuilder;->sendSpanAdded(Ljava/lang/Object;II)V+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringBuilder;->sendSpanAdded(Ljava/lang/Object;II)V HSPLandroid/text/SpannableStringBuilder;->sendSpanChanged(Ljava/lang/Object;IIII)V HSPLandroid/text/SpannableStringBuilder;->sendSpanRemoved(Ljava/lang/Object;II)V HSPLandroid/text/SpannableStringBuilder;->sendTextChanged([Landroid/text/TextWatcher;III)V HSPLandroid/text/SpannableStringBuilder;->sendToSpanWatchers(III)V HSPLandroid/text/SpannableStringBuilder;->setFilters([Landroid/text/InputFilter;)V HSPLandroid/text/SpannableStringBuilder;->setSpan(Ljava/lang/Object;III)V -HSPLandroid/text/SpannableStringBuilder;->setSpan(ZLjava/lang/Object;IIIZ)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/IdentityHashMap;Ljava/util/IdentityHashMap; +HSPLandroid/text/SpannableStringBuilder;->setSpan(ZLjava/lang/Object;IIIZ)V HSPLandroid/text/SpannableStringBuilder;->siftDown(I[Ljava/lang/Object;I[I[I)V HSPLandroid/text/SpannableStringBuilder;->sort([Ljava/lang/Object;[I[I)V HSPLandroid/text/SpannableStringBuilder;->subSequence(II)Ljava/lang/CharSequence; -HSPLandroid/text/SpannableStringBuilder;->toString()Ljava/lang/String;+]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringBuilder;->toString()Ljava/lang/String; HSPLandroid/text/SpannableStringBuilder;->treeRoot()I HSPLandroid/text/SpannableStringBuilder;->updatedIntervalBound(IIIIZZ)I -HSPLandroid/text/SpannableStringInternal;->(Ljava/lang/CharSequence;IIZ)V+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannedString;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString; -HSPLandroid/text/SpannableStringInternal;->charAt(I)C+]Ljava/lang/String;Ljava/lang/String; -HSPLandroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V+]Landroid/text/SpannableStringInternal;Landroid/text/SpannedString;,Landroid/text/SpannableString; -HSPLandroid/text/SpannableStringInternal;->copySpansFromInternal(Landroid/text/SpannableStringInternal;IIZ)V+]Landroid/text/SpannableStringInternal;Landroid/text/SpannedString;,Landroid/text/SpannableString; -HSPLandroid/text/SpannableStringInternal;->copySpansFromSpanned(Landroid/text/Spanned;IIZ)V+]Landroid/text/Spanned;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannableStringInternal;->(Ljava/lang/CharSequence;IIZ)V +HSPLandroid/text/SpannableStringInternal;->charAt(I)C +HSPLandroid/text/SpannableStringInternal;->checkRange(Ljava/lang/String;II)V +HSPLandroid/text/SpannableStringInternal;->copySpansFromInternal(Landroid/text/SpannableStringInternal;IIZ)V +HSPLandroid/text/SpannableStringInternal;->copySpansFromSpanned(Landroid/text/Spanned;IIZ)V HSPLandroid/text/SpannableStringInternal;->equals(Ljava/lang/Object;)Z -HSPLandroid/text/SpannableStringInternal;->getChars(II[CI)V+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/text/SpannableStringInternal;->getChars(II[CI)V HSPLandroid/text/SpannableStringInternal;->getSpanEnd(Ljava/lang/Object;)I HSPLandroid/text/SpannableStringInternal;->getSpanFlags(Ljava/lang/Object;)I HSPLandroid/text/SpannableStringInternal;->getSpanStart(Ljava/lang/Object;)I -HSPLandroid/text/SpannableStringInternal;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object;+]Ljava/lang/Class;Ljava/lang/Class;]Landroid/text/SpannableStringInternal;Landroid/text/SpannableString; -HSPLandroid/text/SpannableStringInternal;->length()I+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/text/SpannableStringInternal;->getSpans(IILjava/lang/Class;)[Ljava/lang/Object; +HSPLandroid/text/SpannableStringInternal;->length()I HSPLandroid/text/SpannableStringInternal;->nextSpanTransition(IILjava/lang/Class;)I HSPLandroid/text/SpannableStringInternal;->removeSpan(Ljava/lang/Object;I)V -HSPLandroid/text/SpannableStringInternal;->sendSpanAdded(Ljava/lang/Object;II)V+]Landroid/text/SpanWatcher;Landroid/text/DynamicLayout$ChangeWatcher;,Landroid/widget/Editor$SpanController;,Landroid/widget/TextView$ChangeWatcher;]Landroid/text/SpannableStringInternal;Landroid/text/SpannableString; +HSPLandroid/text/SpannableStringInternal;->sendSpanAdded(Ljava/lang/Object;II)V HSPLandroid/text/SpannableStringInternal;->sendSpanChanged(Ljava/lang/Object;IIII)V HSPLandroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;III)V HSPLandroid/text/SpannableStringInternal;->setSpan(Ljava/lang/Object;IIIZ)V HSPLandroid/text/SpannableStringInternal;->toString()Ljava/lang/String; HSPLandroid/text/SpannedString;->(Ljava/lang/CharSequence;)V -HSPLandroid/text/SpannedString;->(Ljava/lang/CharSequence;Z)V+]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannableStringBuilder; +HSPLandroid/text/SpannedString;->(Ljava/lang/CharSequence;Z)V HSPLandroid/text/SpannedString;->equals(Ljava/lang/Object;)Z HSPLandroid/text/SpannedString;->getSpanEnd(Ljava/lang/Object;)I HSPLandroid/text/SpannedString;->getSpanFlags(Ljava/lang/Object;)I @@ -14967,7 +14880,7 @@ HSPLandroid/text/StaticLayout$Builder;->setTextDirection(Landroid/text/TextDirec HSPLandroid/text/StaticLayout$Builder;->setUseLineSpacingFromFallbacks(Z)Landroid/text/StaticLayout$Builder; HSPLandroid/text/StaticLayout;->(Landroid/text/StaticLayout$Builder;ZI)V+]Landroid/text/StaticLayout;Landroid/text/StaticLayout; HSPLandroid/text/StaticLayout;->calculateEllipsis(IILandroid/text/MeasuredParagraph;IFLandroid/text/TextUtils$TruncateAt;IFLandroid/text/TextPaint;Z)V -HSPLandroid/text/StaticLayout;->generate(Landroid/text/StaticLayout$Builder;ZZ)V+]Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;]Landroid/graphics/text/LineBreaker$Builder;Landroid/graphics/text/LineBreaker$Builder;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/text/LineBreaker;Landroid/graphics/text/LineBreaker;]Ljava/lang/CharSequence;Landroid/text/SpannableString;]Landroid/graphics/text/LineBreaker$ParagraphConstraints;Landroid/graphics/text/LineBreaker$ParagraphConstraints;]Landroid/graphics/text/LineBreaker$Result;Landroid/graphics/text/LineBreaker$Result;]Landroid/text/AutoGrowArray$IntArray;Landroid/text/AutoGrowArray$IntArray; +HSPLandroid/text/StaticLayout;->generate(Landroid/text/StaticLayout$Builder;ZZ)V HSPLandroid/text/StaticLayout;->getBottomPadding()I HSPLandroid/text/StaticLayout;->getEllipsisCount(I)I HSPLandroid/text/StaticLayout;->getEllipsisStart(I)I @@ -14977,7 +14890,7 @@ HSPLandroid/text/StaticLayout;->getIndentAdjust(ILandroid/text/Layout$Alignment; HSPLandroid/text/StaticLayout;->getLineContainsTab(I)Z HSPLandroid/text/StaticLayout;->getLineCount()I HSPLandroid/text/StaticLayout;->getLineDescent(I)I -HSPLandroid/text/StaticLayout;->getLineDirections(I)Landroid/text/Layout$Directions;+]Landroid/text/StaticLayout;Landroid/text/StaticLayout; +HSPLandroid/text/StaticLayout;->getLineDirections(I)Landroid/text/Layout$Directions; HSPLandroid/text/StaticLayout;->getLineExtra(I)I HSPLandroid/text/StaticLayout;->getLineForVertical(I)I HSPLandroid/text/StaticLayout;->getLineStart(I)I @@ -14986,7 +14899,7 @@ HSPLandroid/text/StaticLayout;->getParagraphDirection(I)I HSPLandroid/text/StaticLayout;->getStartHyphenEdit(I)I HSPLandroid/text/StaticLayout;->getTopPadding()I HSPLandroid/text/StaticLayout;->getTotalInsets(I)F -HSPLandroid/text/StaticLayout;->out(Ljava/lang/CharSequence;IIIIIIIFF[Landroid/text/style/LineHeightSpan;[ILandroid/graphics/Paint$FontMetricsInt;ZIZLandroid/text/MeasuredParagraph;IZZZ[CILandroid/text/TextUtils$TruncateAt;FFLandroid/text/TextPaint;Z)I+]Landroid/text/MeasuredParagraph;Landroid/text/MeasuredParagraph;]Ljava/lang/CharSequence;Landroid/text/SpannableString; +HSPLandroid/text/StaticLayout;->out(Ljava/lang/CharSequence;IIIIIIIFF[Landroid/text/style/LineHeightSpan;[ILandroid/graphics/Paint$FontMetricsInt;ZIZLandroid/text/MeasuredParagraph;IZZZ[CILandroid/text/TextUtils$TruncateAt;FFLandroid/text/TextPaint;Z)I HSPLandroid/text/StaticLayout;->packHyphenEdit(II)I HSPLandroid/text/StaticLayout;->unpackEndHyphenEdit(I)I HSPLandroid/text/StaticLayout;->unpackStartHyphenEdit(I)I @@ -14997,7 +14910,7 @@ HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicImpl;->isRtl([CII HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal;->defaultIsRtl()Z HSPLandroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale;->defaultIsRtl()Z HSPLandroid/text/TextDirectionHeuristics;->isRtlCodePoint(I)I -HSPLandroid/text/TextFlags;->getKeyForFlag(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLandroid/text/TextFlags;->getKeyForFlag(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/text/TextFlags;->isFeatureEnabled(Ljava/lang/String;)Z HSPLandroid/text/TextLine$DecorationInfo;->()V HSPLandroid/text/TextLine$DecorationInfo;->copyInfo()Landroid/text/TextLine$DecorationInfo; @@ -15005,24 +14918,24 @@ HSPLandroid/text/TextLine$DecorationInfo;->hasDecoration()Z HSPLandroid/text/TextLine;->()V HSPLandroid/text/TextLine;->adjustEndHyphenEdit(II)I HSPLandroid/text/TextLine;->adjustStartHyphenEdit(II)I -HSPLandroid/text/TextLine;->draw(Landroid/graphics/Canvas;FIII)V+]Landroid/text/Layout$Directions;Landroid/text/Layout$Directions; +HSPLandroid/text/TextLine;->draw(Landroid/graphics/Canvas;FIII)V HSPLandroid/text/TextLine;->drawStroke(Landroid/text/TextPaint;Landroid/graphics/Canvas;IFFFFF)V -HSPLandroid/text/TextLine;->drawTextRun(Landroid/graphics/Canvas;Landroid/text/TextPaint;IIIIZFI)V+]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/text/TextLine;->drawTextRun(Landroid/graphics/Canvas;Landroid/text/TextPaint;IIIIZFI)V HSPLandroid/text/TextLine;->equalAttributes(Landroid/text/TextPaint;Landroid/text/TextPaint;)Z HSPLandroid/text/TextLine;->expandMetricsFromPaint(Landroid/graphics/Paint$FontMetricsInt;Landroid/text/TextPaint;)V -HSPLandroid/text/TextLine;->expandMetricsFromPaint(Landroid/text/TextPaint;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint; -HSPLandroid/text/TextLine;->extractDecorationInfo(Landroid/text/TextPaint;Landroid/text/TextLine$DecorationInfo;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint; -HSPLandroid/text/TextLine;->getOffsetBeforeAfter(IIIZIZ)I+]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString; +HSPLandroid/text/TextLine;->expandMetricsFromPaint(Landroid/text/TextPaint;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V +HSPLandroid/text/TextLine;->extractDecorationInfo(Landroid/text/TextPaint;Landroid/text/TextLine$DecorationInfo;)V +HSPLandroid/text/TextLine;->getOffsetBeforeAfter(IIIZIZ)I HSPLandroid/text/TextLine;->getOffsetToLeftRightOf(IZ)I HSPLandroid/text/TextLine;->getRunAdvance(Landroid/text/TextPaint;IIIIZI[FILandroid/graphics/RectF;Landroid/text/TextLine$LineInfo;)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/PrecomputedText;Landroid/text/PrecomputedText;]Landroid/text/TextPaint;Landroid/text/TextPaint; HSPLandroid/text/TextLine;->handleReplacement(Landroid/text/style/ReplacementSpan;Landroid/text/TextPaint;IIZLandroid/graphics/Canvas;FIIILandroid/graphics/Paint$FontMetricsInt;Z)F -HSPLandroid/text/TextLine;->handleRun(IIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Z[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/style/MetricAffectingSpan;megamorphic_types]Landroid/text/style/CharacterStyle;megamorphic_types]Landroid/text/TextPaint;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/text/TextLine$DecorationInfo;Landroid/text/TextLine$DecorationInfo;]Landroid/text/SpanSet;Landroid/text/SpanSet; -HSPLandroid/text/TextLine;->handleText(Landroid/text/TextPaint;IIIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;ZILjava/util/ArrayList;[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;,Landroid/graphics/Canvas;,Landroid/view/Surface$CompatibleCanvas; +HSPLandroid/text/TextLine;->handleRun(IIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Z[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/SpanSet;Landroid/text/SpanSet;]Landroid/text/TextPaint;missing_types]Landroid/text/style/CharacterStyle;missing_types]Landroid/text/style/MetricAffectingSpan;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/text/TextLine;->handleText(Landroid/text/TextPaint;IIIIZLandroid/graphics/Canvas;Landroid/text/TextShaper$GlyphsConsumer;FIIILandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;ZILjava/util/ArrayList;[FILandroid/text/TextLine$LineInfo;I)F+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLandroid/text/TextLine;->isLineEndSpace(C)Z -HSPLandroid/text/TextLine;->measure(IZLandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Landroid/text/TextLine$LineInfo;)F+]Landroid/text/Layout$Directions;Landroid/text/Layout$Directions;]Landroid/text/TextLine;Landroid/text/TextLine; +HSPLandroid/text/TextLine;->measure(IZLandroid/graphics/Paint$FontMetricsInt;Landroid/graphics/RectF;Landroid/text/TextLine$LineInfo;)F+]Landroid/text/Layout$Directions;Landroid/text/Layout$Directions; HSPLandroid/text/TextLine;->obtain()Landroid/text/TextLine; -HSPLandroid/text/TextLine;->recycle(Landroid/text/TextLine;)Landroid/text/TextLine;+]Landroid/text/SpanSet;Landroid/text/SpanSet; -HSPLandroid/text/TextLine;->set(Landroid/text/TextPaint;Ljava/lang/CharSequence;IIILandroid/text/Layout$Directions;ZLandroid/text/Layout$TabStops;IIZ)V+]Landroid/text/SpanSet;Landroid/text/SpanSet; +HSPLandroid/text/TextLine;->recycle(Landroid/text/TextLine;)Landroid/text/TextLine; +HSPLandroid/text/TextLine;->set(Landroid/text/TextPaint;Ljava/lang/CharSequence;IIILandroid/text/Layout$Directions;ZLandroid/text/Layout$TabStops;IIZ)V HSPLandroid/text/TextLine;->updateMetrics(Landroid/graphics/Paint$FontMetricsInt;IIIII)V HSPLandroid/text/TextPaint;->()V HSPLandroid/text/TextPaint;->(I)V @@ -15030,8 +14943,8 @@ HSPLandroid/text/TextPaint;->(Landroid/graphics/Paint;)V HSPLandroid/text/TextPaint;->getUnderlineThickness()F HSPLandroid/text/TextPaint;->set(Landroid/text/TextPaint;)V HSPLandroid/text/TextPaint;->setUnderlineText(IF)V -HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/CharSequence;+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/text/TextUtils$1;Landroid/text/TextUtils$1; +HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/CharSequence; +HSPLandroid/text/TextUtils$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/text/TextUtils$SimpleStringSplitter;->(C)V HSPLandroid/text/TextUtils$SimpleStringSplitter;->hasNext()Z HSPLandroid/text/TextUtils$SimpleStringSplitter;->iterator()Ljava/util/Iterator; @@ -15039,7 +14952,7 @@ HSPLandroid/text/TextUtils$SimpleStringSplitter;->next()Ljava/lang/Object; HSPLandroid/text/TextUtils$SimpleStringSplitter;->next()Ljava/lang/String; HSPLandroid/text/TextUtils$SimpleStringSplitter;->setString(Ljava/lang/String;)V HSPLandroid/text/TextUtils$StringWithRemovedChars;->toString()Ljava/lang/String; -HSPLandroid/text/TextUtils;->concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/text/SpannableStringBuilder;Landroid/text/SpannableStringBuilder; +HSPLandroid/text/TextUtils;->concat([Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->copySpansFrom(Landroid/text/Spanned;IILjava/lang/Class;Landroid/text/Spannable;I)V HSPLandroid/text/TextUtils;->couldAffectRtl(C)Z HSPLandroid/text/TextUtils;->doesNotNeedBidi([CII)Z @@ -15047,23 +14960,23 @@ HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/Tex HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->ellipsize(Ljava/lang/CharSequence;Landroid/text/TextPaint;FLandroid/text/TextUtils$TruncateAt;ZLandroid/text/TextUtils$EllipsizeCallback;Landroid/text/TextDirectionHeuristic;Ljava/lang/String;)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->emptyIfNull(Ljava/lang/String;)Ljava/lang/String; -HSPLandroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z+]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z HSPLandroid/text/TextUtils;->expandTemplate(Ljava/lang/CharSequence;[Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLandroid/text/TextUtils;->formatSimple(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Boolean;Ljava/lang/Boolean; +HSPLandroid/text/TextUtils;->formatSimple(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; HSPLandroid/text/TextUtils;->getCapsMode(Ljava/lang/CharSequence;II)I -HSPLandroid/text/TextUtils;->getChars(Ljava/lang/CharSequence;II[CI)V+]Ljava/lang/Object;Landroid/text/SpannableString;]Landroid/text/GetChars;Landroid/text/SpannableString; +HSPLandroid/text/TextUtils;->getChars(Ljava/lang/CharSequence;II[CI)V HSPLandroid/text/TextUtils;->getEllipsisString(Landroid/text/TextUtils$TruncateAt;)Ljava/lang/String; HSPLandroid/text/TextUtils;->getLayoutDirectionFromLocale(Ljava/util/Locale;)I HSPLandroid/text/TextUtils;->getTrimmedLength(Ljava/lang/CharSequence;)I HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;C)I HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CI)I -HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CII)I+]Ljava/lang/Object;Landroid/text/SpannableString; +HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;CII)I HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)I HSPLandroid/text/TextUtils;->indexOf(Ljava/lang/CharSequence;Ljava/lang/CharSequence;II)I HSPLandroid/text/TextUtils;->isDigitsOnly(Ljava/lang/CharSequence;)Z -HSPLandroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLandroid/text/TextUtils;->isEmpty(Ljava/lang/CharSequence;)Z HSPLandroid/text/TextUtils;->isGraphic(Ljava/lang/CharSequence;)Z -HSPLandroid/text/TextUtils;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/lang/Iterable;missing_types]Ljava/util/Iterator;missing_types +HSPLandroid/text/TextUtils;->join(Ljava/lang/CharSequence;Ljava/lang/Iterable;)Ljava/lang/String; HSPLandroid/text/TextUtils;->join(Ljava/lang/CharSequence;[Ljava/lang/Object;)Ljava/lang/String; HSPLandroid/text/TextUtils;->lastIndexOf(Ljava/lang/CharSequence;CI)I HSPLandroid/text/TextUtils;->lastIndexOf(Ljava/lang/CharSequence;CII)I @@ -15076,14 +14989,14 @@ HSPLandroid/text/TextUtils;->removeEmptySpans([Ljava/lang/Object;Landroid/text/S HSPLandroid/text/TextUtils;->safeIntern(Ljava/lang/String;)Ljava/lang/String; HSPLandroid/text/TextUtils;->split(Ljava/lang/String;Ljava/lang/String;)[Ljava/lang/String; HSPLandroid/text/TextUtils;->stringOrSpannedString(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; -HSPLandroid/text/TextUtils;->substring(Ljava/lang/CharSequence;II)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLandroid/text/TextUtils;->substring(Ljava/lang/CharSequence;II)Ljava/lang/String; HSPLandroid/text/TextUtils;->toUpperCase(Ljava/util/Locale;Ljava/lang/CharSequence;Z)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->trimNoCopySpans(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->trimToParcelableSize(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->trimToSize(Ljava/lang/CharSequence;I)Ljava/lang/CharSequence; HSPLandroid/text/TextUtils;->unpackRangeEndFromLong(J)I HSPLandroid/text/TextUtils;->unpackRangeStartFromLong(J)I -HSPLandroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V+]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/text/TextUtils;->writeToParcel(Ljava/lang/CharSequence;Landroid/os/Parcel;I)V HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;J)Ljava/lang/CharSequence; HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Calendar;)Ljava/lang/CharSequence; HSPLandroid/text/format/DateFormat;->format(Ljava/lang/CharSequence;Ljava/util/Date;)Ljava/lang/CharSequence; @@ -15190,7 +15103,7 @@ HSPLandroid/text/method/TextKeyListener;->onSpanAdded(Landroid/text/Spannable;Lj HSPLandroid/text/method/TextKeyListener;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V HSPLandroid/text/method/TextKeyListener;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V HSPLandroid/text/method/TextKeyListener;->updatePrefs(Landroid/content/ContentResolver;)V -HSPLandroid/text/method/Touch;->onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z+]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/text/Spannable;Landroid/text/SpannableString;]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/text/method/Touch;->onTouchEvent(Landroid/widget/TextView;Landroid/text/Spannable;Landroid/view/MotionEvent;)Z HSPLandroid/text/method/WordIterator;->(Ljava/util/Locale;)V HSPLandroid/text/method/WordIterator;->checkOffsetIsValid(I)V HSPLandroid/text/method/WordIterator;->following(I)I @@ -15209,7 +15122,7 @@ HSPLandroid/text/style/ClickableSpan;->updateDrawState(Landroid/text/TextPaint;) HSPLandroid/text/style/DynamicDrawableSpan;->(I)V HSPLandroid/text/style/ForegroundColorSpan;->(I)V HSPLandroid/text/style/ForegroundColorSpan;->getSpanTypeIdInternal()I -HSPLandroid/text/style/ForegroundColorSpan;->updateDrawState(Landroid/text/TextPaint;)V+]Landroid/text/TextPaint;Landroid/text/TextPaint; +HSPLandroid/text/style/ForegroundColorSpan;->updateDrawState(Landroid/text/TextPaint;)V HSPLandroid/text/style/ForegroundColorSpan;->writeToParcelInternal(Landroid/os/Parcel;I)V HSPLandroid/text/style/ImageSpan;->(Landroid/graphics/drawable/Drawable;I)V HSPLandroid/text/style/ImageSpan;->getDrawable()Landroid/graphics/drawable/Drawable; @@ -15275,7 +15188,7 @@ HSPLandroid/transition/Transition$2;->onAnimationEnd(Landroid/animation/Animator HSPLandroid/transition/Transition$2;->onAnimationStart(Landroid/animation/Animator;)V HSPLandroid/transition/Transition$3;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/transition/Transition;->()V -HSPLandroid/transition/Transition;->(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Ljava/lang/Object;megamorphic_types]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Ljava/lang/Class;Ljava/lang/Class; +HSPLandroid/transition/Transition;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/transition/Transition;->addListener(Landroid/transition/Transition$TransitionListener;)Landroid/transition/Transition; HSPLandroid/transition/Transition;->addTarget(Landroid/view/View;)Landroid/transition/Transition; HSPLandroid/transition/Transition;->addUnmatched(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V @@ -15369,7 +15282,7 @@ HSPLandroid/util/ArrayMap;->(I)V HSPLandroid/util/ArrayMap;->(IZ)V HSPLandroid/util/ArrayMap;->(Landroid/util/ArrayMap;)V HSPLandroid/util/ArrayMap;->allocArrays(I)V -HSPLandroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Object;Ljava/lang/String; +HSPLandroid/util/ArrayMap;->append(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/util/ArrayMap;->binarySearchHashes([III)I HSPLandroid/util/ArrayMap;->clear()V HSPLandroid/util/ArrayMap;->containsKey(Ljava/lang/Object;)Z @@ -15378,18 +15291,18 @@ HSPLandroid/util/ArrayMap;->ensureCapacity(I)V HSPLandroid/util/ArrayMap;->entrySet()Ljava/util/Set; HSPLandroid/util/ArrayMap;->equals(Ljava/lang/Object;)Z HSPLandroid/util/ArrayMap;->freeArrays([I[Ljava/lang/Object;I)V -HSPLandroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/util/ArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/ArrayMap;->getCollection()Landroid/util/MapCollections; HSPLandroid/util/ArrayMap;->hashCode()I -HSPLandroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I+]Ljava/lang/Object;megamorphic_types -HSPLandroid/util/ArrayMap;->indexOfKey(Ljava/lang/Object;)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;megamorphic_types +HSPLandroid/util/ArrayMap;->indexOf(Ljava/lang/Object;I)I +HSPLandroid/util/ArrayMap;->indexOfKey(Ljava/lang/Object;)I HSPLandroid/util/ArrayMap;->indexOfNull()I HSPLandroid/util/ArrayMap;->indexOfValue(Ljava/lang/Object;)I HSPLandroid/util/ArrayMap;->isEmpty()Z HSPLandroid/util/ArrayMap;->keyAt(I)Ljava/lang/Object; -HSPLandroid/util/ArrayMap;->keySet()Ljava/util/Set;+]Landroid/util/MapCollections;Landroid/util/ArrayMap$1; -HSPLandroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Object;megamorphic_types -HSPLandroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/util/ArrayMap;->keySet()Ljava/util/Set; +HSPLandroid/util/ArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLandroid/util/ArrayMap;->putAll(Landroid/util/ArrayMap;)V HSPLandroid/util/ArrayMap;->putAll(Ljava/util/Map;)V HSPLandroid/util/ArrayMap;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/ArrayMap;->removeAt(I)Ljava/lang/Object; @@ -15410,11 +15323,11 @@ HSPLandroid/util/ArraySet;->(IZ)V HSPLandroid/util/ArraySet;->(Landroid/util/ArraySet;)V HSPLandroid/util/ArraySet;->(Ljava/util/Collection;)V HSPLandroid/util/ArraySet;->([Ljava/lang/Object;)V -HSPLandroid/util/ArraySet;->add(Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/String;,Landroid/accounts/Account;,Landroid/window/SurfaceSyncGroup$2;,Landroid/net/UidRange; +HSPLandroid/util/ArraySet;->add(Ljava/lang/Object;)Z HSPLandroid/util/ArraySet;->addAll(Landroid/util/ArraySet;)V HSPLandroid/util/ArraySet;->addAll(Ljava/util/Collection;)Z HSPLandroid/util/ArraySet;->allocArrays(I)V -HSPLandroid/util/ArraySet;->append(Ljava/lang/Object;)V+]Ljava/lang/Object;Lcom/android/org/conscrypt/OpenSSLRSAPublicKey;,Lcom/android/org/bouncycastle/jcajce/provider/asymmetric/dsa/BCDSAPublicKey; +HSPLandroid/util/ArraySet;->append(Ljava/lang/Object;)V HSPLandroid/util/ArraySet;->binarySearch([II)I HSPLandroid/util/ArraySet;->clear()V HSPLandroid/util/ArraySet;->contains(Ljava/lang/Object;)Z @@ -15454,7 +15367,7 @@ HSPLandroid/util/Base64$Encoder;->(I[B)V HSPLandroid/util/Base64$Encoder;->process([BIIZ)Z HSPLandroid/util/Base64;->decode(Ljava/lang/String;I)[B HSPLandroid/util/Base64;->decode([BI)[B -HSPLandroid/util/Base64;->decode([BIII)[B+]Landroid/util/Base64$Decoder;Landroid/util/Base64$Decoder; +HSPLandroid/util/Base64;->decode([BIII)[B HSPLandroid/util/Base64;->encode([BI)[B HSPLandroid/util/Base64;->encode([BIII)[B HSPLandroid/util/Base64;->encodeToString([BI)Ljava/lang/String; @@ -15472,7 +15385,7 @@ HSPLandroid/util/DisplayMetrics;->setTo(Landroid/util/DisplayMetrics;)V HSPLandroid/util/DisplayMetrics;->setToDefaults()V HSPLandroid/util/DisplayUtils;->getDisplayUniqueIdConfigIndex(Landroid/content/res/Resources;Ljava/lang/String;)I HSPLandroid/util/EventLog$Event;->([B)V -HSPLandroid/util/EventLog$Event;->decodeObject()Ljava/lang/Object;+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; +HSPLandroid/util/EventLog$Event;->decodeObject()Ljava/lang/Object; HSPLandroid/util/EventLog$Event;->getData()Ljava/lang/Object; HSPLandroid/util/EventLog$Event;->getHeaderSize()I HSPLandroid/util/EventLog$Event;->getUid()I @@ -15557,9 +15470,9 @@ HSPLandroid/util/JsonWriter;->flush()V HSPLandroid/util/JsonWriter;->name(Ljava/lang/String;)Landroid/util/JsonWriter; HSPLandroid/util/JsonWriter;->newline()V HSPLandroid/util/JsonWriter;->open(Landroid/util/JsonScope;Ljava/lang/String;)Landroid/util/JsonWriter; -HSPLandroid/util/JsonWriter;->peek()Landroid/util/JsonScope;+]Ljava/util/List;Ljava/util/ArrayList; -HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V+]Ljava/util/List;Ljava/util/ArrayList; -HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String;]Ljava/io/Writer;Ljava/io/BufferedWriter; +HSPLandroid/util/JsonWriter;->peek()Landroid/util/JsonScope; +HSPLandroid/util/JsonWriter;->replaceTop(Landroid/util/JsonScope;)V +HSPLandroid/util/JsonWriter;->string(Ljava/lang/String;)V HSPLandroid/util/JsonWriter;->value(J)Landroid/util/JsonWriter; HSPLandroid/util/JsonWriter;->value(Ljava/lang/String;)Landroid/util/JsonWriter; HSPLandroid/util/JsonWriter;->value(Z)Landroid/util/JsonWriter; @@ -15609,7 +15522,7 @@ HSPLandroid/util/LongSparseArray;->append(JLjava/lang/Object;)V HSPLandroid/util/LongSparseArray;->clear()V HSPLandroid/util/LongSparseArray;->delete(J)V HSPLandroid/util/LongSparseArray;->gc()V -HSPLandroid/util/LongSparseArray;->get(J)Ljava/lang/Object;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; +HSPLandroid/util/LongSparseArray;->get(J)Ljava/lang/Object; HSPLandroid/util/LongSparseArray;->get(JLjava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/LongSparseArray;->indexOfKey(J)I HSPLandroid/util/LongSparseArray;->keyAt(I)J @@ -15632,21 +15545,21 @@ HSPLandroid/util/LruCache;->(I)V HSPLandroid/util/LruCache;->create(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/LruCache;->entryRemoved(ZLjava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/util/LruCache;->evictAll()V -HSPLandroid/util/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;missing_types +HSPLandroid/util/LruCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/LruCache;->hitCount()I HSPLandroid/util/LruCache;->maxSize()I HSPLandroid/util/LruCache;->missCount()I -HSPLandroid/util/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache;,Landroid/util/LruCache; +HSPLandroid/util/LruCache;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/LruCache;->remove(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/LruCache;->resize(I)V HSPLandroid/util/LruCache;->safeSizeOf(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroid/util/LruCache;->size()I HSPLandroid/util/LruCache;->sizeOf(Ljava/lang/Object;Ljava/lang/Object;)I HSPLandroid/util/LruCache;->snapshot()Ljava/util/Map; -HSPLandroid/util/LruCache;->trimToSize(I)V+]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Landroid/util/LruCache;Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; -HSPLandroid/util/MapCollections$ArrayIterator;->(Landroid/util/MapCollections;I)V+]Landroid/util/MapCollections;Landroid/util/ArraySet$1;,Landroid/util/ArrayMap$1; +HSPLandroid/util/LruCache;->trimToSize(I)V +HSPLandroid/util/MapCollections$ArrayIterator;->(Landroid/util/MapCollections;I)V HSPLandroid/util/MapCollections$ArrayIterator;->hasNext()Z -HSPLandroid/util/MapCollections$ArrayIterator;->next()Ljava/lang/Object;+]Landroid/util/MapCollections$ArrayIterator;Landroid/util/MapCollections$ArrayIterator;]Landroid/util/MapCollections;Landroid/util/ArraySet$1;,Landroid/util/ArrayMap$1; +HSPLandroid/util/MapCollections$ArrayIterator;->next()Ljava/lang/Object; HSPLandroid/util/MapCollections$ArrayIterator;->remove()V HSPLandroid/util/MapCollections$EntrySet;->(Landroid/util/MapCollections;)V HSPLandroid/util/MapCollections$EntrySet;->iterator()Ljava/util/Iterator; @@ -15764,14 +15677,14 @@ HSPLandroid/util/Slog;->v(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/util/Slog;->w(Ljava/lang/String;Ljava/lang/String;)I HSPLandroid/util/SparseArray;->()V HSPLandroid/util/SparseArray;->(I)V -HSPLandroid/util/SparseArray;->append(ILjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLandroid/util/SparseArray;->append(ILjava/lang/Object;)V HSPLandroid/util/SparseArray;->clear()V HSPLandroid/util/SparseArray;->clone()Landroid/util/SparseArray; HSPLandroid/util/SparseArray;->contains(I)Z HSPLandroid/util/SparseArray;->contentEquals(Landroid/util/SparseArray;)Z HSPLandroid/util/SparseArray;->delete(I)V HSPLandroid/util/SparseArray;->gc()V -HSPLandroid/util/SparseArray;->get(I)Ljava/lang/Object;+]Landroid/util/SparseArray;missing_types +HSPLandroid/util/SparseArray;->get(I)Ljava/lang/Object; HSPLandroid/util/SparseArray;->get(ILjava/lang/Object;)Ljava/lang/Object; HSPLandroid/util/SparseArray;->indexOfKey(I)I HSPLandroid/util/SparseArray;->indexOfValue(Ljava/lang/Object;)I @@ -15808,7 +15721,7 @@ HSPLandroid/util/SparseIntArray;->clear()V HSPLandroid/util/SparseIntArray;->clone()Landroid/util/SparseIntArray; HSPLandroid/util/SparseIntArray;->copyKeys()[I HSPLandroid/util/SparseIntArray;->delete(I)V -HSPLandroid/util/SparseIntArray;->get(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLandroid/util/SparseIntArray;->get(I)I HSPLandroid/util/SparseIntArray;->get(II)I HSPLandroid/util/SparseIntArray;->indexOfKey(I)I HSPLandroid/util/SparseIntArray;->indexOfValue(I)I @@ -15949,14 +15862,12 @@ HSPLandroid/view/Choreographer$1;->initialValue()Ljava/lang/Object; HSPLandroid/view/Choreographer$2;->initialValue()Landroid/view/Choreographer; HSPLandroid/view/Choreographer$2;->initialValue()Ljava/lang/Object; HSPLandroid/view/Choreographer$CallbackQueue;->(Landroid/view/Choreographer;)V -HSPLandroid/view/Choreographer$CallbackQueue;->(Landroid/view/Choreographer;Landroid/view/Choreographer$CallbackQueue-IA;)V HSPLandroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V HSPLandroid/view/Choreographer$CallbackQueue;->extractDueCallbacksLocked(J)Landroid/view/Choreographer$CallbackRecord; HSPLandroid/view/Choreographer$CallbackQueue;->removeCallbacksLocked(Ljava/lang/Object;Ljava/lang/Object;)V HSPLandroid/view/Choreographer$CallbackRecord;->()V -HSPLandroid/view/Choreographer$CallbackRecord;->(Landroid/view/Choreographer$CallbackRecord-IA;)V -HSPLandroid/view/Choreographer$CallbackRecord;->run(J)V+]Landroid/view/Choreographer$FrameCallback;missing_types]Ljava/lang/Runnable;missing_types -HSPLandroid/view/Choreographer$CallbackRecord;->run(Landroid/view/Choreographer$FrameData;)V+]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord; +HSPLandroid/view/Choreographer$CallbackRecord;->run(J)V +HSPLandroid/view/Choreographer$CallbackRecord;->run(Landroid/view/Choreographer$FrameData;)V HSPLandroid/view/Choreographer$FrameData;->-$$Nest$fgetmFrameTimeNanos(Landroid/view/Choreographer$FrameData;)J HSPLandroid/view/Choreographer$FrameData;->()V HSPLandroid/view/Choreographer$FrameData;->allocateFrameTimelines(I)V @@ -15964,13 +15875,13 @@ HSPLandroid/view/Choreographer$FrameData;->checkInCallback()V HSPLandroid/view/Choreographer$FrameData;->getFrameTimeNanos()J HSPLandroid/view/Choreographer$FrameData;->getFrameTimelines()[Landroid/view/Choreographer$FrameTimeline; HSPLandroid/view/Choreographer$FrameData;->getPreferredFrameTimeline()Landroid/view/Choreographer$FrameTimeline; -HSPLandroid/view/Choreographer$FrameData;->setInCallback(Z)V+]Landroid/view/Choreographer$FrameTimeline;Landroid/view/Choreographer$FrameTimeline; +HSPLandroid/view/Choreographer$FrameData;->setInCallback(Z)V HSPLandroid/view/Choreographer$FrameData;->update(JI)V -HSPLandroid/view/Choreographer$FrameData;->update(JLandroid/view/DisplayEventReceiver$VsyncEventData;)Landroid/view/Choreographer$FrameTimeline;+]Landroid/view/Choreographer$FrameTimeline;Landroid/view/Choreographer$FrameTimeline; +HSPLandroid/view/Choreographer$FrameData;->update(JLandroid/view/DisplayEventReceiver$VsyncEventData;)Landroid/view/Choreographer$FrameTimeline; HSPLandroid/view/Choreographer$FrameData;->update(JLandroid/view/DisplayEventReceiver;J)Landroid/view/Choreographer$FrameTimeline; HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->(Landroid/view/Choreographer;Landroid/os/Looper;IJ)V -HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->onVsync(JJILandroid/view/DisplayEventReceiver$VsyncEventData;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/Choreographer$FrameHandler;Landroid/view/Choreographer$FrameHandler;]Landroid/view/DisplayEventReceiver$VsyncEventData;Landroid/view/DisplayEventReceiver$VsyncEventData; -HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->run()V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->onVsync(JJILandroid/view/DisplayEventReceiver$VsyncEventData;)V +HSPLandroid/view/Choreographer$FrameDisplayEventReceiver;->run()V HSPLandroid/view/Choreographer$FrameHandler;->(Landroid/view/Choreographer;Landroid/os/Looper;)V HSPLandroid/view/Choreographer$FrameHandler;->handleMessage(Landroid/os/Message;)V HSPLandroid/view/Choreographer$FrameTimeline;->-$$Nest$fgetmDeadlineNanos(Landroid/view/Choreographer$FrameTimeline;)J @@ -15987,12 +15898,12 @@ HSPLandroid/view/Choreographer;->-$$Nest$sfputmMainInstance(Landroid/view/Choreo HSPLandroid/view/Choreographer;->(Landroid/os/Looper;I)V HSPLandroid/view/Choreographer;->(Landroid/os/Looper;IJ)V HSPLandroid/view/Choreographer;->(Landroid/os/Looper;ILandroid/view/Choreographer-IA;)V -HSPLandroid/view/Choreographer;->doCallbacks(IJ)V+]Landroid/view/Choreographer$CallbackQueue;Landroid/view/Choreographer$CallbackQueue;]Landroid/view/Choreographer$CallbackRecord;Landroid/view/Choreographer$CallbackRecord;]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData; -HSPLandroid/view/Choreographer;->doFrame(JILandroid/view/DisplayEventReceiver$VsyncEventData;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/Choreographer$FrameData;Landroid/view/Choreographer$FrameData;]Landroid/graphics/FrameInfo;Landroid/graphics/FrameInfo;]Landroid/view/Choreographer;Landroid/view/Choreographer;]Landroid/view/DisplayEventReceiver$VsyncEventData;Landroid/view/DisplayEventReceiver$VsyncEventData; +HSPLandroid/view/Choreographer;->doCallbacks(IJ)V +HSPLandroid/view/Choreographer;->doFrame(JILandroid/view/DisplayEventReceiver$VsyncEventData;)V HSPLandroid/view/Choreographer;->doScheduleCallback(I)V HSPLandroid/view/Choreographer;->doScheduleVsync()V HSPLandroid/view/Choreographer;->getFrameIntervalNanos()J -HSPLandroid/view/Choreographer;->getFrameTime()J+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/Choreographer;->getFrameTime()J HSPLandroid/view/Choreographer;->getFrameTimeNanos()J HSPLandroid/view/Choreographer;->getInstance()Landroid/view/Choreographer; HSPLandroid/view/Choreographer;->getMainThreadInstance()Landroid/view/Choreographer; @@ -16001,17 +15912,17 @@ HSPLandroid/view/Choreographer;->getSfInstance()Landroid/view/Choreographer; HSPLandroid/view/Choreographer;->getVsyncId()J HSPLandroid/view/Choreographer;->isRunningOnLooperThreadLocked()Z HSPLandroid/view/Choreographer;->obtainCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)Landroid/view/Choreographer$CallbackRecord; -HSPLandroid/view/Choreographer;->postCallback(ILjava/lang/Runnable;Ljava/lang/Object;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/Choreographer;->postCallback(ILjava/lang/Runnable;Ljava/lang/Object;)V HSPLandroid/view/Choreographer;->postCallbackDelayed(ILjava/lang/Runnable;Ljava/lang/Object;J)V -HSPLandroid/view/Choreographer;->postCallbackDelayedInternal(ILjava/lang/Object;Ljava/lang/Object;J)V+]Landroid/view/Choreographer$CallbackQueue;Landroid/view/Choreographer$CallbackQueue;]Landroid/os/Message;Landroid/os/Message;]Landroid/view/Choreographer$FrameHandler;Landroid/view/Choreographer$FrameHandler; -HSPLandroid/view/Choreographer;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/Choreographer;->postCallbackDelayedInternal(ILjava/lang/Object;Ljava/lang/Object;J)V +HSPLandroid/view/Choreographer;->postFrameCallback(Landroid/view/Choreographer$FrameCallback;)V HSPLandroid/view/Choreographer;->postFrameCallbackDelayed(Landroid/view/Choreographer$FrameCallback;J)V HSPLandroid/view/Choreographer;->recycleCallbackLocked(Landroid/view/Choreographer$CallbackRecord;)V HSPLandroid/view/Choreographer;->removeCallbacks(ILjava/lang/Runnable;Ljava/lang/Object;)V HSPLandroid/view/Choreographer;->removeCallbacksInternal(ILjava/lang/Object;Ljava/lang/Object;)V HSPLandroid/view/Choreographer;->removeFrameCallback(Landroid/view/Choreographer$FrameCallback;)V HSPLandroid/view/Choreographer;->scheduleFrameLocked(J)V -HSPLandroid/view/Choreographer;->scheduleVsyncLocked()V+]Landroid/view/Choreographer$FrameDisplayEventReceiver;Landroid/view/Choreographer$FrameDisplayEventReceiver; +HSPLandroid/view/Choreographer;->scheduleVsyncLocked()V HSPLandroid/view/Choreographer;->setFPSDivisor(I)V HSPLandroid/view/ContextThemeWrapper;->()V HSPLandroid/view/ContextThemeWrapper;->(Landroid/content/Context;I)V @@ -16022,7 +15933,7 @@ HSPLandroid/view/ContextThemeWrapper;->getOverrideConfiguration()Landroid/conten HSPLandroid/view/ContextThemeWrapper;->getResources()Landroid/content/res/Resources; HSPLandroid/view/ContextThemeWrapper;->getResourcesInternal()Landroid/content/res/Resources; HSPLandroid/view/ContextThemeWrapper;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; -HSPLandroid/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme;+]Landroid/view/ContextThemeWrapper;Landroid/view/ContextThemeWrapper; +HSPLandroid/view/ContextThemeWrapper;->getTheme()Landroid/content/res/Resources$Theme; HSPLandroid/view/ContextThemeWrapper;->initializeTheme()V HSPLandroid/view/ContextThemeWrapper;->onApplyThemeResource(Landroid/content/res/Resources$Theme;IZ)V HSPLandroid/view/ContextThemeWrapper;->setTheme(I)V @@ -16030,7 +15941,6 @@ HSPLandroid/view/CrossWindowBlurListeners;->()V HSPLandroid/view/Display$HdrCapabilities$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/Display$HdrCapabilities; HSPLandroid/view/Display$HdrCapabilities$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/view/Display$HdrCapabilities;->(Landroid/os/Parcel;)V -HSPLandroid/view/Display$HdrCapabilities;->(Landroid/os/Parcel;Landroid/view/Display$HdrCapabilities-IA;)V HSPLandroid/view/Display$HdrCapabilities;->equals(Ljava/lang/Object;)Z HSPLandroid/view/Display$HdrCapabilities;->readFromParcel(Landroid/os/Parcel;)V HSPLandroid/view/Display$HdrCapabilities;->toString()Ljava/lang/String; @@ -16041,7 +15951,6 @@ HSPLandroid/view/Display$Mode;->(IIIF)V HSPLandroid/view/Display$Mode;->(IIIFF[F[I)V HSPLandroid/view/Display$Mode;->(IIIF[F[I)V HSPLandroid/view/Display$Mode;->(Landroid/os/Parcel;)V -HSPLandroid/view/Display$Mode;->(Landroid/os/Parcel;Landroid/view/Display$Mode-IA;)V HSPLandroid/view/Display$Mode;->equals(Ljava/lang/Object;)Z HSPLandroid/view/Display$Mode;->getModeId()I HSPLandroid/view/Display$Mode;->getPhysicalHeight()I @@ -16061,7 +15970,7 @@ HSPLandroid/view/Display;->getFlags()I HSPLandroid/view/Display;->getHdrSdrRatio()F HSPLandroid/view/Display;->getHeight()I HSPLandroid/view/Display;->getInstallOrientation()I -HSPLandroid/view/Display;->getLocalRotation()I+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/view/Display;->getLocalRotation()I HSPLandroid/view/Display;->getMetrics(Landroid/util/DisplayMetrics;)V HSPLandroid/view/Display;->getMode()Landroid/view/Display$Mode; HSPLandroid/view/Display;->getName()Ljava/lang/String; @@ -16083,11 +15992,10 @@ HSPLandroid/view/Display;->isWideColorGamut()Z HSPLandroid/view/Display;->shouldReportMaxBounds()Z HSPLandroid/view/Display;->stateToString(I)Ljava/lang/String; HSPLandroid/view/Display;->updateCachedAppSizeIfNeededLocked()V -HSPLandroid/view/Display;->updateDisplayInfoLocked()V+]Landroid/hardware/display/DisplayManagerGlobal;Landroid/hardware/display/DisplayManagerGlobal; +HSPLandroid/view/Display;->updateDisplayInfoLocked()V HSPLandroid/view/DisplayAddress$Physical$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayAddress$Physical; HSPLandroid/view/DisplayAddress$Physical$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/view/DisplayAddress$Physical;->(J)V -HSPLandroid/view/DisplayAddress$Physical;->(JLandroid/view/DisplayAddress$Physical-IA;)V HSPLandroid/view/DisplayAddress$Physical;->equals(Ljava/lang/Object;)Z HSPLandroid/view/DisplayAddress$Physical;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/view/DisplayAddress;->()V @@ -16102,7 +16010,6 @@ HSPLandroid/view/DisplayAdjustments;->setCompatibilityInfo(Landroid/content/res/ HSPLandroid/view/DisplayAdjustments;->setConfiguration(Landroid/content/res/Configuration;)V HSPLandroid/view/DisplayCutout$Bounds;->-$$Nest$mgetRects(Landroid/view/DisplayCutout$Bounds;)[Landroid/graphics/Rect; HSPLandroid/view/DisplayCutout$Bounds;->([Landroid/graphics/Rect;Z)V -HSPLandroid/view/DisplayCutout$Bounds;->([Landroid/graphics/Rect;ZLandroid/view/DisplayCutout$Bounds-IA;)V HSPLandroid/view/DisplayCutout$Bounds;->equals(Ljava/lang/Object;)Z HSPLandroid/view/DisplayCutout$Bounds;->getRects()[Landroid/graphics/Rect; HSPLandroid/view/DisplayCutout$Bounds;->isEmpty()Z @@ -16135,17 +16042,17 @@ HSPLandroid/view/DisplayCutout;->getSafeInsetTop()I HSPLandroid/view/DisplayCutout;->inset(IIII)Landroid/view/DisplayCutout; HSPLandroid/view/DisplayCutout;->insetInsets(IIIILandroid/graphics/Rect;)Landroid/graphics/Rect; HSPLandroid/view/DisplayCutout;->isBoundsEmpty()Z -HSPLandroid/view/DisplayCutout;->isEmpty()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/view/DisplayCutout;->isEmpty()Z HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;->()V HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;->(JJJ)V HSPLandroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;->copyFrom(Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;)V HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->()V HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->([Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;IIJ)V -HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->copyFrom(Landroid/view/DisplayEventReceiver$VsyncEventData;)V+]Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline;Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline; +HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->copyFrom(Landroid/view/DisplayEventReceiver$VsyncEventData;)V HSPLandroid/view/DisplayEventReceiver$VsyncEventData;->preferredFrameTimeline()Landroid/view/DisplayEventReceiver$VsyncEventData$FrameTimeline; HSPLandroid/view/DisplayEventReceiver;->(Landroid/os/Looper;II)V HSPLandroid/view/DisplayEventReceiver;->(Landroid/os/Looper;IIJ)V -HSPLandroid/view/DisplayEventReceiver;->dispatchVsync(JJI)V+]Landroid/view/DisplayEventReceiver;Landroid/view/Choreographer$FrameDisplayEventReceiver; +HSPLandroid/view/DisplayEventReceiver;->dispatchVsync(JJI)V HSPLandroid/view/DisplayEventReceiver;->getLatestVsyncEventData()Landroid/view/DisplayEventReceiver$VsyncEventData; HSPLandroid/view/DisplayEventReceiver;->scheduleVsync()V HSPLandroid/view/DisplayInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/DisplayInfo; @@ -16154,14 +16061,14 @@ HSPLandroid/view/DisplayInfo;->()V HSPLandroid/view/DisplayInfo;->(Landroid/os/Parcel;)V HSPLandroid/view/DisplayInfo;->(Landroid/os/Parcel;Landroid/view/DisplayInfo-IA;)V HSPLandroid/view/DisplayInfo;->copyFrom(Landroid/view/DisplayInfo;)V -HSPLandroid/view/DisplayInfo;->equals(Landroid/view/DisplayInfo;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo; +HSPLandroid/view/DisplayInfo;->equals(Landroid/view/DisplayInfo;)Z HSPLandroid/view/DisplayInfo;->findMode(I)Landroid/view/Display$Mode; HSPLandroid/view/DisplayInfo;->flagsToString(I)Ljava/lang/String; HSPLandroid/view/DisplayInfo;->getAppMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V HSPLandroid/view/DisplayInfo;->getAppMetrics(Landroid/util/DisplayMetrics;Landroid/view/DisplayAdjustments;)V HSPLandroid/view/DisplayInfo;->getLogicalMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V HSPLandroid/view/DisplayInfo;->getMaxBoundsMetrics(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;)V -HSPLandroid/view/DisplayInfo;->getMetricsWithSize(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;II)V+]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLandroid/view/DisplayInfo;->getMetricsWithSize(Landroid/util/DisplayMetrics;Landroid/content/res/CompatibilityInfo;Landroid/content/res/Configuration;II)V HSPLandroid/view/DisplayInfo;->getMode()Landroid/view/Display$Mode; HSPLandroid/view/DisplayInfo;->getRefreshRate()F HSPLandroid/view/DisplayInfo;->hasAccess(I)Z @@ -16197,7 +16104,7 @@ HSPLandroid/view/FrameMetrics;->()V HSPLandroid/view/FrameMetrics;->getMetric(I)J HSPLandroid/view/FrameMetricsObserver;->(Landroid/view/Window;Landroid/os/Handler;Landroid/view/Window$OnFrameMetricsAvailableListener;)V HSPLandroid/view/FrameMetricsObserver;->getRendererObserver()Landroid/graphics/HardwareRendererObserver; -HSPLandroid/view/FrameMetricsObserver;->onFrameMetricsAvailable(I)V+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; +HSPLandroid/view/FrameMetricsObserver;->onFrameMetricsAvailable(I)V HSPLandroid/view/GestureDetector$GestureHandler;->(Landroid/view/GestureDetector;)V HSPLandroid/view/GestureDetector$GestureHandler;->(Landroid/view/GestureDetector;Landroid/os/Handler;)V HSPLandroid/view/GestureDetector$GestureHandler;->handleMessage(Landroid/os/Message;)V @@ -16231,7 +16138,7 @@ HSPLandroid/view/Gravity;->isVertical(I)Z HSPLandroid/view/HandlerActionQueue$HandlerAction;->(Ljava/lang/Runnable;J)V HSPLandroid/view/HandlerActionQueue$HandlerAction;->matches(Ljava/lang/Runnable;)Z HSPLandroid/view/HandlerActionQueue;->()V -HSPLandroid/view/HandlerActionQueue;->executeActions(Landroid/os/Handler;)V+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler; +HSPLandroid/view/HandlerActionQueue;->executeActions(Landroid/os/Handler;)V HSPLandroid/view/HandlerActionQueue;->post(Ljava/lang/Runnable;)V HSPLandroid/view/HandlerActionQueue;->postDelayed(Ljava/lang/Runnable;J)V HSPLandroid/view/HandlerActionQueue;->removeCallbacks(Ljava/lang/Runnable;)V @@ -16250,7 +16157,7 @@ HSPLandroid/view/HandwritingInitiator;->onInputConnectionClosed(Landroid/view/Vi HSPLandroid/view/HandwritingInitiator;->onInputConnectionCreated(Landroid/view/View;)V HSPLandroid/view/HandwritingInitiator;->onTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroid/view/HandwritingInitiator;->updateHandwritingAreasForView(Landroid/view/View;)V -HSPLandroid/view/HdrRenderState;->updateForFrame(J)Z +HSPLandroid/view/HdrRenderState;->updateForFrame(J)Z+]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState; HSPLandroid/view/IGraphicsStats$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLandroid/view/IGraphicsStats$Stub$Proxy;->asBinder()Landroid/os/IBinder; HSPLandroid/view/IGraphicsStats$Stub$Proxy;->requestBufferForProcess(Ljava/lang/String;Landroid/view/IGraphicsStatsCallback;)Landroid/os/ParcelFileDescriptor; @@ -16283,8 +16190,7 @@ HSPLandroid/view/IWindowSession$Stub$Proxy;->finishDrawing(Landroid/view/IWindow HSPLandroid/view/IWindowSession$Stub$Proxy;->getWindowId(Landroid/os/IBinder;)Landroid/view/IWindowId; HSPLandroid/view/IWindowSession$Stub$Proxy;->onRectangleOnScreenRequested(Landroid/os/IBinder;Landroid/graphics/Rect;)V HSPLandroid/view/IWindowSession$Stub$Proxy;->pokeDrawLock(Landroid/os/IBinder;)V -HSPLandroid/view/IWindowSession$Stub$Proxy;->relayout(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIIILandroid/window/ClientWindowFrames;Landroid/util/MergedConfiguration;Landroid/view/SurfaceControl;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/os/Bundle;)I -HSPLandroid/view/IWindowSession$Stub$Proxy;->relayoutAsync(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIII)V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/view/IWindowSession$Stub$Proxy;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/view/IWindowSession$Stub$Proxy;->relayoutAsync(Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIII)V HSPLandroid/view/IWindowSession$Stub$Proxy;->reportSystemGestureExclusionChanged(Landroid/view/IWindow;Ljava/util/List;)V HSPLandroid/view/IWindowSession$Stub$Proxy;->setInsets(Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V HSPLandroid/view/IWindowSession$Stub$Proxy;->setOnBackInvokedCallbackInfo(Landroid/view/IWindow;Landroid/window/OnBackInvokedCallbackInfo;)V @@ -16303,7 +16209,6 @@ HSPLandroid/view/ImeFocusController;->onTraversal(ZLandroid/view/WindowManager$L HSPLandroid/view/ImeFocusController;->onViewDetachedFromWindow(Landroid/view/View;)V HSPLandroid/view/ImeFocusController;->onViewFocusChanged(Landroid/view/View;Z)V HSPLandroid/view/ImeFocusController;->onWindowDismissed()V -HSPLandroid/view/ImeInsetsSourceConsumer;->(ILandroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V HSPLandroid/view/ImeInsetsSourceConsumer;->applyLocalVisibilityOverride()Z HSPLandroid/view/ImeInsetsSourceConsumer;->getImm()Landroid/view/inputmethod/InputMethodManager; HSPLandroid/view/ImeInsetsSourceConsumer;->isRequestedVisibleAwaitingControl()Z @@ -16312,7 +16217,6 @@ HSPLandroid/view/ImeInsetsSourceConsumer;->onShowRequested()V HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusGained(Z)V HSPLandroid/view/ImeInsetsSourceConsumer;->onWindowFocusLost()V HSPLandroid/view/ImeInsetsSourceConsumer;->removeSurface()V -HSPLandroid/view/ImeInsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)Z HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InputChannel; HSPLandroid/view/InputChannel$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/view/InputChannel;->()V @@ -16332,7 +16236,7 @@ HSPLandroid/view/InputDevice;->getSources()I HSPLandroid/view/InputDevice;->isVirtual()Z HSPLandroid/view/InputEvent;->()V HSPLandroid/view/InputEvent;->getSequenceNumber()I -HSPLandroid/view/InputEvent;->isFromSource(I)Z+]Landroid/view/InputEvent;Landroid/view/MotionEvent; +HSPLandroid/view/InputEvent;->isFromSource(I)Z HSPLandroid/view/InputEvent;->prepareForReuse()V HSPLandroid/view/InputEvent;->recycle()V HSPLandroid/view/InputEvent;->recycleIfNeededAfterDispatch()V @@ -16362,7 +16266,6 @@ HSPLandroid/view/InputMonitor$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lan HSPLandroid/view/InputMonitor;->(Landroid/os/Parcel;)V HSPLandroid/view/InputMonitor;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/view/InsetsAnimationControlImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -HSPLandroid/view/InsetsAnimationControlImpl;->(Landroid/util/SparseArray;Landroid/graphics/Rect;Landroid/view/InsetsState;Landroid/view/WindowInsetsAnimationControlListener;ILandroid/view/InsetsAnimationControlCallbacks;JLandroid/view/animation/Interpolator;IILandroid/content/res/CompatibilityInfo$Translator;Landroid/view/inputmethod/ImeTracker$Token;)V HSPLandroid/view/InsetsAnimationControlImpl;->addTranslationToMatrix(IILandroid/graphics/Matrix;Landroid/graphics/Rect;)V HSPLandroid/view/InsetsAnimationControlImpl;->applyChangeInsets(Landroid/view/InsetsState;)Z HSPLandroid/view/InsetsAnimationControlImpl;->buildSideControlsMap(Landroid/util/SparseSetArray;Landroid/util/SparseArray;)V @@ -16394,7 +16297,6 @@ HSPLandroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1;-> HSPLandroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0;->run()V HSPLandroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1;->run()V HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->(Landroid/view/InsetsAnimationThreadControlRunner;)V -HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->applySurfaceParams([Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams;)V HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->notifyFinished(Landroid/view/InsetsAnimationControlRunner;Z)V HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->releaseSurfaceControlFromRt(Landroid/view/SurfaceControl;)V HSPLandroid/view/InsetsAnimationThreadControlRunner$1;->reportPerceptible(IZ)V @@ -16409,7 +16311,6 @@ HSPLandroid/view/InsetsAnimationThreadControlRunner;->getTypes()I HSPLandroid/view/InsetsAnimationThreadControlRunner;->notifyControlRevoked(I)V HSPLandroid/view/InsetsAnimationThreadControlRunner;->updateSurfacePosition(Landroid/util/SparseArray;)V HSPLandroid/view/InsetsController$$ExternalSyntheticLambda10;->(Landroid/view/InsetsController;)V -HSPLandroid/view/InsetsController$$ExternalSyntheticLambda7;->()V HSPLandroid/view/InsetsController$$ExternalSyntheticLambda9;->(Landroid/view/InsetsController;)V HSPLandroid/view/InsetsController$1;->(Landroid/view/InsetsController;)V HSPLandroid/view/InsetsController$2;->(Landroid/view/InsetsController;)V @@ -16420,14 +16321,8 @@ HSPLandroid/view/InsetsController$3;->onStart(Landroid/view/InsetsState;Landroid HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda0;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda3;->getInterpolation(F)F HSPLandroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda4;->getInterpolation(F)F -HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Landroid/animation/AnimationHandler; -HSPLandroid/view/InsetsController$InternalAnimationControlListener$1;->initialValue()Ljava/lang/Object; -HSPLandroid/view/InsetsController$InternalAnimationControlListener$2;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/view/InsetsController$InternalAnimationControlListener;->(ZZIIZILandroid/view/WindowInsetsAnimationControlListener;Landroid/view/inputmethod/ImeTracker$InputMethodJankContext;)V -HSPLandroid/view/InsetsController$InternalAnimationControlListener;->calculateDurationMs()J HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getAlphaInterpolator()Landroid/view/animation/Interpolator; -HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getDurationMs()J -HSPLandroid/view/InsetsController$InternalAnimationControlListener;->getInsetsInterpolator()Landroid/view/animation/Interpolator; HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$2(F)F HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$3(F)F HSPLandroid/view/InsetsController$InternalAnimationControlListener;->lambda$getAlphaInterpolator$4(F)F @@ -16449,9 +16344,6 @@ HSPLandroid/view/InsetsController;->calculateVisibleInsets(IIII)Landroid/graphic HSPLandroid/view/InsetsController;->cancelAnimation(Landroid/view/InsetsAnimationControlRunner;Z)V HSPLandroid/view/InsetsController;->cancelExistingAnimations()V HSPLandroid/view/InsetsController;->cancelExistingControllers(I)V -HSPLandroid/view/InsetsController;->captionInsetsUnchanged()Z -HSPLandroid/view/InsetsController;->collectSourceControls(ZILandroid/util/SparseArray;ILandroid/view/inputmethod/ImeTracker$Token;)Landroid/util/Pair; -HSPLandroid/view/InsetsController;->controlAnimationUncheckedInner(ILandroid/os/CancellationSignal;Landroid/view/WindowInsetsAnimationControlListener;Landroid/graphics/Rect;ZJLandroid/view/animation/Interpolator;IIZLandroid/view/inputmethod/ImeTracker$Token;)V HSPLandroid/view/InsetsController;->dispatchAnimationEnd(Landroid/view/WindowInsetsAnimation;)V HSPLandroid/view/InsetsController;->getAnimationType(I)I HSPLandroid/view/InsetsController;->getHost()Landroid/view/InsetsController$Host; @@ -16468,12 +16360,11 @@ HSPLandroid/view/InsetsController;->notifyControlRevoked(Landroid/view/InsetsSou HSPLandroid/view/InsetsController;->notifyFinished(Landroid/view/InsetsAnimationControlRunner;Z)V HSPLandroid/view/InsetsController;->notifyVisibilityChanged()V HSPLandroid/view/InsetsController;->onControlsChanged([Landroid/view/InsetsSourceControl;)V -HSPLandroid/view/InsetsController;->onFrameChanged(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/view/InsetsController;->onFrameChanged(Landroid/graphics/Rect;)V HSPLandroid/view/InsetsController;->onStateChanged(Landroid/view/InsetsState;)Z HSPLandroid/view/InsetsController;->onWindowFocusGained(Z)V HSPLandroid/view/InsetsController;->onWindowFocusLost()V HSPLandroid/view/InsetsController;->reportPerceptible(IZ)V -HSPLandroid/view/InsetsController;->reportRequestedVisibleTypes()V HSPLandroid/view/InsetsController;->setRequestedVisibleTypes(II)V HSPLandroid/view/InsetsController;->show(I)V HSPLandroid/view/InsetsController;->show(IZLandroid/view/inputmethod/ImeTracker$Token;)V @@ -16485,7 +16376,7 @@ HSPLandroid/view/InsetsSource$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lan HSPLandroid/view/InsetsSource;->(II)V HSPLandroid/view/InsetsSource;->(Landroid/os/Parcel;)V HSPLandroid/view/InsetsSource;->(Landroid/view/InsetsSource;)V -HSPLandroid/view/InsetsSource;->calculateInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;Z)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/view/InsetsSource;->calculateInsets(Landroid/graphics/Rect;Landroid/graphics/Rect;Z)Landroid/graphics/Insets; HSPLandroid/view/InsetsSource;->calculateInsets(Landroid/graphics/Rect;Z)Landroid/graphics/Insets; HSPLandroid/view/InsetsSource;->calculateVisibleInsets(Landroid/graphics/Rect;)Landroid/graphics/Insets; HSPLandroid/view/InsetsSource;->equals(Ljava/lang/Object;)Z @@ -16500,9 +16391,7 @@ HSPLandroid/view/InsetsSource;->hasFlags(I)Z HSPLandroid/view/InsetsSource;->isVisible()Z HSPLandroid/view/InsetsSource;->setVisible(Z)Landroid/view/InsetsSource; HSPLandroid/view/InsetsSource;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/view/InsetsSourceConsumer;->(IILandroid/view/InsetsState;Ljava/util/function/Supplier;Landroid/view/InsetsController;)V HSPLandroid/view/InsetsSourceConsumer;->applyLocalVisibilityOverride()Z -HSPLandroid/view/InsetsSourceConsumer;->applyRequestedVisibilityToControl()V HSPLandroid/view/InsetsSourceConsumer;->getControl()Landroid/view/InsetsSourceControl; HSPLandroid/view/InsetsSourceConsumer;->getId()I HSPLandroid/view/InsetsSourceConsumer;->getType()I @@ -16511,7 +16400,6 @@ HSPLandroid/view/InsetsSourceConsumer;->onPerceptible(Z)V HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusGained(Z)V HSPLandroid/view/InsetsSourceConsumer;->onWindowFocusLost()V HSPLandroid/view/InsetsSourceConsumer;->removeSurface()V -HSPLandroid/view/InsetsSourceConsumer;->setControl(Landroid/view/InsetsSourceControl;[I[I)Z HSPLandroid/view/InsetsSourceConsumer;->updateSource(Landroid/view/InsetsSource;I)V HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/InsetsSourceControl; HSPLandroid/view/InsetsSourceControl$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -16543,8 +16431,8 @@ HSPLandroid/view/InsetsState;->()V HSPLandroid/view/InsetsState;->(Landroid/os/Parcel;)V HSPLandroid/view/InsetsState;->(Landroid/view/InsetsState;Z)V HSPLandroid/view/InsetsState;->addSource(Landroid/view/InsetsSource;)V -HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;II)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;IZ)Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;II)Landroid/graphics/Insets; +HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;IZ)Landroid/graphics/Insets; HSPLandroid/view/InsetsState;->calculateInsets(Landroid/graphics/Rect;Landroid/view/InsetsState;ZIIIIILandroid/util/SparseIntArray;)Landroid/view/WindowInsets; HSPLandroid/view/InsetsState;->calculateRelativeCutout(Landroid/graphics/Rect;)Landroid/view/DisplayCutout; HSPLandroid/view/InsetsState;->calculateRelativeDisplayShape(Landroid/graphics/Rect;)Landroid/view/DisplayShape; @@ -16556,8 +16444,8 @@ HSPLandroid/view/InsetsState;->canControlSource(Landroid/graphics/Rect;Landroid/ HSPLandroid/view/InsetsState;->clearsCompatInsets(IIII)Z HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;)Z HSPLandroid/view/InsetsState;->equals(Ljava/lang/Object;ZZ)Z -HSPLandroid/view/InsetsState;->getDisplayCutout()Landroid/view/DisplayCutout;+]Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/DisplayCutout$ParcelableWrapper; -HSPLandroid/view/InsetsState;->getDisplayCutoutSafe(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Landroid/view/DisplayCutout$ParcelableWrapper;Landroid/view/DisplayCutout$ParcelableWrapper; +HSPLandroid/view/InsetsState;->getDisplayCutout()Landroid/view/DisplayCutout; +HSPLandroid/view/InsetsState;->getDisplayCutoutSafe(Landroid/graphics/Rect;)V HSPLandroid/view/InsetsState;->getDisplayFrame()Landroid/graphics/Rect; HSPLandroid/view/InsetsState;->getDisplayShape()Landroid/view/DisplayShape; HSPLandroid/view/InsetsState;->getPrivacyIndicatorBounds()Landroid/view/PrivacyIndicatorBounds; @@ -16639,8 +16527,8 @@ HSPLandroid/view/LayoutInflater;->inflate(Lorg/xmlpull/v1/XmlPullParser;Landroid HSPLandroid/view/LayoutInflater;->onCreateView(Landroid/content/Context;Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; HSPLandroid/view/LayoutInflater;->onCreateView(Landroid/view/View;Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; HSPLandroid/view/LayoutInflater;->onCreateView(Ljava/lang/String;Landroid/util/AttributeSet;)Landroid/view/View; -HSPLandroid/view/LayoutInflater;->parseInclude(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V+]Landroid/util/AttributeSet;Landroid/content/res/XmlBlock$Parser;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;Landroid/widget/FrameLayout;,Landroid/widget/LinearLayout;]Landroid/view/LayoutInflater;Lcom/android/internal/policy/PhoneLayoutInflater;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Ljava/lang/Object;Ljava/lang/String;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser; -HSPLandroid/view/LayoutInflater;->rInflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/View;Landroid/content/Context;Landroid/util/AttributeSet;Z)V+]Landroid/view/View;missing_types]Lorg/xmlpull/v1/XmlPullParser;Landroid/content/res/XmlBlock$Parser;]Landroid/view/ViewGroup;Landroid/widget/RelativeLayout;,Landroid/widget/FrameLayout;,Landroid/widget/LinearLayout;]Landroid/view/LayoutInflater;Lcom/android/internal/policy/PhoneLayoutInflater;]Ljava/lang/Object;Ljava/lang/String; +HSPLandroid/view/LayoutInflater;->parseInclude(Lorg/xmlpull/v1/XmlPullParser;Landroid/content/Context;Landroid/view/View;Landroid/util/AttributeSet;)V +HSPLandroid/view/LayoutInflater;->rInflate(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/View;Landroid/content/Context;Landroid/util/AttributeSet;Z)V HSPLandroid/view/LayoutInflater;->rInflateChildren(Lorg/xmlpull/v1/XmlPullParser;Landroid/view/View;Landroid/util/AttributeSet;Z)V HSPLandroid/view/LayoutInflater;->setFactory2(Landroid/view/LayoutInflater$Factory2;)V HSPLandroid/view/LayoutInflater;->setFilter(Landroid/view/LayoutInflater$Filter;)V @@ -16687,7 +16575,7 @@ HSPLandroid/view/MotionEvent;->getX(I)F HSPLandroid/view/MotionEvent;->getY()F HSPLandroid/view/MotionEvent;->getY(I)F HSPLandroid/view/MotionEvent;->initialize(IIIIIIIIIFFFFJJI[Landroid/view/MotionEvent$PointerProperties;[Landroid/view/MotionEvent$PointerCoords;)Z -HSPLandroid/view/MotionEvent;->isTargetAccessibilityFocus()Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/view/MotionEvent;->isTargetAccessibilityFocus()Z HSPLandroid/view/MotionEvent;->isTouchEvent()Z HSPLandroid/view/MotionEvent;->obtain()Landroid/view/MotionEvent; HSPLandroid/view/MotionEvent;->obtain(JJIFFFFIFFII)Landroid/view/MotionEvent; @@ -16698,7 +16586,7 @@ HSPLandroid/view/MotionEvent;->offsetLocation(FF)V HSPLandroid/view/MotionEvent;->recycle()V HSPLandroid/view/MotionEvent;->setAction(I)V HSPLandroid/view/MotionEvent;->setLocation(FF)V -HSPLandroid/view/MotionEvent;->setTargetAccessibilityFocus(Z)V+]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/view/MotionEvent;->setTargetAccessibilityFocus(Z)V HSPLandroid/view/MotionEvent;->split(I)Landroid/view/MotionEvent; HSPLandroid/view/MotionEvent;->transform(Landroid/graphics/Matrix;)V HSPLandroid/view/MotionEvent;->updateCursorPosition()V @@ -16802,7 +16690,7 @@ HSPLandroid/view/SurfaceControl$Builder;->setOpaque(Z)Landroid/view/SurfaceContr HSPLandroid/view/SurfaceControl$Builder;->setParent(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Builder; HSPLandroid/view/SurfaceControl$Builder;->unsetBufferSize()V HSPLandroid/view/SurfaceControl$Transaction;->()V -HSPLandroid/view/SurfaceControl$Transaction;->(J)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry; +HSPLandroid/view/SurfaceControl$Transaction;->(J)V HSPLandroid/view/SurfaceControl$Transaction;->apply()V HSPLandroid/view/SurfaceControl$Transaction;->apply(Z)V HSPLandroid/view/SurfaceControl$Transaction;->applyResizedSurfaces()V @@ -16810,7 +16698,7 @@ HSPLandroid/view/SurfaceControl$Transaction;->checkPreconditions(Landroid/view/S HSPLandroid/view/SurfaceControl$Transaction;->clear()V HSPLandroid/view/SurfaceControl$Transaction;->close()V HSPLandroid/view/SurfaceControl$Transaction;->hide(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction; -HSPLandroid/view/SurfaceControl$Transaction;->merge(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLandroid/view/SurfaceControl$Transaction;->merge(Landroid/view/SurfaceControl$Transaction;)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->notifyReparentedSurfaces()V HSPLandroid/view/SurfaceControl$Transaction;->remove(Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->reparent(Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;)Landroid/view/SurfaceControl$Transaction; @@ -16820,7 +16708,7 @@ HSPLandroid/view/SurfaceControl$Transaction;->setBufferSize(Landroid/view/Surfac HSPLandroid/view/SurfaceControl$Transaction;->setColor(Landroid/view/SurfaceControl;[F)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->setCornerRadius(Landroid/view/SurfaceControl;F)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->setDesintationFrame(Landroid/view/SurfaceControl;II)Landroid/view/SurfaceControl$Transaction; -HSPLandroid/view/SurfaceControl$Transaction;->setExtendedRangeBrightness(Landroid/view/SurfaceControl;FF)Landroid/view/SurfaceControl$Transaction;+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction; +HSPLandroid/view/SurfaceControl$Transaction;->setExtendedRangeBrightness(Landroid/view/SurfaceControl;FF)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->setFrameTimelineVsync(J)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->setLayer(Landroid/view/SurfaceControl;I)Landroid/view/SurfaceControl$Transaction; HSPLandroid/view/SurfaceControl$Transaction;->setMatrix(Landroid/view/SurfaceControl;FFFF)Landroid/view/SurfaceControl$Transaction; @@ -16853,7 +16741,6 @@ HSPLandroid/view/SurfaceControl;->release()V HSPLandroid/view/SurfaceControl;->rotationToBufferTransform(I)I HSPLandroid/view/SurfaceControl;->setTransformHint(I)V HSPLandroid/view/SurfaceControlRegistry$DefaultReporter;->()V -HSPLandroid/view/SurfaceControlRegistry$DefaultReporter;->(Landroid/view/SurfaceControlRegistry$DefaultReporter-IA;)V HSPLandroid/view/SurfaceControlRegistry;->()V HSPLandroid/view/SurfaceControlRegistry;->getProcessInstance()Landroid/view/SurfaceControlRegistry; HSPLandroid/view/SurfaceSession;->()V @@ -16888,7 +16775,6 @@ HSPLandroid/view/SurfaceView;->onMeasure(II)V HSPLandroid/view/SurfaceView;->onSetSurfacePositionAndScale(Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl;IIFF)V HSPLandroid/view/SurfaceView;->onWindowVisibilityChanged(I)V HSPLandroid/view/SurfaceView;->performDrawFinished()V -HSPLandroid/view/SurfaceView;->performSurfaceTransaction(Landroid/view/ViewRootImpl;Landroid/content/res/CompatibilityInfo$Translator;ZZZZLandroid/view/SurfaceControl$Transaction;)Z HSPLandroid/view/SurfaceView;->releaseSurfaces(Z)V HSPLandroid/view/SurfaceView;->replacePositionUpdateListener(II)V HSPLandroid/view/SurfaceView;->requiresSurfaceControlCreation(ZZ)Z @@ -16929,12 +16815,11 @@ HSPLandroid/view/TextureView;->updateLayer()V HSPLandroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0;->(Ljava/util/ArrayList;)V HSPLandroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0;->onFrameCommit(Z)V HSPLandroid/view/ThreadedRenderer$1;->(Landroid/view/ThreadedRenderer;Ljava/util/ArrayList;)V -HSPLandroid/view/ThreadedRenderer$1;->lambda$onFrameDraw$0(Ljava/util/ArrayList;Z)V+]Landroid/graphics/HardwareRenderer$FrameCommitCallback;Landroid/view/ViewRootImpl$7$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/view/ThreadedRenderer$1;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback;+]Landroid/graphics/HardwareRenderer$FrameDrawingCallback;Landroid/view/ViewRootImpl$3;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ThreadedRenderer$1;->lambda$onFrameDraw$0(Ljava/util/ArrayList;Z)V +HSPLandroid/view/ThreadedRenderer$1;->onFrameDraw(IJ)Landroid/graphics/HardwareRenderer$FrameCommitCallback; HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->-$$Nest$fgetmSurfaceControl(Landroid/view/ThreadedRenderer$WebViewOverlayProvider;)Landroid/view/SurfaceControl; HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->()V HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->()V -HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->(Landroid/view/ThreadedRenderer$WebViewOverlayProvider-IA;)V HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setBLASTBufferQueue(Landroid/graphics/BLASTBufferQueue;)V HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setSurfaceControl(Landroid/view/SurfaceControl;)V HSPLandroid/view/ThreadedRenderer$WebViewOverlayProvider;->setSurfaceControlOpaque(Z)Z @@ -16945,7 +16830,7 @@ HSPLandroid/view/ThreadedRenderer;->create(Landroid/content/Context;ZLjava/lang/ HSPLandroid/view/ThreadedRenderer;->destroy()V HSPLandroid/view/ThreadedRenderer;->destroyHardwareResources(Landroid/view/View;)V HSPLandroid/view/ThreadedRenderer;->destroyResources(Landroid/view/View;)V -HSPLandroid/view/ThreadedRenderer;->draw(Landroid/view/View;Landroid/view/View$AttachInfo;Landroid/view/ThreadedRenderer$DrawCallbacks;)V+]Landroid/view/ViewFrameInfo;Landroid/view/ViewFrameInfo;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ThreadedRenderer;->draw(Landroid/view/View;Landroid/view/View$AttachInfo;Landroid/view/ThreadedRenderer$DrawCallbacks;)V HSPLandroid/view/ThreadedRenderer;->dumpArgsToFlags([Ljava/lang/String;)I HSPLandroid/view/ThreadedRenderer;->getHeight()I HSPLandroid/view/ThreadedRenderer;->getWidth()I @@ -16956,20 +16841,20 @@ HSPLandroid/view/ThreadedRenderer;->invalidateRoot()V HSPLandroid/view/ThreadedRenderer;->isEnabled()Z HSPLandroid/view/ThreadedRenderer;->isRequested()Z HSPLandroid/view/ThreadedRenderer;->loadSystemProperties()Z -HSPLandroid/view/ThreadedRenderer;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ThreadedRenderer;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V HSPLandroid/view/ThreadedRenderer;->rendererOwnsSurfaceControlOpacity()Z HSPLandroid/view/ThreadedRenderer;->setEnabled(Z)V HSPLandroid/view/ThreadedRenderer;->setLightCenter(Landroid/view/View$AttachInfo;)V HSPLandroid/view/ThreadedRenderer;->setRequested(Z)V HSPLandroid/view/ThreadedRenderer;->setSurface(Landroid/view/Surface;)V -HSPLandroid/view/ThreadedRenderer;->setSurfaceControl(Landroid/view/SurfaceControl;Landroid/graphics/BLASTBufferQueue;)V+]Landroid/view/ThreadedRenderer$WebViewOverlayProvider;Landroid/view/ThreadedRenderer$WebViewOverlayProvider; +HSPLandroid/view/ThreadedRenderer;->setSurfaceControl(Landroid/view/SurfaceControl;Landroid/graphics/BLASTBufferQueue;)V HSPLandroid/view/ThreadedRenderer;->setSurfaceControlOpaque(Z)Z HSPLandroid/view/ThreadedRenderer;->setup(IILandroid/view/View$AttachInfo;Landroid/graphics/Rect;)V HSPLandroid/view/ThreadedRenderer;->updateEnabledState(Landroid/view/Surface;)V -HSPLandroid/view/ThreadedRenderer;->updateRootDisplayList(Landroid/view/View;Landroid/view/ThreadedRenderer$DrawCallbacks;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/ThreadedRenderer$DrawCallbacks;Landroid/view/ViewRootImpl;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/view/ThreadedRenderer;->updateRootDisplayList(Landroid/view/View;Landroid/view/ThreadedRenderer$DrawCallbacks;)V HSPLandroid/view/ThreadedRenderer;->updateSurface(Landroid/view/Surface;)V -HSPLandroid/view/ThreadedRenderer;->updateViewTreeDisplayList(Landroid/view/View;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView; -HSPLandroid/view/ThreadedRenderer;->updateWebViewOverlayCallbacks()V+]Landroid/view/ThreadedRenderer$WebViewOverlayProvider;Landroid/view/ThreadedRenderer$WebViewOverlayProvider; +HSPLandroid/view/ThreadedRenderer;->updateViewTreeDisplayList(Landroid/view/View;)V +HSPLandroid/view/ThreadedRenderer;->updateWebViewOverlayCallbacks()V HSPLandroid/view/TouchDelegate;->(Landroid/graphics/Rect;Landroid/view/View;)V HSPLandroid/view/VelocityTracker;->(I)V HSPLandroid/view/VelocityTracker;->addMovement(Landroid/view/MotionEvent;)V @@ -16991,7 +16876,7 @@ HSPLandroid/view/View$$ExternalSyntheticLambda7;->run()V HSPLandroid/view/View$12;->get(Landroid/view/View;)Ljava/lang/Float; HSPLandroid/view/View$12;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/view/View$12;->setValue(Landroid/view/View;F)V -HSPLandroid/view/View$12;->setValue(Ljava/lang/Object;F)V+]Landroid/view/View$12;Landroid/view/View$12; +HSPLandroid/view/View$12;->setValue(Ljava/lang/Object;F)V HSPLandroid/view/View$13;->get(Landroid/view/View;)Ljava/lang/Float; HSPLandroid/view/View$13;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLandroid/view/View$13;->setValue(Landroid/view/View;F)V @@ -17045,15 +16930,15 @@ HSPLandroid/view/View$MeasureSpec;->makeMeasureSpec(II)I HSPLandroid/view/View$MeasureSpec;->makeSafeMeasureSpec(II)I HSPLandroid/view/View$PerformClick;->run()V HSPLandroid/view/View$ScrollabilityCache;->(Landroid/view/ViewConfiguration;Landroid/view/View;)V -HSPLandroid/view/View$ScrollabilityCache;->run()V+]Landroid/graphics/Interpolator;Landroid/graphics/Interpolator;]Landroid/view/View;missing_types +HSPLandroid/view/View$ScrollabilityCache;->run()V HSPLandroid/view/View$TintInfo;->()V HSPLandroid/view/View$TransformationInfo;->()V HSPLandroid/view/View$UnsetPressedState;->run()V HSPLandroid/view/View$VisibilityChangeForAutofillHandler;->handleMessage(Landroid/os/Message;)V -HSPLandroid/view/View;->(Landroid/content/Context;)V+]Landroid/view/View;missing_types]Ljava/lang/Object;missing_types]Landroid/content/Context;missing_types]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Ljava/lang/Class;Ljava/lang/Class; +HSPLandroid/view/View;->(Landroid/content/Context;)V HSPLandroid/view/View;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/view/View;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLandroid/view/View;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/view/View;missing_types]Landroid/content/Context;missing_types]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/view/View;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;I)V HSPLandroid/view/View;->addFocusables(Ljava/util/ArrayList;II)V HSPLandroid/view/View;->addFrameMetricsListener(Landroid/view/Window;Landroid/view/Window$OnFrameMetricsAvailableListener;Landroid/os/Handler;)V @@ -17069,7 +16954,7 @@ HSPLandroid/view/View;->applyLegacyAnimation(Landroid/view/ViewGroup;JLandroid/v HSPLandroid/view/View;->areDrawablesResolved()Z HSPLandroid/view/View;->assignParent(Landroid/view/ViewParent;)V HSPLandroid/view/View;->awakenScrollBars()Z -HSPLandroid/view/View;->awakenScrollBars(IZ)Z+]Landroid/os/Handler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/view/View;Landroid/widget/ImageView;,Landroid/widget/TextView;,Landroid/widget/LinearLayout; +HSPLandroid/view/View;->awakenScrollBars(IZ)Z HSPLandroid/view/View;->bringToFront()V HSPLandroid/view/View;->buildDrawingCache(Z)V HSPLandroid/view/View;->buildDrawingCacheImpl(Z)V @@ -17079,8 +16964,8 @@ HSPLandroid/view/View;->calculateIsImportantForContentCapture()Z HSPLandroid/view/View;->canHaveDisplayList()Z HSPLandroid/view/View;->canNotifyAutofillEnterExitEvent()Z HSPLandroid/view/View;->canReceivePointerEvents()Z -HSPLandroid/view/View;->canResolveLayoutDirection()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types -HSPLandroid/view/View;->canResolveTextDirection()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types +HSPLandroid/view/View;->canResolveLayoutDirection()Z +HSPLandroid/view/View;->canResolveTextDirection()Z HSPLandroid/view/View;->canScrollHorizontally(I)Z HSPLandroid/view/View;->canScrollVertically(I)Z HSPLandroid/view/View;->canTakeFocus()Z @@ -17110,18 +16995,18 @@ HSPLandroid/view/View;->computeHorizontalScrollRange()I HSPLandroid/view/View;->computeOpaqueFlags()V HSPLandroid/view/View;->computeScroll()V HSPLandroid/view/View;->computeSystemWindowInsets(Landroid/view/WindowInsets;Landroid/graphics/Rect;)Landroid/view/WindowInsets; -HSPLandroid/view/View;->computeVerticalScrollExtent()I+]Landroid/view/View;missing_types +HSPLandroid/view/View;->computeVerticalScrollExtent()I HSPLandroid/view/View;->computeVerticalScrollOffset()I -HSPLandroid/view/View;->computeVerticalScrollRange()I+]Landroid/view/View;missing_types +HSPLandroid/view/View;->computeVerticalScrollRange()I HSPLandroid/view/View;->damageInParent()V HSPLandroid/view/View;->destroyDrawingCache()V HSPLandroid/view/View;->destroyHardwareResources()V HSPLandroid/view/View;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -HSPLandroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/View;missing_types]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator; +HSPLandroid/view/View;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V HSPLandroid/view/View;->dispatchCancelPendingInputEvents()V -HSPLandroid/view/View;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V+]Landroid/view/View;missing_types +HSPLandroid/view/View;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V HSPLandroid/view/View;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V -HSPLandroid/view/View;->dispatchDetachedFromWindow()V+]Landroid/view/View;missing_types]Ljava/util/List;Ljava/util/Collections$EmptyList;]Landroid/view/ImeFocusController;Landroid/view/ImeFocusController;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/View;->dispatchDetachedFromWindow()V HSPLandroid/view/View;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLandroid/view/View;->dispatchDrawableHotspotChanged(FF)V HSPLandroid/view/View;->dispatchFinishTemporaryDetach()V @@ -17145,20 +17030,20 @@ HSPLandroid/view/View;->dispatchSetSelected(Z)V HSPLandroid/view/View;->dispatchStartTemporaryDetach()V HSPLandroid/view/View;->dispatchSystemUiVisibilityChanged(I)V HSPLandroid/view/View;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z -HSPLandroid/view/View;->dispatchVisibilityAggregated(Z)Z+]Landroid/view/View;missing_types +HSPLandroid/view/View;->dispatchVisibilityAggregated(Z)Z HSPLandroid/view/View;->dispatchVisibilityChanged(Landroid/view/View;I)V HSPLandroid/view/View;->dispatchWindowFocusChanged(Z)V HSPLandroid/view/View;->dispatchWindowInsetsAnimationEnd(Landroid/view/WindowInsetsAnimation;)V HSPLandroid/view/View;->dispatchWindowSystemUiVisiblityChanged(I)V HSPLandroid/view/View;->dispatchWindowVisibilityChanged(I)V -HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;Landroid/view/ViewGroup;J)Z+]Landroid/view/View;missing_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/view/ViewGroup;Landroid/widget/FrameLayout;]Landroid/view/animation/Transformation;Landroid/view/animation/Transformation;]Landroid/view/animation/Animation;Landroid/view/animation/TranslateAnimation;,Landroid/view/animation/AlphaAnimation; -HSPLandroid/view/View;->drawAutofilledHighlight(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->drawBackground(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;)V +HSPLandroid/view/View;->draw(Landroid/graphics/Canvas;Landroid/view/ViewGroup;J)Z +HSPLandroid/view/View;->drawAutofilledHighlight(Landroid/graphics/Canvas;)V +HSPLandroid/view/View;->drawBackground(Landroid/graphics/Canvas;)V HSPLandroid/view/View;->drawDefaultFocusHighlight(Landroid/graphics/Canvas;)V HSPLandroid/view/View;->drawableHotspotChanged(FF)V -HSPLandroid/view/View;->drawableStateChanged()V+]Landroid/animation/StateListAnimator;Landroid/animation/StateListAnimator;]Landroid/view/View;missing_types]Landroid/graphics/drawable/Drawable;Landroid/widget/ScrollBarDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/StateListDrawable;,Landroid/graphics/drawable/ColorDrawable; -HSPLandroid/view/View;->drawsWithRenderNode(Landroid/graphics/Canvas;)Z+]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/view/View;->drawableStateChanged()V +HSPLandroid/view/View;->drawsWithRenderNode(Landroid/graphics/Canvas;)Z HSPLandroid/view/View;->ensureTransformationInfo()V HSPLandroid/view/View;->findAccessibilityFocusHost(Z)Landroid/view/View; HSPLandroid/view/View;->findFocus()Landroid/view/View; @@ -17202,8 +17087,8 @@ HSPLandroid/view/View;->getContentDescription()Ljava/lang/CharSequence; HSPLandroid/view/View;->getContext()Landroid/content/Context; HSPLandroid/view/View;->getDefaultSize(II)I HSPLandroid/view/View;->getDisplay()Landroid/view/Display; -HSPLandroid/view/View;->getDrawableRenderNode(Landroid/graphics/drawable/Drawable;Landroid/graphics/RenderNode;)Landroid/graphics/RenderNode;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/drawable/Drawable;missing_types]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class; -HSPLandroid/view/View;->getDrawableState()[I+]Landroid/view/View;missing_types +HSPLandroid/view/View;->getDrawableRenderNode(Landroid/graphics/drawable/Drawable;Landroid/graphics/RenderNode;)Landroid/graphics/RenderNode; +HSPLandroid/view/View;->getDrawableState()[I HSPLandroid/view/View;->getDrawingCache(Z)Landroid/graphics/Bitmap; HSPLandroid/view/View;->getDrawingRect(Landroid/graphics/Rect;)V HSPLandroid/view/View;->getDrawingTime()J @@ -17219,7 +17104,7 @@ HSPLandroid/view/View;->getForegroundGravity()I HSPLandroid/view/View;->getGlobalVisibleRect(Landroid/graphics/Rect;)Z HSPLandroid/view/View;->getGlobalVisibleRect(Landroid/graphics/Rect;Landroid/graphics/Point;)Z HSPLandroid/view/View;->getHandler()Landroid/os/Handler; -HSPLandroid/view/View;->getHasOverlappingRendering()Z+]Landroid/view/View;missing_types +HSPLandroid/view/View;->getHasOverlappingRendering()Z HSPLandroid/view/View;->getHeight()I HSPLandroid/view/View;->getHitRect(Landroid/graphics/Rect;)V HSPLandroid/view/View;->getHorizontalFadingEdgeLength()I @@ -17232,16 +17117,16 @@ HSPLandroid/view/View;->getImportantForContentCapture()I HSPLandroid/view/View;->getInverseMatrix()Landroid/graphics/Matrix; HSPLandroid/view/View;->getKeyDispatcherState()Landroid/view/KeyEvent$DispatcherState; HSPLandroid/view/View;->getLayerType()I -HSPLandroid/view/View;->getLayoutDirection()I+]Landroid/view/View;missing_types]Landroid/content/Context;missing_types +HSPLandroid/view/View;->getLayoutDirection()I HSPLandroid/view/View;->getLayoutParams()Landroid/view/ViewGroup$LayoutParams; HSPLandroid/view/View;->getLeft()I HSPLandroid/view/View;->getListenerInfo()Landroid/view/View$ListenerInfo; HSPLandroid/view/View;->getLocalVisibleRect(Landroid/graphics/Rect;)Z HSPLandroid/view/View;->getLocationInSurface([I)V -HSPLandroid/view/View;->getLocationInWindow([I)V+]Landroid/view/View;missing_types +HSPLandroid/view/View;->getLocationInWindow([I)V HSPLandroid/view/View;->getLocationOnScreen()[I -HSPLandroid/view/View;->getLocationOnScreen([I)V+]Landroid/view/View;missing_types]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; -HSPLandroid/view/View;->getMatrix()Landroid/graphics/Matrix;+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->getLocationOnScreen([I)V +HSPLandroid/view/View;->getMatrix()Landroid/graphics/Matrix; HSPLandroid/view/View;->getMeasuredHeight()I HSPLandroid/view/View;->getMeasuredState()I HSPLandroid/view/View;->getMeasuredWidth()I @@ -17273,15 +17158,15 @@ HSPLandroid/view/View;->getRotation()F HSPLandroid/view/View;->getRotationX()F HSPLandroid/view/View;->getRotationY()F HSPLandroid/view/View;->getRunQueue()Landroid/view/HandlerActionQueue; -HSPLandroid/view/View;->getScaleX()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; -HSPLandroid/view/View;->getScaleY()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->getScaleX()F +HSPLandroid/view/View;->getScaleY()F HSPLandroid/view/View;->getScrollX()I HSPLandroid/view/View;->getScrollY()I HSPLandroid/view/View;->getSolidColor()I HSPLandroid/view/View;->getStateListAnimator()Landroid/animation/StateListAnimator; -HSPLandroid/view/View;->getStraightVerticalScrollBarBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->getSuggestedMinimumHeight()I+]Landroid/graphics/drawable/Drawable;missing_types -HSPLandroid/view/View;->getSuggestedMinimumWidth()I+]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/view/View;->getStraightVerticalScrollBarBounds(Landroid/graphics/Rect;Landroid/graphics/Rect;)V +HSPLandroid/view/View;->getSuggestedMinimumHeight()I +HSPLandroid/view/View;->getSuggestedMinimumWidth()I HSPLandroid/view/View;->getSystemGestureExclusionRects()Ljava/util/List; HSPLandroid/view/View;->getSystemUiVisibility()I HSPLandroid/view/View;->getTag()Ljava/lang/Object; @@ -17293,10 +17178,10 @@ HSPLandroid/view/View;->getTop()I HSPLandroid/view/View;->getTransitionAlpha()F HSPLandroid/view/View;->getTransitionName()Ljava/lang/String; HSPLandroid/view/View;->getTranslationX()F -HSPLandroid/view/View;->getTranslationY()F+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->getTranslationY()F HSPLandroid/view/View;->getTranslationZ()F HSPLandroid/view/View;->getVerticalFadingEdgeLength()I -HSPLandroid/view/View;->getVerticalScrollbarWidth()I+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable; +HSPLandroid/view/View;->getVerticalScrollbarWidth()I HSPLandroid/view/View;->getViewRootImpl()Landroid/view/ViewRootImpl; HSPLandroid/view/View;->getViewTranslationCallback()Landroid/view/translation/ViewTranslationCallback; HSPLandroid/view/View;->getViewTreeObserver()Landroid/view/ViewTreeObserver; @@ -17304,7 +17189,7 @@ HSPLandroid/view/View;->getVisibility()I HSPLandroid/view/View;->getWidth()I HSPLandroid/view/View;->getWindowAttachCount()I HSPLandroid/view/View;->getWindowId()Landroid/view/WindowId; -HSPLandroid/view/View;->getWindowInsetsController()Landroid/view/WindowInsetsController;+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/View;->getWindowInsetsController()Landroid/view/WindowInsetsController; HSPLandroid/view/View;->getWindowSystemUiVisibility()I HSPLandroid/view/View;->getWindowToken()Landroid/os/IBinder; HSPLandroid/view/View;->getWindowVisibility()I @@ -17320,7 +17205,7 @@ HSPLandroid/view/View;->hasExplicitFocusable()Z HSPLandroid/view/View;->hasFocus()Z HSPLandroid/view/View;->hasFocusable()Z HSPLandroid/view/View;->hasFocusable(ZZ)Z -HSPLandroid/view/View;->hasIdentityMatrix()Z+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->hasIdentityMatrix()Z HSPLandroid/view/View;->hasImeFocus()Z HSPLandroid/view/View;->hasListenersForAccessibility()Z HSPLandroid/view/View;->hasNestedScrollingParent()Z @@ -17339,17 +17224,17 @@ HSPLandroid/view/View;->includeForAccessibility()Z HSPLandroid/view/View;->includeForAccessibility(Z)Z HSPLandroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View; HSPLandroid/view/View;->initScrollCache()V -HSPLandroid/view/View;->initialAwakenScrollBars()Z+]Landroid/view/View;Landroid/widget/ScrollView; +HSPLandroid/view/View;->initialAwakenScrollBars()Z HSPLandroid/view/View;->initializeFadingEdgeInternal(Landroid/content/res/TypedArray;)V HSPLandroid/view/View;->initializeScrollIndicatorsInternal()V HSPLandroid/view/View;->initializeScrollbarsInternal(Landroid/content/res/TypedArray;)V HSPLandroid/view/View;->internalSetPadding(IIII)V -HSPLandroid/view/View;->invalidate()V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->invalidate(IIII)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->invalidate(Landroid/graphics/Rect;)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->invalidate(Z)V+]Landroid/view/View;missing_types -HSPLandroid/view/View;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/view/View;missing_types]Landroid/graphics/drawable/Drawable;missing_types -HSPLandroid/view/View;->invalidateInternal(IIIIZZ)V+]Landroid/view/View;megamorphic_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;missing_types]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/view/View;->invalidate()V +HSPLandroid/view/View;->invalidate(IIII)V +HSPLandroid/view/View;->invalidate(Landroid/graphics/Rect;)V +HSPLandroid/view/View;->invalidate(Z)V +HSPLandroid/view/View;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroid/view/View;->invalidateInternal(IIIIZZ)V HSPLandroid/view/View;->invalidateOutline()V HSPLandroid/view/View;->invalidateParentCaches()V HSPLandroid/view/View;->invalidateParentIfNeeded()V @@ -17363,7 +17248,7 @@ HSPLandroid/view/View;->isActivated()Z HSPLandroid/view/View;->isAggregatedVisible()Z HSPLandroid/view/View;->isAttachedToWindow()Z HSPLandroid/view/View;->isAutoHandwritingEnabled()Z -HSPLandroid/view/View;->isAutofillable()Z+]Landroid/view/View;missing_types]Landroid/view/autofill/AutofillManager;Landroid/view/autofill/AutofillManager; +HSPLandroid/view/View;->isAutofillable()Z HSPLandroid/view/View;->isAutofilled()Z HSPLandroid/view/View;->isClickable()Z HSPLandroid/view/View;->isContextClickable()Z @@ -17381,7 +17266,7 @@ HSPLandroid/view/View;->isHardwareAccelerated()Z HSPLandroid/view/View;->isHorizontalFadingEdgeEnabled()Z HSPLandroid/view/View;->isHorizontalScrollBarEnabled()Z HSPLandroid/view/View;->isImportantForAccessibility()Z -HSPLandroid/view/View;->isImportantForAutofill()Z+]Landroid/view/View;missing_types]Landroid/view/ViewParent;missing_types +HSPLandroid/view/View;->isImportantForAutofill()Z HSPLandroid/view/View;->isImportantForContentCapture()Z HSPLandroid/view/View;->isInEditMode()Z HSPLandroid/view/View;->isInLayout()Z @@ -17391,10 +17276,10 @@ HSPLandroid/view/View;->isKeyboardNavigationCluster()Z HSPLandroid/view/View;->isLaidOut()Z HSPLandroid/view/View;->isLayoutDirectionInherited()Z HSPLandroid/view/View;->isLayoutDirectionResolved()Z -HSPLandroid/view/View;->isLayoutModeOptical(Ljava/lang/Object;)Z+]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/View;->isLayoutModeOptical(Ljava/lang/Object;)Z HSPLandroid/view/View;->isLayoutRequested()Z HSPLandroid/view/View;->isLayoutRtl()Z -HSPLandroid/view/View;->isLayoutValid()Z+]Landroid/view/View;missing_types +HSPLandroid/view/View;->isLayoutValid()Z HSPLandroid/view/View;->isLongClickable()Z HSPLandroid/view/View;->isNestedScrollingEnabled()Z HSPLandroid/view/View;->isOpaque()Z @@ -17419,12 +17304,12 @@ HSPLandroid/view/View;->isViewIdGenerated(I)Z HSPLandroid/view/View;->isVisibleToUser()Z HSPLandroid/view/View;->isVisibleToUser(Landroid/graphics/Rect;)Z HSPLandroid/view/View;->jumpDrawablesToCurrentState()V -HSPLandroid/view/View;->layout(IIII)V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/View;->layout(IIII)V HSPLandroid/view/View;->makeFrameworkOptionalFitsSystemWindows()V HSPLandroid/view/View;->makeOptionalFitsSystemWindows()V HSPLandroid/view/View;->mapRectFromViewToScreenCoords(Landroid/graphics/RectF;Z)V HSPLandroid/view/View;->mapRectFromViewToWindowCoords(Landroid/graphics/RectF;Z)V -HSPLandroid/view/View;->measure(II)V+]Landroid/view/View;megamorphic_types]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray; +HSPLandroid/view/View;->measure(II)V HSPLandroid/view/View;->mergeDrawableStates([I[I)[I HSPLandroid/view/View;->needGlobalAttributesUpdate(Z)V HSPLandroid/view/View;->needRtlPropertiesResolution()Z @@ -17441,21 +17326,21 @@ HSPLandroid/view/View;->onAnimationEnd()V HSPLandroid/view/View;->onAnimationStart()V HSPLandroid/view/View;->onApplyFrameworkOptionalFitSystemWindows(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroid/view/View;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; -HSPLandroid/view/View;->onAttachedToWindow()V+]Landroid/view/accessibility/AccessibilityNodeIdManager;Landroid/view/accessibility/AccessibilityNodeIdManager;]Landroid/view/View;missing_types +HSPLandroid/view/View;->onAttachedToWindow()V HSPLandroid/view/View;->onCancelPendingInputEvents()V HSPLandroid/view/View;->onCheckIsTextEditor()Z HSPLandroid/view/View;->onCloseSystemDialogs(Ljava/lang/String;)V HSPLandroid/view/View;->onConfigurationChanged(Landroid/content/res/Configuration;)V -HSPLandroid/view/View;->onCreateDrawableState(I)[I+]Landroid/view/View;missing_types +HSPLandroid/view/View;->onCreateDrawableState(I)[I HSPLandroid/view/View;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroid/view/View;->onDetachedFromWindow()V -HSPLandroid/view/View;->onDetachedFromWindowInternal()V+]Landroid/view/accessibility/AccessibilityNodeIdManager;Landroid/view/accessibility/AccessibilityNodeIdManager;]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->onDetachedFromWindowInternal()V HSPLandroid/view/View;->onDraw(Landroid/graphics/Canvas;)V -HSPLandroid/view/View;->onDrawForeground(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types +HSPLandroid/view/View;->onDrawForeground(Landroid/graphics/Canvas;)V HSPLandroid/view/View;->onDrawHorizontalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V -HSPLandroid/view/View;->onDrawScrollBars(Landroid/graphics/Canvas;)V+]Landroid/graphics/Interpolator;Landroid/graphics/Interpolator;]Landroid/view/View;missing_types]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable; +HSPLandroid/view/View;->onDrawScrollBars(Landroid/graphics/Canvas;)V HSPLandroid/view/View;->onDrawScrollIndicators(Landroid/graphics/Canvas;)V -HSPLandroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V+]Landroid/graphics/drawable/Drawable;Landroid/widget/ScrollBarDrawable; +HSPLandroid/view/View;->onDrawVerticalScrollBar(Landroid/graphics/Canvas;Landroid/graphics/drawable/Drawable;IIII)V HSPLandroid/view/View;->onFilterTouchEventForSecurity(Landroid/view/MotionEvent;)Z HSPLandroid/view/View;->onFinishInflate()V HSPLandroid/view/View;->onFinishTemporaryDetach()V @@ -17465,7 +17350,7 @@ HSPLandroid/view/View;->onKeyDown(ILandroid/view/KeyEvent;)Z HSPLandroid/view/View;->onKeyPreIme(ILandroid/view/KeyEvent;)Z HSPLandroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z HSPLandroid/view/View;->onLayout(ZIIII)V -HSPLandroid/view/View;->onMeasure(II)V+]Landroid/view/View;missing_types +HSPLandroid/view/View;->onMeasure(II)V HSPLandroid/view/View;->onProvideAutofillStructure(Landroid/view/ViewStructure;I)V HSPLandroid/view/View;->onProvideAutofillVirtualStructure(Landroid/view/ViewStructure;I)V HSPLandroid/view/View;->onProvideContentCaptureStructure(Landroid/view/ViewStructure;I)V @@ -17480,7 +17365,7 @@ HSPLandroid/view/View;->onSetAlpha(I)Z HSPLandroid/view/View;->onSizeChanged(IIII)V HSPLandroid/view/View;->onStartTemporaryDetach()V HSPLandroid/view/View;->onTouchEvent(Landroid/view/MotionEvent;)Z -HSPLandroid/view/View;->onVisibilityAggregated(Z)V+]Landroid/view/View;megamorphic_types]Ljava/util/List;Ljava/util/Collections$EmptyList;,Ljava/util/ArrayList;]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/view/View;->onVisibilityAggregated(Z)V HSPLandroid/view/View;->onVisibilityChanged(Landroid/view/View;I)V HSPLandroid/view/View;->onWindowFocusChanged(Z)V HSPLandroid/view/View;->onWindowSystemUiVisibilityChanged(I)V @@ -17501,12 +17386,12 @@ HSPLandroid/view/View;->post(Ljava/lang/Runnable;)Z HSPLandroid/view/View;->postDelayed(Ljava/lang/Runnable;J)Z HSPLandroid/view/View;->postInvalidate()V HSPLandroid/view/View;->postInvalidateDelayed(J)V -HSPLandroid/view/View;->postInvalidateOnAnimation()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/View;->postInvalidateOnAnimation()V HSPLandroid/view/View;->postOnAnimation(Ljava/lang/Runnable;)V HSPLandroid/view/View;->postOnAnimationDelayed(Ljava/lang/Runnable;J)V HSPLandroid/view/View;->postSendViewScrolledAccessibilityEventCallback(II)V HSPLandroid/view/View;->postUpdate(Ljava/lang/Runnable;)V -HSPLandroid/view/View;->rebuildOutline()V+]Landroid/view/ViewOutlineProvider;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/Outline;Landroid/graphics/Outline; +HSPLandroid/view/View;->rebuildOutline()V HSPLandroid/view/View;->recomputePadding()V HSPLandroid/view/View;->refreshDrawableState()V HSPLandroid/view/View;->registerPendingFrameMetricsObservers()V @@ -17524,7 +17409,7 @@ HSPLandroid/view/View;->requestFocus()Z HSPLandroid/view/View;->requestFocus(I)Z HSPLandroid/view/View;->requestFocus(ILandroid/graphics/Rect;)Z HSPLandroid/view/View;->requestFocusNoSearch(ILandroid/graphics/Rect;)Z -HSPLandroid/view/View;->requestLayout()V+]Landroid/view/View;missing_types]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;]Landroid/view/ViewParent;missing_types +HSPLandroid/view/View;->requestLayout()V HSPLandroid/view/View;->requestRectangleOnScreen(Landroid/graphics/Rect;)Z HSPLandroid/view/View;->requestRectangleOnScreen(Landroid/graphics/Rect;Z)Z HSPLandroid/view/View;->requireViewById(I)Landroid/view/View; @@ -17541,9 +17426,9 @@ HSPLandroid/view/View;->resetRtlProperties()V HSPLandroid/view/View;->resetSubtreeAccessibilityStateChanged()V HSPLandroid/view/View;->resolveDrawables()V HSPLandroid/view/View;->resolveLayoutDirection()Z -HSPLandroid/view/View;->resolveLayoutParams()V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup$LayoutParams;missing_types -HSPLandroid/view/View;->resolvePadding()V+]Landroid/view/View;missing_types]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/ColorDrawable; -HSPLandroid/view/View;->resolveRtlPropertiesIfNeeded()Z+]Landroid/view/View;missing_types +HSPLandroid/view/View;->resolveLayoutParams()V +HSPLandroid/view/View;->resolvePadding()V +HSPLandroid/view/View;->resolveRtlPropertiesIfNeeded()Z HSPLandroid/view/View;->resolveSize(II)I HSPLandroid/view/View;->resolveSizeAndState(III)I HSPLandroid/view/View;->resolveTextAlignment()Z @@ -17574,10 +17459,10 @@ HSPLandroid/view/View;->setAnimation(Landroid/view/animation/Animation;)V HSPLandroid/view/View;->setAutoHandwritingEnabled(Z)V HSPLandroid/view/View;->setAutofilled(ZZ)V HSPLandroid/view/View;->setBackground(Landroid/graphics/drawable/Drawable;)V -HSPLandroid/view/View;->setBackgroundBounds()V+]Landroid/graphics/drawable/Drawable;missing_types +HSPLandroid/view/View;->setBackgroundBounds()V HSPLandroid/view/View;->setBackgroundColor(I)V -HSPLandroid/view/View;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/view/View;missing_types]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/ColorDrawable; -HSPLandroid/view/View;->setBackgroundRenderNodeProperties(Landroid/graphics/RenderNode;)V+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroid/view/View;->setBackgroundRenderNodeProperties(Landroid/graphics/RenderNode;)V HSPLandroid/view/View;->setBackgroundResource(I)V HSPLandroid/view/View;->setBackgroundTintList(Landroid/content/res/ColorStateList;)V HSPLandroid/view/View;->setBottom(I)V @@ -17587,18 +17472,18 @@ HSPLandroid/view/View;->setClipToOutline(Z)V HSPLandroid/view/View;->setContentDescription(Ljava/lang/CharSequence;)V HSPLandroid/view/View;->setDefaultFocusHighlightEnabled(Z)V HSPLandroid/view/View;->setDetached(Z)V -HSPLandroid/view/View;->setDisplayListProperties(Landroid/graphics/RenderNode;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->setDisplayListProperties(Landroid/graphics/RenderNode;)V HSPLandroid/view/View;->setDrawingCacheEnabled(Z)V HSPLandroid/view/View;->setElevation(F)V HSPLandroid/view/View;->setEnabled(Z)V HSPLandroid/view/View;->setFitsSystemWindows(Z)V -HSPLandroid/view/View;->setFlags(II)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/ViewParent;missing_types +HSPLandroid/view/View;->setFlags(II)V HSPLandroid/view/View;->setFocusable(I)V HSPLandroid/view/View;->setFocusable(Z)V HSPLandroid/view/View;->setFocusableInTouchMode(Z)V HSPLandroid/view/View;->setForeground(Landroid/graphics/drawable/Drawable;)V HSPLandroid/view/View;->setForegroundGravity(I)V -HSPLandroid/view/View;->setFrame(IIII)Z+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->setFrame(IIII)Z HSPLandroid/view/View;->setHandwritingArea(Landroid/graphics/Rect;)V HSPLandroid/view/View;->setHapticFeedbackEnabled(Z)V HSPLandroid/view/View;->setHasTransientState(Z)V @@ -17615,7 +17500,7 @@ HSPLandroid/view/View;->setKeyedTag(ILjava/lang/Object;)V HSPLandroid/view/View;->setLayerPaint(Landroid/graphics/Paint;)V HSPLandroid/view/View;->setLayerType(ILandroid/graphics/Paint;)V HSPLandroid/view/View;->setLayoutDirection(I)V -HSPLandroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;Lcom/android/internal/policy/DecorView; +HSPLandroid/view/View;->setLayoutParams(Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/View;->setLeft(I)V HSPLandroid/view/View;->setLeftTopRightBottom(IIII)V HSPLandroid/view/View;->setLongClickable(Z)V @@ -17653,8 +17538,8 @@ HSPLandroid/view/View;->setRotationX(F)V HSPLandroid/view/View;->setRotationY(F)V HSPLandroid/view/View;->setSaveEnabled(Z)V HSPLandroid/view/View;->setSaveFromParentEnabled(Z)V -HSPLandroid/view/View;->setScaleX(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; -HSPLandroid/view/View;->setScaleY(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->setScaleX(F)V +HSPLandroid/view/View;->setScaleY(F)V HSPLandroid/view/View;->setScrollContainer(Z)V HSPLandroid/view/View;->setScrollIndicators(II)V HSPLandroid/view/View;->setScrollX(I)V @@ -17677,25 +17562,25 @@ HSPLandroid/view/View;->setTransitionName(Ljava/lang/String;)V HSPLandroid/view/View;->setTransitionVisibility(I)V HSPLandroid/view/View;->setTranslationX(F)V HSPLandroid/view/View;->setTranslationY(F)V -HSPLandroid/view/View;->setTranslationZ(F)V+]Landroid/view/View;missing_types]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->setTranslationZ(F)V HSPLandroid/view/View;->setVerticalScrollBarEnabled(Z)V HSPLandroid/view/View;->setVisibility(I)V HSPLandroid/view/View;->setWillNotDraw(Z)V HSPLandroid/view/View;->setX(F)V HSPLandroid/view/View;->setY(F)V -HSPLandroid/view/View;->shouldDrawRoundScrollbar()Z+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/Configuration;Landroid/content/res/Configuration; +HSPLandroid/view/View;->shouldDrawRoundScrollbar()Z HSPLandroid/view/View;->sizeChange(IIII)V -HSPLandroid/view/View;->skipInvalidate()Z+]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/View;->skipInvalidate()Z HSPLandroid/view/View;->startAnimation(Landroid/view/animation/Animation;)V HSPLandroid/view/View;->startNestedScroll(I)Z HSPLandroid/view/View;->stopNestedScroll()V HSPLandroid/view/View;->switchDefaultFocusHighlight()V HSPLandroid/view/View;->toString()Ljava/lang/String; -HSPLandroid/view/View;->transformFromViewToWindowSpace([I)V+]Landroid/view/View;missing_types +HSPLandroid/view/View;->transformFromViewToWindowSpace([I)V HSPLandroid/view/View;->unFocus(Landroid/view/View;)V HSPLandroid/view/View;->unscheduleDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/view/View;->unscheduleDrawable(Landroid/graphics/drawable/Drawable;Ljava/lang/Runnable;)V -HSPLandroid/view/View;->updateDisplayListIfDirty()Landroid/graphics/RenderNode;+]Landroid/view/View;megamorphic_types]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/view/View;->updateDisplayListIfDirty()Landroid/graphics/RenderNode; HSPLandroid/view/View;->updateFocusedInCluster(Landroid/view/View;I)V HSPLandroid/view/View;->updateHandwritingArea()V HSPLandroid/view/View;->updateKeepClearRects()V @@ -17708,7 +17593,6 @@ HSPLandroid/view/View;->verifyDrawable(Landroid/graphics/drawable/Drawable;)Z HSPLandroid/view/View;->willNotDraw()Z HSPLandroid/view/ViewAnimationHostBridge;->(Landroid/view/View;)V HSPLandroid/view/ViewAnimationHostBridge;->isAttached()Z -HSPLandroid/view/ViewAnimationHostBridge;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V HSPLandroid/view/ViewAnimationHostBridge;->registerVectorDrawableAnimator(Landroid/view/NativeVectorDrawableAnimator;)V HSPLandroid/view/ViewConfiguration;->(Landroid/content/Context;)V HSPLandroid/view/ViewConfiguration;->get(Landroid/content/Context;)Landroid/view/ViewConfiguration; @@ -17760,7 +17644,7 @@ HSPLandroid/view/ViewGroup$LayoutParams;->(Landroid/view/ViewGroup$LayoutP HSPLandroid/view/ViewGroup$LayoutParams;->resolveLayoutDirection(I)V HSPLandroid/view/ViewGroup$LayoutParams;->setBaseAttributes(Landroid/content/res/TypedArray;II)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->(II)V -HSPLandroid/view/ViewGroup$MarginLayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Landroid/view/ViewGroup$MarginLayoutParams;missing_types]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/view/ViewGroup$MarginLayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->(Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->(Landroid/view/ViewGroup$MarginLayoutParams;)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->doResolveMargins()V @@ -17768,7 +17652,7 @@ HSPLandroid/view/ViewGroup$MarginLayoutParams;->getLayoutDirection()I HSPLandroid/view/ViewGroup$MarginLayoutParams;->getMarginEnd()I HSPLandroid/view/ViewGroup$MarginLayoutParams;->getMarginStart()I HSPLandroid/view/ViewGroup$MarginLayoutParams;->isMarginRelative()Z -HSPLandroid/view/ViewGroup$MarginLayoutParams;->resolveLayoutDirection(I)V+]Landroid/view/ViewGroup$MarginLayoutParams;missing_types +HSPLandroid/view/ViewGroup$MarginLayoutParams;->resolveLayoutDirection(I)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->setLayoutDirection(I)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->setMarginEnd(I)V HSPLandroid/view/ViewGroup$MarginLayoutParams;->setMarginStart(I)V @@ -17790,7 +17674,7 @@ HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup HSPLandroid/view/ViewGroup;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/ViewGroup;->addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)Z HSPLandroid/view/ViewGroup;->addViewInLayout(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)Z -HSPLandroid/view/ViewGroup;->addViewInner(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/ViewGroup;->addViewInner(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;Z)V HSPLandroid/view/ViewGroup;->attachViewToParent(Landroid/view/View;ILandroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/ViewGroup;->bringChildToFront(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->buildOrderedChildList()Ljava/util/ArrayList; @@ -17814,14 +17698,14 @@ HSPLandroid/view/ViewGroup;->detachViewFromParent(I)V HSPLandroid/view/ViewGroup;->dispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroid/view/ViewGroup;->dispatchAttachedToWindow(Landroid/view/View$AttachInfo;I)V HSPLandroid/view/ViewGroup;->dispatchCancelPendingInputEvents()V -HSPLandroid/view/ViewGroup;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V+]Landroid/view/View;missing_types +HSPLandroid/view/ViewGroup;->dispatchCollectViewAttributes(Landroid/view/View$AttachInfo;I)V HSPLandroid/view/ViewGroup;->dispatchConfigurationChanged(Landroid/content/res/Configuration;)V HSPLandroid/view/ViewGroup;->dispatchDetachedFromWindow()V -HSPLandroid/view/ViewGroup;->dispatchDraw(Landroid/graphics/Canvas;)V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/view/ViewGroup;->dispatchDraw(Landroid/graphics/Canvas;)V HSPLandroid/view/ViewGroup;->dispatchDrawableHotspotChanged(FF)V HSPLandroid/view/ViewGroup;->dispatchFinishTemporaryDetach()V HSPLandroid/view/ViewGroup;->dispatchFreezeSelfOnly(Landroid/util/SparseArray;)V -HSPLandroid/view/ViewGroup;->dispatchGetDisplayList()V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewGroup;->dispatchGetDisplayList()V HSPLandroid/view/ViewGroup;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z HSPLandroid/view/ViewGroup;->dispatchKeyEventPreIme(Landroid/view/KeyEvent;)Z HSPLandroid/view/ViewGroup;->dispatchProvideAutofillStructure(Landroid/view/ViewStructure;I)V @@ -17835,18 +17719,18 @@ HSPLandroid/view/ViewGroup;->dispatchSetSelected(Z)V HSPLandroid/view/ViewGroup;->dispatchStartTemporaryDetach()V HSPLandroid/view/ViewGroup;->dispatchSystemUiVisibilityChanged(I)V HSPLandroid/view/ViewGroup;->dispatchThawSelfOnly(Landroid/util/SparseArray;)V -HSPLandroid/view/ViewGroup;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z+]Landroid/view/ViewGroup$TouchTarget;Landroid/view/ViewGroup$TouchTarget;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/view/MotionEvent;Landroid/view/MotionEvent; -HSPLandroid/view/ViewGroup;->dispatchTransformedTouchEvent(Landroid/view/MotionEvent;ZLandroid/view/View;I)Z+]Landroid/view/View;missing_types]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/view/ViewGroup;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z +HSPLandroid/view/ViewGroup;->dispatchTransformedTouchEvent(Landroid/view/MotionEvent;ZLandroid/view/View;I)Z HSPLandroid/view/ViewGroup;->dispatchUnhandledKeyEvent(Landroid/view/KeyEvent;)Landroid/view/View; HSPLandroid/view/ViewGroup;->dispatchViewAdded(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->dispatchViewRemoved(Landroid/view/View;)V -HSPLandroid/view/ViewGroup;->dispatchVisibilityAggregated(Z)Z+]Landroid/view/View;missing_types +HSPLandroid/view/ViewGroup;->dispatchVisibilityAggregated(Z)Z HSPLandroid/view/ViewGroup;->dispatchVisibilityChanged(Landroid/view/View;I)V HSPLandroid/view/ViewGroup;->dispatchWindowFocusChanged(Z)V HSPLandroid/view/ViewGroup;->dispatchWindowInsetsAnimationEnd(Landroid/view/WindowInsetsAnimation;)V HSPLandroid/view/ViewGroup;->dispatchWindowSystemUiVisiblityChanged(I)V HSPLandroid/view/ViewGroup;->dispatchWindowVisibilityChanged(I)V -HSPLandroid/view/ViewGroup;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z+]Landroid/view/View;missing_types +HSPLandroid/view/ViewGroup;->drawChild(Landroid/graphics/Canvas;Landroid/view/View;J)Z HSPLandroid/view/ViewGroup;->drawableStateChanged()V HSPLandroid/view/ViewGroup;->endViewTransition(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->exitHoverTargets()V @@ -17865,13 +17749,13 @@ HSPLandroid/view/ViewGroup;->generateDefaultLayoutParams()Landroid/view/ViewGrou HSPLandroid/view/ViewGroup;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/view/ViewGroup$LayoutParams; HSPLandroid/view/ViewGroup;->getAccessibilityClassName()Ljava/lang/CharSequence; HSPLandroid/view/ViewGroup;->getAndVerifyPreorderedIndex(IIZ)I -HSPLandroid/view/ViewGroup;->getAndVerifyPreorderedView(Ljava/util/ArrayList;[Landroid/view/View;I)Landroid/view/View;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewGroup;->getAndVerifyPreorderedView(Ljava/util/ArrayList;[Landroid/view/View;I)Landroid/view/View; HSPLandroid/view/ViewGroup;->getChildAt(I)Landroid/view/View; HSPLandroid/view/ViewGroup;->getChildCount()I HSPLandroid/view/ViewGroup;->getChildMeasureSpec(III)I HSPLandroid/view/ViewGroup;->getChildTransformation()Landroid/view/animation/Transformation; HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z -HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;Z)Z+]Landroid/graphics/RectF;Landroid/graphics/RectF;]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewParent;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewGroup;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;Z)Z HSPLandroid/view/ViewGroup;->getChildrenForAutofill(I)Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture; HSPLandroid/view/ViewGroup;->getChildrenForContentCapture()Landroid/view/ViewGroup$ChildListForAutoFillOrContentCapture; HSPLandroid/view/ViewGroup;->getClipChildren()Z @@ -17900,7 +17784,7 @@ HSPLandroid/view/ViewGroup;->indexOfChild(Landroid/view/View;)I HSPLandroid/view/ViewGroup;->initFromAttributes(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/view/ViewGroup;->initViewGroup()V HSPLandroid/view/ViewGroup;->internalSetPadding(IIII)V -HSPLandroid/view/ViewGroup;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V+]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/ViewGroup;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroid/view/ViewGroup;->invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent; HSPLandroid/view/ViewGroup;->isChildrenDrawingOrderEnabled()Z HSPLandroid/view/ViewGroup;->isLayoutModeOptical()Z @@ -17912,7 +17796,7 @@ HSPLandroid/view/ViewGroup;->layout(IIII)V HSPLandroid/view/ViewGroup;->makeFrameworkOptionalFitsSystemWindows()V HSPLandroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V HSPLandroid/view/ViewGroup;->measureChild(Landroid/view/View;II)V -HSPLandroid/view/ViewGroup;->measureChildWithMargins(Landroid/view/View;IIII)V+]Landroid/view/View;missing_types +HSPLandroid/view/ViewGroup;->measureChildWithMargins(Landroid/view/View;IIII)V HSPLandroid/view/ViewGroup;->measureChildren(II)V HSPLandroid/view/ViewGroup;->newDispatchApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLandroid/view/ViewGroup;->notifySubtreeAccessibilityStateChangedIfNeeded()V @@ -17921,10 +17805,10 @@ HSPLandroid/view/ViewGroup;->offsetRectBetweenParentAndChild(Landroid/view/View; HSPLandroid/view/ViewGroup;->onAttachedToWindow()V HSPLandroid/view/ViewGroup;->onChildVisibilityChanged(Landroid/view/View;II)V HSPLandroid/view/ViewGroup;->onCreateDrawableState(I)[I -HSPLandroid/view/ViewGroup;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V+]Landroid/view/ViewParent;missing_types +HSPLandroid/view/ViewGroup;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V HSPLandroid/view/ViewGroup;->onDescendantUnbufferedRequested()V HSPLandroid/view/ViewGroup;->onDetachedFromWindow()V -HSPLandroid/view/ViewGroup;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/view/ViewGroup;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HSPLandroid/view/ViewGroup;->onRequestFocusInDescendants(ILandroid/graphics/Rect;)Z HSPLandroid/view/ViewGroup;->onSetLayoutParams(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/ViewGroup;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z @@ -17933,7 +17817,7 @@ HSPLandroid/view/ViewGroup;->onViewRemoved(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->populateChildrenForAutofill(Ljava/util/ArrayList;I)V HSPLandroid/view/ViewGroup;->populateChildrenForContentCapture(Ljava/util/ArrayList;)V HSPLandroid/view/ViewGroup;->recomputeViewAttributes(Landroid/view/View;)V -HSPLandroid/view/ViewGroup;->recreateChildDisplayList(Landroid/view/View;)V+]Landroid/view/View;missing_types +HSPLandroid/view/ViewGroup;->recreateChildDisplayList(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->removeAllViews()V HSPLandroid/view/ViewGroup;->removeAllViewsInLayout()V HSPLandroid/view/ViewGroup;->removeDetachedView(Landroid/view/View;Z)V @@ -17947,7 +17831,7 @@ HSPLandroid/view/ViewGroup;->removeViewInternal(ILandroid/view/View;)V HSPLandroid/view/ViewGroup;->removeViewInternal(Landroid/view/View;)Z HSPLandroid/view/ViewGroup;->requestChildFocus(Landroid/view/View;Landroid/view/View;)V HSPLandroid/view/ViewGroup;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z -HSPLandroid/view/ViewGroup;->requestDisallowInterceptTouchEvent(Z)V+]Landroid/view/ViewParent;missing_types +HSPLandroid/view/ViewGroup;->requestDisallowInterceptTouchEvent(Z)V HSPLandroid/view/ViewGroup;->requestFocus(ILandroid/graphics/Rect;)Z HSPLandroid/view/ViewGroup;->requestTransitionStart(Landroid/animation/LayoutTransition;)V HSPLandroid/view/ViewGroup;->requestTransparentRegion(Landroid/view/View;)V @@ -17961,9 +17845,9 @@ HSPLandroid/view/ViewGroup;->resetSubtreeAccessibilityStateChanged()V HSPLandroid/view/ViewGroup;->resetTouchState()V HSPLandroid/view/ViewGroup;->resolveDrawables()V HSPLandroid/view/ViewGroup;->resolveLayoutDirection()Z -HSPLandroid/view/ViewGroup;->resolveLayoutParams()V+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/ViewGroup;->resolveLayoutParams()V HSPLandroid/view/ViewGroup;->resolvePadding()V -HSPLandroid/view/ViewGroup;->resolveRtlPropertiesIfNeeded()Z+]Landroid/view/View;missing_types]Landroid/view/ViewGroup;missing_types +HSPLandroid/view/ViewGroup;->resolveRtlPropertiesIfNeeded()Z HSPLandroid/view/ViewGroup;->resolveTextAlignment()Z HSPLandroid/view/ViewGroup;->resolveTextDirection()Z HSPLandroid/view/ViewGroup;->restoreDefaultFocus()Z @@ -17989,7 +17873,7 @@ HSPLandroid/view/ViewGroup;->unFocus(Landroid/view/View;)V HSPLandroid/view/ViewGroup;->updateLocalSystemUiVisibility(II)Z HSPLandroid/view/ViewGroupOverlay;->add(Landroid/view/View;)V HSPLandroid/view/ViewGroupOverlay;->remove(Landroid/view/View;)V -HSPLandroid/view/ViewOutlineProvider$1;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V+]Landroid/graphics/Outline;Landroid/graphics/Outline;]Landroid/graphics/drawable/Drawable;missing_types]Landroid/view/View;missing_types +HSPLandroid/view/ViewOutlineProvider$1;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V HSPLandroid/view/ViewOutlineProvider$2;->getOutline(Landroid/view/View;Landroid/graphics/Outline;)V HSPLandroid/view/ViewOutlineProvider;->()V HSPLandroid/view/ViewOverlay$OverlayViewGroup;->(Landroid/content/Context;Landroid/view/View;)V @@ -18015,7 +17899,7 @@ HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->(Landroid/vi HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationCancel(Landroid/animation/Animator;)V HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationEnd(Landroid/animation/Animator;)V HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationStart(Landroid/animation/Animator;)V -HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V+]Ljava/util/HashMap;Ljava/util/HashMap;]Landroid/view/View;Landroid/widget/LinearLayout;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/animation/ValueAnimator;Landroid/animation/ValueAnimator; +HSPLandroid/view/ViewPropertyAnimator$AnimatorEventListener;->onAnimationUpdate(Landroid/animation/ValueAnimator;)V HSPLandroid/view/ViewPropertyAnimator$NameValuesHolder;->(IFF)V HSPLandroid/view/ViewPropertyAnimator$PropertyBundle;->(ILjava/util/ArrayList;)V HSPLandroid/view/ViewPropertyAnimator$PropertyBundle;->cancel(I)Z @@ -18039,7 +17923,6 @@ HSPLandroid/view/ViewPropertyAnimator;->translationY(F)Landroid/view/ViewPropert HSPLandroid/view/ViewPropertyAnimator;->withEndAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator; HSPLandroid/view/ViewPropertyAnimator;->withLayer()Landroid/view/ViewPropertyAnimator; HSPLandroid/view/ViewPropertyAnimator;->withStartAction(Ljava/lang/Runnable;)Landroid/view/ViewPropertyAnimator; -HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda0;->run()V HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda17;->(Landroid/view/ViewRootImpl;)V HSPLandroid/view/ViewRootImpl$$ExternalSyntheticLambda3;->run()V HSPLandroid/view/ViewRootImpl$AccessibilityInteractionConnectionManager;->(Landroid/view/ViewRootImpl;)V @@ -18062,7 +17945,7 @@ HSPLandroid/view/ViewRootImpl$ImeInputStage;->(Landroid/view/ViewRootImpl; HSPLandroid/view/ViewRootImpl$ImeInputStage;->onFinishedInputEvent(Ljava/lang/Object;Z)V HSPLandroid/view/ViewRootImpl$ImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I HSPLandroid/view/ViewRootImpl$InputMetricsListener;->(Landroid/view/ViewRootImpl;)V -HSPLandroid/view/ViewRootImpl$InputMetricsListener;->onFrameMetricsAvailable(I)V+]Landroid/view/ViewRootImpl$WindowInputEventReceiver;Landroid/view/ViewRootImpl$WindowInputEventReceiver; +HSPLandroid/view/ViewRootImpl$InputMetricsListener;->onFrameMetricsAvailable(I)V HSPLandroid/view/ViewRootImpl$InputStage;->(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;)V HSPLandroid/view/ViewRootImpl$InputStage;->apply(Landroid/view/ViewRootImpl$QueuedInputEvent;I)V HSPLandroid/view/ViewRootImpl$InputStage;->deliver(Landroid/view/ViewRootImpl$QueuedInputEvent;)V @@ -18074,10 +17957,10 @@ HSPLandroid/view/ViewRootImpl$InputStage;->onWindowFocusChanged(Z)V HSPLandroid/view/ViewRootImpl$InputStage;->shouldDropInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)Z HSPLandroid/view/ViewRootImpl$InputStage;->traceEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;J)V HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->(Landroid/view/ViewRootImpl;)V -HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->addView(Landroid/view/View;)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->postIfNeededLocked()V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->addView(Landroid/view/View;)V +HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->postIfNeededLocked()V HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->removeView(Landroid/view/View;)V -HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->run()V+]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;->run()V HSPLandroid/view/ViewRootImpl$NativePostImeInputStage;->(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V HSPLandroid/view/ViewRootImpl$NativePostImeInputStage;->onProcess(Landroid/view/ViewRootImpl$QueuedInputEvent;)I HSPLandroid/view/ViewRootImpl$NativePreImeInputStage;->(Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl$InputStage;Ljava/lang/String;)V @@ -18095,15 +17978,13 @@ HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler$JoystickAxesState;->reset HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler;->(Landroid/view/ViewRootImpl;)V HSPLandroid/view/ViewRootImpl$SyntheticJoystickHandler;->cancel()V HSPLandroid/view/ViewRootImpl$SyntheticKeyboardHandler;->(Landroid/view/ViewRootImpl;)V -HSPLandroid/view/ViewRootImpl$SyntheticTouchNavigationHandler$1;->(Landroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;)V HSPLandroid/view/ViewRootImpl$SyntheticTouchNavigationHandler;->(Landroid/view/ViewRootImpl;)V HSPLandroid/view/ViewRootImpl$SyntheticTrackballHandler;->(Landroid/view/ViewRootImpl;)V HSPLandroid/view/ViewRootImpl$SystemUiVisibilityInfo;->()V HSPLandroid/view/ViewRootImpl$TrackballAxis;->()V HSPLandroid/view/ViewRootImpl$TraversalRunnable;->(Landroid/view/ViewRootImpl;)V -HSPLandroid/view/ViewRootImpl$TraversalRunnable;->run()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl$TraversalRunnable;->run()V HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->()V -HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->(Landroid/view/ViewRootImpl$UnhandledKeyManager-IA;)V HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->dispatch(Landroid/view/View;Landroid/view/KeyEvent;)Z HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->preDispatch(Landroid/view/KeyEvent;)V HSPLandroid/view/ViewRootImpl$UnhandledKeyManager;->preViewDispatch(Landroid/view/KeyEvent;)Z @@ -18124,7 +18005,6 @@ HSPLandroid/view/ViewRootImpl$W;->(Landroid/view/ViewRootImpl;)V HSPLandroid/view/ViewRootImpl$W;->closeSystemDialogs(Ljava/lang/String;)V HSPLandroid/view/ViewRootImpl$W;->dispatchAppVisibility(Z)V HSPLandroid/view/ViewRootImpl$W;->dispatchWindowShown()V -HSPLandroid/view/ViewRootImpl$W;->insetsControlChanged(Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V HSPLandroid/view/ViewRootImpl$W;->moved(II)V HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->(Landroid/view/ViewRootImpl;Landroid/view/InputChannel;Landroid/os/Looper;)V HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->dispose()V @@ -18133,17 +18013,15 @@ HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onFocusEvent(Z)V HSPLandroid/view/ViewRootImpl$WindowInputEventReceiver;->onInputEvent(Landroid/view/InputEvent;)V HSPLandroid/view/ViewRootImpl;->-$$Nest$fgetmBlastBufferQueue(Landroid/view/ViewRootImpl;)Landroid/graphics/BLASTBufferQueue; HSPLandroid/view/ViewRootImpl;->-$$Nest$fputmProfileRendering(Landroid/view/ViewRootImpl;Z)V -HSPLandroid/view/ViewRootImpl;->-$$Nest$mdispatchInsetsControlChanged(Landroid/view/ViewRootImpl;Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V HSPLandroid/view/ViewRootImpl;->-$$Nest$mprofileRendering(Landroid/view/ViewRootImpl;Z)V HSPLandroid/view/ViewRootImpl;->(Landroid/content/Context;Landroid/view/Display;)V HSPLandroid/view/ViewRootImpl;->(Landroid/content/Context;Landroid/view/Display;Landroid/view/IWindowSession;Landroid/view/WindowLayout;)V HSPLandroid/view/ViewRootImpl;->addConfigCallback(Landroid/view/ViewRootImpl$ConfigChangedCallback;)V -HSPLandroid/view/ViewRootImpl;->addFrameCommitCallbackIfNeeded()V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->addFrameCommitCallbackIfNeeded()V HSPLandroid/view/ViewRootImpl;->addSurfaceChangedCallback(Landroid/view/ViewRootImpl$SurfaceChangedCallback;)V HSPLandroid/view/ViewRootImpl;->addWindowCallbacks(Landroid/view/WindowCallbacks;)V -HSPLandroid/view/ViewRootImpl;->adjustLayoutParamsForCompatibility(Landroid/view/WindowManager$LayoutParams;)V HSPLandroid/view/ViewRootImpl;->applyKeepScreenOnFlag(Landroid/view/WindowManager$LayoutParams;)V -HSPLandroid/view/ViewRootImpl;->applyTransactionOnDraw(Landroid/view/SurfaceControl$Transaction;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->applyTransactionOnDraw(Landroid/view/SurfaceControl$Transaction;)Z HSPLandroid/view/ViewRootImpl;->canResolveTextDirection()Z HSPLandroid/view/ViewRootImpl;->cancelInvalidate(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->checkForLeavingTouchModeAndConsume(Landroid/view/KeyEvent;)Z @@ -18152,9 +18030,9 @@ HSPLandroid/view/ViewRootImpl;->childDrawableStateChanged(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->childHasTransientStateChanged(Landroid/view/View;Z)V HSPLandroid/view/ViewRootImpl;->clearChildFocus(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->clearLowProfileModeIfNeeded(IZ)V -HSPLandroid/view/ViewRootImpl;->collectViewAttributes()Z+]Landroid/view/View;Lcom/android/internal/policy/DecorView; +HSPLandroid/view/ViewRootImpl;->collectViewAttributes()Z HSPLandroid/view/ViewRootImpl;->controlInsetsForCompatibility(Landroid/view/WindowManager$LayoutParams;)V -HSPLandroid/view/ViewRootImpl;->createSyncIfNeeded()V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/window/SurfaceSyncGroup;Landroid/window/SurfaceSyncGroup; +HSPLandroid/view/ViewRootImpl;->createSyncIfNeeded()V HSPLandroid/view/ViewRootImpl;->deliverInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V HSPLandroid/view/ViewRootImpl;->destroyHardwareRenderer()V HSPLandroid/view/ViewRootImpl;->destroyHardwareResources()V @@ -18167,21 +18045,19 @@ HSPLandroid/view/ViewRootImpl;->dispatchCheckFocus()V HSPLandroid/view/ViewRootImpl;->dispatchDetachedFromWindow()V HSPLandroid/view/ViewRootImpl;->dispatchDispatchSystemUiVisibilityChanged()V HSPLandroid/view/ViewRootImpl;->dispatchFocusEvent(ZZ)V -HSPLandroid/view/ViewRootImpl;->dispatchInsetsControlChanged(Landroid/view/InsetsState;[Landroid/view/InsetsSourceControl;)V HSPLandroid/view/ViewRootImpl;->dispatchInvalidateDelayed(Landroid/view/View;J)V -HSPLandroid/view/ViewRootImpl;->dispatchInvalidateOnAnimation(Landroid/view/View;)V+]Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable;Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable; +HSPLandroid/view/ViewRootImpl;->dispatchInvalidateOnAnimation(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->dispatchMoved(II)V HSPLandroid/view/ViewRootImpl;->doConsumeBatchedInput(J)Z HSPLandroid/view/ViewRootImpl;->doDie()V HSPLandroid/view/ViewRootImpl;->doProcessInputEvents()V -HSPLandroid/view/ViewRootImpl;->doTraversal()V+]Landroid/os/Looper;Landroid/os/Looper;]Landroid/view/ViewRootImpl$ViewRootHandler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/os/MessageQueue;Landroid/os/MessageQueue; -HSPLandroid/view/ViewRootImpl;->draw(ZLandroid/window/SurfaceSyncGroup;Z)Z+]Landroid/view/Surface;Landroid/view/Surface;]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/Choreographer;Landroid/view/Choreographer;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction; +HSPLandroid/view/ViewRootImpl;->doTraversal()V +HSPLandroid/view/ViewRootImpl;->draw(ZLandroid/window/SurfaceSyncGroup;Z)Z HSPLandroid/view/ViewRootImpl;->drawAccessibilityFocusedDrawableIfNeeded(Landroid/graphics/Canvas;)V HSPLandroid/view/ViewRootImpl;->drawSoftware(Landroid/view/Surface;Landroid/view/View$AttachInfo;IIZLandroid/graphics/Rect;Landroid/graphics/Rect;)Z HSPLandroid/view/ViewRootImpl;->enableHardwareAcceleration(Landroid/view/WindowManager$LayoutParams;)V HSPLandroid/view/ViewRootImpl;->endDragResizing()V HSPLandroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;)V -HSPLandroid/view/ViewRootImpl;->enqueueInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;IZ)V HSPLandroid/view/ViewRootImpl;->ensureTouchMode(Z)Z HSPLandroid/view/ViewRootImpl;->ensureTouchModeLocally(Z)Z HSPLandroid/view/ViewRootImpl;->enterTouchMode()Z @@ -18197,10 +18073,10 @@ HSPLandroid/view/ViewRootImpl;->getAutofillManager()Landroid/view/autofill/Autof HSPLandroid/view/ViewRootImpl;->getBufferTransformHint()I HSPLandroid/view/ViewRootImpl;->getChildVisibleRect(Landroid/view/View;Landroid/graphics/Rect;Landroid/graphics/Point;)Z HSPLandroid/view/ViewRootImpl;->getCompatWindowConfiguration()Landroid/app/WindowConfiguration; -HSPLandroid/view/ViewRootImpl;->getConfiguration()Landroid/content/res/Configuration;+]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/Context;Lcom/android/internal/policy/DecorContext; +HSPLandroid/view/ViewRootImpl;->getConfiguration()Landroid/content/res/Configuration; HSPLandroid/view/ViewRootImpl;->getDisplayId()I HSPLandroid/view/ViewRootImpl;->getHandwritingInitiator()Landroid/view/HandwritingInitiator; -HSPLandroid/view/ViewRootImpl;->getHostVisibility()I+]Landroid/view/View;Lcom/android/internal/policy/DecorView; +HSPLandroid/view/ViewRootImpl;->getHostVisibility()I HSPLandroid/view/ViewRootImpl;->getImeFocusController()Landroid/view/ImeFocusController; HSPLandroid/view/ViewRootImpl;->getImpliedSystemUiVisibility(Landroid/view/WindowManager$LayoutParams;)I HSPLandroid/view/ViewRootImpl;->getInsetsController()Landroid/view/InsetsController; @@ -18209,12 +18085,12 @@ HSPLandroid/view/ViewRootImpl;->getOnBackInvokedDispatcher()Landroid/window/Wind HSPLandroid/view/ViewRootImpl;->getOrCreateSurfaceSyncGroup()Landroid/window/SurfaceSyncGroup; HSPLandroid/view/ViewRootImpl;->getParent()Landroid/view/ViewParent; HSPLandroid/view/ViewRootImpl;->getRootMeasureSpec(III)I -HSPLandroid/view/ViewRootImpl;->getRunQueue()Landroid/view/HandlerActionQueue;+]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal; +HSPLandroid/view/ViewRootImpl;->getRunQueue()Landroid/view/HandlerActionQueue; HSPLandroid/view/ViewRootImpl;->getSurfaceControl()Landroid/view/SurfaceControl; HSPLandroid/view/ViewRootImpl;->getSurfaceSequenceId()I HSPLandroid/view/ViewRootImpl;->getTextDirection()I HSPLandroid/view/ViewRootImpl;->getTitle()Ljava/lang/CharSequence; -HSPLandroid/view/ViewRootImpl;->getUpdatedFrameInfo()Landroid/graphics/FrameInfo;+]Landroid/view/InputEventAssigner;Landroid/view/InputEventAssigner;]Landroid/view/ViewFrameInfo;Landroid/view/ViewFrameInfo; +HSPLandroid/view/ViewRootImpl;->getUpdatedFrameInfo()Landroid/graphics/FrameInfo; HSPLandroid/view/ViewRootImpl;->getValidLayoutRequesters(Ljava/util/ArrayList;Z)Ljava/util/ArrayList; HSPLandroid/view/ViewRootImpl;->getView()Landroid/view/View; HSPLandroid/view/ViewRootImpl;->getViewBoundsSandboxingEnabled()Z @@ -18226,14 +18102,14 @@ HSPLandroid/view/ViewRootImpl;->handleAppVisibility(Z)V HSPLandroid/view/ViewRootImpl;->handleContentCaptureFlush()V HSPLandroid/view/ViewRootImpl;->handleDispatchSystemUiVisibilityChanged()V HSPLandroid/view/ViewRootImpl;->handleWindowFocusChanged()V -HSPLandroid/view/ViewRootImpl;->invalidate()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->invalidate()V HSPLandroid/view/ViewRootImpl;->invalidateChild(Landroid/view/View;Landroid/graphics/Rect;)V HSPLandroid/view/ViewRootImpl;->invalidateChildInParent([ILandroid/graphics/Rect;)Landroid/view/ViewParent; HSPLandroid/view/ViewRootImpl;->invalidateRectOnScreen(Landroid/graphics/Rect;)V -HSPLandroid/view/ViewRootImpl;->isAccessibilityFocusDirty()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; +HSPLandroid/view/ViewRootImpl;->isAccessibilityFocusDirty()Z HSPLandroid/view/ViewRootImpl;->isContentCaptureEnabled()Z HSPLandroid/view/ViewRootImpl;->isContentCaptureReallyEnabled()Z -HSPLandroid/view/ViewRootImpl;->isHardwareEnabled()Z+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer; +HSPLandroid/view/ViewRootImpl;->isHardwareEnabled()Z HSPLandroid/view/ViewRootImpl;->isInLayout()Z HSPLandroid/view/ViewRootImpl;->isInTouchMode()Z HSPLandroid/view/ViewRootImpl;->isInWMSRequestedSync()Z @@ -18250,40 +18126,40 @@ HSPLandroid/view/ViewRootImpl;->loadSystemProperties()V HSPLandroid/view/ViewRootImpl;->maybeFireAccessibilityWindowStateChangedEvent()V HSPLandroid/view/ViewRootImpl;->maybeHandleWindowMove(Landroid/graphics/Rect;)V HSPLandroid/view/ViewRootImpl;->maybeUpdateTooltip(Landroid/view/MotionEvent;)V -HSPLandroid/view/ViewRootImpl;->measureHierarchy(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/content/res/Resources;IIZ)Z+]Landroid/view/View;Lcom/android/internal/policy/DecorView; -HSPLandroid/view/ViewRootImpl;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)V+]Landroid/graphics/BLASTBufferQueue;Landroid/graphics/BLASTBufferQueue; +HSPLandroid/view/ViewRootImpl;->measureHierarchy(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/content/res/Resources;IIZ)Z +HSPLandroid/view/ViewRootImpl;->mergeWithNextTransaction(Landroid/view/SurfaceControl$Transaction;J)V HSPLandroid/view/ViewRootImpl;->notifyContentCaptureEvents()V -HSPLandroid/view/ViewRootImpl;->notifyDrawStarted(Z)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewRootImpl;->notifyDrawStarted(Z)V HSPLandroid/view/ViewRootImpl;->notifyInsetsChanged()V -HSPLandroid/view/ViewRootImpl;->notifyRendererOfFramePending()V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer; +HSPLandroid/view/ViewRootImpl;->notifyRendererOfFramePending()V HSPLandroid/view/ViewRootImpl;->notifySurfaceCreated(Landroid/view/SurfaceControl$Transaction;)V HSPLandroid/view/ViewRootImpl;->notifySurfaceDestroyed()V HSPLandroid/view/ViewRootImpl;->obtainQueuedInputEvent(Landroid/view/InputEvent;Landroid/view/InputEventReceiver;I)Landroid/view/ViewRootImpl$QueuedInputEvent; -HSPLandroid/view/ViewRootImpl;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->onDescendantInvalidated(Landroid/view/View;Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->onDescendantUnbufferedRequested()V HSPLandroid/view/ViewRootImpl;->onMovedToDisplay(ILandroid/content/res/Configuration;)V HSPLandroid/view/ViewRootImpl;->onPostDraw(Landroid/graphics/RecordingCanvas;)V HSPLandroid/view/ViewRootImpl;->onPreDraw(Landroid/graphics/RecordingCanvas;)V HSPLandroid/view/ViewRootImpl;->onStartNestedScroll(Landroid/view/View;Landroid/view/View;I)Z HSPLandroid/view/ViewRootImpl;->performContentCaptureInitialReport()V -HSPLandroid/view/ViewRootImpl;->performDraw(Landroid/window/SurfaceSyncGroup;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer; -HSPLandroid/view/ViewRootImpl;->performLayout(Landroid/view/WindowManager$LayoutParams;II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Landroid/content/Context;Lcom/android/internal/policy/DecorContext;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/view/ViewRootImpl;->performMeasure(II)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView; -HSPLandroid/view/ViewRootImpl;->performTraversals()V+]Landroid/view/ViewTreeObserver;Landroid/view/ViewTreeObserver;]Landroid/view/View;missing_types]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/HandlerActionQueue;Landroid/view/HandlerActionQueue;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/Surface;Landroid/view/Surface;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ImeFocusController;Landroid/view/ImeFocusController;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext;]Lcom/android/internal/view/RootViewSurfaceTaker;Lcom/android/internal/policy/DecorView;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/window/SurfaceSyncGroup;Landroid/window/SurfaceSyncGroup;]Landroid/window/WindowOnBackInvokedDispatcher;Landroid/window/WindowOnBackInvokedDispatcher; +HSPLandroid/view/ViewRootImpl;->performDraw(Landroid/window/SurfaceSyncGroup;)Z +HSPLandroid/view/ViewRootImpl;->performLayout(Landroid/view/WindowManager$LayoutParams;II)V +HSPLandroid/view/ViewRootImpl;->performMeasure(II)V +HSPLandroid/view/ViewRootImpl;->performTraversals()V HSPLandroid/view/ViewRootImpl;->playSoundEffect(I)V HSPLandroid/view/ViewRootImpl;->pokeDrawLockIfNeeded()V -HSPLandroid/view/ViewRootImpl;->prepareSurfaces()V+]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->prepareSurfaces()V HSPLandroid/view/ViewRootImpl;->profileRendering(Z)V HSPLandroid/view/ViewRootImpl;->recomputeViewAttributes(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->recycleQueuedInputEvent(Landroid/view/ViewRootImpl$QueuedInputEvent;)V HSPLandroid/view/ViewRootImpl;->registerAnimatingRenderNode(Landroid/graphics/RenderNode;)V HSPLandroid/view/ViewRootImpl;->registerBackCallbackOnWindow()V -HSPLandroid/view/ViewRootImpl;->registerCallbackForPendingTransactions()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->registerCallbackForPendingTransactions()V HSPLandroid/view/ViewRootImpl;->registerCallbacksForSync(ZLandroid/window/SurfaceSyncGroup;)V HSPLandroid/view/ViewRootImpl;->registerCompatOnBackInvokedCallback()V HSPLandroid/view/ViewRootImpl;->registerListeners()V -HSPLandroid/view/ViewRootImpl;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V+]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer; -HSPLandroid/view/ViewRootImpl;->relayoutWindow(Landroid/view/WindowManager$LayoutParams;IZ)I+]Landroid/view/IWindowSession;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Landroid/view/HdrRenderState;Landroid/view/HdrRenderState;]Landroid/view/InsetsController;Landroid/view/InsetsController;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/Display;Landroid/view/Display; +HSPLandroid/view/ViewRootImpl;->registerRtFrameCallback(Landroid/graphics/HardwareRenderer$FrameDrawingCallback;)V +HSPLandroid/view/ViewRootImpl;->relayoutWindow(Landroid/view/WindowManager$LayoutParams;IZ)I HSPLandroid/view/ViewRootImpl;->removeSendWindowContentChangedCallback()V HSPLandroid/view/ViewRootImpl;->removeSurfaceChangedCallback(Landroid/view/ViewRootImpl$SurfaceChangedCallback;)V HSPLandroid/view/ViewRootImpl;->removeWindowCallbacks(Landroid/view/WindowCallbacks;)V @@ -18293,38 +18169,35 @@ HSPLandroid/view/ViewRootImpl;->requestChildFocus(Landroid/view/View;Landroid/vi HSPLandroid/view/ViewRootImpl;->requestChildRectangleOnScreen(Landroid/view/View;Landroid/graphics/Rect;Z)Z HSPLandroid/view/ViewRootImpl;->requestDisallowInterceptTouchEvent(Z)V HSPLandroid/view/ViewRootImpl;->requestFitSystemWindows()V -HSPLandroid/view/ViewRootImpl;->requestLayout()V+]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->requestLayout()V HSPLandroid/view/ViewRootImpl;->requestLayoutDuringLayout(Landroid/view/View;)Z HSPLandroid/view/ViewRootImpl;->requestTransparentRegion(Landroid/view/View;)V HSPLandroid/view/ViewRootImpl;->scheduleConsumeBatchedInput()V -HSPLandroid/view/ViewRootImpl;->scheduleTraversals()V+]Landroid/os/Looper;Landroid/os/Looper;]Landroid/view/ViewRootImpl$ViewRootHandler;Landroid/view/ViewRootImpl$ViewRootHandler;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLandroid/view/ViewRootImpl;->scheduleTraversals()V HSPLandroid/view/ViewRootImpl;->scrollToRectOrFocus(Landroid/graphics/Rect;Z)Z -HSPLandroid/view/ViewRootImpl;->sendBackKeyEvent(I)V HSPLandroid/view/ViewRootImpl;->setAccessibilityFocus(Landroid/view/View;Landroid/view/accessibility/AccessibilityNodeInfo;)V HSPLandroid/view/ViewRootImpl;->setAccessibilityWindowAttributesIfNeeded()V HSPLandroid/view/ViewRootImpl;->setActivityConfigCallback(Landroid/view/ViewRootImpl$ActivityConfigCallback;)V HSPLandroid/view/ViewRootImpl;->setBoundsLayerCrop(Landroid/view/SurfaceControl$Transaction;)V -HSPLandroid/view/ViewRootImpl;->setFrame(Landroid/graphics/Rect;Z)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsController;Landroid/view/InsetsController; -HSPLandroid/view/ViewRootImpl;->setLayoutParams(Landroid/view/WindowManager$LayoutParams;Z)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl; +HSPLandroid/view/ViewRootImpl;->setFrame(Landroid/graphics/Rect;Z)V +HSPLandroid/view/ViewRootImpl;->setLayoutParams(Landroid/view/WindowManager$LayoutParams;Z)V HSPLandroid/view/ViewRootImpl;->setOnContentApplyWindowInsetsListener(Landroid/view/Window$OnContentApplyWindowInsetsListener;)V HSPLandroid/view/ViewRootImpl;->setTag()V -HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;I)V+]Landroid/view/IWindowSession;Landroid/view/IWindowSession$Stub$Proxy;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/content/res/CompatibilityInfo;Landroid/content/res/CompatibilityInfo$1;]Landroid/view/ThreadedRenderer;Landroid/view/ThreadedRenderer;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Landroid/view/InsetsController;Landroid/view/InsetsController;]Landroid/view/PendingInsetsController;Landroid/view/PendingInsetsController;]Lcom/android/internal/view/RootViewSurfaceTaker;Lcom/android/internal/policy/DecorView;]Landroid/view/FallbackEventHandler;Lcom/android/internal/policy/PhoneFallbackEventHandler;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/view/DisplayAdjustments;Landroid/view/DisplayAdjustments;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/Display;Landroid/view/Display; +HSPLandroid/view/ViewRootImpl;->setView(Landroid/view/View;Landroid/view/WindowManager$LayoutParams;Landroid/view/View;I)V HSPLandroid/view/ViewRootImpl;->setWindowStopped(Z)V HSPLandroid/view/ViewRootImpl;->shouldDispatchCutout()Z HSPLandroid/view/ViewRootImpl;->shouldOptimizeMeasure(Landroid/view/WindowManager$LayoutParams;)Z -HSPLandroid/view/ViewRootImpl;->shouldSetFrameRate()Z+]Landroid/view/Surface;Landroid/view/Surface; -HSPLandroid/view/ViewRootImpl;->shouldSetFrameRateCategory()Z+]Landroid/view/Surface;Landroid/view/Surface; +HSPLandroid/view/ViewRootImpl;->shouldSetFrameRate()Z HSPLandroid/view/ViewRootImpl;->shouldUseDisplaySize(Landroid/view/WindowManager$LayoutParams;)Z HSPLandroid/view/ViewRootImpl;->systemGestureExclusionChanged()V HSPLandroid/view/ViewRootImpl;->unscheduleConsumeBatchedInput()V HSPLandroid/view/ViewRootImpl;->unscheduleTraversals()V -HSPLandroid/view/ViewRootImpl;->updateBlastSurfaceIfNeeded()V+]Landroid/graphics/BLASTBufferQueue;Landroid/graphics/BLASTBufferQueue;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl; +HSPLandroid/view/ViewRootImpl;->updateBlastSurfaceIfNeeded()V HSPLandroid/view/ViewRootImpl;->updateBoundsLayer(Landroid/view/SurfaceControl$Transaction;)Z -HSPLandroid/view/ViewRootImpl;->updateCaptionInsets()Z HSPLandroid/view/ViewRootImpl;->updateCompatSysUiVisibility(III)V HSPLandroid/view/ViewRootImpl;->updateCompatSystemUiVisibilityInfo(IIII)V HSPLandroid/view/ViewRootImpl;->updateConfiguration(I)V -HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z+]Landroid/view/WindowCallbacks;Lcom/android/internal/policy/DecorView;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewRootImpl;->updateContentDrawBounds()Z HSPLandroid/view/ViewRootImpl;->updateForceDarkMode()V HSPLandroid/view/ViewRootImpl;->updateInternalDisplay(ILandroid/content/res/Resources;)V HSPLandroid/view/ViewRootImpl;->updateKeepClearForAccessibilityFocusRect()V @@ -18343,7 +18216,6 @@ HSPLandroid/view/ViewRootInsetsControllerHost;->getSystemBarsBehavior()I HSPLandroid/view/ViewRootInsetsControllerHost;->getTranslator()Landroid/content/res/CompatibilityInfo$Translator; HSPLandroid/view/ViewRootInsetsControllerHost;->getWindowToken()Landroid/os/IBinder; HSPLandroid/view/ViewRootInsetsControllerHost;->hasAnimationCallbacks()Z -HSPLandroid/view/ViewRootInsetsControllerHost;->isSystemBarsAppearanceControlled()Z HSPLandroid/view/ViewRootInsetsControllerHost;->notifyInsetsChanged()V HSPLandroid/view/ViewRootInsetsControllerHost;->updateCompatSysUiVisibility(III)V HSPLandroid/view/ViewRootRectTracker$ViewInfo;->(Landroid/view/ViewRootRectTracker;Landroid/view/View;)V @@ -18366,16 +18238,16 @@ HSPLandroid/view/ViewStub;->setLayoutResource(I)V HSPLandroid/view/ViewStub;->setOnInflateListener(Landroid/view/ViewStub$OnInflateListener;)V HSPLandroid/view/ViewStub;->setVisibility(I)V HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->()V -HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->get(I)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->get(I)Ljava/lang/Object; HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray$Access;->size()I HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->()V HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->add(Ljava/lang/Object;)V HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->addAll(Landroid/view/ViewTreeObserver$CopyOnWriteArray;)V -HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->end()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->end()V HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->getArray()Ljava/util/ArrayList; HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->remove(Ljava/lang/Object;)V -HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->size()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->start()Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->size()I +HSPLandroid/view/ViewTreeObserver$CopyOnWriteArray;->start()Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access; HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->()V HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->equals(Ljava/lang/Object;)Z HSPLandroid/view/ViewTreeObserver$InternalInsetsInfo;->isEmpty()Z @@ -18391,10 +18263,10 @@ HSPLandroid/view/ViewTreeObserver;->addOnScrollChangedListener(Landroid/view/Vie HSPLandroid/view/ViewTreeObserver;->captureFrameCommitCallbacks()Ljava/util/ArrayList; HSPLandroid/view/ViewTreeObserver;->checkIsAlive()V HSPLandroid/view/ViewTreeObserver;->dispatchOnComputeInternalInsets(Landroid/view/ViewTreeObserver$InternalInsetsInfo;)V -HSPLandroid/view/ViewTreeObserver;->dispatchOnDraw()V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Landroid/view/ViewTreeObserver$OnDrawListener;Landroid/widget/Editor$2; +HSPLandroid/view/ViewTreeObserver;->dispatchOnDraw()V HSPLandroid/view/ViewTreeObserver;->dispatchOnEnterAnimationComplete()V -HSPLandroid/view/ViewTreeObserver;->dispatchOnGlobalLayout()V+]Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;]Landroid/view/ViewTreeObserver$CopyOnWriteArray;Landroid/view/ViewTreeObserver$CopyOnWriteArray; -HSPLandroid/view/ViewTreeObserver;->dispatchOnPreDraw()Z+]Landroid/view/ViewTreeObserver$OnPreDrawListener;missing_types]Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;Landroid/view/ViewTreeObserver$CopyOnWriteArray$Access;]Landroid/view/ViewTreeObserver$CopyOnWriteArray;Landroid/view/ViewTreeObserver$CopyOnWriteArray; +HSPLandroid/view/ViewTreeObserver;->dispatchOnGlobalLayout()V +HSPLandroid/view/ViewTreeObserver;->dispatchOnPreDraw()Z HSPLandroid/view/ViewTreeObserver;->dispatchOnScrollChanged()V HSPLandroid/view/ViewTreeObserver;->dispatchOnSystemGestureExclusionRectsChanged(Ljava/util/List;)V HSPLandroid/view/ViewTreeObserver;->dispatchOnTouchModeChanged(Z)V @@ -18442,7 +18314,7 @@ HSPLandroid/view/Window;->makeActive()V HSPLandroid/view/Window;->onDrawLegacyNavigationBarBackgroundChanged(Z)Z HSPLandroid/view/Window;->removeOnFrameMetricsAvailableListener(Landroid/view/Window$OnFrameMetricsAvailableListener;)V HSPLandroid/view/Window;->requestFeature(I)Z -HSPLandroid/view/Window;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/Window;Lcom/android/internal/policy/PhoneWindow; +HSPLandroid/view/Window;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V HSPLandroid/view/Window;->setBackgroundBlurRadius(I)V HSPLandroid/view/Window;->setCallback(Landroid/view/Window$Callback;)V HSPLandroid/view/Window;->setCloseOnTouchOutside(Z)V @@ -18477,7 +18349,6 @@ HSPLandroid/view/WindowInsets$Type;->statusBars()I HSPLandroid/view/WindowInsets$Type;->systemBars()I HSPLandroid/view/WindowInsets$Type;->systemGestures()I HSPLandroid/view/WindowInsets$Type;->toString(I)Ljava/lang/String; -HSPLandroid/view/WindowInsets;->([Landroid/graphics/Insets;[Landroid/graphics/Insets;[ZZIILandroid/view/DisplayCutout;Landroid/view/RoundedCorners;Landroid/view/PrivacyIndicatorBounds;Landroid/view/DisplayShape;IZ[[Landroid/graphics/Rect;[[Landroid/graphics/Rect;II)V+]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;][Landroid/graphics/Insets;[Landroid/graphics/Insets;][[Landroid/graphics/Rect;[[Landroid/graphics/Rect; HSPLandroid/view/WindowInsets;->assignCompatInsets([Landroid/graphics/Insets;Landroid/graphics/Rect;)V HSPLandroid/view/WindowInsets;->consumeDisplayCutout()Landroid/view/WindowInsets; HSPLandroid/view/WindowInsets;->consumeStableInsets()Landroid/view/WindowInsets; @@ -18516,15 +18387,15 @@ HSPLandroid/view/WindowInsetsAnimation;->getTypeMask()I HSPLandroid/view/WindowInsetsAnimation;->setAlpha(F)V HSPLandroid/view/WindowLayout;->()V HSPLandroid/view/WindowLayout;->()V -HSPLandroid/view/WindowLayout;->computeFrames(Landroid/view/WindowManager$LayoutParams;Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/graphics/Rect;IIIIFLandroid/window/ClientWindowFrames;)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Landroid/graphics/Rect;Landroid/graphics/Rect; -HSPLandroid/view/WindowLayout;->computeSurfaceSize(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IILandroid/graphics/Rect;ZLandroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/view/WindowLayout;->computeFrames(Landroid/view/WindowManager$LayoutParams;Landroid/view/InsetsState;Landroid/graphics/Rect;Landroid/graphics/Rect;IIIIFLandroid/window/ClientWindowFrames;)V +HSPLandroid/view/WindowLayout;->computeSurfaceSize(Landroid/view/WindowManager$LayoutParams;Landroid/graphics/Rect;IILandroid/graphics/Rect;ZLandroid/graphics/Point;)V HSPLandroid/view/WindowLeaked;->(Ljava/lang/String;)V HSPLandroid/view/WindowManager$LayoutParams$1;->createFromParcel(Landroid/os/Parcel;)Landroid/view/WindowManager$LayoutParams; HSPLandroid/view/WindowManager$LayoutParams$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/view/WindowManager$LayoutParams;->()V HSPLandroid/view/WindowManager$LayoutParams;->(IIIII)V HSPLandroid/view/WindowManager$LayoutParams;->(Landroid/os/Parcel;)V -HSPLandroid/view/WindowManager$LayoutParams;->copyFrom(Landroid/view/WindowManager$LayoutParams;)I+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/view/WindowManager$LayoutParams;->copyFrom(Landroid/view/WindowManager$LayoutParams;)I HSPLandroid/view/WindowManager$LayoutParams;->forRotation(I)Landroid/view/WindowManager$LayoutParams; HSPLandroid/view/WindowManager$LayoutParams;->getColorMode()I HSPLandroid/view/WindowManager$LayoutParams;->getFitInsetsSides()I @@ -18539,20 +18410,19 @@ HSPLandroid/view/WindowManager$LayoutParams;->setFitInsetsSides(I)V HSPLandroid/view/WindowManager$LayoutParams;->setFitInsetsTypes(I)V HSPLandroid/view/WindowManager$LayoutParams;->setSurfaceInsets(Landroid/view/View;ZZ)V HSPLandroid/view/WindowManager$LayoutParams;->setTitle(Ljava/lang/CharSequence;)V -HSPLandroid/view/WindowManager$LayoutParams;->writeToParcel(Landroid/os/Parcel;I)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/view/WindowManager$LayoutParams;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/view/WindowManager;->hasWindowExtensionsEnabled()Z HSPLandroid/view/WindowManagerGlobal$1;->()V HSPLandroid/view/WindowManagerGlobal$2;->(Landroid/view/WindowManagerGlobal;)V HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;->()V HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;->(Landroid/view/WindowManagerGlobal;)V -HSPLandroid/view/WindowManagerGlobal$TrustedPresentationListener;->(Landroid/view/WindowManagerGlobal;Landroid/view/WindowManagerGlobal$TrustedPresentationListener-IA;)V HSPLandroid/view/WindowManagerGlobal;->()V HSPLandroid/view/WindowManagerGlobal;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;Landroid/view/Display;Landroid/view/Window;I)V HSPLandroid/view/WindowManagerGlobal;->closeAll(Landroid/os/IBinder;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/view/WindowManagerGlobal;->closeAllExceptView(Landroid/os/IBinder;Landroid/view/View;Ljava/lang/String;Ljava/lang/String;)V HSPLandroid/view/WindowManagerGlobal;->doRemoveView(Landroid/view/ViewRootImpl;)V HSPLandroid/view/WindowManagerGlobal;->dumpGfxInfo(Ljava/io/FileDescriptor;[Ljava/lang/String;)V -HSPLandroid/view/WindowManagerGlobal;->findViewLocked(Landroid/view/View;Z)I+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/WindowManagerGlobal;->findViewLocked(Landroid/view/View;Z)I HSPLandroid/view/WindowManagerGlobal;->getInstance()Landroid/view/WindowManagerGlobal; HSPLandroid/view/WindowManagerGlobal;->getRootViews(Landroid/os/IBinder;)Ljava/util/ArrayList; HSPLandroid/view/WindowManagerGlobal;->getWindowManagerService()Landroid/view/IWindowManager; @@ -18564,7 +18434,7 @@ HSPLandroid/view/WindowManagerGlobal;->removeView(Landroid/view/View;Z)V HSPLandroid/view/WindowManagerGlobal;->removeViewLocked(IZ)V HSPLandroid/view/WindowManagerGlobal;->setStoppedState(Landroid/os/IBinder;Z)V HSPLandroid/view/WindowManagerGlobal;->trimMemory(I)V -HSPLandroid/view/WindowManagerGlobal;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/view/ViewRootImpl;Landroid/view/ViewRootImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/view/WindowManagerGlobal;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/WindowManagerImpl;->(Landroid/content/Context;)V HSPLandroid/view/WindowManagerImpl;->(Landroid/content/Context;Landroid/view/Window;Landroid/os/IBinder;)V HSPLandroid/view/WindowManagerImpl;->addView(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V @@ -18577,7 +18447,7 @@ HSPLandroid/view/WindowManagerImpl;->getDefaultDisplay()Landroid/view/Display; HSPLandroid/view/WindowManagerImpl;->getMaximumWindowMetrics()Landroid/view/WindowMetrics; HSPLandroid/view/WindowManagerImpl;->removeView(Landroid/view/View;)V HSPLandroid/view/WindowManagerImpl;->removeViewImmediate(Landroid/view/View;)V -HSPLandroid/view/WindowManagerImpl;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V+]Landroid/view/WindowManagerGlobal;Landroid/view/WindowManagerGlobal; +HSPLandroid/view/WindowManagerImpl;->updateViewLayout(Landroid/view/View;Landroid/view/ViewGroup$LayoutParams;)V HSPLandroid/view/WindowMetrics;->(Landroid/graphics/Rect;Landroid/view/WindowInsets;)V HSPLandroid/view/WindowMetrics;->(Landroid/graphics/Rect;Ljava/util/function/Supplier;F)V HSPLandroid/view/WindowMetrics;->getBounds()Landroid/graphics/Rect; @@ -18588,12 +18458,10 @@ HSPLandroid/view/accessibility/AccessibilityManager$1;->notifyServicesStateChang HSPLandroid/view/accessibility/AccessibilityManager$1;->setFocusAppearance(II)V HSPLandroid/view/accessibility/AccessibilityManager$1;->setState(I)V HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;->(Landroid/view/accessibility/AccessibilityManager;)V -HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;->(Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager$MyCallback-IA;)V HSPLandroid/view/accessibility/AccessibilityManager$MyCallback;->handleMessage(Landroid/os/Message;)Z HSPLandroid/view/accessibility/AccessibilityManager;->(Landroid/content/Context;Landroid/view/accessibility/IAccessibilityManager;I)V HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z HSPLandroid/view/accessibility/AccessibilityManager;->addAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;Landroid/os/Handler;)V -HSPLandroid/view/accessibility/AccessibilityManager;->addHighTextContrastStateChangeListener(Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;Landroid/os/Handler;)V HSPLandroid/view/accessibility/AccessibilityManager;->addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z HSPLandroid/view/accessibility/AccessibilityManager;->addTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;Landroid/os/Handler;)V HSPLandroid/view/accessibility/AccessibilityManager;->getEnabledAccessibilityServiceList(I)Ljava/util/List; @@ -18603,13 +18471,11 @@ HSPLandroid/view/accessibility/AccessibilityManager;->getRecommendedTimeoutMilli HSPLandroid/view/accessibility/AccessibilityManager;->getServiceLocked()Landroid/view/accessibility/IAccessibilityManager; HSPLandroid/view/accessibility/AccessibilityManager;->hasAnyDirectConnection()Z HSPLandroid/view/accessibility/AccessibilityManager;->initialFocusAppearanceLocked(Landroid/content/res/Resources;)V -HSPLandroid/view/accessibility/AccessibilityManager;->isEnabled()Z+]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager; -HSPLandroid/view/accessibility/AccessibilityManager;->isHighTextContrastEnabled()Z +HSPLandroid/view/accessibility/AccessibilityManager;->isEnabled()Z HSPLandroid/view/accessibility/AccessibilityManager;->isTouchExplorationEnabled()Z HSPLandroid/view/accessibility/AccessibilityManager;->notifyAccessibilityStateChanged()V HSPLandroid/view/accessibility/AccessibilityManager;->registerSystemAction(Landroid/app/RemoteAction;I)V HSPLandroid/view/accessibility/AccessibilityManager;->removeAccessibilityStateChangeListener(Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener;)Z -HSPLandroid/view/accessibility/AccessibilityManager;->removeHighTextContrastStateChangeListener(Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener;)V HSPLandroid/view/accessibility/AccessibilityManager;->removeTouchExplorationStateChangeListener(Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener;)Z HSPLandroid/view/accessibility/AccessibilityManager;->setStateLocked(I)V HSPLandroid/view/accessibility/AccessibilityManager;->tryConnectToServiceLocked(Landroid/view/accessibility/IAccessibilityManager;)V @@ -18749,7 +18615,6 @@ HSPLandroid/view/animation/AnimationSet;->willChangeTransformationMatrix()Z HSPLandroid/view/animation/AnimationUtils$1;->initialValue()Landroid/view/animation/AnimationUtils$AnimationState; HSPLandroid/view/animation/AnimationUtils$1;->initialValue()Ljava/lang/Object; HSPLandroid/view/animation/AnimationUtils$AnimationState;->()V -HSPLandroid/view/animation/AnimationUtils$AnimationState;->(Landroid/view/animation/AnimationUtils$AnimationState-IA;)V HSPLandroid/view/animation/AnimationUtils;->createAnimationFromXml(Landroid/content/Context;Lorg/xmlpull/v1/XmlPullParser;)Landroid/view/animation/Animation; HSPLandroid/view/animation/AnimationUtils;->createAnimationFromXml(Landroid/content/Context;Lorg/xmlpull/v1/XmlPullParser;Landroid/view/animation/AnimationSet;Landroid/util/AttributeSet;)Landroid/view/animation/Animation; HSPLandroid/view/animation/AnimationUtils;->createInterpolatorFromXml(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;Lorg/xmlpull/v1/XmlPullParser;)Landroid/view/animation/Interpolator; @@ -18758,8 +18623,8 @@ HSPLandroid/view/animation/AnimationUtils;->loadAnimation(Landroid/content/Conte HSPLandroid/view/animation/AnimationUtils;->loadInterpolator(Landroid/content/Context;I)Landroid/view/animation/Interpolator; HSPLandroid/view/animation/AnimationUtils;->loadInterpolator(Landroid/content/res/Resources;Landroid/content/res/Resources$Theme;I)Landroid/view/animation/Interpolator; HSPLandroid/view/animation/AnimationUtils;->lockAnimationClock(J)V -HSPLandroid/view/animation/AnimationUtils;->lockAnimationClock(JJ)V+]Ljava/lang/ThreadLocal;Landroid/view/animation/AnimationUtils$1; -HSPLandroid/view/animation/AnimationUtils;->unlockAnimationClock()V+]Ljava/lang/ThreadLocal;Landroid/view/animation/AnimationUtils$1; +HSPLandroid/view/animation/AnimationUtils;->lockAnimationClock(JJ)V +HSPLandroid/view/animation/AnimationUtils;->unlockAnimationClock()V HSPLandroid/view/animation/BaseInterpolator;->()V HSPLandroid/view/animation/BaseInterpolator;->getChangingConfiguration()I HSPLandroid/view/animation/BaseInterpolator;->setChangingConfiguration(I)V @@ -18778,7 +18643,7 @@ HSPLandroid/view/animation/PathInterpolator;->(Landroid/content/res/Resour HSPLandroid/view/animation/PathInterpolator;->createNativeInterpolator()J HSPLandroid/view/animation/PathInterpolator;->getInterpolation(F)F HSPLandroid/view/animation/PathInterpolator;->initCubic(FFFF)V -HSPLandroid/view/animation/PathInterpolator;->initPath(Landroid/graphics/Path;)V+]Landroid/graphics/Path;Landroid/graphics/Path; +HSPLandroid/view/animation/PathInterpolator;->initPath(Landroid/graphics/Path;)V HSPLandroid/view/animation/PathInterpolator;->parseInterpolatorFromTypeArray(Landroid/content/res/TypedArray;)V HSPLandroid/view/animation/ScaleAnimation;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/view/animation/ScaleAnimation;->applyTransformation(FLandroid/view/animation/Transformation;)V @@ -18853,7 +18718,6 @@ HSPLandroid/view/autofill/AutofillManager$AutofillCallback;->()V HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->getAugmentedAutofillClient(Lcom/android/internal/os/IResultReceiver;)V HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->lambda$setState$0(Landroid/view/autofill/AutofillManager;I)V HSPLandroid/view/autofill/AutofillManager$AutofillManagerClient;->setState(I)V -HSPLandroid/view/autofill/AutofillManager;->-$$Nest$mpost(Landroid/view/autofill/AutofillManager;Ljava/lang/Runnable;)V HSPLandroid/view/autofill/AutofillManager;->(Landroid/content/Context;Landroid/view/autofill/IAutoFillManager;)V HSPLandroid/view/autofill/AutofillManager;->cancelLocked()V HSPLandroid/view/autofill/AutofillManager;->cancelSessionLocked()V @@ -18897,7 +18761,6 @@ HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->()V HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->asBinder()Landroid/os/IBinder; HSPLandroid/view/autofill/IAugmentedAutofillManagerClient$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->(Landroid/os/IBinder;)V -HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->addClient(Landroid/view/autofill/IAutoFillManagerClient;Landroid/content/ComponentName;ILcom/android/internal/os/IResultReceiver;)V HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->cancelSession(II)V HSPLandroid/view/autofill/IAutoFillManager$Stub$Proxy;->getAutofillServiceComponentName(Lcom/android/internal/os/IResultReceiver;)V @@ -18962,19 +18825,14 @@ HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->getMaxTran HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->getTransactionName(I)Ljava/lang/String; HSPLandroid/view/contentcapture/IContentCaptureOptionsCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda0;->run()V -HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda10;->run()V -HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda11;->run()V -HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda12;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda1;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda2;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda3;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda4;->run()V -HSPLandroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda8;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1;->run()V HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;->(Landroid/view/contentcapture/MainContentCaptureSession;)V HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;->lambda$send$1(Landroid/view/contentcapture/MainContentCaptureSession;ILandroid/os/IBinder;)V HSPLandroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver;->send(ILandroid/os/Bundle;)V -HSPLandroid/view/contentcapture/MainContentCaptureSession;->(Landroid/view/contentcapture/ContentCaptureManager$StrippedContext;Landroid/view/contentcapture/ContentCaptureManager;Landroid/os/Handler;Landroid/view/contentcapture/IContentCaptureManager;)V HSPLandroid/view/contentcapture/MainContentCaptureSession;->clearEvents()Landroid/content/pm/ParceledListSlice; HSPLandroid/view/contentcapture/MainContentCaptureSession;->destroySession()V HSPLandroid/view/contentcapture/MainContentCaptureSession;->flush(I)V @@ -19096,7 +18954,6 @@ HSPLandroid/view/inputmethod/ImeTracker$Token$1;->createFromParcel(Landroid/os/P HSPLandroid/view/inputmethod/ImeTracker$Token$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/view/inputmethod/ImeTracker$Token;->-$$Nest$fgetmTag(Landroid/view/inputmethod/ImeTracker$Token;)Ljava/lang/String; HSPLandroid/view/inputmethod/ImeTracker$Token;->(Landroid/os/Parcel;)V -HSPLandroid/view/inputmethod/ImeTracker$Token;->(Landroid/os/Parcel;Landroid/view/inputmethod/ImeTracker$Token-IA;)V HSPLandroid/view/inputmethod/ImeTracker$Token;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/view/inputmethod/ImeTracker;->()V HSPLandroid/view/inputmethod/ImeTracker;->forLogging()Landroid/view/inputmethod/ImeTracker; @@ -19463,7 +19320,6 @@ HSPLandroid/webkit/WebViewProviderResponse$1;->createFromParcel(Landroid/os/Parc HSPLandroid/widget/AbsListView$3;->run()V HSPLandroid/widget/AbsListView$AdapterDataSetObserver;->onChanged()V HSPLandroid/widget/AbsListView$DeviceConfigChangeListener;->()V -HSPLandroid/widget/AbsListView$DeviceConfigChangeListener;->(Landroid/widget/AbsListView$DeviceConfigChangeListener-IA;)V HSPLandroid/widget/AbsListView$PerformClick;->run()V HSPLandroid/widget/AbsListView$RecycleBin;->addScrapView(Landroid/view/View;I)V HSPLandroid/widget/AbsListView$RecycleBin;->clear()V @@ -19667,14 +19523,14 @@ HSPLandroid/widget/EdgeEffect;->(Landroid/content/Context;)V HSPLandroid/widget/EdgeEffect;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/widget/EdgeEffect;->calculateDistanceFromGlowValues(FF)F HSPLandroid/widget/EdgeEffect;->dampStretchVector(F)F -HSPLandroid/widget/EdgeEffect;->draw(Landroid/graphics/Canvas;)Z+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/widget/EdgeEffect;->draw(Landroid/graphics/Canvas;)Z HSPLandroid/widget/EdgeEffect;->finish()V HSPLandroid/widget/EdgeEffect;->getCurrentEdgeEffectBehavior()I HSPLandroid/widget/EdgeEffect;->getDistance()F HSPLandroid/widget/EdgeEffect;->isAtEquilibrium()Z HSPLandroid/widget/EdgeEffect;->isFinished()Z HSPLandroid/widget/EdgeEffect;->onAbsorb(I)V -HSPLandroid/widget/EdgeEffect;->onPull(FF)V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/widget/EdgeEffect;->onPull(FF)V HSPLandroid/widget/EdgeEffect;->onPullDistance(FF)F HSPLandroid/widget/EdgeEffect;->onRelease()V HSPLandroid/widget/EdgeEffect;->setSize(II)V @@ -19696,11 +19552,10 @@ HSPLandroid/widget/EditText;->supportsAutoSizeText()Z HSPLandroid/widget/Editor$$ExternalSyntheticLambda2;->(Landroid/widget/Editor;)V HSPLandroid/widget/Editor$2;->onDraw()V HSPLandroid/widget/Editor$AccessibilitySmartActions;->(Landroid/widget/TextView;)V -HSPLandroid/widget/Editor$AccessibilitySmartActions;->(Landroid/widget/TextView;Landroid/widget/Editor$AccessibilitySmartActions-IA;)V HSPLandroid/widget/Editor$Blink;->cancel()V HSPLandroid/widget/Editor$Blink;->run()V HSPLandroid/widget/Editor$Blink;->uncancel()V -HSPLandroid/widget/Editor$CursorAnchorInfoNotifier;->updatePosition(IIZZ)V+]Landroid/view/inputmethod/InputMethodManager;Landroid/view/inputmethod/InputMethodManager; +HSPLandroid/widget/Editor$CursorAnchorInfoNotifier;->updatePosition(IIZZ)V HSPLandroid/widget/Editor$EditOperation;->(Landroid/widget/Editor;Ljava/lang/String;ILjava/lang/String;Z)V HSPLandroid/widget/Editor$EditOperation;->commit()V HSPLandroid/widget/Editor$EditOperation;->forceMergeWith(Landroid/widget/Editor$EditOperation;)V @@ -19744,10 +19599,10 @@ HSPLandroid/widget/Editor$InsertionPointCursorController;->onDetached()V HSPLandroid/widget/Editor$InsertionPointCursorController;->onTouchEvent(Landroid/view/MotionEvent;)V HSPLandroid/widget/Editor$InsertionPointCursorController;->show()V HSPLandroid/widget/Editor$PositionListener;->addSubscriber(Landroid/widget/Editor$TextViewPositionListener;Z)V -HSPLandroid/widget/Editor$PositionListener;->onPreDraw()Z+]Landroid/widget/Editor$TextViewPositionListener;Landroid/widget/Editor$CursorAnchorInfoNotifier;,Landroid/widget/Editor$InsertionHandleView; +HSPLandroid/widget/Editor$PositionListener;->onPreDraw()Z HSPLandroid/widget/Editor$PositionListener;->onScrollChanged()V HSPLandroid/widget/Editor$PositionListener;->removeSubscriber(Landroid/widget/Editor$TextViewPositionListener;)V -HSPLandroid/widget/Editor$PositionListener;->updatePosition()V+]Landroid/widget/TextView;Landroid/widget/EditText; +HSPLandroid/widget/Editor$PositionListener;->updatePosition()V HSPLandroid/widget/Editor$ProcessTextIntentActionsHandler;->(Landroid/widget/Editor;)V HSPLandroid/widget/Editor$SelectionModifierCursorController;->getMinTouchOffset()I HSPLandroid/widget/Editor$SelectionModifierCursorController;->hide()V @@ -19756,7 +19611,7 @@ HSPLandroid/widget/Editor$SelectionModifierCursorController;->isCursorBeingModif HSPLandroid/widget/Editor$SelectionModifierCursorController;->isDragAcceleratorActive()Z HSPLandroid/widget/Editor$SelectionModifierCursorController;->isSelectionStartDragged()Z HSPLandroid/widget/Editor$SelectionModifierCursorController;->onDetached()V -HSPLandroid/widget/Editor$SelectionModifierCursorController;->onTouchEvent(Landroid/view/MotionEvent;)V+]Landroid/widget/EditorTouchState;Landroid/widget/EditorTouchState;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/widget/Editor$SelectionModifierCursorController;Landroid/widget/Editor$SelectionModifierCursorController;]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/widget/Editor$SelectionModifierCursorController;->onTouchEvent(Landroid/view/MotionEvent;)V HSPLandroid/widget/Editor$SelectionModifierCursorController;->resetDragAcceleratorState()V HSPLandroid/widget/Editor$SelectionModifierCursorController;->resetTouchOffsets()V HSPLandroid/widget/Editor$SelectionModifierCursorController;->updateSelection(Landroid/view/MotionEvent;)V @@ -19764,7 +19619,7 @@ HSPLandroid/widget/Editor$SpanController;->hide()V HSPLandroid/widget/Editor$SpanController;->onSpanAdded(Landroid/text/Spannable;Ljava/lang/Object;II)V HSPLandroid/widget/Editor$SpanController;->onSpanChanged(Landroid/text/Spannable;Ljava/lang/Object;IIII)V HSPLandroid/widget/Editor$SpanController;->onSpanRemoved(Landroid/text/Spannable;Ljava/lang/Object;II)V -HSPLandroid/widget/Editor$TextRenderNode;->needsRecord()Z+]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode; +HSPLandroid/widget/Editor$TextRenderNode;->needsRecord()Z HSPLandroid/widget/Editor$UndoInputFilter;->beginBatchEdit()V HSPLandroid/widget/Editor$UndoInputFilter;->canUndoEdit(Ljava/lang/CharSequence;IILandroid/text/Spanned;II)Z HSPLandroid/widget/Editor$UndoInputFilter;->endBatchEdit()V @@ -19785,7 +19640,7 @@ HSPLandroid/widget/Editor;->createInputContentTypeIfNeeded()V HSPLandroid/widget/Editor;->createInputMethodStateIfNeeded()V HSPLandroid/widget/Editor;->discardTextDisplayLists()V HSPLandroid/widget/Editor;->downgradeEasyCorrectionSpans()V -HSPLandroid/widget/Editor;->drawHardwareAcceleratedInner(Landroid/graphics/Canvas;Landroid/text/Layout;Landroid/graphics/Path;Landroid/graphics/Paint;I[I[IIII)I+]Landroid/widget/Editor$TextRenderNode;Landroid/widget/Editor$TextRenderNode;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Landroid/text/Layout;Landroid/text/DynamicLayout;]Landroid/graphics/RenderNode;Landroid/graphics/RenderNode;]Landroid/graphics/RecordingCanvas;Landroid/graphics/RecordingCanvas; +HSPLandroid/widget/Editor;->drawHardwareAcceleratedInner(Landroid/graphics/Canvas;Landroid/text/Layout;Landroid/graphics/Path;Landroid/graphics/Paint;I[I[IIII)I HSPLandroid/widget/Editor;->endBatchEdit()V HSPLandroid/widget/Editor;->ensureEndedBatchEdit()V HSPLandroid/widget/Editor;->ensureNoSelectionIfNonSelectable()V @@ -19821,10 +19676,10 @@ HSPLandroid/widget/Editor;->onFocusChanged(ZI)V HSPLandroid/widget/Editor;->onLocaleChanged()V HSPLandroid/widget/Editor;->onScreenStateChanged(I)V HSPLandroid/widget/Editor;->onScrollChanged()V -HSPLandroid/widget/Editor;->onTouchEvent(Landroid/view/MotionEvent;)V+]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/widget/EditorTouchState;Landroid/widget/EditorTouchState;]Landroid/widget/Editor$SelectionModifierCursorController;Landroid/widget/Editor$SelectionModifierCursorController;]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/widget/Editor;->onTouchEvent(Landroid/view/MotionEvent;)V HSPLandroid/widget/Editor;->onTouchUpEvent(Landroid/view/MotionEvent;)V HSPLandroid/widget/Editor;->onWindowFocusChanged(Z)V -HSPLandroid/widget/Editor;->prepareCursorControllers()V+]Landroid/view/View;Lcom/android/internal/policy/DecorView;]Landroid/widget/Editor;Landroid/widget/Editor; +HSPLandroid/widget/Editor;->prepareCursorControllers()V HSPLandroid/widget/Editor;->refreshTextActionMode()V HSPLandroid/widget/Editor;->reportExtractedText()Z HSPLandroid/widget/Editor;->restoreInstanceState(Landroid/os/ParcelableParcel;)V @@ -19849,7 +19704,7 @@ HSPLandroid/widget/EditorTouchState;->getLastDownY()F HSPLandroid/widget/EditorTouchState;->isMovedEnoughForDrag()Z HSPLandroid/widget/EditorTouchState;->isMultiTap()Z HSPLandroid/widget/EditorTouchState;->isMultiTapInSameArea()Z -HSPLandroid/widget/EditorTouchState;->update(Landroid/view/MotionEvent;Landroid/view/ViewConfiguration;)V+]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/widget/EditorTouchState;->update(Landroid/view/MotionEvent;Landroid/view/ViewConfiguration;)V HSPLandroid/widget/Filter;->()V HSPLandroid/widget/ForwardingListener;->(Landroid/view/View;)V HSPLandroid/widget/ForwardingListener;->onViewAttachedToWindow(Landroid/view/View;)V @@ -19869,13 +19724,13 @@ HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/util/AttributeSet HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/util/AttributeSet;)Landroid/widget/FrameLayout$LayoutParams; HSPLandroid/widget/FrameLayout;->generateLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Landroid/view/ViewGroup$LayoutParams; HSPLandroid/widget/FrameLayout;->getAccessibilityClassName()Ljava/lang/CharSequence; -HSPLandroid/widget/FrameLayout;->getPaddingBottomWithForeground()I+]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->getPaddingLeftWithForeground()I+]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->getPaddingRightWithForeground()I+]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->getPaddingTopWithForeground()I+]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->layoutChildren(IIIIZ)V+]Landroid/view/View;missing_types]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->onLayout(ZIIII)V+]Landroid/widget/FrameLayout;missing_types -HSPLandroid/widget/FrameLayout;->onMeasure(II)V+]Landroid/widget/FrameLayout;missing_types]Landroid/view/View;missing_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/widget/FrameLayout;->getPaddingBottomWithForeground()I +HSPLandroid/widget/FrameLayout;->getPaddingLeftWithForeground()I +HSPLandroid/widget/FrameLayout;->getPaddingRightWithForeground()I +HSPLandroid/widget/FrameLayout;->getPaddingTopWithForeground()I +HSPLandroid/widget/FrameLayout;->layoutChildren(IIIIZ)V +HSPLandroid/widget/FrameLayout;->onLayout(ZIIII)V +HSPLandroid/widget/FrameLayout;->onMeasure(II)V HSPLandroid/widget/FrameLayout;->setForegroundGravity(I)V HSPLandroid/widget/FrameLayout;->setMeasureAllChildren(Z)V HSPLandroid/widget/FrameLayout;->shouldDelayChildPressedState()Z @@ -19972,7 +19827,7 @@ HSPLandroid/widget/ImageView$ScaleType;->values()[Landroid/widget/ImageView$Scal HSPLandroid/widget/ImageView;->(Landroid/content/Context;)V HSPLandroid/widget/ImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/widget/ImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLandroid/widget/ImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/widget/ImageView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/widget/ImageView;->applyAlpha()V HSPLandroid/widget/ImageView;->applyColorFilter()V HSPLandroid/widget/ImageView;->applyImageTint()V @@ -20013,7 +19868,7 @@ HSPLandroid/widget/ImageView;->setFrame(IIII)Z HSPLandroid/widget/ImageView;->setImageAlpha(I)V HSPLandroid/widget/ImageView;->setImageBitmap(Landroid/graphics/Bitmap;)V HSPLandroid/widget/ImageView;->setImageDrawable(Landroid/graphics/drawable/Drawable;)V -HSPLandroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/widget/ImageView;->setImageMatrix(Landroid/graphics/Matrix;)V HSPLandroid/widget/ImageView;->setImageResource(I)V HSPLandroid/widget/ImageView;->setImageTintBlendMode(Landroid/graphics/BlendMode;)V HSPLandroid/widget/ImageView;->setImageTintList(Landroid/content/res/ColorStateList;)V @@ -20031,7 +19886,7 @@ HSPLandroid/widget/LinearLayout$LayoutParams;->(Landroid/view/ViewGroup$La HSPLandroid/widget/LinearLayout;->(Landroid/content/Context;)V HSPLandroid/widget/LinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/widget/LinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLandroid/widget/LinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/widget/LinearLayout;Landroid/widget/LinearLayout; +HSPLandroid/widget/LinearLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/widget/LinearLayout;->allViewsAreGoneBefore(I)Z HSPLandroid/widget/LinearLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z HSPLandroid/widget/LinearLayout;->forceUniformHeight(II)V @@ -20050,20 +19905,20 @@ HSPLandroid/widget/LinearLayout;->getGravity()I HSPLandroid/widget/LinearLayout;->getLocationOffset(Landroid/view/View;)I HSPLandroid/widget/LinearLayout;->getNextLocationOffset(Landroid/view/View;)I HSPLandroid/widget/LinearLayout;->getOrientation()I -HSPLandroid/widget/LinearLayout;->getVirtualChildAt(I)Landroid/view/View;+]Landroid/widget/LinearLayout;missing_types -HSPLandroid/widget/LinearLayout;->getVirtualChildCount()I+]Landroid/widget/LinearLayout;missing_types +HSPLandroid/widget/LinearLayout;->getVirtualChildAt(I)Landroid/view/View; +HSPLandroid/widget/LinearLayout;->getVirtualChildCount()I HSPLandroid/widget/LinearLayout;->hasDividerBeforeChildAt(I)Z HSPLandroid/widget/LinearLayout;->layoutHorizontal(IIII)V -HSPLandroid/widget/LinearLayout;->layoutVertical(IIII)V+]Landroid/view/View;missing_types]Landroid/widget/LinearLayout;missing_types -HSPLandroid/widget/LinearLayout;->measureChildBeforeLayout(Landroid/view/View;IIIII)V+]Landroid/widget/LinearLayout;missing_types -HSPLandroid/widget/LinearLayout;->measureHorizontal(II)V+]Landroid/view/View;missing_types]Landroid/widget/LinearLayout;Landroid/widget/LinearLayout; -HSPLandroid/widget/LinearLayout;->measureVertical(II)V+]Landroid/view/View;megamorphic_types]Landroid/widget/LinearLayout;missing_types +HSPLandroid/widget/LinearLayout;->layoutVertical(IIII)V +HSPLandroid/widget/LinearLayout;->measureChildBeforeLayout(Landroid/view/View;IIIII)V +HSPLandroid/widget/LinearLayout;->measureHorizontal(II)V +HSPLandroid/widget/LinearLayout;->measureVertical(II)V HSPLandroid/widget/LinearLayout;->onDraw(Landroid/graphics/Canvas;)V -HSPLandroid/widget/LinearLayout;->onLayout(ZIIII)V+]Landroid/widget/LinearLayout;missing_types -HSPLandroid/widget/LinearLayout;->onMeasure(II)V+]Landroid/widget/LinearLayout;missing_types +HSPLandroid/widget/LinearLayout;->onLayout(ZIIII)V +HSPLandroid/widget/LinearLayout;->onMeasure(II)V HSPLandroid/widget/LinearLayout;->onRtlPropertiesChanged(I)V HSPLandroid/widget/LinearLayout;->setBaselineAligned(Z)V -HSPLandroid/widget/LinearLayout;->setChildFrame(Landroid/view/View;IIII)V+]Landroid/view/View;missing_types +HSPLandroid/widget/LinearLayout;->setChildFrame(Landroid/view/View;IIII)V HSPLandroid/widget/LinearLayout;->setDividerDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/widget/LinearLayout;->setGravity(I)V HSPLandroid/widget/LinearLayout;->setOrientation(I)V @@ -20117,7 +19972,7 @@ HSPLandroid/widget/ListView;->setCacheColorHint(I)V HSPLandroid/widget/ListView;->setDivider(Landroid/graphics/drawable/Drawable;)V HSPLandroid/widget/ListView;->setSelection(I)V HSPLandroid/widget/ListView;->setupChild(Landroid/view/View;IIZIZZ)V -HSPLandroid/widget/OverScroller$SplineOverScroller;->(Landroid/content/Context;)V+]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLandroid/widget/OverScroller$SplineOverScroller;->(Landroid/content/Context;)V HSPLandroid/widget/OverScroller$SplineOverScroller;->adjustDuration(III)V HSPLandroid/widget/OverScroller$SplineOverScroller;->continueWhenFinished()Z HSPLandroid/widget/OverScroller$SplineOverScroller;->finish()V @@ -20129,14 +19984,13 @@ HSPLandroid/widget/OverScroller$SplineOverScroller;->springback(III)Z HSPLandroid/widget/OverScroller$SplineOverScroller;->startScroll(III)V HSPLandroid/widget/OverScroller$SplineOverScroller;->startSpringback(III)V HSPLandroid/widget/OverScroller$SplineOverScroller;->update()Z -HSPLandroid/widget/OverScroller$SplineOverScroller;->updateScroll(F)V HSPLandroid/widget/OverScroller;->(Landroid/content/Context;)V HSPLandroid/widget/OverScroller;->(Landroid/content/Context;Landroid/view/animation/Interpolator;)V HSPLandroid/widget/OverScroller;->(Landroid/content/Context;Landroid/view/animation/Interpolator;Z)V HSPLandroid/widget/OverScroller;->abortAnimation()V HSPLandroid/widget/OverScroller;->computeScrollOffset()Z HSPLandroid/widget/OverScroller;->fling(IIIIIIII)V -HSPLandroid/widget/OverScroller;->fling(IIIIIIIIII)V+]Landroid/widget/OverScroller;Landroid/widget/OverScroller;]Landroid/widget/OverScroller$SplineOverScroller;Landroid/widget/OverScroller$SplineOverScroller; +HSPLandroid/widget/OverScroller;->fling(IIIIIIIIII)V HSPLandroid/widget/OverScroller;->forceFinished(Z)V HSPLandroid/widget/OverScroller;->getCurrVelocity()F HSPLandroid/widget/OverScroller;->getCurrX()I @@ -20224,7 +20078,7 @@ HSPLandroid/widget/ProgressBar;->getMin()I HSPLandroid/widget/ProgressBar;->getProgress()I HSPLandroid/widget/ProgressBar;->getProgressDrawable()Landroid/graphics/drawable/Drawable; HSPLandroid/widget/ProgressBar;->initProgressBar()V -HSPLandroid/widget/ProgressBar;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/AnimatedStateListDrawable;,Landroid/graphics/drawable/GradientDrawable;,Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/RippleDrawable; +HSPLandroid/widget/ProgressBar;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/widget/ProgressBar;->isIndeterminate()Z HSPLandroid/widget/ProgressBar;->jumpDrawablesToCurrentState()V HSPLandroid/widget/ProgressBar;->needsTileify(Landroid/graphics/drawable/Drawable;)Z @@ -20264,7 +20118,7 @@ HSPLandroid/widget/RelativeLayout$DependencyGraph$Node;->release()V HSPLandroid/widget/RelativeLayout$DependencyGraph;->()V HSPLandroid/widget/RelativeLayout$DependencyGraph;->add(Landroid/view/View;)V HSPLandroid/widget/RelativeLayout$DependencyGraph;->clear()V -HSPLandroid/widget/RelativeLayout$DependencyGraph;->findRoots([I)Ljava/util/ArrayDeque;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLandroid/widget/RelativeLayout$DependencyGraph;->findRoots([I)Ljava/util/ArrayDeque; HSPLandroid/widget/RelativeLayout$DependencyGraph;->getSortedViews([Landroid/view/View;[I)V HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmBottom(Landroid/widget/RelativeLayout$LayoutParams;)I HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmLeft(Landroid/widget/RelativeLayout$LayoutParams;)I @@ -20273,7 +20127,7 @@ HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fgetmTop(Landroid/widge HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fputmBottom(Landroid/widget/RelativeLayout$LayoutParams;I)V HSPLandroid/widget/RelativeLayout$LayoutParams;->-$$Nest$fputmTop(Landroid/widget/RelativeLayout$LayoutParams;I)V HSPLandroid/widget/RelativeLayout$LayoutParams;->(II)V -HSPLandroid/widget/RelativeLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray; +HSPLandroid/widget/RelativeLayout$LayoutParams;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/widget/RelativeLayout$LayoutParams;->addRule(I)V HSPLandroid/widget/RelativeLayout$LayoutParams;->addRule(II)V HSPLandroid/widget/RelativeLayout$LayoutParams;->getRules()[I @@ -20288,7 +20142,7 @@ HSPLandroid/widget/RelativeLayout;->(Landroid/content/Context;Landroid/uti HSPLandroid/widget/RelativeLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V HSPLandroid/widget/RelativeLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/widget/RelativeLayout;->applyHorizontalSizeRules(Landroid/widget/RelativeLayout$LayoutParams;I[I)V -HSPLandroid/widget/RelativeLayout;->applyVerticalSizeRules(Landroid/widget/RelativeLayout$LayoutParams;II)V+]Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams; +HSPLandroid/widget/RelativeLayout;->applyVerticalSizeRules(Landroid/widget/RelativeLayout$LayoutParams;II)V HSPLandroid/widget/RelativeLayout;->centerHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V HSPLandroid/widget/RelativeLayout;->centerVertical(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V HSPLandroid/widget/RelativeLayout;->checkLayoutParams(Landroid/view/ViewGroup$LayoutParams;)Z @@ -20307,18 +20161,17 @@ HSPLandroid/widget/RelativeLayout;->initFromAttributes(Landroid/content/Context; HSPLandroid/widget/RelativeLayout;->measureChild(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;II)V HSPLandroid/widget/RelativeLayout;->measureChildHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;II)V HSPLandroid/widget/RelativeLayout;->onLayout(ZIIII)V -HSPLandroid/widget/RelativeLayout;->onMeasure(II)V+]Landroid/widget/RelativeLayout;Landroid/widget/RelativeLayout;]Landroid/view/View;Landroid/widget/TextView;]Landroid/widget/RelativeLayout$LayoutParams;Landroid/widget/RelativeLayout$LayoutParams; +HSPLandroid/widget/RelativeLayout;->onMeasure(II)V HSPLandroid/widget/RelativeLayout;->positionAtEdge(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;I)V HSPLandroid/widget/RelativeLayout;->positionChildHorizontal(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;IZ)Z HSPLandroid/widget/RelativeLayout;->positionChildVertical(Landroid/view/View;Landroid/widget/RelativeLayout$LayoutParams;IZ)Z HSPLandroid/widget/RelativeLayout;->queryCompatibilityModes(Landroid/content/Context;)V HSPLandroid/widget/RelativeLayout;->requestLayout()V HSPLandroid/widget/RelativeLayout;->shouldDelayChildPressedState()Z -HSPLandroid/widget/RelativeLayout;->sortChildren()V+]Landroid/widget/RelativeLayout;Landroid/widget/RelativeLayout;]Landroid/widget/RelativeLayout$DependencyGraph;Landroid/widget/RelativeLayout$DependencyGraph; +HSPLandroid/widget/RelativeLayout;->sortChildren()V HSPLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Landroid/widget/RemoteViews; HSPLandroid/widget/RemoteViews$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; HSPLandroid/widget/RemoteViews$Action;->()V -HSPLandroid/widget/RemoteViews$Action;->(Landroid/widget/RemoteViews$Action-IA;)V HSPLandroid/widget/RemoteViews$Action;->setHierarchyRootData(Landroid/widget/RemoteViews$HierarchyRootData;)V HSPLandroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0;->(Landroid/content/pm/ApplicationInfo;)V HSPLandroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;)Ljava/lang/Object; @@ -20390,16 +20243,16 @@ HSPLandroid/widget/RtlSpacingHelper;->setAbsolute(II)V HSPLandroid/widget/RtlSpacingHelper;->setDirection(Z)V HSPLandroid/widget/RtlSpacingHelper;->setRelative(II)V HSPLandroid/widget/ScrollBarDrawable;->()V -HSPLandroid/widget/ScrollBarDrawable;->draw(Landroid/graphics/Canvas;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLandroid/widget/ScrollBarDrawable;->draw(Landroid/graphics/Canvas;)V HSPLandroid/widget/ScrollBarDrawable;->drawThumb(Landroid/graphics/Canvas;Landroid/graphics/Rect;IIZ)V -HSPLandroid/widget/ScrollBarDrawable;->getSize(Z)I+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; -HSPLandroid/widget/ScrollBarDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable; -HSPLandroid/widget/ScrollBarDrawable;->isStateful()Z+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; -HSPLandroid/widget/ScrollBarDrawable;->mutate()Landroid/widget/ScrollBarDrawable;+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; +HSPLandroid/widget/ScrollBarDrawable;->getSize(Z)I +HSPLandroid/widget/ScrollBarDrawable;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V +HSPLandroid/widget/ScrollBarDrawable;->isStateful()Z +HSPLandroid/widget/ScrollBarDrawable;->mutate()Landroid/widget/ScrollBarDrawable; HSPLandroid/widget/ScrollBarDrawable;->onBoundsChange(Landroid/graphics/Rect;)V HSPLandroid/widget/ScrollBarDrawable;->onStateChange([I)Z -HSPLandroid/widget/ScrollBarDrawable;->propagateCurrentState(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/ScrollBarDrawable;Landroid/widget/ScrollBarDrawable;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; -HSPLandroid/widget/ScrollBarDrawable;->setAlpha(I)V+]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/GradientDrawable; +HSPLandroid/widget/ScrollBarDrawable;->propagateCurrentState(Landroid/graphics/drawable/Drawable;)V +HSPLandroid/widget/ScrollBarDrawable;->setAlpha(I)V HSPLandroid/widget/ScrollBarDrawable;->setAlwaysDrawVerticalTrack(Z)V HSPLandroid/widget/ScrollBarDrawable;->setHorizontalThumbDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/widget/ScrollBarDrawable;->setHorizontalTrackDrawable(Landroid/graphics/drawable/Drawable;)V @@ -20509,11 +20362,10 @@ HSPLandroid/widget/TextView$SavedState$1;->createFromParcel(Landroid/os/Parcel;) HSPLandroid/widget/TextView$SavedState;->(Landroid/os/Parcel;)V HSPLandroid/widget/TextView$SavedState;->writeToParcel(Landroid/os/Parcel;I)V HSPLandroid/widget/TextView$TextAppearanceAttributes;->()V -HSPLandroid/widget/TextView$TextAppearanceAttributes;->(Landroid/widget/TextView$TextAppearanceAttributes-IA;)V HSPLandroid/widget/TextView;->(Landroid/content/Context;)V HSPLandroid/widget/TextView;->(Landroid/content/Context;Landroid/util/AttributeSet;)V HSPLandroid/widget/TextView;->(Landroid/content/Context;Landroid/util/AttributeSet;I)V -HSPLandroid/widget/TextView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V+]Landroid/graphics/Paint;Landroid/graphics/Paint;]Landroid/content/res/Resources$Theme;Landroid/content/res/Resources$Theme;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/view/ViewConfiguration;Landroid/view/ViewConfiguration;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/Context;missing_types]Landroid/widget/TextView;missing_types +HSPLandroid/widget/TextView;->(Landroid/content/Context;Landroid/util/AttributeSet;II)V HSPLandroid/widget/TextView;->addSearchHighlightPaths()V HSPLandroid/widget/TextView;->addTextChangedListener(Landroid/text/TextWatcher;)V HSPLandroid/widget/TextView;->applyCompoundDrawableTint()V @@ -20533,8 +20385,8 @@ HSPLandroid/widget/TextView;->cleanupAutoSizePresetSizes([I)[I HSPLandroid/widget/TextView;->compressText(F)Z HSPLandroid/widget/TextView;->computeHorizontalScrollRange()I HSPLandroid/widget/TextView;->computeScroll()V -HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I+]Landroid/widget/TextView;missing_types -HSPLandroid/widget/TextView;->computeVerticalScrollRange()I+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout; +HSPLandroid/widget/TextView;->computeVerticalScrollExtent()I +HSPLandroid/widget/TextView;->computeVerticalScrollRange()I HSPLandroid/widget/TextView;->convertToLocalHorizontalCoordinate(F)F HSPLandroid/widget/TextView;->createEditorIfNeeded()V HSPLandroid/widget/TextView;->didTouchFocusSelect()Z @@ -20552,7 +20404,7 @@ HSPLandroid/widget/TextView;->getAutofillValue()Landroid/view/autofill/AutofillV HSPLandroid/widget/TextView;->getBaseline()I HSPLandroid/widget/TextView;->getBaselineOffset()I HSPLandroid/widget/TextView;->getBottomVerticalOffset(Z)I -HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)I+]Landroid/widget/TextView;Landroid/widget/EditText;,Landroid/widget/Button; +HSPLandroid/widget/TextView;->getBoxHeight(Landroid/text/Layout;)I HSPLandroid/widget/TextView;->getBreakStrategy()I HSPLandroid/widget/TextView;->getCompoundDrawablePadding()I HSPLandroid/widget/TextView;->getCompoundDrawables()[Landroid/graphics/drawable/Drawable; @@ -20565,12 +20417,12 @@ HSPLandroid/widget/TextView;->getCurrentTextColor()I HSPLandroid/widget/TextView;->getDefaultEditable()Z HSPLandroid/widget/TextView;->getDefaultMovementMethod()Landroid/text/method/MovementMethod; HSPLandroid/widget/TextView;->getDesiredHeight()I -HSPLandroid/widget/TextView;->getDesiredHeight(Landroid/text/Layout;Z)I+]Landroid/text/Layout;Landroid/text/BoringLayout;]Landroid/widget/TextView;Landroid/widget/TextView; +HSPLandroid/widget/TextView;->getDesiredHeight(Landroid/text/Layout;Z)I HSPLandroid/widget/TextView;->getEditableText()Landroid/text/Editable; HSPLandroid/widget/TextView;->getEllipsize()Landroid/text/TextUtils$TruncateAt; HSPLandroid/widget/TextView;->getError()Ljava/lang/CharSequence; -HSPLandroid/widget/TextView;->getExtendedPaddingBottom()I+]Landroid/text/Layout;Landroid/text/StaticLayout;]Landroid/widget/TextView;Landroid/widget/TextView; -HSPLandroid/widget/TextView;->getExtendedPaddingTop()I+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/widget/TextView;Landroid/widget/TextView;,Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/Button; +HSPLandroid/widget/TextView;->getExtendedPaddingBottom()I +HSPLandroid/widget/TextView;->getExtendedPaddingTop()I HSPLandroid/widget/TextView;->getFilters()[Landroid/text/InputFilter; HSPLandroid/widget/TextView;->getFocusedRect(Landroid/graphics/Rect;)V HSPLandroid/widget/TextView;->getFreezesText()Z @@ -20602,7 +20454,7 @@ HSPLandroid/widget/TextView;->getOffsetForPosition(FF)I HSPLandroid/widget/TextView;->getPaint()Landroid/text/TextPaint; HSPLandroid/widget/TextView;->getSelectionEnd()I HSPLandroid/widget/TextView;->getSelectionEndTransformed()I -HSPLandroid/widget/TextView;->getSelectionStart()I+]Landroid/widget/TextView;missing_types +HSPLandroid/widget/TextView;->getSelectionStart()I HSPLandroid/widget/TextView;->getSelectionStartTransformed()I HSPLandroid/widget/TextView;->getServiceManagerForUser(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object; HSPLandroid/widget/TextView;->getSpellCheckerLocale()Ljava/util/Locale; @@ -20634,20 +20486,20 @@ HSPLandroid/widget/TextView;->hasSelection()Z HSPLandroid/widget/TextView;->hideErrorIfUnchanged()V HSPLandroid/widget/TextView;->invalidateCursor()V HSPLandroid/widget/TextView;->invalidateCursorPath()V -HSPLandroid/widget/TextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V+]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/Button;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/AnimatedStateListDrawable;,Landroid/graphics/drawable/InsetDrawable;,Landroid/graphics/drawable/RippleDrawable;,Landroid/graphics/drawable/LayerDrawable;,Landroid/graphics/drawable/VectorDrawable; +HSPLandroid/widget/TextView;->invalidateDrawable(Landroid/graphics/drawable/Drawable;)V HSPLandroid/widget/TextView;->invalidateRegion(IIZ)V HSPLandroid/widget/TextView;->isAnyPasswordInputType()Z HSPLandroid/widget/TextView;->isAutoSizeEnabled()Z HSPLandroid/widget/TextView;->isAutofillable()Z HSPLandroid/widget/TextView;->isFallbackLineSpacingForStaticLayout()Z -HSPLandroid/widget/TextView;->isFromPrimePointer(Landroid/view/MotionEvent;Z)Z+]Landroid/view/MotionEvent;Landroid/view/MotionEvent; +HSPLandroid/widget/TextView;->isFromPrimePointer(Landroid/view/MotionEvent;Z)Z HSPLandroid/widget/TextView;->isInBatchEditMode()Z HSPLandroid/widget/TextView;->isInExtractedMode()Z HSPLandroid/widget/TextView;->isInputMethodTarget()Z HSPLandroid/widget/TextView;->isMarqueeFadeEnabled()Z HSPLandroid/widget/TextView;->isMultilineInputType(I)Z HSPLandroid/widget/TextView;->isPasswordInputType(I)Z -HSPLandroid/widget/TextView;->isPositionVisible(FF)Z+]Landroid/view/View;missing_types]Landroid/graphics/Matrix;Landroid/graphics/Matrix; +HSPLandroid/widget/TextView;->isPositionVisible(FF)Z HSPLandroid/widget/TextView;->isShowingHint()Z HSPLandroid/widget/TextView;->isSuggestionsEnabled()Z HSPLandroid/widget/TextView;->isTextAutofillable()Z @@ -20656,8 +20508,8 @@ HSPLandroid/widget/TextView;->isTextSelectable()Z HSPLandroid/widget/TextView;->isVisibleToAccessibility()Z HSPLandroid/widget/TextView;->jumpDrawablesToCurrentState()V HSPLandroid/widget/TextView;->length()I -HSPLandroid/widget/TextView;->makeNewLayout(IILandroid/text/BoringLayout$Metrics;Landroid/text/BoringLayout$Metrics;IZ)V+]Landroid/text/BoringLayout;Landroid/text/BoringLayout;]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;,Landroid/widget/Button; -HSPLandroid/widget/TextView;->makeSingleLayout(ILandroid/text/BoringLayout$Metrics;ILandroid/text/Layout$Alignment;ZLandroid/text/TextUtils$TruncateAt;Z)Landroid/text/Layout;+]Landroid/text/DynamicLayout$Builder;Landroid/text/DynamicLayout$Builder;]Landroid/text/BoringLayout;Landroid/text/BoringLayout;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;]Ljava/lang/CharSequence;Ljava/lang/String;]Landroid/text/StaticLayout$Builder;Landroid/text/StaticLayout$Builder; +HSPLandroid/widget/TextView;->makeNewLayout(IILandroid/text/BoringLayout$Metrics;Landroid/text/BoringLayout$Metrics;IZ)V +HSPLandroid/widget/TextView;->makeSingleLayout(ILandroid/text/BoringLayout$Metrics;ILandroid/text/Layout$Alignment;ZLandroid/text/TextUtils$TruncateAt;Z)Landroid/text/Layout; HSPLandroid/widget/TextView;->maybeUpdateHighlightPaths()V HSPLandroid/widget/TextView;->notifyContentCaptureTextChanged()V HSPLandroid/widget/TextView;->notifyListeningManagersAfterTextChanged()V @@ -20669,7 +20521,7 @@ HSPLandroid/widget/TextView;->onConfigurationChanged(Landroid/content/res/Config HSPLandroid/widget/TextView;->onCreateDrawableState(I)[I HSPLandroid/widget/TextView;->onCreateInputConnection(Landroid/view/inputmethod/EditorInfo;)Landroid/view/inputmethod/InputConnection; HSPLandroid/widget/TextView;->onDetachedFromWindowInternal()V -HSPLandroid/widget/TextView;->onDraw(Landroid/graphics/Canvas;)V+]Landroid/text/Layout;Landroid/text/BoringLayout;,Landroid/text/StaticLayout;,Landroid/text/DynamicLayout;]Landroid/widget/TextView;missing_types]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/graphics/Canvas;Landroid/graphics/RecordingCanvas;]Landroid/widget/Editor;Landroid/widget/Editor;]Ljava/lang/CharSequence;Landroid/text/SpannableStringBuilder; +HSPLandroid/widget/TextView;->onDraw(Landroid/graphics/Canvas;)V HSPLandroid/widget/TextView;->onEditorAction(I)V HSPLandroid/widget/TextView;->onEndBatchEdit()V HSPLandroid/widget/TextView;->onFocusChanged(ZILandroid/graphics/Rect;)V @@ -20680,7 +20532,7 @@ HSPLandroid/widget/TextView;->onKeyPreIme(ILandroid/view/KeyEvent;)Z HSPLandroid/widget/TextView;->onKeyUp(ILandroid/view/KeyEvent;)Z HSPLandroid/widget/TextView;->onLayout(ZIIII)V HSPLandroid/widget/TextView;->onLocaleChanged()V -HSPLandroid/widget/TextView;->onMeasure(II)V+]Landroid/text/Layout;Landroid/text/DynamicLayout;,Landroid/text/BoringLayout;,Landroid/text/StaticLayout;]Landroid/widget/TextView;Landroid/widget/CheckBox;,Landroid/widget/EditText;,Landroid/widget/TextView;,Landroid/widget/Button; +HSPLandroid/widget/TextView;->onMeasure(II)V HSPLandroid/widget/TextView;->onPreDraw()Z HSPLandroid/widget/TextView;->onProvideStructure(Landroid/view/ViewStructure;II)V HSPLandroid/widget/TextView;->onResolveDrawables(I)V @@ -20697,7 +20549,7 @@ HSPLandroid/widget/TextView;->onVisibilityChanged(Landroid/view/View;I)V HSPLandroid/widget/TextView;->onWindowFocusChanged(Z)V HSPLandroid/widget/TextView;->originalToTransformed(II)I HSPLandroid/widget/TextView;->preloadFontCache()V -HSPLandroid/widget/TextView;->readTextAppearance(Landroid/content/Context;Landroid/content/res/TypedArray;Landroid/widget/TextView$TextAppearanceAttributes;Z)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/TypedValue;Landroid/util/TypedValue;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/Context;missing_types +HSPLandroid/widget/TextView;->readTextAppearance(Landroid/content/Context;Landroid/content/res/TypedArray;Landroid/widget/TextView$TextAppearanceAttributes;Z)V HSPLandroid/widget/TextView;->registerForPreDraw()V HSPLandroid/widget/TextView;->removeAdjacentSuggestionSpans(I)V HSPLandroid/widget/TextView;->removeIntersectingNonAdjacentSpans(IILjava/lang/Class;)V @@ -20773,7 +20625,7 @@ HSPLandroid/widget/TextView;->setSingleLine(Z)V HSPLandroid/widget/TextView;->setText(I)V HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;)V -HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V+]Landroid/text/Editable$Factory;Landroid/text/Editable$Factory;]Landroid/text/method/MovementMethod;Landroid/text/method/ArrowKeyMovementMethod;,Landroid/text/method/ScrollingMovementMethod;]Landroid/text/method/TransformationMethod;Landroid/text/method/SingleLineTransformationMethod;]Landroid/widget/Editor;Landroid/widget/Editor;]Landroid/text/InputFilter;Landroid/text/InputFilter$LengthFilter;]Landroid/text/TextPaint;Landroid/text/TextPaint;]Landroid/text/Spanned;Landroid/text/SpannableString;]Landroid/text/Spannable$Factory;Landroid/text/Spannable$Factory;]Ljava/lang/CharSequence;Ljava/lang/String;,Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Landroid/text/Spannable;Landroid/text/SpannableStringBuilder;,Landroid/text/SpannableString; +HSPLandroid/widget/TextView;->setText(Ljava/lang/CharSequence;Landroid/widget/TextView$BufferType;ZI)V HSPLandroid/widget/TextView;->setTextAppearance(I)V HSPLandroid/widget/TextView;->setTextAppearance(Landroid/content/Context;I)V HSPLandroid/widget/TextView;->setTextColor(I)V @@ -20864,7 +20716,7 @@ HSPLandroid/widget/inline/InlinePresentationSpec$1;->createFromParcel(Landroid/o HSPLandroid/widget/inline/InlinePresentationSpec;->()V HSPLandroid/widget/inline/InlinePresentationSpec;->(Landroid/os/Parcel;)V HSPLandroid/widget/inline/InlinePresentationSpec;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/window/BackProgressAnimator;->()V+]Lcom/android/internal/dynamicanimation/animation/SpringAnimation;Lcom/android/internal/dynamicanimation/animation/SpringAnimation;]Lcom/android/internal/dynamicanimation/animation/SpringForce;Lcom/android/internal/dynamicanimation/animation/SpringForce; +HSPLandroid/window/BackProgressAnimator;->()V HSPLandroid/window/ClientWindowFrames$1;->()V HSPLandroid/window/ClientWindowFrames$1;->createFromParcel(Landroid/os/Parcel;)Landroid/window/ClientWindowFrames; HSPLandroid/window/ClientWindowFrames$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -20912,8 +20764,6 @@ HSPLandroid/window/SizeConfigurationBuckets$1;->()V HSPLandroid/window/SizeConfigurationBuckets;->()V HSPLandroid/window/SizeConfigurationBuckets;->([Landroid/content/res/Configuration;)V HSPLandroid/window/SizeConfigurationBuckets;->writeToParcel(Landroid/os/Parcel;I)V -HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V -HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;)V HSPLandroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V HSPLandroid/window/SurfaceSyncGroup$2;->(Landroid/window/SurfaceSyncGroup;Z)V HSPLandroid/window/SurfaceSyncGroup$2;->onTransactionReady(Landroid/view/SurfaceControl$Transaction;)V @@ -20973,17 +20823,13 @@ HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->-$$Nest$mgetContext(L HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->(Landroid/content/Context;)V HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->checkApplicationCallbackRegistration(ILandroid/window/OnBackInvokedCallback;)Z HSPLandroid/window/WindowOnBackInvokedDispatcher$Checker;->getContext()Landroid/content/Context; -HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0;->(Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;)V HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0;->run()V HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2;->run()V HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3;->run()V -HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef;->(Landroid/window/OnBackInvokedCallback;Z)V HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->getBackAnimationCallback()Landroid/window/OnBackAnimationCallback; HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->onBackCancelled()V HSPLandroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper;->onBackInvoked()V HSPLandroid/window/WindowOnBackInvokedDispatcher;->()V -HSPLandroid/window/WindowOnBackInvokedDispatcher;->(Landroid/content/Context;)V -HSPLandroid/window/WindowOnBackInvokedDispatcher;->attachToWindow(Landroid/view/IWindowSession;Landroid/view/IWindow;)V HSPLandroid/window/WindowOnBackInvokedDispatcher;->clear()V HSPLandroid/window/WindowOnBackInvokedDispatcher;->detachFromWindow()V HSPLandroid/window/WindowOnBackInvokedDispatcher;->getTopCallback()Landroid/window/OnBackInvokedCallback; @@ -21019,12 +20865,12 @@ HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegion(Ljava/l HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getMetadataForRegionOrCallingCode(ILjava/lang/String;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata; HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNationalSignificantNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberDescByType(Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;)Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc; -HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType;+]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;]Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Lcom/android/i18n/phonenumbers/PhoneNumberUtil; +HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getNumberTypeHelper(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;)Lcom/android/i18n/phonenumbers/PhoneNumberUtil$PhoneNumberType; HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForCountryCode(I)Ljava/lang/String; HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Ljava/lang/String; -HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String;+]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneMetadata;]Ljava/util/List;Ljava/util/ArrayList;]Lcom/android/i18n/phonenumbers/PhoneNumberUtil;Lcom/android/i18n/phonenumbers/PhoneNumberUtil;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->getRegionCodeForNumberFromRegionList(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/util/List;)Ljava/lang/String; HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->hasFormattingPatternForNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z -HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/i18n/phonenumbers/internal/MatcherApi;Lcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isNumberMatchingDesc(Ljava/lang/String;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;)Z HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumber(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;)Z HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidNumberForRegion(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;Ljava/lang/String;)Z HSPLcom/android/i18n/phonenumbers/PhoneNumberUtil;->isValidRegionCode(Ljava/lang/String;)Z @@ -21129,8 +20975,8 @@ HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCode(I)Lco HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setCountryCodeSource(Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber$CountryCodeSource;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setNationalNumber(J)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber; HSPLcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber;->setRawInput(Ljava/lang/String;)Lcom/android/i18n/phonenumbers/Phonenumber$PhoneNumber; -HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z+]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern; -HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;]Lcom/android/i18n/phonenumbers/internal/RegexCache;Lcom/android/i18n/phonenumbers/internal/RegexCache; +HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->match(Ljava/lang/CharSequence;Ljava/util/regex/Pattern;Z)Z +HSPLcom/android/i18n/phonenumbers/internal/RegexBasedMatcher;->matchNationalNumber(Ljava/lang/CharSequence;Lcom/android/i18n/phonenumbers/Phonemetadata$PhoneNumberDesc;Z)Z HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache$1;->removeEldestEntry(Ljava/util/Map$Entry;)Z HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/i18n/phonenumbers/internal/RegexCache$LRUCache;->put(Ljava/lang/Object;Ljava/lang/Object;)V @@ -21172,7 +21018,7 @@ HSPLcom/android/i18n/timezone/ZoneInfoData;->findTransitionIndex(J)I HSPLcom/android/i18n/timezone/ZoneInfoData;->getID()Ljava/lang/String; HSPLcom/android/i18n/timezone/ZoneInfoData;->getLatestDstSavingsMillis(J)Ljava/lang/Integer; HSPLcom/android/i18n/timezone/ZoneInfoData;->getOffset(J)I -HSPLcom/android/i18n/timezone/ZoneInfoData;->getOffsetsByUtcTime(J[I)I+]Lcom/android/i18n/timezone/ZoneInfoData;Lcom/android/i18n/timezone/ZoneInfoData; +HSPLcom/android/i18n/timezone/ZoneInfoData;->getOffsetsByUtcTime(J[I)I HSPLcom/android/i18n/timezone/ZoneInfoData;->getRawOffset()I HSPLcom/android/i18n/timezone/ZoneInfoData;->getTransitions()[J HSPLcom/android/i18n/timezone/ZoneInfoData;->hashCode()I @@ -21208,10 +21054,10 @@ HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readInt()I HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->readLongArray([JII)V HSPLcom/android/i18n/timezone/internal/NioBufferIterator;->skip(I)V HSPLcom/android/icu/charset/CharsetDecoderICU;->(Ljava/nio/charset/Charset;FJ)V -HSPLcom/android/icu/charset/CharsetDecoderICU;->decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; -HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/ByteBuffer;)I+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; -HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/CharBuffer;)I+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer; -HSPLcom/android/icu/charset/CharsetDecoderICU;->implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult;+]Lcom/android/icu/charset/CharsetDecoderICU;Lcom/android/icu/charset/CharsetDecoderICU; +HSPLcom/android/icu/charset/CharsetDecoderICU;->decodeLoop(Ljava/nio/ByteBuffer;Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult; +HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/ByteBuffer;)I +HSPLcom/android/icu/charset/CharsetDecoderICU;->getArray(Ljava/nio/CharBuffer;)I +HSPLcom/android/icu/charset/CharsetDecoderICU;->implFlush(Ljava/nio/CharBuffer;)Ljava/nio/charset/CoderResult; HSPLcom/android/icu/charset/CharsetDecoderICU;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V HSPLcom/android/icu/charset/CharsetDecoderICU;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V HSPLcom/android/icu/charset/CharsetDecoderICU;->implReplaceWith(Ljava/lang/String;)V @@ -21221,16 +21067,16 @@ HSPLcom/android/icu/charset/CharsetDecoderICU;->setPosition(Ljava/nio/ByteBuffer HSPLcom/android/icu/charset/CharsetDecoderICU;->setPosition(Ljava/nio/CharBuffer;)V HSPLcom/android/icu/charset/CharsetDecoderICU;->updateCallback()V HSPLcom/android/icu/charset/CharsetEncoderICU;->(Ljava/nio/charset/Charset;FF[BJ)V -HSPLcom/android/icu/charset/CharsetEncoderICU;->encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult;+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer; -HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/ByteBuffer;)I+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; -HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/CharBuffer;)I+]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer; +HSPLcom/android/icu/charset/CharsetEncoderICU;->encodeLoop(Ljava/nio/CharBuffer;Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult; +HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/ByteBuffer;)I +HSPLcom/android/icu/charset/CharsetEncoderICU;->getArray(Ljava/nio/CharBuffer;)I HSPLcom/android/icu/charset/CharsetEncoderICU;->implFlush(Ljava/nio/ByteBuffer;)Ljava/nio/charset/CoderResult; HSPLcom/android/icu/charset/CharsetEncoderICU;->implOnMalformedInput(Ljava/nio/charset/CodingErrorAction;)V HSPLcom/android/icu/charset/CharsetEncoderICU;->implOnUnmappableCharacter(Ljava/nio/charset/CodingErrorAction;)V HSPLcom/android/icu/charset/CharsetEncoderICU;->implReset()V HSPLcom/android/icu/charset/CharsetEncoderICU;->makeReplacement(Ljava/lang/String;J)[B HSPLcom/android/icu/charset/CharsetEncoderICU;->newInstance(Ljava/nio/charset/Charset;Ljava/lang/String;)Lcom/android/icu/charset/CharsetEncoderICU; -HSPLcom/android/icu/charset/CharsetEncoderICU;->setPosition(Ljava/nio/ByteBuffer;)V+]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; +HSPLcom/android/icu/charset/CharsetEncoderICU;->setPosition(Ljava/nio/ByteBuffer;)V HSPLcom/android/icu/charset/CharsetEncoderICU;->setPosition(Ljava/nio/CharBuffer;)V HSPLcom/android/icu/charset/CharsetEncoderICU;->updateCallback()V HSPLcom/android/icu/charset/CharsetFactory;->create(Ljava/lang/String;)Ljava/nio/charset/Charset; @@ -21270,7 +21116,7 @@ HSPLcom/android/icu/util/ExtendedTimeZone;->utcStartTime(JLandroid/icu/util/Time HSPLcom/android/icu/util/LocaleNative;->getDisplayCountry(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String; HSPLcom/android/icu/util/LocaleNative;->getDisplayLanguage(Ljava/util/Locale;Ljava/util/Locale;)Ljava/lang/String; HSPLcom/android/icu/util/LocaleNative;->setDefault(Ljava/lang/String;)V -HSPLcom/android/icu/util/regex/MatcherNative;->(Lcom/android/icu/util/regex/PatternNative;)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry;]Lcom/android/icu/util/regex/PatternNative;Lcom/android/icu/util/regex/PatternNative; +HSPLcom/android/icu/util/regex/MatcherNative;->(Lcom/android/icu/util/regex/PatternNative;)V HSPLcom/android/icu/util/regex/MatcherNative;->create(Lcom/android/icu/util/regex/PatternNative;)Lcom/android/icu/util/regex/MatcherNative; HSPLcom/android/icu/util/regex/MatcherNative;->find(I[I)Z HSPLcom/android/icu/util/regex/MatcherNative;->findNext([I)Z @@ -21282,7 +21128,7 @@ HSPLcom/android/icu/util/regex/MatcherNative;->requireEnd()Z HSPLcom/android/icu/util/regex/MatcherNative;->setInput(Ljava/lang/String;II)V HSPLcom/android/icu/util/regex/MatcherNative;->useAnchoringBounds(Z)V HSPLcom/android/icu/util/regex/MatcherNative;->useTransparentBounds(Z)V -HSPLcom/android/icu/util/regex/PatternNative;->(Ljava/lang/String;I)V+]Llibcore/util/NativeAllocationRegistry;Llibcore/util/NativeAllocationRegistry; +HSPLcom/android/icu/util/regex/PatternNative;->(Ljava/lang/String;I)V HSPLcom/android/icu/util/regex/PatternNative;->create(Ljava/lang/String;I)Lcom/android/icu/util/regex/PatternNative; HSPLcom/android/icu/util/regex/PatternNative;->openMatcher()J HSPLcom/android/internal/app/AlertController;->(Landroid/content/Context;Landroid/content/DialogInterface;Landroid/view/Window;)V @@ -21350,15 +21196,15 @@ HSPLcom/android/internal/appwidget/IAppWidgetService$Stub;->asInterface(Landroid HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->getMainColor()I HSPLcom/android/internal/colorextraction/ColorExtractor$GradientColors;->supportsDarkText()Z HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->(JI)V -HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/internal/compat/ChangeReporter$ChangeReport; +HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->equals(Ljava/lang/Object;)Z HSPLcom/android/internal/compat/ChangeReporter$ChangeReport;->hashCode()I HSPLcom/android/internal/compat/ChangeReporter;->(I)V HSPLcom/android/internal/compat/ChangeReporter;->debugLog(IJI)V -HSPLcom/android/internal/compat/ChangeReporter;->isAlreadyReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)Z+]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashSet; -HSPLcom/android/internal/compat/ChangeReporter;->markAsReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)V+]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashSet; -HSPLcom/android/internal/compat/ChangeReporter;->reportChange(IJI)V+]Lcom/android/internal/compat/ChangeReporter;Lcom/android/internal/compat/ChangeReporter; +HSPLcom/android/internal/compat/ChangeReporter;->isAlreadyReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)Z +HSPLcom/android/internal/compat/ChangeReporter;->markAsReported(ILcom/android/internal/compat/ChangeReporter$ChangeReport;)V +HSPLcom/android/internal/compat/ChangeReporter;->reportChange(IJI)V HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToDebug(IJI)Z -HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToStatsLog(IJI)Z +HSPLcom/android/internal/compat/ChangeReporter;->shouldWriteToDebug(ZIZ)Z HSPLcom/android/internal/compat/ChangeReporter;->stateToString(I)Ljava/lang/String; HSPLcom/android/internal/compat/IPlatformCompat$Stub;->asInterface(Landroid/os/IBinder;)Lcom/android/internal/compat/IPlatformCompat; HSPLcom/android/internal/content/PackageMonitor;->()V @@ -21416,6 +21262,7 @@ HSPLcom/android/internal/graphics/drawable/AnimationScaleListDrawable;->stop()V HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;->(Landroid/view/ViewRootImpl;)V HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;->hasRegions()Z HSPLcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator;->hasUpdates()Z +HSPLcom/android/internal/hidden_from_bootclasspath/android/os/FeatureFlagsImpl;->messageQueueTailTracking()Z HSPLcom/android/internal/infra/AndroidFuture$1;->complete(Lcom/android/internal/infra/AndroidFuture;)V HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Lcom/android/internal/infra/AndroidFuture; HSPLcom/android/internal/infra/AndroidFuture$2;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object; @@ -21625,7 +21472,6 @@ HSPLcom/android/internal/os/RuntimeInit$Arguments;->([Ljava/lang/String;)V HSPLcom/android/internal/os/RuntimeInit$Arguments;->parseArgs([Ljava/lang/String;)V HSPLcom/android/internal/os/RuntimeInit$KillApplicationHandler;->(Lcom/android/internal/os/RuntimeInit$LoggingHandler;)V HSPLcom/android/internal/os/RuntimeInit$LoggingHandler;->()V -HSPLcom/android/internal/os/RuntimeInit$LoggingHandler;->(Lcom/android/internal/os/RuntimeInit$LoggingHandler-IA;)V HSPLcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;->(Ljava/lang/reflect/Method;[Ljava/lang/String;)V HSPLcom/android/internal/os/RuntimeInit$MethodAndArgsCaller;->run()V HSPLcom/android/internal/os/RuntimeInit;->applicationInit(I[J[Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/Runnable; @@ -21701,7 +21547,6 @@ HSPLcom/android/internal/os/ZygoteInit;->gcAndFinalize()V HSPLcom/android/internal/os/ZygoteInit;->isExperimentEnabled(Ljava/lang/String;)Z HSPLcom/android/internal/os/ZygoteInit;->main([Ljava/lang/String;)V HSPLcom/android/internal/os/ZygoteInit;->maybePreloadGraphicsDriver()V -HSPLcom/android/internal/os/ZygoteInit;->posixCapabilitiesAsBits([I)J HSPLcom/android/internal/os/ZygoteInit;->preload(Landroid/util/TimingsTraceLog;)V HSPLcom/android/internal/os/ZygoteInit;->preloadClasses()V HSPLcom/android/internal/os/ZygoteInit;->preloadSharedLibraries()V @@ -21725,7 +21570,7 @@ HSPLcom/android/internal/os/ZygoteServer;->setForkChild()V HSPLcom/android/internal/policy/DecorContext;->(Landroid/content/Context;Lcom/android/internal/policy/PhoneWindow;)V HSPLcom/android/internal/policy/DecorContext;->getAutofillOptions()Landroid/content/AutofillOptions; HSPLcom/android/internal/policy/DecorContext;->getContentCaptureOptions()Landroid/content/ContentCaptureOptions; -HSPLcom/android/internal/policy/DecorContext;->getResources()Landroid/content/res/Resources;+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; +HSPLcom/android/internal/policy/DecorContext;->getResources()Landroid/content/res/Resources; HSPLcom/android/internal/policy/DecorContext;->getSystemService(Ljava/lang/String;)Ljava/lang/Object; HSPLcom/android/internal/policy/DecorContext;->isUiContext()Z HSPLcom/android/internal/policy/DecorContext;->setPhoneWindow(Lcom/android/internal/policy/PhoneWindow;)V @@ -21737,42 +21582,33 @@ HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isPresent(ZIZ)Z HSPLcom/android/internal/policy/DecorView$ColorViewAttributes;->isVisible(ZIIZ)Z HSPLcom/android/internal/policy/DecorView$ColorViewState;->(Lcom/android/internal/policy/DecorView$ColorViewAttributes;)V HSPLcom/android/internal/policy/DecorView;->(Landroid/content/Context;ILcom/android/internal/policy/PhoneWindow;Landroid/view/WindowManager$LayoutParams;)V -HSPLcom/android/internal/policy/DecorView;->calculateNavigationBarColor(I)I+]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow; -HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor(I)I+]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow; -HSPLcom/android/internal/policy/DecorView;->createDecorCaptionView(Landroid/view/LayoutInflater;)Lcom/android/internal/widget/DecorCaptionView; +HSPLcom/android/internal/policy/DecorView;->calculateNavigationBarColor(I)I +HSPLcom/android/internal/policy/DecorView;->calculateStatusBarColor(I)I HSPLcom/android/internal/policy/DecorView;->dispatchKeyEvent(Landroid/view/KeyEvent;)Z HSPLcom/android/internal/policy/DecorView;->dispatchTouchEvent(Landroid/view/MotionEvent;)Z HSPLcom/android/internal/policy/DecorView;->draw(Landroid/graphics/Canvas;)V HSPLcom/android/internal/policy/DecorView;->drawLegacyNavigationBarBackground(Landroid/graphics/RecordingCanvas;)V HSPLcom/android/internal/policy/DecorView;->drawableChanged()V -HSPLcom/android/internal/policy/DecorView;->enableCaption(Z)V -HSPLcom/android/internal/policy/DecorView;->enforceNonTranslucentBackground(Landroid/graphics/drawable/Drawable;Z)Landroid/graphics/drawable/Drawable; HSPLcom/android/internal/policy/DecorView;->finishChanging()V -HSPLcom/android/internal/policy/DecorView;->gatherTransparentRegion(Landroid/graphics/Region;)Z -HSPLcom/android/internal/policy/DecorView;->gatherTransparentRegion(Lcom/android/internal/policy/DecorView$ColorViewState;Landroid/graphics/Region;)Z HSPLcom/android/internal/policy/DecorView;->getAccessibilityViewId()I HSPLcom/android/internal/policy/DecorView;->getBackground()Landroid/graphics/drawable/Drawable; -HSPLcom/android/internal/policy/DecorView;->getCaptionHeight()I -HSPLcom/android/internal/policy/DecorView;->getCaptionInsetsHeight()I HSPLcom/android/internal/policy/DecorView;->getNavBarSize(III)I -HSPLcom/android/internal/policy/DecorView;->getResources()Landroid/content/res/Resources;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext; -HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Ljava/lang/CharSequence;Ljava/lang/String; -HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView; +HSPLcom/android/internal/policy/DecorView;->getResources()Landroid/content/res/Resources; +HSPLcom/android/internal/policy/DecorView;->getTitleSuffix(Landroid/view/WindowManager$LayoutParams;)Ljava/lang/String; +HSPLcom/android/internal/policy/DecorView;->getWindowInsetsController()Landroid/view/WindowInsetsController; HSPLcom/android/internal/policy/DecorView;->initializeElevation()V HSPLcom/android/internal/policy/DecorView;->isNavBarToLeftEdge(II)Z HSPLcom/android/internal/policy/DecorView;->isNavBarToRightEdge(II)Z -HSPLcom/android/internal/policy/DecorView;->isResizing()Z -HSPLcom/android/internal/policy/DecorView;->isShowingCaption()Z HSPLcom/android/internal/policy/DecorView;->onApplyWindowInsets(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLcom/android/internal/policy/DecorView;->onAttachedToWindow()V HSPLcom/android/internal/policy/DecorView;->onCloseSystemDialogs(Ljava/lang/String;)V HSPLcom/android/internal/policy/DecorView;->onConfigurationChanged(Landroid/content/res/Configuration;)V HSPLcom/android/internal/policy/DecorView;->onContentDrawn(IIII)Z HSPLcom/android/internal/policy/DecorView;->onDetachedFromWindow()V -HSPLcom/android/internal/policy/DecorView;->onDraw(Landroid/graphics/Canvas;)V+]Lcom/android/internal/widget/BackgroundFallback;Lcom/android/internal/widget/BackgroundFallback; +HSPLcom/android/internal/policy/DecorView;->onDraw(Landroid/graphics/Canvas;)V HSPLcom/android/internal/policy/DecorView;->onInterceptTouchEvent(Landroid/view/MotionEvent;)Z HSPLcom/android/internal/policy/DecorView;->onLayout(ZIIII)V -HSPLcom/android/internal/policy/DecorView;->onMeasure(II)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/Context;Landroid/view/ContextThemeWrapper;,Lcom/android/internal/policy/DecorContext;]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLcom/android/internal/policy/DecorView;->onMeasure(II)V HSPLcom/android/internal/policy/DecorView;->onPostDraw(Landroid/graphics/RecordingCanvas;)V HSPLcom/android/internal/policy/DecorView;->onResourcesLoaded(Landroid/view/LayoutInflater;I)V HSPLcom/android/internal/policy/DecorView;->onRootViewScrollYChanged(I)V @@ -21781,13 +21617,12 @@ HSPLcom/android/internal/policy/DecorView;->onTouchEvent(Landroid/view/MotionEve HSPLcom/android/internal/policy/DecorView;->onWindowFocusChanged(Z)V HSPLcom/android/internal/policy/DecorView;->onWindowSystemUiVisibilityChanged(I)V HSPLcom/android/internal/policy/DecorView;->providePendingInsetsController()Landroid/view/PendingInsetsController; -HSPLcom/android/internal/policy/DecorView;->releaseThreadedRenderer()V HSPLcom/android/internal/policy/DecorView;->removeBackgroundBlurDrawable()V HSPLcom/android/internal/policy/DecorView;->sendAccessibilityEvent(I)V HSPLcom/android/internal/policy/DecorView;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/android/internal/policy/DecorView;->setBackgroundFallback(Landroid/graphics/drawable/Drawable;)V HSPLcom/android/internal/policy/DecorView;->setColor(Landroid/view/View;IIZZ)V -HSPLcom/android/internal/policy/DecorView;->setFrame(IIII)Z+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/graphics/drawable/Drawable;Landroid/graphics/drawable/ColorDrawable; +HSPLcom/android/internal/policy/DecorView;->setFrame(IIII)Z HSPLcom/android/internal/policy/DecorView;->setWindow(Lcom/android/internal/policy/PhoneWindow;)V HSPLcom/android/internal/policy/DecorView;->setWindowBackground(Landroid/graphics/drawable/Drawable;)V HSPLcom/android/internal/policy/DecorView;->setWindowFrame(Landroid/graphics/drawable/Drawable;)V @@ -21795,18 +21630,16 @@ HSPLcom/android/internal/policy/DecorView;->startChanging()V HSPLcom/android/internal/policy/DecorView;->superDispatchKeyEvent(Landroid/view/KeyEvent;)Z HSPLcom/android/internal/policy/DecorView;->superDispatchTouchEvent(Landroid/view/MotionEvent;)Z HSPLcom/android/internal/policy/DecorView;->updateBackgroundBlurRadius()V -HSPLcom/android/internal/policy/DecorView;->updateBackgroundDrawable()V+]Landroid/graphics/Insets;Landroid/graphics/Insets; -HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIZZIZZI)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;]Landroid/view/View;Landroid/view/View;]Landroid/view/ViewPropertyAnimator;Landroid/view/ViewPropertyAnimator;]Lcom/android/internal/policy/DecorView$ColorViewAttributes;Lcom/android/internal/policy/DecorView$ColorViewAttributes; +HSPLcom/android/internal/policy/DecorView;->updateBackgroundDrawable()V +HSPLcom/android/internal/policy/DecorView;->updateColorViewInt(Lcom/android/internal/policy/DecorView$ColorViewState;IIIZZIZZI)V HSPLcom/android/internal/policy/DecorView;->updateColorViewTranslations()V -HSPLcom/android/internal/policy/DecorView;->updateColorViews(Landroid/view/WindowInsets;Z)Landroid/view/WindowInsets;+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Lcom/android/internal/policy/PhoneWindow;Lcom/android/internal/policy/PhoneWindow;]Landroid/view/ViewGroup;Landroid/widget/LinearLayout;]Landroid/view/WindowInsetsController;Landroid/view/InsetsController;,Landroid/view/PendingInsetsController;]Landroid/view/WindowInsets;Landroid/view/WindowInsets;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; -HSPLcom/android/internal/policy/DecorView;->updateDecorCaptionStatus(Landroid/content/res/Configuration;)V -HSPLcom/android/internal/policy/DecorView;->updateElevation()V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; -HSPLcom/android/internal/policy/DecorView;->updateLogTag(Landroid/view/WindowManager$LayoutParams;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/internal/policy/DecorView;->updateColorViews(Landroid/view/WindowInsets;Z)Landroid/view/WindowInsets; +HSPLcom/android/internal/policy/DecorView;->updateElevation()V +HSPLcom/android/internal/policy/DecorView;->updateLogTag(Landroid/view/WindowManager$LayoutParams;)V HSPLcom/android/internal/policy/DecorView;->updateStatusGuard(Landroid/view/WindowInsets;)Landroid/view/WindowInsets; HSPLcom/android/internal/policy/DecorView;->willYouTakeTheInputQueue()Landroid/view/InputQueue$Callback; HSPLcom/android/internal/policy/DecorView;->willYouTakeTheSurface()Landroid/view/SurfaceHolder$Callback2; HSPLcom/android/internal/policy/GestureNavigationSettingsObserver$1;->(Lcom/android/internal/policy/GestureNavigationSettingsObserver;)V -HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->(Landroid/os/Handler;Landroid/content/Context;Ljava/lang/Runnable;)V HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->areNavigationButtonForcedVisible()Z HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->getLeftSensitivity(Landroid/content/res/Resources;)I HSPLcom/android/internal/policy/GestureNavigationSettingsObserver;->getRightSensitivity(Landroid/content/res/Resources;)I @@ -21835,7 +21668,7 @@ HSPLcom/android/internal/policy/PhoneWindow;->applyDecorFitsSystemWindows()V HSPLcom/android/internal/policy/PhoneWindow;->closeAllPanels()V HSPLcom/android/internal/policy/PhoneWindow;->closeContextMenu()V HSPLcom/android/internal/policy/PhoneWindow;->closePanel(Lcom/android/internal/policy/PhoneWindow$PanelFeatureState;Z)V -HSPLcom/android/internal/policy/PhoneWindow;->dispatchWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView; +HSPLcom/android/internal/policy/PhoneWindow;->dispatchWindowAttributesChanged(Landroid/view/WindowManager$LayoutParams;)V HSPLcom/android/internal/policy/PhoneWindow;->doInvalidatePanelMenu(I)V HSPLcom/android/internal/policy/PhoneWindow;->generateDecor(I)Lcom/android/internal/policy/DecorView; HSPLcom/android/internal/policy/PhoneWindow;->generateLayout(Lcom/android/internal/policy/DecorView;)Landroid/view/ViewGroup; @@ -21866,7 +21699,7 @@ HSPLcom/android/internal/policy/PhoneWindow;->peekDecorView()Landroid/view/View; HSPLcom/android/internal/policy/PhoneWindow;->requestFeature(I)Z HSPLcom/android/internal/policy/PhoneWindow;->restoreHierarchyState(Landroid/os/Bundle;)V HSPLcom/android/internal/policy/PhoneWindow;->saveHierarchyState()Landroid/os/Bundle; -HSPLcom/android/internal/policy/PhoneWindow;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V+]Lcom/android/internal/policy/DecorView;Lcom/android/internal/policy/DecorView; +HSPLcom/android/internal/policy/PhoneWindow;->setAttributes(Landroid/view/WindowManager$LayoutParams;)V HSPLcom/android/internal/policy/PhoneWindow;->setBackgroundBlurRadius(I)V HSPLcom/android/internal/policy/PhoneWindow;->setBackgroundDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/android/internal/policy/PhoneWindow;->setContentView(I)V @@ -22025,7 +21858,7 @@ HSPLcom/android/internal/util/ArrayUtils;->convertToIntArray(Ljava/util/List;)[I HSPLcom/android/internal/util/ArrayUtils;->deepToString(Ljava/lang/Object;)Ljava/lang/String; HSPLcom/android/internal/util/ArrayUtils;->defeatNullable([Ljava/io/File;)[Ljava/io/File; HSPLcom/android/internal/util/ArrayUtils;->defeatNullable([Ljava/lang/String;)[Ljava/lang/String; -HSPLcom/android/internal/util/ArrayUtils;->emptyArray(Ljava/lang/Class;)[Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/Class;]Ljava/lang/Class;Ljava/lang/Class; +HSPLcom/android/internal/util/ArrayUtils;->emptyArray(Ljava/lang/Class;)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->emptyIfNull([Ljava/lang/Object;Ljava/lang/Class;)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->filter([Ljava/lang/Object;Ljava/util/function/IntFunction;Ljava/util/function/Predicate;)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->getOrNull([Ljava/lang/Object;I)Ljava/lang/Object; @@ -22033,14 +21866,14 @@ HSPLcom/android/internal/util/ArrayUtils;->indexOf([Ljava/lang/Object;Ljava/lang HSPLcom/android/internal/util/ArrayUtils;->isEmpty(Ljava/util/Collection;)Z HSPLcom/android/internal/util/ArrayUtils;->isEmpty([I)Z HSPLcom/android/internal/util/ArrayUtils;->isEmpty([Ljava/lang/Object;)Z -HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedArray(Ljava/lang/Class;I)[Ljava/lang/Object;+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime; +HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedArray(Ljava/lang/Class;I)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedBooleanArray(I)[Z HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedByteArray(I)[B -HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedCharArray(I)[C+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime; +HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedCharArray(I)[C HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedFloatArray(I)[F -HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime; +HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedIntArray(I)[I HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedLongArray(I)[J -HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object;+]Ldalvik/system/VMRuntime;Ldalvik/system/VMRuntime; +HSPLcom/android/internal/util/ArrayUtils;->newUnpaddedObjectArray(I)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->remove(Ljava/util/ArrayList;Ljava/lang/Object;)Ljava/util/ArrayList; HSPLcom/android/internal/util/ArrayUtils;->removeElement(Ljava/lang/Class;[Ljava/lang/Object;Ljava/lang/Object;)[Ljava/lang/Object; HSPLcom/android/internal/util/ArrayUtils;->size([Ljava/lang/Object;)I @@ -22063,7 +21896,6 @@ HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;->add(I)V HSPLcom/android/internal/util/ExponentiallyBucketedHistogram;->log(Ljava/lang/String;Ljava/lang/CharSequence;)V HSPLcom/android/internal/util/FastMath;->round(F)I HSPLcom/android/internal/util/FastPrintWriter$DummyWriter;->()V -HSPLcom/android/internal/util/FastPrintWriter$DummyWriter;->(Lcom/android/internal/util/FastPrintWriter$DummyWriter-IA;)V HSPLcom/android/internal/util/FastPrintWriter;->(Ljava/io/OutputStream;)V HSPLcom/android/internal/util/FastPrintWriter;->(Ljava/io/OutputStream;ZI)V HSPLcom/android/internal/util/FastPrintWriter;->(Ljava/io/Writer;ZI)V @@ -22081,18 +21913,18 @@ HSPLcom/android/internal/util/FastPrintWriter;->print(J)V HSPLcom/android/internal/util/FastPrintWriter;->print(Ljava/lang/String;)V HSPLcom/android/internal/util/FastPrintWriter;->println()V HSPLcom/android/internal/util/FastPrintWriter;->write(I)V -HSPLcom/android/internal/util/FastPrintWriter;->write(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/internal/util/FastPrintWriter;->write(Ljava/lang/String;)V HSPLcom/android/internal/util/FastPrintWriter;->write([CII)V HSPLcom/android/internal/util/FastXmlSerializer;->()V HSPLcom/android/internal/util/FastXmlSerializer;->(I)V HSPLcom/android/internal/util/FastXmlSerializer;->append(C)V -HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String; -HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;II)V+]Ljava/lang/String;Ljava/lang/String;]Lcom/android/internal/util/FastXmlSerializer;Lcom/android/internal/util/FastXmlSerializer; -HSPLcom/android/internal/util/FastXmlSerializer;->appendIndent(I)V+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;)V +HSPLcom/android/internal/util/FastXmlSerializer;->append(Ljava/lang/String;II)V +HSPLcom/android/internal/util/FastXmlSerializer;->appendIndent(I)V HSPLcom/android/internal/util/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer; HSPLcom/android/internal/util/FastXmlSerializer;->endDocument()V HSPLcom/android/internal/util/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer; -HSPLcom/android/internal/util/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/internal/util/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V HSPLcom/android/internal/util/FastXmlSerializer;->flush()V HSPLcom/android/internal/util/FastXmlSerializer;->flushBytes()V HSPLcom/android/internal/util/FastXmlSerializer;->setFeature(Ljava/lang/String;Z)V @@ -22109,12 +21941,12 @@ HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;I)V HSPLcom/android/internal/util/FrameworkStatsLog;->write(ILjava/lang/String;IIF)V HSPLcom/android/internal/util/GrowingArrayUtils;->append([III)[I HSPLcom/android/internal/util/GrowingArrayUtils;->append([JIJ)[J -HSPLcom/android/internal/util/GrowingArrayUtils;->append([Ljava/lang/Object;ILjava/lang/Object;)[Ljava/lang/Object;+]Ljava/lang/Object;missing_types]Ljava/lang/Class;Ljava/lang/Class; +HSPLcom/android/internal/util/GrowingArrayUtils;->append([Ljava/lang/Object;ILjava/lang/Object;)[Ljava/lang/Object; HSPLcom/android/internal/util/GrowingArrayUtils;->append([ZIZ)[Z HSPLcom/android/internal/util/GrowingArrayUtils;->growSize(I)I HSPLcom/android/internal/util/GrowingArrayUtils;->insert([IIII)[I HSPLcom/android/internal/util/GrowingArrayUtils;->insert([JIIJ)[J -HSPLcom/android/internal/util/GrowingArrayUtils;->insert([Ljava/lang/Object;IILjava/lang/Object;)[Ljava/lang/Object;+]Ljava/lang/Object;[Ljava/lang/Object;]Ljava/lang/Class;Ljava/lang/Class; +HSPLcom/android/internal/util/GrowingArrayUtils;->insert([Ljava/lang/Object;IILjava/lang/Object;)[Ljava/lang/Object; HSPLcom/android/internal/util/GrowingArrayUtils;->insert([ZIIZ)[Z HSPLcom/android/internal/util/IndentingPrintWriter;->decreaseIndent()Lcom/android/internal/util/IndentingPrintWriter; HSPLcom/android/internal/util/IndentingPrintWriter;->increaseIndent()Lcom/android/internal/util/IndentingPrintWriter; @@ -22141,7 +21973,7 @@ HSPLcom/android/internal/util/LineBreakBufferedWriter;->(Ljava/io/Writer;I HSPLcom/android/internal/util/LineBreakBufferedWriter;->ensureCapacity(I)V HSPLcom/android/internal/util/LineBreakBufferedWriter;->flush()V HSPLcom/android/internal/util/LineBreakBufferedWriter;->println()V -HSPLcom/android/internal/util/LineBreakBufferedWriter;->write(Ljava/lang/String;II)V+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/internal/util/LineBreakBufferedWriter;->write(Ljava/lang/String;II)V HSPLcom/android/internal/util/LineBreakBufferedWriter;->writeBuffer(I)V HSPLcom/android/internal/util/MemInfoReader;->()V HSPLcom/android/internal/util/MemInfoReader;->getTotalSize()J @@ -22259,10 +22091,10 @@ HSPLcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPu HSPLcom/android/internal/util/XmlUtils;->readLongAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;J)J HSPLcom/android/internal/util/XmlUtils;->readMapXml(Ljava/io/InputStream;)Ljava/util/HashMap; HSPLcom/android/internal/util/XmlUtils;->readStringAttribute(Lorg/xmlpull/v1/XmlPullParser;Ljava/lang/String;)Ljava/lang/String; -HSPLcom/android/internal/util/XmlUtils;->readThisMapXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;)Ljava/util/HashMap;+]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; -HSPLcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; +HSPLcom/android/internal/util/XmlUtils;->readThisMapXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;)Ljava/util/HashMap; +HSPLcom/android/internal/util/XmlUtils;->readThisPrimitiveValueXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;)Ljava/lang/Object; HSPLcom/android/internal/util/XmlUtils;->readThisSetXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/util/HashSet; -HSPLcom/android/internal/util/XmlUtils;->readThisValueXml(Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/lang/Object;+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Lcom/android/internal/util/XmlUtils$ReadMapCallback;Landroid/os/PersistableBundle$MyReadMapCallback; +HSPLcom/android/internal/util/XmlUtils;->readThisValueXml(Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;Lcom/android/internal/util/XmlUtils$ReadMapCallback;Z)Ljava/lang/Object; HSPLcom/android/internal/util/XmlUtils;->readValueXml(Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;)Ljava/lang/Object; HSPLcom/android/internal/util/XmlUtils;->skipCurrentTag(Lorg/xmlpull/v1/XmlPullParser;)V HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V @@ -22271,7 +22103,7 @@ HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/lang/S HSPLcom/android/internal/util/XmlUtils;->writeMapXml(Ljava/util/Map;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V HSPLcom/android/internal/util/XmlUtils;->writeSetXml(Ljava/util/Set;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;)V HSPLcom/android/internal/util/XmlUtils;->writeValueXml(Ljava/lang/Object;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;)V -HSPLcom/android/internal/util/XmlUtils;->writeValueXml(Ljava/lang/Object;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Float;Ljava/lang/Float; +HSPLcom/android/internal/util/XmlUtils;->writeValueXml(Ljava/lang/Object;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/XmlUtils$WriteMapCallback;)V HSPLcom/android/internal/util/function/pooled/OmniFunction;->run()V HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/HexConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message; HSPLcom/android/internal/util/function/pooled/PooledLambda;->obtainMessage(Lcom/android/internal/util/function/QuadConsumer;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Landroid/os/Message; @@ -22307,7 +22139,6 @@ HSPLcom/android/internal/view/AppearanceRegion;->equals(Ljava/lang/Object;)Z HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->(Landroid/os/IBinder;)V HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->addClient(Lcom/android/internal/inputmethod/IInputMethodClient;Lcom/android/internal/inputmethod/IRemoteInputConnection;I)V HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->asBinder()Landroid/os/IBinder; -HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getEnabledInputMethodList(I)Ljava/util/List; HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->getImeTrackerService()Lcom/android/internal/inputmethod/IImeTracker; HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->isImeTraceEnabled()Z HSPLcom/android/internal/view/IInputMethodManager$Stub$Proxy;->removeImeSurfaceFromWindowAsync(Landroid/os/IBinder;)V @@ -22352,7 +22183,7 @@ HSPLcom/android/internal/widget/AlertDialogLayout;->onMeasure(II)V HSPLcom/android/internal/widget/AlertDialogLayout;->setChildFrame(Landroid/view/View;IIII)V HSPLcom/android/internal/widget/AlertDialogLayout;->tryOnMeasure(II)Z HSPLcom/android/internal/widget/BackgroundFallback;->()V -HSPLcom/android/internal/widget/BackgroundFallback;->draw(Landroid/view/ViewGroup;Landroid/view/ViewGroup;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;Landroid/view/View;)V+]Lcom/android/internal/widget/BackgroundFallback;Lcom/android/internal/widget/BackgroundFallback; +HSPLcom/android/internal/widget/BackgroundFallback;->draw(Landroid/view/ViewGroup;Landroid/view/ViewGroup;Landroid/graphics/Canvas;Landroid/view/View;Landroid/view/View;Landroid/view/View;)V HSPLcom/android/internal/widget/BackgroundFallback;->hasFallback()Z HSPLcom/android/internal/widget/BackgroundFallback;->setDrawable(Landroid/graphics/drawable/Drawable;)V HSPLcom/android/internal/widget/ButtonBarLayout;->(Landroid/content/Context;Landroid/util/AttributeSet;)V @@ -22371,7 +22202,7 @@ HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->handleStron HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->isNonStrongBiometricAllowedAfterIdleTimeout(I)Z HSPLcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;->onIsNonStrongBiometricAllowedChanged(I)V HSPLcom/android/internal/widget/LockPatternUtils;->(Landroid/content/Context;)V -HSPLcom/android/internal/widget/LockPatternUtils;->(Landroid/content/Context;Lcom/android/internal/widget/ILockSettings;)V+]Landroid/content/Context;Landroid/app/ContextImpl;,Landroid/app/ReceiverRestrictedContext; +HSPLcom/android/internal/widget/LockPatternUtils;->(Landroid/content/Context;Lcom/android/internal/widget/ILockSettings;)V+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/internal/widget/LockPatternUtils;->credentialTypeToPasswordQuality(I)I HSPLcom/android/internal/widget/LockPatternUtils;->getBoolean(Ljava/lang/String;ZI)Z HSPLcom/android/internal/widget/LockPatternUtils;->getCredentialTypeForUser(I)I @@ -22388,10 +22219,10 @@ HSPLcom/android/internal/widget/LockPatternUtils;->isSecure(I)Z HSPLcom/android/internal/widget/LockPatternUtils;->isSeparateProfileChallengeEnabled(I)Z HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeBoolean(Ljava/lang/String;Ljava/lang/String;)Z+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeFloat(Ljava/lang/String;Ljava/lang/String;)F -HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeIndex(Ljava/lang/String;Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; +HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeIndex(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeIndexOrThrow(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeInt(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; -HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeLong(Ljava/lang/String;Ljava/lang/String;)J+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/XmlUtils$ForcedTypedXmlPullParser; +HSPLcom/android/modules/utils/TypedXmlPullParser;->getAttributeLong(Ljava/lang/String;Ljava/lang/String;)J HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalAddresses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalDnses(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z HSPLcom/android/net/module/util/LinkPropertiesUtils;->isIdenticalHttpProxy(Landroid/net/LinkProperties;Landroid/net/LinkProperties;)Z @@ -22409,10 +22240,6 @@ HSPLcom/android/telephony/Rlog;->pii(ZLjava/lang/Object;)Ljava/lang/String; HSPLcom/android/telephony/Rlog;->w(Ljava/lang/String;Ljava/lang/String;)I HSPLcom/android/text/flags/FeatureFlagsImpl;->()V HSPLcom/android/text/flags/Flags;->()V -HSPLcom/android/window/flags/FeatureFlagsImpl;->()V -HSPLcom/android/window/flags/FeatureFlagsImpl;->bundleClientTransactionFlag()Z -HSPLcom/android/window/flags/Flags;->()V -HSPLcom/android/window/flags/Flags;->bundleClientTransactionFlag()Z+]Lcom/android/window/flags/FeatureFlags;Lcom/android/window/flags/FeatureFlagsImpl; HSPLcom/google/android/collect/Lists;->newArrayList()Ljava/util/ArrayList; HSPLcom/google/android/collect/Lists;->newArrayList([Ljava/lang/Object;)Ljava/util/ArrayList; HSPLcom/google/android/collect/Maps;->newHashMap()Ljava/util/HashMap; @@ -22545,7 +22372,6 @@ Landroid/accounts/AccountManager$5; Landroid/accounts/AccountManager$8; Landroid/accounts/AccountManager$AccountKeyData; Landroid/accounts/AccountManager$AmsTask$1; -Landroid/accounts/AccountManager$AmsTask$Response-IA; Landroid/accounts/AccountManager$AmsTask$Response; Landroid/accounts/AccountManager$AmsTask; Landroid/accounts/AccountManager$BaseFutureTask$1; @@ -22553,6 +22379,7 @@ Landroid/accounts/AccountManager$BaseFutureTask$Response; Landroid/accounts/AccountManager$BaseFutureTask; Landroid/accounts/AccountManager$Future2Task$1; Landroid/accounts/AccountManager$Future2Task; +Landroid/accounts/AccountManager-IA; Landroid/accounts/AccountManager; Landroid/accounts/AccountManagerCallback; Landroid/accounts/AccountManagerFuture; @@ -22578,13 +22405,20 @@ Landroid/accounts/IAccountManagerResponse; Landroid/accounts/NetworkErrorException; Landroid/accounts/OnAccountsUpdateListener; Landroid/accounts/OperationCanceledException; +Landroid/aconfig/nano/Aconfig$flag_declaration; +Landroid/aconfig/nano/Aconfig$flag_declarations; +Landroid/aconfig/nano/Aconfig$flag_value; +Landroid/aconfig/nano/Aconfig$flag_values; +Landroid/aconfig/nano/Aconfig$parsed_flag; +Landroid/aconfig/nano/Aconfig$parsed_flags; +Landroid/aconfig/nano/Aconfig$tracepoint; Landroid/animation/AnimationHandler$$ExternalSyntheticLambda0; Landroid/animation/AnimationHandler$1; Landroid/animation/AnimationHandler$2; Landroid/animation/AnimationHandler$AnimationFrameCallback; Landroid/animation/AnimationHandler$AnimationFrameCallbackProvider; -Landroid/animation/AnimationHandler$MyFrameCallbackProvider-IA; Landroid/animation/AnimationHandler$MyFrameCallbackProvider; +Landroid/animation/AnimationHandler-IA; Landroid/animation/AnimationHandler; Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda0; Landroid/animation/Animator$AnimatorCaller$$ExternalSyntheticLambda1; @@ -22598,8 +22432,8 @@ Landroid/animation/Animator$AnimatorConstantState; Landroid/animation/Animator$AnimatorListener; Landroid/animation/Animator$AnimatorPauseListener; Landroid/animation/Animator; -Landroid/animation/AnimatorInflater$PathDataEvaluator-IA; Landroid/animation/AnimatorInflater$PathDataEvaluator; +Landroid/animation/AnimatorInflater-IA; Landroid/animation/AnimatorInflater; Landroid/animation/AnimatorListenerAdapter; Landroid/animation/AnimatorSet$$ExternalSyntheticLambda0; @@ -22610,8 +22444,8 @@ Landroid/animation/AnimatorSet$3; Landroid/animation/AnimatorSet$AnimationEvent; Landroid/animation/AnimatorSet$Builder; Landroid/animation/AnimatorSet$Node; -Landroid/animation/AnimatorSet$SeekState-IA; Landroid/animation/AnimatorSet$SeekState; +Landroid/animation/AnimatorSet-IA; Landroid/animation/AnimatorSet; Landroid/animation/ArgbEvaluator; Landroid/animation/BidirectionalTypeConverter; @@ -22642,8 +22476,8 @@ Landroid/animation/PathKeyframes$3; Landroid/animation/PathKeyframes$4; Landroid/animation/PathKeyframes$FloatKeyframesBase; Landroid/animation/PathKeyframes$IntKeyframesBase; -Landroid/animation/PathKeyframes$SimpleKeyframes-IA; Landroid/animation/PathKeyframes$SimpleKeyframes; +Landroid/animation/PathKeyframes-IA; Landroid/animation/PathKeyframes; Landroid/animation/PropertyValuesHolder$1; Landroid/animation/PropertyValuesHolder$FloatPropertyValuesHolder; @@ -22656,8 +22490,8 @@ Landroid/animation/RectEvaluator; Landroid/animation/RevealAnimator; Landroid/animation/StateListAnimator$1; Landroid/animation/StateListAnimator$StateListAnimatorConstantState; -Landroid/animation/StateListAnimator$Tuple-IA; Landroid/animation/StateListAnimator$Tuple; +Landroid/animation/StateListAnimator-IA; Landroid/animation/StateListAnimator; Landroid/animation/TimeAnimator$TimeListener; Landroid/animation/TimeAnimator; @@ -22690,20 +22524,22 @@ Landroid/app/Activity$$ExternalSyntheticLambda0; Landroid/app/Activity$1; Landroid/app/Activity$HostCallbacks; Landroid/app/Activity$ManagedCursor; -Landroid/app/Activity$ManagedDialog-IA; Landroid/app/Activity$ManagedDialog; Landroid/app/Activity$NonConfigurationInstances; Landroid/app/Activity$RequestFinishCallback; Landroid/app/Activity$TranslucentConversionListener; +Landroid/app/Activity-IA; Landroid/app/Activity; Landroid/app/ActivityClient$1; -Landroid/app/ActivityClient$ActivityClientControllerSingleton-IA; Landroid/app/ActivityClient$ActivityClientControllerSingleton; Landroid/app/ActivityClient-IA; Landroid/app/ActivityClient; +Landroid/app/ActivityManager$$ExternalSyntheticLambda0; +Landroid/app/ActivityManager$$ExternalSyntheticLambda1; +Landroid/app/ActivityManager$$ExternalSyntheticLambda2; Landroid/app/ActivityManager$1; -Landroid/app/ActivityManager$2; Landroid/app/ActivityManager$3; +Landroid/app/ActivityManager$4; Landroid/app/ActivityManager$AppTask; Landroid/app/ActivityManager$MemoryInfo$1; Landroid/app/ActivityManager$MemoryInfo; @@ -22715,25 +22551,22 @@ Landroid/app/ActivityManager$ProcessErrorStateInfo$1; Landroid/app/ActivityManager$ProcessErrorStateInfo; Landroid/app/ActivityManager$RecentTaskInfo$1; Landroid/app/ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData; -Landroid/app/ActivityManager$RecentTaskInfo-IA; Landroid/app/ActivityManager$RecentTaskInfo; Landroid/app/ActivityManager$RunningAppProcessInfo$1; -Landroid/app/ActivityManager$RunningAppProcessInfo-IA; Landroid/app/ActivityManager$RunningAppProcessInfo; Landroid/app/ActivityManager$RunningServiceInfo$1; -Landroid/app/ActivityManager$RunningServiceInfo-IA; Landroid/app/ActivityManager$RunningServiceInfo; Landroid/app/ActivityManager$RunningTaskInfo$1; -Landroid/app/ActivityManager$RunningTaskInfo-IA; Landroid/app/ActivityManager$RunningTaskInfo; Landroid/app/ActivityManager$TaskDescription$1; -Landroid/app/ActivityManager$TaskDescription-IA; Landroid/app/ActivityManager$TaskDescription; +Landroid/app/ActivityManager-IA; Landroid/app/ActivityManager; Landroid/app/ActivityManagerInternal; Landroid/app/ActivityOptions$1; Landroid/app/ActivityOptions$2; Landroid/app/ActivityOptions$OnAnimationStartedListener; +Landroid/app/ActivityOptions$SceneTransitionInfo$1; Landroid/app/ActivityOptions$SceneTransitionInfo; Landroid/app/ActivityOptions$SourceInfo$1; Landroid/app/ActivityOptions$SourceInfo; @@ -22757,10 +22590,11 @@ Landroid/app/ActivityThread$3; Landroid/app/ActivityThread$4; Landroid/app/ActivityThread$ActivityClientRecord$1; Landroid/app/ActivityThread$ActivityClientRecord; +Landroid/app/ActivityThread$AndroidOs; Landroid/app/ActivityThread$AppBindData; Landroid/app/ActivityThread$ApplicationThread$$ExternalSyntheticLambda2; Landroid/app/ActivityThread$ApplicationThread$1; -Landroid/app/ActivityThread$ApplicationThread-IA; +Landroid/app/ActivityThread$ApplicationThread; Landroid/app/ActivityThread$BindServiceData; Landroid/app/ActivityThread$ContextCleanupInfo; Landroid/app/ActivityThread$CreateBackupAgentData; @@ -22770,7 +22604,6 @@ Landroid/app/ActivityThread$DumpHeapData; Landroid/app/ActivityThread$DumpResourcesData; Landroid/app/ActivityThread$GcIdler; Landroid/app/ActivityThread$H; -Landroid/app/ActivityThread$Idler-IA; Landroid/app/ActivityThread$Idler; Landroid/app/ActivityThread$Profiler; Landroid/app/ActivityThread$ProviderClientRecord; @@ -22782,6 +22615,7 @@ Landroid/app/ActivityThread$RequestAssistContextExtras; Landroid/app/ActivityThread$SafeCancellationTransport; Landroid/app/ActivityThread$ServiceArgsData; Landroid/app/ActivityThread$UpdateCompatibilityData; +Landroid/app/ActivityThread-IA; Landroid/app/ActivityThread; Landroid/app/ActivityThreadInternal; Landroid/app/ActivityTransitionCoordinator; @@ -22795,6 +22629,7 @@ Landroid/app/AlarmManager; Landroid/app/AlertDialog$Builder; Landroid/app/AlertDialog; Landroid/app/AppCompatCallbacks; +Landroid/app/AppCompatTaskInfo$1; Landroid/app/AppCompatTaskInfo; Landroid/app/AppComponentFactory; Landroid/app/AppDetailsActivity; @@ -22807,7 +22642,6 @@ Landroid/app/AppOpsManager$$ExternalSyntheticLambda4; Landroid/app/AppOpsManager$$ExternalSyntheticLambda5; Landroid/app/AppOpsManager$$ExternalSyntheticLambda6; Landroid/app/AppOpsManager$1; -Landroid/app/AppOpsManager$2; Landroid/app/AppOpsManager$3; Landroid/app/AppOpsManager$4; Landroid/app/AppOpsManager$AppOpsCollector; @@ -22864,8 +22698,8 @@ Landroid/app/ApplicationErrorReport; Landroid/app/ApplicationExitInfo$1; Landroid/app/ApplicationExitInfo-IA; Landroid/app/ApplicationExitInfo; -Landroid/app/ApplicationLoaders$CachedClassLoader-IA; Landroid/app/ApplicationLoaders$CachedClassLoader; +Landroid/app/ApplicationLoaders-IA; Landroid/app/ApplicationLoaders; Landroid/app/ApplicationPackageManager$$ExternalSyntheticLambda1; Landroid/app/ApplicationPackageManager$$ExternalSyntheticLambda2; @@ -22884,9 +22718,13 @@ Landroid/app/BackStackRecord$Op; Landroid/app/BackStackRecord; Landroid/app/BackStackState$1; Landroid/app/BackStackState; +Landroid/app/BackgroundInstallControlManager; Landroid/app/BackgroundServiceStartNotAllowedException$1; Landroid/app/BackgroundServiceStartNotAllowedException; Landroid/app/BroadcastOptions; +Landroid/app/BroadcastStickyCache; +Landroid/app/CameraCompatTaskInfo$1; +Landroid/app/CameraCompatTaskInfo; Landroid/app/ClientTransactionHandler; Landroid/app/ComponentCaller; Landroid/app/ComponentOptions; @@ -22990,7 +22828,6 @@ Landroid/app/IAssistDataReceiver; Landroid/app/IBackupAgent$Stub$Proxy; Landroid/app/IBackupAgent$Stub; Landroid/app/IBackupAgent; -Landroid/app/ICompatCameraControlCallback; Landroid/app/IForegroundServiceObserver$Stub$Proxy; Landroid/app/IForegroundServiceObserver$Stub; Landroid/app/IForegroundServiceObserver; @@ -23086,14 +22923,13 @@ Landroid/app/ListActivity; Landroid/app/LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0; Landroid/app/LoadedApk$ReceiverDispatcher$Args; Landroid/app/LoadedApk$ReceiverDispatcher; -Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo-IA; Landroid/app/LoadedApk$ServiceDispatcher$ConnectionInfo; Landroid/app/LoadedApk$ServiceDispatcher$DeathMonitor; Landroid/app/LoadedApk$ServiceDispatcher$RunConnection; Landroid/app/LoadedApk$ServiceDispatcher; Landroid/app/LoadedApk$SplitDependencyLoaderImpl; -Landroid/app/LoadedApk$WarningContextClassLoader-IA; Landroid/app/LoadedApk$WarningContextClassLoader; +Landroid/app/LoadedApk-IA; Landroid/app/LoadedApk; Landroid/app/LoaderManager$LoaderCallbacks; Landroid/app/LoaderManager; @@ -23107,13 +22943,11 @@ Landroid/app/Notification$$ExternalSyntheticLambda0; Landroid/app/Notification$1; Landroid/app/Notification$Action$1; Landroid/app/Notification$Action$Builder; -Landroid/app/Notification$Action-IA; Landroid/app/Notification$Action; Landroid/app/Notification$BigPictureStyle; Landroid/app/Notification$BigTextStyle; Landroid/app/Notification$BubbleMetadata$1; Landroid/app/Notification$BubbleMetadata$Builder; -Landroid/app/Notification$BubbleMetadata-IA; Landroid/app/Notification$BubbleMetadata; Landroid/app/Notification$Builder; Landroid/app/Notification$BuilderRemoteViews; @@ -23126,12 +22960,12 @@ Landroid/app/Notification$InboxStyle; Landroid/app/Notification$MediaStyle; Landroid/app/Notification$MessagingStyle$Message; Landroid/app/Notification$MessagingStyle; -Landroid/app/Notification$StandardTemplateParams-IA; Landroid/app/Notification$StandardTemplateParams; Landroid/app/Notification$Style; Landroid/app/Notification$TemplateBindResult$MarginSet; Landroid/app/Notification$TemplateBindResult; Landroid/app/Notification$TvExtender; +Landroid/app/Notification-IA; Landroid/app/Notification; Landroid/app/NotificationChannel$1; Landroid/app/NotificationChannel; @@ -23150,16 +22984,13 @@ Landroid/app/PackageInstallObserver; Landroid/app/PendingIntent$$ExternalSyntheticLambda0; Landroid/app/PendingIntent$$ExternalSyntheticLambda1; Landroid/app/PendingIntent$$ExternalSyntheticLambda2; -Landroid/app/PendingIntent$$ExternalSyntheticLambda3; Landroid/app/PendingIntent$1; Landroid/app/PendingIntent$CancelListener; Landroid/app/PendingIntent$CanceledException; -Landroid/app/PendingIntent$FinishedDispatcher; Landroid/app/PendingIntent$OnFinished; Landroid/app/PendingIntent$OnMarshaledListener; Landroid/app/PendingIntent; Landroid/app/Person$1; -Landroid/app/Person$Builder-IA; Landroid/app/Person$Builder; Landroid/app/Person-IA; Landroid/app/Person; @@ -23198,14 +23029,14 @@ Landroid/app/RemoteInputHistoryItem; Landroid/app/RemoteServiceException; Landroid/app/ResourcesManager$$ExternalSyntheticLambda0; Landroid/app/ResourcesManager$$ExternalSyntheticLambda1; -Landroid/app/ResourcesManager$ActivityResource-IA; Landroid/app/ResourcesManager$ActivityResource; -Landroid/app/ResourcesManager$ActivityResources-IA; Landroid/app/ResourcesManager$ActivityResources; Landroid/app/ResourcesManager$ApkAssetsSupplier; Landroid/app/ResourcesManager$ApkKey; -Landroid/app/ResourcesManager$UpdateHandler-IA; +Landroid/app/ResourcesManager$PathCollector; +Landroid/app/ResourcesManager$SharedLibraryAssets; Landroid/app/ResourcesManager$UpdateHandler; +Landroid/app/ResourcesManager-IA; Landroid/app/ResourcesManager; Landroid/app/ResultInfo$1; Landroid/app/ResultInfo; @@ -23232,10 +23063,9 @@ Landroid/app/SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0; Landroid/app/SharedPreferencesImpl$EditorImpl$1; Landroid/app/SharedPreferencesImpl$EditorImpl$2; Landroid/app/SharedPreferencesImpl$EditorImpl; -Landroid/app/SharedPreferencesImpl$MemoryCommitResult-IA; Landroid/app/SharedPreferencesImpl$MemoryCommitResult; Landroid/app/SharedPreferencesImpl$SharedPreferencesThreadFactory; -Landroid/app/SharedPreferencesImpl; +Landroid/app/SharedPreferencesImpl-IA; Landroid/app/StackTrace; Landroid/app/StatusBarManager; Landroid/app/SyncNotedAppOp$1; @@ -23286,8 +23116,14 @@ Landroid/app/SystemServiceRegistry$138; Landroid/app/SystemServiceRegistry$139; Landroid/app/SystemServiceRegistry$13; Landroid/app/SystemServiceRegistry$140; +Landroid/app/SystemServiceRegistry$141; +Landroid/app/SystemServiceRegistry$142; Landroid/app/SystemServiceRegistry$143; Landroid/app/SystemServiceRegistry$144; +Landroid/app/SystemServiceRegistry$145; +Landroid/app/SystemServiceRegistry$146; +Landroid/app/SystemServiceRegistry$147; +Landroid/app/SystemServiceRegistry$148; Landroid/app/SystemServiceRegistry$14; Landroid/app/SystemServiceRegistry$15; Landroid/app/SystemServiceRegistry$16; @@ -23397,8 +23233,8 @@ Landroid/app/UiModeManager$1; Landroid/app/UiModeManager$Globals; Landroid/app/UiModeManager$InnerListener; Landroid/app/UiModeManager$OnProjectionStateChangedListener; -Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager-IA; Landroid/app/UiModeManager$OnProjectionStateChangedListenerResourceManager; +Landroid/app/UiModeManager-IA; Landroid/app/UiModeManager; Landroid/app/UidObserver; Landroid/app/UriGrantsManager$1; @@ -23510,17 +23346,17 @@ Landroid/app/assist/AssistStructure$ViewNodeText; Landroid/app/assist/AssistStructure$ViewStackEntry; Landroid/app/assist/AssistStructure$WindowNode; Landroid/app/assist/AssistStructure; -Landroid/app/backup/BackupAgent$BackupServiceBinder-IA; Landroid/app/backup/BackupAgent$BackupServiceBinder; Landroid/app/backup/BackupAgent$SharedPrefsSynchronizer; +Landroid/app/backup/BackupAgent-IA; Landroid/app/backup/BackupAgent; Landroid/app/backup/BackupAgentHelper; Landroid/app/backup/BackupDataInput$EntityHeader; Landroid/app/backup/BackupDataInput; Landroid/app/backup/BackupDataOutput; Landroid/app/backup/BackupHelper; -Landroid/app/backup/BackupHelperDispatcher$Header-IA; Landroid/app/backup/BackupHelperDispatcher$Header; +Landroid/app/backup/BackupHelperDispatcher-IA; Landroid/app/backup/BackupHelperDispatcher; Landroid/app/backup/BackupHelperWithLogger; Landroid/app/backup/BackupManager$BackupObserverWrapper$1; @@ -23595,24 +23431,24 @@ Landroid/app/contentsuggestions/SelectionsRequest$1; Landroid/app/contentsuggestions/SelectionsRequest$Builder; Landroid/app/contentsuggestions/SelectionsRequest-IA; Landroid/app/contentsuggestions/SelectionsRequest; +Landroid/app/contextualsearch/ContextualSearchManager; Landroid/app/job/IJobCallback$Stub$Proxy; Landroid/app/job/IJobCallback$Stub; Landroid/app/job/IJobCallback; Landroid/app/job/IJobScheduler$Stub$Proxy; Landroid/app/job/IJobScheduler$Stub; Landroid/app/job/IJobScheduler; -Landroid/app/job/IJobService$Stub$Proxy; Landroid/app/job/IJobService$Stub; Landroid/app/job/IJobService; Landroid/app/job/IUserVisibleJobObserver; Landroid/app/job/JobInfo$1; Landroid/app/job/JobInfo$Builder; Landroid/app/job/JobInfo$TriggerContentUri$1; -Landroid/app/job/JobInfo$TriggerContentUri-IA; Landroid/app/job/JobInfo$TriggerContentUri; Landroid/app/job/JobInfo-IA; Landroid/app/job/JobInfo; Landroid/app/job/JobParameters$1; +Landroid/app/job/JobParameters$JobCleanupCallback; Landroid/app/job/JobParameters-IA; Landroid/app/job/JobParameters; Landroid/app/job/JobScheduler; @@ -23620,15 +23456,14 @@ Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda0; Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda1; Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda2; Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda3; -Landroid/app/job/JobSchedulerFrameworkInitializer$$ExternalSyntheticLambda4; Landroid/app/job/JobSchedulerFrameworkInitializer; Landroid/app/job/JobService$1; Landroid/app/job/JobService; Landroid/app/job/JobServiceEngine$JobHandler; -Landroid/app/job/JobServiceEngine$JobInterface; Landroid/app/job/JobServiceEngine; Landroid/app/job/JobWorkItem$1; Landroid/app/job/JobWorkItem; +Landroid/app/ondeviceintelligence/OnDeviceIntelligenceManager; Landroid/app/people/IPeopleManager$Stub$Proxy; Landroid/app/people/IPeopleManager$Stub; Landroid/app/people/IPeopleManager; @@ -23687,8 +23522,6 @@ Landroid/app/servertransaction/LaunchActivityItem; Landroid/app/servertransaction/NewIntentItem$1; Landroid/app/servertransaction/NewIntentItem-IA; Landroid/app/servertransaction/NewIntentItem; -Landroid/app/servertransaction/ObjectPool; -Landroid/app/servertransaction/ObjectPoolItem; Landroid/app/servertransaction/PauseActivityItem$1; Landroid/app/servertransaction/PauseActivityItem-IA; Landroid/app/servertransaction/PauseActivityItem; @@ -23708,7 +23541,7 @@ Landroid/app/servertransaction/TopResumedActivityChangeItem-IA; Landroid/app/servertransaction/TopResumedActivityChangeItem; Landroid/app/servertransaction/TransactionExecutor; Landroid/app/servertransaction/TransactionExecutorHelper; -Landroid/app/servertransaction/WindowStateResizeItem$ResizeListener; +Landroid/app/servertransaction/WindowStateTransactionItem$TransactionListener; Landroid/app/slice/ISliceManager$Stub$Proxy; Landroid/app/slice/ISliceManager$Stub; Landroid/app/slice/ISliceManager; @@ -23760,7 +23593,7 @@ Landroid/app/smartspace/uitemplatedata/TapAction$1; Landroid/app/smartspace/uitemplatedata/TapAction; Landroid/app/smartspace/uitemplatedata/Text$1; Landroid/app/smartspace/uitemplatedata/Text; -Landroid/app/tare/EconomyManager; +Landroid/app/supervision/SupervisionManager; Landroid/app/time/ITimeZoneDetectorListener$Stub$Proxy; Landroid/app/time/ITimeZoneDetectorListener$Stub; Landroid/app/time/ITimeZoneDetectorListener; @@ -23822,6 +23655,8 @@ Landroid/app/usage/ConfigurationStats; Landroid/app/usage/EventList; Landroid/app/usage/ExternalStorageStats$1; Landroid/app/usage/ExternalStorageStats; +Landroid/app/usage/FeatureFlags; +Landroid/app/usage/FeatureFlagsImpl; Landroid/app/usage/Flags; Landroid/app/usage/ICacheQuotaService$Stub$Proxy; Landroid/app/usage/ICacheQuotaService$Stub; @@ -23861,6 +23696,8 @@ Landroid/appwidget/AppWidgetProviderInfo$1; Landroid/appwidget/AppWidgetProviderInfo; Landroid/appwidget/PendingHostUpdate$1; Landroid/appwidget/PendingHostUpdate; +Landroid/appwidget/flags/FeatureFlags; +Landroid/appwidget/flags/FeatureFlagsImpl; Landroid/appwidget/flags/Flags; Landroid/attention/AttentionManagerInternal$AttentionCallbackInternal; Landroid/attention/AttentionManagerInternal; @@ -23879,14 +23716,15 @@ Landroid/companion/virtual/IVirtualDevice; Landroid/companion/virtual/IVirtualDeviceManager$Stub$Proxy; Landroid/companion/virtual/IVirtualDeviceManager$Stub; Landroid/companion/virtual/IVirtualDeviceManager; +Landroid/companion/virtual/VirtualDevice$1; +Landroid/companion/virtual/VirtualDevice; Landroid/companion/virtual/VirtualDeviceManager; Landroid/companion/virtual/flags/FeatureFlags; Landroid/companion/virtual/flags/FeatureFlagsImpl; Landroid/companion/virtual/flags/Flags; -Landroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl-IA; Landroid/content/AbstractThreadedSyncAdapter$ISyncAdapterImpl; -Landroid/content/AbstractThreadedSyncAdapter$SyncThread-IA; Landroid/content/AbstractThreadedSyncAdapter$SyncThread; +Landroid/content/AbstractThreadedSyncAdapter-IA; Landroid/content/AbstractThreadedSyncAdapter; Landroid/content/ActivityNotFoundException; Landroid/content/ApexEnvironment; @@ -23908,8 +23746,8 @@ Landroid/content/BroadcastReceiver$PendingResult$1; Landroid/content/BroadcastReceiver$PendingResult; Landroid/content/BroadcastReceiver; Landroid/content/ClipData$1; -Landroid/content/ClipData$Item-IA; Landroid/content/ClipData$Item; +Landroid/content/ClipData-IA; Landroid/content/ClipData; Landroid/content/ClipDescription$1; Landroid/content/ClipDescription; @@ -23926,8 +23764,8 @@ Landroid/content/ComponentName$1; Landroid/content/ComponentName$WithComponentName; Landroid/content/ComponentName; Landroid/content/ContentCaptureOptions$1; -Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda0; Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda1; +Landroid/content/ContentCaptureOptions$ContentProtectionOptions$$ExternalSyntheticLambda2; Landroid/content/ContentCaptureOptions$ContentProtectionOptions; Landroid/content/ContentCaptureOptions; Landroid/content/ContentInterface; @@ -23937,30 +23775,26 @@ Landroid/content/ContentProvider$PipeDataWriter; Landroid/content/ContentProvider$Transport; Landroid/content/ContentProvider; Landroid/content/ContentProviderClient$CursorWrapperInner; -Landroid/content/ContentProviderClient$NotRespondingRunnable-IA; Landroid/content/ContentProviderClient$NotRespondingRunnable; +Landroid/content/ContentProviderClient-IA; Landroid/content/ContentProviderClient; Landroid/content/ContentProviderNative; Landroid/content/ContentProviderOperation$1; Landroid/content/ContentProviderOperation$BackReference$1; Landroid/content/ContentProviderOperation$BackReference; -Landroid/content/ContentProviderOperation$Builder-IA; Landroid/content/ContentProviderOperation$Builder; Landroid/content/ContentProviderOperation-IA; Landroid/content/ContentProviderOperation; -Landroid/content/ContentProviderProxy; Landroid/content/ContentProviderResult$1; Landroid/content/ContentProviderResult; Landroid/content/ContentResolver$1; Landroid/content/ContentResolver$2; -Landroid/content/ContentResolver$CursorWrapperInner; Landroid/content/ContentResolver$OpenResourceIdResult; Landroid/content/ContentResolver$ParcelFileDescriptorInner; -Landroid/content/ContentResolver$ResultListener-IA; Landroid/content/ContentResolver$ResultListener; -Landroid/content/ContentResolver$StringResultListener-IA; Landroid/content/ContentResolver$StringResultListener; Landroid/content/ContentResolver$UriResultListener; +Landroid/content/ContentResolver-IA; Landroid/content/ContentResolver; Landroid/content/ContentUris; Landroid/content/ContentValues$1; @@ -24005,7 +23839,6 @@ Landroid/content/ISyncAdapterUnsyncableAccountCallback; Landroid/content/ISyncContext$Stub$Proxy; Landroid/content/ISyncContext$Stub; Landroid/content/ISyncContext; -Landroid/content/ISyncStatusObserver$Stub$Proxy; Landroid/content/ISyncStatusObserver$Stub; Landroid/content/ISyncStatusObserver; Landroid/content/Intent$1; @@ -24108,6 +23941,7 @@ Landroid/content/pm/ApplicationInfo$1$$ExternalSyntheticLambda0; Landroid/content/pm/ApplicationInfo$1; Landroid/content/pm/ApplicationInfo-IA; Landroid/content/pm/ApplicationInfo; +Landroid/content/pm/ArchivedPackageParcel$1; Landroid/content/pm/ArchivedPackageParcel; Landroid/content/pm/Attribution$1; Landroid/content/pm/Attribution; @@ -24131,8 +23965,6 @@ Landroid/content/pm/DataLoaderParams; Landroid/content/pm/DataLoaderParamsParcel$1; Landroid/content/pm/DataLoaderParamsParcel; Landroid/content/pm/FallbackCategoryProvider; -Landroid/content/pm/FeatureFlags; -Landroid/content/pm/FeatureFlagsImpl; Landroid/content/pm/FeatureGroupInfo$1; Landroid/content/pm/FeatureGroupInfo; Landroid/content/pm/FeatureInfo$1; @@ -24140,7 +23972,6 @@ Landroid/content/pm/FeatureInfo-IA; Landroid/content/pm/FeatureInfo; Landroid/content/pm/FileSystemControlParcel$1; Landroid/content/pm/FileSystemControlParcel; -Landroid/content/pm/Flags; Landroid/content/pm/ICrossProfileApps$Stub$Proxy; Landroid/content/pm/ICrossProfileApps$Stub; Landroid/content/pm/ICrossProfileApps; @@ -24232,11 +24063,11 @@ Landroid/content/pm/LauncherApps$1; Landroid/content/pm/LauncherApps$AppUsageLimit$1; Landroid/content/pm/LauncherApps$AppUsageLimit; Landroid/content/pm/LauncherApps$Callback; -Landroid/content/pm/LauncherApps$CallbackMessageHandler$CallbackInfo-IA; Landroid/content/pm/LauncherApps$CallbackMessageHandler$CallbackInfo; Landroid/content/pm/LauncherApps$CallbackMessageHandler; Landroid/content/pm/LauncherApps$ShortcutQuery$QueryFlags; Landroid/content/pm/LauncherApps$ShortcutQuery; +Landroid/content/pm/LauncherApps-IA; Landroid/content/pm/LauncherApps; Landroid/content/pm/ModuleInfo$1; Landroid/content/pm/ModuleInfo-IA; @@ -24280,7 +24111,6 @@ Landroid/content/pm/PackageManager$Property; Landroid/content/pm/PackageManager$ResolveInfoFlags; Landroid/content/pm/PackageManager; Landroid/content/pm/PackageParser$Activity$1; -Landroid/content/pm/PackageParser$Activity-IA; Landroid/content/pm/PackageParser$Activity; Landroid/content/pm/PackageParser$ActivityIntentInfo; Landroid/content/pm/PackageParser$ApkLite; @@ -24300,16 +24130,13 @@ Landroid/content/pm/PackageParser$PackageParserException; Landroid/content/pm/PackageParser$ParseComponentArgs; Landroid/content/pm/PackageParser$ParsePackageItemArgs; Landroid/content/pm/PackageParser$Permission$1; -Landroid/content/pm/PackageParser$Permission-IA; Landroid/content/pm/PackageParser$Permission; Landroid/content/pm/PackageParser$PermissionGroup$1; Landroid/content/pm/PackageParser$PermissionGroup; Landroid/content/pm/PackageParser$Provider$1; -Landroid/content/pm/PackageParser$Provider-IA; Landroid/content/pm/PackageParser$Provider; Landroid/content/pm/PackageParser$ProviderIntentInfo; Landroid/content/pm/PackageParser$Service$1; -Landroid/content/pm/PackageParser$Service-IA; Landroid/content/pm/PackageParser$Service; Landroid/content/pm/PackageParser$ServiceIntentInfo; Landroid/content/pm/PackageParser$SigningDetails$1; @@ -24318,6 +24145,7 @@ Landroid/content/pm/PackageParser$SigningDetails; Landroid/content/pm/PackageParser$SplitAssetLoader; Landroid/content/pm/PackageParser$SplitDependencyLoader$IllegalDependencyException; Landroid/content/pm/PackageParser$SplitNameComparator; +Landroid/content/pm/PackageParser-IA; Landroid/content/pm/PackageParser; Landroid/content/pm/PackageParserCacheHelper$ReadHelper; Landroid/content/pm/PackageParserCacheHelper$WriteHelper; @@ -24442,7 +24270,6 @@ Landroid/content/res/ApkAssets; Landroid/content/res/AssetFileDescriptor$1; Landroid/content/res/AssetFileDescriptor$AutoCloseInputStream; Landroid/content/res/AssetFileDescriptor; -Landroid/content/res/AssetManager$AssetInputStream-IA; Landroid/content/res/AssetManager$AssetInputStream; Landroid/content/res/AssetManager$Builder; Landroid/content/res/AssetManager-IA; @@ -24487,17 +24314,17 @@ Landroid/content/res/Resources$$ExternalSyntheticLambda0; Landroid/content/res/Resources$$ExternalSyntheticLambda1; Landroid/content/res/Resources$AssetManagerUpdateHandler; Landroid/content/res/Resources$NotFoundException; -Landroid/content/res/Resources$Theme-IA; Landroid/content/res/Resources$Theme; Landroid/content/res/Resources$ThemeKey; Landroid/content/res/Resources$UpdateCallbacks; +Landroid/content/res/Resources-IA; Landroid/content/res/Resources; Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda0; Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda1; Landroid/content/res/ResourcesImpl$$ExternalSyntheticLambda2; -Landroid/content/res/ResourcesImpl$LookupStack-IA; Landroid/content/res/ResourcesImpl$LookupStack; Landroid/content/res/ResourcesImpl$ThemeImpl; +Landroid/content/res/ResourcesImpl-IA; Landroid/content/res/ResourcesImpl; Landroid/content/res/ResourcesKey; Landroid/content/res/StringBlock$Height; @@ -24525,6 +24352,7 @@ Landroid/content/rollback/RollbackManagerFrameworkInitializer; Landroid/content/type/DefaultMimeMapFactory$$ExternalSyntheticLambda0; Landroid/content/type/DefaultMimeMapFactory; Landroid/credentials/CredentialManager; +Landroid/credentials/GetCredentialResponse$1; Landroid/credentials/GetCredentialResponse; Landroid/database/AbstractCursor$SelfContentObserver; Landroid/database/AbstractCursor; @@ -24576,20 +24404,22 @@ Landroid/database/sqlite/SQLiteBlobTooBigException; Landroid/database/sqlite/SQLiteCantOpenDatabaseException; Landroid/database/sqlite/SQLiteClosable; Landroid/database/sqlite/SQLiteCompatibilityWalFlags; -Landroid/database/sqlite/SQLiteConnection$Operation-IA; Landroid/database/sqlite/SQLiteConnection$Operation; +Landroid/database/sqlite/SQLiteConnection$OperationLog$$ExternalSyntheticLambda0; +Landroid/database/sqlite/SQLiteConnection$OperationLog$$ExternalSyntheticLambda1; Landroid/database/sqlite/SQLiteConnection$OperationLog; Landroid/database/sqlite/SQLiteConnection$PreparedStatement; Landroid/database/sqlite/SQLiteConnection$PreparedStatementCache; +Landroid/database/sqlite/SQLiteConnection$RateLimiter; +Landroid/database/sqlite/SQLiteConnection-IA; Landroid/database/sqlite/SQLiteConnection; Landroid/database/sqlite/SQLiteConnectionPool$1; Landroid/database/sqlite/SQLiteConnectionPool$AcquiredConnectionStatus; -Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter-IA; Landroid/database/sqlite/SQLiteConnectionPool$ConnectionWaiter; Landroid/database/sqlite/SQLiteConnectionPool$IdleConnectionHandler; +Landroid/database/sqlite/SQLiteConnectionPool-IA; Landroid/database/sqlite/SQLiteConnectionPool; Landroid/database/sqlite/SQLiteConstraintException; -Landroid/database/sqlite/SQLiteCursor; Landroid/database/sqlite/SQLiteCursorDriver; Landroid/database/sqlite/SQLiteCustomFunction; Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda0; @@ -24599,8 +24429,8 @@ Landroid/database/sqlite/SQLiteDatabase$$ExternalSyntheticLambda3; Landroid/database/sqlite/SQLiteDatabase$1; Landroid/database/sqlite/SQLiteDatabase$CursorFactory; Landroid/database/sqlite/SQLiteDatabase$OpenParams$Builder; -Landroid/database/sqlite/SQLiteDatabase$OpenParams-IA; Landroid/database/sqlite/SQLiteDatabase$OpenParams; +Landroid/database/sqlite/SQLiteDatabase-IA; Landroid/database/sqlite/SQLiteDatabase; Landroid/database/sqlite/SQLiteDatabaseConfiguration; Landroid/database/sqlite/SQLiteDatabaseCorruptException; @@ -24624,8 +24454,8 @@ Landroid/database/sqlite/SQLiteQuery; Landroid/database/sqlite/SQLiteQueryBuilder; Landroid/database/sqlite/SQLiteRawStatement; Landroid/database/sqlite/SQLiteReadOnlyDatabaseException; -Landroid/database/sqlite/SQLiteSession$Transaction-IA; Landroid/database/sqlite/SQLiteSession$Transaction; +Landroid/database/sqlite/SQLiteSession-IA; Landroid/database/sqlite/SQLiteSession; Landroid/database/sqlite/SQLiteStatement; Landroid/database/sqlite/SQLiteStatementInfo; @@ -24634,8 +24464,8 @@ Landroid/database/sqlite/SQLiteTokenizer; Landroid/database/sqlite/SQLiteTransactionListener; Landroid/database/sqlite/SqliteWrapper; Landroid/ddm/DdmHandle; -Landroid/ddm/DdmHandleAppName$Names-IA; Landroid/ddm/DdmHandleAppName$Names; +Landroid/ddm/DdmHandleAppName-IA; Landroid/ddm/DdmHandleAppName; Landroid/ddm/DdmHandleExit; Landroid/ddm/DdmHandleHeap; @@ -24697,11 +24527,12 @@ Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda4; Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda5; Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda6; Landroid/graphics/ColorSpace$Rgb$$ExternalSyntheticLambda9; +Landroid/graphics/ColorSpace$Rgb$Native; Landroid/graphics/ColorSpace$Rgb$NoImagePreloadHolder; Landroid/graphics/ColorSpace$Rgb$TransferParameters; -Landroid/graphics/ColorSpace$Rgb-IA; Landroid/graphics/ColorSpace$Rgb; Landroid/graphics/ColorSpace$Xyz; +Landroid/graphics/ColorSpace-IA; Landroid/graphics/ColorSpace; Landroid/graphics/Compatibility; Landroid/graphics/ComposePathEffect; @@ -24731,11 +24562,11 @@ Landroid/graphics/HardwareRenderer$DestroyContextRunnable; Landroid/graphics/HardwareRenderer$FrameCommitCallback; Landroid/graphics/HardwareRenderer$FrameCompleteCallback; Landroid/graphics/HardwareRenderer$FrameDrawingCallback; -Landroid/graphics/HardwareRenderer$FrameRenderRequest-IA; Landroid/graphics/HardwareRenderer$FrameRenderRequest; Landroid/graphics/HardwareRenderer$PrepareSurfaceControlForWebviewCallback; Landroid/graphics/HardwareRenderer$ProcessInitializer$1; Landroid/graphics/HardwareRenderer$ProcessInitializer; +Landroid/graphics/HardwareRenderer-IA; Landroid/graphics/HardwareRenderer; Landroid/graphics/HardwareRendererObserver$$ExternalSyntheticLambda0; Landroid/graphics/HardwareRendererObserver$OnFrameMetricsAvailableListener; @@ -24744,12 +24575,11 @@ Landroid/graphics/ImageDecoder$AssetInputStreamSource; Landroid/graphics/ImageDecoder$ByteArraySource; Landroid/graphics/ImageDecoder$DecodeException; Landroid/graphics/ImageDecoder$ImageDecoderSourceTrace; -Landroid/graphics/ImageDecoder$ImageInfo-IA; Landroid/graphics/ImageDecoder$ImageInfo; Landroid/graphics/ImageDecoder$InputStreamSource; Landroid/graphics/ImageDecoder$OnHeaderDecodedListener; -Landroid/graphics/ImageDecoder$Source-IA; Landroid/graphics/ImageDecoder$Source; +Landroid/graphics/ImageDecoder-IA; Landroid/graphics/ImageDecoder; Landroid/graphics/ImageFormat; Landroid/graphics/Insets$1; @@ -24762,6 +24592,7 @@ Landroid/graphics/LightingColorFilter; Landroid/graphics/LinearGradient; Landroid/graphics/MaskFilter; Landroid/graphics/Matrix$1; +Landroid/graphics/Matrix$ExtraNatives; Landroid/graphics/Matrix$NoImagePreloadHolder; Landroid/graphics/Matrix$ScaleToFit; Landroid/graphics/Matrix; @@ -24785,6 +24616,7 @@ Landroid/graphics/Paint; Landroid/graphics/PaintFlagsDrawFilter; Landroid/graphics/Path$Direction; Landroid/graphics/Path$FillType; +Landroid/graphics/Path$NoImagePreloadHolder; Landroid/graphics/Path$Op; Landroid/graphics/Path; Landroid/graphics/PathDashPathEffect; @@ -24865,7 +24697,6 @@ Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedStateListState; Landroid/graphics/drawable/AnimatedStateListDrawable$AnimatedVectorDrawableTransition; Landroid/graphics/drawable/AnimatedStateListDrawable$AnimationDrawableTransition; Landroid/graphics/drawable/AnimatedStateListDrawable$FrameInterpolator; -Landroid/graphics/drawable/AnimatedStateListDrawable$Transition-IA; Landroid/graphics/drawable/AnimatedStateListDrawable$Transition; Landroid/graphics/drawable/AnimatedStateListDrawable-IA; Landroid/graphics/drawable/AnimatedStateListDrawable; @@ -24899,9 +24730,9 @@ Landroid/graphics/drawable/Drawable$Callback; Landroid/graphics/drawable/Drawable$ConstantState; Landroid/graphics/drawable/Drawable; Landroid/graphics/drawable/DrawableContainer$1; -Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback-IA; Landroid/graphics/drawable/DrawableContainer$BlockInvalidateCallback; Landroid/graphics/drawable/DrawableContainer$DrawableContainerState; +Landroid/graphics/drawable/DrawableContainer-IA; Landroid/graphics/drawable/DrawableContainer; Landroid/graphics/drawable/DrawableInflater; Landroid/graphics/drawable/DrawableWrapper$DrawableWrapperState; @@ -24995,6 +24826,7 @@ Landroid/graphics/drawable/shapes/RectShape; Landroid/graphics/drawable/shapes/RoundRectShape; Landroid/graphics/drawable/shapes/Shape; Landroid/graphics/fonts/Font$Builder; +Landroid/graphics/fonts/Font$NoImagePreloadHolder; Landroid/graphics/fonts/Font; Landroid/graphics/fonts/FontCustomizationParser$Result; Landroid/graphics/fonts/FontCustomizationParser; @@ -25013,7 +24845,6 @@ Landroid/graphics/text/LineBreakConfig$Builder; Landroid/graphics/text/LineBreakConfig; Landroid/graphics/text/LineBreaker$Builder; Landroid/graphics/text/LineBreaker$ParagraphConstraints; -Landroid/graphics/text/LineBreaker$Result-IA; Landroid/graphics/text/LineBreaker$Result; Landroid/graphics/text/LineBreaker-IA; Landroid/graphics/text/LineBreaker; @@ -25039,6 +24870,7 @@ Landroid/hardware/CameraSessionStats; Landroid/hardware/CameraStatus$1; Landroid/hardware/CameraStatus; Landroid/hardware/ConsumerIrManager; +Landroid/hardware/DataSpace; Landroid/hardware/GeomagneticField$LegendreTable; Landroid/hardware/GeomagneticField; Landroid/hardware/HardwareBuffer$1; @@ -25086,7 +24918,6 @@ Landroid/hardware/SyncFence; Landroid/hardware/SystemSensorManager$BaseEventQueue; Landroid/hardware/SystemSensorManager$SensorEventQueue; Landroid/hardware/SystemSensorManager$TriggerEventQueue; -Landroid/hardware/SystemSensorManager; Landroid/hardware/TriggerEvent; Landroid/hardware/TriggerEventListener; Landroid/hardware/biometrics/BiometricAuthenticator$AuthenticationCallback; @@ -25147,19 +24978,15 @@ Landroid/hardware/camera2/CameraCharacteristics$5; Landroid/hardware/camera2/CameraCharacteristics$6; Landroid/hardware/camera2/CameraCharacteristics$7; Landroid/hardware/camera2/CameraCharacteristics$8; -Landroid/hardware/camera2/CameraCharacteristics$9; Landroid/hardware/camera2/CameraCharacteristics$Key; Landroid/hardware/camera2/CameraCharacteristics; Landroid/hardware/camera2/CameraDevice$StateCallback; Landroid/hardware/camera2/CameraDevice; Landroid/hardware/camera2/CameraManager$AvailabilityCallback; +Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$$ExternalSyntheticLambda0; Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$$ExternalSyntheticLambda2; Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$1; -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$3; -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$4; -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$5; -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$6; -Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$7; +Landroid/hardware/camera2/CameraManager$CameraManagerGlobal$DeviceCameraInfo; Landroid/hardware/camera2/CameraManager$CameraManagerGlobal; Landroid/hardware/camera2/CameraManager$DeviceStateListener; Landroid/hardware/camera2/CameraManager$FoldStateListener$$ExternalSyntheticLambda0; @@ -25170,18 +24997,17 @@ Landroid/hardware/camera2/CameraMetadata; Landroid/hardware/camera2/CameraOfflineSession$CameraOfflineSessionCallback; Landroid/hardware/camera2/CaptureRequest$1; Landroid/hardware/camera2/CaptureRequest$2; -Landroid/hardware/camera2/CaptureRequest$3; Landroid/hardware/camera2/CaptureRequest$Key; Landroid/hardware/camera2/CaptureRequest; Landroid/hardware/camera2/CaptureResult$1; Landroid/hardware/camera2/CaptureResult$2; Landroid/hardware/camera2/CaptureResult$3; -Landroid/hardware/camera2/CaptureResult$4; Landroid/hardware/camera2/CaptureResult$Key; Landroid/hardware/camera2/CaptureResult; Landroid/hardware/camera2/DngCreator; Landroid/hardware/camera2/TotalCaptureResult; Landroid/hardware/camera2/extension/ICaptureProcessorImpl; +Landroid/hardware/camera2/impl/CameraDeviceImpl$1; Landroid/hardware/camera2/impl/CameraDeviceImpl$CameraHandlerExecutor; Landroid/hardware/camera2/impl/CameraDeviceImpl; Landroid/hardware/camera2/impl/CameraExtensionJpegProcessor; @@ -25316,6 +25142,8 @@ Landroid/hardware/contexthub/V1_0/MemRange; Landroid/hardware/contexthub/V1_0/NanoAppBinary; Landroid/hardware/contexthub/V1_0/PhysicalSensor; Landroid/hardware/contexthub/V1_1/Setting; +Landroid/hardware/devicestate/DeviceState$Configuration$1; +Landroid/hardware/devicestate/DeviceState$Configuration; Landroid/hardware/devicestate/DeviceState; Landroid/hardware/devicestate/DeviceStateInfo$1; Landroid/hardware/devicestate/DeviceStateInfo; @@ -25326,8 +25154,8 @@ Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrappe Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1; Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2; Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateCallbackWrapper; -Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback-IA; Landroid/hardware/devicestate/DeviceStateManagerGlobal$DeviceStateManagerCallback; +Landroid/hardware/devicestate/DeviceStateManagerGlobal-IA; Landroid/hardware/devicestate/DeviceStateManagerGlobal; Landroid/hardware/devicestate/IDeviceStateManager$Stub$Proxy; Landroid/hardware/devicestate/IDeviceStateManager$Stub; @@ -25362,13 +25190,12 @@ Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda0; Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda1; Landroid/hardware/display/DisplayManager$$ExternalSyntheticLambda2; Landroid/hardware/display/DisplayManager$DisplayListener; -Landroid/hardware/display/DisplayManager$WeakDisplayCache-IA; Landroid/hardware/display/DisplayManager$WeakDisplayCache; +Landroid/hardware/display/DisplayManager-IA; Landroid/hardware/display/DisplayManager; Landroid/hardware/display/DisplayManagerGlobal$1; Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0; Landroid/hardware/display/DisplayManagerGlobal$DisplayListenerDelegate; -Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback-IA; Landroid/hardware/display/DisplayManagerGlobal; Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks; Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest; @@ -25430,12 +25257,9 @@ Landroid/hardware/fingerprint/Fingerprint$1; Landroid/hardware/fingerprint/Fingerprint; Landroid/hardware/fingerprint/FingerprintManager$1; Landroid/hardware/fingerprint/FingerprintManager$2; -Landroid/hardware/fingerprint/FingerprintManager$3; Landroid/hardware/fingerprint/FingerprintManager$AuthenticationCallback; Landroid/hardware/fingerprint/FingerprintManager$AuthenticationResult; Landroid/hardware/fingerprint/FingerprintManager$LockoutResetCallback; -Landroid/hardware/fingerprint/FingerprintManager$MyHandler-IA; -Landroid/hardware/fingerprint/FingerprintManager$MyHandler; Landroid/hardware/fingerprint/FingerprintManager; Landroid/hardware/fingerprint/FingerprintSensorPropertiesInternal$1; Landroid/hardware/fingerprint/FingerprintSensorPropertiesInternal; @@ -25477,9 +25301,9 @@ Landroid/hardware/input/InputDeviceIdentifier; Landroid/hardware/input/InputManager$InputDeviceListener; Landroid/hardware/input/InputManager; Landroid/hardware/input/InputManagerGlobal$InputDeviceListenerDelegate; -Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener-IA; Landroid/hardware/input/InputManagerGlobal$InputDevicesChangedListener; Landroid/hardware/input/InputManagerGlobal$OnTabletModeChangedListenerDelegate; +Landroid/hardware/input/InputManagerGlobal-IA; Landroid/hardware/input/InputManagerGlobal; Landroid/hardware/input/InputSettings; Landroid/hardware/input/KeyboardLayout$1; @@ -25921,13 +25745,9 @@ Landroid/icu/impl/CacheValue; Landroid/icu/impl/CalType; Landroid/icu/impl/CalendarAstronomer$1; Landroid/icu/impl/CalendarAstronomer$2; -Landroid/icu/impl/CalendarAstronomer$3; -Landroid/icu/impl/CalendarAstronomer$4; Landroid/icu/impl/CalendarAstronomer$AngleFunc; -Landroid/icu/impl/CalendarAstronomer$CoordFunc; Landroid/icu/impl/CalendarAstronomer$Ecliptic; Landroid/icu/impl/CalendarAstronomer$Equatorial; -Landroid/icu/impl/CalendarAstronomer$Horizon; Landroid/icu/impl/CalendarAstronomer$MoonAge; Landroid/icu/impl/CalendarAstronomer$SolarLongitude; Landroid/icu/impl/CalendarAstronomer; @@ -25964,6 +25784,7 @@ Landroid/icu/impl/DayPeriodRules$DayPeriodRulesDataSink; Landroid/icu/impl/DayPeriodRules-IA; Landroid/icu/impl/DayPeriodRules; Landroid/icu/impl/DontCareFieldPosition; +Landroid/icu/impl/EmojiProps$IsAcceptable; Landroid/icu/impl/EmojiProps; Landroid/icu/impl/EraRules; Landroid/icu/impl/FormattedStringBuilder$FieldWrapper; @@ -25992,11 +25813,11 @@ Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$VariantS Landroid/icu/impl/ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo; Landroid/icu/impl/ICUCurrencyDisplayInfoProvider; Landroid/icu/impl/ICUCurrencyMetaInfo$Collector; -Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector-IA; Landroid/icu/impl/ICUCurrencyMetaInfo$CurrencyCollector; Landroid/icu/impl/ICUCurrencyMetaInfo$InfoCollector; Landroid/icu/impl/ICUCurrencyMetaInfo$RegionCollector; Landroid/icu/impl/ICUCurrencyMetaInfo$UniqueList; +Landroid/icu/impl/ICUCurrencyMetaInfo-IA; Landroid/icu/impl/ICUCurrencyMetaInfo; Landroid/icu/impl/ICUData$1; Landroid/icu/impl/ICUData$2; @@ -26024,10 +25845,10 @@ Landroid/icu/impl/ICUResourceBundle$4; Landroid/icu/impl/ICUResourceBundle$5; Landroid/icu/impl/ICUResourceBundle$AvailEntry; Landroid/icu/impl/ICUResourceBundle$AvailableLocalesSink; -Landroid/icu/impl/ICUResourceBundle$Loader-IA; Landroid/icu/impl/ICUResourceBundle$Loader; Landroid/icu/impl/ICUResourceBundle$OpenType; Landroid/icu/impl/ICUResourceBundle$WholeBundle; +Landroid/icu/impl/ICUResourceBundle-IA; Landroid/icu/impl/ICUResourceBundle; Landroid/icu/impl/ICUResourceBundleImpl$ResourceArray; Landroid/icu/impl/ICUResourceBundleImpl$ResourceBinary; @@ -26162,10 +25983,10 @@ Landroid/icu/impl/TZDBTimeZoneNames$TZDBNames; Landroid/icu/impl/TZDBTimeZoneNames; Landroid/icu/impl/TextTrieMap$CharIterator; Landroid/icu/impl/TextTrieMap$LongestMatchHandler; -Landroid/icu/impl/TextTrieMap$Node-IA; Landroid/icu/impl/TextTrieMap$Node; Landroid/icu/impl/TextTrieMap$Output; Landroid/icu/impl/TextTrieMap$ResultHandler; +Landroid/icu/impl/TextTrieMap-IA; Landroid/icu/impl/TextTrieMap; Landroid/icu/impl/TimeZoneAdapter; Landroid/icu/impl/TimeZoneGenericNames$1; @@ -26185,9 +26006,9 @@ Landroid/icu/impl/TimeZoneNamesImpl$NameSearchHandler; Landroid/icu/impl/TimeZoneNamesImpl$TZ2MZsCache; Landroid/icu/impl/TimeZoneNamesImpl$ZNames$NameTypeIndex; Landroid/icu/impl/TimeZoneNamesImpl$ZNames; -Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader-IA; Landroid/icu/impl/TimeZoneNamesImpl$ZNamesLoader; Landroid/icu/impl/TimeZoneNamesImpl$ZoneStringsLoader; +Landroid/icu/impl/TimeZoneNamesImpl-IA; Landroid/icu/impl/TimeZoneNamesImpl; Landroid/icu/impl/Trie$DataManipulate; Landroid/icu/impl/Trie$DefaultGetFoldingOffset; @@ -26239,6 +26060,8 @@ Landroid/icu/impl/UCharacterProperty$24; Landroid/icu/impl/UCharacterProperty$25; Landroid/icu/impl/UCharacterProperty$26; Landroid/icu/impl/UCharacterProperty$27; +Landroid/icu/impl/UCharacterProperty$28; +Landroid/icu/impl/UCharacterProperty$29; Landroid/icu/impl/UCharacterProperty$2; Landroid/icu/impl/UCharacterProperty$3; Landroid/icu/impl/UCharacterProperty$4; @@ -26256,6 +26079,7 @@ Landroid/icu/impl/UCharacterProperty$IntProperty; Landroid/icu/impl/UCharacterProperty$IsAcceptable; Landroid/icu/impl/UCharacterProperty$LayoutProps$IsAcceptable; Landroid/icu/impl/UCharacterProperty$LayoutProps; +Landroid/icu/impl/UCharacterProperty$MathCompatBinaryProperty; Landroid/icu/impl/UCharacterProperty$NormInertBinaryProperty; Landroid/icu/impl/UCharacterProperty$NormQuickCheckIntProperty; Landroid/icu/impl/UCharacterProperty; @@ -26440,8 +26264,15 @@ Landroid/icu/impl/locale/KeyTypeData$Type; Landroid/icu/impl/locale/KeyTypeData$TypeInfoType; Landroid/icu/impl/locale/KeyTypeData$ValueType; Landroid/icu/impl/locale/KeyTypeData; +Landroid/icu/impl/locale/LSR$CachedDecoder$$ExternalSyntheticLambda0; +Landroid/icu/impl/locale/LSR$CachedDecoder$$ExternalSyntheticLambda1; +Landroid/icu/impl/locale/LSR$CachedDecoder$$ExternalSyntheticLambda2; +Landroid/icu/impl/locale/LSR$CachedDecoder; Landroid/icu/impl/locale/LSR; Landroid/icu/impl/locale/LanguageTag; +Landroid/icu/impl/locale/LikelySubtags$1; +Landroid/icu/impl/locale/LikelySubtags$Data; +Landroid/icu/impl/locale/LikelySubtags; Landroid/icu/impl/locale/LocaleDistance$Data; Landroid/icu/impl/locale/LocaleDistance; Landroid/icu/impl/locale/LocaleExtensions; @@ -26472,9 +26303,6 @@ Landroid/icu/impl/locale/XCldrStub$ReusableEntry; Landroid/icu/impl/locale/XCldrStub$Splitter; Landroid/icu/impl/locale/XCldrStub$TreeMultimap; Landroid/icu/impl/locale/XCldrStub; -Landroid/icu/impl/locale/XLikelySubtags$1; -Landroid/icu/impl/locale/XLikelySubtags$Data; -Landroid/icu/impl/locale/XLikelySubtags; Landroid/icu/impl/number/AdoptingModifierStore$1; Landroid/icu/impl/number/AdoptingModifierStore; Landroid/icu/impl/number/AffixPatternProvider$Flags; @@ -26521,10 +26349,10 @@ Landroid/icu/impl/number/MutablePatternModifier$ImmutablePatternModifier; Landroid/icu/impl/number/MutablePatternModifier; Landroid/icu/impl/number/Padder$PadPosition; Landroid/icu/impl/number/Padder; -Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo-IA; Landroid/icu/impl/number/PatternStringParser$ParsedPatternInfo; Landroid/icu/impl/number/PatternStringParser$ParsedSubpatternInfo; Landroid/icu/impl/number/PatternStringParser$ParserState; +Landroid/icu/impl/number/PatternStringParser-IA; Landroid/icu/impl/number/PatternStringParser; Landroid/icu/impl/number/PatternStringUtils$1; Landroid/icu/impl/number/PatternStringUtils$PatternSignType; @@ -26605,6 +26433,7 @@ Landroid/icu/lang/UCharacter$DummyValueIterator; Landroid/icu/lang/UCharacter$EastAsianWidth; Landroid/icu/lang/UCharacter$GraphemeClusterBreak; Landroid/icu/lang/UCharacter$HangulSyllableType; +Landroid/icu/lang/UCharacter$IdentifierType; Landroid/icu/lang/UCharacter$IndicPositionalCategory; Landroid/icu/lang/UCharacter$IndicSyllabicCategory; Landroid/icu/lang/UCharacter$JoiningGroup; @@ -26835,7 +26664,6 @@ Landroid/icu/text/DateFormat$Field; Landroid/icu/text/DateFormat$HourCycle; Landroid/icu/text/DateFormat; Landroid/icu/text/DateFormatSymbols$1; -Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols-IA; Landroid/icu/text/DateFormatSymbols$AospExtendedDateFormatSymbols; Landroid/icu/text/DateFormatSymbols$CalendarDataSink$AliasType; Landroid/icu/text/DateFormatSymbols$CalendarDataSink; @@ -26851,25 +26679,21 @@ Landroid/icu/text/DateIntervalFormat; Landroid/icu/text/DateIntervalInfo$DateIntervalSink; Landroid/icu/text/DateIntervalInfo$PatternInfo; Landroid/icu/text/DateIntervalInfo; -Landroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink-IA; Landroid/icu/text/DateTimePatternGenerator$AppendItemFormatsSink; -Landroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink-IA; Landroid/icu/text/DateTimePatternGenerator$AppendItemNamesSink; Landroid/icu/text/DateTimePatternGenerator$AvailableFormatsSink; Landroid/icu/text/DateTimePatternGenerator$DTPGflags; -Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher-IA; Landroid/icu/text/DateTimePatternGenerator$DateTimeMatcher; Landroid/icu/text/DateTimePatternGenerator$DayPeriodAllowedHoursSink; Landroid/icu/text/DateTimePatternGenerator$DisplayWidth; -Landroid/icu/text/DateTimePatternGenerator$DistanceInfo-IA; Landroid/icu/text/DateTimePatternGenerator$DistanceInfo; Landroid/icu/text/DateTimePatternGenerator$FormatParser; Landroid/icu/text/DateTimePatternGenerator$PatternInfo; Landroid/icu/text/DateTimePatternGenerator$PatternWithMatcher; Landroid/icu/text/DateTimePatternGenerator$PatternWithSkeletonFlag; -Landroid/icu/text/DateTimePatternGenerator$SkeletonFields-IA; Landroid/icu/text/DateTimePatternGenerator$SkeletonFields; Landroid/icu/text/DateTimePatternGenerator$VariableField; +Landroid/icu/text/DateTimePatternGenerator-IA; Landroid/icu/text/DateTimePatternGenerator; Landroid/icu/text/DecimalFormat$PropertySetter; Landroid/icu/text/DecimalFormat; @@ -26880,8 +26704,8 @@ Landroid/icu/text/DecimalFormatSymbols; Landroid/icu/text/DisplayContext$Type; Landroid/icu/text/DisplayContext; Landroid/icu/text/DurationFormat; -Landroid/icu/text/Edits$Iterator-IA; Landroid/icu/text/Edits$Iterator; +Landroid/icu/text/Edits-IA; Landroid/icu/text/Edits; Landroid/icu/text/EscapeTransliterator$1; Landroid/icu/text/EscapeTransliterator$2; @@ -27019,10 +26843,10 @@ Landroid/icu/text/PluralRules$OrConstraint; Landroid/icu/text/PluralRules$PluralType; Landroid/icu/text/PluralRules$RangeConstraint; Landroid/icu/text/PluralRules$Rule; -Landroid/icu/text/PluralRules$RuleList-IA; Landroid/icu/text/PluralRules$RuleList; Landroid/icu/text/PluralRules$SampleType; Landroid/icu/text/PluralRules$SimpleTokenizer; +Landroid/icu/text/PluralRules-IA; Landroid/icu/text/PluralRules; Landroid/icu/text/PluralRulesSerialProxy; Landroid/icu/text/Quantifier; @@ -27068,12 +26892,12 @@ Landroid/icu/text/ReplaceableString; Landroid/icu/text/RuleBasedBreakIterator$BreakCache; Landroid/icu/text/RuleBasedBreakIterator$DictionaryCache; Landroid/icu/text/RuleBasedBreakIterator; -Landroid/icu/text/RuleBasedCollator$CollationBuffer-IA; Landroid/icu/text/RuleBasedCollator$CollationBuffer; Landroid/icu/text/RuleBasedCollator$CollationKeyByteSink; Landroid/icu/text/RuleBasedCollator$FCDUTF16NFDIterator; Landroid/icu/text/RuleBasedCollator$NFDIterator; Landroid/icu/text/RuleBasedCollator$UTF16NFDIterator; +Landroid/icu/text/RuleBasedCollator-IA; Landroid/icu/text/RuleBasedCollator; Landroid/icu/text/RuleBasedNumberFormat; Landroid/icu/text/RuleBasedTransliterator$Data; @@ -27150,6 +26974,7 @@ Landroid/icu/text/TitlecaseTransliterator; Landroid/icu/text/Transform; Landroid/icu/text/TransliterationRule; Landroid/icu/text/TransliterationRuleSet; +Landroid/icu/text/Transliterator$$ExternalSyntheticLambda0; Landroid/icu/text/Transliterator$Factory; Landroid/icu/text/Transliterator$Position; Landroid/icu/text/Transliterator; @@ -27196,6 +27021,7 @@ Landroid/icu/text/UnicodeSet$EntryRangeIterable; Landroid/icu/text/UnicodeSet$EntryRangeIterator; Landroid/icu/text/UnicodeSet$Filter; Landroid/icu/text/UnicodeSet$GeneralCategoryMaskFilter; +Landroid/icu/text/UnicodeSet$IdentifierTypeFilter; Landroid/icu/text/UnicodeSet$IntPropertyFilter; Landroid/icu/text/UnicodeSet$NumericValueFilter; Landroid/icu/text/UnicodeSet$ScriptExtensionsFilter; @@ -27225,11 +27051,11 @@ Landroid/icu/util/BytesTrieBuilder$BytesAsCharSequence; Landroid/icu/util/BytesTrieBuilder; Landroid/icu/util/CECalendar; Landroid/icu/util/Calendar$1; -Landroid/icu/util/Calendar$FormatConfiguration-IA; Landroid/icu/util/Calendar$FormatConfiguration; Landroid/icu/util/Calendar$PatternData; Landroid/icu/util/Calendar$WeekData; Landroid/icu/util/Calendar$WeekDataCache; +Landroid/icu/util/Calendar-IA; Landroid/icu/util/Calendar; Landroid/icu/util/CaseInsensitiveString; Landroid/icu/util/CharsTrie$Entry; @@ -27244,19 +27070,16 @@ Landroid/icu/util/CodePointMap$RangeOption; Landroid/icu/util/CodePointMap$StringIterator; Landroid/icu/util/CodePointMap$ValueFilter; Landroid/icu/util/CodePointMap; -Landroid/icu/util/CodePointTrie$Data-IA; Landroid/icu/util/CodePointTrie$Data16; Landroid/icu/util/CodePointTrie$Data32; Landroid/icu/util/CodePointTrie$Data8; Landroid/icu/util/CodePointTrie$Data; Landroid/icu/util/CodePointTrie$Fast$FastStringIterator; -Landroid/icu/util/CodePointTrie$Fast-IA; Landroid/icu/util/CodePointTrie$Fast16; Landroid/icu/util/CodePointTrie$Fast32; Landroid/icu/util/CodePointTrie$Fast8; Landroid/icu/util/CodePointTrie$Fast; Landroid/icu/util/CodePointTrie$Small$SmallStringIterator; -Landroid/icu/util/CodePointTrie$Small-IA; Landroid/icu/util/CodePointTrie$Small16; Landroid/icu/util/CodePointTrie$Small32; Landroid/icu/util/CodePointTrie$Small8; @@ -27302,7 +27125,12 @@ Landroid/icu/util/ICUUncheckedIOException; Landroid/icu/util/IllformedLocaleException; Landroid/icu/util/IndianCalendar; Landroid/icu/util/InitialTimeZoneRule; +Landroid/icu/util/IslamicCalendar$Algorithm; Landroid/icu/util/IslamicCalendar$CalculationType; +Landroid/icu/util/IslamicCalendar$CivilAlgorithm; +Landroid/icu/util/IslamicCalendar$IslamicAlgorithm; +Landroid/icu/util/IslamicCalendar$TBLAAlgorithm; +Landroid/icu/util/IslamicCalendar$UmalquraAlgorithm; Landroid/icu/util/IslamicCalendar; Landroid/icu/util/JapaneseCalendar; Landroid/icu/util/LocaleData$MeasurementSystem; @@ -27333,8 +27161,8 @@ Landroid/icu/util/MeasureUnit$MeasureUnitSink; Landroid/icu/util/MeasureUnit; Landroid/icu/util/MutableCodePointTrie$1; Landroid/icu/util/MutableCodePointTrie$AllSameBlocks; -Landroid/icu/util/MutableCodePointTrie$MixedBlocks-IA; Landroid/icu/util/MutableCodePointTrie$MixedBlocks; +Landroid/icu/util/MutableCodePointTrie-IA; Landroid/icu/util/MutableCodePointTrie; Landroid/icu/util/NoUnit; Landroid/icu/util/Output; @@ -27408,6 +27236,7 @@ Landroid/inputmethodservice/InputMethodService$Insets; Landroid/inputmethodservice/InputMethodService$SettingsObserver; Landroid/inputmethodservice/InputMethodService; Landroid/inputmethodservice/SoftInputWindow; +Landroid/internal/framework/protobuf/nano/MessageNano; Landroid/internal/hidl/base/V1_0/DebugInfo; Landroid/internal/hidl/base/V1_0/IBase; Landroid/internal/hidl/manager/V1_0/IServiceManager; @@ -27442,11 +27271,14 @@ Landroid/location/IGpsGeofenceHardware$Stub; Landroid/location/IGpsGeofenceHardware; Landroid/location/Location$$ExternalSyntheticLambda0; Landroid/location/Location$1; -Landroid/location/Location$BearingDistanceCache-IA; Landroid/location/Location$BearingDistanceCache; +Landroid/location/Location-IA; Landroid/location/Location; Landroid/location/LocationTime$1; Landroid/location/LocationTime; +Landroid/location/flags/FeatureFlags; +Landroid/location/flags/FeatureFlagsImpl; +Landroid/location/flags/Flags; Landroid/media/AudioAttributes$1; Landroid/media/AudioAttributes$Builder; Landroid/media/AudioAttributes-IA; @@ -27473,7 +27305,6 @@ Landroid/media/AudioGain; Landroid/media/AudioGainConfig; Landroid/media/AudioHandle; Landroid/media/AudioManager$1; -Landroid/media/AudioManager$2; Landroid/media/AudioManager$3; Landroid/media/AudioManager$4; Landroid/media/AudioManager$AudioPlaybackCallback; @@ -27481,22 +27312,20 @@ Landroid/media/AudioManager$AudioPlaybackCallbackInfo; Landroid/media/AudioManager$AudioRecordingCallback; Landroid/media/AudioManager$AudioRecordingCallbackInfo; Landroid/media/AudioManager$BlockingFocusResultReceiver; -Landroid/media/AudioManager$DevRoleListeners-IA; Landroid/media/AudioManager$DevRoleListeners; Landroid/media/AudioManager$FocusRequestInfo; Landroid/media/AudioManager$NativeEventHandlerDelegate$1; Landroid/media/AudioManager$NativeEventHandlerDelegate; -Landroid/media/AudioManager$OnAmPortUpdateListener-IA; Landroid/media/AudioManager$OnAmPortUpdateListener; Landroid/media/AudioManager$OnAudioFocusChangeListener; Landroid/media/AudioManager$OnAudioPortUpdateListener; Landroid/media/AudioManager$OnModeChangedListener; Landroid/media/AudioManager$PlaybackConfigChangeCallbackData; Landroid/media/AudioManager$RecordConfigChangeCallbackData; -Landroid/media/AudioManager$SafeWaitObject-IA; Landroid/media/AudioManager$SafeWaitObject; Landroid/media/AudioManager$ServiceEventHandlerDelegate$1; Landroid/media/AudioManager$ServiceEventHandlerDelegate; +Landroid/media/AudioManager-IA; Landroid/media/AudioManager; Landroid/media/AudioManagerInternal$RingerModeDelegate; Landroid/media/AudioManagerInternal; @@ -27607,7 +27436,6 @@ Landroid/media/IMediaRoute2ProviderServiceCallback; Landroid/media/IMediaRouter2$Stub$Proxy; Landroid/media/IMediaRouter2$Stub; Landroid/media/IMediaRouter2; -Landroid/media/IMediaRouter2Manager$Stub$Proxy; Landroid/media/IMediaRouter2Manager$Stub; Landroid/media/IMediaRouter2Manager; Landroid/media/IMediaRouterClient$Stub$Proxy; @@ -27617,7 +27445,6 @@ Landroid/media/IMediaRouterService$Stub$Proxy; Landroid/media/IMediaRouterService$Stub; Landroid/media/IMediaRouterService; Landroid/media/INearbyMediaDevicesProvider; -Landroid/media/IPlaybackConfigDispatcher$Stub$Proxy; Landroid/media/IPlaybackConfigDispatcher$Stub; Landroid/media/IPlaybackConfigDispatcher; Landroid/media/IPlayer$Stub$Proxy; @@ -27652,10 +27479,11 @@ Landroid/media/ImageWriter$WriterSurfaceImage$SurfacePlane; Landroid/media/ImageWriter$WriterSurfaceImage; Landroid/media/ImageWriter; Landroid/media/JetPlayer; +Landroid/media/MediaCodec$$ExternalSyntheticLambda6; +Landroid/media/MediaCodec$$ExternalSyntheticLambda7; +Landroid/media/MediaCodec$$ExternalSyntheticLambda8; Landroid/media/MediaCodec$BufferInfo; -Landroid/media/MediaCodec$BufferMap$CodecBuffer-IA; Landroid/media/MediaCodec$BufferMap$CodecBuffer; -Landroid/media/MediaCodec$BufferMap-IA; Landroid/media/MediaCodec$BufferMap; Landroid/media/MediaCodec$Callback; Landroid/media/MediaCodec$CodecException; @@ -27671,6 +27499,7 @@ Landroid/media/MediaCodec$OutputFrame; Landroid/media/MediaCodec$ParameterDescriptor; Landroid/media/MediaCodec$PersistentSurface; Landroid/media/MediaCodec$QueueRequest; +Landroid/media/MediaCodec-IA; Landroid/media/MediaCodec; Landroid/media/MediaCodecInfo$AudioCapabilities; Landroid/media/MediaCodecInfo$CodecCapabilities$FeatureList; @@ -27730,7 +27559,6 @@ Landroid/media/MediaPlayer$2; Landroid/media/MediaPlayer$3; Landroid/media/MediaPlayer$6; Landroid/media/MediaPlayer$7; -Landroid/media/MediaPlayer$DrmInfo-IA; Landroid/media/MediaPlayer$DrmInfo; Landroid/media/MediaPlayer$EventHandler$$ExternalSyntheticLambda0; Landroid/media/MediaPlayer$EventHandler$1; @@ -27756,6 +27584,7 @@ Landroid/media/MediaPlayer$TimeProvider$EventHandler; Landroid/media/MediaPlayer$TimeProvider; Landroid/media/MediaPlayer$TrackInfo$1; Landroid/media/MediaPlayer$TrackInfo; +Landroid/media/MediaPlayer-IA; Landroid/media/MediaPlayer; Landroid/media/MediaRecorder; Landroid/media/MediaRoute2Info$1; @@ -27876,6 +27705,8 @@ Landroid/media/VolumeShaper$Operation; Landroid/media/VolumeShaper$State$1; Landroid/media/VolumeShaper$State; Landroid/media/VolumeShaper; +Landroid/media/audio/FeatureFlags; +Landroid/media/audio/FeatureFlagsImpl; Landroid/media/audio/Flags; Landroid/media/audio/common/AidlConversion; Landroid/media/audio/common/HeadTracking$SensorData$Tag; @@ -27919,13 +27750,14 @@ Landroid/media/browse/MediaBrowser$ConnectionCallback; Landroid/media/browse/MediaBrowser$MediaItem$1; Landroid/media/browse/MediaBrowser$MediaItem; Landroid/media/browse/MediaBrowser$MediaServiceConnection$1; -Landroid/media/browse/MediaBrowser$MediaServiceConnection-IA; Landroid/media/browse/MediaBrowser$MediaServiceConnection; Landroid/media/browse/MediaBrowser$ServiceCallbacks; Landroid/media/browse/MediaBrowser$Subscription; Landroid/media/browse/MediaBrowser$SubscriptionCallback; +Landroid/media/browse/MediaBrowser-IA; Landroid/media/browse/MediaBrowser; Landroid/media/browse/MediaBrowserUtils; +Landroid/media/codec/Flags; Landroid/media/metrics/Event; Landroid/media/metrics/IMediaMetricsManager$Stub$Proxy; Landroid/media/metrics/IMediaMetricsManager$Stub; @@ -28017,8 +27849,8 @@ Landroid/media/session/MediaController$CallbackStub; Landroid/media/session/MediaController$MessageHandler; Landroid/media/session/MediaController$PlaybackInfo$1; Landroid/media/session/MediaController$PlaybackInfo; -Landroid/media/session/MediaController$TransportControls-IA; Landroid/media/session/MediaController$TransportControls; +Landroid/media/session/MediaController-IA; Landroid/media/session/MediaController; Landroid/media/session/MediaSession$Callback; Landroid/media/session/MediaSession$CallbackMessageHandler; @@ -28031,29 +27863,26 @@ Landroid/media/session/MediaSession; Landroid/media/session/MediaSessionLegacyHelper; Landroid/media/session/MediaSessionManager$OnActiveSessionsChangedListener; Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListener; -Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub-IA; Landroid/media/session/MediaSessionManager$OnMediaKeyEventDispatchedListenerStub; Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListener; -Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub-IA; Landroid/media/session/MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub; Landroid/media/session/MediaSessionManager$OnMediaKeyListener; Landroid/media/session/MediaSessionManager$OnMediaKeyListenerImpl; Landroid/media/session/MediaSessionManager$OnSession2TokensChangedListener; Landroid/media/session/MediaSessionManager$OnVolumeKeyLongPressListener; Landroid/media/session/MediaSessionManager$OnVolumeKeyLongPressListenerImpl; -Landroid/media/session/MediaSessionManager$RemoteSessionCallbackStub-IA; Landroid/media/session/MediaSessionManager$RemoteSessionCallbackStub; Landroid/media/session/MediaSessionManager$RemoteUserInfo; Landroid/media/session/MediaSessionManager$Session2TokensChangedWrapper; Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0; Landroid/media/session/MediaSessionManager$SessionsChangedWrapper$1; Landroid/media/session/MediaSessionManager$SessionsChangedWrapper; +Landroid/media/session/MediaSessionManager-IA; Landroid/media/session/MediaSessionManager; Landroid/media/session/ParcelableListBinder; Landroid/media/session/PlaybackState$1; Landroid/media/session/PlaybackState$Builder; Landroid/media/session/PlaybackState$CustomAction$1; -Landroid/media/session/PlaybackState$CustomAction-IA; Landroid/media/session/PlaybackState$CustomAction; Landroid/media/session/PlaybackState-IA; Landroid/media/session/PlaybackState; @@ -28184,18 +28013,14 @@ Landroid/net/TelephonyNetworkSpecifier$1; Landroid/net/TelephonyNetworkSpecifier$Builder; Landroid/net/TelephonyNetworkSpecifier; Landroid/net/Uri$1; -Landroid/net/Uri$AbstractHierarchicalUri-IA; Landroid/net/Uri$AbstractHierarchicalUri; Landroid/net/Uri$AbstractPart; Landroid/net/Uri$Builder; -Landroid/net/Uri$HierarchicalUri-IA; Landroid/net/Uri$NotCachedHolder; -Landroid/net/Uri$OpaqueUri-IA; Landroid/net/Uri$Part$EmptyPart; Landroid/net/Uri$Part; Landroid/net/Uri$PathPart; Landroid/net/Uri$PathSegmentsBuilder; -Landroid/net/Uri$StringUri-IA; Landroid/net/Uri-IA; Landroid/net/Uri; Landroid/net/UriCodec; @@ -28324,15 +28149,99 @@ Landroid/net/wifi/nl80211/WifiNl80211Manager$ScanEventHandler; Landroid/net/wifi/nl80211/WifiNl80211Manager$SignalPollResult; Landroid/net/wifi/nl80211/WifiNl80211Manager; Landroid/net/wifi/sharedconnectivity/app/SharedConnectivityManager; +Landroid/nfc/IAppCallback$Stub; +Landroid/nfc/IAppCallback; +Landroid/nfc/INfcAdapter$Stub; +Landroid/nfc/INfcAdapter; +Landroid/nfc/INfcAdapterExtras; +Landroid/nfc/INfcCardEmulation; +Landroid/nfc/INfcControllerAlwaysOnListener$Stub; +Landroid/nfc/INfcControllerAlwaysOnListener; +Landroid/nfc/INfcDta; +Landroid/nfc/INfcFCardEmulation; +Landroid/nfc/INfcTag; +Landroid/nfc/INfcUnlockHandler$Stub; +Landroid/nfc/INfcUnlockHandler; +Landroid/nfc/INfcVendorNciCallback$Stub; +Landroid/nfc/INfcVendorNciCallback; +Landroid/nfc/INfcWlcStateListener$Stub; +Landroid/nfc/INfcWlcStateListener; +Landroid/nfc/ITagRemovedCallback$Stub; +Landroid/nfc/ITagRemovedCallback; +Landroid/nfc/NdefMessage; +Landroid/nfc/NfcActivityManager; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda0; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda10; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda11; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda12; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda13; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda14; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda15; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda16; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda17; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda18; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda19; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda1; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda20; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda21; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda22; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda23; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda24; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda25; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda26; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda27; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda28; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda29; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda2; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda30; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda31; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda32; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda33; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda34; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda35; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda36; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda37; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda38; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda39; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda3; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda4; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda5; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda6; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda7; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda8; +Landroid/nfc/NfcAdapter$$ExternalSyntheticLambda9; +Landroid/nfc/NfcAdapter$1; +Landroid/nfc/NfcAdapter$2; +Landroid/nfc/NfcAdapter$ControllerAlwaysOnListener; +Landroid/nfc/NfcAdapter$CreateBeamUrisCallback; +Landroid/nfc/NfcAdapter$CreateNdefMessageCallback; +Landroid/nfc/NfcAdapter$NfcUnlockHandler; +Landroid/nfc/NfcAdapter$NfcVendorNciCallback; +Landroid/nfc/NfcAdapter$OnNdefPushCompleteCallback; +Landroid/nfc/NfcAdapter$OnTagRemovedListener; +Landroid/nfc/NfcAdapter$ReaderCallback; +Landroid/nfc/NfcAdapter$ServiceCall; +Landroid/nfc/NfcAdapter$ServiceCallReturn; +Landroid/nfc/NfcAdapter$WlcStateListener; +Landroid/nfc/NfcAdapter; +Landroid/nfc/NfcAntennaInfo; +Landroid/nfc/NfcControllerAlwaysOnListener; Landroid/nfc/NfcFrameworkInitializer$$ExternalSyntheticLambda0; Landroid/nfc/NfcFrameworkInitializer; Landroid/nfc/NfcManager; +Landroid/nfc/NfcOemExtension; Landroid/nfc/NfcServiceManager$ServiceRegisterer; Landroid/nfc/NfcServiceManager; +Landroid/nfc/NfcVendorNciCallbackListener; +Landroid/nfc/NfcWlcStateListener; +Landroid/nfc/Tag; +Landroid/nfc/TechListParcel; +Landroid/nfc/WlcListenerDeviceInfo; Landroid/nfc/cardemulation/AidGroup$1; Landroid/nfc/cardemulation/AidGroup; Landroid/nfc/cardemulation/ApduServiceInfo$1; Landroid/nfc/cardemulation/ApduServiceInfo; +Landroid/nfc/cardemulation/PollingFrame; Landroid/opengl/EGL14; Landroid/opengl/EGL15; Landroid/opengl/EGLConfig; @@ -28383,8 +28292,8 @@ Landroid/os/AsyncTask$InternalHandler; Landroid/os/AsyncTask$SerialExecutor$1; Landroid/os/AsyncTask$SerialExecutor; Landroid/os/AsyncTask$Status; -Landroid/os/AsyncTask$WorkerRunnable-IA; Landroid/os/AsyncTask$WorkerRunnable; +Landroid/os/AsyncTask-IA; Landroid/os/AsyncTask; Landroid/os/BadParcelableException; Landroid/os/BadTypeParcelableException; @@ -28452,8 +28361,8 @@ Landroid/os/Build; Landroid/os/Bundle$1; Landroid/os/Bundle; Landroid/os/CancellationSignal$OnCancelListener; -Landroid/os/CancellationSignal$Transport-IA; Landroid/os/CancellationSignal$Transport; +Landroid/os/CancellationSignal-IA; Landroid/os/CancellationSignal; Landroid/os/CarrierAssociatedAppEntry$1; Landroid/os/CarrierAssociatedAppEntry; @@ -28479,8 +28388,8 @@ Landroid/os/DdmSyncState; Landroid/os/DeadObjectException; Landroid/os/DeadSystemException; Landroid/os/Debug$MemoryInfo$1; -Landroid/os/Debug$MemoryInfo-IA; Landroid/os/Debug$MemoryInfo; +Landroid/os/Debug-IA; Landroid/os/Debug; Landroid/os/DeviceIdleManager; Landroid/os/DropBoxManager$Entry$1; @@ -28515,8 +28424,8 @@ Landroid/os/GraphicsEnvironment$1; Landroid/os/GraphicsEnvironment; Landroid/os/Handler$BlockingRunnable; Landroid/os/Handler$Callback; -Landroid/os/Handler$MessengerImpl-IA; Landroid/os/Handler$MessengerImpl; +Landroid/os/Handler-IA; Landroid/os/Handler; Landroid/os/HandlerExecutor; Landroid/os/HandlerThread; @@ -28534,6 +28443,7 @@ Landroid/os/IBatteryPropertiesRegistrar$Stub$Proxy; Landroid/os/IBatteryPropertiesRegistrar$Stub; Landroid/os/IBatteryPropertiesRegistrar; Landroid/os/IBinder$DeathRecipient; +Landroid/os/IBinder$FrozenStateChangeCallback; Landroid/os/IBinder; Landroid/os/IBinderCallback; Landroid/os/ICancellationSignal$Stub$Proxy; @@ -28574,7 +28484,6 @@ Landroid/os/IIncidentCompanion; Landroid/os/IIncidentManager$Stub$Proxy; Landroid/os/IIncidentManager$Stub; Landroid/os/IIncidentManager; -Landroid/os/IInstalld$Stub$Proxy; Landroid/os/IInstalld$Stub; Landroid/os/IInstalld; Landroid/os/IInterface; @@ -28664,6 +28573,7 @@ Landroid/os/IWakeLockCallback; Landroid/os/IncidentManager$IncidentReport$1; Landroid/os/IncidentManager$IncidentReport; Landroid/os/IncidentManager; +Landroid/os/IpcDataCache$1; Landroid/os/IpcDataCache$Config; Landroid/os/IpcDataCache$QueryHandler; Landroid/os/IpcDataCache$RemoteCall; @@ -28759,7 +28669,6 @@ Landroid/os/RemoteCallback$2; Landroid/os/RemoteCallback$3; Landroid/os/RemoteCallback$OnResultListener; Landroid/os/RemoteCallback; -Landroid/os/RemoteCallbackList$Callback; Landroid/os/RemoteCallbackList; Landroid/os/RemoteException; Landroid/os/ResultReceiver$1; @@ -28768,17 +28677,16 @@ Landroid/os/ResultReceiver$MyRunnable; Landroid/os/ResultReceiver; Landroid/os/SELinux; Landroid/os/SecurityStateManager; +Landroid/os/Service$1; +Landroid/os/Service; Landroid/os/ServiceManager$ServiceNotFoundException; Landroid/os/ServiceManager; Landroid/os/ServiceManagerNative; Landroid/os/ServiceManagerProxy; Landroid/os/ServiceSpecificException; Landroid/os/SharedMemory$1; -Landroid/os/SharedMemory$Closer-IA; Landroid/os/SharedMemory$Closer; -Landroid/os/SharedMemory$MemoryRegistration-IA; Landroid/os/SharedMemory$MemoryRegistration; -Landroid/os/SharedMemory$Unmapper-IA; Landroid/os/SharedMemory$Unmapper; Landroid/os/SharedMemory-IA; Landroid/os/SharedMemory; @@ -28797,7 +28705,6 @@ Landroid/os/StrictMode$1; Landroid/os/StrictMode$2; Landroid/os/StrictMode$3; Landroid/os/StrictMode$4; -Landroid/os/StrictMode$5; Landroid/os/StrictMode$6; Landroid/os/StrictMode$7; Landroid/os/StrictMode$8; @@ -28805,34 +28712,29 @@ Landroid/os/StrictMode$9; Landroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0; Landroid/os/StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1; Landroid/os/StrictMode$AndroidBlockGuardPolicy; -Landroid/os/StrictMode$AndroidCloseGuardReporter-IA; Landroid/os/StrictMode$AndroidCloseGuardReporter; Landroid/os/StrictMode$InstanceTracker; Landroid/os/StrictMode$OnThreadViolationListener; Landroid/os/StrictMode$OnVmViolationListener; Landroid/os/StrictMode$Span; Landroid/os/StrictMode$ThreadPolicy$Builder; -Landroid/os/StrictMode$ThreadPolicy-IA; Landroid/os/StrictMode$ThreadPolicy; -Landroid/os/StrictMode$ThreadSpanState-IA; Landroid/os/StrictMode$ThreadSpanState; -Landroid/os/StrictMode$UnsafeIntentStrictModeCallback-IA; Landroid/os/StrictMode$UnsafeIntentStrictModeCallback; Landroid/os/StrictMode$ViolationInfo$1; Landroid/os/StrictMode$ViolationInfo; Landroid/os/StrictMode$ViolationLogger; Landroid/os/StrictMode$VmPolicy$Builder; -Landroid/os/StrictMode$VmPolicy-IA; Landroid/os/StrictMode$VmPolicy; +Landroid/os/StrictMode-IA; Landroid/os/StrictMode; Landroid/os/SynchronousResultReceiver$Result; Landroid/os/SynchronousResultReceiver; Landroid/os/SystemClock$2; -Landroid/os/SystemClock$3; Landroid/os/SystemClock; Landroid/os/SystemConfigManager; -Landroid/os/SystemProperties$Handle-IA; Landroid/os/SystemProperties$Handle; +Landroid/os/SystemProperties-IA; Landroid/os/SystemProperties; Landroid/os/SystemService$1; Landroid/os/SystemService$State; @@ -28868,9 +28770,6 @@ Landroid/os/UpdateLock; Landroid/os/UserHandle$1; Landroid/os/UserHandle; Landroid/os/UserManager$1; -Landroid/os/UserManager$2; -Landroid/os/UserManager$3; -Landroid/os/UserManager$4; Landroid/os/UserManager$EnforcingUser$1; Landroid/os/UserManager$EnforcingUser; Landroid/os/UserManager$UserOperationException; @@ -28948,7 +28847,6 @@ Landroid/os/storage/IStorageShutdownObserver; Landroid/os/storage/OnObbStateChangeListener; Landroid/os/storage/StorageEventListener; Landroid/os/storage/StorageManager$1; -Landroid/os/storage/StorageManager$ObbActionListener-IA; Landroid/os/storage/StorageManager$ObbActionListener; Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda2; Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda3; @@ -28957,6 +28855,7 @@ Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSynthet Landroid/os/storage/StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda6; Landroid/os/storage/StorageManager$StorageEventListenerDelegate; Landroid/os/storage/StorageManager$StorageVolumeCallback; +Landroid/os/storage/StorageManager-IA; Landroid/os/storage/StorageManager; Landroid/os/storage/StorageManagerInternal; Landroid/os/storage/StorageVolume$1; @@ -28987,6 +28886,8 @@ Landroid/os/strictmode/UnsafeIntentLaunchViolation; Landroid/os/strictmode/UntaggedSocketViolation; Landroid/os/strictmode/Violation; Landroid/os/strictmode/WebViewMethodCalledOnWrongThreadViolation; +Landroid/os/vibrator/FeatureFlags; +Landroid/os/vibrator/FeatureFlagsImpl; Landroid/os/vibrator/Flags; Landroid/os/vibrator/PrebakedSegment$1; Landroid/os/vibrator/PrebakedSegment; @@ -29020,15 +28921,13 @@ Landroid/permission/PermissionControllerManager$1; Landroid/permission/PermissionControllerManager; Landroid/permission/PermissionManager$1; Landroid/permission/PermissionManager$2; +Landroid/permission/PermissionManager$OnPermissionsChangeListenerDelegate; Landroid/permission/PermissionManager$PackageNamePermissionQuery; Landroid/permission/PermissionManager$PermissionQuery; -Landroid/permission/PermissionManager$SplitPermissionInfo-IA; Landroid/permission/PermissionManager$SplitPermissionInfo; +Landroid/permission/PermissionManager-IA; Landroid/permission/PermissionManager; Landroid/permission/PermissionManagerInternal; -Landroid/permission/flags/FeatureFlags; -Landroid/permission/flags/FeatureFlagsImpl; -Landroid/permission/flags/Flags; Landroid/preference/DialogPreference; Landroid/preference/GenericInflater$Parent; Landroid/preference/GenericInflater; @@ -29257,7 +29156,6 @@ Landroid/security/KeyStore2$$ExternalSyntheticLambda4; Landroid/security/KeyStore2$$ExternalSyntheticLambda8; Landroid/security/KeyStore2$CheckedRemoteRequest; Landroid/security/KeyStore2; -Landroid/security/KeyStore; Landroid/security/KeyStoreException$PublicErrorInformation; Landroid/security/KeyStoreException; Landroid/security/KeyStoreOperation$$ExternalSyntheticLambda0; @@ -29344,12 +29242,11 @@ Landroid/security/keystore/recovery/WrappedApplicationKey$1; Landroid/security/keystore/recovery/WrappedApplicationKey$Builder; Landroid/security/keystore/recovery/WrappedApplicationKey; Landroid/security/keystore/recovery/X509CertificateParsingUtils; -Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA; Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream; -Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA; Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer; Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding; Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi$GCM; +Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi-IA; Landroid/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi; Landroid/security/keystore2/AndroidKeyStoreBCWorkaroundProvider; Landroid/security/keystore2/AndroidKeyStoreCipherSpiBase; @@ -29428,6 +29325,8 @@ Landroid/service/appprediction/IPredictionService; Landroid/service/autofill/AutofillServiceInfo; Landroid/service/autofill/Dataset$1; Landroid/service/autofill/Dataset; +Landroid/service/autofill/FeatureFlags; +Landroid/service/autofill/FeatureFlagsImpl; Landroid/service/autofill/FieldClassificationUserData; Landroid/service/autofill/FillContext$1; Landroid/service/autofill/FillContext; @@ -29562,17 +29461,16 @@ Landroid/service/media/MediaBrowserService$BrowserRoot; Landroid/service/media/MediaBrowserService$ConnectionRecord; Landroid/service/media/MediaBrowserService$Result; Landroid/service/media/MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1; -Landroid/service/media/MediaBrowserService$ServiceBinder-IA; Landroid/service/media/MediaBrowserService$ServiceBinder; Landroid/service/media/MediaBrowserService$ServiceState; +Landroid/service/media/MediaBrowserService-IA; Landroid/service/media/MediaBrowserService; Landroid/service/notification/Adjustment$1; Landroid/service/notification/Adjustment; Landroid/service/notification/Condition$1; Landroid/service/notification/Condition; -Landroid/service/notification/ConditionProviderService$H-IA; Landroid/service/notification/ConditionProviderService$H; -Landroid/service/notification/ConditionProviderService$Provider-IA; +Landroid/service/notification/ConditionProviderService-IA; Landroid/service/notification/ConditionProviderService; Landroid/service/notification/IConditionProvider$Stub; Landroid/service/notification/IConditionProvider; @@ -29589,8 +29487,8 @@ Landroid/service/notification/NotificationListenerFilter; Landroid/service/notification/NotificationListenerService$MyHandler; Landroid/service/notification/NotificationListenerService$Ranking; Landroid/service/notification/NotificationListenerService$RankingMap$1; -Landroid/service/notification/NotificationListenerService$RankingMap-IA; Landroid/service/notification/NotificationListenerService$RankingMap; +Landroid/service/notification/NotificationListenerService-IA; Landroid/service/notification/NotificationListenerService; Landroid/service/notification/NotificationRankingUpdate$1; Landroid/service/notification/NotificationRankingUpdate; @@ -29602,6 +29500,7 @@ Landroid/service/notification/SnoozeCriterion$1; Landroid/service/notification/SnoozeCriterion; Landroid/service/notification/StatusBarNotification$1; Landroid/service/notification/StatusBarNotification; +Landroid/service/notification/ZenDeviceEffects$1; Landroid/service/notification/ZenDeviceEffects; Landroid/service/notification/ZenModeConfig$1; Landroid/service/notification/ZenModeConfig$EventInfo; @@ -29719,16 +29618,13 @@ Landroid/speech/tts/TextToSpeech$$ExternalSyntheticLambda17; Landroid/speech/tts/TextToSpeech$$ExternalSyntheticLambda1; Landroid/speech/tts/TextToSpeech$Action; Landroid/speech/tts/TextToSpeech$Connection$1; -Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask-IA; Landroid/speech/tts/TextToSpeech$Connection$SetupConnectionAsyncTask; -Landroid/speech/tts/TextToSpeech$Connection-IA; Landroid/speech/tts/TextToSpeech$Connection; -Landroid/speech/tts/TextToSpeech$DirectConnection-IA; Landroid/speech/tts/TextToSpeech$DirectConnection; Landroid/speech/tts/TextToSpeech$EngineInfo; Landroid/speech/tts/TextToSpeech$OnInitListener; -Landroid/speech/tts/TextToSpeech$SystemConnection-IA; Landroid/speech/tts/TextToSpeech$SystemConnection; +Landroid/speech/tts/TextToSpeech-IA; Landroid/speech/tts/TextToSpeech; Landroid/speech/tts/TtsEngines$EngineInfoComparator; Landroid/speech/tts/TtsEngines; @@ -29742,7 +29638,6 @@ Landroid/sysprop/CryptoProperties; Landroid/sysprop/DeviceProperties; Landroid/sysprop/DisplayProperties; Landroid/sysprop/HdmiProperties; -Landroid/sysprop/InitProperties; Landroid/sysprop/InputProperties; Landroid/sysprop/MediaProperties; Landroid/sysprop/PowerProperties; @@ -29762,6 +29657,7 @@ Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda7; Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda8; Landroid/sysprop/TelephonyProperties$$ExternalSyntheticLambda9; Landroid/sysprop/TelephonyProperties; +Landroid/sysprop/ViewProperties; Landroid/sysprop/VndkProperties; Landroid/system/keystore2/Authorization$1; Landroid/system/keystore2/Authorization; @@ -29988,7 +29884,6 @@ Landroid/telephony/ICellBroadcastService; Landroid/telephony/ICellInfoCallback$Stub$Proxy; Landroid/telephony/ICellInfoCallback$Stub; Landroid/telephony/ICellInfoCallback; -Landroid/telephony/INetworkService$Stub$Proxy; Landroid/telephony/INetworkService$Stub; Landroid/telephony/INetworkService; Landroid/telephony/INetworkServiceCallback$Stub$Proxy; @@ -30002,9 +29897,9 @@ Landroid/telephony/JapanesePhoneNumberFormatter; Landroid/telephony/LinkCapacityEstimate$1; Landroid/telephony/LinkCapacityEstimate; Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery$Builder; -Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery-IA; Landroid/telephony/LocationAccessPolicy$LocationPermissionQuery; Landroid/telephony/LocationAccessPolicy$LocationPermissionResult; +Landroid/telephony/LocationAccessPolicy-IA; Landroid/telephony/LocationAccessPolicy; Landroid/telephony/LteVopsSupportInfo$1; Landroid/telephony/LteVopsSupportInfo-IA; @@ -30024,7 +29919,6 @@ Landroid/telephony/NetworkRegistrationInfo; Landroid/telephony/NetworkScan; Landroid/telephony/NetworkScanRequest$1; Landroid/telephony/NetworkScanRequest; -Landroid/telephony/NetworkService$INetworkServiceWrapper; Landroid/telephony/NetworkService$NetworkServiceHandler; Landroid/telephony/NetworkService$NetworkServiceProvider; Landroid/telephony/NetworkService; @@ -30161,6 +30055,7 @@ Landroid/telephony/TelephonyCallback$CallDisconnectCauseListener; Landroid/telephony/TelephonyCallback$CallForwardingIndicatorListener; Landroid/telephony/TelephonyCallback$CallStateListener; Landroid/telephony/TelephonyCallback$CarrierNetworkListener; +Landroid/telephony/TelephonyCallback$CarrierRoamingNtnModeListener; Landroid/telephony/TelephonyCallback$CellInfoListener; Landroid/telephony/TelephonyCallback$CellLocationListener; Landroid/telephony/TelephonyCallback$DataActivationStateListener; @@ -30461,7 +30356,6 @@ Landroid/telephony/ims/aidl/IImsConfig; Landroid/telephony/ims/aidl/IImsConfigCallback$Stub$Proxy; Landroid/telephony/ims/aidl/IImsConfigCallback$Stub; Landroid/telephony/ims/aidl/IImsConfigCallback; -Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub$Proxy; Landroid/telephony/ims/aidl/IImsMmTelFeature$Stub; Landroid/telephony/ims/aidl/IImsMmTelFeature; Landroid/telephony/ims/aidl/IImsMmTelListener$Stub$Proxy; @@ -30471,7 +30365,6 @@ Landroid/telephony/ims/aidl/IImsRcsController$Stub; Landroid/telephony/ims/aidl/IImsRcsController; Landroid/telephony/ims/aidl/IImsRcsFeature$Stub; Landroid/telephony/ims/aidl/IImsRcsFeature; -Landroid/telephony/ims/aidl/IImsRegistration$Stub$Proxy; Landroid/telephony/ims/aidl/IImsRegistration$Stub; Landroid/telephony/ims/aidl/IImsRegistration; Landroid/telephony/ims/aidl/IImsRegistrationCallback$Stub$Proxy; @@ -30565,33 +30458,23 @@ Landroid/text/Html$TagHandler; Landroid/text/Html; Landroid/text/HtmlToSpannedConverter$Alignment; Landroid/text/HtmlToSpannedConverter$Background; -Landroid/text/HtmlToSpannedConverter$Big-IA; Landroid/text/HtmlToSpannedConverter$Big; -Landroid/text/HtmlToSpannedConverter$Blockquote-IA; Landroid/text/HtmlToSpannedConverter$Blockquote; -Landroid/text/HtmlToSpannedConverter$Bold-IA; Landroid/text/HtmlToSpannedConverter$Bold; -Landroid/text/HtmlToSpannedConverter$Bullet-IA; Landroid/text/HtmlToSpannedConverter$Bullet; Landroid/text/HtmlToSpannedConverter$Font; Landroid/text/HtmlToSpannedConverter$Foreground; Landroid/text/HtmlToSpannedConverter$Heading; Landroid/text/HtmlToSpannedConverter$Href; -Landroid/text/HtmlToSpannedConverter$Italic-IA; Landroid/text/HtmlToSpannedConverter$Italic; -Landroid/text/HtmlToSpannedConverter$Monospace-IA; Landroid/text/HtmlToSpannedConverter$Monospace; Landroid/text/HtmlToSpannedConverter$Newline; -Landroid/text/HtmlToSpannedConverter$Small-IA; Landroid/text/HtmlToSpannedConverter$Small; -Landroid/text/HtmlToSpannedConverter$Strikethrough-IA; Landroid/text/HtmlToSpannedConverter$Strikethrough; -Landroid/text/HtmlToSpannedConverter$Sub-IA; Landroid/text/HtmlToSpannedConverter$Sub; -Landroid/text/HtmlToSpannedConverter$Super-IA; Landroid/text/HtmlToSpannedConverter$Super; -Landroid/text/HtmlToSpannedConverter$Underline-IA; Landroid/text/HtmlToSpannedConverter$Underline; +Landroid/text/HtmlToSpannedConverter-IA; Landroid/text/HtmlToSpannedConverter; Landroid/text/Hyphenator; Landroid/text/InputFilter$LengthFilter; @@ -30610,6 +30493,7 @@ Landroid/text/Layout$SpannedEllipsizer; Landroid/text/Layout$TabStops; Landroid/text/Layout$TextInclusionStrategy; Landroid/text/Layout; +Landroid/text/MeasuredParagraph$StyleRunCallback; Landroid/text/MeasuredParagraph; Landroid/text/NoCopySpan$Concrete; Landroid/text/NoCopySpan; @@ -30626,6 +30510,7 @@ Landroid/text/Selection$MemoryTextWatcher; Landroid/text/Selection$PositionIterator; Landroid/text/Selection$START; Landroid/text/Selection; +Landroid/text/SpanColors; Landroid/text/SpanSet; Landroid/text/SpanWatcher; Landroid/text/Spannable$Factory; @@ -30648,8 +30533,9 @@ Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicInternal; Landroid/text/TextDirectionHeuristics$TextDirectionHeuristicLocale; Landroid/text/TextDirectionHeuristics; Landroid/text/TextFlags; -Landroid/text/TextLine$DecorationInfo-IA; Landroid/text/TextLine$DecorationInfo; +Landroid/text/TextLine$LineInfo; +Landroid/text/TextLine-IA; Landroid/text/TextLine; Landroid/text/TextPaint; Landroid/text/TextShaper$GlyphsConsumer; @@ -30734,6 +30620,7 @@ Landroid/text/style/LeadingMarginSpan$Standard; Landroid/text/style/LeadingMarginSpan; Landroid/text/style/LineBackgroundSpan$Standard; Landroid/text/style/LineBackgroundSpan; +Landroid/text/style/LineBreakConfigSpan$1; Landroid/text/style/LineBreakConfigSpan; Landroid/text/style/LineHeightSpan$Standard; Landroid/text/style/LineHeightSpan$WithDensity; @@ -30787,6 +30674,9 @@ Landroid/timezone/TelephonyLookup; Landroid/timezone/TelephonyNetwork; Landroid/timezone/TelephonyNetworkFinder; Landroid/timezone/TimeZoneFinder; +Landroid/tracing/FeatureFlags; +Landroid/tracing/FeatureFlagsImpl; +Landroid/tracing/Flags; Landroid/tracing/perfetto/CreateIncrementalStateArgs; Landroid/tracing/perfetto/CreateTlsStateArgs; Landroid/tracing/perfetto/DataSource; @@ -30857,8 +30747,8 @@ Landroid/transition/TransitionValues; Landroid/transition/TransitionValuesMaps; Landroid/transition/Visibility$1; Landroid/transition/Visibility$DisappearListener; -Landroid/transition/Visibility$VisibilityInfo-IA; Landroid/transition/Visibility$VisibilityInfo; +Landroid/transition/Visibility-IA; Landroid/transition/Visibility; Landroid/transition/VisibilityPropagation; Landroid/transparency/BinaryTransparencyManager; @@ -30973,6 +30863,7 @@ Landroid/util/RecurrenceRule$RecurringIterator; Landroid/util/RecurrenceRule; Landroid/util/ReflectiveProperty; Landroid/util/RotationUtils; +Landroid/util/SequenceUtils; Landroid/util/Singleton; Landroid/util/Size; Landroid/util/SizeF$1; @@ -30986,7 +30877,6 @@ Landroid/util/SparseIntArray; Landroid/util/SparseLongArray; Landroid/util/SparseSetArray; Landroid/util/Spline$LinearSpline; -Landroid/util/Spline$MonotoneCubicSpline; Landroid/util/Spline; Landroid/util/StateSet; Landroid/util/StringBuilderPrinter; @@ -31074,9 +30964,7 @@ Landroid/view/Choreographer$1; Landroid/view/Choreographer$2; Landroid/view/Choreographer$3; Landroid/view/Choreographer$4; -Landroid/view/Choreographer$CallbackQueue-IA; Landroid/view/Choreographer$CallbackQueue; -Landroid/view/Choreographer$CallbackRecord-IA; Landroid/view/Choreographer$CallbackRecord; Landroid/view/Choreographer$FrameCallback; Landroid/view/Choreographer$FrameData; @@ -31095,21 +30983,19 @@ Landroid/view/CrossWindowBlurListeners; Landroid/view/CutoutSpecification$Parser; Landroid/view/CutoutSpecification; Landroid/view/Display$HdrCapabilities$1; -Landroid/view/Display$HdrCapabilities-IA; Landroid/view/Display$HdrCapabilities; Landroid/view/Display$HdrSdrRatioListenerWrapper; Landroid/view/Display$Mode$1; -Landroid/view/Display$Mode-IA; Landroid/view/Display$Mode; +Landroid/view/Display-IA; Landroid/view/Display; Landroid/view/DisplayAddress$Network$1; Landroid/view/DisplayAddress$Network; Landroid/view/DisplayAddress$Physical$1; -Landroid/view/DisplayAddress$Physical-IA; Landroid/view/DisplayAddress$Physical; +Landroid/view/DisplayAddress-IA; Landroid/view/DisplayAddress; Landroid/view/DisplayAdjustments; -Landroid/view/DisplayCutout$Bounds-IA; Landroid/view/DisplayCutout$Bounds; Landroid/view/DisplayCutout$CutoutPathParserInfo; Landroid/view/DisplayCutout$ParcelableWrapper$1; @@ -31154,8 +31040,8 @@ Landroid/view/HandlerActionQueue$HandlerAction; Landroid/view/HandlerActionQueue; Landroid/view/HandwritingInitiator$HandwritableViewInfo; Landroid/view/HandwritingInitiator$HandwritingAreaTracker; -Landroid/view/HandwritingInitiator$State-IA; Landroid/view/HandwritingInitiator$State; +Landroid/view/HandwritingInitiator-IA; Landroid/view/HandwritingInitiator; Landroid/view/HapticScrollFeedbackProvider; Landroid/view/HdrRenderState; @@ -31192,12 +31078,6 @@ Landroid/view/IOnKeyguardExitResult$Stub; Landroid/view/IOnKeyguardExitResult; Landroid/view/IPinnedTaskListener$Stub; Landroid/view/IPinnedTaskListener; -Landroid/view/IRecentsAnimationController$Stub$Proxy; -Landroid/view/IRecentsAnimationController$Stub; -Landroid/view/IRecentsAnimationController; -Landroid/view/IRecentsAnimationRunner$Stub$Proxy; -Landroid/view/IRecentsAnimationRunner$Stub; -Landroid/view/IRecentsAnimationRunner; Landroid/view/IRemoteAnimationFinishedCallback$Stub$Proxy; Landroid/view/IRemoteAnimationFinishedCallback$Stub; Landroid/view/IRemoteAnimationFinishedCallback; @@ -31213,6 +31093,7 @@ Landroid/view/IScrollCaptureCallbacks; Landroid/view/IScrollCaptureResponseListener$Stub$Proxy; Landroid/view/IScrollCaptureResponseListener$Stub; Landroid/view/IScrollCaptureResponseListener; +Landroid/view/ISensitiveContentProtectionManager$Stub$Proxy; Landroid/view/ISensitiveContentProtectionManager$Stub; Landroid/view/ISensitiveContentProtectionManager; Landroid/view/ISurfaceControlViewHost; @@ -31239,6 +31120,7 @@ Landroid/view/IWindowSession; Landroid/view/IWindowSessionCallback$Stub$Proxy; Landroid/view/IWindowSessionCallback$Stub; Landroid/view/IWindowSessionCallback; +Landroid/view/ImeBackAnimationController; Landroid/view/ImeFocusController$InputMethodManagerDelegate; Landroid/view/ImeFocusController; Landroid/view/ImeInsetsSourceConsumer; @@ -31247,7 +31129,6 @@ Landroid/view/InputApplicationHandle; Landroid/view/InputChannel$1; Landroid/view/InputChannel; Landroid/view/InputDevice$1; -Landroid/view/InputDevice$MotionRange-IA; Landroid/view/InputDevice$MotionRange; Landroid/view/InputDevice$ViewBehavior; Landroid/view/InputDevice-IA; @@ -31269,10 +31150,14 @@ Landroid/view/InputWindowHandle; Landroid/view/InsetsAnimationControlCallbacks; Landroid/view/InsetsAnimationControlImpl$$ExternalSyntheticLambda0; Landroid/view/InsetsAnimationControlImpl; +Landroid/view/InsetsAnimationControlRunner$SurfaceParamsApplier$$ExternalSyntheticLambda0; +Landroid/view/InsetsAnimationControlRunner$SurfaceParamsApplier; Landroid/view/InsetsAnimationControlRunner; +Landroid/view/InsetsAnimationSpec; Landroid/view/InsetsAnimationThread; Landroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda0; Landroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1; +Landroid/view/InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda2; Landroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0; Landroid/view/InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1; Landroid/view/InsetsAnimationThreadControlRunner$1; @@ -31280,7 +31165,6 @@ Landroid/view/InsetsAnimationThreadControlRunner; Landroid/view/InsetsController$$ExternalSyntheticLambda0; Landroid/view/InsetsController$$ExternalSyntheticLambda10; Landroid/view/InsetsController$$ExternalSyntheticLambda11; -Landroid/view/InsetsController$$ExternalSyntheticLambda12; Landroid/view/InsetsController$$ExternalSyntheticLambda1; Landroid/view/InsetsController$$ExternalSyntheticLambda2; Landroid/view/InsetsController$$ExternalSyntheticLambda3; @@ -31300,7 +31184,6 @@ Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSynthet Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda3; Landroid/view/InsetsController$InternalAnimationControlListener$$ExternalSyntheticLambda4; Landroid/view/InsetsController$InternalAnimationControlListener$1; -Landroid/view/InsetsController$InternalAnimationControlListener$2; Landroid/view/InsetsController$InternalAnimationControlListener; Landroid/view/InsetsController$PendingControlRequest; Landroid/view/InsetsController$RunningAnimation; @@ -31389,16 +31272,17 @@ Landroid/view/ScaleGestureDetector$1; Landroid/view/ScaleGestureDetector$OnScaleGestureListener; Landroid/view/ScaleGestureDetector$SimpleOnScaleGestureListener; Landroid/view/ScaleGestureDetector; +Landroid/view/ScrollCaptureSearchResults$$ExternalSyntheticLambda0; Landroid/view/ScrollCaptureSearchResults; Landroid/view/ScrollFeedbackProvider; Landroid/view/SearchEvent; Landroid/view/SoundEffectConstants; Landroid/view/SubMenu; Landroid/view/Surface$1; -Landroid/view/Surface$CompatibleCanvas-IA; Landroid/view/Surface$CompatibleCanvas; Landroid/view/Surface$HwuiContext; Landroid/view/Surface$OutOfResourcesException; +Landroid/view/Surface-IA; Landroid/view/Surface; Landroid/view/SurfaceControl$1; Landroid/view/SurfaceControl$Builder; @@ -31407,6 +31291,7 @@ Landroid/view/SurfaceControl$DesiredDisplayModeSpecs; Landroid/view/SurfaceControl$DisplayMode; Landroid/view/SurfaceControl$DisplayPrimaries; Landroid/view/SurfaceControl$DynamicDisplayInfo; +Landroid/view/SurfaceControl$IdleScreenRefreshRateConfig; Landroid/view/SurfaceControl$JankData; Landroid/view/SurfaceControl$OnJankDataListener; Landroid/view/SurfaceControl$OnReparentListener; @@ -31414,6 +31299,7 @@ Landroid/view/SurfaceControl$RefreshRateRange$1; Landroid/view/SurfaceControl$RefreshRateRange; Landroid/view/SurfaceControl$RefreshRateRanges; Landroid/view/SurfaceControl$StaticDisplayInfo; +Landroid/view/SurfaceControl$Transaction$$ExternalSyntheticLambda1; Landroid/view/SurfaceControl$Transaction$1; Landroid/view/SurfaceControl$Transaction$2; Landroid/view/SurfaceControl$Transaction; @@ -31424,9 +31310,7 @@ Landroid/view/SurfaceControl$TrustedPresentationThresholds; Landroid/view/SurfaceControl-IA; Landroid/view/SurfaceControl; Landroid/view/SurfaceControlHdrLayerInfoListener; -Landroid/view/SurfaceControlRegistry$DefaultReporter-IA; Landroid/view/SurfaceControlRegistry$DefaultReporter; -Landroid/view/SurfaceControlRegistry$NoOpRegistry-IA; Landroid/view/SurfaceControlRegistry$NoOpRegistry; Landroid/view/SurfaceControlRegistry$Reporter; Landroid/view/SurfaceControlRegistry-IA; @@ -31444,14 +31328,14 @@ Landroid/view/SurfaceView$$ExternalSyntheticLambda3; Landroid/view/SurfaceView$$ExternalSyntheticLambda4; Landroid/view/SurfaceView$$ExternalSyntheticLambda5; Landroid/view/SurfaceView$1; -Landroid/view/SurfaceView$2; +Landroid/view/SurfaceView$SurfaceControlViewHostParent; Landroid/view/SurfaceView$SurfaceViewPositionUpdateListener; -Landroid/view/SurfaceView$SyncBufferTransactionCallback-IA; Landroid/view/SurfaceView$SyncBufferTransactionCallback; +Landroid/view/SurfaceView-IA; Landroid/view/SurfaceView; Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams$Builder; -Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams-IA; Landroid/view/SyncRtSurfaceTransactionApplier$SurfaceParams; +Landroid/view/SyncRtSurfaceTransactionApplier-IA; Landroid/view/SyncRtSurfaceTransactionApplier; Landroid/view/TextureView$$ExternalSyntheticLambda0; Landroid/view/TextureView$$ExternalSyntheticLambda1; @@ -31460,8 +31344,8 @@ Landroid/view/TextureView; Landroid/view/ThreadedRenderer$1$$ExternalSyntheticLambda0; Landroid/view/ThreadedRenderer$1; Landroid/view/ThreadedRenderer$DrawCallbacks; -Landroid/view/ThreadedRenderer$WebViewOverlayProvider-IA; Landroid/view/ThreadedRenderer$WebViewOverlayProvider; +Landroid/view/ThreadedRenderer-IA; Landroid/view/ThreadedRenderer; Landroid/view/TouchDelegate; Landroid/view/TunnelModeEnabledListener; @@ -31504,13 +31388,10 @@ Landroid/view/View$AttachInfo$InvalidateInfo; Landroid/view/View$AttachInfo; Landroid/view/View$BaseSavedState$1; Landroid/view/View$BaseSavedState; -Landroid/view/View$CheckForLongPress-IA; Landroid/view/View$CheckForLongPress; -Landroid/view/View$CheckForTap-IA; Landroid/view/View$CheckForTap; Landroid/view/View$DeclaredOnClickListener; Landroid/view/View$DragShadowBuilder; -Landroid/view/View$ForegroundInfo-IA; Landroid/view/View$ForegroundInfo; Landroid/view/View$ListenerInfo; Landroid/view/View$MatchIdPredicate; @@ -31530,19 +31411,16 @@ Landroid/view/View$OnLongClickListener; Landroid/view/View$OnScrollChangeListener; Landroid/view/View$OnSystemUiVisibilityChangeListener; Landroid/view/View$OnTouchListener; -Landroid/view/View$PerformClick-IA; Landroid/view/View$PerformClick; Landroid/view/View$ScrollabilityCache; Landroid/view/View$SendAccessibilityEventThrottle; Landroid/view/View$SendViewScrolledAccessibilityEvent; Landroid/view/View$TintInfo; -Landroid/view/View$TooltipInfo-IA; Landroid/view/View$TooltipInfo; Landroid/view/View$TransformationInfo; -Landroid/view/View$UnsetPressedState-IA; Landroid/view/View$UnsetPressedState; -Landroid/view/View$VisibilityChangeForAutofillHandler-IA; Landroid/view/View$VisibilityChangeForAutofillHandler; +Landroid/view/View-IA; Landroid/view/View; Landroid/view/ViewAnimationHostBridge; Landroid/view/ViewAnimationUtils; @@ -31580,10 +31458,10 @@ Landroid/view/ViewParent; Landroid/view/ViewPropertyAnimator$1; Landroid/view/ViewPropertyAnimator$2; Landroid/view/ViewPropertyAnimator$3; -Landroid/view/ViewPropertyAnimator$AnimatorEventListener-IA; Landroid/view/ViewPropertyAnimator$AnimatorEventListener; Landroid/view/ViewPropertyAnimator$NameValuesHolder; Landroid/view/ViewPropertyAnimator$PropertyBundle; +Landroid/view/ViewPropertyAnimator-IA; Landroid/view/ViewPropertyAnimator; Landroid/view/ViewRootImpl$$ExternalSyntheticLambda0; Landroid/view/ViewRootImpl$$ExternalSyntheticLambda10; @@ -31604,6 +31482,8 @@ Landroid/view/ViewRootImpl$$ExternalSyntheticLambda6; Landroid/view/ViewRootImpl$$ExternalSyntheticLambda7; Landroid/view/ViewRootImpl$$ExternalSyntheticLambda8; Landroid/view/ViewRootImpl$$ExternalSyntheticLambda9; +Landroid/view/ViewRootImpl$10; +Landroid/view/ViewRootImpl$11; Landroid/view/ViewRootImpl$1; Landroid/view/ViewRootImpl$2; Landroid/view/ViewRootImpl$3; @@ -31630,7 +31510,6 @@ Landroid/view/ViewRootImpl$InputStage; Landroid/view/ViewRootImpl$InvalidateOnAnimationRunnable; Landroid/view/ViewRootImpl$NativePostImeInputStage; Landroid/view/ViewRootImpl$NativePreImeInputStage; -Landroid/view/ViewRootImpl$QueuedInputEvent-IA; Landroid/view/ViewRootImpl$QueuedInputEvent; Landroid/view/ViewRootImpl$SendWindowContentChangedAccessibilityEvent; Landroid/view/ViewRootImpl$SurfaceChangedCallback; @@ -31645,13 +31524,13 @@ Landroid/view/ViewRootImpl$SystemUiVisibilityInfo; Landroid/view/ViewRootImpl$TakenSurfaceHolder; Landroid/view/ViewRootImpl$TrackballAxis; Landroid/view/ViewRootImpl$TraversalRunnable; -Landroid/view/ViewRootImpl$UnhandledKeyManager-IA; Landroid/view/ViewRootImpl$UnhandledKeyManager; Landroid/view/ViewRootImpl$ViewPostImeInputStage; Landroid/view/ViewRootImpl$ViewPreImeInputStage; Landroid/view/ViewRootImpl$ViewRootHandler; Landroid/view/ViewRootImpl$W; Landroid/view/ViewRootImpl$WindowInputEventReceiver; +Landroid/view/ViewRootImpl-IA; Landroid/view/ViewRootImpl; Landroid/view/ViewRootInsetsControllerHost; Landroid/view/ViewRootRectTracker$ViewInfo; @@ -31716,11 +31595,13 @@ Landroid/view/WindowManagerGlobal$$ExternalSyntheticLambda0; Landroid/view/WindowManagerGlobal$1; Landroid/view/WindowManagerGlobal$2; Landroid/view/WindowManagerGlobal$TrustedPresentationListener; +Landroid/view/WindowManagerGlobal-IA; Landroid/view/WindowManagerGlobal; Landroid/view/WindowManagerImpl; Landroid/view/WindowManagerPolicyConstants$PointerEventListener; Landroid/view/WindowManagerPolicyConstants; Landroid/view/WindowMetrics; +Landroid/view/WindowRelayoutResult; Landroid/view/WindowlessWindowLayout; Landroid/view/WindowlessWindowManager; Landroid/view/accessibility/AccessibilityCache$AccessibilityNodeRefresher; @@ -31737,10 +31618,9 @@ Landroid/view/accessibility/AccessibilityManager$1; Landroid/view/accessibility/AccessibilityManager$AccessibilityPolicy; Landroid/view/accessibility/AccessibilityManager$AccessibilityServicesStateChangeListener; Landroid/view/accessibility/AccessibilityManager$AccessibilityStateChangeListener; -Landroid/view/accessibility/AccessibilityManager$HighTextContrastChangeListener; -Landroid/view/accessibility/AccessibilityManager$MyCallback-IA; Landroid/view/accessibility/AccessibilityManager$MyCallback; Landroid/view/accessibility/AccessibilityManager$TouchExplorationStateChangeListener; +Landroid/view/accessibility/AccessibilityManager-IA; Landroid/view/accessibility/AccessibilityManager; Landroid/view/accessibility/AccessibilityNodeIdManager; Landroid/view/accessibility/AccessibilityNodeInfo$1; @@ -31764,6 +31644,8 @@ Landroid/view/accessibility/CaptioningManager$CaptioningChangeListener; Landroid/view/accessibility/CaptioningManager$MyContentObserver; Landroid/view/accessibility/CaptioningManager; Landroid/view/accessibility/DirectAccessibilityConnection; +Landroid/view/accessibility/FeatureFlags; +Landroid/view/accessibility/FeatureFlagsImpl; Landroid/view/accessibility/Flags; Landroid/view/accessibility/IAccessibilityEmbeddedConnection; Landroid/view/accessibility/IAccessibilityInteractionConnection$Stub$Proxy; @@ -31792,11 +31674,12 @@ Landroid/view/animation/Animation$NoImagePreloadHolder; Landroid/view/animation/Animation; Landroid/view/animation/AnimationSet; Landroid/view/animation/AnimationUtils$1; -Landroid/view/animation/AnimationUtils$AnimationState-IA; Landroid/view/animation/AnimationUtils$AnimationState; +Landroid/view/animation/AnimationUtils-IA; Landroid/view/animation/AnimationUtils; Landroid/view/animation/AnticipateInterpolator; Landroid/view/animation/AnticipateOvershootInterpolator; +Landroid/view/animation/BackGestureInterpolator; Landroid/view/animation/BaseInterpolator; Landroid/view/animation/BounceInterpolator; Landroid/view/animation/ClipRectAnimation; @@ -31825,7 +31708,6 @@ Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda1; Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda2; Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda3; Landroid/view/autofill/AutofillManager$$ExternalSyntheticLambda4; -Landroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient-IA; Landroid/view/autofill/AutofillManager$AugmentedAutofillManagerClient; Landroid/view/autofill/AutofillManager$AutofillCallback; Landroid/view/autofill/AutofillManager$AutofillClient; @@ -31836,13 +31718,15 @@ Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticL Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16; Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda18; Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda8; -Landroid/view/autofill/AutofillManager$AutofillManagerClient-IA; +Landroid/view/autofill/AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda9; Landroid/view/autofill/AutofillManager$AutofillManagerClient; Landroid/view/autofill/AutofillManager$CompatibilityBridge; Landroid/view/autofill/AutofillManager$TrackedViews; +Landroid/view/autofill/AutofillManager-IA; Landroid/view/autofill/AutofillManager; Landroid/view/autofill/AutofillManagerInternal; Landroid/view/autofill/AutofillPopupWindow; +Landroid/view/autofill/AutofillStateFingerprint; Landroid/view/autofill/AutofillValue$1; Landroid/view/autofill/AutofillValue-IA; Landroid/view/autofill/AutofillValue; @@ -31869,9 +31753,9 @@ Landroid/view/contentcapture/ContentCaptureEvent$1; Landroid/view/contentcapture/ContentCaptureEvent; Landroid/view/contentcapture/ContentCaptureHelper; Landroid/view/contentcapture/ContentCaptureManager$ContentCaptureClient; -Landroid/view/contentcapture/ContentCaptureManager$LocalDataShareAdapterResourceManager-IA; Landroid/view/contentcapture/ContentCaptureManager$LocalDataShareAdapterResourceManager; Landroid/view/contentcapture/ContentCaptureManager$StrippedContext; +Landroid/view/contentcapture/ContentCaptureManager-IA; Landroid/view/contentcapture/ContentCaptureManager; Landroid/view/contentcapture/ContentCaptureSession; Landroid/view/contentcapture/ContentCaptureSessionId$1; @@ -31889,22 +31773,16 @@ Landroid/view/contentcapture/IContentCaptureManager$Stub; Landroid/view/contentcapture/IContentCaptureManager; Landroid/view/contentcapture/IContentCaptureOptionsCallback$Stub; Landroid/view/contentcapture/IContentCaptureOptionsCallback; -Landroid/view/contentcapture/IDataShareWriteAdapter$Stub$Proxy; Landroid/view/contentcapture/IDataShareWriteAdapter$Stub; Landroid/view/contentcapture/IDataShareWriteAdapter; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda0; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda10; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda11; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda12; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda13; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda1; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda2; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda3; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda4; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda5; Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda6; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda8; -Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda9; +Landroid/view/contentcapture/MainContentCaptureSession$$ExternalSyntheticLambda7; Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda0; Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1; Landroid/view/contentcapture/MainContentCaptureSession$SessionStateReceiver; @@ -31944,6 +31822,8 @@ Landroid/view/inputmethod/ExtractedText$1; Landroid/view/inputmethod/ExtractedText; Landroid/view/inputmethod/ExtractedTextRequest$1; Landroid/view/inputmethod/ExtractedTextRequest; +Landroid/view/inputmethod/FeatureFlags; +Landroid/view/inputmethod/FeatureFlagsImpl; Landroid/view/inputmethod/Flags; Landroid/view/inputmethod/HandwritingGesture; Landroid/view/inputmethod/IAccessibilityInputMethodSessionInvoker$$ExternalSyntheticLambda0; @@ -31958,20 +31838,17 @@ Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda6; Landroid/view/inputmethod/IInputMethodSessionInvoker$$ExternalSyntheticLambda8; Landroid/view/inputmethod/IInputMethodSessionInvoker; Landroid/view/inputmethod/ImeTracker$1$$ExternalSyntheticLambda0; -Landroid/view/inputmethod/ImeTracker$1; Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda0; Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda1; Landroid/view/inputmethod/ImeTracker$Debug$$ExternalSyntheticLambda2; Landroid/view/inputmethod/ImeTracker$Debug; -Landroid/view/inputmethod/ImeTracker$ImeJankTracker-IA; Landroid/view/inputmethod/ImeTracker$ImeJankTracker; -Landroid/view/inputmethod/ImeTracker$ImeLatencyTracker-IA; Landroid/view/inputmethod/ImeTracker$ImeLatencyTracker; Landroid/view/inputmethod/ImeTracker$InputMethodJankContext; Landroid/view/inputmethod/ImeTracker$InputMethodLatencyContext; Landroid/view/inputmethod/ImeTracker$Token$1; -Landroid/view/inputmethod/ImeTracker$Token-IA; Landroid/view/inputmethod/ImeTracker$Token; +Landroid/view/inputmethod/ImeTracker-IA; Landroid/view/inputmethod/ImeTracker; Landroid/view/inputmethod/InlineSuggestionsRequest$1; Landroid/view/inputmethod/InlineSuggestionsRequest; @@ -31997,16 +31874,15 @@ Landroid/view/inputmethod/InputMethodManager$1; Landroid/view/inputmethod/InputMethodManager$2; Landroid/view/inputmethod/InputMethodManager$6; Landroid/view/inputmethod/InputMethodManager$BindState; -Landroid/view/inputmethod/InputMethodManager$DelegateImpl-IA; Landroid/view/inputmethod/InputMethodManager$DelegateImpl; Landroid/view/inputmethod/InputMethodManager$FinishedInputEventCallback; Landroid/view/inputmethod/InputMethodManager$H$$ExternalSyntheticLambda0; Landroid/view/inputmethod/InputMethodManager$H$$ExternalSyntheticLambda1; Landroid/view/inputmethod/InputMethodManager$H; Landroid/view/inputmethod/InputMethodManager$ImeInputEventSender; -Landroid/view/inputmethod/InputMethodManager$PendingEvent-IA; Landroid/view/inputmethod/InputMethodManager$PendingEvent; Landroid/view/inputmethod/InputMethodManager$ReportInputConnectionOpenedRunner; +Landroid/view/inputmethod/InputMethodManager-IA; Landroid/view/inputmethod/InputMethodManager; Landroid/view/inputmethod/InputMethodManagerGlobal; Landroid/view/inputmethod/InputMethodSession$EventCallback; @@ -32067,7 +31943,6 @@ Landroid/view/textclassifier/ConversationAction; Landroid/view/textclassifier/ConversationActions$1; Landroid/view/textclassifier/ConversationActions$Message$1; Landroid/view/textclassifier/ConversationActions$Message$Builder; -Landroid/view/textclassifier/ConversationActions$Message-IA; Landroid/view/textclassifier/ConversationActions$Message; Landroid/view/textclassifier/ConversationActions$Request$1; Landroid/view/textclassifier/ConversationActions$Request$Builder; @@ -32085,8 +31960,8 @@ Landroid/view/textclassifier/SelectionEvent; Landroid/view/textclassifier/SelectionSessionLogger$SignatureParser; Landroid/view/textclassifier/SelectionSessionLogger; Landroid/view/textclassifier/SystemTextClassifier$BlockingCallback; -Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver-IA; Landroid/view/textclassifier/SystemTextClassifier$ResponseReceiver; +Landroid/view/textclassifier/SystemTextClassifier-IA; Landroid/view/textclassifier/SystemTextClassifier; Landroid/view/textclassifier/SystemTextClassifierMetadata$1; Landroid/view/textclassifier/SystemTextClassifierMetadata; @@ -32114,23 +31989,19 @@ Landroid/view/textclassifier/TextClassificationSessionId; Landroid/view/textclassifier/TextClassifier$1; Landroid/view/textclassifier/TextClassifier$EntityConfig$1; Landroid/view/textclassifier/TextClassifier$EntityConfig$Builder; -Landroid/view/textclassifier/TextClassifier$EntityConfig-IA; Landroid/view/textclassifier/TextClassifier$EntityConfig; Landroid/view/textclassifier/TextClassifier$Utils; +Landroid/view/textclassifier/TextClassifier-IA; Landroid/view/textclassifier/TextClassifier; Landroid/view/textclassifier/TextClassifierEvent$1; Landroid/view/textclassifier/TextClassifierEvent$Builder; Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent$1; -Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent-IA; Landroid/view/textclassifier/TextClassifierEvent$ConversationActionsEvent; Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent$1; -Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent-IA; Landroid/view/textclassifier/TextClassifierEvent$LanguageDetectionEvent; Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent$1; -Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent-IA; Landroid/view/textclassifier/TextClassifierEvent$TextLinkifyEvent; Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent$1; -Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent-IA; Landroid/view/textclassifier/TextClassifierEvent$TextSelectionEvent; Landroid/view/textclassifier/TextClassifierEvent-IA; Landroid/view/textclassifier/TextClassifierEvent; @@ -32163,7 +32034,6 @@ Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$1; Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams; Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionListenerImpl; Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams$Builder; -Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams-IA; Landroid/view/textservice/SpellCheckerSession$SpellCheckerSessionParams; Landroid/view/textservice/SpellCheckerSession; Landroid/view/textservice/SpellCheckerSubtype$1; @@ -32269,12 +32139,9 @@ Landroid/widget/AbsListView$3; Landroid/widget/AbsListView$4; Landroid/widget/AbsListView$AbsPositionScroller; Landroid/widget/AbsListView$AdapterDataSetObserver; -Landroid/widget/AbsListView$CheckForKeyLongPress-IA; Landroid/widget/AbsListView$CheckForKeyLongPress; Landroid/widget/AbsListView$CheckForLongPress; -Landroid/widget/AbsListView$CheckForTap-IA; Landroid/widget/AbsListView$CheckForTap; -Landroid/widget/AbsListView$DeviceConfigChangeListener-IA; Landroid/widget/AbsListView$DeviceConfigChangeListener; Landroid/widget/AbsListView$FlingRunnable$1; Landroid/widget/AbsListView$FlingRunnable; @@ -32284,7 +32151,6 @@ Landroid/widget/AbsListView$ListItemAccessibilityDelegate; Landroid/widget/AbsListView$MultiChoiceModeListener; Landroid/widget/AbsListView$MultiChoiceModeWrapper; Landroid/widget/AbsListView$OnScrollListener; -Landroid/widget/AbsListView$PerformClick-IA; Landroid/widget/AbsListView$PerformClick; Landroid/widget/AbsListView$PositionScroller; Landroid/widget/AbsListView$RecycleBin; @@ -32292,8 +32158,8 @@ Landroid/widget/AbsListView$RecyclerListener; Landroid/widget/AbsListView$SavedState$1; Landroid/widget/AbsListView$SavedState; Landroid/widget/AbsListView$SelectionBoundsAdjuster; -Landroid/widget/AbsListView$WindowRunnnable-IA; Landroid/widget/AbsListView$WindowRunnnable; +Landroid/widget/AbsListView-IA; Landroid/widget/AbsListView; Landroid/widget/AbsSeekBar; Landroid/widget/AbsSpinner$RecycleBin; @@ -32329,13 +32195,11 @@ Landroid/widget/AdapterView; Landroid/widget/ArrayAdapter; Landroid/widget/AutoCompleteTextView$$ExternalSyntheticLambda0; Landroid/widget/AutoCompleteTextView$$ExternalSyntheticLambda1; -Landroid/widget/AutoCompleteTextView$DropDownItemClickListener-IA; Landroid/widget/AutoCompleteTextView$DropDownItemClickListener; -Landroid/widget/AutoCompleteTextView$MyWatcher-IA; Landroid/widget/AutoCompleteTextView$MyWatcher; -Landroid/widget/AutoCompleteTextView$PassThroughClickListener-IA; Landroid/widget/AutoCompleteTextView$PassThroughClickListener; Landroid/widget/AutoCompleteTextView$Validator; +Landroid/widget/AutoCompleteTextView-IA; Landroid/widget/AutoCompleteTextView; Landroid/widget/BaseAdapter; Landroid/widget/Button; @@ -32363,21 +32227,16 @@ Landroid/widget/Editor$1; Landroid/widget/Editor$2; Landroid/widget/Editor$3; Landroid/widget/Editor$5; -Landroid/widget/Editor$AccessibilitySmartActions-IA; Landroid/widget/Editor$AccessibilitySmartActions; -Landroid/widget/Editor$Blink-IA; Landroid/widget/Editor$Blink; Landroid/widget/Editor$CorrectionHighlighter; -Landroid/widget/Editor$CursorAnchorInfoNotifier-IA; Landroid/widget/Editor$CursorAnchorInfoNotifier; Landroid/widget/Editor$CursorController; Landroid/widget/Editor$EasyEditDeleteListener; -Landroid/widget/Editor$EasyEditPopupWindow-IA; Landroid/widget/Editor$EasyEditPopupWindow; Landroid/widget/Editor$EditOperation$1; Landroid/widget/Editor$EditOperation; Landroid/widget/Editor$ErrorPopup; -Landroid/widget/Editor$HandleView-IA; Landroid/widget/Editor$HandleView; Landroid/widget/Editor$InputContentType; Landroid/widget/Editor$InputMethodState; @@ -32388,24 +32247,20 @@ Landroid/widget/Editor$InsertionPointCursorController$1; Landroid/widget/Editor$InsertionPointCursorController; Landroid/widget/Editor$MagnifierMotionAnimator; Landroid/widget/Editor$PinnedPopupWindow; -Landroid/widget/Editor$PositionListener-IA; Landroid/widget/Editor$PositionListener; -Landroid/widget/Editor$ProcessTextIntentActionsHandler-IA; Landroid/widget/Editor$ProcessTextIntentActionsHandler; Landroid/widget/Editor$SelectionHandleView; Landroid/widget/Editor$SelectionModifierCursorController; Landroid/widget/Editor$SpanController$1; Landroid/widget/Editor$SpanController$2; -Landroid/widget/Editor$SpanController-IA; Landroid/widget/Editor$SpanController; -Landroid/widget/Editor$SuggestionHelper$SuggestionSpanComparator-IA; Landroid/widget/Editor$SuggestionHelper$SuggestionSpanComparator; -Landroid/widget/Editor$SuggestionHelper-IA; Landroid/widget/Editor$SuggestionHelper; Landroid/widget/Editor$SuggestionsPopupWindow; Landroid/widget/Editor$TextRenderNode; Landroid/widget/Editor$TextViewPositionListener; Landroid/widget/Editor$UndoInputFilter; +Landroid/widget/Editor-IA; Landroid/widget/Editor; Landroid/widget/EditorTouchState; Landroid/widget/FastScroller$1; @@ -32420,8 +32275,8 @@ Landroid/widget/Filter$FilterListener; Landroid/widget/Filter$FilterResults; Landroid/widget/Filter$RequestArguments; Landroid/widget/Filter$RequestHandler; -Landroid/widget/Filter$ResultsHandler-IA; Landroid/widget/Filter$ResultsHandler; +Landroid/widget/Filter-IA; Landroid/widget/Filter; Landroid/widget/Filterable; Landroid/widget/ForwardingListener; @@ -32440,15 +32295,14 @@ Landroid/widget/GridLayout$Alignment; Landroid/widget/GridLayout$Arc; Landroid/widget/GridLayout$Assoc; Landroid/widget/GridLayout$Axis$1; -Landroid/widget/GridLayout$Axis-IA; Landroid/widget/GridLayout$Axis; Landroid/widget/GridLayout$Bounds; Landroid/widget/GridLayout$Interval; Landroid/widget/GridLayout$LayoutParams; Landroid/widget/GridLayout$MutableInt; -Landroid/widget/GridLayout$PackedMap-IA; Landroid/widget/GridLayout$PackedMap; Landroid/widget/GridLayout$Spec; +Landroid/widget/GridLayout-IA; Landroid/widget/GridLayout; Landroid/widget/HeaderViewListAdapter; Landroid/widget/HorizontalScrollView$SavedState$1; @@ -32461,22 +32315,17 @@ Landroid/widget/ImageView; Landroid/widget/LinearLayout$LayoutParams; Landroid/widget/LinearLayout; Landroid/widget/ListAdapter; -Landroid/widget/ListPopupWindow$ListSelectorHider-IA; Landroid/widget/ListPopupWindow$ListSelectorHider; -Landroid/widget/ListPopupWindow$PopupDataSetObserver-IA; Landroid/widget/ListPopupWindow$PopupDataSetObserver; -Landroid/widget/ListPopupWindow$PopupScrollListener-IA; Landroid/widget/ListPopupWindow$PopupScrollListener; -Landroid/widget/ListPopupWindow$PopupTouchInterceptor-IA; Landroid/widget/ListPopupWindow$PopupTouchInterceptor; -Landroid/widget/ListPopupWindow$ResizePopupRunnable-IA; Landroid/widget/ListPopupWindow$ResizePopupRunnable; +Landroid/widget/ListPopupWindow-IA; Landroid/widget/ListPopupWindow; -Landroid/widget/ListView$ArrowScrollFocusResult-IA; Landroid/widget/ListView$ArrowScrollFocusResult; Landroid/widget/ListView$FixedViewInfo; -Landroid/widget/ListView$FocusSelector-IA; Landroid/widget/ListView$FocusSelector; +Landroid/widget/ListView-IA; Landroid/widget/ListView; Landroid/widget/Magnifier$Builder; Landroid/widget/Magnifier$InternalPopupWindow; @@ -32508,14 +32357,12 @@ Landroid/widget/PopupWindow$PopupDecorView; Landroid/widget/PopupWindow; Landroid/widget/ProgressBar$1; Landroid/widget/ProgressBar$2; -Landroid/widget/ProgressBar$ProgressTintInfo-IA; Landroid/widget/ProgressBar$ProgressTintInfo; Landroid/widget/ProgressBar$RefreshData; -Landroid/widget/ProgressBar$RefreshProgressRunnable-IA; Landroid/widget/ProgressBar$RefreshProgressRunnable; Landroid/widget/ProgressBar$SavedState$1; -Landroid/widget/ProgressBar$SavedState-IA; Landroid/widget/ProgressBar$SavedState; +Landroid/widget/ProgressBar-IA; Landroid/widget/ProgressBar; Landroid/widget/QuickContactBadge; Landroid/widget/RadioButton; @@ -32523,17 +32370,18 @@ Landroid/widget/RadioGroup$OnCheckedChangeListener; Landroid/widget/RadioGroup; Landroid/widget/RatingBar; Landroid/widget/RelativeLayout$DependencyGraph$Node; -Landroid/widget/RelativeLayout$DependencyGraph-IA; Landroid/widget/RelativeLayout$DependencyGraph; Landroid/widget/RelativeLayout$LayoutParams; Landroid/widget/RelativeLayout$TopToBottomLeftToRightComparator; +Landroid/widget/RelativeLayout-IA; Landroid/widget/RelativeLayout; Landroid/widget/RemoteViews$$ExternalSyntheticLambda0; Landroid/widget/RemoteViews$$ExternalSyntheticLambda1; Landroid/widget/RemoteViews$$ExternalSyntheticLambda2; +Landroid/widget/RemoteViews$$ExternalSyntheticLambda4; +Landroid/widget/RemoteViews$$ExternalSyntheticLambda5; Landroid/widget/RemoteViews$1; Landroid/widget/RemoteViews$2; -Landroid/widget/RemoteViews$Action-IA; Landroid/widget/RemoteViews$Action; Landroid/widget/RemoteViews$ActionException; Landroid/widget/RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0; @@ -32544,6 +32392,7 @@ Landroid/widget/RemoteViews$BaseReflectionAction; Landroid/widget/RemoteViews$BitmapCache; Landroid/widget/RemoteViews$BitmapReflectionAction; Landroid/widget/RemoteViews$ComplexUnitDimensionReflectionAction; +Landroid/widget/RemoteViews$DrawInstructions; Landroid/widget/RemoteViews$HierarchyRootData; Landroid/widget/RemoteViews$InteractionHandler; Landroid/widget/RemoteViews$LayoutParamAction; @@ -32551,6 +32400,7 @@ Landroid/widget/RemoteViews$MethodArgs; Landroid/widget/RemoteViews$MethodKey; Landroid/widget/RemoteViews$NightModeReflectionAction; Landroid/widget/RemoteViews$OnViewAppliedListener; +Landroid/widget/RemoteViews$PendingResources; Landroid/widget/RemoteViews$ReflectionAction; Landroid/widget/RemoteViews$RemoteCollectionCache; Landroid/widget/RemoteViews$RemoteCollectionItems$1; @@ -32586,6 +32436,7 @@ Landroid/widget/RemoteViews$ViewGroupActionRemove$1; Landroid/widget/RemoteViews$ViewGroupActionRemove; Landroid/widget/RemoteViews$ViewPaddingAction; Landroid/widget/RemoteViews$ViewTree; +Landroid/widget/RemoteViews-IA; Landroid/widget/RemoteViews; Landroid/widget/RemoteViewsAdapter$AsyncRemoteAdapterAction; Landroid/widget/RemoteViewsAdapter$RemoteAdapterConnectionCallback; @@ -32609,10 +32460,10 @@ Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda2; Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda3; Landroid/widget/SelectionActionModeHelper$$ExternalSyntheticLambda8; Landroid/widget/SelectionActionModeHelper$SelectionMetricsLogger; -Landroid/widget/SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable-IA; Landroid/widget/SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable; Landroid/widget/SelectionActionModeHelper$SelectionTracker; Landroid/widget/SelectionActionModeHelper$TextClassificationHelper; +Landroid/widget/SelectionActionModeHelper-IA; Landroid/widget/SelectionActionModeHelper; Landroid/widget/SmartSelectSprite$$ExternalSyntheticLambda0; Landroid/widget/SmartSelectSprite$$ExternalSyntheticLambda1; @@ -32623,11 +32474,10 @@ Landroid/widget/Space; Landroid/widget/SpellChecker$1; Landroid/widget/SpellChecker$RemoveReason; Landroid/widget/SpellChecker$SentenceIteratorWrapper; -Landroid/widget/SpellChecker$SpellParser-IA; Landroid/widget/SpellChecker$SpellParser; +Landroid/widget/SpellChecker-IA; Landroid/widget/SpellChecker; Landroid/widget/Spinner$1; -Landroid/widget/Spinner$DialogPopup-IA; Landroid/widget/Spinner$DialogPopup; Landroid/widget/Spinner$DropDownAdapter; Landroid/widget/Spinner$DropdownPopup$1; @@ -32635,6 +32485,7 @@ Landroid/widget/Spinner$DropdownPopup; Landroid/widget/Spinner$SavedState$1; Landroid/widget/Spinner$SavedState; Landroid/widget/Spinner$SpinnerPopup; +Landroid/widget/Spinner-IA; Landroid/widget/Spinner; Landroid/widget/SpinnerAdapter; Landroid/widget/Switch$1; @@ -32659,7 +32510,6 @@ Landroid/widget/TextView$2; Landroid/widget/TextView$3; Landroid/widget/TextView$4; Landroid/widget/TextView$BufferType; -Landroid/widget/TextView$ChangeWatcher-IA; Landroid/widget/TextView$ChangeWatcher; Landroid/widget/TextView$CharWrapper; Landroid/widget/TextView$Drawables; @@ -32669,23 +32519,22 @@ Landroid/widget/TextView$Marquee$3; Landroid/widget/TextView$Marquee; Landroid/widget/TextView$OnEditorActionListener; Landroid/widget/TextView$SavedState$1; -Landroid/widget/TextView$SavedState-IA; Landroid/widget/TextView$SavedState; -Landroid/widget/TextView$TextAppearanceAttributes-IA; Landroid/widget/TextView$TextAppearanceAttributes; +Landroid/widget/TextView-IA; Landroid/widget/TextView; -Landroid/widget/TextViewOnReceiveContentListener$InputConnectionInfo-IA; Landroid/widget/TextViewOnReceiveContentListener$InputConnectionInfo; +Landroid/widget/TextViewOnReceiveContentListener-IA; Landroid/widget/TextViewOnReceiveContentListener; Landroid/widget/TextViewTranslationCallback; Landroid/widget/ThemedSpinnerAdapter; Landroid/widget/Toast$Callback; Landroid/widget/Toast$CallbackBinder$$ExternalSyntheticLambda0; Landroid/widget/Toast$CallbackBinder$$ExternalSyntheticLambda1; -Landroid/widget/Toast$CallbackBinder-IA; Landroid/widget/Toast$CallbackBinder; Landroid/widget/Toast$TN$1; Landroid/widget/Toast$TN; +Landroid/widget/Toast-IA; Landroid/widget/Toast; Landroid/widget/ToastPresenter; Landroid/widget/ToggleButton; @@ -32702,10 +32551,14 @@ Landroid/widget/ViewFlipper$1; Landroid/widget/ViewFlipper; Landroid/widget/ViewSwitcher; Landroid/widget/WrapperListAdapter; +Landroid/widget/flags/FeatureFlags; +Landroid/widget/flags/FeatureFlagsImpl; +Landroid/widget/flags/Flags; Landroid/widget/inline/InlinePresentationSpec$1; Landroid/widget/inline/InlinePresentationSpec$BaseBuilder; Landroid/widget/inline/InlinePresentationSpec$Builder; Landroid/widget/inline/InlinePresentationSpec; +Landroid/window/ActivityWindowInfo$1; Landroid/window/ActivityWindowInfo; Landroid/window/BackAnimationAdapter$1; Landroid/window/BackAnimationAdapter; @@ -32714,9 +32567,12 @@ Landroid/window/BackMotionEvent$1; Landroid/window/BackMotionEvent; Landroid/window/BackNavigationInfo$1; Landroid/window/BackNavigationInfo; +Landroid/window/BackProgressAnimator$$ExternalSyntheticLambda0; +Landroid/window/BackProgressAnimator$$ExternalSyntheticLambda1; Landroid/window/BackProgressAnimator$1; Landroid/window/BackProgressAnimator$ProgressCallback; Landroid/window/BackProgressAnimator; +Landroid/window/BackTouchTracker; Landroid/window/ClientWindowFrames$1; Landroid/window/ClientWindowFrames-IA; Landroid/window/ClientWindowFrames; @@ -32750,7 +32606,6 @@ Landroid/window/ITaskFragmentOrganizer$Stub; Landroid/window/ITaskFragmentOrganizer; Landroid/window/ITaskFragmentOrganizerController$Stub; Landroid/window/ITaskFragmentOrganizerController; -Landroid/window/ITaskOrganizer$Stub$Proxy; Landroid/window/ITaskOrganizer$Stub; Landroid/window/ITaskOrganizer; Landroid/window/ITaskOrganizerController$Stub$Proxy; @@ -32771,11 +32626,13 @@ Landroid/window/IWindowContainerTransactionCallback; Landroid/window/IWindowOrganizerController$Stub$Proxy; Landroid/window/IWindowOrganizerController$Stub; Landroid/window/IWindowOrganizerController; -Landroid/window/ImeOnBackInvokedDispatcher$$ExternalSyntheticLambda0; Landroid/window/ImeOnBackInvokedDispatcher$1; Landroid/window/ImeOnBackInvokedDispatcher$2; +Landroid/window/ImeOnBackInvokedDispatcher$DefaultImeOnBackAnimationCallback; Landroid/window/ImeOnBackInvokedDispatcher$ImeOnBackInvokedCallback; Landroid/window/ImeOnBackInvokedDispatcher; +Landroid/window/InputTransferToken$1; +Landroid/window/InputTransferToken; Landroid/window/OnBackAnimationCallback; Landroid/window/OnBackInvokedCallback; Landroid/window/OnBackInvokedCallbackInfo$1; @@ -32799,6 +32656,7 @@ Landroid/window/SizeConfigurationBuckets$1; Landroid/window/SizeConfigurationBuckets; Landroid/window/SplashScreen$SplashScreenManagerGlobal$1; Landroid/window/SplashScreen$SplashScreenManagerGlobal; +Landroid/window/SplashScreen; Landroid/window/SplashScreenView$SplashScreenViewParcelable$1; Landroid/window/SplashScreenView$SplashScreenViewParcelable; Landroid/window/SplashScreenView; @@ -32811,11 +32669,12 @@ Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda3; Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda4; Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda5; Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda6; +Landroid/window/SurfaceSyncGroup$$ExternalSyntheticLambda7; Landroid/window/SurfaceSyncGroup$1; Landroid/window/SurfaceSyncGroup$2; -Landroid/window/SurfaceSyncGroup$ISurfaceSyncGroupImpl-IA; Landroid/window/SurfaceSyncGroup$ISurfaceSyncGroupImpl; Landroid/window/SurfaceSyncGroup$SurfaceViewFrameCallback; +Landroid/window/SurfaceSyncGroup-IA; Landroid/window/SurfaceSyncGroup; Landroid/window/TaskAppearedInfo$1; Landroid/window/TaskAppearedInfo; @@ -32826,6 +32685,7 @@ Landroid/window/TaskFragmentOrganizer$1; Landroid/window/TaskFragmentOrganizer; Landroid/window/TaskFragmentOrganizerToken$1; Landroid/window/TaskFragmentOrganizerToken; +Landroid/window/TaskFragmentTransaction$1; Landroid/window/TaskFragmentTransaction; Landroid/window/TaskOrganizer$1; Landroid/window/TaskOrganizer; @@ -32854,6 +32714,8 @@ Landroid/window/WindowInfosListener; Landroid/window/WindowMetricsController$$ExternalSyntheticLambda0; Landroid/window/WindowMetricsController; Landroid/window/WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda0; +Landroid/window/WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda1; +Landroid/window/WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda2; Landroid/window/WindowOnBackInvokedDispatcher$Checker; Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0; Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda1; @@ -32861,7 +32723,6 @@ Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$Exte Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3; Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4; Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5; -Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef; Landroid/window/WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper; Landroid/window/WindowOnBackInvokedDispatcher; Landroid/window/WindowOrganizer$1; @@ -32945,7 +32806,15 @@ Lcom/android/framework/protobuf/nano/InternalNano; Lcom/android/framework/protobuf/nano/InvalidProtocolBufferNanoException; Lcom/android/framework/protobuf/nano/MessageNano; Lcom/android/framework/protobuf/nano/WireFormatNano; +Lcom/android/graphics/flags/FeatureFlags; +Lcom/android/graphics/flags/FeatureFlagsImpl; +Lcom/android/graphics/flags/Flags; +Lcom/android/graphics/hwui/flags/FeatureFlags; +Lcom/android/graphics/hwui/flags/FeatureFlagsImpl; Lcom/android/graphics/hwui/flags/Flags; +Lcom/android/graphics/surfaceflinger/flags/FeatureFlags; +Lcom/android/graphics/surfaceflinger/flags/FeatureFlagsImpl; +Lcom/android/graphics/surfaceflinger/flags/Flags; Lcom/android/i18n/phonenumbers/AlternateFormatsCountryCodeSet; Lcom/android/i18n/phonenumbers/AsYouTypeFormatter; Lcom/android/i18n/phonenumbers/CountryCodeToRegionCodeMap; @@ -33064,6 +32933,7 @@ Lcom/android/i18n/timezone/internal/Memory; Lcom/android/i18n/timezone/internal/MemoryMappedFile; Lcom/android/i18n/timezone/internal/NioBufferIterator; Lcom/android/i18n/util/Log; +Lcom/android/icu/charset/CharsetDecoderICU; Lcom/android/icu/charset/CharsetEncoderICU; Lcom/android/icu/charset/CharsetFactory; Lcom/android/icu/charset/NativeConverter; @@ -33080,6 +32950,7 @@ Lcom/android/icu/util/ExtendedCalendar; Lcom/android/icu/util/ExtendedTimeZone; Lcom/android/icu/util/Icu4cMetadata; Lcom/android/icu/util/LocaleNative; +Lcom/android/icu/util/UResourceBundleNative; Lcom/android/icu/util/regex/MatcherNative; Lcom/android/icu/util/regex/PatternNative; Lcom/android/ims/FeatureConnection$$ExternalSyntheticLambda0; @@ -33153,7 +33024,6 @@ Lcom/android/ims/ImsMultiEndpoint$ImsExternalCallStateListenerProxy; Lcom/android/ims/ImsMultiEndpoint; Lcom/android/ims/ImsServiceClass; Lcom/android/ims/ImsUt$IImsUtListenerProxy; -Lcom/android/ims/ImsUt; Lcom/android/ims/ImsUtInterface; Lcom/android/ims/MmTelFeatureConnection$BinderAccessState; Lcom/android/ims/MmTelFeatureConnection$CapabilityCallbackManager; @@ -33467,6 +33337,8 @@ Lcom/android/ims/rcs/uce/util/FeatureTags$$ExternalSyntheticLambda0; Lcom/android/ims/rcs/uce/util/FeatureTags; Lcom/android/ims/rcs/uce/util/NetworkSipCode; Lcom/android/ims/rcs/uce/util/UceUtils; +Lcom/android/input/flags/FeatureFlags; +Lcom/android/input/flags/FeatureFlagsImpl; Lcom/android/input/flags/Flags; Lcom/android/internal/R$attr; Lcom/android/internal/R$dimen; @@ -33494,7 +33366,6 @@ Lcom/android/internal/app/IAppOpsActiveCallback$Stub; Lcom/android/internal/app/IAppOpsActiveCallback; Lcom/android/internal/app/IAppOpsAsyncNotedCallback$Stub; Lcom/android/internal/app/IAppOpsAsyncNotedCallback; -Lcom/android/internal/app/IAppOpsCallback$Stub$Proxy; Lcom/android/internal/app/IAppOpsCallback$Stub; Lcom/android/internal/app/IAppOpsCallback; Lcom/android/internal/app/IAppOpsNotedCallback$Stub; @@ -33589,6 +33460,7 @@ Lcom/android/internal/colorextraction/types/Tonal$ConfigParser; Lcom/android/internal/colorextraction/types/Tonal$TonalPalette; Lcom/android/internal/colorextraction/types/Tonal; Lcom/android/internal/compat/AndroidBuildClassifier; +Lcom/android/internal/compat/ChangeReporter$$ExternalSyntheticLambda0; Lcom/android/internal/compat/ChangeReporter$ChangeReport; Lcom/android/internal/compat/ChangeReporter; Lcom/android/internal/compat/CompatibilityChangeConfig$1; @@ -33602,6 +33474,9 @@ Lcom/android/internal/compat/IPlatformCompat$Stub; Lcom/android/internal/compat/IPlatformCompat; Lcom/android/internal/compat/IPlatformCompatNative$Stub; Lcom/android/internal/compat/IPlatformCompatNative; +Lcom/android/internal/compat/flags/FeatureFlags; +Lcom/android/internal/compat/flags/FeatureFlagsImpl; +Lcom/android/internal/compat/flags/Flags; Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper$$ExternalSyntheticLambda0; Lcom/android/internal/config/appcloning/AppCloningDeviceConfigHelper; Lcom/android/internal/config/sysui/SystemUiSystemPropertiesFlags$DebugResolver; @@ -33650,6 +33525,8 @@ Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$7; Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$8; Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$9; Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$MassState; +Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$OnAnimationEndListener; +Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$OnAnimationUpdateListener; Lcom/android/internal/dynamicanimation/animation/DynamicAnimation$ViewProperty; Lcom/android/internal/dynamicanimation/animation/DynamicAnimation; Lcom/android/internal/dynamicanimation/animation/Force; @@ -33669,7 +33546,29 @@ Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable$Aggregator; Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable$BlurRegion; Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable-IA; Lcom/android/internal/graphics/drawable/BackgroundBlurDrawable; +Lcom/android/internal/hidden_from_bootclasspath/android/app/appfunctions/flags/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/app/appfunctions/flags/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/android/app/appfunctions/flags/Flags; +Lcom/android/internal/hidden_from_bootclasspath/android/app/job/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/app/job/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/android/app/job/Flags; +Lcom/android/internal/hidden_from_bootclasspath/android/content/pm/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/content/pm/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/android/content/pm/Flags; +Lcom/android/internal/hidden_from_bootclasspath/android/os/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/os/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/android/os/Flags; +Lcom/android/internal/hidden_from_bootclasspath/android/permission/flags/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/permission/flags/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/android/permission/flags/Flags; +Lcom/android/internal/hidden_from_bootclasspath/android/service/notification/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/android/service/notification/FeatureFlagsImpl; Lcom/android/internal/hidden_from_bootclasspath/android/service/notification/Flags; +Lcom/android/internal/hidden_from_bootclasspath/com/android/libcore/Flags; +Lcom/android/internal/hidden_from_bootclasspath/com/android/server/power/optimization/Flags; +Lcom/android/internal/hidden_from_bootclasspath/com/android/window/flags/FeatureFlags; +Lcom/android/internal/hidden_from_bootclasspath/com/android/window/flags/FeatureFlagsImpl; +Lcom/android/internal/hidden_from_bootclasspath/com/android/window/flags/Flags; Lcom/android/internal/infra/AbstractMultiplePendingRequestsRemoteService; Lcom/android/internal/infra/AbstractRemoteService$AsyncRequest; Lcom/android/internal/infra/AbstractRemoteService$BasePendingRequest; @@ -33722,6 +33621,7 @@ Lcom/android/internal/inputmethod/IRemoteInputConnection$Stub; Lcom/android/internal/inputmethod/IRemoteInputConnection; Lcom/android/internal/inputmethod/ImeTracing; Lcom/android/internal/inputmethod/ImeTracingClientImpl; +Lcom/android/internal/inputmethod/ImeTracingPerfettoImpl; Lcom/android/internal/inputmethod/ImeTracingServerImpl; Lcom/android/internal/inputmethod/InputBindResult$1; Lcom/android/internal/inputmethod/InputBindResult-IA; @@ -33763,8 +33663,8 @@ Lcom/android/internal/jank/InteractionJankMonitor$Configuration; Lcom/android/internal/jank/InteractionJankMonitor$InstanceHolder; Lcom/android/internal/jank/InteractionJankMonitor$RunningTracker; Lcom/android/internal/jank/InteractionJankMonitor$TimeFunction; -Lcom/android/internal/jank/InteractionJankMonitor$TrackerResult-IA; Lcom/android/internal/jank/InteractionJankMonitor$TrackerResult; +Lcom/android/internal/jank/InteractionJankMonitor-IA; Lcom/android/internal/jank/InteractionJankMonitor; Lcom/android/internal/listeners/ListenerExecutor$$ExternalSyntheticLambda0; Lcom/android/internal/listeners/ListenerExecutor$FailureCallback; @@ -33829,11 +33729,10 @@ Lcom/android/internal/os/BinderCallsStats$OverflowBinder; Lcom/android/internal/os/BinderCallsStats$SettingsObserver; Lcom/android/internal/os/BinderCallsStats$UidEntry; Lcom/android/internal/os/BinderCallsStats; -Lcom/android/internal/os/BinderDeathDispatcher$RecipientsInfo-IA; Lcom/android/internal/os/BinderDeathDispatcher$RecipientsInfo; +Lcom/android/internal/os/BinderDeathDispatcher-IA; Lcom/android/internal/os/BinderDeathDispatcher; -Lcom/android/internal/os/BinderInternal$BinderProxyLimitListener; -Lcom/android/internal/os/BinderInternal$BinderProxyLimitListenerDelegate; +Lcom/android/internal/os/BinderInternal$BinderProxyCountEventListenerDelegate; Lcom/android/internal/os/BinderInternal$CallSession; Lcom/android/internal/os/BinderInternal$CallStatsObserver; Lcom/android/internal/os/BinderInternal$GcWatcher; @@ -33852,6 +33751,11 @@ Lcom/android/internal/os/CachedDeviceState$TimeInStateStopwatch; Lcom/android/internal/os/CachedDeviceState; Lcom/android/internal/os/ClassLoaderFactory; Lcom/android/internal/os/Clock; +Lcom/android/internal/os/DebugStore$DebugStoreNative; +Lcom/android/internal/os/DebugStore; +Lcom/android/internal/os/FeatureFlags; +Lcom/android/internal/os/FeatureFlagsImpl; +Lcom/android/internal/os/Flags; Lcom/android/internal/os/FuseAppLoop$1; Lcom/android/internal/os/FuseAppLoop; Lcom/android/internal/os/FuseUnavailableMountException; @@ -33908,10 +33812,10 @@ Lcom/android/internal/os/LongArrayMultiStateCounter$LongArrayContainer; Lcom/android/internal/os/LongArrayMultiStateCounter; Lcom/android/internal/os/LongMultiStateCounter$1; Lcom/android/internal/os/LongMultiStateCounter; -Lcom/android/internal/os/LooperStats$DispatchSession-IA; Lcom/android/internal/os/LooperStats$DispatchSession; Lcom/android/internal/os/LooperStats$Entry; Lcom/android/internal/os/LooperStats$ExportedEntry; +Lcom/android/internal/os/LooperStats-IA; Lcom/android/internal/os/LooperStats; Lcom/android/internal/os/PowerProfile$CpuClusterKey; Lcom/android/internal/os/PowerProfile; @@ -33932,9 +33836,9 @@ Lcom/android/internal/os/RuntimeInit$$ExternalSyntheticLambda1; Lcom/android/internal/os/RuntimeInit$ApplicationWtfHandler; Lcom/android/internal/os/RuntimeInit$Arguments; Lcom/android/internal/os/RuntimeInit$KillApplicationHandler; -Lcom/android/internal/os/RuntimeInit$LoggingHandler-IA; Lcom/android/internal/os/RuntimeInit$LoggingHandler; Lcom/android/internal/os/RuntimeInit$MethodAndArgsCaller; +Lcom/android/internal/os/RuntimeInit-IA; Lcom/android/internal/os/RuntimeInit; Lcom/android/internal/os/SafeZipPathValidatorCallback; Lcom/android/internal/os/SomeArgs; @@ -33958,10 +33862,11 @@ Lcom/android/internal/os/ZygoteServer; Lcom/android/internal/os/logging/MetricsLoggerWrapper; Lcom/android/internal/pm/parsing/PackageParser2$Callback; Lcom/android/internal/pm/parsing/PackageParserException; +Lcom/android/internal/pm/pkg/component/flags/FeatureFlags; +Lcom/android/internal/pm/pkg/component/flags/FeatureFlagsImpl; Lcom/android/internal/pm/pkg/component/flags/Flags; Lcom/android/internal/pm/pkg/parsing/ParsingPackageUtils$Callback; Lcom/android/internal/policy/AttributeCache; -Lcom/android/internal/policy/BackdropFrameRenderer; Lcom/android/internal/policy/DecorContext; Lcom/android/internal/policy/DecorView$$ExternalSyntheticLambda0; Lcom/android/internal/policy/DecorView$$ExternalSyntheticLambda1; @@ -34006,12 +33911,12 @@ Lcom/android/internal/policy/PhoneWindow$$ExternalSyntheticLambda1; Lcom/android/internal/policy/PhoneWindow$1; Lcom/android/internal/policy/PhoneWindow$ActionMenuPresenterCallback; Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState$1; -Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState-IA; Lcom/android/internal/policy/PhoneWindow$PanelFeatureState$SavedState; Lcom/android/internal/policy/PhoneWindow$PanelFeatureState; Lcom/android/internal/policy/PhoneWindow$PhoneWindowMenuCallback; Lcom/android/internal/policy/PhoneWindow$RotationWatcher$1; Lcom/android/internal/policy/PhoneWindow$RotationWatcher; +Lcom/android/internal/policy/PhoneWindow-IA; Lcom/android/internal/policy/PhoneWindow; Lcom/android/internal/policy/ScreenDecorationsUtils; Lcom/android/internal/policy/SystemBarUtils; @@ -34026,9 +33931,10 @@ Lcom/android/internal/protolog/ProtoLogViewerConfigReader; Lcom/android/internal/protolog/common/BitmaskConversionException; Lcom/android/internal/protolog/common/IProtoLogGroup; Lcom/android/internal/protolog/common/LogDataType; +Lcom/android/internal/ravenwood/RavenwoodEnvironment$Workaround; +Lcom/android/internal/ravenwood/RavenwoodEnvironment; Lcom/android/internal/security/VerityUtils; Lcom/android/internal/statusbar/IAddTileResultCallback; -Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy; Lcom/android/internal/statusbar/IStatusBar$Stub; Lcom/android/internal/statusbar/IStatusBar; Lcom/android/internal/statusbar/IStatusBarService$Stub$Proxy; @@ -34111,6 +34017,8 @@ Lcom/android/internal/telephony/CarrierAppUtils; Lcom/android/internal/telephony/CarrierInfoManager; Lcom/android/internal/telephony/CarrierKeyDownloadManager$1; Lcom/android/internal/telephony/CarrierKeyDownloadManager$2; +Lcom/android/internal/telephony/CarrierKeyDownloadManager$3; +Lcom/android/internal/telephony/CarrierKeyDownloadManager$DefaultNetworkCallback; Lcom/android/internal/telephony/CarrierKeyDownloadManager; Lcom/android/internal/telephony/CarrierPrivilegesTracker$1; Lcom/android/internal/telephony/CarrierPrivilegesTracker; @@ -34440,7 +34348,6 @@ Lcom/android/internal/telephony/RIL; Lcom/android/internal/telephony/RILConstants$$ExternalSyntheticLambda0; Lcom/android/internal/telephony/RILConstants$$ExternalSyntheticLambda1; Lcom/android/internal/telephony/RILConstants; -Lcom/android/internal/telephony/RILRequest$$ExternalSyntheticLambda0; Lcom/android/internal/telephony/RILRequest; Lcom/android/internal/telephony/RadioBugDetector; Lcom/android/internal/telephony/RadioCapability; @@ -35060,6 +34967,7 @@ Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLa Lcom/android/internal/telephony/metrics/PersistAtomsStorage$$ExternalSyntheticLambda7; Lcom/android/internal/telephony/metrics/PersistAtomsStorage$1; Lcom/android/internal/telephony/metrics/PersistAtomsStorage; +Lcom/android/internal/telephony/metrics/SatelliteStats$CarrierRoamingSatelliteControllerStatsParams; Lcom/android/internal/telephony/metrics/ServiceStateStats$$ExternalSyntheticLambda0; Lcom/android/internal/telephony/metrics/ServiceStateStats$TimestampedServiceState; Lcom/android/internal/telephony/metrics/ServiceStateStats; @@ -35089,9 +34997,12 @@ Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierAttribute; Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierId; Lcom/android/internal/telephony/nano/CarrierIdProto$CarrierList; Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierIdMismatch; +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierRoamingSatelliteControllerStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$CarrierRoamingSatelliteSession; Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularDataServiceSwitch; Lcom/android/internal/telephony/nano/PersistAtomsProto$CellularServiceState; Lcom/android/internal/telephony/nano/PersistAtomsProto$DataCallSession; +Lcom/android/internal/telephony/nano/PersistAtomsProto$DataNetworkValidation; Lcom/android/internal/telephony/nano/PersistAtomsProto$EmergencyNumbersInfo; Lcom/android/internal/telephony/nano/PersistAtomsProto$GbaEvent; Lcom/android/internal/telephony/nano/PersistAtomsProto$ImsDedicatedBearerEvent; @@ -35109,7 +35020,10 @@ Lcom/android/internal/telephony/nano/PersistAtomsProto$PersistAtoms; Lcom/android/internal/telephony/nano/PersistAtomsProto$PresenceNotifyEvent; Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsAcsProvisioningStats; Lcom/android/internal/telephony/nano/PersistAtomsProto$RcsClientProvisioningStats; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteAccessController; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteConfigUpdater; Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteController; +Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteEntitlement; Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteIncomingDatagram; Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteOutgoingDatagram; Lcom/android/internal/telephony/nano/PersistAtomsProto$SatelliteProvision; @@ -35533,8 +35447,8 @@ Lcom/android/internal/util/DumpUtils; Lcom/android/internal/util/EmergencyAffordanceManager; Lcom/android/internal/util/ExponentiallyBucketedHistogram; Lcom/android/internal/util/FastMath; -Lcom/android/internal/util/FastPrintWriter$DummyWriter-IA; Lcom/android/internal/util/FastPrintWriter$DummyWriter; +Lcom/android/internal/util/FastPrintWriter-IA; Lcom/android/internal/util/FastPrintWriter; Lcom/android/internal/util/FastXmlSerializer; Lcom/android/internal/util/FileRotator$FileInfo; @@ -35564,11 +35478,11 @@ Lcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda1; Lcom/android/internal/util/LatencyTracker$$ExternalSyntheticLambda2; Lcom/android/internal/util/LatencyTracker$Action; Lcom/android/internal/util/LatencyTracker$ActionProperties; -Lcom/android/internal/util/LatencyTracker$FrameworkStatsLogEvent-IA; Lcom/android/internal/util/LatencyTracker$FrameworkStatsLogEvent; Lcom/android/internal/util/LatencyTracker$SLatencyTrackerHolder; Lcom/android/internal/util/LatencyTracker$Session$$ExternalSyntheticLambda0; Lcom/android/internal/util/LatencyTracker$Session; +Lcom/android/internal/util/LatencyTracker-IA; Lcom/android/internal/util/LatencyTracker; Lcom/android/internal/util/LineBreakBufferedWriter; Lcom/android/internal/util/LocalLog; @@ -35595,6 +35509,8 @@ Lcom/android/internal/util/ProcFileReader; Lcom/android/internal/util/ProgressReporter; Lcom/android/internal/util/ProviderAccessStats$PerThreadData; Lcom/android/internal/util/ProviderAccessStats; +Lcom/android/internal/util/RateLimitingCache$ValueFetcher; +Lcom/android/internal/util/RateLimitingCache; Lcom/android/internal/util/RingBuffer$$ExternalSyntheticLambda0; Lcom/android/internal/util/RingBuffer$$ExternalSyntheticLambda1; Lcom/android/internal/util/RingBuffer; @@ -35605,22 +35521,18 @@ Lcom/android/internal/util/ScreenshotHelper; Lcom/android/internal/util/StatLogger; Lcom/android/internal/util/State; Lcom/android/internal/util/StateMachine$LogRec; -Lcom/android/internal/util/StateMachine$LogRecords-IA; Lcom/android/internal/util/StateMachine$LogRecords; -Lcom/android/internal/util/StateMachine$SmHandler$HaltingState-IA; Lcom/android/internal/util/StateMachine$SmHandler$HaltingState; -Lcom/android/internal/util/StateMachine$SmHandler$QuittingState-IA; Lcom/android/internal/util/StateMachine$SmHandler$QuittingState; Lcom/android/internal/util/StateMachine$SmHandler$StateInfo; -Lcom/android/internal/util/StateMachine$SmHandler-IA; Lcom/android/internal/util/StateMachine$SmHandler; +Lcom/android/internal/util/StateMachine-IA; Lcom/android/internal/util/StateMachine; Lcom/android/internal/util/StringPool; Lcom/android/internal/util/SyncResultReceiver$TimeoutException; Lcom/android/internal/util/SyncResultReceiver; Lcom/android/internal/util/ToBooleanFunction; Lcom/android/internal/util/TokenBucket; -Lcom/android/internal/util/TraceBuffer$ProtoOutputStreamProvider-IA; Lcom/android/internal/util/TraceBuffer$ProtoOutputStreamProvider; Lcom/android/internal/util/TraceBuffer$ProtoProvider; Lcom/android/internal/util/TraceBuffer; @@ -35747,7 +35659,6 @@ Lcom/android/internal/widget/CachingIconView; Lcom/android/internal/widget/ConversationLayout$1; Lcom/android/internal/widget/ConversationLayout$TouchDelegateComposite; Lcom/android/internal/widget/ConversationLayout; -Lcom/android/internal/widget/DecorCaptionView; Lcom/android/internal/widget/DecorContentParent; Lcom/android/internal/widget/DecorToolbar; Lcom/android/internal/widget/DialogTitle; @@ -35812,8 +35723,11 @@ Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticL Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar$$ExternalSyntheticLambda1; Lcom/android/internal/widget/floatingtoolbar/FloatingToolbar; Lcom/android/internal/widget/floatingtoolbar/FloatingToolbarPopup; +Lcom/android/media/flags/FeatureFlags; +Lcom/android/media/flags/FeatureFlagsImpl; Lcom/android/media/flags/Flags; Lcom/android/modules/expresslog/Counter; +Lcom/android/modules/expresslog/MetricIds$MetricInfo; Lcom/android/modules/expresslog/MetricIds; Lcom/android/modules/expresslog/StatsExpressLog; Lcom/android/modules/utils/BasicShellCommandHandler; @@ -35832,6 +35746,7 @@ Lcom/android/net/module/util/NetworkCapabilitiesUtils; Lcom/android/net/module/util/NetworkIdentityUtils; Lcom/android/net/module/util/NetworkStackConstants; Lcom/android/net/module/util/ProxyUtils; +Lcom/android/nfc/x/android/nfc/Flags; Lcom/android/phone/ecc/nano/CodedInputByteBufferNano; Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano$OutOfSpaceException; Lcom/android/phone/ecc/nano/CodedOutputByteBufferNano; @@ -35847,15 +35762,19 @@ Lcom/android/phone/ecc/nano/ProtobufEccData$CountryInfo; Lcom/android/phone/ecc/nano/ProtobufEccData$EccInfo; Lcom/android/phone/ecc/nano/UnknownFieldData; Lcom/android/phone/ecc/nano/WireFormatNano; +Lcom/android/sdksandbox/flags/FeatureFlags; +Lcom/android/sdksandbox/flags/FeatureFlagsImpl; Lcom/android/sdksandbox/flags/Flags; Lcom/android/server/AppWidgetBackupBridge; Lcom/android/server/LocalServices; Lcom/android/server/WidgetBackupProvider; Lcom/android/server/am/nano/Capabilities; Lcom/android/server/am/nano/Capability; +Lcom/android/server/am/nano/FrameworkCapability; +Lcom/android/server/am/nano/VMCapability; +Lcom/android/server/am/nano/VMInfo; Lcom/android/server/backup/AccountManagerBackupHelper; Lcom/android/server/backup/AccountSyncSettingsBackupHelper; -Lcom/android/server/backup/NotificationBackupHelper; Lcom/android/server/backup/PermissionBackupHelper; Lcom/android/server/backup/PreferredActivityBackupHelper; Lcom/android/server/backup/ShortcutBackupHelper; @@ -35881,6 +35800,7 @@ Lcom/android/server/connectivity/metrics/nano/IpConnectivityLogClass$WakeupStats Lcom/android/server/criticalevents/nano/CriticalEventLogProto; Lcom/android/server/criticalevents/nano/CriticalEventLogStorageProto; Lcom/android/server/criticalevents/nano/CriticalEventProto$AppNotResponding; +Lcom/android/server/criticalevents/nano/CriticalEventProto$ExcessiveBinderCalls; Lcom/android/server/criticalevents/nano/CriticalEventProto$HalfWatchdog; Lcom/android/server/criticalevents/nano/CriticalEventProto$InstallPackages; Lcom/android/server/criticalevents/nano/CriticalEventProto$JavaCrash; @@ -35890,6 +35810,7 @@ Lcom/android/server/criticalevents/nano/CriticalEventProto$Watchdog; Lcom/android/server/job/JobSchedulerInternal$JobStorePersistStats; Lcom/android/server/net/BaseNetdEventCallback; Lcom/android/server/net/BaseNetworkObserver; +Lcom/android/server/ondeviceintelligence/nano/InferenceInfo; Lcom/android/server/sip/SipHelper; Lcom/android/server/sip/SipService$ConnectivityReceiver$1; Lcom/android/server/sip/SipService$ConnectivityReceiver; @@ -35931,6 +35852,9 @@ Lcom/android/server/sip/SipWakeLock; Lcom/android/server/sip/SipWakeupTimer$MyEvent; Lcom/android/server/sip/SipWakeupTimer$MyEventComparator; Lcom/android/server/sip/SipWakeupTimer; +Lcom/android/server/telecom/flags/FeatureFlags; +Lcom/android/server/telecom/flags/FeatureFlagsImpl; +Lcom/android/server/telecom/flags/Flags; Lcom/android/server/usage/AppStandbyInternal$AppIdleStateChangeListener; Lcom/android/server/usage/AppStandbyInternal; Lcom/android/server/wm/nano/WindowManagerProtos$TaskSnapshotProto; @@ -35962,9 +35886,6 @@ Lcom/android/telephony/Rlog; Lcom/android/text/flags/FeatureFlags; Lcom/android/text/flags/FeatureFlagsImpl; Lcom/android/text/flags/Flags; -Lcom/android/window/flags/FeatureFlags; -Lcom/android/window/flags/FeatureFlagsImpl; -Lcom/android/window/flags/Flags; Lcom/google/android/collect/Lists; Lcom/google/android/collect/Maps; Lcom/google/android/collect/Sets; @@ -36400,7 +36321,6 @@ Lgov/nist/javax/sip/stack/TLSMessageProcessor; Lgov/nist/javax/sip/stack/UDPMessageChannel$PingBackTimerTask; Lgov/nist/javax/sip/stack/UDPMessageChannel; Lgov/nist/javax/sip/stack/UDPMessageProcessor; -Ljava/io/InterruptedIOException; Ljavax/microedition/khronos/egl/EGL10; Ljavax/microedition/khronos/egl/EGL11; Ljavax/microedition/khronos/egl/EGL; @@ -36530,6 +36450,7 @@ Lorg/apache/http/conn/ssl/X509HostnameVerifier; Lorg/apache/http/params/CoreConnectionPNames; Lorg/apache/http/params/HttpConnectionParams; Lorg/apache/http/params/HttpParams; +Lorg/ccil/cowan/tagsoup/AttributesImpl; Lorg/ccil/cowan/tagsoup/AutoDetector; Lorg/ccil/cowan/tagsoup/CommandLine; Lorg/ccil/cowan/tagsoup/Element; @@ -36649,6 +36570,8 @@ Lorg/ccil/cowan/tagsoup/jaxp/SAXParserImpl; [Landroid/graphics/fonts/FontVariationAxis; [Landroid/hardware/CameraStatus; [Landroid/hardware/biometrics/BiometricSourceType; +[Landroid/hardware/camera2/CameraCharacteristics$Key; +[Landroid/hardware/camera2/marshal/MarshalQueryable; [Landroid/hardware/camera2/params/Capability; [Landroid/hardware/camera2/params/Face; [Landroid/hardware/camera2/params/HighSpeedVideoConfiguration; @@ -36710,6 +36633,7 @@ Lorg/ccil/cowan/tagsoup/jaxp/SAXParserImpl; [Landroid/icu/impl/units/MeasureUnitImpl$InitialCompoundPart; [Landroid/icu/impl/units/MeasureUnitImpl$PowerPart; [Landroid/icu/impl/units/MeasureUnitImpl$UnitsParser$Token$Type; +[Landroid/icu/lang/UCharacter$IdentifierType; [Landroid/icu/lang/UCharacter$UnicodeBlock; [Landroid/icu/lang/UScript$ScriptUsage; [Landroid/icu/lang/UScriptRun$ParenStackEntry; @@ -37051,4 +36975,4 @@ Lorg/ccil/cowan/tagsoup/jaxp/SAXParserImpl; [[Landroid/graphics/Rect; [[Landroid/media/ExifInterface$ExifTag; [[Landroid/widget/GridLayout$Arc; -[[Lcom/android/internal/widget/LockPatternView$Cell; \ No newline at end of file +[[Lcom/android/internal/widget/LockPatternView$Cell; diff --git a/boot/preloaded-classes b/boot/preloaded-classes index 40318ed96f19..a696e03d5bdf 100644 --- a/boot/preloaded-classes +++ b/boot/preloaded-classes @@ -56,13 +56,13 @@ android.accounts.AccountManager$5 android.accounts.AccountManager$8 android.accounts.AccountManager$AccountKeyData android.accounts.AccountManager$AmsTask$1 -android.accounts.AccountManager$AmsTask$Response-IA android.accounts.AccountManager$AmsTask$Response android.accounts.AccountManager$AmsTask android.accounts.AccountManager$BaseFutureTask$1 android.accounts.AccountManager$BaseFutureTask android.accounts.AccountManager$Future2Task$1 android.accounts.AccountManager$Future2Task +android.accounts.AccountManager-IA android.accounts.AccountManager android.accounts.AccountManagerCallback android.accounts.AccountManagerFuture @@ -86,13 +86,20 @@ android.accounts.IAccountManagerResponse android.accounts.NetworkErrorException android.accounts.OnAccountsUpdateListener android.accounts.OperationCanceledException +android.aconfig.nano.Aconfig$flag_declaration +android.aconfig.nano.Aconfig$flag_declarations +android.aconfig.nano.Aconfig$flag_value +android.aconfig.nano.Aconfig$flag_values +android.aconfig.nano.Aconfig$parsed_flag +android.aconfig.nano.Aconfig$parsed_flags +android.aconfig.nano.Aconfig$tracepoint android.animation.AnimationHandler$$ExternalSyntheticLambda0 android.animation.AnimationHandler$1 android.animation.AnimationHandler$2 android.animation.AnimationHandler$AnimationFrameCallback android.animation.AnimationHandler$AnimationFrameCallbackProvider -android.animation.AnimationHandler$MyFrameCallbackProvider-IA android.animation.AnimationHandler$MyFrameCallbackProvider +android.animation.AnimationHandler-IA android.animation.AnimationHandler android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda0 android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1 @@ -106,8 +113,8 @@ android.animation.Animator$AnimatorConstantState android.animation.Animator$AnimatorListener android.animation.Animator$AnimatorPauseListener android.animation.Animator -android.animation.AnimatorInflater$PathDataEvaluator-IA android.animation.AnimatorInflater$PathDataEvaluator +android.animation.AnimatorInflater-IA android.animation.AnimatorInflater android.animation.AnimatorListenerAdapter android.animation.AnimatorSet$$ExternalSyntheticLambda0 @@ -118,8 +125,8 @@ android.animation.AnimatorSet$3 android.animation.AnimatorSet$AnimationEvent android.animation.AnimatorSet$Builder android.animation.AnimatorSet$Node -android.animation.AnimatorSet$SeekState-IA android.animation.AnimatorSet$SeekState +android.animation.AnimatorSet-IA android.animation.AnimatorSet android.animation.ArgbEvaluator android.animation.BidirectionalTypeConverter @@ -150,8 +157,8 @@ android.animation.PathKeyframes$3 android.animation.PathKeyframes$4 android.animation.PathKeyframes$FloatKeyframesBase android.animation.PathKeyframes$IntKeyframesBase -android.animation.PathKeyframes$SimpleKeyframes-IA android.animation.PathKeyframes$SimpleKeyframes +android.animation.PathKeyframes-IA android.animation.PathKeyframes android.animation.PropertyValuesHolder$1 android.animation.PropertyValuesHolder$FloatPropertyValuesHolder @@ -164,8 +171,8 @@ android.animation.RectEvaluator android.animation.RevealAnimator android.animation.StateListAnimator$1 android.animation.StateListAnimator$StateListAnimatorConstantState -android.animation.StateListAnimator$Tuple-IA android.animation.StateListAnimator$Tuple +android.animation.StateListAnimator-IA android.animation.StateListAnimator android.animation.TimeAnimator$TimeListener android.animation.TimeAnimator @@ -198,19 +205,22 @@ android.app.Activity$$ExternalSyntheticLambda0 android.app.Activity$1 android.app.Activity$HostCallbacks android.app.Activity$ManagedCursor -android.app.Activity$ManagedDialog-IA android.app.Activity$ManagedDialog android.app.Activity$NonConfigurationInstances android.app.Activity$RequestFinishCallback android.app.Activity$TranslucentConversionListener +android.app.Activity-IA android.app.Activity android.app.ActivityClient$1 -android.app.ActivityClient$ActivityClientControllerSingleton-IA android.app.ActivityClient$ActivityClientControllerSingleton android.app.ActivityClient-IA android.app.ActivityClient -android.app.ActivityManager$2 +android.app.ActivityManager$$ExternalSyntheticLambda0 +android.app.ActivityManager$$ExternalSyntheticLambda1 +android.app.ActivityManager$$ExternalSyntheticLambda2 +android.app.ActivityManager$1 android.app.ActivityManager$3 +android.app.ActivityManager$4 android.app.ActivityManager$AppTask android.app.ActivityManager$MemoryInfo$1 android.app.ActivityManager$MemoryInfo @@ -222,20 +232,16 @@ android.app.ActivityManager$ProcessErrorStateInfo$1 android.app.ActivityManager$ProcessErrorStateInfo android.app.ActivityManager$RecentTaskInfo$1 android.app.ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData -android.app.ActivityManager$RecentTaskInfo-IA android.app.ActivityManager$RecentTaskInfo android.app.ActivityManager$RunningAppProcessInfo$1 -android.app.ActivityManager$RunningAppProcessInfo-IA android.app.ActivityManager$RunningAppProcessInfo android.app.ActivityManager$RunningServiceInfo$1 -android.app.ActivityManager$RunningServiceInfo-IA android.app.ActivityManager$RunningServiceInfo android.app.ActivityManager$RunningTaskInfo$1 -android.app.ActivityManager$RunningTaskInfo-IA android.app.ActivityManager$RunningTaskInfo android.app.ActivityManager$TaskDescription$1 -android.app.ActivityManager$TaskDescription-IA android.app.ActivityManager$TaskDescription +android.app.ActivityManager-IA android.app.ActivityManager android.app.ActivityManagerInternal android.app.ActivityOptions$1 @@ -268,7 +274,6 @@ android.app.ActivityThread$ActivityClientRecord android.app.ActivityThread$AppBindData android.app.ActivityThread$ApplicationThread$$ExternalSyntheticLambda2 android.app.ActivityThread$ApplicationThread$1 -android.app.ActivityThread$ApplicationThread-IA android.app.ActivityThread$BindServiceData android.app.ActivityThread$ContextCleanupInfo android.app.ActivityThread$CreateBackupAgentData @@ -278,7 +283,6 @@ android.app.ActivityThread$DumpHeapData android.app.ActivityThread$DumpResourcesData android.app.ActivityThread$GcIdler android.app.ActivityThread$H -android.app.ActivityThread$Idler-IA android.app.ActivityThread$Idler android.app.ActivityThread$Profiler android.app.ActivityThread$ProviderClientRecord @@ -290,6 +294,7 @@ android.app.ActivityThread$RequestAssistContextExtras android.app.ActivityThread$SafeCancellationTransport android.app.ActivityThread$ServiceArgsData android.app.ActivityThread$UpdateCompatibilityData +android.app.ActivityThread-IA android.app.ActivityThread android.app.ActivityThreadInternal android.app.ActivityTransitionCoordinator @@ -360,6 +365,7 @@ android.app.AppOpsManager android.app.AppOpsManagerInternal android.app.Application$ActivityLifecycleCallbacks android.app.Application$OnProvideAssistDataListener +android.app.Application android.app.ApplicationErrorReport$1 android.app.ApplicationErrorReport$AnrInfo android.app.ApplicationErrorReport$BatteryInfo @@ -371,8 +377,8 @@ android.app.ApplicationErrorReport android.app.ApplicationExitInfo$1 android.app.ApplicationExitInfo-IA android.app.ApplicationExitInfo -android.app.ApplicationLoaders$CachedClassLoader-IA android.app.ApplicationLoaders$CachedClassLoader +android.app.ApplicationLoaders-IA android.app.ApplicationLoaders android.app.ApplicationPackageManager$$ExternalSyntheticLambda1 android.app.ApplicationPackageManager$$ExternalSyntheticLambda2 @@ -395,6 +401,8 @@ android.app.BackgroundInstallControlManager android.app.BackgroundServiceStartNotAllowedException$1 android.app.BackgroundServiceStartNotAllowedException android.app.BroadcastOptions +android.app.BroadcastStickyCache +android.app.CameraCompatTaskInfo$1 android.app.CameraCompatTaskInfo android.app.ClientTransactionHandler android.app.ComponentCaller @@ -499,7 +507,6 @@ android.app.IAssistDataReceiver android.app.IBackupAgent$Stub$Proxy android.app.IBackupAgent$Stub android.app.IBackupAgent -android.app.ICompatCameraControlCallback android.app.IForegroundServiceObserver$Stub$Proxy android.app.IForegroundServiceObserver$Stub android.app.IForegroundServiceObserver @@ -594,14 +601,13 @@ android.app.ListActivity android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0 android.app.LoadedApk$ReceiverDispatcher$Args android.app.LoadedApk$ReceiverDispatcher -android.app.LoadedApk$ServiceDispatcher$ConnectionInfo-IA android.app.LoadedApk$ServiceDispatcher$ConnectionInfo android.app.LoadedApk$ServiceDispatcher$DeathMonitor android.app.LoadedApk$ServiceDispatcher$RunConnection android.app.LoadedApk$ServiceDispatcher android.app.LoadedApk$SplitDependencyLoaderImpl -android.app.LoadedApk$WarningContextClassLoader-IA android.app.LoadedApk$WarningContextClassLoader +android.app.LoadedApk-IA android.app.LoadedApk android.app.LoaderManager$LoaderCallbacks android.app.LoaderManager @@ -615,13 +621,11 @@ android.app.Notification$$ExternalSyntheticLambda0 android.app.Notification$1 android.app.Notification$Action$1 android.app.Notification$Action$Builder -android.app.Notification$Action-IA android.app.Notification$Action android.app.Notification$BigPictureStyle android.app.Notification$BigTextStyle android.app.Notification$BubbleMetadata$1 android.app.Notification$BubbleMetadata$Builder -android.app.Notification$BubbleMetadata-IA android.app.Notification$BubbleMetadata android.app.Notification$Builder android.app.Notification$BuilderRemoteViews @@ -634,12 +638,12 @@ android.app.Notification$InboxStyle android.app.Notification$MediaStyle android.app.Notification$MessagingStyle$Message android.app.Notification$MessagingStyle -android.app.Notification$StandardTemplateParams-IA android.app.Notification$StandardTemplateParams android.app.Notification$Style android.app.Notification$TemplateBindResult$MarginSet android.app.Notification$TemplateBindResult android.app.Notification$TvExtender +android.app.Notification-IA android.app.Notification android.app.NotificationChannel$1 android.app.NotificationChannel @@ -658,7 +662,6 @@ android.app.PackageInstallObserver android.app.PendingIntent$$ExternalSyntheticLambda0 android.app.PendingIntent$$ExternalSyntheticLambda1 android.app.PendingIntent$$ExternalSyntheticLambda2 -android.app.PendingIntent$$ExternalSyntheticLambda3 android.app.PendingIntent$1 android.app.PendingIntent$CancelListener android.app.PendingIntent$CanceledException @@ -666,7 +669,6 @@ android.app.PendingIntent$OnFinished android.app.PendingIntent$OnMarshaledListener android.app.PendingIntent android.app.Person$1 -android.app.Person$Builder-IA android.app.Person$Builder android.app.Person-IA android.app.Person @@ -704,15 +706,14 @@ android.app.RemoteInputHistoryItem android.app.RemoteServiceException android.app.ResourcesManager$$ExternalSyntheticLambda0 android.app.ResourcesManager$$ExternalSyntheticLambda1 -android.app.ResourcesManager$ActivityResource-IA android.app.ResourcesManager$ActivityResource -android.app.ResourcesManager$ActivityResources-IA android.app.ResourcesManager$ActivityResources android.app.ResourcesManager$ApkAssetsSupplier android.app.ResourcesManager$ApkKey +android.app.ResourcesManager$PathCollector android.app.ResourcesManager$SharedLibraryAssets -android.app.ResourcesManager$UpdateHandler-IA android.app.ResourcesManager$UpdateHandler +android.app.ResourcesManager-IA android.app.ResourcesManager android.app.ResultInfo$1 android.app.ResultInfo @@ -738,9 +739,10 @@ android.app.SharedPreferencesImpl$1 android.app.SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0 android.app.SharedPreferencesImpl$EditorImpl$1 android.app.SharedPreferencesImpl$EditorImpl$2 -android.app.SharedPreferencesImpl$MemoryCommitResult-IA +android.app.SharedPreferencesImpl$EditorImpl android.app.SharedPreferencesImpl$MemoryCommitResult android.app.SharedPreferencesImpl$SharedPreferencesThreadFactory +android.app.SharedPreferencesImpl-IA android.app.StackTrace android.app.StatusBarManager android.app.SyncNotedAppOp$1 @@ -797,6 +799,8 @@ android.app.SystemServiceRegistry$143 android.app.SystemServiceRegistry$144 android.app.SystemServiceRegistry$145 android.app.SystemServiceRegistry$146 +android.app.SystemServiceRegistry$147 +android.app.SystemServiceRegistry$148 android.app.SystemServiceRegistry$14 android.app.SystemServiceRegistry$15 android.app.SystemServiceRegistry$16 @@ -906,8 +910,8 @@ android.app.UiModeManager$1 android.app.UiModeManager$Globals android.app.UiModeManager$InnerListener android.app.UiModeManager$OnProjectionStateChangedListener -android.app.UiModeManager$OnProjectionStateChangedListenerResourceManager-IA android.app.UiModeManager$OnProjectionStateChangedListenerResourceManager +android.app.UiModeManager-IA android.app.UiModeManager android.app.UidObserver android.app.UriGrantsManager$1 @@ -1019,17 +1023,17 @@ android.app.assist.AssistStructure$ViewNodeText android.app.assist.AssistStructure$ViewStackEntry android.app.assist.AssistStructure$WindowNode android.app.assist.AssistStructure -android.app.backup.BackupAgent$BackupServiceBinder-IA android.app.backup.BackupAgent$BackupServiceBinder android.app.backup.BackupAgent$SharedPrefsSynchronizer +android.app.backup.BackupAgent-IA android.app.backup.BackupAgent android.app.backup.BackupAgentHelper android.app.backup.BackupDataInput$EntityHeader android.app.backup.BackupDataInput android.app.backup.BackupDataOutput android.app.backup.BackupHelper -android.app.backup.BackupHelperDispatcher$Header-IA android.app.backup.BackupHelperDispatcher$Header +android.app.backup.BackupHelperDispatcher-IA android.app.backup.BackupHelperDispatcher android.app.backup.BackupHelperWithLogger android.app.backup.BackupManager$BackupObserverWrapper$1 @@ -1117,11 +1121,11 @@ android.app.job.IUserVisibleJobObserver android.app.job.JobInfo$1 android.app.job.JobInfo$Builder android.app.job.JobInfo$TriggerContentUri$1 -android.app.job.JobInfo$TriggerContentUri-IA android.app.job.JobInfo$TriggerContentUri android.app.job.JobInfo-IA android.app.job.JobInfo android.app.job.JobParameters$1 +android.app.job.JobParameters$JobCleanupCallback android.app.job.JobParameters-IA android.app.job.JobParameters android.app.job.JobScheduler @@ -1195,8 +1199,6 @@ android.app.servertransaction.LaunchActivityItem android.app.servertransaction.NewIntentItem$1 android.app.servertransaction.NewIntentItem-IA android.app.servertransaction.NewIntentItem -android.app.servertransaction.ObjectPool -android.app.servertransaction.ObjectPoolItem android.app.servertransaction.PauseActivityItem$1 android.app.servertransaction.PauseActivityItem-IA android.app.servertransaction.PauseActivityItem @@ -1216,6 +1218,7 @@ android.app.servertransaction.TopResumedActivityChangeItem-IA android.app.servertransaction.TopResumedActivityChangeItem android.app.servertransaction.TransactionExecutor android.app.servertransaction.TransactionExecutorHelper +android.app.servertransaction.WindowStateTransactionItem$TransactionListener android.app.slice.ISliceManager$Stub$Proxy android.app.slice.ISliceManager$Stub android.app.slice.ISliceManager @@ -1267,6 +1270,7 @@ android.app.smartspace.uitemplatedata.TapAction$1 android.app.smartspace.uitemplatedata.TapAction android.app.smartspace.uitemplatedata.Text$1 android.app.smartspace.uitemplatedata.Text +android.app.supervision.SupervisionManager android.app.time.ITimeZoneDetectorListener$Stub$Proxy android.app.time.ITimeZoneDetectorListener$Stub android.app.time.ITimeZoneDetectorListener @@ -1389,15 +1393,15 @@ android.companion.virtual.IVirtualDevice android.companion.virtual.IVirtualDeviceManager$Stub$Proxy android.companion.virtual.IVirtualDeviceManager$Stub android.companion.virtual.IVirtualDeviceManager +android.companion.virtual.VirtualDevice$1 android.companion.virtual.VirtualDevice android.companion.virtual.VirtualDeviceManager android.companion.virtual.flags.FeatureFlags android.companion.virtual.flags.FeatureFlagsImpl android.companion.virtual.flags.Flags -android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl-IA android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl -android.content.AbstractThreadedSyncAdapter$SyncThread-IA android.content.AbstractThreadedSyncAdapter$SyncThread +android.content.AbstractThreadedSyncAdapter-IA android.content.AbstractThreadedSyncAdapter android.content.ActivityNotFoundException android.content.ApexEnvironment @@ -1417,8 +1421,8 @@ android.content.BroadcastReceiver$PendingResult$1 android.content.BroadcastReceiver$PendingResult android.content.BroadcastReceiver android.content.ClipData$1 -android.content.ClipData$Item-IA android.content.ClipData$Item +android.content.ClipData-IA android.content.ClipData android.content.ClipDescription$1 android.content.ClipDescription @@ -1446,14 +1450,13 @@ android.content.ContentProvider$PipeDataWriter android.content.ContentProvider$Transport android.content.ContentProvider android.content.ContentProviderClient$CursorWrapperInner -android.content.ContentProviderClient$NotRespondingRunnable-IA android.content.ContentProviderClient$NotRespondingRunnable +android.content.ContentProviderClient-IA android.content.ContentProviderClient android.content.ContentProviderNative android.content.ContentProviderOperation$1 android.content.ContentProviderOperation$BackReference$1 android.content.ContentProviderOperation$BackReference -android.content.ContentProviderOperation$Builder-IA android.content.ContentProviderOperation$Builder android.content.ContentProviderOperation-IA android.content.ContentProviderOperation @@ -1463,11 +1466,10 @@ android.content.ContentResolver$1 android.content.ContentResolver$2 android.content.ContentResolver$OpenResourceIdResult android.content.ContentResolver$ParcelFileDescriptorInner -android.content.ContentResolver$ResultListener-IA android.content.ContentResolver$ResultListener -android.content.ContentResolver$StringResultListener-IA android.content.ContentResolver$StringResultListener android.content.ContentResolver$UriResultListener +android.content.ContentResolver-IA android.content.ContentResolver android.content.ContentUris android.content.ContentValues$1 @@ -1735,11 +1737,11 @@ android.content.pm.LauncherApps$1 android.content.pm.LauncherApps$AppUsageLimit$1 android.content.pm.LauncherApps$AppUsageLimit android.content.pm.LauncherApps$Callback -android.content.pm.LauncherApps$CallbackMessageHandler$CallbackInfo-IA android.content.pm.LauncherApps$CallbackMessageHandler$CallbackInfo android.content.pm.LauncherApps$CallbackMessageHandler android.content.pm.LauncherApps$ShortcutQuery$QueryFlags android.content.pm.LauncherApps$ShortcutQuery +android.content.pm.LauncherApps-IA android.content.pm.LauncherApps android.content.pm.ModuleInfo$1 android.content.pm.ModuleInfo-IA @@ -1783,7 +1785,6 @@ android.content.pm.PackageManager$Property android.content.pm.PackageManager$ResolveInfoFlags android.content.pm.PackageManager android.content.pm.PackageParser$Activity$1 -android.content.pm.PackageParser$Activity-IA android.content.pm.PackageParser$Activity android.content.pm.PackageParser$ActivityIntentInfo android.content.pm.PackageParser$ApkLite @@ -1803,16 +1804,13 @@ android.content.pm.PackageParser$PackageParserException android.content.pm.PackageParser$ParseComponentArgs android.content.pm.PackageParser$ParsePackageItemArgs android.content.pm.PackageParser$Permission$1 -android.content.pm.PackageParser$Permission-IA android.content.pm.PackageParser$Permission android.content.pm.PackageParser$PermissionGroup$1 android.content.pm.PackageParser$PermissionGroup android.content.pm.PackageParser$Provider$1 -android.content.pm.PackageParser$Provider-IA android.content.pm.PackageParser$Provider android.content.pm.PackageParser$ProviderIntentInfo android.content.pm.PackageParser$Service$1 -android.content.pm.PackageParser$Service-IA android.content.pm.PackageParser$Service android.content.pm.PackageParser$ServiceIntentInfo android.content.pm.PackageParser$SigningDetails$1 @@ -1821,6 +1819,7 @@ android.content.pm.PackageParser$SigningDetails android.content.pm.PackageParser$SplitAssetLoader android.content.pm.PackageParser$SplitDependencyLoader$IllegalDependencyException android.content.pm.PackageParser$SplitNameComparator +android.content.pm.PackageParser-IA android.content.pm.PackageParser android.content.pm.PackageParserCacheHelper$ReadHelper android.content.pm.PackageParserCacheHelper$WriteHelper @@ -1945,7 +1944,6 @@ android.content.res.ApkAssets android.content.res.AssetFileDescriptor$1 android.content.res.AssetFileDescriptor$AutoCloseInputStream android.content.res.AssetFileDescriptor -android.content.res.AssetManager$AssetInputStream-IA android.content.res.AssetManager$AssetInputStream android.content.res.AssetManager$Builder android.content.res.AssetManager-IA @@ -1987,19 +1985,20 @@ android.content.res.ResourceTimer$Config android.content.res.ResourceTimer$Timer android.content.res.ResourceTimer android.content.res.Resources$$ExternalSyntheticLambda0 +android.content.res.Resources$$ExternalSyntheticLambda1 android.content.res.Resources$AssetManagerUpdateHandler android.content.res.Resources$NotFoundException -android.content.res.Resources$Theme-IA android.content.res.Resources$Theme android.content.res.Resources$ThemeKey android.content.res.Resources$UpdateCallbacks +android.content.res.Resources-IA android.content.res.Resources android.content.res.ResourcesImpl$$ExternalSyntheticLambda0 android.content.res.ResourcesImpl$$ExternalSyntheticLambda1 android.content.res.ResourcesImpl$$ExternalSyntheticLambda2 -android.content.res.ResourcesImpl$LookupStack-IA android.content.res.ResourcesImpl$LookupStack android.content.res.ResourcesImpl$ThemeImpl +android.content.res.ResourcesImpl-IA android.content.res.ResourcesImpl android.content.res.ResourcesKey android.content.res.StringBlock$Height @@ -2079,17 +2078,20 @@ android.database.sqlite.SQLiteBlobTooBigException android.database.sqlite.SQLiteCantOpenDatabaseException android.database.sqlite.SQLiteClosable android.database.sqlite.SQLiteCompatibilityWalFlags -android.database.sqlite.SQLiteConnection$Operation-IA android.database.sqlite.SQLiteConnection$Operation +android.database.sqlite.SQLiteConnection$OperationLog$$ExternalSyntheticLambda0 +android.database.sqlite.SQLiteConnection$OperationLog$$ExternalSyntheticLambda1 android.database.sqlite.SQLiteConnection$OperationLog android.database.sqlite.SQLiteConnection$PreparedStatement android.database.sqlite.SQLiteConnection$PreparedStatementCache +android.database.sqlite.SQLiteConnection$RateLimiter +android.database.sqlite.SQLiteConnection-IA android.database.sqlite.SQLiteConnection android.database.sqlite.SQLiteConnectionPool$1 android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus -android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter-IA android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter android.database.sqlite.SQLiteConnectionPool$IdleConnectionHandler +android.database.sqlite.SQLiteConnectionPool-IA android.database.sqlite.SQLiteConnectionPool android.database.sqlite.SQLiteConstraintException android.database.sqlite.SQLiteCursorDriver @@ -2101,8 +2103,8 @@ android.database.sqlite.SQLiteDatabase$$ExternalSyntheticLambda3 android.database.sqlite.SQLiteDatabase$1 android.database.sqlite.SQLiteDatabase$CursorFactory android.database.sqlite.SQLiteDatabase$OpenParams$Builder -android.database.sqlite.SQLiteDatabase$OpenParams-IA android.database.sqlite.SQLiteDatabase$OpenParams +android.database.sqlite.SQLiteDatabase-IA android.database.sqlite.SQLiteDatabase android.database.sqlite.SQLiteDatabaseConfiguration android.database.sqlite.SQLiteDatabaseCorruptException @@ -2125,8 +2127,8 @@ android.database.sqlite.SQLiteQuery android.database.sqlite.SQLiteQueryBuilder android.database.sqlite.SQLiteRawStatement android.database.sqlite.SQLiteReadOnlyDatabaseException -android.database.sqlite.SQLiteSession$Transaction-IA android.database.sqlite.SQLiteSession$Transaction +android.database.sqlite.SQLiteSession-IA android.database.sqlite.SQLiteSession android.database.sqlite.SQLiteStatement android.database.sqlite.SQLiteStatementInfo @@ -2135,8 +2137,8 @@ android.database.sqlite.SQLiteTokenizer android.database.sqlite.SQLiteTransactionListener android.database.sqlite.SqliteWrapper android.ddm.DdmHandle -android.ddm.DdmHandleAppName$Names-IA android.ddm.DdmHandleAppName$Names +android.ddm.DdmHandleAppName-IA android.ddm.DdmHandleAppName android.ddm.DdmHandleExit android.ddm.DdmHandleHeap @@ -2194,12 +2196,16 @@ android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda0 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda1 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda2 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda3 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda4 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda5 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda6 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda9 +android.graphics.ColorSpace$Rgb$Native android.graphics.ColorSpace$Rgb$NoImagePreloadHolder android.graphics.ColorSpace$Rgb$TransferParameters -android.graphics.ColorSpace$Rgb-IA android.graphics.ColorSpace$Rgb android.graphics.ColorSpace$Xyz +android.graphics.ColorSpace-IA android.graphics.ColorSpace android.graphics.Compatibility android.graphics.ComposePathEffect @@ -2229,11 +2235,11 @@ android.graphics.HardwareRenderer$DestroyContextRunnable android.graphics.HardwareRenderer$FrameCommitCallback android.graphics.HardwareRenderer$FrameCompleteCallback android.graphics.HardwareRenderer$FrameDrawingCallback -android.graphics.HardwareRenderer$FrameRenderRequest-IA android.graphics.HardwareRenderer$FrameRenderRequest android.graphics.HardwareRenderer$PrepareSurfaceControlForWebviewCallback android.graphics.HardwareRenderer$ProcessInitializer$1 android.graphics.HardwareRenderer$ProcessInitializer +android.graphics.HardwareRenderer-IA android.graphics.HardwareRenderer android.graphics.HardwareRendererObserver$$ExternalSyntheticLambda0 android.graphics.HardwareRendererObserver$OnFrameMetricsAvailableListener @@ -2242,12 +2248,11 @@ android.graphics.ImageDecoder$AssetInputStreamSource android.graphics.ImageDecoder$ByteArraySource android.graphics.ImageDecoder$DecodeException android.graphics.ImageDecoder$ImageDecoderSourceTrace -android.graphics.ImageDecoder$ImageInfo-IA android.graphics.ImageDecoder$ImageInfo android.graphics.ImageDecoder$InputStreamSource android.graphics.ImageDecoder$OnHeaderDecodedListener -android.graphics.ImageDecoder$Source-IA android.graphics.ImageDecoder$Source +android.graphics.ImageDecoder-IA android.graphics.ImageDecoder android.graphics.ImageFormat android.graphics.Insets$1 @@ -2260,6 +2265,7 @@ android.graphics.LightingColorFilter android.graphics.LinearGradient android.graphics.MaskFilter android.graphics.Matrix$1 +android.graphics.Matrix$ExtraNatives android.graphics.Matrix$NoImagePreloadHolder android.graphics.Matrix$ScaleToFit android.graphics.Matrix @@ -2283,6 +2289,7 @@ android.graphics.Paint android.graphics.PaintFlagsDrawFilter android.graphics.Path$Direction android.graphics.Path$FillType +android.graphics.Path$NoImagePreloadHolder android.graphics.Path$Op android.graphics.Path android.graphics.PathDashPathEffect @@ -2363,7 +2370,6 @@ android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition android.graphics.drawable.AnimatedStateListDrawable$AnimationDrawableTransition android.graphics.drawable.AnimatedStateListDrawable$FrameInterpolator -android.graphics.drawable.AnimatedStateListDrawable$Transition-IA android.graphics.drawable.AnimatedStateListDrawable$Transition android.graphics.drawable.AnimatedStateListDrawable-IA android.graphics.drawable.AnimatedStateListDrawable @@ -2397,9 +2403,9 @@ android.graphics.drawable.Drawable$Callback android.graphics.drawable.Drawable$ConstantState android.graphics.drawable.Drawable android.graphics.drawable.DrawableContainer$1 -android.graphics.drawable.DrawableContainer$BlockInvalidateCallback-IA android.graphics.drawable.DrawableContainer$BlockInvalidateCallback android.graphics.drawable.DrawableContainer$DrawableContainerState +android.graphics.drawable.DrawableContainer-IA android.graphics.drawable.DrawableContainer android.graphics.drawable.DrawableInflater android.graphics.drawable.DrawableWrapper$DrawableWrapperState @@ -2493,6 +2499,7 @@ android.graphics.drawable.shapes.RectShape android.graphics.drawable.shapes.RoundRectShape android.graphics.drawable.shapes.Shape android.graphics.fonts.Font$Builder +android.graphics.fonts.Font$NoImagePreloadHolder android.graphics.fonts.Font android.graphics.fonts.FontCustomizationParser$Result android.graphics.fonts.FontCustomizationParser @@ -2511,7 +2518,6 @@ android.graphics.text.LineBreakConfig$Builder android.graphics.text.LineBreakConfig android.graphics.text.LineBreaker$Builder android.graphics.text.LineBreaker$ParagraphConstraints -android.graphics.text.LineBreaker$Result-IA android.graphics.text.LineBreaker$Result android.graphics.text.LineBreaker-IA android.graphics.text.LineBreaker @@ -2645,7 +2651,6 @@ android.hardware.camera2.CameraCharacteristics$5 android.hardware.camera2.CameraCharacteristics$6 android.hardware.camera2.CameraCharacteristics$7 android.hardware.camera2.CameraCharacteristics$8 -android.hardware.camera2.CameraCharacteristics$9 android.hardware.camera2.CameraCharacteristics$Key android.hardware.camera2.CameraCharacteristics android.hardware.camera2.CameraDevice$StateCallback @@ -2665,18 +2670,17 @@ android.hardware.camera2.CameraMetadata android.hardware.camera2.CameraOfflineSession$CameraOfflineSessionCallback android.hardware.camera2.CaptureRequest$1 android.hardware.camera2.CaptureRequest$2 -android.hardware.camera2.CaptureRequest$3 android.hardware.camera2.CaptureRequest$Key android.hardware.camera2.CaptureRequest android.hardware.camera2.CaptureResult$1 android.hardware.camera2.CaptureResult$2 android.hardware.camera2.CaptureResult$3 -android.hardware.camera2.CaptureResult$4 android.hardware.camera2.CaptureResult$Key android.hardware.camera2.CaptureResult android.hardware.camera2.DngCreator android.hardware.camera2.TotalCaptureResult android.hardware.camera2.extension.ICaptureProcessorImpl +android.hardware.camera2.impl.CameraDeviceImpl$1 android.hardware.camera2.impl.CameraDeviceImpl$CameraHandlerExecutor android.hardware.camera2.impl.CameraDeviceImpl android.hardware.camera2.impl.CameraExtensionJpegProcessor @@ -2811,6 +2815,7 @@ android.hardware.contexthub.V1_0.MemRange android.hardware.contexthub.V1_0.NanoAppBinary android.hardware.contexthub.V1_0.PhysicalSensor android.hardware.contexthub.V1_1.Setting +android.hardware.devicestate.DeviceState$Configuration$1 android.hardware.devicestate.DeviceState$Configuration android.hardware.devicestate.DeviceState android.hardware.devicestate.DeviceStateInfo$1 @@ -2822,8 +2827,8 @@ android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper -android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback-IA android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback +android.hardware.devicestate.DeviceStateManagerGlobal-IA android.hardware.devicestate.DeviceStateManagerGlobal android.hardware.devicestate.IDeviceStateManager$Stub$Proxy android.hardware.devicestate.IDeviceStateManager$Stub @@ -2858,13 +2863,12 @@ android.hardware.display.DisplayManager$$ExternalSyntheticLambda0 android.hardware.display.DisplayManager$$ExternalSyntheticLambda1 android.hardware.display.DisplayManager$$ExternalSyntheticLambda2 android.hardware.display.DisplayManager$DisplayListener -android.hardware.display.DisplayManager$WeakDisplayCache-IA android.hardware.display.DisplayManager$WeakDisplayCache +android.hardware.display.DisplayManager-IA android.hardware.display.DisplayManager android.hardware.display.DisplayManagerGlobal$1 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate -android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback-IA android.hardware.display.DisplayManagerGlobal android.hardware.display.DisplayManagerInternal$DisplayPowerCallbacks android.hardware.display.DisplayManagerInternal$DisplayPowerRequest @@ -2970,9 +2974,9 @@ android.hardware.input.InputDeviceIdentifier android.hardware.input.InputManager$InputDeviceListener android.hardware.input.InputManager android.hardware.input.InputManagerGlobal$InputDeviceListenerDelegate -android.hardware.input.InputManagerGlobal$InputDevicesChangedListener-IA android.hardware.input.InputManagerGlobal$InputDevicesChangedListener android.hardware.input.InputManagerGlobal$OnTabletModeChangedListenerDelegate +android.hardware.input.InputManagerGlobal-IA android.hardware.input.InputManagerGlobal android.hardware.input.InputSettings android.hardware.input.KeyboardLayout$1 @@ -3482,11 +3486,11 @@ android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$VariantSy android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo android.icu.impl.ICUCurrencyDisplayInfoProvider android.icu.impl.ICUCurrencyMetaInfo$Collector -android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector-IA android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector android.icu.impl.ICUCurrencyMetaInfo$InfoCollector android.icu.impl.ICUCurrencyMetaInfo$RegionCollector android.icu.impl.ICUCurrencyMetaInfo$UniqueList +android.icu.impl.ICUCurrencyMetaInfo-IA android.icu.impl.ICUCurrencyMetaInfo android.icu.impl.ICUData$1 android.icu.impl.ICUData$2 @@ -3514,10 +3518,10 @@ android.icu.impl.ICUResourceBundle$4 android.icu.impl.ICUResourceBundle$5 android.icu.impl.ICUResourceBundle$AvailEntry android.icu.impl.ICUResourceBundle$AvailableLocalesSink -android.icu.impl.ICUResourceBundle$Loader-IA android.icu.impl.ICUResourceBundle$Loader android.icu.impl.ICUResourceBundle$OpenType android.icu.impl.ICUResourceBundle$WholeBundle +android.icu.impl.ICUResourceBundle-IA android.icu.impl.ICUResourceBundle android.icu.impl.ICUResourceBundleImpl$ResourceArray android.icu.impl.ICUResourceBundleImpl$ResourceBinary @@ -3652,10 +3656,10 @@ android.icu.impl.TZDBTimeZoneNames$TZDBNames android.icu.impl.TZDBTimeZoneNames android.icu.impl.TextTrieMap$CharIterator android.icu.impl.TextTrieMap$LongestMatchHandler -android.icu.impl.TextTrieMap$Node-IA android.icu.impl.TextTrieMap$Node android.icu.impl.TextTrieMap$Output android.icu.impl.TextTrieMap$ResultHandler +android.icu.impl.TextTrieMap-IA android.icu.impl.TextTrieMap android.icu.impl.TimeZoneAdapter android.icu.impl.TimeZoneGenericNames$1 @@ -3675,9 +3679,9 @@ android.icu.impl.TimeZoneNamesImpl$NameSearchHandler android.icu.impl.TimeZoneNamesImpl$TZ2MZsCache android.icu.impl.TimeZoneNamesImpl$ZNames$NameTypeIndex android.icu.impl.TimeZoneNamesImpl$ZNames -android.icu.impl.TimeZoneNamesImpl$ZNamesLoader-IA android.icu.impl.TimeZoneNamesImpl$ZNamesLoader android.icu.impl.TimeZoneNamesImpl$ZoneStringsLoader +android.icu.impl.TimeZoneNamesImpl-IA android.icu.impl.TimeZoneNamesImpl android.icu.impl.Trie$DataManipulate android.icu.impl.Trie$DefaultGetFoldingOffset @@ -4018,10 +4022,10 @@ android.icu.impl.number.MutablePatternModifier$ImmutablePatternModifier android.icu.impl.number.MutablePatternModifier android.icu.impl.number.Padder$PadPosition android.icu.impl.number.Padder -android.icu.impl.number.PatternStringParser$ParsedPatternInfo-IA android.icu.impl.number.PatternStringParser$ParsedPatternInfo android.icu.impl.number.PatternStringParser$ParsedSubpatternInfo android.icu.impl.number.PatternStringParser$ParserState +android.icu.impl.number.PatternStringParser-IA android.icu.impl.number.PatternStringParser android.icu.impl.number.PatternStringUtils$1 android.icu.impl.number.PatternStringUtils$PatternSignType @@ -4333,7 +4337,6 @@ android.icu.text.DateFormat$Field android.icu.text.DateFormat$HourCycle android.icu.text.DateFormat android.icu.text.DateFormatSymbols$1 -android.icu.text.DateFormatSymbols$AospExtendedDateFormatSymbols-IA android.icu.text.DateFormatSymbols$AospExtendedDateFormatSymbols android.icu.text.DateFormatSymbols$CalendarDataSink$AliasType android.icu.text.DateFormatSymbols$CalendarDataSink @@ -4349,25 +4352,21 @@ android.icu.text.DateIntervalFormat android.icu.text.DateIntervalInfo$DateIntervalSink android.icu.text.DateIntervalInfo$PatternInfo android.icu.text.DateIntervalInfo -android.icu.text.DateTimePatternGenerator$AppendItemFormatsSink-IA android.icu.text.DateTimePatternGenerator$AppendItemFormatsSink -android.icu.text.DateTimePatternGenerator$AppendItemNamesSink-IA android.icu.text.DateTimePatternGenerator$AppendItemNamesSink android.icu.text.DateTimePatternGenerator$AvailableFormatsSink android.icu.text.DateTimePatternGenerator$DTPGflags -android.icu.text.DateTimePatternGenerator$DateTimeMatcher-IA android.icu.text.DateTimePatternGenerator$DateTimeMatcher android.icu.text.DateTimePatternGenerator$DayPeriodAllowedHoursSink android.icu.text.DateTimePatternGenerator$DisplayWidth -android.icu.text.DateTimePatternGenerator$DistanceInfo-IA android.icu.text.DateTimePatternGenerator$DistanceInfo android.icu.text.DateTimePatternGenerator$FormatParser android.icu.text.DateTimePatternGenerator$PatternInfo android.icu.text.DateTimePatternGenerator$PatternWithMatcher android.icu.text.DateTimePatternGenerator$PatternWithSkeletonFlag -android.icu.text.DateTimePatternGenerator$SkeletonFields-IA android.icu.text.DateTimePatternGenerator$SkeletonFields android.icu.text.DateTimePatternGenerator$VariableField +android.icu.text.DateTimePatternGenerator-IA android.icu.text.DateTimePatternGenerator android.icu.text.DecimalFormat$PropertySetter android.icu.text.DecimalFormat @@ -4378,8 +4377,8 @@ android.icu.text.DecimalFormatSymbols android.icu.text.DisplayContext$Type android.icu.text.DisplayContext android.icu.text.DurationFormat -android.icu.text.Edits$Iterator-IA android.icu.text.Edits$Iterator +android.icu.text.Edits-IA android.icu.text.Edits android.icu.text.EscapeTransliterator$1 android.icu.text.EscapeTransliterator$2 @@ -4517,10 +4516,10 @@ android.icu.text.PluralRules$OrConstraint android.icu.text.PluralRules$PluralType android.icu.text.PluralRules$RangeConstraint android.icu.text.PluralRules$Rule -android.icu.text.PluralRules$RuleList-IA android.icu.text.PluralRules$RuleList android.icu.text.PluralRules$SampleType android.icu.text.PluralRules$SimpleTokenizer +android.icu.text.PluralRules-IA android.icu.text.PluralRules android.icu.text.PluralRulesSerialProxy android.icu.text.Quantifier @@ -4566,12 +4565,12 @@ android.icu.text.ReplaceableString android.icu.text.RuleBasedBreakIterator$BreakCache android.icu.text.RuleBasedBreakIterator$DictionaryCache android.icu.text.RuleBasedBreakIterator -android.icu.text.RuleBasedCollator$CollationBuffer-IA android.icu.text.RuleBasedCollator$CollationBuffer android.icu.text.RuleBasedCollator$CollationKeyByteSink android.icu.text.RuleBasedCollator$FCDUTF16NFDIterator android.icu.text.RuleBasedCollator$NFDIterator android.icu.text.RuleBasedCollator$UTF16NFDIterator +android.icu.text.RuleBasedCollator-IA android.icu.text.RuleBasedCollator android.icu.text.RuleBasedNumberFormat android.icu.text.RuleBasedTransliterator$Data @@ -4725,11 +4724,11 @@ android.icu.util.BytesTrieBuilder$BytesAsCharSequence android.icu.util.BytesTrieBuilder android.icu.util.CECalendar android.icu.util.Calendar$1 -android.icu.util.Calendar$FormatConfiguration-IA android.icu.util.Calendar$FormatConfiguration android.icu.util.Calendar$PatternData android.icu.util.Calendar$WeekData android.icu.util.Calendar$WeekDataCache +android.icu.util.Calendar-IA android.icu.util.Calendar android.icu.util.CaseInsensitiveString android.icu.util.CharsTrie$Entry @@ -4744,19 +4743,16 @@ android.icu.util.CodePointMap$RangeOption android.icu.util.CodePointMap$StringIterator android.icu.util.CodePointMap$ValueFilter android.icu.util.CodePointMap -android.icu.util.CodePointTrie$Data-IA android.icu.util.CodePointTrie$Data16 android.icu.util.CodePointTrie$Data32 android.icu.util.CodePointTrie$Data8 android.icu.util.CodePointTrie$Data android.icu.util.CodePointTrie$Fast$FastStringIterator -android.icu.util.CodePointTrie$Fast-IA android.icu.util.CodePointTrie$Fast16 android.icu.util.CodePointTrie$Fast32 android.icu.util.CodePointTrie$Fast8 android.icu.util.CodePointTrie$Fast android.icu.util.CodePointTrie$Small$SmallStringIterator -android.icu.util.CodePointTrie$Small-IA android.icu.util.CodePointTrie$Small16 android.icu.util.CodePointTrie$Small32 android.icu.util.CodePointTrie$Small8 @@ -4838,8 +4834,8 @@ android.icu.util.MeasureUnit$MeasureUnitSink android.icu.util.MeasureUnit android.icu.util.MutableCodePointTrie$1 android.icu.util.MutableCodePointTrie$AllSameBlocks -android.icu.util.MutableCodePointTrie$MixedBlocks-IA android.icu.util.MutableCodePointTrie$MixedBlocks +android.icu.util.MutableCodePointTrie-IA android.icu.util.MutableCodePointTrie android.icu.util.NoUnit android.icu.util.Output @@ -4913,6 +4909,7 @@ android.inputmethodservice.InputMethodService$Insets android.inputmethodservice.InputMethodService$SettingsObserver android.inputmethodservice.InputMethodService android.inputmethodservice.SoftInputWindow +android.internal.framework.protobuf.nano.MessageNano android.internal.hidl.base.V1_0.DebugInfo android.internal.hidl.base.V1_0.IBase android.internal.hidl.manager.V1_0.IServiceManager @@ -4947,11 +4944,14 @@ android.location.IGpsGeofenceHardware$Stub android.location.IGpsGeofenceHardware android.location.Location$$ExternalSyntheticLambda0 android.location.Location$1 -android.location.Location$BearingDistanceCache-IA android.location.Location$BearingDistanceCache +android.location.Location-IA android.location.Location android.location.LocationTime$1 android.location.LocationTime +android.location.flags.FeatureFlags +android.location.flags.FeatureFlagsImpl +android.location.flags.Flags android.media.AudioAttributes$1 android.media.AudioAttributes$Builder android.media.AudioAttributes-IA @@ -4985,22 +4985,20 @@ android.media.AudioManager$AudioPlaybackCallbackInfo android.media.AudioManager$AudioRecordingCallback android.media.AudioManager$AudioRecordingCallbackInfo android.media.AudioManager$BlockingFocusResultReceiver -android.media.AudioManager$DevRoleListeners-IA android.media.AudioManager$DevRoleListeners android.media.AudioManager$FocusRequestInfo android.media.AudioManager$NativeEventHandlerDelegate$1 android.media.AudioManager$NativeEventHandlerDelegate -android.media.AudioManager$OnAmPortUpdateListener-IA android.media.AudioManager$OnAmPortUpdateListener android.media.AudioManager$OnAudioFocusChangeListener android.media.AudioManager$OnAudioPortUpdateListener android.media.AudioManager$OnModeChangedListener android.media.AudioManager$PlaybackConfigChangeCallbackData android.media.AudioManager$RecordConfigChangeCallbackData -android.media.AudioManager$SafeWaitObject-IA android.media.AudioManager$SafeWaitObject android.media.AudioManager$ServiceEventHandlerDelegate$1 android.media.AudioManager$ServiceEventHandlerDelegate +android.media.AudioManager-IA android.media.AudioManager android.media.AudioManagerInternal$RingerModeDelegate android.media.AudioManagerInternal @@ -5156,10 +5154,9 @@ android.media.ImageWriter android.media.JetPlayer android.media.MediaCodec$$ExternalSyntheticLambda6 android.media.MediaCodec$$ExternalSyntheticLambda7 +android.media.MediaCodec$$ExternalSyntheticLambda8 android.media.MediaCodec$BufferInfo -android.media.MediaCodec$BufferMap$CodecBuffer-IA android.media.MediaCodec$BufferMap$CodecBuffer -android.media.MediaCodec$BufferMap-IA android.media.MediaCodec$BufferMap android.media.MediaCodec$Callback android.media.MediaCodec$CodecException @@ -5175,6 +5172,7 @@ android.media.MediaCodec$OutputFrame android.media.MediaCodec$ParameterDescriptor android.media.MediaCodec$PersistentSurface android.media.MediaCodec$QueueRequest +android.media.MediaCodec-IA android.media.MediaCodecInfo$AudioCapabilities android.media.MediaCodecInfo$CodecProfileLevel android.media.MediaCodecInfo$EncoderCapabilities @@ -5229,7 +5227,6 @@ android.media.MediaPlayer$2 android.media.MediaPlayer$3 android.media.MediaPlayer$6 android.media.MediaPlayer$7 -android.media.MediaPlayer$DrmInfo-IA android.media.MediaPlayer$DrmInfo android.media.MediaPlayer$EventHandler$$ExternalSyntheticLambda0 android.media.MediaPlayer$EventHandler$1 @@ -5255,6 +5252,7 @@ android.media.MediaPlayer$TimeProvider$EventHandler android.media.MediaPlayer$TimeProvider android.media.MediaPlayer$TrackInfo$1 android.media.MediaPlayer$TrackInfo +android.media.MediaPlayer-IA android.media.MediaPlayer android.media.MediaRecorder android.media.MediaRoute2Info$1 @@ -5420,13 +5418,14 @@ android.media.browse.MediaBrowser$ConnectionCallback android.media.browse.MediaBrowser$MediaItem$1 android.media.browse.MediaBrowser$MediaItem android.media.browse.MediaBrowser$MediaServiceConnection$1 -android.media.browse.MediaBrowser$MediaServiceConnection-IA android.media.browse.MediaBrowser$MediaServiceConnection android.media.browse.MediaBrowser$ServiceCallbacks android.media.browse.MediaBrowser$Subscription android.media.browse.MediaBrowser$SubscriptionCallback +android.media.browse.MediaBrowser-IA android.media.browse.MediaBrowser android.media.browse.MediaBrowserUtils +android.media.codec.Flags android.media.metrics.Event android.media.metrics.IMediaMetricsManager$Stub$Proxy android.media.metrics.IMediaMetricsManager$Stub @@ -5507,6 +5506,7 @@ android.media.session.ISessionCallback android.media.session.ISessionController$Stub$Proxy android.media.session.ISessionController$Stub android.media.session.ISessionController +android.media.session.ISessionControllerCallback$Stub$Proxy android.media.session.ISessionControllerCallback$Stub android.media.session.ISessionControllerCallback android.media.session.ISessionManager$Stub$Proxy @@ -5517,8 +5517,8 @@ android.media.session.MediaController$CallbackStub android.media.session.MediaController$MessageHandler android.media.session.MediaController$PlaybackInfo$1 android.media.session.MediaController$PlaybackInfo -android.media.session.MediaController$TransportControls-IA android.media.session.MediaController$TransportControls +android.media.session.MediaController-IA android.media.session.MediaController android.media.session.MediaSession$Callback android.media.session.MediaSession$CallbackMessageHandler @@ -5531,29 +5531,26 @@ android.media.session.MediaSession android.media.session.MediaSessionLegacyHelper android.media.session.MediaSessionManager$OnActiveSessionsChangedListener android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListener -android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListenerStub-IA android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListenerStub android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListener -android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub-IA android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub android.media.session.MediaSessionManager$OnMediaKeyListener android.media.session.MediaSessionManager$OnMediaKeyListenerImpl android.media.session.MediaSessionManager$OnSession2TokensChangedListener android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener android.media.session.MediaSessionManager$OnVolumeKeyLongPressListenerImpl -android.media.session.MediaSessionManager$RemoteSessionCallbackStub-IA android.media.session.MediaSessionManager$RemoteSessionCallbackStub android.media.session.MediaSessionManager$RemoteUserInfo android.media.session.MediaSessionManager$Session2TokensChangedWrapper android.media.session.MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0 android.media.session.MediaSessionManager$SessionsChangedWrapper$1 android.media.session.MediaSessionManager$SessionsChangedWrapper +android.media.session.MediaSessionManager-IA android.media.session.MediaSessionManager android.media.session.ParcelableListBinder android.media.session.PlaybackState$1 android.media.session.PlaybackState$Builder android.media.session.PlaybackState$CustomAction$1 -android.media.session.PlaybackState$CustomAction-IA android.media.session.PlaybackState$CustomAction android.media.session.PlaybackState-IA android.media.session.PlaybackState @@ -5620,7 +5617,6 @@ android.net.INetworkPolicyListener android.net.INetworkPolicyManager$Stub$Proxy android.net.INetworkPolicyManager$Stub android.net.INetworkPolicyManager -android.net.INetworkRecommendationProvider$Stub$Proxy android.net.INetworkRecommendationProvider$Stub android.net.INetworkRecommendationProvider android.net.INetworkScoreCache$Stub$Proxy @@ -5683,18 +5679,14 @@ android.net.TelephonyNetworkSpecifier$1 android.net.TelephonyNetworkSpecifier$Builder android.net.TelephonyNetworkSpecifier android.net.Uri$1 -android.net.Uri$AbstractHierarchicalUri-IA android.net.Uri$AbstractHierarchicalUri android.net.Uri$AbstractPart android.net.Uri$Builder -android.net.Uri$HierarchicalUri-IA android.net.Uri$NotCachedHolder -android.net.Uri$OpaqueUri-IA android.net.Uri$Part$EmptyPart android.net.Uri$Part android.net.Uri$PathPart android.net.Uri$PathSegmentsBuilder -android.net.Uri$StringUri-IA android.net.Uri-IA android.net.Uri android.net.UriCodec @@ -5823,16 +5815,99 @@ android.net.wifi.nl80211.WifiNl80211Manager$ScanEventHandler android.net.wifi.nl80211.WifiNl80211Manager$SignalPollResult android.net.wifi.nl80211.WifiNl80211Manager android.net.wifi.sharedconnectivity.app.SharedConnectivityManager +android.nfc.IAppCallback$Stub +android.nfc.IAppCallback +android.nfc.INfcAdapter$Stub +android.nfc.INfcAdapter +android.nfc.INfcAdapterExtras +android.nfc.INfcCardEmulation +android.nfc.INfcControllerAlwaysOnListener$Stub +android.nfc.INfcControllerAlwaysOnListener +android.nfc.INfcDta +android.nfc.INfcFCardEmulation +android.nfc.INfcTag +android.nfc.INfcUnlockHandler$Stub +android.nfc.INfcUnlockHandler +android.nfc.INfcVendorNciCallback$Stub +android.nfc.INfcVendorNciCallback +android.nfc.INfcWlcStateListener$Stub +android.nfc.INfcWlcStateListener +android.nfc.ITagRemovedCallback$Stub +android.nfc.ITagRemovedCallback +android.nfc.NdefMessage +android.nfc.NfcActivityManager +android.nfc.NfcAdapter$$ExternalSyntheticLambda0 +android.nfc.NfcAdapter$$ExternalSyntheticLambda10 +android.nfc.NfcAdapter$$ExternalSyntheticLambda11 +android.nfc.NfcAdapter$$ExternalSyntheticLambda12 +android.nfc.NfcAdapter$$ExternalSyntheticLambda13 +android.nfc.NfcAdapter$$ExternalSyntheticLambda14 +android.nfc.NfcAdapter$$ExternalSyntheticLambda15 +android.nfc.NfcAdapter$$ExternalSyntheticLambda16 +android.nfc.NfcAdapter$$ExternalSyntheticLambda17 +android.nfc.NfcAdapter$$ExternalSyntheticLambda18 +android.nfc.NfcAdapter$$ExternalSyntheticLambda19 +android.nfc.NfcAdapter$$ExternalSyntheticLambda1 +android.nfc.NfcAdapter$$ExternalSyntheticLambda20 +android.nfc.NfcAdapter$$ExternalSyntheticLambda21 +android.nfc.NfcAdapter$$ExternalSyntheticLambda22 +android.nfc.NfcAdapter$$ExternalSyntheticLambda23 +android.nfc.NfcAdapter$$ExternalSyntheticLambda24 +android.nfc.NfcAdapter$$ExternalSyntheticLambda25 +android.nfc.NfcAdapter$$ExternalSyntheticLambda26 +android.nfc.NfcAdapter$$ExternalSyntheticLambda27 +android.nfc.NfcAdapter$$ExternalSyntheticLambda28 +android.nfc.NfcAdapter$$ExternalSyntheticLambda29 +android.nfc.NfcAdapter$$ExternalSyntheticLambda2 +android.nfc.NfcAdapter$$ExternalSyntheticLambda30 +android.nfc.NfcAdapter$$ExternalSyntheticLambda31 +android.nfc.NfcAdapter$$ExternalSyntheticLambda32 +android.nfc.NfcAdapter$$ExternalSyntheticLambda33 +android.nfc.NfcAdapter$$ExternalSyntheticLambda34 +android.nfc.NfcAdapter$$ExternalSyntheticLambda35 +android.nfc.NfcAdapter$$ExternalSyntheticLambda36 +android.nfc.NfcAdapter$$ExternalSyntheticLambda37 +android.nfc.NfcAdapter$$ExternalSyntheticLambda38 +android.nfc.NfcAdapter$$ExternalSyntheticLambda39 +android.nfc.NfcAdapter$$ExternalSyntheticLambda3 +android.nfc.NfcAdapter$$ExternalSyntheticLambda4 +android.nfc.NfcAdapter$$ExternalSyntheticLambda5 +android.nfc.NfcAdapter$$ExternalSyntheticLambda6 +android.nfc.NfcAdapter$$ExternalSyntheticLambda7 +android.nfc.NfcAdapter$$ExternalSyntheticLambda8 +android.nfc.NfcAdapter$$ExternalSyntheticLambda9 +android.nfc.NfcAdapter$1 +android.nfc.NfcAdapter$2 +android.nfc.NfcAdapter$ControllerAlwaysOnListener +android.nfc.NfcAdapter$CreateBeamUrisCallback +android.nfc.NfcAdapter$CreateNdefMessageCallback +android.nfc.NfcAdapter$NfcUnlockHandler +android.nfc.NfcAdapter$NfcVendorNciCallback +android.nfc.NfcAdapter$OnNdefPushCompleteCallback +android.nfc.NfcAdapter$OnTagRemovedListener +android.nfc.NfcAdapter$ReaderCallback +android.nfc.NfcAdapter$ServiceCall +android.nfc.NfcAdapter$ServiceCallReturn +android.nfc.NfcAdapter$WlcStateListener android.nfc.NfcAdapter +android.nfc.NfcAntennaInfo +android.nfc.NfcControllerAlwaysOnListener android.nfc.NfcFrameworkInitializer$$ExternalSyntheticLambda0 android.nfc.NfcFrameworkInitializer android.nfc.NfcManager +android.nfc.NfcOemExtension android.nfc.NfcServiceManager$ServiceRegisterer android.nfc.NfcServiceManager +android.nfc.NfcVendorNciCallbackListener +android.nfc.NfcWlcStateListener +android.nfc.Tag +android.nfc.TechListParcel +android.nfc.WlcListenerDeviceInfo android.nfc.cardemulation.AidGroup$1 android.nfc.cardemulation.AidGroup android.nfc.cardemulation.ApduServiceInfo$1 android.nfc.cardemulation.ApduServiceInfo +android.nfc.cardemulation.PollingFrame android.opengl.EGL14 android.opengl.EGL15 android.opengl.EGLConfig @@ -5883,8 +5958,8 @@ android.os.AsyncTask$InternalHandler android.os.AsyncTask$SerialExecutor$1 android.os.AsyncTask$SerialExecutor android.os.AsyncTask$Status -android.os.AsyncTask$WorkerRunnable-IA android.os.AsyncTask$WorkerRunnable +android.os.AsyncTask-IA android.os.AsyncTask android.os.BadParcelableException android.os.BadTypeParcelableException @@ -5952,8 +6027,8 @@ android.os.Build android.os.Bundle$1 android.os.Bundle android.os.CancellationSignal$OnCancelListener -android.os.CancellationSignal$Transport-IA android.os.CancellationSignal$Transport +android.os.CancellationSignal-IA android.os.CancellationSignal android.os.CarrierAssociatedAppEntry$1 android.os.CarrierAssociatedAppEntry @@ -5979,8 +6054,8 @@ android.os.DdmSyncState android.os.DeadObjectException android.os.DeadSystemException android.os.Debug$MemoryInfo$1 -android.os.Debug$MemoryInfo-IA android.os.Debug$MemoryInfo +android.os.Debug-IA android.os.Debug android.os.DeviceIdleManager android.os.DropBoxManager$Entry$1 @@ -6014,8 +6089,8 @@ android.os.GraphicsEnvironment$1 android.os.GraphicsEnvironment android.os.Handler$BlockingRunnable android.os.Handler$Callback -android.os.Handler$MessengerImpl-IA android.os.Handler$MessengerImpl +android.os.Handler-IA android.os.Handler android.os.HandlerExecutor android.os.HandlerThread @@ -6033,6 +6108,7 @@ android.os.IBatteryPropertiesRegistrar$Stub$Proxy android.os.IBatteryPropertiesRegistrar$Stub android.os.IBatteryPropertiesRegistrar android.os.IBinder$DeathRecipient +android.os.IBinder$FrozenStateChangeCallback android.os.IBinder android.os.IBinderCallback android.os.ICancellationSignal$Stub$Proxy @@ -6161,6 +6237,7 @@ android.os.IWakeLockCallback android.os.IncidentManager$IncidentReport$1 android.os.IncidentManager$IncidentReport android.os.IncidentManager +android.os.IpcDataCache$1 android.os.IpcDataCache$Config android.os.IpcDataCache$QueryHandler android.os.IpcDataCache$RemoteCall @@ -6255,7 +6332,6 @@ android.os.RemoteCallback$2 android.os.RemoteCallback$3 android.os.RemoteCallback$OnResultListener android.os.RemoteCallback -android.os.RemoteCallbackList$Callback android.os.RemoteCallbackList android.os.RemoteException android.os.ResultReceiver$1 @@ -6264,17 +6340,16 @@ android.os.ResultReceiver$MyRunnable android.os.ResultReceiver android.os.SELinux android.os.SecurityStateManager +android.os.Service$1 +android.os.Service android.os.ServiceManager$ServiceNotFoundException android.os.ServiceManager android.os.ServiceManagerNative android.os.ServiceManagerProxy android.os.ServiceSpecificException android.os.SharedMemory$1 -android.os.SharedMemory$Closer-IA android.os.SharedMemory$Closer -android.os.SharedMemory$MemoryRegistration-IA android.os.SharedMemory$MemoryRegistration -android.os.SharedMemory$Unmapper-IA android.os.SharedMemory$Unmapper android.os.SharedMemory-IA android.os.SharedMemory @@ -6300,33 +6375,29 @@ android.os.StrictMode$9 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1 android.os.StrictMode$AndroidBlockGuardPolicy -android.os.StrictMode$AndroidCloseGuardReporter-IA android.os.StrictMode$AndroidCloseGuardReporter android.os.StrictMode$InstanceTracker android.os.StrictMode$OnThreadViolationListener android.os.StrictMode$OnVmViolationListener android.os.StrictMode$Span android.os.StrictMode$ThreadPolicy$Builder -android.os.StrictMode$ThreadPolicy-IA android.os.StrictMode$ThreadPolicy -android.os.StrictMode$ThreadSpanState-IA android.os.StrictMode$ThreadSpanState -android.os.StrictMode$UnsafeIntentStrictModeCallback-IA android.os.StrictMode$UnsafeIntentStrictModeCallback android.os.StrictMode$ViolationInfo$1 android.os.StrictMode$ViolationInfo android.os.StrictMode$ViolationLogger android.os.StrictMode$VmPolicy$Builder -android.os.StrictMode$VmPolicy-IA android.os.StrictMode$VmPolicy +android.os.StrictMode-IA android.os.StrictMode android.os.SynchronousResultReceiver$Result android.os.SynchronousResultReceiver android.os.SystemClock$2 android.os.SystemClock android.os.SystemConfigManager -android.os.SystemProperties$Handle-IA android.os.SystemProperties$Handle +android.os.SystemProperties-IA android.os.SystemProperties android.os.SystemService$1 android.os.SystemService$State @@ -6362,9 +6433,6 @@ android.os.UpdateLock android.os.UserHandle$1 android.os.UserHandle android.os.UserManager$1 -android.os.UserManager$2 -android.os.UserManager$3 -android.os.UserManager$4 android.os.UserManager$EnforcingUser$1 android.os.UserManager$EnforcingUser android.os.UserManager$UserOperationException @@ -6442,7 +6510,6 @@ android.os.storage.IStorageShutdownObserver android.os.storage.OnObbStateChangeListener android.os.storage.StorageEventListener android.os.storage.StorageManager$1 -android.os.storage.StorageManager$ObbActionListener-IA android.os.storage.StorageManager$ObbActionListener android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda2 android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda3 @@ -6451,6 +6518,7 @@ android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheti android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda6 android.os.storage.StorageManager$StorageEventListenerDelegate android.os.storage.StorageManager$StorageVolumeCallback +android.os.storage.StorageManager-IA android.os.storage.StorageManager android.os.storage.StorageManagerInternal android.os.storage.StorageVolume$1 @@ -6519,8 +6587,8 @@ android.permission.PermissionManager$2 android.permission.PermissionManager$OnPermissionsChangeListenerDelegate android.permission.PermissionManager$PackageNamePermissionQuery android.permission.PermissionManager$PermissionQuery -android.permission.PermissionManager$SplitPermissionInfo-IA android.permission.PermissionManager$SplitPermissionInfo +android.permission.PermissionManager-IA android.permission.PermissionManagerInternal android.preference.DialogPreference android.preference.GenericInflater$Parent @@ -6836,12 +6904,11 @@ android.security.keystore.recovery.WrappedApplicationKey$1 android.security.keystore.recovery.WrappedApplicationKey$Builder android.security.keystore.recovery.WrappedApplicationKey android.security.keystore.recovery.X509CertificateParsingUtils -android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream -android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$GCM +android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi android.security.keystore2.AndroidKeyStoreBCWorkaroundProvider android.security.keystore2.AndroidKeyStoreCipherSpiBase @@ -7053,18 +7120,16 @@ android.service.media.MediaBrowserService$BrowserRoot android.service.media.MediaBrowserService$ConnectionRecord android.service.media.MediaBrowserService$Result android.service.media.MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1 -android.service.media.MediaBrowserService$ServiceBinder-IA android.service.media.MediaBrowserService$ServiceBinder -android.service.media.MediaBrowserService$ServiceState-IA android.service.media.MediaBrowserService$ServiceState +android.service.media.MediaBrowserService-IA android.service.media.MediaBrowserService android.service.notification.Adjustment$1 android.service.notification.Adjustment android.service.notification.Condition$1 android.service.notification.Condition -android.service.notification.ConditionProviderService$H-IA android.service.notification.ConditionProviderService$H -android.service.notification.ConditionProviderService$Provider-IA +android.service.notification.ConditionProviderService-IA android.service.notification.ConditionProviderService android.service.notification.IConditionProvider$Stub android.service.notification.IConditionProvider @@ -7081,8 +7146,8 @@ android.service.notification.NotificationListenerFilter android.service.notification.NotificationListenerService$MyHandler android.service.notification.NotificationListenerService$Ranking android.service.notification.NotificationListenerService$RankingMap$1 -android.service.notification.NotificationListenerService$RankingMap-IA android.service.notification.NotificationListenerService$RankingMap +android.service.notification.NotificationListenerService-IA android.service.notification.NotificationListenerService android.service.notification.NotificationRankingUpdate$1 android.service.notification.NotificationRankingUpdate @@ -7212,14 +7277,11 @@ android.speech.tts.TextToSpeech$$ExternalSyntheticLambda17 android.speech.tts.TextToSpeech$$ExternalSyntheticLambda1 android.speech.tts.TextToSpeech$Action android.speech.tts.TextToSpeech$Connection$1 -android.speech.tts.TextToSpeech$Connection$SetupConnectionAsyncTask-IA -android.speech.tts.TextToSpeech$Connection-IA -android.speech.tts.TextToSpeech$DirectConnection-IA android.speech.tts.TextToSpeech$DirectConnection android.speech.tts.TextToSpeech$EngineInfo android.speech.tts.TextToSpeech$OnInitListener -android.speech.tts.TextToSpeech$SystemConnection-IA android.speech.tts.TextToSpeech$SystemConnection +android.speech.tts.TextToSpeech-IA android.speech.tts.TtsEngines$EngineInfoComparator android.speech.tts.TtsEngines android.speech.tts.UtteranceProgressListener @@ -7232,7 +7294,6 @@ android.sysprop.CryptoProperties android.sysprop.DeviceProperties android.sysprop.DisplayProperties android.sysprop.HdmiProperties -android.sysprop.InitProperties android.sysprop.InputProperties android.sysprop.MediaProperties android.sysprop.PowerProperties @@ -7252,6 +7313,7 @@ android.sysprop.TelephonyProperties$$ExternalSyntheticLambda7 android.sysprop.TelephonyProperties$$ExternalSyntheticLambda8 android.sysprop.TelephonyProperties$$ExternalSyntheticLambda9 android.sysprop.TelephonyProperties +android.sysprop.ViewProperties android.sysprop.VndkProperties android.system.keystore2.Authorization$1 android.system.keystore2.Authorization @@ -7491,9 +7553,9 @@ android.telephony.JapanesePhoneNumberFormatter android.telephony.LinkCapacityEstimate$1 android.telephony.LinkCapacityEstimate android.telephony.LocationAccessPolicy$LocationPermissionQuery$Builder -android.telephony.LocationAccessPolicy$LocationPermissionQuery-IA android.telephony.LocationAccessPolicy$LocationPermissionQuery android.telephony.LocationAccessPolicy$LocationPermissionResult +android.telephony.LocationAccessPolicy-IA android.telephony.LocationAccessPolicy android.telephony.LteVopsSupportInfo$1 android.telephony.LteVopsSupportInfo-IA @@ -7727,6 +7789,7 @@ android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda0 android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda1 android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda2 android.telephony.TelephonyRegistryManager$1$$ExternalSyntheticLambda0 +android.telephony.TelephonyRegistryManager$1 android.telephony.TelephonyRegistryManager$2 android.telephony.TelephonyRegistryManager$3 android.telephony.TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda0 @@ -8051,33 +8114,23 @@ android.text.Html$TagHandler android.text.Html android.text.HtmlToSpannedConverter$Alignment android.text.HtmlToSpannedConverter$Background -android.text.HtmlToSpannedConverter$Big-IA android.text.HtmlToSpannedConverter$Big -android.text.HtmlToSpannedConverter$Blockquote-IA android.text.HtmlToSpannedConverter$Blockquote -android.text.HtmlToSpannedConverter$Bold-IA android.text.HtmlToSpannedConverter$Bold -android.text.HtmlToSpannedConverter$Bullet-IA android.text.HtmlToSpannedConverter$Bullet android.text.HtmlToSpannedConverter$Font android.text.HtmlToSpannedConverter$Foreground android.text.HtmlToSpannedConverter$Heading android.text.HtmlToSpannedConverter$Href -android.text.HtmlToSpannedConverter$Italic-IA android.text.HtmlToSpannedConverter$Italic -android.text.HtmlToSpannedConverter$Monospace-IA android.text.HtmlToSpannedConverter$Monospace android.text.HtmlToSpannedConverter$Newline -android.text.HtmlToSpannedConverter$Small-IA android.text.HtmlToSpannedConverter$Small -android.text.HtmlToSpannedConverter$Strikethrough-IA android.text.HtmlToSpannedConverter$Strikethrough -android.text.HtmlToSpannedConverter$Sub-IA android.text.HtmlToSpannedConverter$Sub -android.text.HtmlToSpannedConverter$Super-IA android.text.HtmlToSpannedConverter$Super -android.text.HtmlToSpannedConverter$Underline-IA android.text.HtmlToSpannedConverter$Underline +android.text.HtmlToSpannedConverter-IA android.text.HtmlToSpannedConverter android.text.Hyphenator android.text.InputFilter$LengthFilter @@ -8113,6 +8166,7 @@ android.text.Selection$MemoryTextWatcher android.text.Selection$PositionIterator android.text.Selection$START android.text.Selection +android.text.SpanColors android.text.SpanSet android.text.SpanWatcher android.text.Spannable$Factory @@ -8134,9 +8188,9 @@ android.text.TextDirectionHeuristics$TextDirectionHeuristicImpl android.text.TextDirectionHeuristics$TextDirectionHeuristicInternal android.text.TextDirectionHeuristics$TextDirectionHeuristicLocale android.text.TextDirectionHeuristics -android.text.TextLine$DecorationInfo-IA android.text.TextLine$DecorationInfo android.text.TextLine$LineInfo +android.text.TextLine-IA android.text.TextLine android.text.TextPaint android.text.TextShaper$GlyphsConsumer @@ -8275,6 +8329,7 @@ android.timezone.TelephonyLookup android.timezone.TelephonyNetwork android.timezone.TelephonyNetworkFinder android.timezone.TimeZoneFinder +android.tracing.Flags android.tracing.perfetto.CreateIncrementalStateArgs android.tracing.perfetto.CreateTlsStateArgs android.tracing.perfetto.DataSource @@ -8345,8 +8400,8 @@ android.transition.TransitionValues android.transition.TransitionValuesMaps android.transition.Visibility$1 android.transition.Visibility$DisappearListener -android.transition.Visibility$VisibilityInfo-IA android.transition.Visibility$VisibilityInfo +android.transition.Visibility-IA android.transition.Visibility android.transition.VisibilityPropagation android.transparency.BinaryTransparencyManager @@ -8396,6 +8451,7 @@ android.util.FeatureFlagUtils android.util.FloatProperty android.util.Half android.util.IconDrawableFactory +android.util.IndentingPrintWriter android.util.IntArray android.util.IntProperty android.util.JsonReader$1 @@ -8459,6 +8515,7 @@ android.util.RecurrenceRule$NonrecurringIterator android.util.RecurrenceRule android.util.ReflectiveProperty android.util.RotationUtils +android.util.SequenceUtils android.util.Singleton android.util.Size android.util.SizeF$1 @@ -8559,9 +8616,7 @@ android.view.Choreographer$1 android.view.Choreographer$2 android.view.Choreographer$3 android.view.Choreographer$4 -android.view.Choreographer$CallbackQueue-IA android.view.Choreographer$CallbackQueue -android.view.Choreographer$CallbackRecord-IA android.view.Choreographer$CallbackRecord android.view.Choreographer$FrameCallback android.view.Choreographer$FrameData @@ -8580,21 +8635,19 @@ android.view.CrossWindowBlurListeners android.view.CutoutSpecification$Parser android.view.CutoutSpecification android.view.Display$HdrCapabilities$1 -android.view.Display$HdrCapabilities-IA android.view.Display$HdrCapabilities android.view.Display$HdrSdrRatioListenerWrapper android.view.Display$Mode$1 -android.view.Display$Mode-IA android.view.Display$Mode +android.view.Display-IA android.view.Display android.view.DisplayAddress$Network$1 android.view.DisplayAddress$Network android.view.DisplayAddress$Physical$1 -android.view.DisplayAddress$Physical-IA android.view.DisplayAddress$Physical +android.view.DisplayAddress-IA android.view.DisplayAddress android.view.DisplayAdjustments -android.view.DisplayCutout$Bounds-IA android.view.DisplayCutout$Bounds android.view.DisplayCutout$CutoutPathParserInfo android.view.DisplayCutout$ParcelableWrapper$1 @@ -8639,8 +8692,8 @@ android.view.HandlerActionQueue$HandlerAction android.view.HandlerActionQueue android.view.HandwritingInitiator$HandwritableViewInfo android.view.HandwritingInitiator$HandwritingAreaTracker -android.view.HandwritingInitiator$State-IA android.view.HandwritingInitiator$State +android.view.HandwritingInitiator-IA android.view.HandwritingInitiator android.view.HapticScrollFeedbackProvider android.view.IAppTransitionAnimationSpecsFuture$Stub$Proxy @@ -8675,12 +8728,6 @@ android.view.IOnKeyguardExitResult$Stub android.view.IOnKeyguardExitResult android.view.IPinnedTaskListener$Stub android.view.IPinnedTaskListener -android.view.IRecentsAnimationController$Stub$Proxy -android.view.IRecentsAnimationController$Stub -android.view.IRecentsAnimationController -android.view.IRecentsAnimationRunner$Stub$Proxy -android.view.IRecentsAnimationRunner$Stub -android.view.IRecentsAnimationRunner android.view.IRemoteAnimationFinishedCallback$Stub$Proxy android.view.IRemoteAnimationFinishedCallback$Stub android.view.IRemoteAnimationFinishedCallback @@ -8732,7 +8779,6 @@ android.view.InputApplicationHandle android.view.InputChannel$1 android.view.InputChannel android.view.InputDevice$1 -android.view.InputDevice$MotionRange-IA android.view.InputDevice$MotionRange android.view.InputDevice$ViewBehavior android.view.InputDevice-IA @@ -8754,10 +8800,14 @@ android.view.InputWindowHandle android.view.InsetsAnimationControlCallbacks android.view.InsetsAnimationControlImpl$$ExternalSyntheticLambda0 android.view.InsetsAnimationControlImpl +android.view.InsetsAnimationControlRunner$SurfaceParamsApplier$$ExternalSyntheticLambda0 +android.view.InsetsAnimationControlRunner$SurfaceParamsApplier android.view.InsetsAnimationControlRunner +android.view.InsetsAnimationSpec android.view.InsetsAnimationThread android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda0 android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1 +android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda2 android.view.InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0 android.view.InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1 android.view.InsetsAnimationThreadControlRunner$1 @@ -8765,7 +8815,6 @@ android.view.InsetsAnimationThreadControlRunner android.view.InsetsController$$ExternalSyntheticLambda0 android.view.InsetsController$$ExternalSyntheticLambda10 android.view.InsetsController$$ExternalSyntheticLambda11 -android.view.InsetsController$$ExternalSyntheticLambda12 android.view.InsetsController$$ExternalSyntheticLambda1 android.view.InsetsController$$ExternalSyntheticLambda2 android.view.InsetsController$$ExternalSyntheticLambda3 @@ -8880,10 +8929,10 @@ android.view.SearchEvent android.view.SoundEffectConstants android.view.SubMenu android.view.Surface$1 -android.view.Surface$CompatibleCanvas-IA android.view.Surface$CompatibleCanvas android.view.Surface$HwuiContext android.view.Surface$OutOfResourcesException +android.view.Surface-IA android.view.Surface android.view.SurfaceControl$1 android.view.SurfaceControl$Builder @@ -8900,6 +8949,7 @@ android.view.SurfaceControl$RefreshRateRange$1 android.view.SurfaceControl$RefreshRateRange android.view.SurfaceControl$RefreshRateRanges android.view.SurfaceControl$StaticDisplayInfo +android.view.SurfaceControl$Transaction$$ExternalSyntheticLambda1 android.view.SurfaceControl$Transaction$1 android.view.SurfaceControl$Transaction$2 android.view.SurfaceControl$Transaction @@ -8910,9 +8960,7 @@ android.view.SurfaceControl$TrustedPresentationThresholds android.view.SurfaceControl-IA android.view.SurfaceControl android.view.SurfaceControlHdrLayerInfoListener -android.view.SurfaceControlRegistry$DefaultReporter-IA android.view.SurfaceControlRegistry$DefaultReporter -android.view.SurfaceControlRegistry$NoOpRegistry-IA android.view.SurfaceControlRegistry$NoOpRegistry android.view.SurfaceControlRegistry$Reporter android.view.SurfaceControlRegistry-IA @@ -8930,14 +8978,14 @@ android.view.SurfaceView$$ExternalSyntheticLambda3 android.view.SurfaceView$$ExternalSyntheticLambda4 android.view.SurfaceView$$ExternalSyntheticLambda5 android.view.SurfaceView$1 -android.view.SurfaceView$2 +android.view.SurfaceView$SurfaceControlViewHostParent android.view.SurfaceView$SurfaceViewPositionUpdateListener -android.view.SurfaceView$SyncBufferTransactionCallback-IA android.view.SurfaceView$SyncBufferTransactionCallback +android.view.SurfaceView-IA android.view.SurfaceView android.view.SyncRtSurfaceTransactionApplier$SurfaceParams$Builder -android.view.SyncRtSurfaceTransactionApplier$SurfaceParams-IA android.view.SyncRtSurfaceTransactionApplier$SurfaceParams +android.view.SyncRtSurfaceTransactionApplier-IA android.view.SyncRtSurfaceTransactionApplier android.view.TextureView$$ExternalSyntheticLambda0 android.view.TextureView$$ExternalSyntheticLambda1 @@ -8946,8 +8994,8 @@ android.view.TextureView android.view.ThreadedRenderer$1$$ExternalSyntheticLambda0 android.view.ThreadedRenderer$1 android.view.ThreadedRenderer$DrawCallbacks -android.view.ThreadedRenderer$WebViewOverlayProvider-IA android.view.ThreadedRenderer$WebViewOverlayProvider +android.view.ThreadedRenderer-IA android.view.ThreadedRenderer android.view.TouchDelegate android.view.TunnelModeEnabledListener @@ -8990,13 +9038,10 @@ android.view.View$AttachInfo$InvalidateInfo android.view.View$AttachInfo android.view.View$BaseSavedState$1 android.view.View$BaseSavedState -android.view.View$CheckForLongPress-IA android.view.View$CheckForLongPress -android.view.View$CheckForTap-IA android.view.View$CheckForTap android.view.View$DeclaredOnClickListener android.view.View$DragShadowBuilder -android.view.View$ForegroundInfo-IA android.view.View$ForegroundInfo android.view.View$ListenerInfo android.view.View$MatchIdPredicate @@ -9016,19 +9061,16 @@ android.view.View$OnLongClickListener android.view.View$OnScrollChangeListener android.view.View$OnSystemUiVisibilityChangeListener android.view.View$OnTouchListener -android.view.View$PerformClick-IA android.view.View$PerformClick android.view.View$ScrollabilityCache android.view.View$SendAccessibilityEventThrottle android.view.View$SendViewScrolledAccessibilityEvent android.view.View$TintInfo -android.view.View$TooltipInfo-IA android.view.View$TooltipInfo android.view.View$TransformationInfo -android.view.View$UnsetPressedState-IA android.view.View$UnsetPressedState -android.view.View$VisibilityChangeForAutofillHandler-IA android.view.View$VisibilityChangeForAutofillHandler +android.view.View-IA android.view.View android.view.ViewAnimationHostBridge android.view.ViewAnimationUtils @@ -9066,10 +9108,10 @@ android.view.ViewParent android.view.ViewPropertyAnimator$1 android.view.ViewPropertyAnimator$2 android.view.ViewPropertyAnimator$3 -android.view.ViewPropertyAnimator$AnimatorEventListener-IA android.view.ViewPropertyAnimator$AnimatorEventListener android.view.ViewPropertyAnimator$NameValuesHolder android.view.ViewPropertyAnimator$PropertyBundle +android.view.ViewPropertyAnimator-IA android.view.ViewPropertyAnimator android.view.ViewRootImpl$$ExternalSyntheticLambda0 android.view.ViewRootImpl$$ExternalSyntheticLambda10 @@ -9090,6 +9132,8 @@ android.view.ViewRootImpl$$ExternalSyntheticLambda6 android.view.ViewRootImpl$$ExternalSyntheticLambda7 android.view.ViewRootImpl$$ExternalSyntheticLambda8 android.view.ViewRootImpl$$ExternalSyntheticLambda9 +android.view.ViewRootImpl$10 +android.view.ViewRootImpl$11 android.view.ViewRootImpl$1 android.view.ViewRootImpl$2 android.view.ViewRootImpl$3 @@ -9116,7 +9160,6 @@ android.view.ViewRootImpl$InputStage android.view.ViewRootImpl$InvalidateOnAnimationRunnable android.view.ViewRootImpl$NativePostImeInputStage android.view.ViewRootImpl$NativePreImeInputStage -android.view.ViewRootImpl$QueuedInputEvent-IA android.view.ViewRootImpl$QueuedInputEvent android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent android.view.ViewRootImpl$SurfaceChangedCallback @@ -9131,12 +9174,12 @@ android.view.ViewRootImpl$SystemUiVisibilityInfo android.view.ViewRootImpl$TakenSurfaceHolder android.view.ViewRootImpl$TrackballAxis android.view.ViewRootImpl$TraversalRunnable -android.view.ViewRootImpl$UnhandledKeyManager-IA android.view.ViewRootImpl$UnhandledKeyManager android.view.ViewRootImpl$ViewPostImeInputStage android.view.ViewRootImpl$ViewPreImeInputStage android.view.ViewRootImpl$ViewRootHandler android.view.ViewRootImpl$WindowInputEventReceiver +android.view.ViewRootImpl-IA android.view.ViewRootImpl android.view.ViewRootInsetsControllerHost android.view.ViewRootRectTracker$ViewInfo @@ -9200,12 +9243,13 @@ android.view.WindowManager android.view.WindowManagerGlobal$$ExternalSyntheticLambda0 android.view.WindowManagerGlobal$1 android.view.WindowManagerGlobal$2 -android.view.WindowManagerGlobal$TrustedPresentationListener-IA android.view.WindowManagerGlobal$TrustedPresentationListener +android.view.WindowManagerGlobal-IA android.view.WindowManagerGlobal android.view.WindowManagerPolicyConstants$PointerEventListener android.view.WindowManagerPolicyConstants android.view.WindowMetrics +android.view.WindowRelayoutResult android.view.WindowlessWindowLayout android.view.WindowlessWindowManager android.view.accessibility.AccessibilityCache$AccessibilityNodeRefresher @@ -9222,10 +9266,9 @@ android.view.accessibility.AccessibilityManager$1 android.view.accessibility.AccessibilityManager$AccessibilityPolicy android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener -android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener -android.view.accessibility.AccessibilityManager$MyCallback-IA android.view.accessibility.AccessibilityManager$MyCallback android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener +android.view.accessibility.AccessibilityManager-IA android.view.accessibility.AccessibilityManager android.view.accessibility.AccessibilityNodeIdManager android.view.accessibility.AccessibilityNodeInfo$1 @@ -9279,11 +9322,12 @@ android.view.animation.Animation$NoImagePreloadHolder android.view.animation.Animation android.view.animation.AnimationSet android.view.animation.AnimationUtils$1 -android.view.animation.AnimationUtils$AnimationState-IA android.view.animation.AnimationUtils$AnimationState +android.view.animation.AnimationUtils-IA android.view.animation.AnimationUtils android.view.animation.AnticipateInterpolator android.view.animation.AnticipateOvershootInterpolator +android.view.animation.BackGestureInterpolator android.view.animation.BaseInterpolator android.view.animation.BounceInterpolator android.view.animation.ClipRectAnimation @@ -9312,7 +9356,6 @@ android.view.autofill.AutofillManager$$ExternalSyntheticLambda1 android.view.autofill.AutofillManager$$ExternalSyntheticLambda2 android.view.autofill.AutofillManager$$ExternalSyntheticLambda3 android.view.autofill.AutofillManager$$ExternalSyntheticLambda4 -android.view.autofill.AutofillManager$AugmentedAutofillManagerClient-IA android.view.autofill.AutofillManager$AugmentedAutofillManagerClient android.view.autofill.AutofillManager$AutofillCallback android.view.autofill.AutofillManager$AutofillClient @@ -9323,13 +9366,15 @@ android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLa android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16 android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda18 android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda8 -android.view.autofill.AutofillManager$AutofillManagerClient-IA +android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda9 android.view.autofill.AutofillManager$AutofillManagerClient android.view.autofill.AutofillManager$CompatibilityBridge android.view.autofill.AutofillManager$TrackedViews +android.view.autofill.AutofillManager-IA android.view.autofill.AutofillManager android.view.autofill.AutofillManagerInternal android.view.autofill.AutofillPopupWindow +android.view.autofill.AutofillStateFingerprint android.view.autofill.AutofillValue$1 android.view.autofill.AutofillValue-IA android.view.autofill.AutofillValue @@ -9356,9 +9401,9 @@ android.view.contentcapture.ContentCaptureEvent$1 android.view.contentcapture.ContentCaptureEvent android.view.contentcapture.ContentCaptureHelper android.view.contentcapture.ContentCaptureManager$ContentCaptureClient -android.view.contentcapture.ContentCaptureManager$LocalDataShareAdapterResourceManager-IA android.view.contentcapture.ContentCaptureManager$LocalDataShareAdapterResourceManager android.view.contentcapture.ContentCaptureManager$StrippedContext +android.view.contentcapture.ContentCaptureManager-IA android.view.contentcapture.ContentCaptureManager android.view.contentcapture.ContentCaptureSession android.view.contentcapture.ContentCaptureSessionId$1 @@ -9379,18 +9424,13 @@ android.view.contentcapture.IContentCaptureOptionsCallback android.view.contentcapture.IDataShareWriteAdapter$Stub android.view.contentcapture.IDataShareWriteAdapter android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda0 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda10 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda11 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda12 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda13 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda1 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda2 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda3 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda4 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda5 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda6 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda8 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda9 +android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda7 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda0 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver @@ -9450,15 +9490,13 @@ android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda0 android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda1 android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda2 android.view.inputmethod.ImeTracker$Debug -android.view.inputmethod.ImeTracker$ImeJankTracker-IA android.view.inputmethod.ImeTracker$ImeJankTracker -android.view.inputmethod.ImeTracker$ImeLatencyTracker-IA android.view.inputmethod.ImeTracker$ImeLatencyTracker android.view.inputmethod.ImeTracker$InputMethodJankContext android.view.inputmethod.ImeTracker$InputMethodLatencyContext android.view.inputmethod.ImeTracker$Token$1 -android.view.inputmethod.ImeTracker$Token-IA android.view.inputmethod.ImeTracker$Token +android.view.inputmethod.ImeTracker-IA android.view.inputmethod.ImeTracker android.view.inputmethod.InlineSuggestionsRequest$1 android.view.inputmethod.InlineSuggestionsRequest @@ -9484,16 +9522,15 @@ android.view.inputmethod.InputMethodManager$1 android.view.inputmethod.InputMethodManager$2 android.view.inputmethod.InputMethodManager$6 android.view.inputmethod.InputMethodManager$BindState -android.view.inputmethod.InputMethodManager$DelegateImpl-IA android.view.inputmethod.InputMethodManager$DelegateImpl android.view.inputmethod.InputMethodManager$FinishedInputEventCallback android.view.inputmethod.InputMethodManager$H$$ExternalSyntheticLambda0 android.view.inputmethod.InputMethodManager$H$$ExternalSyntheticLambda1 android.view.inputmethod.InputMethodManager$H android.view.inputmethod.InputMethodManager$ImeInputEventSender -android.view.inputmethod.InputMethodManager$PendingEvent-IA android.view.inputmethod.InputMethodManager$PendingEvent android.view.inputmethod.InputMethodManager$ReportInputConnectionOpenedRunner +android.view.inputmethod.InputMethodManager-IA android.view.inputmethod.InputMethodManager android.view.inputmethod.InputMethodManagerGlobal android.view.inputmethod.InputMethodSession$EventCallback @@ -9554,7 +9591,6 @@ android.view.textclassifier.ConversationAction android.view.textclassifier.ConversationActions$1 android.view.textclassifier.ConversationActions$Message$1 android.view.textclassifier.ConversationActions$Message$Builder -android.view.textclassifier.ConversationActions$Message-IA android.view.textclassifier.ConversationActions$Message android.view.textclassifier.ConversationActions$Request$1 android.view.textclassifier.ConversationActions$Request$Builder @@ -9572,8 +9608,8 @@ android.view.textclassifier.SelectionEvent android.view.textclassifier.SelectionSessionLogger$SignatureParser android.view.textclassifier.SelectionSessionLogger android.view.textclassifier.SystemTextClassifier$BlockingCallback -android.view.textclassifier.SystemTextClassifier$ResponseReceiver-IA android.view.textclassifier.SystemTextClassifier$ResponseReceiver +android.view.textclassifier.SystemTextClassifier-IA android.view.textclassifier.SystemTextClassifier android.view.textclassifier.SystemTextClassifierMetadata$1 android.view.textclassifier.SystemTextClassifierMetadata @@ -9601,23 +9637,19 @@ android.view.textclassifier.TextClassificationSessionId android.view.textclassifier.TextClassifier$1 android.view.textclassifier.TextClassifier$EntityConfig$1 android.view.textclassifier.TextClassifier$EntityConfig$Builder -android.view.textclassifier.TextClassifier$EntityConfig-IA android.view.textclassifier.TextClassifier$EntityConfig android.view.textclassifier.TextClassifier$Utils +android.view.textclassifier.TextClassifier-IA android.view.textclassifier.TextClassifier android.view.textclassifier.TextClassifierEvent$1 android.view.textclassifier.TextClassifierEvent$Builder android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent$1 -android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent-IA android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent$1 -android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent-IA android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent$1 -android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent-IA android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent android.view.textclassifier.TextClassifierEvent$TextSelectionEvent$1 -android.view.textclassifier.TextClassifierEvent$TextSelectionEvent-IA android.view.textclassifier.TextClassifierEvent$TextSelectionEvent android.view.textclassifier.TextClassifierEvent-IA android.view.textclassifier.TextClassifierEvent @@ -9650,7 +9682,6 @@ android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl$1 android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams$Builder -android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams-IA android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams android.view.textservice.SpellCheckerSession android.view.textservice.SpellCheckerSubtype$1 @@ -9756,12 +9787,9 @@ android.widget.AbsListView$3 android.widget.AbsListView$4 android.widget.AbsListView$AbsPositionScroller android.widget.AbsListView$AdapterDataSetObserver -android.widget.AbsListView$CheckForKeyLongPress-IA android.widget.AbsListView$CheckForKeyLongPress android.widget.AbsListView$CheckForLongPress -android.widget.AbsListView$CheckForTap-IA android.widget.AbsListView$CheckForTap -android.widget.AbsListView$DeviceConfigChangeListener-IA android.widget.AbsListView$DeviceConfigChangeListener android.widget.AbsListView$FlingRunnable$1 android.widget.AbsListView$FlingRunnable @@ -9771,7 +9799,6 @@ android.widget.AbsListView$ListItemAccessibilityDelegate android.widget.AbsListView$MultiChoiceModeListener android.widget.AbsListView$MultiChoiceModeWrapper android.widget.AbsListView$OnScrollListener -android.widget.AbsListView$PerformClick-IA android.widget.AbsListView$PerformClick android.widget.AbsListView$PositionScroller android.widget.AbsListView$RecycleBin @@ -9779,8 +9806,8 @@ android.widget.AbsListView$RecyclerListener android.widget.AbsListView$SavedState$1 android.widget.AbsListView$SavedState android.widget.AbsListView$SelectionBoundsAdjuster -android.widget.AbsListView$WindowRunnnable-IA android.widget.AbsListView$WindowRunnnable +android.widget.AbsListView-IA android.widget.AbsListView android.widget.AbsSeekBar android.widget.AbsSpinner$RecycleBin @@ -9816,13 +9843,11 @@ android.widget.AdapterView android.widget.ArrayAdapter android.widget.AutoCompleteTextView$$ExternalSyntheticLambda0 android.widget.AutoCompleteTextView$$ExternalSyntheticLambda1 -android.widget.AutoCompleteTextView$DropDownItemClickListener-IA android.widget.AutoCompleteTextView$DropDownItemClickListener -android.widget.AutoCompleteTextView$MyWatcher-IA android.widget.AutoCompleteTextView$MyWatcher -android.widget.AutoCompleteTextView$PassThroughClickListener-IA android.widget.AutoCompleteTextView$PassThroughClickListener android.widget.AutoCompleteTextView$Validator +android.widget.AutoCompleteTextView-IA android.widget.AutoCompleteTextView android.widget.BaseAdapter android.widget.Button @@ -9850,21 +9875,16 @@ android.widget.Editor$1 android.widget.Editor$2 android.widget.Editor$3 android.widget.Editor$5 -android.widget.Editor$AccessibilitySmartActions-IA android.widget.Editor$AccessibilitySmartActions -android.widget.Editor$Blink-IA android.widget.Editor$Blink android.widget.Editor$CorrectionHighlighter -android.widget.Editor$CursorAnchorInfoNotifier-IA android.widget.Editor$CursorAnchorInfoNotifier android.widget.Editor$CursorController android.widget.Editor$EasyEditDeleteListener -android.widget.Editor$EasyEditPopupWindow-IA android.widget.Editor$EasyEditPopupWindow android.widget.Editor$EditOperation$1 android.widget.Editor$EditOperation android.widget.Editor$ErrorPopup -android.widget.Editor$HandleView-IA android.widget.Editor$HandleView android.widget.Editor$InputContentType android.widget.Editor$InputMethodState @@ -9875,24 +9895,20 @@ android.widget.Editor$InsertionPointCursorController$1 android.widget.Editor$InsertionPointCursorController android.widget.Editor$MagnifierMotionAnimator android.widget.Editor$PinnedPopupWindow -android.widget.Editor$PositionListener-IA android.widget.Editor$PositionListener -android.widget.Editor$ProcessTextIntentActionsHandler-IA android.widget.Editor$ProcessTextIntentActionsHandler android.widget.Editor$SelectionHandleView android.widget.Editor$SelectionModifierCursorController android.widget.Editor$SpanController$1 android.widget.Editor$SpanController$2 -android.widget.Editor$SpanController-IA android.widget.Editor$SpanController -android.widget.Editor$SuggestionHelper$SuggestionSpanComparator-IA android.widget.Editor$SuggestionHelper$SuggestionSpanComparator -android.widget.Editor$SuggestionHelper-IA android.widget.Editor$SuggestionHelper android.widget.Editor$SuggestionsPopupWindow android.widget.Editor$TextRenderNode android.widget.Editor$TextViewPositionListener android.widget.Editor$UndoInputFilter +android.widget.Editor-IA android.widget.Editor android.widget.EditorTouchState android.widget.FastScroller$1 @@ -9907,8 +9923,8 @@ android.widget.Filter$FilterListener android.widget.Filter$FilterResults android.widget.Filter$RequestArguments android.widget.Filter$RequestHandler -android.widget.Filter$ResultsHandler-IA android.widget.Filter$ResultsHandler +android.widget.Filter-IA android.widget.Filter android.widget.Filterable android.widget.ForwardingListener @@ -9927,15 +9943,14 @@ android.widget.GridLayout$Alignment android.widget.GridLayout$Arc android.widget.GridLayout$Assoc android.widget.GridLayout$Axis$1 -android.widget.GridLayout$Axis-IA android.widget.GridLayout$Axis android.widget.GridLayout$Bounds android.widget.GridLayout$Interval android.widget.GridLayout$LayoutParams android.widget.GridLayout$MutableInt -android.widget.GridLayout$PackedMap-IA android.widget.GridLayout$PackedMap android.widget.GridLayout$Spec +android.widget.GridLayout-IA android.widget.GridLayout android.widget.HeaderViewListAdapter android.widget.HorizontalScrollView$SavedState$1 @@ -9948,22 +9963,17 @@ android.widget.ImageView android.widget.LinearLayout$LayoutParams android.widget.LinearLayout android.widget.ListAdapter -android.widget.ListPopupWindow$ListSelectorHider-IA android.widget.ListPopupWindow$ListSelectorHider -android.widget.ListPopupWindow$PopupDataSetObserver-IA android.widget.ListPopupWindow$PopupDataSetObserver -android.widget.ListPopupWindow$PopupScrollListener-IA android.widget.ListPopupWindow$PopupScrollListener -android.widget.ListPopupWindow$PopupTouchInterceptor-IA android.widget.ListPopupWindow$PopupTouchInterceptor -android.widget.ListPopupWindow$ResizePopupRunnable-IA android.widget.ListPopupWindow$ResizePopupRunnable +android.widget.ListPopupWindow-IA android.widget.ListPopupWindow -android.widget.ListView$ArrowScrollFocusResult-IA android.widget.ListView$ArrowScrollFocusResult android.widget.ListView$FixedViewInfo -android.widget.ListView$FocusSelector-IA android.widget.ListView$FocusSelector +android.widget.ListView-IA android.widget.ListView android.widget.Magnifier$Builder android.widget.Magnifier$InternalPopupWindow @@ -9994,14 +10004,12 @@ android.widget.PopupWindow$PopupDecorView android.widget.PopupWindow android.widget.ProgressBar$1 android.widget.ProgressBar$2 -android.widget.ProgressBar$ProgressTintInfo-IA android.widget.ProgressBar$ProgressTintInfo android.widget.ProgressBar$RefreshData -android.widget.ProgressBar$RefreshProgressRunnable-IA android.widget.ProgressBar$RefreshProgressRunnable android.widget.ProgressBar$SavedState$1 -android.widget.ProgressBar$SavedState-IA android.widget.ProgressBar$SavedState +android.widget.ProgressBar-IA android.widget.ProgressBar android.widget.QuickContactBadge android.widget.RadioButton @@ -10009,19 +10017,21 @@ android.widget.RadioGroup$OnCheckedChangeListener android.widget.RadioGroup android.widget.RatingBar android.widget.RelativeLayout$DependencyGraph$Node -android.widget.RelativeLayout$DependencyGraph-IA android.widget.RelativeLayout$DependencyGraph android.widget.RelativeLayout$LayoutParams android.widget.RelativeLayout$TopToBottomLeftToRightComparator +android.widget.RelativeLayout-IA android.widget.RelativeLayout android.widget.RemoteViews$$ExternalSyntheticLambda0 android.widget.RemoteViews$$ExternalSyntheticLambda1 android.widget.RemoteViews$$ExternalSyntheticLambda2 +android.widget.RemoteViews$$ExternalSyntheticLambda4 +android.widget.RemoteViews$$ExternalSyntheticLambda5 android.widget.RemoteViews$1 android.widget.RemoteViews$2 -android.widget.RemoteViews$Action-IA android.widget.RemoteViews$Action android.widget.RemoteViews$ActionException +android.widget.RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0 android.widget.RemoteViews$ApplicationInfoCache android.widget.RemoteViews$AsyncApplyTask android.widget.RemoteViews$AttributeReflectionAction @@ -10037,6 +10047,7 @@ android.widget.RemoteViews$MethodArgs android.widget.RemoteViews$MethodKey android.widget.RemoteViews$NightModeReflectionAction android.widget.RemoteViews$OnViewAppliedListener +android.widget.RemoteViews$PendingResources android.widget.RemoteViews$ReflectionAction android.widget.RemoteViews$RemoteCollectionCache android.widget.RemoteViews$RemoteCollectionItems$1 @@ -10072,6 +10083,7 @@ android.widget.RemoteViews$ViewGroupActionRemove$1 android.widget.RemoteViews$ViewGroupActionRemove android.widget.RemoteViews$ViewPaddingAction android.widget.RemoteViews$ViewTree +android.widget.RemoteViews-IA android.widget.RemoteViews android.widget.RemoteViewsAdapter$AsyncRemoteAdapterAction android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback @@ -10095,10 +10107,10 @@ android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda2 android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda3 android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda8 android.widget.SelectionActionModeHelper$SelectionMetricsLogger -android.widget.SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable-IA android.widget.SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable android.widget.SelectionActionModeHelper$SelectionTracker android.widget.SelectionActionModeHelper$TextClassificationHelper +android.widget.SelectionActionModeHelper-IA android.widget.SelectionActionModeHelper android.widget.SmartSelectSprite$$ExternalSyntheticLambda0 android.widget.SmartSelectSprite$$ExternalSyntheticLambda1 @@ -10109,11 +10121,10 @@ android.widget.Space android.widget.SpellChecker$1 android.widget.SpellChecker$RemoveReason android.widget.SpellChecker$SentenceIteratorWrapper -android.widget.SpellChecker$SpellParser-IA android.widget.SpellChecker$SpellParser +android.widget.SpellChecker-IA android.widget.SpellChecker android.widget.Spinner$1 -android.widget.Spinner$DialogPopup-IA android.widget.Spinner$DialogPopup android.widget.Spinner$DropDownAdapter android.widget.Spinner$DropdownPopup$1 @@ -10121,6 +10132,7 @@ android.widget.Spinner$DropdownPopup android.widget.Spinner$SavedState$1 android.widget.Spinner$SavedState android.widget.Spinner$SpinnerPopup +android.widget.Spinner-IA android.widget.Spinner android.widget.SpinnerAdapter android.widget.Switch$1 @@ -10145,7 +10157,6 @@ android.widget.TextView$2 android.widget.TextView$3 android.widget.TextView$4 android.widget.TextView$BufferType -android.widget.TextView$ChangeWatcher-IA android.widget.TextView$ChangeWatcher android.widget.TextView$CharWrapper android.widget.TextView$Drawables @@ -10155,23 +10166,22 @@ android.widget.TextView$Marquee$3 android.widget.TextView$Marquee android.widget.TextView$OnEditorActionListener android.widget.TextView$SavedState$1 -android.widget.TextView$SavedState-IA android.widget.TextView$SavedState -android.widget.TextView$TextAppearanceAttributes-IA android.widget.TextView$TextAppearanceAttributes +android.widget.TextView-IA android.widget.TextView -android.widget.TextViewOnReceiveContentListener$InputConnectionInfo-IA android.widget.TextViewOnReceiveContentListener$InputConnectionInfo +android.widget.TextViewOnReceiveContentListener-IA android.widget.TextViewOnReceiveContentListener android.widget.TextViewTranslationCallback android.widget.ThemedSpinnerAdapter android.widget.Toast$Callback android.widget.Toast$CallbackBinder$$ExternalSyntheticLambda0 android.widget.Toast$CallbackBinder$$ExternalSyntheticLambda1 -android.widget.Toast$CallbackBinder-IA android.widget.Toast$CallbackBinder android.widget.Toast$TN$1 android.widget.Toast$TN +android.widget.Toast-IA android.widget.Toast android.widget.ToastPresenter android.widget.ToggleButton @@ -10188,6 +10198,8 @@ android.widget.ViewFlipper$1 android.widget.ViewFlipper android.widget.ViewSwitcher android.widget.WrapperListAdapter +android.widget.flags.FeatureFlags +android.widget.flags.FeatureFlagsImpl android.widget.flags.Flags android.widget.inline.InlinePresentationSpec$1 android.widget.inline.InlinePresentationSpec$BaseBuilder @@ -10203,6 +10215,7 @@ android.window.BackMotionEvent android.window.BackNavigationInfo$1 android.window.BackNavigationInfo android.window.BackProgressAnimator$$ExternalSyntheticLambda0 +android.window.BackProgressAnimator$$ExternalSyntheticLambda1 android.window.BackProgressAnimator$1 android.window.BackProgressAnimator$ProgressCallback android.window.BackProgressAnimator @@ -10259,7 +10272,6 @@ android.window.IWindowContainerTransactionCallback android.window.IWindowOrganizerController$Stub$Proxy android.window.IWindowOrganizerController$Stub android.window.IWindowOrganizerController -android.window.ImeOnBackInvokedDispatcher$$ExternalSyntheticLambda0 android.window.ImeOnBackInvokedDispatcher$1 android.window.ImeOnBackInvokedDispatcher$2 android.window.ImeOnBackInvokedDispatcher$DefaultImeOnBackAnimationCallback @@ -10305,9 +10317,9 @@ android.window.SurfaceSyncGroup$$ExternalSyntheticLambda5 android.window.SurfaceSyncGroup$$ExternalSyntheticLambda6 android.window.SurfaceSyncGroup$1 android.window.SurfaceSyncGroup$2 -android.window.SurfaceSyncGroup$ISurfaceSyncGroupImpl-IA android.window.SurfaceSyncGroup$ISurfaceSyncGroupImpl android.window.SurfaceSyncGroup$SurfaceViewFrameCallback +android.window.SurfaceSyncGroup-IA android.window.SurfaceSyncGroup android.window.TaskAppearedInfo$1 android.window.TaskAppearedInfo @@ -10347,13 +10359,15 @@ android.window.WindowInfosListener android.window.WindowMetricsController$$ExternalSyntheticLambda0 android.window.WindowMetricsController android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda0 +android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda1 +android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda2 android.window.WindowOnBackInvokedDispatcher$Checker android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda1 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4 -android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef +android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper android.window.WindowOnBackInvokedDispatcher android.window.WindowOrganizer$1 @@ -10437,9 +10451,15 @@ com.android.framework.protobuf.nano.InternalNano com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException com.android.framework.protobuf.nano.MessageNano com.android.framework.protobuf.nano.WireFormatNano +com.android.graphics.flags.FeatureFlags +com.android.graphics.flags.FeatureFlagsImpl +com.android.graphics.flags.Flags com.android.graphics.hwui.flags.FeatureFlags com.android.graphics.hwui.flags.FeatureFlagsImpl com.android.graphics.hwui.flags.Flags +com.android.graphics.surfaceflinger.flags.FeatureFlags +com.android.graphics.surfaceflinger.flags.FeatureFlagsImpl +com.android.graphics.surfaceflinger.flags.Flags com.android.i18n.phonenumbers.AlternateFormatsCountryCodeSet com.android.i18n.phonenumbers.AsYouTypeFormatter com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap @@ -10575,6 +10595,7 @@ com.android.icu.util.ExtendedCalendar com.android.icu.util.ExtendedTimeZone com.android.icu.util.Icu4cMetadata com.android.icu.util.LocaleNative +com.android.icu.util.UResourceBundleNative com.android.icu.util.regex.MatcherNative com.android.icu.util.regex.PatternNative com.android.ims.FeatureConnection$$ExternalSyntheticLambda0 @@ -10628,6 +10649,7 @@ com.android.ims.ImsManager$$ExternalSyntheticLambda2 com.android.ims.ImsManager$$ExternalSyntheticLambda3 com.android.ims.ImsManager$$ExternalSyntheticLambda4 com.android.ims.ImsManager$$ExternalSyntheticLambda5 +com.android.ims.ImsManager$$ExternalSyntheticLambda6 com.android.ims.ImsManager$$ExternalSyntheticLambda7 com.android.ims.ImsManager$$ExternalSyntheticLambda8 com.android.ims.ImsManager$$ExternalSyntheticLambda9 @@ -10659,6 +10681,7 @@ com.android.ims.RcsFeatureConnection$RegistrationCallbackManager com.android.ims.RcsFeatureConnection com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda0 com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda1 +com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda2 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda0 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda1 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda2 @@ -10704,6 +10727,7 @@ com.android.ims.internal.IImsRegistrationListener$Stub com.android.ims.internal.IImsRegistrationListener com.android.ims.internal.IImsServiceController$Stub com.android.ims.internal.IImsServiceController +com.android.ims.internal.IImsServiceFeatureCallback$Stub$Proxy com.android.ims.internal.IImsServiceFeatureCallback$Stub com.android.ims.internal.IImsServiceFeatureCallback com.android.ims.internal.IImsStreamMediaSession @@ -10982,7 +11006,6 @@ com.android.internal.app.AlertController$ButtonHandler com.android.internal.app.AlertController$RecycleListView com.android.internal.app.AlertController com.android.internal.app.AssistUtils -com.android.internal.app.IAppOpsActiveCallback$Stub$Proxy com.android.internal.app.IAppOpsActiveCallback$Stub com.android.internal.app.IAppOpsActiveCallback com.android.internal.app.IAppOpsAsyncNotedCallback$Stub @@ -11069,6 +11092,7 @@ com.android.internal.appwidget.IAppWidgetHost com.android.internal.appwidget.IAppWidgetService$Stub$Proxy com.android.internal.appwidget.IAppWidgetService$Stub com.android.internal.appwidget.IAppWidgetService +com.android.internal.backup.IBackupTransport$Stub$Proxy com.android.internal.backup.IBackupTransport$Stub com.android.internal.backup.IBackupTransport com.android.internal.colorextraction.ColorExtractor$GradientColors @@ -11146,6 +11170,7 @@ com.android.internal.dynamicanimation.animation.DynamicAnimation$8 com.android.internal.dynamicanimation.animation.DynamicAnimation$9 com.android.internal.dynamicanimation.animation.DynamicAnimation$MassState com.android.internal.dynamicanimation.animation.DynamicAnimation$OnAnimationEndListener +com.android.internal.dynamicanimation.animation.DynamicAnimation$OnAnimationUpdateListener com.android.internal.dynamicanimation.animation.DynamicAnimation$ViewProperty com.android.internal.dynamicanimation.animation.DynamicAnimation com.android.internal.dynamicanimation.animation.Force @@ -11165,13 +11190,29 @@ com.android.internal.graphics.drawable.BackgroundBlurDrawable$Aggregator com.android.internal.graphics.drawable.BackgroundBlurDrawable$BlurRegion com.android.internal.graphics.drawable.BackgroundBlurDrawable-IA com.android.internal.graphics.drawable.BackgroundBlurDrawable +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.Flags +com.android.internal.hidden_from_bootclasspath.android.app.job.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.app.job.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.app.job.Flags +com.android.internal.hidden_from_bootclasspath.android.content.pm.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.content.pm.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.content.pm.Flags com.android.internal.hidden_from_bootclasspath.android.os.FeatureFlags com.android.internal.hidden_from_bootclasspath.android.os.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.os.Flags +com.android.internal.hidden_from_bootclasspath.android.permission.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.permission.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.permission.flags.Flags com.android.internal.hidden_from_bootclasspath.android.service.notification.FeatureFlags com.android.internal.hidden_from_bootclasspath.android.service.notification.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.service.notification.Flags +com.android.internal.hidden_from_bootclasspath.com.android.libcore.Flags +com.android.internal.hidden_from_bootclasspath.com.android.server.power.optimization.Flags +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.Flags com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService com.android.internal.infra.AbstractRemoteService$AsyncRequest com.android.internal.infra.AbstractRemoteService$BasePendingRequest @@ -11221,6 +11262,7 @@ com.android.internal.inputmethod.IRemoteInputConnection$Stub com.android.internal.inputmethod.IRemoteInputConnection com.android.internal.inputmethod.ImeTracing com.android.internal.inputmethod.ImeTracingClientImpl +com.android.internal.inputmethod.ImeTracingPerfettoImpl com.android.internal.inputmethod.ImeTracingServerImpl com.android.internal.inputmethod.InputBindResult$1 com.android.internal.inputmethod.InputBindResult-IA @@ -11261,8 +11303,8 @@ com.android.internal.jank.InteractionJankMonitor$$ExternalSyntheticLambda9 com.android.internal.jank.InteractionJankMonitor$Configuration com.android.internal.jank.InteractionJankMonitor$RunningTracker com.android.internal.jank.InteractionJankMonitor$TimeFunction -com.android.internal.jank.InteractionJankMonitor$TrackerResult-IA com.android.internal.jank.InteractionJankMonitor$TrackerResult +com.android.internal.jank.InteractionJankMonitor-IA com.android.internal.listeners.ListenerExecutor$$ExternalSyntheticLambda0 com.android.internal.listeners.ListenerExecutor$FailureCallback com.android.internal.listeners.ListenerExecutor$ListenerOperation @@ -11324,8 +11366,8 @@ com.android.internal.os.BinderCallsStats$ExportedCallStat com.android.internal.os.BinderCallsStats$Injector com.android.internal.os.BinderCallsStats$OverflowBinder com.android.internal.os.BinderCallsStats$UidEntry -com.android.internal.os.BinderDeathDispatcher$RecipientsInfo-IA com.android.internal.os.BinderDeathDispatcher$RecipientsInfo +com.android.internal.os.BinderDeathDispatcher-IA com.android.internal.os.BinderDeathDispatcher com.android.internal.os.BinderInternal$BinderProxyCountEventListenerDelegate com.android.internal.os.BinderInternal$CallSession @@ -11346,6 +11388,7 @@ com.android.internal.os.CachedDeviceState$TimeInStateStopwatch com.android.internal.os.CachedDeviceState com.android.internal.os.ClassLoaderFactory com.android.internal.os.Clock +com.android.internal.os.DebugStore com.android.internal.os.FeatureFlags com.android.internal.os.FeatureFlagsImpl com.android.internal.os.Flags @@ -11405,10 +11448,10 @@ com.android.internal.os.LongArrayMultiStateCounter$LongArrayContainer com.android.internal.os.LongArrayMultiStateCounter com.android.internal.os.LongMultiStateCounter$1 com.android.internal.os.LongMultiStateCounter -com.android.internal.os.LooperStats$DispatchSession-IA com.android.internal.os.LooperStats$DispatchSession com.android.internal.os.LooperStats$Entry com.android.internal.os.LooperStats$ExportedEntry +com.android.internal.os.LooperStats-IA com.android.internal.os.LooperStats com.android.internal.os.PowerProfile$CpuClusterKey com.android.internal.os.PowerProfile @@ -11429,9 +11472,9 @@ com.android.internal.os.RuntimeInit$$ExternalSyntheticLambda1 com.android.internal.os.RuntimeInit$ApplicationWtfHandler com.android.internal.os.RuntimeInit$Arguments com.android.internal.os.RuntimeInit$KillApplicationHandler -com.android.internal.os.RuntimeInit$LoggingHandler-IA com.android.internal.os.RuntimeInit$LoggingHandler com.android.internal.os.RuntimeInit$MethodAndArgsCaller +com.android.internal.os.RuntimeInit-IA com.android.internal.os.RuntimeInit com.android.internal.os.SafeZipPathValidatorCallback com.android.internal.os.SomeArgs @@ -11504,12 +11547,12 @@ com.android.internal.policy.PhoneWindow$$ExternalSyntheticLambda1 com.android.internal.policy.PhoneWindow$1 com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1 -com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState-IA com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState com.android.internal.policy.PhoneWindow$PanelFeatureState com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback com.android.internal.policy.PhoneWindow$RotationWatcher$1 com.android.internal.policy.PhoneWindow$RotationWatcher +com.android.internal.policy.PhoneWindow-IA com.android.internal.policy.PhoneWindow com.android.internal.policy.ScreenDecorationsUtils com.android.internal.policy.SystemBarUtils @@ -11524,6 +11567,8 @@ com.android.internal.protolog.ProtoLogViewerConfigReader com.android.internal.protolog.common.BitmaskConversionException com.android.internal.protolog.common.IProtoLogGroup com.android.internal.protolog.common.LogDataType +com.android.internal.ravenwood.RavenwoodEnvironment$Workaround +com.android.internal.ravenwood.RavenwoodEnvironment com.android.internal.security.VerityUtils com.android.internal.statusbar.IAddTileResultCallback com.android.internal.statusbar.IStatusBar$Stub @@ -11763,6 +11808,7 @@ com.android.internal.telephony.IState com.android.internal.telephony.ISub$Stub$Proxy com.android.internal.telephony.ISub$Stub com.android.internal.telephony.ISub +com.android.internal.telephony.ITelephony$Stub$Proxy com.android.internal.telephony.ITelephony$Stub com.android.internal.telephony.ITelephony com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy @@ -11928,6 +11974,7 @@ com.android.internal.telephony.PhoneSubInfoController$$ExternalSyntheticLambda8 com.android.internal.telephony.PhoneSubInfoController$$ExternalSyntheticLambda9 com.android.internal.telephony.PhoneSubInfoController$CallPhoneMethodHelper com.android.internal.telephony.PhoneSubInfoController$PermissionCheckHelper +com.android.internal.telephony.PhoneSubInfoController com.android.internal.telephony.ProxyController$1 com.android.internal.telephony.ProxyController com.android.internal.telephony.RIL$RadioProxyDeathRecipient @@ -12320,6 +12367,7 @@ com.android.internal.telephony.euicc.EuiccController$9 com.android.internal.telephony.euicc.EuiccController$DownloadSubscriptionGetMetadataCommandCallback com.android.internal.telephony.euicc.EuiccController$GetDefaultListCommandCallback com.android.internal.telephony.euicc.EuiccController$GetMetadataCommandCallback +com.android.internal.telephony.euicc.EuiccController com.android.internal.telephony.euicc.EuiccOperation$1 com.android.internal.telephony.euicc.EuiccOperation$Action com.android.internal.telephony.euicc.EuiccOperation @@ -12498,6 +12546,7 @@ com.android.internal.telephony.imsphone.ImsPhoneCallTracker$HoldSwapState com.android.internal.telephony.imsphone.ImsPhoneCallTracker$MmTelFeatureListener com.android.internal.telephony.imsphone.ImsPhoneCallTracker$PhoneStateListener com.android.internal.telephony.imsphone.ImsPhoneCallTracker$SharedPreferenceProxy +com.android.internal.telephony.imsphone.ImsPhoneCallTracker$VtDataUsageProvider com.android.internal.telephony.imsphone.ImsPhoneCallTracker com.android.internal.telephony.imsphone.ImsPhoneCommandInterface com.android.internal.telephony.imsphone.ImsPhoneConnection$$ExternalSyntheticLambda0 @@ -12552,6 +12601,7 @@ com.android.internal.telephony.metrics.PersistAtomsStorage$$ExternalSyntheticLam com.android.internal.telephony.metrics.PersistAtomsStorage$$ExternalSyntheticLambda7 com.android.internal.telephony.metrics.PersistAtomsStorage$1 com.android.internal.telephony.metrics.PersistAtomsStorage +com.android.internal.telephony.metrics.SatelliteStats$CarrierRoamingSatelliteControllerStatsParams com.android.internal.telephony.metrics.ServiceStateStats$$ExternalSyntheticLambda0 com.android.internal.telephony.metrics.ServiceStateStats$TimestampedServiceState com.android.internal.telephony.metrics.ServiceStateStats @@ -12581,6 +12631,8 @@ com.android.internal.telephony.nano.CarrierIdProto$CarrierAttribute com.android.internal.telephony.nano.CarrierIdProto$CarrierId com.android.internal.telephony.nano.CarrierIdProto$CarrierList com.android.internal.telephony.nano.PersistAtomsProto$CarrierIdMismatch +com.android.internal.telephony.nano.PersistAtomsProto$CarrierRoamingSatelliteControllerStats +com.android.internal.telephony.nano.PersistAtomsProto$CarrierRoamingSatelliteSession com.android.internal.telephony.nano.PersistAtomsProto$CellularDataServiceSwitch com.android.internal.telephony.nano.PersistAtomsProto$CellularServiceState com.android.internal.telephony.nano.PersistAtomsProto$DataCallSession @@ -12602,7 +12654,10 @@ com.android.internal.telephony.nano.PersistAtomsProto$PersistAtoms com.android.internal.telephony.nano.PersistAtomsProto$PresenceNotifyEvent com.android.internal.telephony.nano.PersistAtomsProto$RcsAcsProvisioningStats com.android.internal.telephony.nano.PersistAtomsProto$RcsClientProvisioningStats +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteAccessController +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteConfigUpdater com.android.internal.telephony.nano.PersistAtomsProto$SatelliteController +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteEntitlement com.android.internal.telephony.nano.PersistAtomsProto$SatelliteIncomingDatagram com.android.internal.telephony.nano.PersistAtomsProto$SatelliteOutgoingDatagram com.android.internal.telephony.nano.PersistAtomsProto$SatelliteProvision @@ -13026,8 +13081,9 @@ com.android.internal.util.DumpUtils com.android.internal.util.EmergencyAffordanceManager com.android.internal.util.ExponentiallyBucketedHistogram com.android.internal.util.FastMath -com.android.internal.util.FastPrintWriter$DummyWriter-IA com.android.internal.util.FastPrintWriter$DummyWriter +com.android.internal.util.FastPrintWriter-IA +com.android.internal.util.FastPrintWriter com.android.internal.util.FastXmlSerializer com.android.internal.util.FileRotator$FileInfo com.android.internal.util.FileRotator$Reader @@ -13048,6 +13104,7 @@ com.android.internal.util.HeavyHitterSketch com.android.internal.util.HexDump com.android.internal.util.IState com.android.internal.util.ImageUtils +com.android.internal.util.IndentingPrintWriter com.android.internal.util.IntPair com.android.internal.util.JournaledFile com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda0 @@ -13055,10 +13112,10 @@ com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda1 com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda2 com.android.internal.util.LatencyTracker$Action com.android.internal.util.LatencyTracker$ActionProperties -com.android.internal.util.LatencyTracker$FrameworkStatsLogEvent-IA com.android.internal.util.LatencyTracker$FrameworkStatsLogEvent com.android.internal.util.LatencyTracker$Session$$ExternalSyntheticLambda0 com.android.internal.util.LatencyTracker$Session +com.android.internal.util.LatencyTracker-IA com.android.internal.util.LineBreakBufferedWriter com.android.internal.util.LocalLog com.android.internal.util.MemInfoReader @@ -13084,6 +13141,8 @@ com.android.internal.util.ProcFileReader com.android.internal.util.ProgressReporter com.android.internal.util.ProviderAccessStats$PerThreadData com.android.internal.util.ProviderAccessStats +com.android.internal.util.RateLimitingCache$ValueFetcher +com.android.internal.util.RateLimitingCache com.android.internal.util.RingBuffer$$ExternalSyntheticLambda0 com.android.internal.util.RingBuffer$$ExternalSyntheticLambda1 com.android.internal.util.RingBuffer @@ -13094,22 +13153,18 @@ com.android.internal.util.ScreenshotHelper com.android.internal.util.StatLogger com.android.internal.util.State com.android.internal.util.StateMachine$LogRec -com.android.internal.util.StateMachine$LogRecords-IA com.android.internal.util.StateMachine$LogRecords -com.android.internal.util.StateMachine$SmHandler$HaltingState-IA com.android.internal.util.StateMachine$SmHandler$HaltingState -com.android.internal.util.StateMachine$SmHandler$QuittingState-IA com.android.internal.util.StateMachine$SmHandler$QuittingState com.android.internal.util.StateMachine$SmHandler$StateInfo -com.android.internal.util.StateMachine$SmHandler-IA com.android.internal.util.StateMachine$SmHandler +com.android.internal.util.StateMachine-IA com.android.internal.util.StateMachine com.android.internal.util.StringPool com.android.internal.util.SyncResultReceiver$TimeoutException com.android.internal.util.SyncResultReceiver com.android.internal.util.ToBooleanFunction com.android.internal.util.TokenBucket -com.android.internal.util.TraceBuffer$ProtoOutputStreamProvider-IA com.android.internal.util.TraceBuffer$ProtoOutputStreamProvider com.android.internal.util.TraceBuffer$ProtoProvider com.android.internal.util.TraceBuffer @@ -13323,6 +13378,7 @@ com.android.net.module.util.NetworkCapabilitiesUtils com.android.net.module.util.NetworkIdentityUtils com.android.net.module.util.NetworkStackConstants com.android.net.module.util.ProxyUtils +com.android.nfc.x.android.nfc.Flags com.android.phone.ecc.nano.CodedInputByteBufferNano com.android.phone.ecc.nano.CodedOutputByteBufferNano$OutOfSpaceException com.android.phone.ecc.nano.CodedOutputByteBufferNano @@ -13348,9 +13404,9 @@ com.android.server.am.nano.Capabilities com.android.server.am.nano.Capability com.android.server.am.nano.FrameworkCapability com.android.server.am.nano.VMCapability +com.android.server.am.nano.VMInfo com.android.server.backup.AccountManagerBackupHelper com.android.server.backup.AccountSyncSettingsBackupHelper -com.android.server.backup.NotificationBackupHelper com.android.server.backup.PermissionBackupHelper com.android.server.backup.PreferredActivityBackupHelper com.android.server.backup.ShortcutBackupHelper @@ -13386,6 +13442,7 @@ com.android.server.criticalevents.nano.CriticalEventProto$Watchdog com.android.server.job.JobSchedulerInternal$JobStorePersistStats com.android.server.net.BaseNetdEventCallback com.android.server.net.BaseNetworkObserver +com.android.server.ondeviceintelligence.nano.InferenceInfo com.android.server.sip.SipHelper com.android.server.sip.SipService$ConnectivityReceiver$1 com.android.server.sip.SipService$ConnectivityReceiver @@ -13461,9 +13518,6 @@ com.android.telephony.Rlog com.android.text.flags.FeatureFlags com.android.text.flags.FeatureFlagsImpl com.android.text.flags.Flags -com.android.window.flags.FeatureFlags -com.android.window.flags.FeatureFlagsImpl -com.android.window.flags.Flags com.google.android.collect.Lists com.google.android.collect.Maps com.google.android.collect.Sets diff --git a/config/preloaded-classes b/config/preloaded-classes index fe3e0e4bbd20..ed402767ee64 100644 --- a/config/preloaded-classes +++ b/config/preloaded-classes @@ -56,13 +56,13 @@ android.accounts.AccountManager$5 android.accounts.AccountManager$8 android.accounts.AccountManager$AccountKeyData android.accounts.AccountManager$AmsTask$1 -android.accounts.AccountManager$AmsTask$Response-IA android.accounts.AccountManager$AmsTask$Response android.accounts.AccountManager$AmsTask android.accounts.AccountManager$BaseFutureTask$1 android.accounts.AccountManager$BaseFutureTask android.accounts.AccountManager$Future2Task$1 android.accounts.AccountManager$Future2Task +android.accounts.AccountManager-IA android.accounts.AccountManager android.accounts.AccountManagerCallback android.accounts.AccountManagerFuture @@ -86,13 +86,20 @@ android.accounts.IAccountManagerResponse android.accounts.NetworkErrorException android.accounts.OnAccountsUpdateListener android.accounts.OperationCanceledException +android.aconfig.nano.Aconfig$flag_declaration +android.aconfig.nano.Aconfig$flag_declarations +android.aconfig.nano.Aconfig$flag_value +android.aconfig.nano.Aconfig$flag_values +android.aconfig.nano.Aconfig$parsed_flag +android.aconfig.nano.Aconfig$parsed_flags +android.aconfig.nano.Aconfig$tracepoint android.animation.AnimationHandler$$ExternalSyntheticLambda0 android.animation.AnimationHandler$1 android.animation.AnimationHandler$2 android.animation.AnimationHandler$AnimationFrameCallback android.animation.AnimationHandler$AnimationFrameCallbackProvider -android.animation.AnimationHandler$MyFrameCallbackProvider-IA android.animation.AnimationHandler$MyFrameCallbackProvider +android.animation.AnimationHandler-IA android.animation.AnimationHandler android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda0 android.animation.Animator$AnimatorCaller$$ExternalSyntheticLambda1 @@ -106,8 +113,8 @@ android.animation.Animator$AnimatorConstantState android.animation.Animator$AnimatorListener android.animation.Animator$AnimatorPauseListener android.animation.Animator -android.animation.AnimatorInflater$PathDataEvaluator-IA android.animation.AnimatorInflater$PathDataEvaluator +android.animation.AnimatorInflater-IA android.animation.AnimatorInflater android.animation.AnimatorListenerAdapter android.animation.AnimatorSet$$ExternalSyntheticLambda0 @@ -118,8 +125,8 @@ android.animation.AnimatorSet$3 android.animation.AnimatorSet$AnimationEvent android.animation.AnimatorSet$Builder android.animation.AnimatorSet$Node -android.animation.AnimatorSet$SeekState-IA android.animation.AnimatorSet$SeekState +android.animation.AnimatorSet-IA android.animation.AnimatorSet android.animation.ArgbEvaluator android.animation.BidirectionalTypeConverter @@ -150,8 +157,8 @@ android.animation.PathKeyframes$3 android.animation.PathKeyframes$4 android.animation.PathKeyframes$FloatKeyframesBase android.animation.PathKeyframes$IntKeyframesBase -android.animation.PathKeyframes$SimpleKeyframes-IA android.animation.PathKeyframes$SimpleKeyframes +android.animation.PathKeyframes-IA android.animation.PathKeyframes android.animation.PropertyValuesHolder$1 android.animation.PropertyValuesHolder$FloatPropertyValuesHolder @@ -164,8 +171,8 @@ android.animation.RectEvaluator android.animation.RevealAnimator android.animation.StateListAnimator$1 android.animation.StateListAnimator$StateListAnimatorConstantState -android.animation.StateListAnimator$Tuple-IA android.animation.StateListAnimator$Tuple +android.animation.StateListAnimator-IA android.animation.StateListAnimator android.animation.TimeAnimator$TimeListener android.animation.TimeAnimator @@ -198,19 +205,22 @@ android.app.Activity$$ExternalSyntheticLambda0 android.app.Activity$1 android.app.Activity$HostCallbacks android.app.Activity$ManagedCursor -android.app.Activity$ManagedDialog-IA android.app.Activity$ManagedDialog android.app.Activity$NonConfigurationInstances android.app.Activity$RequestFinishCallback android.app.Activity$TranslucentConversionListener +android.app.Activity-IA android.app.Activity android.app.ActivityClient$1 -android.app.ActivityClient$ActivityClientControllerSingleton-IA android.app.ActivityClient$ActivityClientControllerSingleton android.app.ActivityClient-IA android.app.ActivityClient -android.app.ActivityManager$2 +android.app.ActivityManager$$ExternalSyntheticLambda0 +android.app.ActivityManager$$ExternalSyntheticLambda1 +android.app.ActivityManager$$ExternalSyntheticLambda2 +android.app.ActivityManager$1 android.app.ActivityManager$3 +android.app.ActivityManager$4 android.app.ActivityManager$AppTask android.app.ActivityManager$MemoryInfo$1 android.app.ActivityManager$MemoryInfo @@ -222,20 +232,16 @@ android.app.ActivityManager$ProcessErrorStateInfo$1 android.app.ActivityManager$ProcessErrorStateInfo android.app.ActivityManager$RecentTaskInfo$1 android.app.ActivityManager$RecentTaskInfo$PersistedTaskSnapshotData -android.app.ActivityManager$RecentTaskInfo-IA android.app.ActivityManager$RecentTaskInfo android.app.ActivityManager$RunningAppProcessInfo$1 -android.app.ActivityManager$RunningAppProcessInfo-IA android.app.ActivityManager$RunningAppProcessInfo android.app.ActivityManager$RunningServiceInfo$1 -android.app.ActivityManager$RunningServiceInfo-IA android.app.ActivityManager$RunningServiceInfo android.app.ActivityManager$RunningTaskInfo$1 -android.app.ActivityManager$RunningTaskInfo-IA android.app.ActivityManager$RunningTaskInfo android.app.ActivityManager$TaskDescription$1 -android.app.ActivityManager$TaskDescription-IA android.app.ActivityManager$TaskDescription +android.app.ActivityManager-IA android.app.ActivityManager android.app.ActivityManagerInternal android.app.ActivityOptions$1 @@ -268,7 +274,6 @@ android.app.ActivityThread$ActivityClientRecord android.app.ActivityThread$AppBindData android.app.ActivityThread$ApplicationThread$$ExternalSyntheticLambda2 android.app.ActivityThread$ApplicationThread$1 -android.app.ActivityThread$ApplicationThread-IA android.app.ActivityThread$BindServiceData android.app.ActivityThread$ContextCleanupInfo android.app.ActivityThread$CreateBackupAgentData @@ -278,7 +283,6 @@ android.app.ActivityThread$DumpHeapData android.app.ActivityThread$DumpResourcesData android.app.ActivityThread$GcIdler android.app.ActivityThread$H -android.app.ActivityThread$Idler-IA android.app.ActivityThread$Idler android.app.ActivityThread$Profiler android.app.ActivityThread$ProviderClientRecord @@ -290,6 +294,7 @@ android.app.ActivityThread$RequestAssistContextExtras android.app.ActivityThread$SafeCancellationTransport android.app.ActivityThread$ServiceArgsData android.app.ActivityThread$UpdateCompatibilityData +android.app.ActivityThread-IA android.app.ActivityThread android.app.ActivityThreadInternal android.app.ActivityTransitionCoordinator @@ -360,6 +365,7 @@ android.app.AppOpsManager android.app.AppOpsManagerInternal android.app.Application$ActivityLifecycleCallbacks android.app.Application$OnProvideAssistDataListener +android.app.Application android.app.ApplicationErrorReport$1 android.app.ApplicationErrorReport$AnrInfo android.app.ApplicationErrorReport$BatteryInfo @@ -371,8 +377,8 @@ android.app.ApplicationErrorReport android.app.ApplicationExitInfo$1 android.app.ApplicationExitInfo-IA android.app.ApplicationExitInfo -android.app.ApplicationLoaders$CachedClassLoader-IA android.app.ApplicationLoaders$CachedClassLoader +android.app.ApplicationLoaders-IA android.app.ApplicationLoaders android.app.ApplicationPackageManager$$ExternalSyntheticLambda1 android.app.ApplicationPackageManager$$ExternalSyntheticLambda2 @@ -395,6 +401,8 @@ android.app.BackgroundInstallControlManager android.app.BackgroundServiceStartNotAllowedException$1 android.app.BackgroundServiceStartNotAllowedException android.app.BroadcastOptions +android.app.BroadcastStickyCache +android.app.CameraCompatTaskInfo$1 android.app.CameraCompatTaskInfo android.app.ClientTransactionHandler android.app.ComponentCaller @@ -499,7 +507,6 @@ android.app.IAssistDataReceiver android.app.IBackupAgent$Stub$Proxy android.app.IBackupAgent$Stub android.app.IBackupAgent -android.app.ICompatCameraControlCallback android.app.IForegroundServiceObserver$Stub$Proxy android.app.IForegroundServiceObserver$Stub android.app.IForegroundServiceObserver @@ -594,14 +601,13 @@ android.app.ListActivity android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0 android.app.LoadedApk$ReceiverDispatcher$Args android.app.LoadedApk$ReceiverDispatcher -android.app.LoadedApk$ServiceDispatcher$ConnectionInfo-IA android.app.LoadedApk$ServiceDispatcher$ConnectionInfo android.app.LoadedApk$ServiceDispatcher$DeathMonitor android.app.LoadedApk$ServiceDispatcher$RunConnection android.app.LoadedApk$ServiceDispatcher android.app.LoadedApk$SplitDependencyLoaderImpl -android.app.LoadedApk$WarningContextClassLoader-IA android.app.LoadedApk$WarningContextClassLoader +android.app.LoadedApk-IA android.app.LoadedApk android.app.LoaderManager$LoaderCallbacks android.app.LoaderManager @@ -615,13 +621,11 @@ android.app.Notification$$ExternalSyntheticLambda0 android.app.Notification$1 android.app.Notification$Action$1 android.app.Notification$Action$Builder -android.app.Notification$Action-IA android.app.Notification$Action android.app.Notification$BigPictureStyle android.app.Notification$BigTextStyle android.app.Notification$BubbleMetadata$1 android.app.Notification$BubbleMetadata$Builder -android.app.Notification$BubbleMetadata-IA android.app.Notification$BubbleMetadata android.app.Notification$Builder android.app.Notification$BuilderRemoteViews @@ -634,12 +638,12 @@ android.app.Notification$InboxStyle android.app.Notification$MediaStyle android.app.Notification$MessagingStyle$Message android.app.Notification$MessagingStyle -android.app.Notification$StandardTemplateParams-IA android.app.Notification$StandardTemplateParams android.app.Notification$Style android.app.Notification$TemplateBindResult$MarginSet android.app.Notification$TemplateBindResult android.app.Notification$TvExtender +android.app.Notification-IA android.app.Notification android.app.NotificationChannel$1 android.app.NotificationChannel @@ -658,7 +662,6 @@ android.app.PackageInstallObserver android.app.PendingIntent$$ExternalSyntheticLambda0 android.app.PendingIntent$$ExternalSyntheticLambda1 android.app.PendingIntent$$ExternalSyntheticLambda2 -android.app.PendingIntent$$ExternalSyntheticLambda3 android.app.PendingIntent$1 android.app.PendingIntent$CancelListener android.app.PendingIntent$CanceledException @@ -666,7 +669,6 @@ android.app.PendingIntent$OnFinished android.app.PendingIntent$OnMarshaledListener android.app.PendingIntent android.app.Person$1 -android.app.Person$Builder-IA android.app.Person$Builder android.app.Person-IA android.app.Person @@ -704,15 +706,14 @@ android.app.RemoteInputHistoryItem android.app.RemoteServiceException android.app.ResourcesManager$$ExternalSyntheticLambda0 android.app.ResourcesManager$$ExternalSyntheticLambda1 -android.app.ResourcesManager$ActivityResource-IA android.app.ResourcesManager$ActivityResource -android.app.ResourcesManager$ActivityResources-IA android.app.ResourcesManager$ActivityResources android.app.ResourcesManager$ApkAssetsSupplier android.app.ResourcesManager$ApkKey +android.app.ResourcesManager$PathCollector android.app.ResourcesManager$SharedLibraryAssets -android.app.ResourcesManager$UpdateHandler-IA android.app.ResourcesManager$UpdateHandler +android.app.ResourcesManager-IA android.app.ResourcesManager android.app.ResultInfo$1 android.app.ResultInfo @@ -738,9 +739,10 @@ android.app.SharedPreferencesImpl$1 android.app.SharedPreferencesImpl$EditorImpl$$ExternalSyntheticLambda0 android.app.SharedPreferencesImpl$EditorImpl$1 android.app.SharedPreferencesImpl$EditorImpl$2 -android.app.SharedPreferencesImpl$MemoryCommitResult-IA +android.app.SharedPreferencesImpl$EditorImpl android.app.SharedPreferencesImpl$MemoryCommitResult android.app.SharedPreferencesImpl$SharedPreferencesThreadFactory +android.app.SharedPreferencesImpl-IA android.app.StackTrace android.app.StatusBarManager android.app.SyncNotedAppOp$1 @@ -797,6 +799,8 @@ android.app.SystemServiceRegistry$143 android.app.SystemServiceRegistry$144 android.app.SystemServiceRegistry$145 android.app.SystemServiceRegistry$146 +android.app.SystemServiceRegistry$147 +android.app.SystemServiceRegistry$148 android.app.SystemServiceRegistry$14 android.app.SystemServiceRegistry$15 android.app.SystemServiceRegistry$16 @@ -906,8 +910,8 @@ android.app.UiModeManager$1 android.app.UiModeManager$Globals android.app.UiModeManager$InnerListener android.app.UiModeManager$OnProjectionStateChangedListener -android.app.UiModeManager$OnProjectionStateChangedListenerResourceManager-IA android.app.UiModeManager$OnProjectionStateChangedListenerResourceManager +android.app.UiModeManager-IA android.app.UiModeManager android.app.UidObserver android.app.UriGrantsManager$1 @@ -1019,17 +1023,17 @@ android.app.assist.AssistStructure$ViewNodeText android.app.assist.AssistStructure$ViewStackEntry android.app.assist.AssistStructure$WindowNode android.app.assist.AssistStructure -android.app.backup.BackupAgent$BackupServiceBinder-IA android.app.backup.BackupAgent$BackupServiceBinder android.app.backup.BackupAgent$SharedPrefsSynchronizer +android.app.backup.BackupAgent-IA android.app.backup.BackupAgent android.app.backup.BackupAgentHelper android.app.backup.BackupDataInput$EntityHeader android.app.backup.BackupDataInput android.app.backup.BackupDataOutput android.app.backup.BackupHelper -android.app.backup.BackupHelperDispatcher$Header-IA android.app.backup.BackupHelperDispatcher$Header +android.app.backup.BackupHelperDispatcher-IA android.app.backup.BackupHelperDispatcher android.app.backup.BackupHelperWithLogger android.app.backup.BackupManager$BackupObserverWrapper$1 @@ -1117,11 +1121,11 @@ android.app.job.IUserVisibleJobObserver android.app.job.JobInfo$1 android.app.job.JobInfo$Builder android.app.job.JobInfo$TriggerContentUri$1 -android.app.job.JobInfo$TriggerContentUri-IA android.app.job.JobInfo$TriggerContentUri android.app.job.JobInfo-IA android.app.job.JobInfo android.app.job.JobParameters$1 +android.app.job.JobParameters$JobCleanupCallback android.app.job.JobParameters-IA android.app.job.JobParameters android.app.job.JobScheduler @@ -1195,8 +1199,6 @@ android.app.servertransaction.LaunchActivityItem android.app.servertransaction.NewIntentItem$1 android.app.servertransaction.NewIntentItem-IA android.app.servertransaction.NewIntentItem -android.app.servertransaction.ObjectPool -android.app.servertransaction.ObjectPoolItem android.app.servertransaction.PauseActivityItem$1 android.app.servertransaction.PauseActivityItem-IA android.app.servertransaction.PauseActivityItem @@ -1216,6 +1218,7 @@ android.app.servertransaction.TopResumedActivityChangeItem-IA android.app.servertransaction.TopResumedActivityChangeItem android.app.servertransaction.TransactionExecutor android.app.servertransaction.TransactionExecutorHelper +android.app.servertransaction.WindowStateTransactionItem$TransactionListener android.app.slice.ISliceManager$Stub$Proxy android.app.slice.ISliceManager$Stub android.app.slice.ISliceManager @@ -1267,6 +1270,7 @@ android.app.smartspace.uitemplatedata.TapAction$1 android.app.smartspace.uitemplatedata.TapAction android.app.smartspace.uitemplatedata.Text$1 android.app.smartspace.uitemplatedata.Text +android.app.supervision.SupervisionManager android.app.time.ITimeZoneDetectorListener$Stub$Proxy android.app.time.ITimeZoneDetectorListener$Stub android.app.time.ITimeZoneDetectorListener @@ -1389,6 +1393,7 @@ android.companion.virtual.IVirtualDevice android.companion.virtual.IVirtualDeviceManager$Stub$Proxy android.companion.virtual.IVirtualDeviceManager$Stub android.companion.virtual.IVirtualDeviceManager +android.companion.virtual.VirtualDevice$1 android.companion.virtual.VirtualDevice android.companion.virtual.VirtualDeviceManager android.companion.virtual.flags.FeatureFlags @@ -1398,10 +1403,9 @@ android.compat.Compatibility$1 android.compat.Compatibility$BehaviorChangeDelegate android.compat.Compatibility$ChangeConfig android.compat.Compatibility -android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl-IA android.content.AbstractThreadedSyncAdapter$ISyncAdapterImpl -android.content.AbstractThreadedSyncAdapter$SyncThread-IA android.content.AbstractThreadedSyncAdapter$SyncThread +android.content.AbstractThreadedSyncAdapter-IA android.content.AbstractThreadedSyncAdapter android.content.ActivityNotFoundException android.content.ApexEnvironment @@ -1421,8 +1425,8 @@ android.content.BroadcastReceiver$PendingResult$1 android.content.BroadcastReceiver$PendingResult android.content.BroadcastReceiver android.content.ClipData$1 -android.content.ClipData$Item-IA android.content.ClipData$Item +android.content.ClipData-IA android.content.ClipData android.content.ClipDescription$1 android.content.ClipDescription @@ -1450,14 +1454,13 @@ android.content.ContentProvider$PipeDataWriter android.content.ContentProvider$Transport android.content.ContentProvider android.content.ContentProviderClient$CursorWrapperInner -android.content.ContentProviderClient$NotRespondingRunnable-IA android.content.ContentProviderClient$NotRespondingRunnable +android.content.ContentProviderClient-IA android.content.ContentProviderClient android.content.ContentProviderNative android.content.ContentProviderOperation$1 android.content.ContentProviderOperation$BackReference$1 android.content.ContentProviderOperation$BackReference -android.content.ContentProviderOperation$Builder-IA android.content.ContentProviderOperation$Builder android.content.ContentProviderOperation-IA android.content.ContentProviderOperation @@ -1467,11 +1470,10 @@ android.content.ContentResolver$1 android.content.ContentResolver$2 android.content.ContentResolver$OpenResourceIdResult android.content.ContentResolver$ParcelFileDescriptorInner -android.content.ContentResolver$ResultListener-IA android.content.ContentResolver$ResultListener -android.content.ContentResolver$StringResultListener-IA android.content.ContentResolver$StringResultListener android.content.ContentResolver$UriResultListener +android.content.ContentResolver-IA android.content.ContentResolver android.content.ContentUris android.content.ContentValues$1 @@ -1739,11 +1741,11 @@ android.content.pm.LauncherApps$1 android.content.pm.LauncherApps$AppUsageLimit$1 android.content.pm.LauncherApps$AppUsageLimit android.content.pm.LauncherApps$Callback -android.content.pm.LauncherApps$CallbackMessageHandler$CallbackInfo-IA android.content.pm.LauncherApps$CallbackMessageHandler$CallbackInfo android.content.pm.LauncherApps$CallbackMessageHandler android.content.pm.LauncherApps$ShortcutQuery$QueryFlags android.content.pm.LauncherApps$ShortcutQuery +android.content.pm.LauncherApps-IA android.content.pm.LauncherApps android.content.pm.ModuleInfo$1 android.content.pm.ModuleInfo-IA @@ -1787,7 +1789,6 @@ android.content.pm.PackageManager$Property android.content.pm.PackageManager$ResolveInfoFlags android.content.pm.PackageManager android.content.pm.PackageParser$Activity$1 -android.content.pm.PackageParser$Activity-IA android.content.pm.PackageParser$Activity android.content.pm.PackageParser$ActivityIntentInfo android.content.pm.PackageParser$ApkLite @@ -1807,16 +1808,13 @@ android.content.pm.PackageParser$PackageParserException android.content.pm.PackageParser$ParseComponentArgs android.content.pm.PackageParser$ParsePackageItemArgs android.content.pm.PackageParser$Permission$1 -android.content.pm.PackageParser$Permission-IA android.content.pm.PackageParser$Permission android.content.pm.PackageParser$PermissionGroup$1 android.content.pm.PackageParser$PermissionGroup android.content.pm.PackageParser$Provider$1 -android.content.pm.PackageParser$Provider-IA android.content.pm.PackageParser$Provider android.content.pm.PackageParser$ProviderIntentInfo android.content.pm.PackageParser$Service$1 -android.content.pm.PackageParser$Service-IA android.content.pm.PackageParser$Service android.content.pm.PackageParser$ServiceIntentInfo android.content.pm.PackageParser$SigningDetails$1 @@ -1825,6 +1823,7 @@ android.content.pm.PackageParser$SigningDetails android.content.pm.PackageParser$SplitAssetLoader android.content.pm.PackageParser$SplitDependencyLoader$IllegalDependencyException android.content.pm.PackageParser$SplitNameComparator +android.content.pm.PackageParser-IA android.content.pm.PackageParser android.content.pm.PackageParserCacheHelper$ReadHelper android.content.pm.PackageParserCacheHelper$WriteHelper @@ -1949,7 +1948,6 @@ android.content.res.ApkAssets android.content.res.AssetFileDescriptor$1 android.content.res.AssetFileDescriptor$AutoCloseInputStream android.content.res.AssetFileDescriptor -android.content.res.AssetManager$AssetInputStream-IA android.content.res.AssetManager$AssetInputStream android.content.res.AssetManager$Builder android.content.res.AssetManager-IA @@ -1991,19 +1989,20 @@ android.content.res.ResourceTimer$Config android.content.res.ResourceTimer$Timer android.content.res.ResourceTimer android.content.res.Resources$$ExternalSyntheticLambda0 +android.content.res.Resources$$ExternalSyntheticLambda1 android.content.res.Resources$AssetManagerUpdateHandler android.content.res.Resources$NotFoundException -android.content.res.Resources$Theme-IA android.content.res.Resources$Theme android.content.res.Resources$ThemeKey android.content.res.Resources$UpdateCallbacks +android.content.res.Resources-IA android.content.res.Resources android.content.res.ResourcesImpl$$ExternalSyntheticLambda0 android.content.res.ResourcesImpl$$ExternalSyntheticLambda1 android.content.res.ResourcesImpl$$ExternalSyntheticLambda2 -android.content.res.ResourcesImpl$LookupStack-IA android.content.res.ResourcesImpl$LookupStack android.content.res.ResourcesImpl$ThemeImpl +android.content.res.ResourcesImpl-IA android.content.res.ResourcesImpl android.content.res.ResourcesKey android.content.res.StringBlock$Height @@ -2083,17 +2082,20 @@ android.database.sqlite.SQLiteBlobTooBigException android.database.sqlite.SQLiteCantOpenDatabaseException android.database.sqlite.SQLiteClosable android.database.sqlite.SQLiteCompatibilityWalFlags -android.database.sqlite.SQLiteConnection$Operation-IA android.database.sqlite.SQLiteConnection$Operation +android.database.sqlite.SQLiteConnection$OperationLog$$ExternalSyntheticLambda0 +android.database.sqlite.SQLiteConnection$OperationLog$$ExternalSyntheticLambda1 android.database.sqlite.SQLiteConnection$OperationLog android.database.sqlite.SQLiteConnection$PreparedStatement android.database.sqlite.SQLiteConnection$PreparedStatementCache +android.database.sqlite.SQLiteConnection$RateLimiter +android.database.sqlite.SQLiteConnection-IA android.database.sqlite.SQLiteConnection android.database.sqlite.SQLiteConnectionPool$1 android.database.sqlite.SQLiteConnectionPool$AcquiredConnectionStatus -android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter-IA android.database.sqlite.SQLiteConnectionPool$ConnectionWaiter android.database.sqlite.SQLiteConnectionPool$IdleConnectionHandler +android.database.sqlite.SQLiteConnectionPool-IA android.database.sqlite.SQLiteConnectionPool android.database.sqlite.SQLiteConstraintException android.database.sqlite.SQLiteCursorDriver @@ -2105,8 +2107,8 @@ android.database.sqlite.SQLiteDatabase$$ExternalSyntheticLambda3 android.database.sqlite.SQLiteDatabase$1 android.database.sqlite.SQLiteDatabase$CursorFactory android.database.sqlite.SQLiteDatabase$OpenParams$Builder -android.database.sqlite.SQLiteDatabase$OpenParams-IA android.database.sqlite.SQLiteDatabase$OpenParams +android.database.sqlite.SQLiteDatabase-IA android.database.sqlite.SQLiteDatabase android.database.sqlite.SQLiteDatabaseConfiguration android.database.sqlite.SQLiteDatabaseCorruptException @@ -2129,8 +2131,8 @@ android.database.sqlite.SQLiteQuery android.database.sqlite.SQLiteQueryBuilder android.database.sqlite.SQLiteRawStatement android.database.sqlite.SQLiteReadOnlyDatabaseException -android.database.sqlite.SQLiteSession$Transaction-IA android.database.sqlite.SQLiteSession$Transaction +android.database.sqlite.SQLiteSession-IA android.database.sqlite.SQLiteSession android.database.sqlite.SQLiteStatement android.database.sqlite.SQLiteStatementInfo @@ -2139,8 +2141,8 @@ android.database.sqlite.SQLiteTokenizer android.database.sqlite.SQLiteTransactionListener android.database.sqlite.SqliteWrapper android.ddm.DdmHandle -android.ddm.DdmHandleAppName$Names-IA android.ddm.DdmHandleAppName$Names +android.ddm.DdmHandleAppName-IA android.ddm.DdmHandleAppName android.ddm.DdmHandleExit android.ddm.DdmHandleHeap @@ -2198,12 +2200,16 @@ android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda0 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda1 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda2 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda3 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda4 android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda5 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda6 +android.graphics.ColorSpace$Rgb$$ExternalSyntheticLambda9 +android.graphics.ColorSpace$Rgb$Native android.graphics.ColorSpace$Rgb$NoImagePreloadHolder android.graphics.ColorSpace$Rgb$TransferParameters -android.graphics.ColorSpace$Rgb-IA android.graphics.ColorSpace$Rgb android.graphics.ColorSpace$Xyz +android.graphics.ColorSpace-IA android.graphics.ColorSpace android.graphics.Compatibility android.graphics.ComposePathEffect @@ -2233,11 +2239,11 @@ android.graphics.HardwareRenderer$DestroyContextRunnable android.graphics.HardwareRenderer$FrameCommitCallback android.graphics.HardwareRenderer$FrameCompleteCallback android.graphics.HardwareRenderer$FrameDrawingCallback -android.graphics.HardwareRenderer$FrameRenderRequest-IA android.graphics.HardwareRenderer$FrameRenderRequest android.graphics.HardwareRenderer$PrepareSurfaceControlForWebviewCallback android.graphics.HardwareRenderer$ProcessInitializer$1 android.graphics.HardwareRenderer$ProcessInitializer +android.graphics.HardwareRenderer-IA android.graphics.HardwareRenderer android.graphics.HardwareRendererObserver$$ExternalSyntheticLambda0 android.graphics.HardwareRendererObserver$OnFrameMetricsAvailableListener @@ -2246,12 +2252,11 @@ android.graphics.ImageDecoder$AssetInputStreamSource android.graphics.ImageDecoder$ByteArraySource android.graphics.ImageDecoder$DecodeException android.graphics.ImageDecoder$ImageDecoderSourceTrace -android.graphics.ImageDecoder$ImageInfo-IA android.graphics.ImageDecoder$ImageInfo android.graphics.ImageDecoder$InputStreamSource android.graphics.ImageDecoder$OnHeaderDecodedListener -android.graphics.ImageDecoder$Source-IA android.graphics.ImageDecoder$Source +android.graphics.ImageDecoder-IA android.graphics.ImageDecoder android.graphics.ImageFormat android.graphics.Insets$1 @@ -2264,6 +2269,7 @@ android.graphics.LightingColorFilter android.graphics.LinearGradient android.graphics.MaskFilter android.graphics.Matrix$1 +android.graphics.Matrix$ExtraNatives android.graphics.Matrix$NoImagePreloadHolder android.graphics.Matrix$ScaleToFit android.graphics.Matrix @@ -2287,6 +2293,7 @@ android.graphics.Paint android.graphics.PaintFlagsDrawFilter android.graphics.Path$Direction android.graphics.Path$FillType +android.graphics.Path$NoImagePreloadHolder android.graphics.Path$Op android.graphics.Path android.graphics.PathDashPathEffect @@ -2367,7 +2374,6 @@ android.graphics.drawable.AnimatedStateListDrawable$AnimatedStateListState android.graphics.drawable.AnimatedStateListDrawable$AnimatedVectorDrawableTransition android.graphics.drawable.AnimatedStateListDrawable$AnimationDrawableTransition android.graphics.drawable.AnimatedStateListDrawable$FrameInterpolator -android.graphics.drawable.AnimatedStateListDrawable$Transition-IA android.graphics.drawable.AnimatedStateListDrawable$Transition android.graphics.drawable.AnimatedStateListDrawable-IA android.graphics.drawable.AnimatedStateListDrawable @@ -2401,9 +2407,9 @@ android.graphics.drawable.Drawable$Callback android.graphics.drawable.Drawable$ConstantState android.graphics.drawable.Drawable android.graphics.drawable.DrawableContainer$1 -android.graphics.drawable.DrawableContainer$BlockInvalidateCallback-IA android.graphics.drawable.DrawableContainer$BlockInvalidateCallback android.graphics.drawable.DrawableContainer$DrawableContainerState +android.graphics.drawable.DrawableContainer-IA android.graphics.drawable.DrawableContainer android.graphics.drawable.DrawableInflater android.graphics.drawable.DrawableWrapper$DrawableWrapperState @@ -2497,6 +2503,7 @@ android.graphics.drawable.shapes.RectShape android.graphics.drawable.shapes.RoundRectShape android.graphics.drawable.shapes.Shape android.graphics.fonts.Font$Builder +android.graphics.fonts.Font$NoImagePreloadHolder android.graphics.fonts.Font android.graphics.fonts.FontCustomizationParser$Result android.graphics.fonts.FontCustomizationParser @@ -2515,7 +2522,6 @@ android.graphics.text.LineBreakConfig$Builder android.graphics.text.LineBreakConfig android.graphics.text.LineBreaker$Builder android.graphics.text.LineBreaker$ParagraphConstraints -android.graphics.text.LineBreaker$Result-IA android.graphics.text.LineBreaker$Result android.graphics.text.LineBreaker-IA android.graphics.text.LineBreaker @@ -2649,7 +2655,6 @@ android.hardware.camera2.CameraCharacteristics$5 android.hardware.camera2.CameraCharacteristics$6 android.hardware.camera2.CameraCharacteristics$7 android.hardware.camera2.CameraCharacteristics$8 -android.hardware.camera2.CameraCharacteristics$9 android.hardware.camera2.CameraCharacteristics$Key android.hardware.camera2.CameraCharacteristics android.hardware.camera2.CameraDevice$StateCallback @@ -2669,18 +2674,17 @@ android.hardware.camera2.CameraMetadata android.hardware.camera2.CameraOfflineSession$CameraOfflineSessionCallback android.hardware.camera2.CaptureRequest$1 android.hardware.camera2.CaptureRequest$2 -android.hardware.camera2.CaptureRequest$3 android.hardware.camera2.CaptureRequest$Key android.hardware.camera2.CaptureRequest android.hardware.camera2.CaptureResult$1 android.hardware.camera2.CaptureResult$2 android.hardware.camera2.CaptureResult$3 -android.hardware.camera2.CaptureResult$4 android.hardware.camera2.CaptureResult$Key android.hardware.camera2.CaptureResult android.hardware.camera2.DngCreator android.hardware.camera2.TotalCaptureResult android.hardware.camera2.extension.ICaptureProcessorImpl +android.hardware.camera2.impl.CameraDeviceImpl$1 android.hardware.camera2.impl.CameraDeviceImpl$CameraHandlerExecutor android.hardware.camera2.impl.CameraDeviceImpl android.hardware.camera2.impl.CameraExtensionJpegProcessor @@ -2815,6 +2819,7 @@ android.hardware.contexthub.V1_0.MemRange android.hardware.contexthub.V1_0.NanoAppBinary android.hardware.contexthub.V1_0.PhysicalSensor android.hardware.contexthub.V1_1.Setting +android.hardware.devicestate.DeviceState$Configuration$1 android.hardware.devicestate.DeviceState$Configuration android.hardware.devicestate.DeviceState android.hardware.devicestate.DeviceStateInfo$1 @@ -2826,8 +2831,8 @@ android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda1 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper$$ExternalSyntheticLambda2 android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateCallbackWrapper -android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback-IA android.hardware.devicestate.DeviceStateManagerGlobal$DeviceStateManagerCallback +android.hardware.devicestate.DeviceStateManagerGlobal-IA android.hardware.devicestate.DeviceStateManagerGlobal android.hardware.devicestate.IDeviceStateManager$Stub$Proxy android.hardware.devicestate.IDeviceStateManager$Stub @@ -2862,13 +2867,12 @@ android.hardware.display.DisplayManager$$ExternalSyntheticLambda0 android.hardware.display.DisplayManager$$ExternalSyntheticLambda1 android.hardware.display.DisplayManager$$ExternalSyntheticLambda2 android.hardware.display.DisplayManager$DisplayListener -android.hardware.display.DisplayManager$WeakDisplayCache-IA android.hardware.display.DisplayManager$WeakDisplayCache +android.hardware.display.DisplayManager-IA android.hardware.display.DisplayManager android.hardware.display.DisplayManagerGlobal$1 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate$$ExternalSyntheticLambda0 android.hardware.display.DisplayManagerGlobal$DisplayListenerDelegate -android.hardware.display.DisplayManagerGlobal$DisplayManagerCallback-IA android.hardware.display.DisplayManagerGlobal android.hardware.display.DisplayManagerInternal$DisplayPowerCallbacks android.hardware.display.DisplayManagerInternal$DisplayPowerRequest @@ -2974,9 +2978,9 @@ android.hardware.input.InputDeviceIdentifier android.hardware.input.InputManager$InputDeviceListener android.hardware.input.InputManager android.hardware.input.InputManagerGlobal$InputDeviceListenerDelegate -android.hardware.input.InputManagerGlobal$InputDevicesChangedListener-IA android.hardware.input.InputManagerGlobal$InputDevicesChangedListener android.hardware.input.InputManagerGlobal$OnTabletModeChangedListenerDelegate +android.hardware.input.InputManagerGlobal-IA android.hardware.input.InputManagerGlobal android.hardware.input.InputSettings android.hardware.input.KeyboardLayout$1 @@ -3486,11 +3490,11 @@ android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo$VariantSy android.icu.impl.ICUCurrencyDisplayInfoProvider$ICUCurrencyDisplayInfo android.icu.impl.ICUCurrencyDisplayInfoProvider android.icu.impl.ICUCurrencyMetaInfo$Collector -android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector-IA android.icu.impl.ICUCurrencyMetaInfo$CurrencyCollector android.icu.impl.ICUCurrencyMetaInfo$InfoCollector android.icu.impl.ICUCurrencyMetaInfo$RegionCollector android.icu.impl.ICUCurrencyMetaInfo$UniqueList +android.icu.impl.ICUCurrencyMetaInfo-IA android.icu.impl.ICUCurrencyMetaInfo android.icu.impl.ICUData$1 android.icu.impl.ICUData$2 @@ -3518,10 +3522,10 @@ android.icu.impl.ICUResourceBundle$4 android.icu.impl.ICUResourceBundle$5 android.icu.impl.ICUResourceBundle$AvailEntry android.icu.impl.ICUResourceBundle$AvailableLocalesSink -android.icu.impl.ICUResourceBundle$Loader-IA android.icu.impl.ICUResourceBundle$Loader android.icu.impl.ICUResourceBundle$OpenType android.icu.impl.ICUResourceBundle$WholeBundle +android.icu.impl.ICUResourceBundle-IA android.icu.impl.ICUResourceBundle android.icu.impl.ICUResourceBundleImpl$ResourceArray android.icu.impl.ICUResourceBundleImpl$ResourceBinary @@ -3656,10 +3660,10 @@ android.icu.impl.TZDBTimeZoneNames$TZDBNames android.icu.impl.TZDBTimeZoneNames android.icu.impl.TextTrieMap$CharIterator android.icu.impl.TextTrieMap$LongestMatchHandler -android.icu.impl.TextTrieMap$Node-IA android.icu.impl.TextTrieMap$Node android.icu.impl.TextTrieMap$Output android.icu.impl.TextTrieMap$ResultHandler +android.icu.impl.TextTrieMap-IA android.icu.impl.TextTrieMap android.icu.impl.TimeZoneAdapter android.icu.impl.TimeZoneGenericNames$1 @@ -3679,9 +3683,9 @@ android.icu.impl.TimeZoneNamesImpl$NameSearchHandler android.icu.impl.TimeZoneNamesImpl$TZ2MZsCache android.icu.impl.TimeZoneNamesImpl$ZNames$NameTypeIndex android.icu.impl.TimeZoneNamesImpl$ZNames -android.icu.impl.TimeZoneNamesImpl$ZNamesLoader-IA android.icu.impl.TimeZoneNamesImpl$ZNamesLoader android.icu.impl.TimeZoneNamesImpl$ZoneStringsLoader +android.icu.impl.TimeZoneNamesImpl-IA android.icu.impl.TimeZoneNamesImpl android.icu.impl.Trie$DataManipulate android.icu.impl.Trie$DefaultGetFoldingOffset @@ -4022,10 +4026,10 @@ android.icu.impl.number.MutablePatternModifier$ImmutablePatternModifier android.icu.impl.number.MutablePatternModifier android.icu.impl.number.Padder$PadPosition android.icu.impl.number.Padder -android.icu.impl.number.PatternStringParser$ParsedPatternInfo-IA android.icu.impl.number.PatternStringParser$ParsedPatternInfo android.icu.impl.number.PatternStringParser$ParsedSubpatternInfo android.icu.impl.number.PatternStringParser$ParserState +android.icu.impl.number.PatternStringParser-IA android.icu.impl.number.PatternStringParser android.icu.impl.number.PatternStringUtils$1 android.icu.impl.number.PatternStringUtils$PatternSignType @@ -4337,7 +4341,6 @@ android.icu.text.DateFormat$Field android.icu.text.DateFormat$HourCycle android.icu.text.DateFormat android.icu.text.DateFormatSymbols$1 -android.icu.text.DateFormatSymbols$AospExtendedDateFormatSymbols-IA android.icu.text.DateFormatSymbols$AospExtendedDateFormatSymbols android.icu.text.DateFormatSymbols$CalendarDataSink$AliasType android.icu.text.DateFormatSymbols$CalendarDataSink @@ -4353,25 +4356,21 @@ android.icu.text.DateIntervalFormat android.icu.text.DateIntervalInfo$DateIntervalSink android.icu.text.DateIntervalInfo$PatternInfo android.icu.text.DateIntervalInfo -android.icu.text.DateTimePatternGenerator$AppendItemFormatsSink-IA android.icu.text.DateTimePatternGenerator$AppendItemFormatsSink -android.icu.text.DateTimePatternGenerator$AppendItemNamesSink-IA android.icu.text.DateTimePatternGenerator$AppendItemNamesSink android.icu.text.DateTimePatternGenerator$AvailableFormatsSink android.icu.text.DateTimePatternGenerator$DTPGflags -android.icu.text.DateTimePatternGenerator$DateTimeMatcher-IA android.icu.text.DateTimePatternGenerator$DateTimeMatcher android.icu.text.DateTimePatternGenerator$DayPeriodAllowedHoursSink android.icu.text.DateTimePatternGenerator$DisplayWidth -android.icu.text.DateTimePatternGenerator$DistanceInfo-IA android.icu.text.DateTimePatternGenerator$DistanceInfo android.icu.text.DateTimePatternGenerator$FormatParser android.icu.text.DateTimePatternGenerator$PatternInfo android.icu.text.DateTimePatternGenerator$PatternWithMatcher android.icu.text.DateTimePatternGenerator$PatternWithSkeletonFlag -android.icu.text.DateTimePatternGenerator$SkeletonFields-IA android.icu.text.DateTimePatternGenerator$SkeletonFields android.icu.text.DateTimePatternGenerator$VariableField +android.icu.text.DateTimePatternGenerator-IA android.icu.text.DateTimePatternGenerator android.icu.text.DecimalFormat$PropertySetter android.icu.text.DecimalFormat @@ -4382,8 +4381,8 @@ android.icu.text.DecimalFormatSymbols android.icu.text.DisplayContext$Type android.icu.text.DisplayContext android.icu.text.DurationFormat -android.icu.text.Edits$Iterator-IA android.icu.text.Edits$Iterator +android.icu.text.Edits-IA android.icu.text.Edits android.icu.text.EscapeTransliterator$1 android.icu.text.EscapeTransliterator$2 @@ -4521,10 +4520,10 @@ android.icu.text.PluralRules$OrConstraint android.icu.text.PluralRules$PluralType android.icu.text.PluralRules$RangeConstraint android.icu.text.PluralRules$Rule -android.icu.text.PluralRules$RuleList-IA android.icu.text.PluralRules$RuleList android.icu.text.PluralRules$SampleType android.icu.text.PluralRules$SimpleTokenizer +android.icu.text.PluralRules-IA android.icu.text.PluralRules android.icu.text.PluralRulesSerialProxy android.icu.text.Quantifier @@ -4570,12 +4569,12 @@ android.icu.text.ReplaceableString android.icu.text.RuleBasedBreakIterator$BreakCache android.icu.text.RuleBasedBreakIterator$DictionaryCache android.icu.text.RuleBasedBreakIterator -android.icu.text.RuleBasedCollator$CollationBuffer-IA android.icu.text.RuleBasedCollator$CollationBuffer android.icu.text.RuleBasedCollator$CollationKeyByteSink android.icu.text.RuleBasedCollator$FCDUTF16NFDIterator android.icu.text.RuleBasedCollator$NFDIterator android.icu.text.RuleBasedCollator$UTF16NFDIterator +android.icu.text.RuleBasedCollator-IA android.icu.text.RuleBasedCollator android.icu.text.RuleBasedNumberFormat android.icu.text.RuleBasedTransliterator$Data @@ -4729,11 +4728,11 @@ android.icu.util.BytesTrieBuilder$BytesAsCharSequence android.icu.util.BytesTrieBuilder android.icu.util.CECalendar android.icu.util.Calendar$1 -android.icu.util.Calendar$FormatConfiguration-IA android.icu.util.Calendar$FormatConfiguration android.icu.util.Calendar$PatternData android.icu.util.Calendar$WeekData android.icu.util.Calendar$WeekDataCache +android.icu.util.Calendar-IA android.icu.util.Calendar android.icu.util.CaseInsensitiveString android.icu.util.CharsTrie$Entry @@ -4748,19 +4747,16 @@ android.icu.util.CodePointMap$RangeOption android.icu.util.CodePointMap$StringIterator android.icu.util.CodePointMap$ValueFilter android.icu.util.CodePointMap -android.icu.util.CodePointTrie$Data-IA android.icu.util.CodePointTrie$Data16 android.icu.util.CodePointTrie$Data32 android.icu.util.CodePointTrie$Data8 android.icu.util.CodePointTrie$Data android.icu.util.CodePointTrie$Fast$FastStringIterator -android.icu.util.CodePointTrie$Fast-IA android.icu.util.CodePointTrie$Fast16 android.icu.util.CodePointTrie$Fast32 android.icu.util.CodePointTrie$Fast8 android.icu.util.CodePointTrie$Fast android.icu.util.CodePointTrie$Small$SmallStringIterator -android.icu.util.CodePointTrie$Small-IA android.icu.util.CodePointTrie$Small16 android.icu.util.CodePointTrie$Small32 android.icu.util.CodePointTrie$Small8 @@ -4842,8 +4838,8 @@ android.icu.util.MeasureUnit$MeasureUnitSink android.icu.util.MeasureUnit android.icu.util.MutableCodePointTrie$1 android.icu.util.MutableCodePointTrie$AllSameBlocks -android.icu.util.MutableCodePointTrie$MixedBlocks-IA android.icu.util.MutableCodePointTrie$MixedBlocks +android.icu.util.MutableCodePointTrie-IA android.icu.util.MutableCodePointTrie android.icu.util.NoUnit android.icu.util.Output @@ -4917,6 +4913,7 @@ android.inputmethodservice.InputMethodService$Insets android.inputmethodservice.InputMethodService$SettingsObserver android.inputmethodservice.InputMethodService android.inputmethodservice.SoftInputWindow +android.internal.framework.protobuf.nano.MessageNano android.internal.hidl.base.V1_0.DebugInfo android.internal.hidl.base.V1_0.IBase android.internal.hidl.manager.V1_0.IServiceManager @@ -4951,11 +4948,14 @@ android.location.IGpsGeofenceHardware$Stub android.location.IGpsGeofenceHardware android.location.Location$$ExternalSyntheticLambda0 android.location.Location$1 -android.location.Location$BearingDistanceCache-IA android.location.Location$BearingDistanceCache +android.location.Location-IA android.location.Location android.location.LocationTime$1 android.location.LocationTime +android.location.flags.FeatureFlags +android.location.flags.FeatureFlagsImpl +android.location.flags.Flags android.media.AudioAttributes$1 android.media.AudioAttributes$Builder android.media.AudioAttributes-IA @@ -4989,22 +4989,20 @@ android.media.AudioManager$AudioPlaybackCallbackInfo android.media.AudioManager$AudioRecordingCallback android.media.AudioManager$AudioRecordingCallbackInfo android.media.AudioManager$BlockingFocusResultReceiver -android.media.AudioManager$DevRoleListeners-IA android.media.AudioManager$DevRoleListeners android.media.AudioManager$FocusRequestInfo android.media.AudioManager$NativeEventHandlerDelegate$1 android.media.AudioManager$NativeEventHandlerDelegate -android.media.AudioManager$OnAmPortUpdateListener-IA android.media.AudioManager$OnAmPortUpdateListener android.media.AudioManager$OnAudioFocusChangeListener android.media.AudioManager$OnAudioPortUpdateListener android.media.AudioManager$OnModeChangedListener android.media.AudioManager$PlaybackConfigChangeCallbackData android.media.AudioManager$RecordConfigChangeCallbackData -android.media.AudioManager$SafeWaitObject-IA android.media.AudioManager$SafeWaitObject android.media.AudioManager$ServiceEventHandlerDelegate$1 android.media.AudioManager$ServiceEventHandlerDelegate +android.media.AudioManager-IA android.media.AudioManager android.media.AudioManagerInternal$RingerModeDelegate android.media.AudioManagerInternal @@ -5160,10 +5158,9 @@ android.media.ImageWriter android.media.JetPlayer android.media.MediaCodec$$ExternalSyntheticLambda6 android.media.MediaCodec$$ExternalSyntheticLambda7 +android.media.MediaCodec$$ExternalSyntheticLambda8 android.media.MediaCodec$BufferInfo -android.media.MediaCodec$BufferMap$CodecBuffer-IA android.media.MediaCodec$BufferMap$CodecBuffer -android.media.MediaCodec$BufferMap-IA android.media.MediaCodec$BufferMap android.media.MediaCodec$Callback android.media.MediaCodec$CodecException @@ -5179,6 +5176,7 @@ android.media.MediaCodec$OutputFrame android.media.MediaCodec$ParameterDescriptor android.media.MediaCodec$PersistentSurface android.media.MediaCodec$QueueRequest +android.media.MediaCodec-IA android.media.MediaCodecInfo$AudioCapabilities android.media.MediaCodecInfo$CodecProfileLevel android.media.MediaCodecInfo$EncoderCapabilities @@ -5233,7 +5231,6 @@ android.media.MediaPlayer$2 android.media.MediaPlayer$3 android.media.MediaPlayer$6 android.media.MediaPlayer$7 -android.media.MediaPlayer$DrmInfo-IA android.media.MediaPlayer$DrmInfo android.media.MediaPlayer$EventHandler$$ExternalSyntheticLambda0 android.media.MediaPlayer$EventHandler$1 @@ -5259,6 +5256,7 @@ android.media.MediaPlayer$TimeProvider$EventHandler android.media.MediaPlayer$TimeProvider android.media.MediaPlayer$TrackInfo$1 android.media.MediaPlayer$TrackInfo +android.media.MediaPlayer-IA android.media.MediaPlayer android.media.MediaRecorder android.media.MediaRoute2Info$1 @@ -5424,13 +5422,14 @@ android.media.browse.MediaBrowser$ConnectionCallback android.media.browse.MediaBrowser$MediaItem$1 android.media.browse.MediaBrowser$MediaItem android.media.browse.MediaBrowser$MediaServiceConnection$1 -android.media.browse.MediaBrowser$MediaServiceConnection-IA android.media.browse.MediaBrowser$MediaServiceConnection android.media.browse.MediaBrowser$ServiceCallbacks android.media.browse.MediaBrowser$Subscription android.media.browse.MediaBrowser$SubscriptionCallback +android.media.browse.MediaBrowser-IA android.media.browse.MediaBrowser android.media.browse.MediaBrowserUtils +android.media.codec.Flags android.media.metrics.Event android.media.metrics.IMediaMetricsManager$Stub$Proxy android.media.metrics.IMediaMetricsManager$Stub @@ -5511,6 +5510,7 @@ android.media.session.ISessionCallback android.media.session.ISessionController$Stub$Proxy android.media.session.ISessionController$Stub android.media.session.ISessionController +android.media.session.ISessionControllerCallback$Stub$Proxy android.media.session.ISessionControllerCallback$Stub android.media.session.ISessionControllerCallback android.media.session.ISessionManager$Stub$Proxy @@ -5521,8 +5521,8 @@ android.media.session.MediaController$CallbackStub android.media.session.MediaController$MessageHandler android.media.session.MediaController$PlaybackInfo$1 android.media.session.MediaController$PlaybackInfo -android.media.session.MediaController$TransportControls-IA android.media.session.MediaController$TransportControls +android.media.session.MediaController-IA android.media.session.MediaController android.media.session.MediaSession$Callback android.media.session.MediaSession$CallbackMessageHandler @@ -5535,29 +5535,26 @@ android.media.session.MediaSession android.media.session.MediaSessionLegacyHelper android.media.session.MediaSessionManager$OnActiveSessionsChangedListener android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListener -android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListenerStub-IA android.media.session.MediaSessionManager$OnMediaKeyEventDispatchedListenerStub android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListener -android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub-IA android.media.session.MediaSessionManager$OnMediaKeyEventSessionChangedListenerStub android.media.session.MediaSessionManager$OnMediaKeyListener android.media.session.MediaSessionManager$OnMediaKeyListenerImpl android.media.session.MediaSessionManager$OnSession2TokensChangedListener android.media.session.MediaSessionManager$OnVolumeKeyLongPressListener android.media.session.MediaSessionManager$OnVolumeKeyLongPressListenerImpl -android.media.session.MediaSessionManager$RemoteSessionCallbackStub-IA android.media.session.MediaSessionManager$RemoteSessionCallbackStub android.media.session.MediaSessionManager$RemoteUserInfo android.media.session.MediaSessionManager$Session2TokensChangedWrapper android.media.session.MediaSessionManager$SessionsChangedWrapper$1$$ExternalSyntheticLambda0 android.media.session.MediaSessionManager$SessionsChangedWrapper$1 android.media.session.MediaSessionManager$SessionsChangedWrapper +android.media.session.MediaSessionManager-IA android.media.session.MediaSessionManager android.media.session.ParcelableListBinder android.media.session.PlaybackState$1 android.media.session.PlaybackState$Builder android.media.session.PlaybackState$CustomAction$1 -android.media.session.PlaybackState$CustomAction-IA android.media.session.PlaybackState$CustomAction android.media.session.PlaybackState-IA android.media.session.PlaybackState @@ -5624,7 +5621,6 @@ android.net.INetworkPolicyListener android.net.INetworkPolicyManager$Stub$Proxy android.net.INetworkPolicyManager$Stub android.net.INetworkPolicyManager -android.net.INetworkRecommendationProvider$Stub$Proxy android.net.INetworkRecommendationProvider$Stub android.net.INetworkRecommendationProvider android.net.INetworkScoreCache$Stub$Proxy @@ -5687,18 +5683,14 @@ android.net.TelephonyNetworkSpecifier$1 android.net.TelephonyNetworkSpecifier$Builder android.net.TelephonyNetworkSpecifier android.net.Uri$1 -android.net.Uri$AbstractHierarchicalUri-IA android.net.Uri$AbstractHierarchicalUri android.net.Uri$AbstractPart android.net.Uri$Builder -android.net.Uri$HierarchicalUri-IA android.net.Uri$NotCachedHolder -android.net.Uri$OpaqueUri-IA android.net.Uri$Part$EmptyPart android.net.Uri$Part android.net.Uri$PathPart android.net.Uri$PathSegmentsBuilder -android.net.Uri$StringUri-IA android.net.Uri-IA android.net.Uri android.net.UriCodec @@ -5827,16 +5819,99 @@ android.net.wifi.nl80211.WifiNl80211Manager$ScanEventHandler android.net.wifi.nl80211.WifiNl80211Manager$SignalPollResult android.net.wifi.nl80211.WifiNl80211Manager android.net.wifi.sharedconnectivity.app.SharedConnectivityManager +android.nfc.IAppCallback$Stub +android.nfc.IAppCallback +android.nfc.INfcAdapter$Stub +android.nfc.INfcAdapter +android.nfc.INfcAdapterExtras +android.nfc.INfcCardEmulation +android.nfc.INfcControllerAlwaysOnListener$Stub +android.nfc.INfcControllerAlwaysOnListener +android.nfc.INfcDta +android.nfc.INfcFCardEmulation +android.nfc.INfcTag +android.nfc.INfcUnlockHandler$Stub +android.nfc.INfcUnlockHandler +android.nfc.INfcVendorNciCallback$Stub +android.nfc.INfcVendorNciCallback +android.nfc.INfcWlcStateListener$Stub +android.nfc.INfcWlcStateListener +android.nfc.ITagRemovedCallback$Stub +android.nfc.ITagRemovedCallback +android.nfc.NdefMessage +android.nfc.NfcActivityManager +android.nfc.NfcAdapter$$ExternalSyntheticLambda0 +android.nfc.NfcAdapter$$ExternalSyntheticLambda10 +android.nfc.NfcAdapter$$ExternalSyntheticLambda11 +android.nfc.NfcAdapter$$ExternalSyntheticLambda12 +android.nfc.NfcAdapter$$ExternalSyntheticLambda13 +android.nfc.NfcAdapter$$ExternalSyntheticLambda14 +android.nfc.NfcAdapter$$ExternalSyntheticLambda15 +android.nfc.NfcAdapter$$ExternalSyntheticLambda16 +android.nfc.NfcAdapter$$ExternalSyntheticLambda17 +android.nfc.NfcAdapter$$ExternalSyntheticLambda18 +android.nfc.NfcAdapter$$ExternalSyntheticLambda19 +android.nfc.NfcAdapter$$ExternalSyntheticLambda1 +android.nfc.NfcAdapter$$ExternalSyntheticLambda20 +android.nfc.NfcAdapter$$ExternalSyntheticLambda21 +android.nfc.NfcAdapter$$ExternalSyntheticLambda22 +android.nfc.NfcAdapter$$ExternalSyntheticLambda23 +android.nfc.NfcAdapter$$ExternalSyntheticLambda24 +android.nfc.NfcAdapter$$ExternalSyntheticLambda25 +android.nfc.NfcAdapter$$ExternalSyntheticLambda26 +android.nfc.NfcAdapter$$ExternalSyntheticLambda27 +android.nfc.NfcAdapter$$ExternalSyntheticLambda28 +android.nfc.NfcAdapter$$ExternalSyntheticLambda29 +android.nfc.NfcAdapter$$ExternalSyntheticLambda2 +android.nfc.NfcAdapter$$ExternalSyntheticLambda30 +android.nfc.NfcAdapter$$ExternalSyntheticLambda31 +android.nfc.NfcAdapter$$ExternalSyntheticLambda32 +android.nfc.NfcAdapter$$ExternalSyntheticLambda33 +android.nfc.NfcAdapter$$ExternalSyntheticLambda34 +android.nfc.NfcAdapter$$ExternalSyntheticLambda35 +android.nfc.NfcAdapter$$ExternalSyntheticLambda36 +android.nfc.NfcAdapter$$ExternalSyntheticLambda37 +android.nfc.NfcAdapter$$ExternalSyntheticLambda38 +android.nfc.NfcAdapter$$ExternalSyntheticLambda39 +android.nfc.NfcAdapter$$ExternalSyntheticLambda3 +android.nfc.NfcAdapter$$ExternalSyntheticLambda4 +android.nfc.NfcAdapter$$ExternalSyntheticLambda5 +android.nfc.NfcAdapter$$ExternalSyntheticLambda6 +android.nfc.NfcAdapter$$ExternalSyntheticLambda7 +android.nfc.NfcAdapter$$ExternalSyntheticLambda8 +android.nfc.NfcAdapter$$ExternalSyntheticLambda9 +android.nfc.NfcAdapter$1 +android.nfc.NfcAdapter$2 +android.nfc.NfcAdapter$ControllerAlwaysOnListener +android.nfc.NfcAdapter$CreateBeamUrisCallback +android.nfc.NfcAdapter$CreateNdefMessageCallback +android.nfc.NfcAdapter$NfcUnlockHandler +android.nfc.NfcAdapter$NfcVendorNciCallback +android.nfc.NfcAdapter$OnNdefPushCompleteCallback +android.nfc.NfcAdapter$OnTagRemovedListener +android.nfc.NfcAdapter$ReaderCallback +android.nfc.NfcAdapter$ServiceCall +android.nfc.NfcAdapter$ServiceCallReturn +android.nfc.NfcAdapter$WlcStateListener android.nfc.NfcAdapter +android.nfc.NfcAntennaInfo +android.nfc.NfcControllerAlwaysOnListener android.nfc.NfcFrameworkInitializer$$ExternalSyntheticLambda0 android.nfc.NfcFrameworkInitializer android.nfc.NfcManager +android.nfc.NfcOemExtension android.nfc.NfcServiceManager$ServiceRegisterer android.nfc.NfcServiceManager +android.nfc.NfcVendorNciCallbackListener +android.nfc.NfcWlcStateListener +android.nfc.Tag +android.nfc.TechListParcel +android.nfc.WlcListenerDeviceInfo android.nfc.cardemulation.AidGroup$1 android.nfc.cardemulation.AidGroup android.nfc.cardemulation.ApduServiceInfo$1 android.nfc.cardemulation.ApduServiceInfo +android.nfc.cardemulation.PollingFrame android.opengl.EGL14 android.opengl.EGL15 android.opengl.EGLConfig @@ -5887,8 +5962,8 @@ android.os.AsyncTask$InternalHandler android.os.AsyncTask$SerialExecutor$1 android.os.AsyncTask$SerialExecutor android.os.AsyncTask$Status -android.os.AsyncTask$WorkerRunnable-IA android.os.AsyncTask$WorkerRunnable +android.os.AsyncTask-IA android.os.AsyncTask android.os.BadParcelableException android.os.BadTypeParcelableException @@ -5956,8 +6031,8 @@ android.os.Build android.os.Bundle$1 android.os.Bundle android.os.CancellationSignal$OnCancelListener -android.os.CancellationSignal$Transport-IA android.os.CancellationSignal$Transport +android.os.CancellationSignal-IA android.os.CancellationSignal android.os.CarrierAssociatedAppEntry$1 android.os.CarrierAssociatedAppEntry @@ -5983,8 +6058,8 @@ android.os.DdmSyncState android.os.DeadObjectException android.os.DeadSystemException android.os.Debug$MemoryInfo$1 -android.os.Debug$MemoryInfo-IA android.os.Debug$MemoryInfo +android.os.Debug-IA android.os.Debug android.os.DeviceIdleManager android.os.DropBoxManager$Entry$1 @@ -6018,8 +6093,8 @@ android.os.GraphicsEnvironment$1 android.os.GraphicsEnvironment android.os.Handler$BlockingRunnable android.os.Handler$Callback -android.os.Handler$MessengerImpl-IA android.os.Handler$MessengerImpl +android.os.Handler-IA android.os.Handler android.os.HandlerExecutor android.os.HandlerThread @@ -6037,6 +6112,7 @@ android.os.IBatteryPropertiesRegistrar$Stub$Proxy android.os.IBatteryPropertiesRegistrar$Stub android.os.IBatteryPropertiesRegistrar android.os.IBinder$DeathRecipient +android.os.IBinder$FrozenStateChangeCallback android.os.IBinder android.os.IBinderCallback android.os.ICancellationSignal$Stub$Proxy @@ -6165,6 +6241,7 @@ android.os.IWakeLockCallback android.os.IncidentManager$IncidentReport$1 android.os.IncidentManager$IncidentReport android.os.IncidentManager +android.os.IpcDataCache$1 android.os.IpcDataCache$Config android.os.IpcDataCache$QueryHandler android.os.IpcDataCache$RemoteCall @@ -6259,7 +6336,6 @@ android.os.RemoteCallback$2 android.os.RemoteCallback$3 android.os.RemoteCallback$OnResultListener android.os.RemoteCallback -android.os.RemoteCallbackList$Callback android.os.RemoteCallbackList android.os.RemoteException android.os.ResultReceiver$1 @@ -6268,17 +6344,16 @@ android.os.ResultReceiver$MyRunnable android.os.ResultReceiver android.os.SELinux android.os.SecurityStateManager +android.os.Service$1 +android.os.Service android.os.ServiceManager$ServiceNotFoundException android.os.ServiceManager android.os.ServiceManagerNative android.os.ServiceManagerProxy android.os.ServiceSpecificException android.os.SharedMemory$1 -android.os.SharedMemory$Closer-IA android.os.SharedMemory$Closer -android.os.SharedMemory$MemoryRegistration-IA android.os.SharedMemory$MemoryRegistration -android.os.SharedMemory$Unmapper-IA android.os.SharedMemory$Unmapper android.os.SharedMemory-IA android.os.SharedMemory @@ -6304,33 +6379,29 @@ android.os.StrictMode$9 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda0 android.os.StrictMode$AndroidBlockGuardPolicy$$ExternalSyntheticLambda1 android.os.StrictMode$AndroidBlockGuardPolicy -android.os.StrictMode$AndroidCloseGuardReporter-IA android.os.StrictMode$AndroidCloseGuardReporter android.os.StrictMode$InstanceTracker android.os.StrictMode$OnThreadViolationListener android.os.StrictMode$OnVmViolationListener android.os.StrictMode$Span android.os.StrictMode$ThreadPolicy$Builder -android.os.StrictMode$ThreadPolicy-IA android.os.StrictMode$ThreadPolicy -android.os.StrictMode$ThreadSpanState-IA android.os.StrictMode$ThreadSpanState -android.os.StrictMode$UnsafeIntentStrictModeCallback-IA android.os.StrictMode$UnsafeIntentStrictModeCallback android.os.StrictMode$ViolationInfo$1 android.os.StrictMode$ViolationInfo android.os.StrictMode$ViolationLogger android.os.StrictMode$VmPolicy$Builder -android.os.StrictMode$VmPolicy-IA android.os.StrictMode$VmPolicy +android.os.StrictMode-IA android.os.StrictMode android.os.SynchronousResultReceiver$Result android.os.SynchronousResultReceiver android.os.SystemClock$2 android.os.SystemClock android.os.SystemConfigManager -android.os.SystemProperties$Handle-IA android.os.SystemProperties$Handle +android.os.SystemProperties-IA android.os.SystemProperties android.os.SystemService$1 android.os.SystemService$State @@ -6366,9 +6437,6 @@ android.os.UpdateLock android.os.UserHandle$1 android.os.UserHandle android.os.UserManager$1 -android.os.UserManager$2 -android.os.UserManager$3 -android.os.UserManager$4 android.os.UserManager$EnforcingUser$1 android.os.UserManager$EnforcingUser android.os.UserManager$UserOperationException @@ -6446,7 +6514,6 @@ android.os.storage.IStorageShutdownObserver android.os.storage.OnObbStateChangeListener android.os.storage.StorageEventListener android.os.storage.StorageManager$1 -android.os.storage.StorageManager$ObbActionListener-IA android.os.storage.StorageManager$ObbActionListener android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda2 android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda3 @@ -6455,6 +6522,7 @@ android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheti android.os.storage.StorageManager$StorageEventListenerDelegate$$ExternalSyntheticLambda6 android.os.storage.StorageManager$StorageEventListenerDelegate android.os.storage.StorageManager$StorageVolumeCallback +android.os.storage.StorageManager-IA android.os.storage.StorageManager android.os.storage.StorageManagerInternal android.os.storage.StorageVolume$1 @@ -6523,8 +6591,8 @@ android.permission.PermissionManager$2 android.permission.PermissionManager$OnPermissionsChangeListenerDelegate android.permission.PermissionManager$PackageNamePermissionQuery android.permission.PermissionManager$PermissionQuery -android.permission.PermissionManager$SplitPermissionInfo-IA android.permission.PermissionManager$SplitPermissionInfo +android.permission.PermissionManager-IA android.permission.PermissionManagerInternal android.preference.DialogPreference android.preference.GenericInflater$Parent @@ -6840,12 +6908,11 @@ android.security.keystore.recovery.WrappedApplicationKey$1 android.security.keystore.recovery.WrappedApplicationKey$Builder android.security.keystore.recovery.WrappedApplicationKey android.security.keystore.recovery.X509CertificateParsingUtils -android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$AdditionalAuthenticationDataStream -android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$BufferAllOutputUntilDoFinalStreamer android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$GCM$NoPadding android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi$GCM +android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi-IA android.security.keystore2.AndroidKeyStoreAuthenticatedAESCipherSpi android.security.keystore2.AndroidKeyStoreBCWorkaroundProvider android.security.keystore2.AndroidKeyStoreCipherSpiBase @@ -7057,18 +7124,16 @@ android.service.media.MediaBrowserService$BrowserRoot android.service.media.MediaBrowserService$ConnectionRecord android.service.media.MediaBrowserService$Result android.service.media.MediaBrowserService$ServiceBinder$$ExternalSyntheticLambda1 -android.service.media.MediaBrowserService$ServiceBinder-IA android.service.media.MediaBrowserService$ServiceBinder -android.service.media.MediaBrowserService$ServiceState-IA android.service.media.MediaBrowserService$ServiceState +android.service.media.MediaBrowserService-IA android.service.media.MediaBrowserService android.service.notification.Adjustment$1 android.service.notification.Adjustment android.service.notification.Condition$1 android.service.notification.Condition -android.service.notification.ConditionProviderService$H-IA android.service.notification.ConditionProviderService$H -android.service.notification.ConditionProviderService$Provider-IA +android.service.notification.ConditionProviderService-IA android.service.notification.ConditionProviderService android.service.notification.IConditionProvider$Stub android.service.notification.IConditionProvider @@ -7085,8 +7150,8 @@ android.service.notification.NotificationListenerFilter android.service.notification.NotificationListenerService$MyHandler android.service.notification.NotificationListenerService$Ranking android.service.notification.NotificationListenerService$RankingMap$1 -android.service.notification.NotificationListenerService$RankingMap-IA android.service.notification.NotificationListenerService$RankingMap +android.service.notification.NotificationListenerService-IA android.service.notification.NotificationListenerService android.service.notification.NotificationRankingUpdate$1 android.service.notification.NotificationRankingUpdate @@ -7216,14 +7281,11 @@ android.speech.tts.TextToSpeech$$ExternalSyntheticLambda17 android.speech.tts.TextToSpeech$$ExternalSyntheticLambda1 android.speech.tts.TextToSpeech$Action android.speech.tts.TextToSpeech$Connection$1 -android.speech.tts.TextToSpeech$Connection$SetupConnectionAsyncTask-IA -android.speech.tts.TextToSpeech$Connection-IA -android.speech.tts.TextToSpeech$DirectConnection-IA android.speech.tts.TextToSpeech$DirectConnection android.speech.tts.TextToSpeech$EngineInfo android.speech.tts.TextToSpeech$OnInitListener -android.speech.tts.TextToSpeech$SystemConnection-IA android.speech.tts.TextToSpeech$SystemConnection +android.speech.tts.TextToSpeech-IA android.speech.tts.TtsEngines$EngineInfoComparator android.speech.tts.TtsEngines android.speech.tts.UtteranceProgressListener @@ -7236,7 +7298,6 @@ android.sysprop.CryptoProperties android.sysprop.DeviceProperties android.sysprop.DisplayProperties android.sysprop.HdmiProperties -android.sysprop.InitProperties android.sysprop.InputProperties android.sysprop.MediaProperties android.sysprop.PowerProperties @@ -7256,6 +7317,7 @@ android.sysprop.TelephonyProperties$$ExternalSyntheticLambda7 android.sysprop.TelephonyProperties$$ExternalSyntheticLambda8 android.sysprop.TelephonyProperties$$ExternalSyntheticLambda9 android.sysprop.TelephonyProperties +android.sysprop.ViewProperties android.sysprop.VndkProperties android.system.ErrnoException android.system.GaiException @@ -7282,6 +7344,7 @@ android.system.StructTimespec android.system.StructTimeval android.system.StructUcred android.system.StructUtsname +android.system.SystemCleaner android.system.UnixSocketAddress android.system.VmSocketAddress android.system.keystore2.Authorization$1 @@ -7522,9 +7585,9 @@ android.telephony.JapanesePhoneNumberFormatter android.telephony.LinkCapacityEstimate$1 android.telephony.LinkCapacityEstimate android.telephony.LocationAccessPolicy$LocationPermissionQuery$Builder -android.telephony.LocationAccessPolicy$LocationPermissionQuery-IA android.telephony.LocationAccessPolicy$LocationPermissionQuery android.telephony.LocationAccessPolicy$LocationPermissionResult +android.telephony.LocationAccessPolicy-IA android.telephony.LocationAccessPolicy android.telephony.LteVopsSupportInfo$1 android.telephony.LteVopsSupportInfo-IA @@ -7758,6 +7821,7 @@ android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda0 android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda1 android.telephony.TelephonyRegistryManager$$ExternalSyntheticLambda2 android.telephony.TelephonyRegistryManager$1$$ExternalSyntheticLambda0 +android.telephony.TelephonyRegistryManager$1 android.telephony.TelephonyRegistryManager$2 android.telephony.TelephonyRegistryManager$3 android.telephony.TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper$$ExternalSyntheticLambda0 @@ -8082,33 +8146,23 @@ android.text.Html$TagHandler android.text.Html android.text.HtmlToSpannedConverter$Alignment android.text.HtmlToSpannedConverter$Background -android.text.HtmlToSpannedConverter$Big-IA android.text.HtmlToSpannedConverter$Big -android.text.HtmlToSpannedConverter$Blockquote-IA android.text.HtmlToSpannedConverter$Blockquote -android.text.HtmlToSpannedConverter$Bold-IA android.text.HtmlToSpannedConverter$Bold -android.text.HtmlToSpannedConverter$Bullet-IA android.text.HtmlToSpannedConverter$Bullet android.text.HtmlToSpannedConverter$Font android.text.HtmlToSpannedConverter$Foreground android.text.HtmlToSpannedConverter$Heading android.text.HtmlToSpannedConverter$Href -android.text.HtmlToSpannedConverter$Italic-IA android.text.HtmlToSpannedConverter$Italic -android.text.HtmlToSpannedConverter$Monospace-IA android.text.HtmlToSpannedConverter$Monospace android.text.HtmlToSpannedConverter$Newline -android.text.HtmlToSpannedConverter$Small-IA android.text.HtmlToSpannedConverter$Small -android.text.HtmlToSpannedConverter$Strikethrough-IA android.text.HtmlToSpannedConverter$Strikethrough -android.text.HtmlToSpannedConverter$Sub-IA android.text.HtmlToSpannedConverter$Sub -android.text.HtmlToSpannedConverter$Super-IA android.text.HtmlToSpannedConverter$Super -android.text.HtmlToSpannedConverter$Underline-IA android.text.HtmlToSpannedConverter$Underline +android.text.HtmlToSpannedConverter-IA android.text.HtmlToSpannedConverter android.text.Hyphenator android.text.InputFilter$LengthFilter @@ -8144,6 +8198,7 @@ android.text.Selection$MemoryTextWatcher android.text.Selection$PositionIterator android.text.Selection$START android.text.Selection +android.text.SpanColors android.text.SpanSet android.text.SpanWatcher android.text.Spannable$Factory @@ -8165,9 +8220,9 @@ android.text.TextDirectionHeuristics$TextDirectionHeuristicImpl android.text.TextDirectionHeuristics$TextDirectionHeuristicInternal android.text.TextDirectionHeuristics$TextDirectionHeuristicLocale android.text.TextDirectionHeuristics -android.text.TextLine$DecorationInfo-IA android.text.TextLine$DecorationInfo android.text.TextLine$LineInfo +android.text.TextLine-IA android.text.TextLine android.text.TextPaint android.text.TextShaper$GlyphsConsumer @@ -8306,6 +8361,7 @@ android.timezone.TelephonyLookup android.timezone.TelephonyNetwork android.timezone.TelephonyNetworkFinder android.timezone.TimeZoneFinder +android.tracing.Flags android.tracing.perfetto.CreateIncrementalStateArgs android.tracing.perfetto.CreateTlsStateArgs android.tracing.perfetto.DataSource @@ -8376,8 +8432,8 @@ android.transition.TransitionValues android.transition.TransitionValuesMaps android.transition.Visibility$1 android.transition.Visibility$DisappearListener -android.transition.Visibility$VisibilityInfo-IA android.transition.Visibility$VisibilityInfo +android.transition.Visibility-IA android.transition.Visibility android.transition.VisibilityPropagation android.transparency.BinaryTransparencyManager @@ -8427,6 +8483,7 @@ android.util.FeatureFlagUtils android.util.FloatProperty android.util.Half android.util.IconDrawableFactory +android.util.IndentingPrintWriter android.util.IntArray android.util.IntProperty android.util.JsonReader$1 @@ -8490,6 +8547,7 @@ android.util.RecurrenceRule$NonrecurringIterator android.util.RecurrenceRule android.util.ReflectiveProperty android.util.RotationUtils +android.util.SequenceUtils android.util.Singleton android.util.Size android.util.SizeF$1 @@ -8590,9 +8648,7 @@ android.view.Choreographer$1 android.view.Choreographer$2 android.view.Choreographer$3 android.view.Choreographer$4 -android.view.Choreographer$CallbackQueue-IA android.view.Choreographer$CallbackQueue -android.view.Choreographer$CallbackRecord-IA android.view.Choreographer$CallbackRecord android.view.Choreographer$FrameCallback android.view.Choreographer$FrameData @@ -8611,21 +8667,19 @@ android.view.CrossWindowBlurListeners android.view.CutoutSpecification$Parser android.view.CutoutSpecification android.view.Display$HdrCapabilities$1 -android.view.Display$HdrCapabilities-IA android.view.Display$HdrCapabilities android.view.Display$HdrSdrRatioListenerWrapper android.view.Display$Mode$1 -android.view.Display$Mode-IA android.view.Display$Mode +android.view.Display-IA android.view.Display android.view.DisplayAddress$Network$1 android.view.DisplayAddress$Network android.view.DisplayAddress$Physical$1 -android.view.DisplayAddress$Physical-IA android.view.DisplayAddress$Physical +android.view.DisplayAddress-IA android.view.DisplayAddress android.view.DisplayAdjustments -android.view.DisplayCutout$Bounds-IA android.view.DisplayCutout$Bounds android.view.DisplayCutout$CutoutPathParserInfo android.view.DisplayCutout$ParcelableWrapper$1 @@ -8670,8 +8724,8 @@ android.view.HandlerActionQueue$HandlerAction android.view.HandlerActionQueue android.view.HandwritingInitiator$HandwritableViewInfo android.view.HandwritingInitiator$HandwritingAreaTracker -android.view.HandwritingInitiator$State-IA android.view.HandwritingInitiator$State +android.view.HandwritingInitiator-IA android.view.HandwritingInitiator android.view.HapticScrollFeedbackProvider android.view.IAppTransitionAnimationSpecsFuture$Stub$Proxy @@ -8706,12 +8760,6 @@ android.view.IOnKeyguardExitResult$Stub android.view.IOnKeyguardExitResult android.view.IPinnedTaskListener$Stub android.view.IPinnedTaskListener -android.view.IRecentsAnimationController$Stub$Proxy -android.view.IRecentsAnimationController$Stub -android.view.IRecentsAnimationController -android.view.IRecentsAnimationRunner$Stub$Proxy -android.view.IRecentsAnimationRunner$Stub -android.view.IRecentsAnimationRunner android.view.IRemoteAnimationFinishedCallback$Stub$Proxy android.view.IRemoteAnimationFinishedCallback$Stub android.view.IRemoteAnimationFinishedCallback @@ -8763,7 +8811,6 @@ android.view.InputApplicationHandle android.view.InputChannel$1 android.view.InputChannel android.view.InputDevice$1 -android.view.InputDevice$MotionRange-IA android.view.InputDevice$MotionRange android.view.InputDevice$ViewBehavior android.view.InputDevice-IA @@ -8785,10 +8832,14 @@ android.view.InputWindowHandle android.view.InsetsAnimationControlCallbacks android.view.InsetsAnimationControlImpl$$ExternalSyntheticLambda0 android.view.InsetsAnimationControlImpl +android.view.InsetsAnimationControlRunner$SurfaceParamsApplier$$ExternalSyntheticLambda0 +android.view.InsetsAnimationControlRunner$SurfaceParamsApplier android.view.InsetsAnimationControlRunner +android.view.InsetsAnimationSpec android.view.InsetsAnimationThread android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda0 android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda1 +android.view.InsetsAnimationThreadControlRunner$$ExternalSyntheticLambda2 android.view.InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda0 android.view.InsetsAnimationThreadControlRunner$1$$ExternalSyntheticLambda1 android.view.InsetsAnimationThreadControlRunner$1 @@ -8796,7 +8847,6 @@ android.view.InsetsAnimationThreadControlRunner android.view.InsetsController$$ExternalSyntheticLambda0 android.view.InsetsController$$ExternalSyntheticLambda10 android.view.InsetsController$$ExternalSyntheticLambda11 -android.view.InsetsController$$ExternalSyntheticLambda12 android.view.InsetsController$$ExternalSyntheticLambda1 android.view.InsetsController$$ExternalSyntheticLambda2 android.view.InsetsController$$ExternalSyntheticLambda3 @@ -8911,10 +8961,10 @@ android.view.SearchEvent android.view.SoundEffectConstants android.view.SubMenu android.view.Surface$1 -android.view.Surface$CompatibleCanvas-IA android.view.Surface$CompatibleCanvas android.view.Surface$HwuiContext android.view.Surface$OutOfResourcesException +android.view.Surface-IA android.view.Surface android.view.SurfaceControl$1 android.view.SurfaceControl$Builder @@ -8931,6 +8981,7 @@ android.view.SurfaceControl$RefreshRateRange$1 android.view.SurfaceControl$RefreshRateRange android.view.SurfaceControl$RefreshRateRanges android.view.SurfaceControl$StaticDisplayInfo +android.view.SurfaceControl$Transaction$$ExternalSyntheticLambda1 android.view.SurfaceControl$Transaction$1 android.view.SurfaceControl$Transaction$2 android.view.SurfaceControl$Transaction @@ -8941,9 +8992,7 @@ android.view.SurfaceControl$TrustedPresentationThresholds android.view.SurfaceControl-IA android.view.SurfaceControl android.view.SurfaceControlHdrLayerInfoListener -android.view.SurfaceControlRegistry$DefaultReporter-IA android.view.SurfaceControlRegistry$DefaultReporter -android.view.SurfaceControlRegistry$NoOpRegistry-IA android.view.SurfaceControlRegistry$NoOpRegistry android.view.SurfaceControlRegistry$Reporter android.view.SurfaceControlRegistry-IA @@ -8961,14 +9010,14 @@ android.view.SurfaceView$$ExternalSyntheticLambda3 android.view.SurfaceView$$ExternalSyntheticLambda4 android.view.SurfaceView$$ExternalSyntheticLambda5 android.view.SurfaceView$1 -android.view.SurfaceView$2 +android.view.SurfaceView$SurfaceControlViewHostParent android.view.SurfaceView$SurfaceViewPositionUpdateListener -android.view.SurfaceView$SyncBufferTransactionCallback-IA android.view.SurfaceView$SyncBufferTransactionCallback +android.view.SurfaceView-IA android.view.SurfaceView android.view.SyncRtSurfaceTransactionApplier$SurfaceParams$Builder -android.view.SyncRtSurfaceTransactionApplier$SurfaceParams-IA android.view.SyncRtSurfaceTransactionApplier$SurfaceParams +android.view.SyncRtSurfaceTransactionApplier-IA android.view.SyncRtSurfaceTransactionApplier android.view.TextureView$$ExternalSyntheticLambda0 android.view.TextureView$$ExternalSyntheticLambda1 @@ -8977,8 +9026,8 @@ android.view.TextureView android.view.ThreadedRenderer$1$$ExternalSyntheticLambda0 android.view.ThreadedRenderer$1 android.view.ThreadedRenderer$DrawCallbacks -android.view.ThreadedRenderer$WebViewOverlayProvider-IA android.view.ThreadedRenderer$WebViewOverlayProvider +android.view.ThreadedRenderer-IA android.view.ThreadedRenderer android.view.TouchDelegate android.view.TunnelModeEnabledListener @@ -9021,13 +9070,10 @@ android.view.View$AttachInfo$InvalidateInfo android.view.View$AttachInfo android.view.View$BaseSavedState$1 android.view.View$BaseSavedState -android.view.View$CheckForLongPress-IA android.view.View$CheckForLongPress -android.view.View$CheckForTap-IA android.view.View$CheckForTap android.view.View$DeclaredOnClickListener android.view.View$DragShadowBuilder -android.view.View$ForegroundInfo-IA android.view.View$ForegroundInfo android.view.View$ListenerInfo android.view.View$MatchIdPredicate @@ -9047,19 +9093,16 @@ android.view.View$OnLongClickListener android.view.View$OnScrollChangeListener android.view.View$OnSystemUiVisibilityChangeListener android.view.View$OnTouchListener -android.view.View$PerformClick-IA android.view.View$PerformClick android.view.View$ScrollabilityCache android.view.View$SendAccessibilityEventThrottle android.view.View$SendViewScrolledAccessibilityEvent android.view.View$TintInfo -android.view.View$TooltipInfo-IA android.view.View$TooltipInfo android.view.View$TransformationInfo -android.view.View$UnsetPressedState-IA android.view.View$UnsetPressedState -android.view.View$VisibilityChangeForAutofillHandler-IA android.view.View$VisibilityChangeForAutofillHandler +android.view.View-IA android.view.View android.view.ViewAnimationHostBridge android.view.ViewAnimationUtils @@ -9097,10 +9140,10 @@ android.view.ViewParent android.view.ViewPropertyAnimator$1 android.view.ViewPropertyAnimator$2 android.view.ViewPropertyAnimator$3 -android.view.ViewPropertyAnimator$AnimatorEventListener-IA android.view.ViewPropertyAnimator$AnimatorEventListener android.view.ViewPropertyAnimator$NameValuesHolder android.view.ViewPropertyAnimator$PropertyBundle +android.view.ViewPropertyAnimator-IA android.view.ViewPropertyAnimator android.view.ViewRootImpl$$ExternalSyntheticLambda0 android.view.ViewRootImpl$$ExternalSyntheticLambda10 @@ -9121,6 +9164,8 @@ android.view.ViewRootImpl$$ExternalSyntheticLambda6 android.view.ViewRootImpl$$ExternalSyntheticLambda7 android.view.ViewRootImpl$$ExternalSyntheticLambda8 android.view.ViewRootImpl$$ExternalSyntheticLambda9 +android.view.ViewRootImpl$10 +android.view.ViewRootImpl$11 android.view.ViewRootImpl$1 android.view.ViewRootImpl$2 android.view.ViewRootImpl$3 @@ -9147,7 +9192,6 @@ android.view.ViewRootImpl$InputStage android.view.ViewRootImpl$InvalidateOnAnimationRunnable android.view.ViewRootImpl$NativePostImeInputStage android.view.ViewRootImpl$NativePreImeInputStage -android.view.ViewRootImpl$QueuedInputEvent-IA android.view.ViewRootImpl$QueuedInputEvent android.view.ViewRootImpl$SendWindowContentChangedAccessibilityEvent android.view.ViewRootImpl$SurfaceChangedCallback @@ -9162,12 +9206,12 @@ android.view.ViewRootImpl$SystemUiVisibilityInfo android.view.ViewRootImpl$TakenSurfaceHolder android.view.ViewRootImpl$TrackballAxis android.view.ViewRootImpl$TraversalRunnable -android.view.ViewRootImpl$UnhandledKeyManager-IA android.view.ViewRootImpl$UnhandledKeyManager android.view.ViewRootImpl$ViewPostImeInputStage android.view.ViewRootImpl$ViewPreImeInputStage android.view.ViewRootImpl$ViewRootHandler android.view.ViewRootImpl$WindowInputEventReceiver +android.view.ViewRootImpl-IA android.view.ViewRootImpl android.view.ViewRootInsetsControllerHost android.view.ViewRootRectTracker$ViewInfo @@ -9231,12 +9275,13 @@ android.view.WindowManager android.view.WindowManagerGlobal$$ExternalSyntheticLambda0 android.view.WindowManagerGlobal$1 android.view.WindowManagerGlobal$2 -android.view.WindowManagerGlobal$TrustedPresentationListener-IA android.view.WindowManagerGlobal$TrustedPresentationListener +android.view.WindowManagerGlobal-IA android.view.WindowManagerGlobal android.view.WindowManagerPolicyConstants$PointerEventListener android.view.WindowManagerPolicyConstants android.view.WindowMetrics +android.view.WindowRelayoutResult android.view.WindowlessWindowLayout android.view.WindowlessWindowManager android.view.accessibility.AccessibilityCache$AccessibilityNodeRefresher @@ -9253,10 +9298,9 @@ android.view.accessibility.AccessibilityManager$1 android.view.accessibility.AccessibilityManager$AccessibilityPolicy android.view.accessibility.AccessibilityManager$AccessibilityServicesStateChangeListener android.view.accessibility.AccessibilityManager$AccessibilityStateChangeListener -android.view.accessibility.AccessibilityManager$HighTextContrastChangeListener -android.view.accessibility.AccessibilityManager$MyCallback-IA android.view.accessibility.AccessibilityManager$MyCallback android.view.accessibility.AccessibilityManager$TouchExplorationStateChangeListener +android.view.accessibility.AccessibilityManager-IA android.view.accessibility.AccessibilityManager android.view.accessibility.AccessibilityNodeIdManager android.view.accessibility.AccessibilityNodeInfo$1 @@ -9310,11 +9354,12 @@ android.view.animation.Animation$NoImagePreloadHolder android.view.animation.Animation android.view.animation.AnimationSet android.view.animation.AnimationUtils$1 -android.view.animation.AnimationUtils$AnimationState-IA android.view.animation.AnimationUtils$AnimationState +android.view.animation.AnimationUtils-IA android.view.animation.AnimationUtils android.view.animation.AnticipateInterpolator android.view.animation.AnticipateOvershootInterpolator +android.view.animation.BackGestureInterpolator android.view.animation.BaseInterpolator android.view.animation.BounceInterpolator android.view.animation.ClipRectAnimation @@ -9343,7 +9388,6 @@ android.view.autofill.AutofillManager$$ExternalSyntheticLambda1 android.view.autofill.AutofillManager$$ExternalSyntheticLambda2 android.view.autofill.AutofillManager$$ExternalSyntheticLambda3 android.view.autofill.AutofillManager$$ExternalSyntheticLambda4 -android.view.autofill.AutofillManager$AugmentedAutofillManagerClient-IA android.view.autofill.AutofillManager$AugmentedAutofillManagerClient android.view.autofill.AutofillManager$AutofillCallback android.view.autofill.AutofillManager$AutofillClient @@ -9354,13 +9398,15 @@ android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLa android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda16 android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda18 android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda8 -android.view.autofill.AutofillManager$AutofillManagerClient-IA +android.view.autofill.AutofillManager$AutofillManagerClient$$ExternalSyntheticLambda9 android.view.autofill.AutofillManager$AutofillManagerClient android.view.autofill.AutofillManager$CompatibilityBridge android.view.autofill.AutofillManager$TrackedViews +android.view.autofill.AutofillManager-IA android.view.autofill.AutofillManager android.view.autofill.AutofillManagerInternal android.view.autofill.AutofillPopupWindow +android.view.autofill.AutofillStateFingerprint android.view.autofill.AutofillValue$1 android.view.autofill.AutofillValue-IA android.view.autofill.AutofillValue @@ -9387,9 +9433,9 @@ android.view.contentcapture.ContentCaptureEvent$1 android.view.contentcapture.ContentCaptureEvent android.view.contentcapture.ContentCaptureHelper android.view.contentcapture.ContentCaptureManager$ContentCaptureClient -android.view.contentcapture.ContentCaptureManager$LocalDataShareAdapterResourceManager-IA android.view.contentcapture.ContentCaptureManager$LocalDataShareAdapterResourceManager android.view.contentcapture.ContentCaptureManager$StrippedContext +android.view.contentcapture.ContentCaptureManager-IA android.view.contentcapture.ContentCaptureManager android.view.contentcapture.ContentCaptureSession android.view.contentcapture.ContentCaptureSessionId$1 @@ -9410,18 +9456,13 @@ android.view.contentcapture.IContentCaptureOptionsCallback android.view.contentcapture.IDataShareWriteAdapter$Stub android.view.contentcapture.IDataShareWriteAdapter android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda0 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda10 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda11 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda12 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda13 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda1 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda2 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda3 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda4 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda5 android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda6 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda8 -android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda9 +android.view.contentcapture.MainContentCaptureSession$$ExternalSyntheticLambda7 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda0 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver$$ExternalSyntheticLambda1 android.view.contentcapture.MainContentCaptureSession$SessionStateReceiver @@ -9481,15 +9522,13 @@ android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda0 android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda1 android.view.inputmethod.ImeTracker$Debug$$ExternalSyntheticLambda2 android.view.inputmethod.ImeTracker$Debug -android.view.inputmethod.ImeTracker$ImeJankTracker-IA android.view.inputmethod.ImeTracker$ImeJankTracker -android.view.inputmethod.ImeTracker$ImeLatencyTracker-IA android.view.inputmethod.ImeTracker$ImeLatencyTracker android.view.inputmethod.ImeTracker$InputMethodJankContext android.view.inputmethod.ImeTracker$InputMethodLatencyContext android.view.inputmethod.ImeTracker$Token$1 -android.view.inputmethod.ImeTracker$Token-IA android.view.inputmethod.ImeTracker$Token +android.view.inputmethod.ImeTracker-IA android.view.inputmethod.ImeTracker android.view.inputmethod.InlineSuggestionsRequest$1 android.view.inputmethod.InlineSuggestionsRequest @@ -9515,16 +9554,15 @@ android.view.inputmethod.InputMethodManager$1 android.view.inputmethod.InputMethodManager$2 android.view.inputmethod.InputMethodManager$6 android.view.inputmethod.InputMethodManager$BindState -android.view.inputmethod.InputMethodManager$DelegateImpl-IA android.view.inputmethod.InputMethodManager$DelegateImpl android.view.inputmethod.InputMethodManager$FinishedInputEventCallback android.view.inputmethod.InputMethodManager$H$$ExternalSyntheticLambda0 android.view.inputmethod.InputMethodManager$H$$ExternalSyntheticLambda1 android.view.inputmethod.InputMethodManager$H android.view.inputmethod.InputMethodManager$ImeInputEventSender -android.view.inputmethod.InputMethodManager$PendingEvent-IA android.view.inputmethod.InputMethodManager$PendingEvent android.view.inputmethod.InputMethodManager$ReportInputConnectionOpenedRunner +android.view.inputmethod.InputMethodManager-IA android.view.inputmethod.InputMethodManager android.view.inputmethod.InputMethodManagerGlobal android.view.inputmethod.InputMethodSession$EventCallback @@ -9585,7 +9623,6 @@ android.view.textclassifier.ConversationAction android.view.textclassifier.ConversationActions$1 android.view.textclassifier.ConversationActions$Message$1 android.view.textclassifier.ConversationActions$Message$Builder -android.view.textclassifier.ConversationActions$Message-IA android.view.textclassifier.ConversationActions$Message android.view.textclassifier.ConversationActions$Request$1 android.view.textclassifier.ConversationActions$Request$Builder @@ -9603,8 +9640,8 @@ android.view.textclassifier.SelectionEvent android.view.textclassifier.SelectionSessionLogger$SignatureParser android.view.textclassifier.SelectionSessionLogger android.view.textclassifier.SystemTextClassifier$BlockingCallback -android.view.textclassifier.SystemTextClassifier$ResponseReceiver-IA android.view.textclassifier.SystemTextClassifier$ResponseReceiver +android.view.textclassifier.SystemTextClassifier-IA android.view.textclassifier.SystemTextClassifier android.view.textclassifier.SystemTextClassifierMetadata$1 android.view.textclassifier.SystemTextClassifierMetadata @@ -9632,23 +9669,19 @@ android.view.textclassifier.TextClassificationSessionId android.view.textclassifier.TextClassifier$1 android.view.textclassifier.TextClassifier$EntityConfig$1 android.view.textclassifier.TextClassifier$EntityConfig$Builder -android.view.textclassifier.TextClassifier$EntityConfig-IA android.view.textclassifier.TextClassifier$EntityConfig android.view.textclassifier.TextClassifier$Utils +android.view.textclassifier.TextClassifier-IA android.view.textclassifier.TextClassifier android.view.textclassifier.TextClassifierEvent$1 android.view.textclassifier.TextClassifierEvent$Builder android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent$1 -android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent-IA android.view.textclassifier.TextClassifierEvent$ConversationActionsEvent android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent$1 -android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent-IA android.view.textclassifier.TextClassifierEvent$LanguageDetectionEvent android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent$1 -android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent-IA android.view.textclassifier.TextClassifierEvent$TextLinkifyEvent android.view.textclassifier.TextClassifierEvent$TextSelectionEvent$1 -android.view.textclassifier.TextClassifierEvent$TextSelectionEvent-IA android.view.textclassifier.TextClassifierEvent$TextSelectionEvent android.view.textclassifier.TextClassifierEvent-IA android.view.textclassifier.TextClassifierEvent @@ -9681,7 +9714,6 @@ android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl$1 android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl$SpellCheckerParams android.view.textservice.SpellCheckerSession$SpellCheckerSessionListenerImpl android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams$Builder -android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams-IA android.view.textservice.SpellCheckerSession$SpellCheckerSessionParams android.view.textservice.SpellCheckerSession android.view.textservice.SpellCheckerSubtype$1 @@ -9787,12 +9819,9 @@ android.widget.AbsListView$3 android.widget.AbsListView$4 android.widget.AbsListView$AbsPositionScroller android.widget.AbsListView$AdapterDataSetObserver -android.widget.AbsListView$CheckForKeyLongPress-IA android.widget.AbsListView$CheckForKeyLongPress android.widget.AbsListView$CheckForLongPress -android.widget.AbsListView$CheckForTap-IA android.widget.AbsListView$CheckForTap -android.widget.AbsListView$DeviceConfigChangeListener-IA android.widget.AbsListView$DeviceConfigChangeListener android.widget.AbsListView$FlingRunnable$1 android.widget.AbsListView$FlingRunnable @@ -9802,7 +9831,6 @@ android.widget.AbsListView$ListItemAccessibilityDelegate android.widget.AbsListView$MultiChoiceModeListener android.widget.AbsListView$MultiChoiceModeWrapper android.widget.AbsListView$OnScrollListener -android.widget.AbsListView$PerformClick-IA android.widget.AbsListView$PerformClick android.widget.AbsListView$PositionScroller android.widget.AbsListView$RecycleBin @@ -9810,8 +9838,8 @@ android.widget.AbsListView$RecyclerListener android.widget.AbsListView$SavedState$1 android.widget.AbsListView$SavedState android.widget.AbsListView$SelectionBoundsAdjuster -android.widget.AbsListView$WindowRunnnable-IA android.widget.AbsListView$WindowRunnnable +android.widget.AbsListView-IA android.widget.AbsListView android.widget.AbsSeekBar android.widget.AbsSpinner$RecycleBin @@ -9847,13 +9875,11 @@ android.widget.AdapterView android.widget.ArrayAdapter android.widget.AutoCompleteTextView$$ExternalSyntheticLambda0 android.widget.AutoCompleteTextView$$ExternalSyntheticLambda1 -android.widget.AutoCompleteTextView$DropDownItemClickListener-IA android.widget.AutoCompleteTextView$DropDownItemClickListener -android.widget.AutoCompleteTextView$MyWatcher-IA android.widget.AutoCompleteTextView$MyWatcher -android.widget.AutoCompleteTextView$PassThroughClickListener-IA android.widget.AutoCompleteTextView$PassThroughClickListener android.widget.AutoCompleteTextView$Validator +android.widget.AutoCompleteTextView-IA android.widget.AutoCompleteTextView android.widget.BaseAdapter android.widget.Button @@ -9881,21 +9907,16 @@ android.widget.Editor$1 android.widget.Editor$2 android.widget.Editor$3 android.widget.Editor$5 -android.widget.Editor$AccessibilitySmartActions-IA android.widget.Editor$AccessibilitySmartActions -android.widget.Editor$Blink-IA android.widget.Editor$Blink android.widget.Editor$CorrectionHighlighter -android.widget.Editor$CursorAnchorInfoNotifier-IA android.widget.Editor$CursorAnchorInfoNotifier android.widget.Editor$CursorController android.widget.Editor$EasyEditDeleteListener -android.widget.Editor$EasyEditPopupWindow-IA android.widget.Editor$EasyEditPopupWindow android.widget.Editor$EditOperation$1 android.widget.Editor$EditOperation android.widget.Editor$ErrorPopup -android.widget.Editor$HandleView-IA android.widget.Editor$HandleView android.widget.Editor$InputContentType android.widget.Editor$InputMethodState @@ -9906,24 +9927,20 @@ android.widget.Editor$InsertionPointCursorController$1 android.widget.Editor$InsertionPointCursorController android.widget.Editor$MagnifierMotionAnimator android.widget.Editor$PinnedPopupWindow -android.widget.Editor$PositionListener-IA android.widget.Editor$PositionListener -android.widget.Editor$ProcessTextIntentActionsHandler-IA android.widget.Editor$ProcessTextIntentActionsHandler android.widget.Editor$SelectionHandleView android.widget.Editor$SelectionModifierCursorController android.widget.Editor$SpanController$1 android.widget.Editor$SpanController$2 -android.widget.Editor$SpanController-IA android.widget.Editor$SpanController -android.widget.Editor$SuggestionHelper$SuggestionSpanComparator-IA android.widget.Editor$SuggestionHelper$SuggestionSpanComparator -android.widget.Editor$SuggestionHelper-IA android.widget.Editor$SuggestionHelper android.widget.Editor$SuggestionsPopupWindow android.widget.Editor$TextRenderNode android.widget.Editor$TextViewPositionListener android.widget.Editor$UndoInputFilter +android.widget.Editor-IA android.widget.Editor android.widget.EditorTouchState android.widget.FastScroller$1 @@ -9938,8 +9955,8 @@ android.widget.Filter$FilterListener android.widget.Filter$FilterResults android.widget.Filter$RequestArguments android.widget.Filter$RequestHandler -android.widget.Filter$ResultsHandler-IA android.widget.Filter$ResultsHandler +android.widget.Filter-IA android.widget.Filter android.widget.Filterable android.widget.ForwardingListener @@ -9958,15 +9975,14 @@ android.widget.GridLayout$Alignment android.widget.GridLayout$Arc android.widget.GridLayout$Assoc android.widget.GridLayout$Axis$1 -android.widget.GridLayout$Axis-IA android.widget.GridLayout$Axis android.widget.GridLayout$Bounds android.widget.GridLayout$Interval android.widget.GridLayout$LayoutParams android.widget.GridLayout$MutableInt -android.widget.GridLayout$PackedMap-IA android.widget.GridLayout$PackedMap android.widget.GridLayout$Spec +android.widget.GridLayout-IA android.widget.GridLayout android.widget.HeaderViewListAdapter android.widget.HorizontalScrollView$SavedState$1 @@ -9979,22 +9995,17 @@ android.widget.ImageView android.widget.LinearLayout$LayoutParams android.widget.LinearLayout android.widget.ListAdapter -android.widget.ListPopupWindow$ListSelectorHider-IA android.widget.ListPopupWindow$ListSelectorHider -android.widget.ListPopupWindow$PopupDataSetObserver-IA android.widget.ListPopupWindow$PopupDataSetObserver -android.widget.ListPopupWindow$PopupScrollListener-IA android.widget.ListPopupWindow$PopupScrollListener -android.widget.ListPopupWindow$PopupTouchInterceptor-IA android.widget.ListPopupWindow$PopupTouchInterceptor -android.widget.ListPopupWindow$ResizePopupRunnable-IA android.widget.ListPopupWindow$ResizePopupRunnable +android.widget.ListPopupWindow-IA android.widget.ListPopupWindow -android.widget.ListView$ArrowScrollFocusResult-IA android.widget.ListView$ArrowScrollFocusResult android.widget.ListView$FixedViewInfo -android.widget.ListView$FocusSelector-IA android.widget.ListView$FocusSelector +android.widget.ListView-IA android.widget.ListView android.widget.Magnifier$Builder android.widget.Magnifier$InternalPopupWindow @@ -10025,14 +10036,12 @@ android.widget.PopupWindow$PopupDecorView android.widget.PopupWindow android.widget.ProgressBar$1 android.widget.ProgressBar$2 -android.widget.ProgressBar$ProgressTintInfo-IA android.widget.ProgressBar$ProgressTintInfo android.widget.ProgressBar$RefreshData -android.widget.ProgressBar$RefreshProgressRunnable-IA android.widget.ProgressBar$RefreshProgressRunnable android.widget.ProgressBar$SavedState$1 -android.widget.ProgressBar$SavedState-IA android.widget.ProgressBar$SavedState +android.widget.ProgressBar-IA android.widget.ProgressBar android.widget.QuickContactBadge android.widget.RadioButton @@ -10040,19 +10049,21 @@ android.widget.RadioGroup$OnCheckedChangeListener android.widget.RadioGroup android.widget.RatingBar android.widget.RelativeLayout$DependencyGraph$Node -android.widget.RelativeLayout$DependencyGraph-IA android.widget.RelativeLayout$DependencyGraph android.widget.RelativeLayout$LayoutParams android.widget.RelativeLayout$TopToBottomLeftToRightComparator +android.widget.RelativeLayout-IA android.widget.RelativeLayout android.widget.RemoteViews$$ExternalSyntheticLambda0 android.widget.RemoteViews$$ExternalSyntheticLambda1 android.widget.RemoteViews$$ExternalSyntheticLambda2 +android.widget.RemoteViews$$ExternalSyntheticLambda4 +android.widget.RemoteViews$$ExternalSyntheticLambda5 android.widget.RemoteViews$1 android.widget.RemoteViews$2 -android.widget.RemoteViews$Action-IA android.widget.RemoteViews$Action android.widget.RemoteViews$ActionException +android.widget.RemoteViews$ApplicationInfoCache$$ExternalSyntheticLambda0 android.widget.RemoteViews$ApplicationInfoCache android.widget.RemoteViews$AsyncApplyTask android.widget.RemoteViews$AttributeReflectionAction @@ -10068,6 +10079,7 @@ android.widget.RemoteViews$MethodArgs android.widget.RemoteViews$MethodKey android.widget.RemoteViews$NightModeReflectionAction android.widget.RemoteViews$OnViewAppliedListener +android.widget.RemoteViews$PendingResources android.widget.RemoteViews$ReflectionAction android.widget.RemoteViews$RemoteCollectionCache android.widget.RemoteViews$RemoteCollectionItems$1 @@ -10103,6 +10115,7 @@ android.widget.RemoteViews$ViewGroupActionRemove$1 android.widget.RemoteViews$ViewGroupActionRemove android.widget.RemoteViews$ViewPaddingAction android.widget.RemoteViews$ViewTree +android.widget.RemoteViews-IA android.widget.RemoteViews android.widget.RemoteViewsAdapter$AsyncRemoteAdapterAction android.widget.RemoteViewsAdapter$RemoteAdapterConnectionCallback @@ -10126,10 +10139,10 @@ android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda2 android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda3 android.widget.SelectionActionModeHelper$$ExternalSyntheticLambda8 android.widget.SelectionActionModeHelper$SelectionMetricsLogger -android.widget.SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable-IA android.widget.SelectionActionModeHelper$SelectionTracker$LogAbandonRunnable android.widget.SelectionActionModeHelper$SelectionTracker android.widget.SelectionActionModeHelper$TextClassificationHelper +android.widget.SelectionActionModeHelper-IA android.widget.SelectionActionModeHelper android.widget.SmartSelectSprite$$ExternalSyntheticLambda0 android.widget.SmartSelectSprite$$ExternalSyntheticLambda1 @@ -10140,11 +10153,10 @@ android.widget.Space android.widget.SpellChecker$1 android.widget.SpellChecker$RemoveReason android.widget.SpellChecker$SentenceIteratorWrapper -android.widget.SpellChecker$SpellParser-IA android.widget.SpellChecker$SpellParser +android.widget.SpellChecker-IA android.widget.SpellChecker android.widget.Spinner$1 -android.widget.Spinner$DialogPopup-IA android.widget.Spinner$DialogPopup android.widget.Spinner$DropDownAdapter android.widget.Spinner$DropdownPopup$1 @@ -10152,6 +10164,7 @@ android.widget.Spinner$DropdownPopup android.widget.Spinner$SavedState$1 android.widget.Spinner$SavedState android.widget.Spinner$SpinnerPopup +android.widget.Spinner-IA android.widget.Spinner android.widget.SpinnerAdapter android.widget.Switch$1 @@ -10176,7 +10189,6 @@ android.widget.TextView$2 android.widget.TextView$3 android.widget.TextView$4 android.widget.TextView$BufferType -android.widget.TextView$ChangeWatcher-IA android.widget.TextView$ChangeWatcher android.widget.TextView$CharWrapper android.widget.TextView$Drawables @@ -10186,23 +10198,22 @@ android.widget.TextView$Marquee$3 android.widget.TextView$Marquee android.widget.TextView$OnEditorActionListener android.widget.TextView$SavedState$1 -android.widget.TextView$SavedState-IA android.widget.TextView$SavedState -android.widget.TextView$TextAppearanceAttributes-IA android.widget.TextView$TextAppearanceAttributes +android.widget.TextView-IA android.widget.TextView -android.widget.TextViewOnReceiveContentListener$InputConnectionInfo-IA android.widget.TextViewOnReceiveContentListener$InputConnectionInfo +android.widget.TextViewOnReceiveContentListener-IA android.widget.TextViewOnReceiveContentListener android.widget.TextViewTranslationCallback android.widget.ThemedSpinnerAdapter android.widget.Toast$Callback android.widget.Toast$CallbackBinder$$ExternalSyntheticLambda0 android.widget.Toast$CallbackBinder$$ExternalSyntheticLambda1 -android.widget.Toast$CallbackBinder-IA android.widget.Toast$CallbackBinder android.widget.Toast$TN$1 android.widget.Toast$TN +android.widget.Toast-IA android.widget.Toast android.widget.ToastPresenter android.widget.ToggleButton @@ -10219,6 +10230,8 @@ android.widget.ViewFlipper$1 android.widget.ViewFlipper android.widget.ViewSwitcher android.widget.WrapperListAdapter +android.widget.flags.FeatureFlags +android.widget.flags.FeatureFlagsImpl android.widget.flags.Flags android.widget.inline.InlinePresentationSpec$1 android.widget.inline.InlinePresentationSpec$BaseBuilder @@ -10234,6 +10247,7 @@ android.window.BackMotionEvent android.window.BackNavigationInfo$1 android.window.BackNavigationInfo android.window.BackProgressAnimator$$ExternalSyntheticLambda0 +android.window.BackProgressAnimator$$ExternalSyntheticLambda1 android.window.BackProgressAnimator$1 android.window.BackProgressAnimator$ProgressCallback android.window.BackProgressAnimator @@ -10290,7 +10304,6 @@ android.window.IWindowContainerTransactionCallback android.window.IWindowOrganizerController$Stub$Proxy android.window.IWindowOrganizerController$Stub android.window.IWindowOrganizerController -android.window.ImeOnBackInvokedDispatcher$$ExternalSyntheticLambda0 android.window.ImeOnBackInvokedDispatcher$1 android.window.ImeOnBackInvokedDispatcher$2 android.window.ImeOnBackInvokedDispatcher$DefaultImeOnBackAnimationCallback @@ -10336,9 +10349,9 @@ android.window.SurfaceSyncGroup$$ExternalSyntheticLambda5 android.window.SurfaceSyncGroup$$ExternalSyntheticLambda6 android.window.SurfaceSyncGroup$1 android.window.SurfaceSyncGroup$2 -android.window.SurfaceSyncGroup$ISurfaceSyncGroupImpl-IA android.window.SurfaceSyncGroup$ISurfaceSyncGroupImpl android.window.SurfaceSyncGroup$SurfaceViewFrameCallback +android.window.SurfaceSyncGroup-IA android.window.SurfaceSyncGroup android.window.TaskAppearedInfo$1 android.window.TaskAppearedInfo @@ -10378,13 +10391,15 @@ android.window.WindowInfosListener android.window.WindowMetricsController$$ExternalSyntheticLambda0 android.window.WindowMetricsController android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda0 +android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda1 +android.window.WindowOnBackInvokedDispatcher$$ExternalSyntheticLambda2 android.window.WindowOnBackInvokedDispatcher$Checker android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda0 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda1 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda2 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda3 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda4 -android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$CallbackRef +android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper$$ExternalSyntheticLambda5 android.window.WindowOnBackInvokedDispatcher$OnBackInvokedCallbackWrapper android.window.WindowOnBackInvokedDispatcher android.window.WindowOrganizer$1 @@ -10396,6 +10411,9 @@ android.window.WindowTokenClientController com.android.apex.ApexInfo com.android.apex.ApexInfoList com.android.apex.XmlParser +com.android.art.flags.FeatureFlags +com.android.art.flags.FeatureFlagsImpl +com.android.art.flags.Flags com.android.cellbroadcastservice.CellBroadcastStatsLog com.android.framework.protobuf.AbstractMessageLite$Builder com.android.framework.protobuf.AbstractMessageLite @@ -10468,9 +10486,15 @@ com.android.framework.protobuf.nano.InternalNano com.android.framework.protobuf.nano.InvalidProtocolBufferNanoException com.android.framework.protobuf.nano.MessageNano com.android.framework.protobuf.nano.WireFormatNano +com.android.graphics.flags.FeatureFlags +com.android.graphics.flags.FeatureFlagsImpl +com.android.graphics.flags.Flags com.android.graphics.hwui.flags.FeatureFlags com.android.graphics.hwui.flags.FeatureFlagsImpl com.android.graphics.hwui.flags.Flags +com.android.graphics.surfaceflinger.flags.FeatureFlags +com.android.graphics.surfaceflinger.flags.FeatureFlagsImpl +com.android.graphics.surfaceflinger.flags.Flags com.android.i18n.phonenumbers.AlternateFormatsCountryCodeSet com.android.i18n.phonenumbers.AsYouTypeFormatter com.android.i18n.phonenumbers.CountryCodeToRegionCodeMap @@ -10606,6 +10630,7 @@ com.android.icu.util.ExtendedCalendar com.android.icu.util.ExtendedTimeZone com.android.icu.util.Icu4cMetadata com.android.icu.util.LocaleNative +com.android.icu.util.UResourceBundleNative com.android.icu.util.regex.MatcherNative com.android.icu.util.regex.PatternNative com.android.ims.FeatureConnection$$ExternalSyntheticLambda0 @@ -10659,6 +10684,7 @@ com.android.ims.ImsManager$$ExternalSyntheticLambda2 com.android.ims.ImsManager$$ExternalSyntheticLambda3 com.android.ims.ImsManager$$ExternalSyntheticLambda4 com.android.ims.ImsManager$$ExternalSyntheticLambda5 +com.android.ims.ImsManager$$ExternalSyntheticLambda6 com.android.ims.ImsManager$$ExternalSyntheticLambda7 com.android.ims.ImsManager$$ExternalSyntheticLambda8 com.android.ims.ImsManager$$ExternalSyntheticLambda9 @@ -10690,6 +10716,7 @@ com.android.ims.RcsFeatureConnection$RegistrationCallbackManager com.android.ims.RcsFeatureConnection com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda0 com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda1 +com.android.ims.RcsFeatureManager$$ExternalSyntheticLambda2 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda0 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda1 com.android.ims.RcsFeatureManager$1$$ExternalSyntheticLambda2 @@ -10735,6 +10762,7 @@ com.android.ims.internal.IImsRegistrationListener$Stub com.android.ims.internal.IImsRegistrationListener com.android.ims.internal.IImsServiceController$Stub com.android.ims.internal.IImsServiceController +com.android.ims.internal.IImsServiceFeatureCallback$Stub$Proxy com.android.ims.internal.IImsServiceFeatureCallback$Stub com.android.ims.internal.IImsServiceFeatureCallback com.android.ims.internal.IImsStreamMediaSession @@ -11013,7 +11041,6 @@ com.android.internal.app.AlertController$ButtonHandler com.android.internal.app.AlertController$RecycleListView com.android.internal.app.AlertController com.android.internal.app.AssistUtils -com.android.internal.app.IAppOpsActiveCallback$Stub$Proxy com.android.internal.app.IAppOpsActiveCallback$Stub com.android.internal.app.IAppOpsActiveCallback com.android.internal.app.IAppOpsAsyncNotedCallback$Stub @@ -11100,6 +11127,7 @@ com.android.internal.appwidget.IAppWidgetHost com.android.internal.appwidget.IAppWidgetService$Stub$Proxy com.android.internal.appwidget.IAppWidgetService$Stub com.android.internal.appwidget.IAppWidgetService +com.android.internal.backup.IBackupTransport$Stub$Proxy com.android.internal.backup.IBackupTransport$Stub com.android.internal.backup.IBackupTransport com.android.internal.colorextraction.ColorExtractor$GradientColors @@ -11177,6 +11205,7 @@ com.android.internal.dynamicanimation.animation.DynamicAnimation$8 com.android.internal.dynamicanimation.animation.DynamicAnimation$9 com.android.internal.dynamicanimation.animation.DynamicAnimation$MassState com.android.internal.dynamicanimation.animation.DynamicAnimation$OnAnimationEndListener +com.android.internal.dynamicanimation.animation.DynamicAnimation$OnAnimationUpdateListener com.android.internal.dynamicanimation.animation.DynamicAnimation$ViewProperty com.android.internal.dynamicanimation.animation.DynamicAnimation com.android.internal.dynamicanimation.animation.Force @@ -11196,13 +11225,29 @@ com.android.internal.graphics.drawable.BackgroundBlurDrawable$Aggregator com.android.internal.graphics.drawable.BackgroundBlurDrawable$BlurRegion com.android.internal.graphics.drawable.BackgroundBlurDrawable-IA com.android.internal.graphics.drawable.BackgroundBlurDrawable +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.app.appfunctions.flags.Flags +com.android.internal.hidden_from_bootclasspath.android.app.job.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.app.job.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.app.job.Flags +com.android.internal.hidden_from_bootclasspath.android.content.pm.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.content.pm.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.content.pm.Flags com.android.internal.hidden_from_bootclasspath.android.os.FeatureFlags com.android.internal.hidden_from_bootclasspath.android.os.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.os.Flags +com.android.internal.hidden_from_bootclasspath.android.permission.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.android.permission.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.android.permission.flags.Flags com.android.internal.hidden_from_bootclasspath.android.service.notification.FeatureFlags com.android.internal.hidden_from_bootclasspath.android.service.notification.FeatureFlagsImpl com.android.internal.hidden_from_bootclasspath.android.service.notification.Flags +com.android.internal.hidden_from_bootclasspath.com.android.libcore.Flags +com.android.internal.hidden_from_bootclasspath.com.android.server.power.optimization.Flags +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.FeatureFlags +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.FeatureFlagsImpl +com.android.internal.hidden_from_bootclasspath.com.android.window.flags.Flags com.android.internal.infra.AbstractMultiplePendingRequestsRemoteService com.android.internal.infra.AbstractRemoteService$AsyncRequest com.android.internal.infra.AbstractRemoteService$BasePendingRequest @@ -11252,6 +11297,7 @@ com.android.internal.inputmethod.IRemoteInputConnection$Stub com.android.internal.inputmethod.IRemoteInputConnection com.android.internal.inputmethod.ImeTracing com.android.internal.inputmethod.ImeTracingClientImpl +com.android.internal.inputmethod.ImeTracingPerfettoImpl com.android.internal.inputmethod.ImeTracingServerImpl com.android.internal.inputmethod.InputBindResult$1 com.android.internal.inputmethod.InputBindResult-IA @@ -11292,8 +11338,8 @@ com.android.internal.jank.InteractionJankMonitor$$ExternalSyntheticLambda9 com.android.internal.jank.InteractionJankMonitor$Configuration com.android.internal.jank.InteractionJankMonitor$RunningTracker com.android.internal.jank.InteractionJankMonitor$TimeFunction -com.android.internal.jank.InteractionJankMonitor$TrackerResult-IA com.android.internal.jank.InteractionJankMonitor$TrackerResult +com.android.internal.jank.InteractionJankMonitor-IA com.android.internal.listeners.ListenerExecutor$$ExternalSyntheticLambda0 com.android.internal.listeners.ListenerExecutor$FailureCallback com.android.internal.listeners.ListenerExecutor$ListenerOperation @@ -11355,8 +11401,8 @@ com.android.internal.os.BinderCallsStats$ExportedCallStat com.android.internal.os.BinderCallsStats$Injector com.android.internal.os.BinderCallsStats$OverflowBinder com.android.internal.os.BinderCallsStats$UidEntry -com.android.internal.os.BinderDeathDispatcher$RecipientsInfo-IA com.android.internal.os.BinderDeathDispatcher$RecipientsInfo +com.android.internal.os.BinderDeathDispatcher-IA com.android.internal.os.BinderDeathDispatcher com.android.internal.os.BinderInternal$BinderProxyCountEventListenerDelegate com.android.internal.os.BinderInternal$CallSession @@ -11377,6 +11423,7 @@ com.android.internal.os.CachedDeviceState$TimeInStateStopwatch com.android.internal.os.CachedDeviceState com.android.internal.os.ClassLoaderFactory com.android.internal.os.Clock +com.android.internal.os.DebugStore com.android.internal.os.FeatureFlags com.android.internal.os.FeatureFlagsImpl com.android.internal.os.Flags @@ -11436,10 +11483,10 @@ com.android.internal.os.LongArrayMultiStateCounter$LongArrayContainer com.android.internal.os.LongArrayMultiStateCounter com.android.internal.os.LongMultiStateCounter$1 com.android.internal.os.LongMultiStateCounter -com.android.internal.os.LooperStats$DispatchSession-IA com.android.internal.os.LooperStats$DispatchSession com.android.internal.os.LooperStats$Entry com.android.internal.os.LooperStats$ExportedEntry +com.android.internal.os.LooperStats-IA com.android.internal.os.LooperStats com.android.internal.os.PowerProfile$CpuClusterKey com.android.internal.os.PowerProfile @@ -11460,9 +11507,9 @@ com.android.internal.os.RuntimeInit$$ExternalSyntheticLambda1 com.android.internal.os.RuntimeInit$ApplicationWtfHandler com.android.internal.os.RuntimeInit$Arguments com.android.internal.os.RuntimeInit$KillApplicationHandler -com.android.internal.os.RuntimeInit$LoggingHandler-IA com.android.internal.os.RuntimeInit$LoggingHandler com.android.internal.os.RuntimeInit$MethodAndArgsCaller +com.android.internal.os.RuntimeInit-IA com.android.internal.os.RuntimeInit com.android.internal.os.SafeZipPathValidatorCallback com.android.internal.os.SomeArgs @@ -11535,12 +11582,12 @@ com.android.internal.policy.PhoneWindow$$ExternalSyntheticLambda1 com.android.internal.policy.PhoneWindow$1 com.android.internal.policy.PhoneWindow$ActionMenuPresenterCallback com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState$1 -com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState-IA com.android.internal.policy.PhoneWindow$PanelFeatureState$SavedState com.android.internal.policy.PhoneWindow$PanelFeatureState com.android.internal.policy.PhoneWindow$PhoneWindowMenuCallback com.android.internal.policy.PhoneWindow$RotationWatcher$1 com.android.internal.policy.PhoneWindow$RotationWatcher +com.android.internal.policy.PhoneWindow-IA com.android.internal.policy.PhoneWindow com.android.internal.policy.ScreenDecorationsUtils com.android.internal.policy.SystemBarUtils @@ -11555,6 +11602,8 @@ com.android.internal.protolog.ProtoLogViewerConfigReader com.android.internal.protolog.common.BitmaskConversionException com.android.internal.protolog.common.IProtoLogGroup com.android.internal.protolog.common.LogDataType +com.android.internal.ravenwood.RavenwoodEnvironment$Workaround +com.android.internal.ravenwood.RavenwoodEnvironment com.android.internal.security.VerityUtils com.android.internal.statusbar.IAddTileResultCallback com.android.internal.statusbar.IStatusBar$Stub @@ -11794,6 +11843,7 @@ com.android.internal.telephony.IState com.android.internal.telephony.ISub$Stub$Proxy com.android.internal.telephony.ISub$Stub com.android.internal.telephony.ISub +com.android.internal.telephony.ITelephony$Stub$Proxy com.android.internal.telephony.ITelephony$Stub com.android.internal.telephony.ITelephony com.android.internal.telephony.ITelephonyRegistry$Stub$Proxy @@ -11959,6 +12009,7 @@ com.android.internal.telephony.PhoneSubInfoController$$ExternalSyntheticLambda8 com.android.internal.telephony.PhoneSubInfoController$$ExternalSyntheticLambda9 com.android.internal.telephony.PhoneSubInfoController$CallPhoneMethodHelper com.android.internal.telephony.PhoneSubInfoController$PermissionCheckHelper +com.android.internal.telephony.PhoneSubInfoController com.android.internal.telephony.ProxyController$1 com.android.internal.telephony.ProxyController com.android.internal.telephony.RIL$RadioProxyDeathRecipient @@ -12351,6 +12402,7 @@ com.android.internal.telephony.euicc.EuiccController$9 com.android.internal.telephony.euicc.EuiccController$DownloadSubscriptionGetMetadataCommandCallback com.android.internal.telephony.euicc.EuiccController$GetDefaultListCommandCallback com.android.internal.telephony.euicc.EuiccController$GetMetadataCommandCallback +com.android.internal.telephony.euicc.EuiccController com.android.internal.telephony.euicc.EuiccOperation$1 com.android.internal.telephony.euicc.EuiccOperation$Action com.android.internal.telephony.euicc.EuiccOperation @@ -12529,6 +12581,7 @@ com.android.internal.telephony.imsphone.ImsPhoneCallTracker$HoldSwapState com.android.internal.telephony.imsphone.ImsPhoneCallTracker$MmTelFeatureListener com.android.internal.telephony.imsphone.ImsPhoneCallTracker$PhoneStateListener com.android.internal.telephony.imsphone.ImsPhoneCallTracker$SharedPreferenceProxy +com.android.internal.telephony.imsphone.ImsPhoneCallTracker$VtDataUsageProvider com.android.internal.telephony.imsphone.ImsPhoneCallTracker com.android.internal.telephony.imsphone.ImsPhoneCommandInterface com.android.internal.telephony.imsphone.ImsPhoneConnection$$ExternalSyntheticLambda0 @@ -12583,6 +12636,7 @@ com.android.internal.telephony.metrics.PersistAtomsStorage$$ExternalSyntheticLam com.android.internal.telephony.metrics.PersistAtomsStorage$$ExternalSyntheticLambda7 com.android.internal.telephony.metrics.PersistAtomsStorage$1 com.android.internal.telephony.metrics.PersistAtomsStorage +com.android.internal.telephony.metrics.SatelliteStats$CarrierRoamingSatelliteControllerStatsParams com.android.internal.telephony.metrics.ServiceStateStats$$ExternalSyntheticLambda0 com.android.internal.telephony.metrics.ServiceStateStats$TimestampedServiceState com.android.internal.telephony.metrics.ServiceStateStats @@ -12612,6 +12666,8 @@ com.android.internal.telephony.nano.CarrierIdProto$CarrierAttribute com.android.internal.telephony.nano.CarrierIdProto$CarrierId com.android.internal.telephony.nano.CarrierIdProto$CarrierList com.android.internal.telephony.nano.PersistAtomsProto$CarrierIdMismatch +com.android.internal.telephony.nano.PersistAtomsProto$CarrierRoamingSatelliteControllerStats +com.android.internal.telephony.nano.PersistAtomsProto$CarrierRoamingSatelliteSession com.android.internal.telephony.nano.PersistAtomsProto$CellularDataServiceSwitch com.android.internal.telephony.nano.PersistAtomsProto$CellularServiceState com.android.internal.telephony.nano.PersistAtomsProto$DataCallSession @@ -12633,7 +12689,10 @@ com.android.internal.telephony.nano.PersistAtomsProto$PersistAtoms com.android.internal.telephony.nano.PersistAtomsProto$PresenceNotifyEvent com.android.internal.telephony.nano.PersistAtomsProto$RcsAcsProvisioningStats com.android.internal.telephony.nano.PersistAtomsProto$RcsClientProvisioningStats +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteAccessController +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteConfigUpdater com.android.internal.telephony.nano.PersistAtomsProto$SatelliteController +com.android.internal.telephony.nano.PersistAtomsProto$SatelliteEntitlement com.android.internal.telephony.nano.PersistAtomsProto$SatelliteIncomingDatagram com.android.internal.telephony.nano.PersistAtomsProto$SatelliteOutgoingDatagram com.android.internal.telephony.nano.PersistAtomsProto$SatelliteProvision @@ -13057,8 +13116,9 @@ com.android.internal.util.DumpUtils com.android.internal.util.EmergencyAffordanceManager com.android.internal.util.ExponentiallyBucketedHistogram com.android.internal.util.FastMath -com.android.internal.util.FastPrintWriter$DummyWriter-IA com.android.internal.util.FastPrintWriter$DummyWriter +com.android.internal.util.FastPrintWriter-IA +com.android.internal.util.FastPrintWriter com.android.internal.util.FastXmlSerializer com.android.internal.util.FileRotator$FileInfo com.android.internal.util.FileRotator$Reader @@ -13079,6 +13139,7 @@ com.android.internal.util.HeavyHitterSketch com.android.internal.util.HexDump com.android.internal.util.IState com.android.internal.util.ImageUtils +com.android.internal.util.IndentingPrintWriter com.android.internal.util.IntPair com.android.internal.util.JournaledFile com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda0 @@ -13086,10 +13147,10 @@ com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda1 com.android.internal.util.LatencyTracker$$ExternalSyntheticLambda2 com.android.internal.util.LatencyTracker$Action com.android.internal.util.LatencyTracker$ActionProperties -com.android.internal.util.LatencyTracker$FrameworkStatsLogEvent-IA com.android.internal.util.LatencyTracker$FrameworkStatsLogEvent com.android.internal.util.LatencyTracker$Session$$ExternalSyntheticLambda0 com.android.internal.util.LatencyTracker$Session +com.android.internal.util.LatencyTracker-IA com.android.internal.util.LineBreakBufferedWriter com.android.internal.util.LocalLog com.android.internal.util.MemInfoReader @@ -13115,6 +13176,8 @@ com.android.internal.util.ProcFileReader com.android.internal.util.ProgressReporter com.android.internal.util.ProviderAccessStats$PerThreadData com.android.internal.util.ProviderAccessStats +com.android.internal.util.RateLimitingCache$ValueFetcher +com.android.internal.util.RateLimitingCache com.android.internal.util.RingBuffer$$ExternalSyntheticLambda0 com.android.internal.util.RingBuffer$$ExternalSyntheticLambda1 com.android.internal.util.RingBuffer @@ -13125,22 +13188,18 @@ com.android.internal.util.ScreenshotHelper com.android.internal.util.StatLogger com.android.internal.util.State com.android.internal.util.StateMachine$LogRec -com.android.internal.util.StateMachine$LogRecords-IA com.android.internal.util.StateMachine$LogRecords -com.android.internal.util.StateMachine$SmHandler$HaltingState-IA com.android.internal.util.StateMachine$SmHandler$HaltingState -com.android.internal.util.StateMachine$SmHandler$QuittingState-IA com.android.internal.util.StateMachine$SmHandler$QuittingState com.android.internal.util.StateMachine$SmHandler$StateInfo -com.android.internal.util.StateMachine$SmHandler-IA com.android.internal.util.StateMachine$SmHandler +com.android.internal.util.StateMachine-IA com.android.internal.util.StateMachine com.android.internal.util.StringPool com.android.internal.util.SyncResultReceiver$TimeoutException com.android.internal.util.SyncResultReceiver com.android.internal.util.ToBooleanFunction com.android.internal.util.TokenBucket -com.android.internal.util.TraceBuffer$ProtoOutputStreamProvider-IA com.android.internal.util.TraceBuffer$ProtoOutputStreamProvider com.android.internal.util.TraceBuffer$ProtoProvider com.android.internal.util.TraceBuffer @@ -13331,6 +13390,9 @@ com.android.internal.widget.floatingtoolbar.FloatingToolbar$$ExternalSyntheticLa com.android.internal.widget.floatingtoolbar.FloatingToolbar$$ExternalSyntheticLambda1 com.android.internal.widget.floatingtoolbar.FloatingToolbar com.android.internal.widget.floatingtoolbar.FloatingToolbarPopup +com.android.libcore.FeatureFlags +com.android.libcore.FeatureFlagsImpl +com.android.libcore.Flags com.android.media.flags.FeatureFlags com.android.media.flags.FeatureFlagsImpl com.android.media.flags.Flags @@ -13354,6 +13416,7 @@ com.android.net.module.util.NetworkCapabilitiesUtils com.android.net.module.util.NetworkIdentityUtils com.android.net.module.util.NetworkStackConstants com.android.net.module.util.ProxyUtils +com.android.nfc.x.android.nfc.Flags com.android.okhttp.Address com.android.okhttp.AndroidInternal com.android.okhttp.AndroidShimResponseCache @@ -13519,12 +13582,14 @@ com.android.org.bouncycastle.asn1.ASN1Boolean com.android.org.bouncycastle.asn1.ASN1Choice com.android.org.bouncycastle.asn1.ASN1Encodable com.android.org.bouncycastle.asn1.ASN1EncodableVector +com.android.org.bouncycastle.asn1.ASN1Enumerated$$ExternalSyntheticOutline0 com.android.org.bouncycastle.asn1.ASN1Enumerated com.android.org.bouncycastle.asn1.ASN1Exception com.android.org.bouncycastle.asn1.ASN1External com.android.org.bouncycastle.asn1.ASN1GeneralizedTime com.android.org.bouncycastle.asn1.ASN1InputStream com.android.org.bouncycastle.asn1.ASN1Integer +com.android.org.bouncycastle.asn1.ASN1Null com.android.org.bouncycastle.asn1.ASN1Object com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier$OidHandle com.android.org.bouncycastle.asn1.ASN1ObjectIdentifier @@ -13611,7 +13676,6 @@ com.android.org.bouncycastle.crypto.DataLengthException com.android.org.bouncycastle.crypto.Digest com.android.org.bouncycastle.crypto.ExtendedDigest com.android.org.bouncycastle.crypto.InvalidCipherTextException -com.android.org.bouncycastle.crypto.Mac com.android.org.bouncycastle.crypto.OutputLengthException com.android.org.bouncycastle.crypto.PBEParametersGenerator com.android.org.bouncycastle.crypto.RuntimeCryptoException @@ -13792,9 +13856,9 @@ com.android.server.am.nano.Capabilities com.android.server.am.nano.Capability com.android.server.am.nano.FrameworkCapability com.android.server.am.nano.VMCapability +com.android.server.am.nano.VMInfo com.android.server.backup.AccountManagerBackupHelper com.android.server.backup.AccountSyncSettingsBackupHelper -com.android.server.backup.NotificationBackupHelper com.android.server.backup.PermissionBackupHelper com.android.server.backup.PreferredActivityBackupHelper com.android.server.backup.ShortcutBackupHelper @@ -13830,6 +13894,7 @@ com.android.server.criticalevents.nano.CriticalEventProto$Watchdog com.android.server.job.JobSchedulerInternal$JobStorePersistStats com.android.server.net.BaseNetdEventCallback com.android.server.net.BaseNetworkObserver +com.android.server.ondeviceintelligence.nano.InferenceInfo com.android.server.sip.SipHelper com.android.server.sip.SipService$ConnectivityReceiver$1 com.android.server.sip.SipService$ConnectivityReceiver @@ -13905,9 +13970,6 @@ com.android.telephony.Rlog com.android.text.flags.FeatureFlags com.android.text.flags.FeatureFlagsImpl com.android.text.flags.Flags -com.android.window.flags.FeatureFlags -com.android.window.flags.FeatureFlagsImpl -com.android.window.flags.Flags com.google.android.collect.Lists com.google.android.collect.Maps com.google.android.collect.Sets @@ -13947,8 +14009,8 @@ dalvik.system.CloseGuard dalvik.system.DelegateLastClassLoader dalvik.system.DexClassLoader dalvik.system.DexFile$DFEnum -dalvik.system.DexFile$OptimizationInfo-IA dalvik.system.DexFile$OptimizationInfo +dalvik.system.DexFile-IA dalvik.system.DexFile dalvik.system.DexPathList$$ExternalSyntheticLambda0 dalvik.system.DexPathList$Element @@ -14457,8 +14519,8 @@ java.io.ObjectOutputStream$Caches java.io.ObjectOutputStream$DebugTraceInfoStack java.io.ObjectOutputStream$HandleTable java.io.ObjectOutputStream$PutField -java.io.ObjectOutputStream$PutFieldImpl java.io.ObjectOutputStream$ReplaceTable +java.io.ObjectOutputStream java.io.ObjectStreamClass$$ExternalSyntheticLambda0 java.io.ObjectStreamClass$$ExternalSyntheticLambda1 java.io.ObjectStreamClass$$ExternalSyntheticLambda2 @@ -14473,13 +14535,13 @@ java.io.ObjectStreamClass$ClassDataSlot java.io.ObjectStreamClass$DefaultSUIDCompatibilityListener java.io.ObjectStreamClass$DeserializationConstructorsCache java.io.ObjectStreamClass$EntryFuture$1 -java.io.ObjectStreamClass$EntryFuture-IA java.io.ObjectStreamClass$EntryFuture java.io.ObjectStreamClass$ExceptionInfo java.io.ObjectStreamClass$FieldReflector java.io.ObjectStreamClass$FieldReflectorKey java.io.ObjectStreamClass$MemberSignature java.io.ObjectStreamClass$WeakClassKey +java.io.ObjectStreamClass-IA java.io.ObjectStreamClass java.io.ObjectStreamConstants java.io.ObjectStreamException @@ -14591,6 +14653,7 @@ java.lang.Iterable java.lang.LinkageError java.lang.Long$LongCache java.lang.Long +java.lang.MatchException java.lang.Math$RandomNumberGeneratorHolder java.lang.Math java.lang.NegativeArraySizeException @@ -14642,8 +14705,8 @@ java.lang.String$$ExternalSyntheticLambda0 java.lang.String$$ExternalSyntheticLambda1 java.lang.String$$ExternalSyntheticLambda2 java.lang.String$$ExternalSyntheticLambda3 -java.lang.String$CaseInsensitiveComparator-IA java.lang.String$CaseInsensitiveComparator +java.lang.String-IA java.lang.String java.lang.StringBuffer java.lang.StringBuilder @@ -14662,30 +14725,29 @@ java.lang.System java.lang.Thread$1 java.lang.Thread$Caches java.lang.Thread$State +java.lang.Thread$ThreadIdentifiers java.lang.Thread$UncaughtExceptionHandler java.lang.Thread$WeakClassKey java.lang.Thread java.lang.ThreadDeath java.lang.ThreadGroup java.lang.ThreadLocal$ThreadLocalMap$Entry -java.lang.ThreadLocal$ThreadLocalMap-IA java.lang.ThreadLocal$ThreadLocalMap +java.lang.ThreadLocal-IA java.lang.ThreadLocal -java.lang.Throwable$PrintStreamOrWriter-IA java.lang.Throwable$PrintStreamOrWriter java.lang.Throwable$SentinelHolder java.lang.Throwable$WrappedPrintStream java.lang.Throwable$WrappedPrintWriter +java.lang.Throwable-IA java.lang.Throwable java.lang.TypeNotPresentException java.lang.UNIXProcess$1 java.lang.UNIXProcess$2 java.lang.UNIXProcess$3 java.lang.UNIXProcess$ProcessPipeInputStream -java.lang.UNIXProcess$ProcessPipeOutputStream java.lang.UNIXProcess$ProcessReaperThreadFactory$1 java.lang.UNIXProcess$ProcessReaperThreadFactory -java.lang.UNIXProcess java.lang.UnsatisfiedLinkError java.lang.UnsupportedClassVersionError java.lang.UnsupportedOperationException @@ -14756,8 +14818,7 @@ java.lang.invoke.MethodHandles$$ExternalSyntheticLambda8 java.lang.invoke.MethodHandles$$ExternalSyntheticLambda9 java.lang.invoke.MethodHandles$Lookup java.lang.invoke.MethodHandles -java.lang.invoke.MethodType$ConcurrentWeakInternSet$WeakEntry -java.lang.invoke.MethodType$ConcurrentWeakInternSet +java.lang.invoke.MethodType$1 java.lang.invoke.MethodType java.lang.invoke.MethodTypeForm java.lang.invoke.SerializedLambda @@ -14801,8 +14862,8 @@ java.lang.invoke.WrongMethodTypeException java.lang.ref.Cleaner$1 java.lang.ref.Cleaner$Cleanable java.lang.ref.Cleaner -java.lang.ref.FinalizerReference$Sentinel-IA java.lang.ref.FinalizerReference$Sentinel +java.lang.ref.FinalizerReference-IA java.lang.ref.FinalizerReference java.lang.ref.PhantomReference java.lang.ref.Reference$SinkHolder$1 @@ -14833,11 +14894,10 @@ java.lang.reflect.ParameterizedType java.lang.reflect.Proxy$1 java.lang.reflect.Proxy$Key1 java.lang.reflect.Proxy$Key2 -java.lang.reflect.Proxy$KeyFactory-IA java.lang.reflect.Proxy$KeyFactory java.lang.reflect.Proxy$KeyX -java.lang.reflect.Proxy$ProxyClassFactory-IA java.lang.reflect.Proxy$ProxyClassFactory +java.lang.reflect.Proxy-IA java.lang.reflect.Proxy java.lang.reflect.RecordComponent java.lang.reflect.ReflectPermission @@ -14902,16 +14962,16 @@ java.net.HttpURLConnection java.net.IDN java.net.InMemoryCookieStore java.net.Inet4Address -java.net.Inet6Address$Inet6AddressHolder-IA java.net.Inet6Address$Inet6AddressHolder +java.net.Inet6Address-IA java.net.Inet6Address java.net.Inet6AddressImpl java.net.InetAddress$1 java.net.InetAddress$InetAddressHolder java.net.InetAddress java.net.InetAddressImpl -java.net.InetSocketAddress$InetSocketAddressHolder-IA java.net.InetSocketAddress$InetSocketAddressHolder +java.net.InetSocketAddress-IA java.net.InetSocketAddress java.net.InterfaceAddress java.net.JarURLConnection @@ -15141,11 +15201,10 @@ java.security.PrivilegedActionException java.security.PrivilegedExceptionAction java.security.ProtectionDomain java.security.Provider$EngineDescription -java.security.Provider$Service-IA java.security.Provider$Service -java.security.Provider$ServiceKey-IA java.security.Provider$ServiceKey java.security.Provider$UString +java.security.Provider-IA java.security.Provider java.security.ProviderException java.security.PublicKey @@ -15266,8 +15325,8 @@ java.text.DecimalFormat java.text.DecimalFormatSymbols java.text.DontCareFieldPosition$1 java.text.DontCareFieldPosition -java.text.FieldPosition$Delegate-IA java.text.FieldPosition$Delegate +java.text.FieldPosition-IA java.text.FieldPosition java.text.Format$Field java.text.Format$FieldDelegate @@ -15333,15 +15392,14 @@ java.time.format.DateTimeFormatterBuilder$InstantPrinterParser java.time.format.DateTimeFormatterBuilder$NumberPrinterParser java.time.format.DateTimeFormatterBuilder$OffsetIdPrinterParser java.time.format.DateTimeFormatterBuilder$PadPrinterParserDecorator -java.time.format.DateTimeFormatterBuilder$PrefixTree$CI-IA java.time.format.DateTimeFormatterBuilder$PrefixTree$CI -java.time.format.DateTimeFormatterBuilder$PrefixTree-IA java.time.format.DateTimeFormatterBuilder$PrefixTree java.time.format.DateTimeFormatterBuilder$SettingsParser java.time.format.DateTimeFormatterBuilder$StringLiteralPrinterParser java.time.format.DateTimeFormatterBuilder$TextPrinterParser java.time.format.DateTimeFormatterBuilder$ZoneIdPrinterParser java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser +java.time.format.DateTimeFormatterBuilder-IA java.time.format.DateTimeFormatterBuilder java.time.format.DateTimeParseContext java.time.format.DateTimeParseException @@ -15398,12 +15456,12 @@ java.time.zone.ZoneRules java.time.zone.ZoneRulesException java.time.zone.ZoneRulesProvider java.util.AbstractCollection -java.util.AbstractList$Itr-IA java.util.AbstractList$ListItr java.util.AbstractList$RandomAccessSpliterator java.util.AbstractList$RandomAccessSubList java.util.AbstractList$SubList$1 java.util.AbstractList$SubList +java.util.AbstractList-IA java.util.AbstractList java.util.AbstractMap$1 java.util.AbstractMap$2$1 @@ -15440,7 +15498,6 @@ java.util.Calendar$Builder java.util.Calendar java.util.Collection java.util.Collections$2 -java.util.Collections$3 java.util.Collections$AsLIFOQueue java.util.Collections$CheckedCollection java.util.Collections$CheckedList @@ -15454,17 +15511,14 @@ java.util.Collections$CheckedSortedMap java.util.Collections$CheckedSortedSet java.util.Collections$CopiesList java.util.Collections$EmptyEnumeration -java.util.Collections$EmptyList-IA java.util.Collections$EmptyListIterator -java.util.Collections$EmptyMap-IA -java.util.Collections$EmptySet-IA java.util.Collections$ReverseComparator2 java.util.Collections$ReverseComparator java.util.Collections$SequencedSetFromMap +java.util.Collections$SetFromMap java.util.Collections$SynchronizedList java.util.Collections$SynchronizedNavigableMap java.util.Collections$SynchronizedNavigableSet -java.util.Collections$SynchronizedRandomAccessList java.util.Collections$SynchronizedSortedMap java.util.Collections$SynchronizedSortedSet java.util.Collections$UnmodifiableList$1 @@ -15477,6 +15531,7 @@ java.util.Collections$UnmodifiableSequencedCollection java.util.Collections$UnmodifiableSequencedMap java.util.Collections$UnmodifiableSequencedSet java.util.Collections$UnmodifiableSortedMap +java.util.Collections-IA java.util.Collections java.util.ComparableTimSort java.util.Comparator$$ExternalSyntheticLambda1 @@ -15493,28 +15548,21 @@ java.util.Date java.util.Deque java.util.Dictionary java.util.DoubleSummaryStatistics -java.util.DualPivotQuicksort$Sorter-IA java.util.DualPivotQuicksort$Sorter +java.util.DualPivotQuicksort-IA java.util.DualPivotQuicksort java.util.DuplicateFormatFlagsException java.util.EmptyStackException java.util.EnumMap$1 -java.util.EnumMap$EntryIterator$Entry-IA java.util.EnumMap$EntryIterator$Entry -java.util.EnumMap$EntryIterator-IA java.util.EnumMap$EntryIterator -java.util.EnumMap$EntrySet-IA java.util.EnumMap$EntrySet -java.util.EnumMap$EnumMapIterator-IA java.util.EnumMap$EnumMapIterator -java.util.EnumMap$KeyIterator-IA java.util.EnumMap$KeyIterator -java.util.EnumMap$KeySet-IA java.util.EnumMap$KeySet -java.util.EnumMap$ValueIterator-IA java.util.EnumMap$ValueIterator -java.util.EnumMap$Values-IA java.util.EnumMap$Values +java.util.EnumMap-IA java.util.EnumMap java.util.EnumSet$SerializationProxy java.util.EnumSet @@ -15540,31 +15588,22 @@ java.util.HashMap$UnsafeHolder java.util.HashMap$ValueSpliterator java.util.HashMap java.util.HashSet -java.util.Hashtable$EntrySet-IA java.util.Hashtable$EntrySet java.util.Hashtable$HashtableEntry -java.util.Hashtable$KeySet-IA java.util.Hashtable$KeySet -java.util.Hashtable$ValueCollection-IA java.util.Hashtable$ValueCollection +java.util.Hashtable-IA java.util.Hashtable java.util.HexFormat -java.util.IdentityHashMap$EntryIterator$Entry-IA java.util.IdentityHashMap$EntryIterator$Entry -java.util.IdentityHashMap$EntryIterator-IA java.util.IdentityHashMap$EntryIterator -java.util.IdentityHashMap$EntrySet-IA java.util.IdentityHashMap$EntrySet -java.util.IdentityHashMap$IdentityHashMapIterator-IA java.util.IdentityHashMap$IdentityHashMapIterator -java.util.IdentityHashMap$KeyIterator-IA java.util.IdentityHashMap$KeyIterator -java.util.IdentityHashMap$KeySet-IA java.util.IdentityHashMap$KeySet -java.util.IdentityHashMap$ValueIterator-IA java.util.IdentityHashMap$ValueIterator -java.util.IdentityHashMap$Values-IA java.util.IdentityHashMap$Values +java.util.IdentityHashMap-IA java.util.IdentityHashMap java.util.IllegalFormatArgumentIndexException java.util.IllegalFormatCodePointException @@ -15580,19 +15619,19 @@ java.util.ImmutableCollections$AbstractImmutableMap java.util.ImmutableCollections$AbstractImmutableSet java.util.ImmutableCollections$Access$1 java.util.ImmutableCollections$Access -java.util.ImmutableCollections$ListN-IA +java.util.ImmutableCollections$MapN$1 +java.util.ImmutableCollections$MapN$MapNIterator java.util.ImmutableCollections$SubList +java.util.ImmutableCollections-IA java.util.InputMismatchException java.util.Iterator java.util.JumboEnumSet$EnumSetIterator java.util.JumboEnumSet -java.util.LinkedHashMap$LinkedEntryIterator -java.util.LinkedHashMap$LinkedEntrySet +java.util.KeyValueHolder java.util.LinkedHashMap$LinkedHashIterator java.util.LinkedHashMap$ReversedLinkedHashMapView java.util.LinkedHashMap java.util.LinkedHashSet -java.util.LinkedList$DescendingIterator-IA java.util.LinkedList$Node java.util.LinkedList java.util.List @@ -15607,7 +15646,6 @@ java.util.Locale$IsoCountryCode$2 java.util.Locale$IsoCountryCode$3 java.util.Locale$IsoCountryCode java.util.Locale$LanguageRange -java.util.Locale$LocaleKey-IA java.util.Locale$LocaleKey java.util.Locale$NoImagePreloadHolder java.util.Locale-IA @@ -15719,21 +15757,16 @@ java.util.UUID java.util.UnknownFormatConversionException java.util.UnknownFormatFlagsException java.util.Vector$1 -java.util.Vector$Itr-IA java.util.Vector$Itr +java.util.Vector-IA java.util.Vector java.util.WeakHashMap$Entry -java.util.WeakHashMap$EntryIterator-IA java.util.WeakHashMap$EntryIterator -java.util.WeakHashMap$EntrySet-IA java.util.WeakHashMap$EntrySet java.util.WeakHashMap$HashIterator -java.util.WeakHashMap$KeyIterator-IA -java.util.WeakHashMap$KeySet-IA -java.util.WeakHashMap$ValueIterator-IA java.util.WeakHashMap$ValueIterator -java.util.WeakHashMap$Values-IA java.util.WeakHashMap$Values +java.util.WeakHashMap-IA java.util.WeakHashMap java.util.concurrent.AbstractExecutorService java.util.concurrent.ArrayBlockingQueue$Itrs @@ -15766,7 +15799,6 @@ java.util.concurrent.ConcurrentHashMap$ForEachTransformedMappingTask java.util.concurrent.ConcurrentHashMap$ForEachTransformedValueTask java.util.concurrent.ConcurrentHashMap$ForEachValueTask java.util.concurrent.ConcurrentHashMap$ForwardingNode -java.util.concurrent.ConcurrentHashMap$KeyIterator java.util.concurrent.ConcurrentHashMap$KeySetView java.util.concurrent.ConcurrentHashMap$KeySpliterator java.util.concurrent.ConcurrentHashMap$MapReduceEntriesTask @@ -15865,10 +15897,6 @@ java.util.concurrent.Semaphore$FairSync java.util.concurrent.Semaphore$NonfairSync java.util.concurrent.Semaphore$Sync java.util.concurrent.Semaphore -java.util.concurrent.SynchronousQueue$TransferQueue$QNode -java.util.concurrent.SynchronousQueue$TransferQueue -java.util.concurrent.SynchronousQueue$TransferStack$SNode -java.util.concurrent.SynchronousQueue$TransferStack java.util.concurrent.SynchronousQueue$Transferer java.util.concurrent.SynchronousQueue java.util.concurrent.ThreadFactory @@ -15977,9 +16005,9 @@ java.util.jar.Manifest java.util.logging.ConsoleHandler java.util.logging.ErrorManager java.util.logging.FileHandler$1 -java.util.logging.FileHandler$InitializationErrorManager-IA java.util.logging.FileHandler$InitializationErrorManager java.util.logging.FileHandler$MeteredStream +java.util.logging.FileHandler-IA java.util.logging.FileHandler java.util.logging.Filter java.util.logging.Formatter @@ -16156,13 +16184,11 @@ java.util.stream.Nodes$IntArrayNode java.util.stream.Nodes$IntFixedNodeBuilder java.util.stream.Nodes$IntSpinedNodeBuilder java.util.stream.Nodes$SpinedNodeBuilder -java.util.stream.Nodes$ToArrayTask$OfInt-IA java.util.stream.Nodes$ToArrayTask$OfInt -java.util.stream.Nodes$ToArrayTask$OfPrimitive-IA java.util.stream.Nodes$ToArrayTask$OfPrimitive -java.util.stream.Nodes$ToArrayTask$OfRef-IA java.util.stream.Nodes$ToArrayTask$OfRef java.util.stream.Nodes$ToArrayTask +java.util.stream.Nodes-IA java.util.stream.Nodes java.util.stream.PipelineHelper java.util.stream.ReduceOps$10 @@ -16230,12 +16256,12 @@ java.util.stream.StreamSpliterators$WrappingSpliterator java.util.stream.StreamSupport java.util.stream.Streams$1 java.util.stream.Streams$2 -java.util.stream.Streams$AbstractStreamBuilderImpl-IA java.util.stream.Streams$AbstractStreamBuilderImpl java.util.stream.Streams$ConcatSpliterator$OfRef java.util.stream.Streams$ConcatSpliterator java.util.stream.Streams$RangeIntSpliterator java.util.stream.Streams$StreamBuilderImpl +java.util.stream.Streams-IA java.util.stream.Streams java.util.stream.TerminalOp java.util.stream.TerminalSink @@ -16247,15 +16273,14 @@ java.util.zip.CheckedInputStream java.util.zip.Checksum$1 java.util.zip.Checksum java.util.zip.DataFormatException -java.util.zip.Deflater$DeflaterZStreamRef-IA java.util.zip.Deflater$DeflaterZStreamRef +java.util.zip.Deflater-IA java.util.zip.Deflater java.util.zip.DeflaterOutputStream java.util.zip.GZIPInputStream$1 -java.util.zip.GZIPInputStream java.util.zip.GZIPOutputStream -java.util.zip.Inflater$InflaterZStreamRef-IA java.util.zip.Inflater$InflaterZStreamRef +java.util.zip.Inflater-IA java.util.zip.Inflater java.util.zip.InflaterInputStream java.util.zip.ZipCoder$UTF8ZipCoder @@ -16266,14 +16291,16 @@ java.util.zip.ZipError java.util.zip.ZipException java.util.zip.ZipFile$CleanableResource java.util.zip.ZipFile$InflaterCleanupAction -java.util.zip.ZipFile$Source$End-IA java.util.zip.ZipFile$Source$End java.util.zip.ZipFile$Source$Key java.util.zip.ZipFile$Source java.util.zip.ZipFile$ZipEntryIterator +java.util.zip.ZipFile$ZipFileInflaterInputStream java.util.zip.ZipFile$ZipFileInputStream +java.util.zip.ZipFile-IA java.util.zip.ZipFile java.util.zip.ZipInputStream +java.util.zip.ZipOutputStream java.util.zip.ZipUtils javax.crypto.AEADBadTagException javax.crypto.BadPaddingException @@ -16527,6 +16554,7 @@ jdk.internal.misc.TerminatingThreadLocal jdk.internal.misc.Unsafe jdk.internal.misc.UnsafeConstants jdk.internal.misc.VM +jdk.internal.misc.VirtualThreads jdk.internal.ref.CleanerFactory jdk.internal.ref.CleanerImpl jdk.internal.ref.PhantomCleanable @@ -16534,7 +16562,17 @@ jdk.internal.reflect.Reflection jdk.internal.util.ArraysSupport jdk.internal.util.NullableKeyValueHolder jdk.internal.util.Preconditions +jdk.internal.util.ReferenceKey +jdk.internal.util.ReferencedKeyMap$$ExternalSyntheticLambda0 +jdk.internal.util.ReferencedKeyMap$$ExternalSyntheticLambda1 +jdk.internal.util.ReferencedKeyMap$$ExternalSyntheticLambda2 +jdk.internal.util.ReferencedKeyMap$$ExternalSyntheticLambda3 +jdk.internal.util.ReferencedKeyMap +jdk.internal.util.ReferencedKeySet +jdk.internal.util.SoftReferenceKey jdk.internal.util.StaticProperty +jdk.internal.util.StrongReferenceKey +jdk.internal.util.WeakReferenceKey jdk.internal.util.random.RandomSupport libcore.content.type.MimeMap$$ExternalSyntheticLambda0 libcore.content.type.MimeMap$Builder$Element @@ -16551,6 +16589,16 @@ libcore.icu.SimpleDateFormatData libcore.icu.TimeZoneNames$1 libcore.icu.TimeZoneNames$ZoneStringsCache libcore.icu.TimeZoneNames +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch10 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch1 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch2 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch3 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch4 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch5 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch6 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch7 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch8 +libcore.internal.Java21LanguageFeatures$$ExternalSyntheticTypeSwitch9 libcore.internal.StringPool libcore.io.AsynchronousCloseMonitor libcore.io.BlockGuardOs @@ -16613,11 +16661,10 @@ org.apache.harmony.dalvik.ddmc.DdmServer org.apache.harmony.dalvik.ddmc.DdmVmInternal org.apache.harmony.xml.ExpatAttributes org.apache.harmony.xml.ExpatException -org.apache.harmony.xml.ExpatParser$CurrentAttributes-IA org.apache.harmony.xml.ExpatParser$CurrentAttributes -org.apache.harmony.xml.ExpatParser$ExpatLocator-IA org.apache.harmony.xml.ExpatParser$ExpatLocator org.apache.harmony.xml.ExpatParser$ParseException +org.apache.harmony.xml.ExpatParser-IA org.apache.harmony.xml.ExpatParser org.apache.harmony.xml.ExpatReader org.apache.harmony.xml.dom.AttrImpl @@ -16625,9 +16672,7 @@ org.apache.harmony.xml.dom.CDATASectionImpl org.apache.harmony.xml.dom.CharacterDataImpl org.apache.harmony.xml.dom.CommentImpl org.apache.harmony.xml.dom.DOMImplementationImpl -org.apache.harmony.xml.dom.DocumentImpl org.apache.harmony.xml.dom.DocumentTypeImpl -org.apache.harmony.xml.dom.ElementImpl org.apache.harmony.xml.dom.EntityReferenceImpl org.apache.harmony.xml.dom.InnerNodeImpl org.apache.harmony.xml.dom.LeafNodeImpl @@ -16635,7 +16680,6 @@ org.apache.harmony.xml.dom.NodeImpl$1 org.apache.harmony.xml.dom.NodeImpl org.apache.harmony.xml.dom.NodeListImpl org.apache.harmony.xml.dom.ProcessingInstructionImpl -org.apache.harmony.xml.dom.TextImpl org.apache.harmony.xml.parsers.DocumentBuilderFactoryImpl org.apache.harmony.xml.parsers.DocumentBuilderImpl org.apache.harmony.xml.parsers.SAXParserFactoryImpl @@ -16768,8 +16812,8 @@ sun.nio.ch.DatagramDispatcher sun.nio.ch.DefaultSelectorProvider sun.nio.ch.DirectBuffer sun.nio.ch.FileChannelImpl$SimpleFileLockTable -sun.nio.ch.FileChannelImpl$Unmapper-IA sun.nio.ch.FileChannelImpl$Unmapper +sun.nio.ch.FileChannelImpl-IA sun.nio.ch.FileDescriptorHolderSocketImpl sun.nio.ch.FileDispatcher sun.nio.ch.FileDispatcherImpl @@ -16853,8 +16897,8 @@ sun.reflect.misc.ReflectUtil sun.security.action.GetBooleanAction sun.security.action.GetIntegerAction sun.security.action.GetPropertyAction -sun.security.jca.GetInstance$Instance-IA sun.security.jca.GetInstance$Instance +sun.security.jca.GetInstance-IA sun.security.jca.GetInstance sun.security.jca.JCAUtil$CachedSecureRandomHolder sun.security.jca.JCAUtil @@ -16892,8 +16936,8 @@ sun.security.provider.certpath.OCSP$RevocationStatus$CertStatus sun.security.provider.certpath.OCSP$RevocationStatus sun.security.provider.certpath.OCSP sun.security.provider.certpath.OCSPResponse$ResponseStatus -sun.security.provider.certpath.OCSPResponse$SingleResponse-IA sun.security.provider.certpath.OCSPResponse$SingleResponse +sun.security.provider.certpath.OCSPResponse-IA sun.security.provider.certpath.OCSPResponse sun.security.provider.certpath.PKIX$ValidatorParams sun.security.provider.certpath.PKIX @@ -16904,8 +16948,8 @@ sun.security.provider.certpath.PolicyNodeImpl sun.security.provider.certpath.RevocationChecker$1 sun.security.provider.certpath.RevocationChecker$2 sun.security.provider.certpath.RevocationChecker$Mode -sun.security.provider.certpath.RevocationChecker$RevocationProperties-IA sun.security.provider.certpath.RevocationChecker$RevocationProperties +sun.security.provider.certpath.RevocationChecker-IA sun.security.provider.certpath.RevocationChecker sun.security.timestamp.TimestampToken sun.security.util.AbstractAlgorithmConstraints$1 @@ -16927,11 +16971,11 @@ sun.security.util.DerInputStream sun.security.util.DerOutputStream sun.security.util.DerValue sun.security.util.DisabledAlgorithmConstraints$Constraint$Operator -sun.security.util.DisabledAlgorithmConstraints$Constraint-IA sun.security.util.DisabledAlgorithmConstraints$Constraint sun.security.util.DisabledAlgorithmConstraints$Constraints sun.security.util.DisabledAlgorithmConstraints$KeySizeConstraint sun.security.util.DisabledAlgorithmConstraints$jdkCAConstraint +sun.security.util.DisabledAlgorithmConstraints-IA sun.security.util.DisabledAlgorithmConstraints sun.security.util.FilePaths sun.security.util.KeyUtil @@ -17035,13 +17079,12 @@ sun.util.calendar.JulianCalendar$Date sun.util.calendar.JulianCalendar sun.util.calendar.LocalGregorianCalendar sun.util.locale.BaseLocale$Cache -sun.util.locale.BaseLocale$Key-IA sun.util.locale.BaseLocale$Key sun.util.locale.BaseLocale-IA sun.util.locale.BaseLocale sun.util.locale.Extension -sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar-IA sun.util.locale.InternalLocaleBuilder$CaseInsensitiveChar +sun.util.locale.InternalLocaleBuilder-IA sun.util.locale.InternalLocaleBuilder sun.util.locale.LanguageTag sun.util.locale.LocaleExtensions diff --git a/services/art-profile b/services/art-profile index 755f8a52413f..6fa4c88cb1f6 100644 --- a/services/art-profile +++ b/services/art-profile @@ -14,187 +14,172 @@ # limitations under the License. # HSPLandroid/content/pm/PackageManagerInternal;->filterAppAccess(Ljava/lang/String;II)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLandroid/hardware/health/DiskStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/DiskStats;+]Landroid/hardware/health/DiskStats;Landroid/hardware/health/DiskStats; +HSPLandroid/hardware/health/DiskStats$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/DiskStats; HSPLandroid/hardware/health/DiskStats;->()V -HSPLandroid/hardware/health/DiskStats;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/hardware/health/HealthInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/HealthInfo;+]Landroid/hardware/health/HealthInfo;Landroid/hardware/health/HealthInfo; +HSPLandroid/hardware/health/DiskStats;->readFromParcel(Landroid/os/Parcel;)V +HSPLandroid/hardware/health/HealthInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/HealthInfo; HSPLandroid/hardware/health/HealthInfo;->()V -HSPLandroid/hardware/health/HealthInfo;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/hardware/health/HealthInfo;->readFromParcel(Landroid/os/Parcel;)V HPLandroid/hardware/health/IHealth$Stub$Proxy;->getCapacity()I+]Landroid/hardware/health/IHealth$Stub$Proxy;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/IBinder;Landroid/os/BinderProxy; HPLandroid/hardware/health/IHealth$Stub$Proxy;->getChargeCounterUah()I+]Landroid/hardware/health/IHealth$Stub$Proxy;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/IBinder;Landroid/os/BinderProxy; -HSPLandroid/hardware/health/IHealthInfoCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/hardware/health/IHealthInfoCallback;Lcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/hardware/health/StorageInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/StorageInfo;+]Landroid/hardware/health/StorageInfo;Landroid/hardware/health/StorageInfo; +HSPLandroid/hardware/health/IHealthInfoCallback$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/hardware/health/IHealthInfoCallback;Lcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback; +HSPLandroid/hardware/health/StorageInfo$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/health/StorageInfo; HSPLandroid/hardware/health/StorageInfo;->()V -HSPLandroid/hardware/health/StorageInfo;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HSPLandroid/hardware/health/StorageInfo;->readFromParcel(Landroid/os/Parcel;)V HSPLandroid/hardware/power/stats/EnergyConsumerResult;->readFromParcel(Landroid/os/Parcel;)V -HPLandroid/hardware/power/stats/EnergyMeasurement;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; +HPLandroid/hardware/power/stats/EnergyMeasurement;->readFromParcel(Landroid/os/Parcel;)V HPLandroid/hardware/power/stats/IPowerStats$Stub$Proxy;->readEnergyMeter([I)[Landroid/hardware/power/stats/EnergyMeasurement;+]Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;Landroid/hardware/power/stats/IPowerStats$Stub$Proxy;]Landroid/os/IBinder;Landroid/os/BinderProxy; -HPLandroid/hardware/power/stats/StateResidency$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/StateResidency;+]Landroid/hardware/power/stats/StateResidency;Landroid/hardware/power/stats/StateResidency; +HPLandroid/hardware/power/stats/StateResidency$1;->createFromParcel(Landroid/os/Parcel;)Landroid/hardware/power/stats/StateResidency; HPLandroid/hardware/power/stats/StateResidency$1;->createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;+]Landroid/hardware/power/stats/StateResidency$1;Landroid/hardware/power/stats/StateResidency$1; -HPLandroid/hardware/power/stats/StateResidency;->readFromParcel(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/net/INetdUnsolicitedEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/net/INetdUnsolicitedEventListener;Lcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener;]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/net/metrics/INetdEventListener;Lcom/android/server/connectivity/NetdEventListenerService;]Landroid/os/Parcel;Landroid/os/Parcel; +HPLandroid/hardware/power/stats/StateResidency;->readFromParcel(Landroid/os/Parcel;)V +HSPLandroid/net/INetdUnsolicitedEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/net/INetdUnsolicitedEventListener;Lcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener; +HSPLandroid/net/metrics/INetdEventListener$Stub;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z+]Landroid/net/metrics/INetdEventListener;Lcom/android/server/connectivity/NetdEventListenerService; HSPLcom/android/internal/util/jobs/ArrayUtils;->contains([II)Z HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(C)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(Ljava/lang/String;)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(Ljava/lang/String;II)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;]Ljava/lang/String;Ljava/lang/String; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->appendIndent(I)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; -HPLcom/android/internal/util/jobs/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer;+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; +HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(Ljava/lang/String;)V +HPLcom/android/internal/util/jobs/FastXmlSerializer;->append(Ljava/lang/String;II)V+]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer; +HPLcom/android/internal/util/jobs/FastXmlSerializer;->appendIndent(I)V +HPLcom/android/internal/util/jobs/FastXmlSerializer;->attribute(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer; +HPLcom/android/internal/util/jobs/FastXmlSerializer;->endTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer; +HPLcom/android/internal/util/jobs/FastXmlSerializer;->escapeAndAppendString(Ljava/lang/String;)V +HPLcom/android/internal/util/jobs/FastXmlSerializer;->startTag(Ljava/lang/String;Ljava/lang/String;)Lorg/xmlpull/v1/XmlSerializer; HSPLcom/android/internal/util/jobs/RingBufferIndices;->add()I HSPLcom/android/internal/util/jobs/StatLogger;->getTime()J HSPLcom/android/internal/util/jobs/StatLogger;->logDurationStat(IJ)J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger; -HSPLcom/android/server/AppSchedulingModuleThread;->getHandler()Landroid/os/Handler; HSPLcom/android/server/AppStateTrackerImpl$3;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray; HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler; HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->handleUidCached(IZ)V+]Lcom/android/server/AppStateTrackerImpl$Listener;Lcom/android/server/AppStateTrackerImpl$1;,Lcom/android/server/alarm/AlarmManagerService$7;,Lcom/android/server/job/controllers/BackgroundJobsController$2; -HSPLcom/android/server/AppStateTrackerImpl$MyHandler;->removeUid(IZ)V+]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler; HPLcom/android/server/AppStateTrackerImpl;->areAlarmsRestrictedByBatterySaver(ILjava/lang/String;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/AppStateTrackerImpl;->areJobsRestricted(ILjava/lang/String;Z)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/AppStateTrackerImpl;->cloneListeners()[Lcom/android/server/AppStateTrackerImpl$Listener; -HSPLcom/android/server/AppStateTrackerImpl;->findForcedAppStandbyUidPackageIndexLocked(ILjava/lang/String;)I+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/AppStateTrackerImpl;->findForcedAppStandbyUidPackageIndexLocked(ILjava/lang/String;)I HSPLcom/android/server/AppStateTrackerImpl;->isAppBackgroundRestricted(ILjava/lang/String;)Z+]Ljava/util/Set;Ljava/util/Collections$EmptySet;,Ljava/util/Collections$UnmodifiableSet; HSPLcom/android/server/AppStateTrackerImpl;->isRunAnyInBackgroundAppOpsAllowed(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl; -HSPLcom/android/server/AppStateTrackerImpl;->isRunAnyRestrictedLocked(ILjava/lang/String;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl; +HSPLcom/android/server/AppStateTrackerImpl;->isRunAnyRestrictedLocked(ILjava/lang/String;)Z HSPLcom/android/server/AppStateTrackerImpl;->isUidActive(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HPLcom/android/server/AppStateTrackerImpl;->isUidPowerSaveUserExempt(I)Z HSPLcom/android/server/AppStateTrackerImpl;->setPowerSaveExemptionListAppIds([I[I[I)V+]Lcom/android/server/AppStateTrackerImpl$MyHandler;Lcom/android/server/AppStateTrackerImpl$MyHandler; -HSPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->getProperty(ILandroid/os/BatteryProperty;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/health/HealthServiceWrapper;Lcom/android/server/health/HealthServiceWrapperAidl; +HPLcom/android/server/BatteryService$BatteryPropertiesRegistrar;->getProperty(ILandroid/os/BatteryProperty;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/health/HealthServiceWrapper;Lcom/android/server/health/HealthServiceWrapperAidl; HSPLcom/android/server/BatteryService$Led;->updateLightsLocked()V+]Lcom/android/server/lights/LogicalLight;Lcom/android/server/lights/LightsService$LightImpl; -HSPLcom/android/server/BatteryService;->processValuesLocked(Z)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/internal/logging/MetricsLogger;Lcom/android/internal/logging/MetricsLogger;]Lcom/android/server/BatteryService$Led;Lcom/android/server/BatteryService$Led;]Lcom/android/server/BatteryService;Lcom/android/server/BatteryService; -HSPLcom/android/server/BatteryService;->sendBatteryChangedIntentLocked()V -HSPLcom/android/server/BatteryService;->update(Landroid/hardware/health/HealthInfo;)V+]Lcom/android/server/BatteryService;Lcom/android/server/BatteryService;]Ljava/lang/Object;Ljava/lang/Object; +HSPLcom/android/server/BatteryService;->broadcastBatteryChangedIntent(Landroid/content/Context;Landroid/content/Intent;Landroid/os/Bundle;Z)V+]Landroid/content/Context;Landroid/app/ContextImpl; +HSPLcom/android/server/BatteryService;->isPoweredLocked(I)Z +HSPLcom/android/server/BatteryService;->lambda$new$0(Landroid/os/Message;)Z +HSPLcom/android/server/BatteryService;->processValuesLocked(Z)V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/internal/logging/MetricsLogger;Lcom/android/internal/logging/MetricsLogger; +HSPLcom/android/server/BatteryService;->sendBatteryChangedIntentLocked(Z)V +HSPLcom/android/server/BatteryService;->sendBatteryLevelChangedIntentLocked()V +HSPLcom/android/server/BatteryService;->traceBatteryChangedBroadcastEvent(Landroid/content/Intent;Z)V+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/BatteryService;->update(Landroid/hardware/health/HealthInfo;)V HSPLcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->getCallingUid()I -HSPLcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->resolveWorkSourceUid(I)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider; +HSPLcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;->resolveWorkSourceUid(I)I+]Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider;Lcom/android/server/BinderCallsStatsService$AuthorizedWorkSourceProvider; HSPLcom/android/server/CachedDeviceStateService$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/internal/os/CachedDeviceState;Lcom/android/internal/os/CachedDeviceState; HSPLcom/android/server/DeviceIdleController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController; -HSPLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/INetworkPolicyManager;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Lcom/android/server/DeviceIdleInternal$StationaryListener;Lcom/android/server/location/provider/StationaryThrottlingLocationProvider;]Lcom/android/server/PowerAllowlistInternal$TempAllowlistChangeListener;Lcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;]Lcom/android/server/SystemService;Lcom/android/server/DeviceIdleController;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl; -HSPLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJIZILjava/lang/String;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/Handler;Lcom/android/server/DeviceIdleController$MyHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl; +HSPLcom/android/server/DeviceIdleController$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/INetworkPolicyManager;Lcom/android/server/net/NetworkPolicyManagerService;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController;]Lcom/android/server/DeviceIdleInternal$StationaryListener;Lcom/android/server/location/provider/StationaryThrottlingLocationProvider;]Lcom/android/server/PowerAllowlistInternal$TempAllowlistChangeListener;Lcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl; +HSPLcom/android/server/DeviceIdleController;->addPowerSaveTempWhitelistAppDirectInternal(IIJIZILjava/lang/String;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/net/NetworkPolicyManagerInternal;Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl; HPLcom/android/server/DeviceIdleController;->checkTempAppWhitelistTimeout(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/DeviceIdleController;->reportTempWhitelistChangedLocked(IZ)V+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZJIILjava/lang/String;I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/DeviceIdleController;Lcom/android/server/DeviceIdleController; -HSPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Lcom/android/server/DropBoxManagerService$EntryFile;)I+]Ljava/lang/Object;Lcom/android/server/DropBoxManagerService$EntryFile; +HSPLcom/android/server/DeviceIdleController;->updateTempWhitelistAppIdsLocked(IZJIILjava/lang/String;I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/DropBoxManagerService$EntryFile;->compareTo(Lcom/android/server/DropBoxManagerService$EntryFile;)I HSPLcom/android/server/DropBoxManagerService$EntryFile;->getExtension()Ljava/lang/String; HSPLcom/android/server/DropBoxManagerService$EntryFile;->getFilename()Ljava/lang/String; HSPLcom/android/server/DropBoxManagerService;->addEntry(Ljava/lang/String;Lcom/android/server/DropBoxManagerInternal$EntrySource;I)V -HPLcom/android/server/DropBoxManagerService;->checkPermission(ILjava/lang/String;Ljava/lang/String;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V+]Ljava/util/TreeSet;Ljava/util/TreeSet; +HSPLcom/android/server/DropBoxManagerService;->enrollEntry(Lcom/android/server/DropBoxManagerService$EntryFile;)V HPLcom/android/server/DropBoxManagerService;->getNextEntry(Ljava/lang/String;JLjava/lang/String;Ljava/lang/String;)Landroid/os/DropBoxManager$Entry;+]Ljava/util/Iterator;Ljava/util/TreeMap$NavigableSubMap$SubMapKeyIterator;]Ljava/util/SortedSet;Ljava/util/TreeSet;]Ljava/util/TreeSet;Ljava/util/TreeSet; HSPLcom/android/server/DropBoxManagerService;->isTagEnabled(Ljava/lang/String;)Z+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN; HSPLcom/android/server/DropBoxManagerService;->trimToFit()J+]Landroid/os/StatFs;Landroid/os/StatFs;]Ljava/io/File;Ljava/io/File;]Ljava/util/TreeSet;Ljava/util/TreeSet; HSPLcom/android/server/FgThread;->ensureThreadLocked()V HSPLcom/android/server/FgThread;->getHandler()Landroid/os/Handler; HPLcom/android/server/HardwarePropertiesManagerService;->enforceHardwarePropertiesRetrievalAllowed(Ljava/lang/String;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/IntentResolver$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I+]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter; +HSPLcom/android/server/IntentResolver$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/android/server/IntentResolver;->()V -HSPLcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Ljava/lang/Object;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;,Lcom/android/server/am/BroadcastFilter;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->buildResolveList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/util/List;IJ)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/IntentResolver;->addFilter(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->buildResolveList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Landroid/util/FastImmutableArraySet;ZZLjava/lang/String;Ljava/lang/String;[Ljava/lang/Object;Ljava/util/List;IJ)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/IntentResolver;->copyFrom(Lcom/android/server/IntentResolver;)V+]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArraySet;Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;,Lcom/android/server/pm/PreferredIntentResolver;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; +HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArrayMap;Landroid/util/ArrayMap;)V+]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->copyInto(Landroid/util/ArraySet;Landroid/util/ArraySet;)V+]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->filterResults(Ljava/util/List;)V +HSPLcom/android/server/IntentResolver;->findFilters(Landroid/content/IntentFilter;)Ljava/util/ArrayList;+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; HSPLcom/android/server/IntentResolver;->getFastIntentCategories(Landroid/content/Intent;)Landroid/util/FastImmutableArraySet;+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/Set;Landroid/util/ArraySet; -HPLcom/android/server/IntentResolver;->intentMatchesFilter(Landroid/content/IntentFilter;Landroid/content/Intent;Ljava/lang/String;)Z+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/IntentFilter;Landroid/content/IntentFilter; -HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List;+]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;,Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;,Lcom/android/server/pm/CrossProfileIntentResolver;,Lcom/android/server/pm/PreferredIntentResolver; -HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZIJ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/String;Ljava/lang/String; -HSPLcom/android/server/IntentResolver;->queryIntentFromList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;IJ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/IntentResolver;->register_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr; -HSPLcom/android/server/IntentResolver;->register_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Landroid/content/pm/AuxiliaryResolveInfo$AuxiliaryFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HPLcom/android/server/IntentResolver;->intentMatchesFilter(Landroid/content/IntentFilter;Landroid/content/Intent;Ljava/lang/String;)Z+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZI)Ljava/util/List; +HSPLcom/android/server/IntentResolver;->queryIntent(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/content/Intent;Ljava/lang/String;ZIJ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->queryIntentFromList(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;ZLjava/util/ArrayList;IJ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/IntentResolver;->register_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr; +HSPLcom/android/server/IntentResolver;->register_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HSPLcom/android/server/IntentResolver;->removeFilter(Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->removeFilterInternal(Ljava/lang/Object;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types -HSPLcom/android/server/IntentResolver;->remove_all_objects(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->removeFilterInternal(Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types +HSPLcom/android/server/IntentResolver;->remove_all_objects(Landroid/util/ArrayMap;Ljava/lang/String;Ljava/lang/Object;)V+]Lcom/android/server/IntentResolver;megamorphic_types HSPLcom/android/server/IntentResolver;->snapshot(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/server/IntentResolver;->sortResults(Ljava/util/List;)V -HSPLcom/android/server/IntentResolver;->unregister_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr; -HSPLcom/android/server/IntentResolver;->unregister_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLcom/android/server/IntentResolver;->unregister_intent_filter(Ljava/lang/Object;Ljava/util/Iterator;Landroid/util/ArrayMap;Ljava/lang/String;)I+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr; +HSPLcom/android/server/IntentResolver;->unregister_mime_types(Ljava/lang/Object;Ljava/lang/String;)I+]Lcom/android/server/IntentResolver;megamorphic_types]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HSPLcom/android/server/LocalManagerRegistry;->getManager(Ljava/lang/Class;)Ljava/lang/Object;+]Ljava/util/Map;Landroid/util/ArrayMap; HSPLcom/android/server/LockGuard;->guard(I)V -HSPLcom/android/server/NetworkScoreService;->enforceSystemOrHasScoreNetworks()V+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/NetworkScoreService;->getActiveScorerPackage()Ljava/lang/String;+]Lcom/android/server/NetworkScorerAppManager;Lcom/android/server/NetworkScorerAppManager; -HSPLcom/android/server/NetworkScorerAppManager;->getActiveScorer()Landroid/net/NetworkScorerAppData; -HSPLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/NetworkScorerAppManager;Lcom/android/server/NetworkScorerAppManager;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsEnabledSetting()I -HSPLcom/android/server/NetworkScorerAppManager;->getNetworkRecommendationsPackage()Ljava/lang/String; -HSPLcom/android/server/NetworkScorerAppManager;->getScorer(Ljava/lang/String;)Landroid/net/NetworkScorerAppData;+]Lcom/android/server/NetworkScorerAppManager;Lcom/android/server/NetworkScorerAppManager;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/PackageWatchdog$MonitoredPackage;->updateHealthCheckStateLocked()I+]Lcom/android/server/PackageWatchdog$MonitoredPackage;Lcom/android/server/PackageWatchdog$MonitoredPackage;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/NetworkScorerAppManager;->getAllValidScorers()Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->getExternalStorageMountMode(ILjava/lang/String;)I HSPLcom/android/server/StorageManagerService$StorageManagerInternalImpl;->isExternalStorageService(I)Z HSPLcom/android/server/StorageManagerService$WatchedUnlockedUsers;->contains(I)Z -HSPLcom/android/server/StorageManagerService;->getMountModeInternal(ILjava/lang/String;)I+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl; -HSPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/storage/StorageVolume;Landroid/os/storage/StorageVolume;]Landroid/os/storage/VolumeInfo;Landroid/os/storage/VolumeInfo;]Landroid/os/storage/VolumeRecord;Landroid/os/storage/VolumeRecord;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/StorageManagerService;->getVolumes(I)[Landroid/os/storage/VolumeInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/StorageManagerService;->getMountModeInternal(ILjava/lang/String;)I+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/StorageManagerService;->getVolumeList(ILjava/lang/String;I)[Landroid/os/storage/StorageVolume;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/storage/VolumeInfo;Landroid/os/storage/VolumeInfo;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/StorageManagerService;Lcom/android/server/StorageManagerService;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HSPLcom/android/server/StorageManagerService;->getVolumes(I)[Landroid/os/storage/VolumeInfo; HSPLcom/android/server/StorageManagerService;->isCeStorageUnlocked(I)Z+]Lcom/android/server/StorageManagerService$WatchedUnlockedUsers;Lcom/android/server/StorageManagerService$WatchedUnlockedUsers; -HSPLcom/android/server/StorageManagerService;->isUidOwnerOfPackageOrSystem(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HPLcom/android/server/StorageManagerService;->monitor()V+]Landroid/os/IVold;Landroid/os/IVold$Stub$Proxy; -HSPLcom/android/server/StorageManagerService;->updateLegacyStorageApps(Ljava/lang/String;IZ)V+]Ljava/util/Set;Landroid/util/ArraySet; HSPLcom/android/server/SystemConfig;->getInstance()Lcom/android/server/SystemConfig; HSPLcom/android/server/SystemConfig;->readPermissionAllowlist(Lorg/xmlpull/v1/XmlPullParser;Landroid/util/ArrayMap;Ljava/lang/String;)V HSPLcom/android/server/SystemConfig;->readPermissionsFromXml(Lorg/xmlpull/v1/XmlPullParser;Ljava/io/File;I)V -HSPLcom/android/server/SystemServiceManager;->onUser(Lcom/android/server/utils/TimingsTraceAndSlog;Ljava/lang/String;Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$TargetUser;Lcom/android/server/SystemService$UserCompletedEventType;)V+]Lcom/android/server/SystemService;megamorphic_types]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/concurrent/ExecutorService;Ljava/util/concurrent/ThreadPoolExecutor; +HSPLcom/android/server/SystemService;->getContext()Landroid/content/Context; HSPLcom/android/server/SystemServiceManager;->startBootPhase(Lcom/android/server/utils/TimingsTraceAndSlog;I)V -HPLcom/android/server/TelephonyRegistry$Record;->matchTelephonyCallbackEvent(I)Z+]Ljava/util/Set;Ljava/util/HashSet; -HSPLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;IIZ)Lcom/android/server/TelephonyRegistry$Record;+]Landroid/os/IBinder;megamorphic_types]Lcom/android/server/TelephonyRegistry$ConfigurationProvider;Lcom/android/server/TelephonyRegistry$ConfigurationProvider;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/TelephonyRegistry;->listen(ZZLjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;Ljava/util/Set;ZI)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Ljava/util/HashSet; +HSPLcom/android/server/SystemServiceManager;->startService(Ljava/lang/Class;)Lcom/android/server/SystemService; +HSPLcom/android/server/TelephonyRegistry;->add(Landroid/os/IBinder;IIZ)Lcom/android/server/TelephonyRegistry$Record;+]Landroid/os/IBinder;Landroid/os/BinderProxy;,Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;,Landroid/telephony/TelephonyRegistryManager$3;,Landroid/telephony/TelephonyRegistryManager$CarrierPrivilegesCallbackWrapper;]Lcom/android/server/TelephonyRegistry$ConfigurationProvider;Lcom/android/server/TelephonyRegistry$ConfigurationProvider;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/TelephonyRegistry;->listen(ZZLjava/lang/String;Ljava/lang/String;Lcom/android/internal/telephony/IPhoneStateListener;Ljava/util/Set;ZI)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/telephony/IPhoneStateListener;Landroid/telephony/PhoneStateListener$IPhoneStateListenerStub;,Landroid/telephony/TelephonyCallback$IPhoneStateListenerStub;,Lcom/android/internal/telephony/IPhoneStateListener$Stub$Proxy;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Ljava/util/HashSet; HSPLcom/android/server/ThreadPriorityBooster;->boost()V+]Ljava/lang/ThreadLocal;Lcom/android/server/ThreadPriorityBooster$1; HSPLcom/android/server/ThreadPriorityBooster;->reset()V+]Ljava/lang/ThreadLocal;Lcom/android/server/ThreadPriorityBooster$1; HSPLcom/android/server/UiModeManagerService$4;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent; -HSPLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked(Z)V+]Lcom/android/server/UiModeManagerService$NightMode;Lcom/android/server/UiModeManagerService$1;]Lcom/android/server/twilight/TwilightManager;Lcom/android/server/twilight/TwilightService$1; -HSPLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V+]Lcom/android/server/UiModeManagerService$NightMode;Lcom/android/server/UiModeManagerService$1;]Lcom/android/server/twilight/TwilightManager;Lcom/android/server/twilight/TwilightService$1; +HSPLcom/android/server/UiModeManagerService;->updateComputedNightModeLocked(Z)V+]Lcom/android/server/twilight/TwilightManager;Lcom/android/server/twilight/TwilightService$1; +HSPLcom/android/server/UiModeManagerService;->updateConfigurationLocked()V+]Lcom/android/server/twilight/TwilightManager;Lcom/android/server/twilight/TwilightService$1; HSPLcom/android/server/UiModeManagerService;->updateLocked(II)V+]Landroid/content/Context;Landroid/app/ContextImpl; HPLcom/android/server/Watchdog$HandlerChecker;->getCompletionStateLocked()I+]Ljava/time/Clock;Landroid/os/SystemClock$1; HSPLcom/android/server/Watchdog$HandlerChecker;->isHandlerPolling()Z HSPLcom/android/server/Watchdog$HandlerChecker;->run()V+]Lcom/android/server/Watchdog$Monitor;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked(J)V+]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/am/ActivityManagerService$MainHandler;,Lcom/android/server/pm/PackageHandler;]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/time/Clock;Landroid/os/SystemClock$1;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/Watchdog;->evaluateCheckerCompletionLocked()I+]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;Lcom/android/server/Watchdog$HandlerCheckerAndTimeout;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/Watchdog$HandlerChecker;->scheduleCheckLocked(J)V+]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/time/Clock;Landroid/os/SystemClock$1;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->checker()Lcom/android/server/Watchdog$HandlerChecker; +HSPLcom/android/server/Watchdog$HandlerCheckerAndTimeout;->customTimeoutMillis()Ljava/util/Optional; +HPLcom/android/server/Watchdog;->evaluateCheckerCompletionLocked()I+]Lcom/android/server/Watchdog$HandlerChecker;Lcom/android/server/Watchdog$HandlerChecker;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/Watchdog;->run()V -HSPLcom/android/server/accessibility/AccessibilityManagerService;->getEnabledAccessibilityServiceList(II)Ljava/util/List;+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy;]Lcom/android/server/accessibility/AccessibilityServiceConnection;Lcom/android/server/accessibility/AccessibilityServiceConnection;]Lcom/android/server/accessibility/AccessibilityTraceManager;Lcom/android/server/accessibility/AccessibilityTraceManager;]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Lcom/android/server/accessibility/UiAutomationManager;Lcom/android/server/accessibility/UiAutomationManager;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/accessibility/AccessibilityManagerService;->getUserStateLocked(I)Lcom/android/server/accessibility/AccessibilityUserState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/accessibility/AccessibilitySecurityPolicy;->resolveCallingUserIdEnforcingPermissionsLocked(I)I+]Lcom/android/server/accessibility/AccessibilitySecurityPolicy$AccessibilityUserManager;Lcom/android/server/accessibility/AccessibilityManagerService;]Lcom/android/server/accessibility/AccessibilitySecurityPolicy;Lcom/android/server/accessibility/AccessibilitySecurityPolicy; -HSPLcom/android/server/accessibility/ProxyManager;->getFirstDeviceIdForUidLocked(I)I+]Lcom/android/server/accessibility/ProxyManager;Lcom/android/server/accessibility/ProxyManager;]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet; -HPLcom/android/server/accounts/AccountManagerService$8;->onResult(Landroid/os/Bundle;)V -HPLcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;->sendResult()V+]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/IAccountManagerResponse$Stub$Proxy;]Lcom/android/server/accounts/AccountManagerService$Session;Lcom/android/server/accounts/AccountManagerService$GetAccountsByTypeAndFeatureSession;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/accounts/AccountManagerService$Session;->(Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;ZZLjava/lang/String;ZZ)V+]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/accounts/IAccountManagerResponse$Stub$Proxy;]Landroid/os/IBinder;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/os/BinderProxy;]Ljava/lang/Object;megamorphic_types]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap; HPLcom/android/server/accounts/AccountManagerService$Session;->bindToAuthenticator(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache; HPLcom/android/server/accounts/AccountManagerService$Session;->close()V+]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/accounts/IAccountManagerResponse$Stub$Proxy;]Landroid/os/IBinder;Landroid/accounts/AccountManager$BaseFutureTask$Response;,Landroid/os/BinderProxy;]Lcom/android/server/accounts/AccountManagerService$Session;megamorphic_types]Ljava/lang/Object;megamorphic_types]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap; -HPLcom/android/server/accounts/AccountManagerService$Session;->onResult(Landroid/os/Bundle;)V+]Landroid/accounts/IAccountManagerResponse;Landroid/accounts/IAccountManagerResponse$Stub$Proxy;]Lcom/android/server/accounts/AccountManagerService$Session;Lcom/android/server/accounts/AccountManagerService$13;,Lcom/android/server/accounts/AccountManagerService$8;,Lcom/android/server/accounts/AccountManagerService$9;,Lcom/android/server/accounts/AccountManagerService$RemoveAccountSession; -HPLcom/android/server/accounts/AccountManagerService$Session;->unbind()V+]Landroid/content/Context;Landroid/app/ContextImpl; -HPLcom/android/server/accounts/AccountManagerService;->accountExistsCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Z+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/HashMap;Ljava/util/LinkedHashMap; +HPLcom/android/server/accounts/AccountManagerService$Session;->getResponseAndClose()Landroid/accounts/IAccountManagerResponse; +HPLcom/android/server/accounts/AccountManagerService;->accountExistsCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;)Z+]Ljava/util/HashMap;Ljava/util/LinkedHashMap; HPLcom/android/server/accounts/AccountManagerService;->calculatePackageSignatureDigest(Ljava/lang/String;I)[B+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate; -HSPLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V+]Landroid/app/INotificationManager;Lcom/android/server/notification/NotificationManagerService$12;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/accounts/AccountManagerService$Injector;Lcom/android/server/accounts/AccountManagerService$Injector; -HSPLcom/android/server/accounts/AccountManagerService;->checkPackageSignature(Ljava/lang/String;II)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; -HSPLcom/android/server/accounts/AccountManagerService;->filterAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;[Landroid/accounts/Account;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Map;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet; -HSPLcom/android/server/accounts/AccountManagerService;->filterSharedAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/util/Map;ILjava/lang/String;)Ljava/util/Map;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; -HSPLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I+]Ljava/util/Map;Ljava/util/HashMap; -HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; -HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/accounts/AccountManagerService;->cancelNotification(Lcom/android/server/accounts/AccountManagerService$NotificationId;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)V+]Landroid/app/INotificationManager;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/accounts/AccountManagerService$Injector;Lcom/android/server/accounts/AccountManagerService$Injector; +HPLcom/android/server/accounts/AccountManagerService;->checkPackageSignature(Ljava/lang/String;II)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; +HSPLcom/android/server/accounts/AccountManagerService;->filterAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;[Landroid/accounts/Account;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Ljava/util/Map;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet; +HSPLcom/android/server/accounts/AccountManagerService;->filterSharedAccounts(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/util/Map;ILjava/lang/String;)Ljava/util/Map;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager; +HPLcom/android/server/accounts/AccountManagerService;->getAccountVisibilityFromCache(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)I+]Ljava/util/Map;Ljava/util/HashMap; +HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUser(Ljava/lang/String;ILjava/lang/String;)[Landroid/accounts/Account;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager; +HSPLcom/android/server/accounts/AccountManagerService;->getAccountsAsUserForPackage(Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/accounts/AccountManagerService;->getAccountsByFeatures(Landroid/accounts/IAccountManagerResponse;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; -HSPLcom/android/server/accounts/AccountManagerService;->getAccountsFromCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/Collection;Ljava/util/LinkedHashMap$LinkedValues;]Ljava/util/HashMap;Ljava/util/LinkedHashMap;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedValueIterator; -HSPLcom/android/server/accounts/AccountManagerService;->getAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;ILjava/lang/String;Ljava/util/List;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/accounts/AccountManagerService;->getAccountsByTypeForPackage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)[Landroid/accounts/Account;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; +HSPLcom/android/server/accounts/AccountManagerService;->getAccountsFromCache(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;ILjava/lang/String;Z)[Landroid/accounts/Account;+]Ljava/util/Collection;Ljava/util/LinkedHashMap$LinkedValues;]Ljava/util/HashMap;Ljava/util/LinkedHashMap;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedValueIterator; +HSPLcom/android/server/accounts/AccountManagerService;->getAccountsInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;ILjava/lang/String;Ljava/util/List;Z)[Landroid/accounts/Account;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/accounts/AccountManagerService;->getAuthToken(Landroid/accounts/IAccountManagerResponse;Landroid/accounts/Account;Ljava/lang/String;ZZLandroid/os/Bundle;)V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache; -HSPLcom/android/server/accounts/AccountManagerService;->getPackagesAndVisibilityForAccountLocked(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;+]Ljava/util/Map;Ljava/util/HashMap; -HSPLcom/android/server/accounts/AccountManagerService;->getTypesForCaller(IIZ)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; -HSPLcom/android/server/accounts/AccountManagerService;->getUserAccountsNotChecked(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/accounts/AccountManagerService$Injector;Lcom/android/server/accounts/AccountManagerService$Injector;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/accounts/AccountManagerService;->getPackagesAndVisibilityForAccountLocked(Landroid/accounts/Account;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/util/Map;+]Ljava/util/Map;Ljava/util/HashMap; +HSPLcom/android/server/accounts/AccountManagerService;->getTypesForCaller(IIZ)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/accounts/IAccountAuthenticatorCache;Lcom/android/server/accounts/AccountAuthenticatorCache;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; +HSPLcom/android/server/accounts/AccountManagerService;->getUserAccounts(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts; +HSPLcom/android/server/accounts/AccountManagerService;->getUserAccountsNotChecked(I)Lcom/android/server/accounts/AccountManagerService$UserAccounts;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/accounts/AccountManagerService$Injector;Lcom/android/server/accounts/AccountManagerService$Injector;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb; HPLcom/android/server/accounts/AccountManagerService;->getUserData(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; HSPLcom/android/server/accounts/AccountManagerService;->getUserManager()Landroid/os/UserManager; -HSPLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;I)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/accounts/AccountManagerService;->hasAccountAccess(Landroid/accounts/Account;Ljava/lang/String;Landroid/os/UserHandle;)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; HPLcom/android/server/accounts/AccountManagerService;->invalidateAuthToken(Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Lcom/android/server/accounts/TokenCache;Lcom/android/server/accounts/TokenCache;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/accounts/AccountManagerService;->invalidateAuthTokenLocked(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List;+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb; -HSPLcom/android/server/accounts/AccountManagerService;->isPermittedForPackage(Ljava/lang/String;I[Ljava/lang/String;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; -HSPLcom/android/server/accounts/AccountManagerService;->isPreOApplication(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/accounts/AccountManagerService;->isProfileOwner(I)Z+]Landroid/app/admin/DevicePolicyManagerInternal;Lcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService; +HPLcom/android/server/accounts/AccountManagerService;->isPermittedForPackage(Ljava/lang/String;I[Ljava/lang/String;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; +HPLcom/android/server/accounts/AccountManagerService;->isPrivileged(I)Z+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HPLcom/android/server/accounts/AccountManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z HPLcom/android/server/accounts/AccountManagerService;->peekAuthToken(Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; -HSPLcom/android/server/accounts/AccountManagerService;->permissionIsGranted(Landroid/accounts/Account;Ljava/lang/String;II)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; +HPLcom/android/server/accounts/AccountManagerService;->permissionIsGranted(Landroid/accounts/Account;Ljava/lang/String;II)Z HPLcom/android/server/accounts/AccountManagerService;->readAuthTokenInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Ljava/util/Map;Ljava/util/HashMap; HPLcom/android/server/accounts/AccountManagerService;->readUserDataInternal(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb;]Ljava/util/Map;Ljava/util/HashMap; -HSPLcom/android/server/accounts/AccountManagerService;->resolveAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/lang/Integer;+]Landroid/content/pm/PackageManager$NameNotFoundException;Landroid/content/pm/PackageManager$NameNotFoundException;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/accounts/AccountManagerService;->resolveAccountVisibility(Landroid/accounts/Account;Ljava/lang/String;Lcom/android/server/accounts/AccountManagerService$UserAccounts;)Ljava/lang/Integer;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HPLcom/android/server/accounts/AccountManagerService;->saveAuthTokenToDatabase(Lcom/android/server/accounts/AccountManagerService$UserAccounts;Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)Z+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService;]Lcom/android/server/accounts/AccountsDb;Lcom/android/server/accounts/AccountsDb; HPLcom/android/server/accounts/AccountManagerService;->setAuthToken(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; HPLcom/android/server/accounts/AccountManagerService;->setUserData(Landroid/accounts/Account;Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/accounts/AccountManagerService;Lcom/android/server/accounts/AccountManagerService; @@ -206,29 +191,34 @@ HPLcom/android/server/accounts/AccountsDb;->insertAuthToken(JLjava/lang/String;L HSPLcom/android/server/accounts/AccountsDb;->isCeDatabaseAttached()Z HPLcom/android/server/accounts/AccountsDb;->setTransactionSuccessful()V+]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper; HPLcom/android/server/accounts/AccountsDb;->updateExtra(JLjava/lang/String;)Z+]Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper;Lcom/android/server/accounts/AccountsDb$DeDatabaseHelper; +HPLcom/android/server/accounts/TokenCache$Key;->equals(Ljava/lang/Object;)Z HPLcom/android/server/accounts/TokenCache$Key;->hashCode()I+]Landroid/accounts/Account;Landroid/accounts/Account; -HSPLcom/android/server/alarm/Alarm$Snapshot;->(Lcom/android/server/alarm/Alarm;)V -HSPLcom/android/server/alarm/Alarm;->(IJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;ILandroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/PendingIntent;Landroid/app/PendingIntent; -HSPLcom/android/server/alarm/Alarm;->makeTag(Landroid/app/PendingIntent;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/alarm/Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Ljava/lang/Object;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2; -HSPLcom/android/server/alarm/Alarm;->setPolicyElapsed(IJ)Z+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm; +HPLcom/android/server/alarm/Alarm$Snapshot;->(Lcom/android/server/alarm/Alarm;)V +HSPLcom/android/server/alarm/Alarm;->(IJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;ILandroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V +HSPLcom/android/server/alarm/Alarm;->getMaxWhenElapsed()J +HSPLcom/android/server/alarm/Alarm;->getWhenElapsed()J +HSPLcom/android/server/alarm/Alarm;->makeTag(Landroid/app/PendingIntent;Ljava/lang/String;I)Ljava/lang/String; +HSPLcom/android/server/alarm/Alarm;->matches(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)Z+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2; +HSPLcom/android/server/alarm/Alarm;->setPolicyElapsed(IJ)Z HSPLcom/android/server/alarm/Alarm;->updateWhenElapsed()Z HSPLcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda13;->test(Ljava/lang/Object;)Z -HSPLcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda15;->updateAlarmDelivery(Lcom/android/server/alarm/Alarm;)Z +HPLcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda15;->updateAlarmDelivery(Lcom/android/server/alarm/Alarm;)Z HPLcom/android/server/alarm/AlarmManagerService$4;->canScheduleExactAlarms(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HSPLcom/android/server/alarm/AlarmManagerService$4;->remove(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; -HSPLcom/android/server/alarm/AlarmManagerService$4;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; -HSPLcom/android/server/alarm/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/alarm/AlarmManagerService$4;->set(Ljava/lang/String;IJJJILandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;Landroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; +HSPLcom/android/server/alarm/AlarmManagerService$7$$ExternalSyntheticLambda0;->updateAlarmDelivery(Lcom/android/server/alarm/Alarm;)Z +HSPLcom/android/server/alarm/AlarmManagerService$7;->updateAlarmsForUid(I)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore; +HPLcom/android/server/alarm/AlarmManagerService$AlarmHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HSPLcom/android/server/alarm/AlarmManagerService$AlarmThread;->run()V HPLcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;->getTotalWakeupsInWindow(Ljava/lang/String;I)I+]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue; HSPLcom/android/server/alarm/AlarmManagerService$ClockReceiver;->scheduleTimeTickEvent()V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->alarmComplete(Landroid/os/IBinder;)V -HSPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/Handler;Lcom/android/server/alarm/AlarmManagerService$AlarmHandler;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/Message;Landroid/os/Message;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Lcom/android/server/alarm/AlarmManagerService$InFlight;Lcom/android/server/alarm/AlarmManagerService$InFlight;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->deliverLocked(Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/app/PendingIntent;Landroid/content/Intent;)Lcom/android/server/alarm/AlarmManagerService$InFlight;+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/alarm/AlarmManagerService$InFlight;+]Lcom/android/internal/util/LocalLog;Lcom/android/internal/util/LocalLog;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->removeLocked(Landroid/os/IBinder;)Lcom/android/server/alarm/AlarmManagerService$InFlight;+]Lcom/android/internal/util/LocalLog;Lcom/android/internal/util/LocalLog;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateStatsLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector; -HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V+]Landroid/os/Handler;Lcom/android/server/alarm/AlarmManagerService$AlarmHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/alarm/AlarmManagerService$InFlight;->(Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HPLcom/android/server/alarm/AlarmManagerService$DeliveryTracker;->updateTrackingLocked(Lcom/android/server/alarm/AlarmManagerService$InFlight;)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/alarm/AlarmManagerService$InFlight;->(Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/Alarm;J)V+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2; HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getCallingUid()I HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getCurrentTimeMillis()J HSPLcom/android/server/alarm/AlarmManagerService$Injector;->getElapsedRealtimeMillis()J @@ -236,128 +226,124 @@ HSPLcom/android/server/alarm/AlarmManagerService$Injector;->isAlarmDriverPresent HSPLcom/android/server/alarm/AlarmManagerService$Injector;->setAlarm(IJ)V HPLcom/android/server/alarm/AlarmManagerService$LocalService;->remove(Landroid/app/PendingIntent;)V HSPLcom/android/server/alarm/AlarmManagerService$LocalService;->shouldGetBucketElevation(Ljava/lang/String;I)Z+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; -HSPLcom/android/server/alarm/AlarmManagerService$RemovedAlarm;->(Lcom/android/server/alarm/Alarm;IJJ)V +HPLcom/android/server/alarm/AlarmManagerService$RemovedAlarm;->(Lcom/android/server/alarm/Alarm;IJJ)V HSPLcom/android/server/alarm/AlarmManagerService;->-$$Nest$fgetmInjector(Lcom/android/server/alarm/AlarmManagerService;)Lcom/android/server/alarm/AlarmManagerService$Injector; HSPLcom/android/server/alarm/AlarmManagerService;->-$$Nest$fgetmPackageManagerInternal(Lcom/android/server/alarm/AlarmManagerService;)Landroid/content/pm/PackageManagerInternal; HSPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnBatterySaver(Lcom/android/server/alarm/Alarm;)Z+]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector; HSPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnBucketLocked(Lcom/android/server/alarm/Alarm;)Z+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService$TemporaryQuotaReserve;Lcom/android/server/alarm/AlarmManagerService$TemporaryQuotaReserve;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HPLcom/android/server/alarm/AlarmManagerService;->adjustDeliveryTimeBasedOnDeviceIdle(Lcom/android/server/alarm/Alarm;)Z+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;Lcom/android/server/alarm/AlarmManagerService$AppWakeupHistory;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector; -HSPLcom/android/server/alarm/AlarmManagerService;->calculateDeliveryPriorities(Ljava/util/ArrayList;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/alarm/AlarmManagerService;->calculateDeliveryPriorities(Ljava/util/ArrayList;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/alarm/AlarmManagerService;->convertToElapsed(JI)J+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector; -HSPLcom/android/server/alarm/AlarmManagerService;->decrementAlarmCount(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/alarm/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/alarm/AlarmManagerService;->getQuotaForBucketLocked(I)I -HSPLcom/android/server/alarm/AlarmManagerService;->hasScheduleExactAlarmInternal(Ljava/lang/String;I)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/alarm/AlarmManagerService;->hasUseExactAlarmInternal(Ljava/lang/String;I)Z+]Lcom/android/server/SystemService;Lcom/android/server/alarm/AlarmManagerService; +HSPLcom/android/server/alarm/AlarmManagerService;->decrementAlarmCount(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/alarm/AlarmManagerService;->deliverAlarmsLocked(Ljava/util/ArrayList;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;Lcom/android/server/alarm/AlarmManagerService$DeliveryTracker;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/alarm/AlarmManagerService;->hasScheduleExactAlarmInternal(Ljava/lang/String;I)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; +HSPLcom/android/server/alarm/AlarmManagerService;->hasUseExactAlarmInternal(Ljava/lang/String;I)Z HSPLcom/android/server/alarm/AlarmManagerService;->increment(Landroid/util/SparseIntArray;I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/alarm/AlarmManagerService;->incrementAlarmCount(I)V HSPLcom/android/server/alarm/AlarmManagerService;->isExactAlarmChangeEnabled(Ljava/lang/String;I)Z HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromAppStandby(Lcom/android/server/alarm/Alarm;)Z -HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromBatterySaver(Lcom/android/server/alarm/Alarm;)Z+]Landroid/app/PendingIntent;Landroid/app/PendingIntent; -HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromExactAlarmPermissionNoLock(I)Z+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService; -HSPLcom/android/server/alarm/AlarmManagerService;->lambda$reorderAlarmsBasedOnStandbyBuckets$5(Landroid/util/ArraySet;Lcom/android/server/alarm/Alarm;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; -HSPLcom/android/server/alarm/AlarmManagerService;->logAlarmBatchDelivered(IILandroid/util/SparseIntArray;Landroid/util/SparseIntArray;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/alarm/AlarmManagerService;->isExemptFromBatterySaver(Lcom/android/server/alarm/Alarm;)Z +HPLcom/android/server/alarm/AlarmManagerService;->isExemptFromExactAlarmPermissionNoLock(I)Z+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService; +HPLcom/android/server/alarm/AlarmManagerService;->lambda$onStart$6([I[I)V +HPLcom/android/server/alarm/AlarmManagerService;->lambda$removeExactListenerAlarms$7([ILcom/android/server/alarm/Alarm;)Z +HPLcom/android/server/alarm/AlarmManagerService;->lambda$reorderAlarmsBasedOnStandbyBuckets$5(Landroid/util/ArraySet;Lcom/android/server/alarm/Alarm;)Z HSPLcom/android/server/alarm/AlarmManagerService;->maxTriggerTime(JJJ)J HSPLcom/android/server/alarm/AlarmManagerService;->removeAlarmsInternalLocked(Ljava/util/function/Predicate;I)V+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/function/Predicate;megamorphic_types -HSPLcom/android/server/alarm/AlarmManagerService;->removeLocked(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;I)V+]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; -HSPLcom/android/server/alarm/AlarmManagerService;->reorderAlarmsBasedOnStandbyBuckets(Landroid/util/ArraySet;)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore; -HSPLcom/android/server/alarm/AlarmManagerService;->rescheduleKernelAlarmsLocked()V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/alarm/AlarmManagerService;->setImpl(IJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/alarm/AlarmManagerService;->removeLocked(Landroid/app/PendingIntent;Landroid/app/IAlarmListener;I)V +HPLcom/android/server/alarm/AlarmManagerService;->reorderAlarmsBasedOnStandbyBuckets(Landroid/util/ArraySet;)Z+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore; +HSPLcom/android/server/alarm/AlarmManagerService;->rescheduleKernelAlarmsLocked()V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Lcom/android/server/alarm/UserWakeupStore;Lcom/android/server/alarm/UserWakeupStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/alarm/AlarmManagerService;->setImpl(IJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/IAlarmListener;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/app/IAlarmListener$Stub$Proxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/os/IBinder;Landroid/app/AlarmManager$ListenerWrapper;,Landroid/os/BinderProxy;,Lcom/android/server/alarm/AlarmManagerService$2;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HSPLcom/android/server/alarm/AlarmManagerService;->setImplLocked(IJJJJLandroid/app/PendingIntent;Landroid/app/IAlarmListener;Ljava/lang/String;ILandroid/os/WorkSource;Landroid/app/AlarmManager$AlarmClockInfo;ILjava/lang/String;Landroid/os/Bundle;I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService; HSPLcom/android/server/alarm/AlarmManagerService;->setImplLocked(Lcom/android/server/alarm/Alarm;)V+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore; HSPLcom/android/server/alarm/AlarmManagerService;->setLocked(IJ)V+]Lcom/android/server/alarm/AlarmManagerService$Injector;Lcom/android/server/alarm/AlarmManagerService$Injector; -HSPLcom/android/server/alarm/AlarmManagerService;->setWakelockWorkSource(Landroid/os/WorkSource;ILjava/lang/String;Z)V+]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock; -HSPLcom/android/server/alarm/AlarmManagerService;->triggerAlarmsLocked(Ljava/util/ArrayList;J)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; -HSPLcom/android/server/alarm/AlarmManagerService;->updateNextAlarmClockLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/lang/Object;Landroid/app/AlarmManager$AlarmClockInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HPLcom/android/server/alarm/AlarmManagerService;->setWakelockWorkSource(Landroid/os/WorkSource;ILjava/lang/String;Z)V +HPLcom/android/server/alarm/AlarmManagerService;->triggerAlarmsLocked(Ljava/util/ArrayList;J)I+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/AlarmManagerService;Lcom/android/server/alarm/AlarmManagerService;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLcom/android/server/alarm/AlarmManagerService;->updateNextAlarmClockLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/alarm/AlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HSPLcom/android/server/alarm/LazyAlarmStore$$ExternalSyntheticLambda0;->applyAsLong(Ljava/lang/Object;)J+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm; HSPLcom/android/server/alarm/LazyAlarmStore;->add(Lcom/android/server/alarm/Alarm;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/alarm/LazyAlarmStore;->getNextDeliveryTime()J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/alarm/LazyAlarmStore;->getNextWakeupDeliveryTime()J+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/alarm/LazyAlarmStore;->remove(Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/lang/Runnable;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda3;,Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda4;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Predicate;megamorphic_types -HSPLcom/android/server/alarm/LazyAlarmStore;->removePendingAlarms(J)Ljava/util/ArrayList;+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/LazyAlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/alarm/LazyAlarmStore;->remove(Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/lang/Runnable;Lcom/android/server/alarm/AlarmManagerService$$ExternalSyntheticLambda4;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Predicate;megamorphic_types +HPLcom/android/server/alarm/LazyAlarmStore;->removePendingAlarms(J)Ljava/util/ArrayList;+]Lcom/android/server/alarm/Alarm;Lcom/android/server/alarm/Alarm;]Lcom/android/server/alarm/LazyAlarmStore;Lcom/android/server/alarm/LazyAlarmStore;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/alarm/LazyAlarmStore;->size()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/alarm/LazyAlarmStore;->updateAlarmDeliveries(Lcom/android/server/alarm/AlarmStore$AlarmDeliveryCalculator;)Z+]Lcom/android/server/alarm/AlarmStore$AlarmDeliveryCalculator;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HSPLcom/android/server/alarm/MetricsHelper;->pushAlarmScheduled(Lcom/android/server/alarm/Alarm;I)V -HSPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/alarm/UserWakeupStore;->getNextWakeupTime()J+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray; +HSPLcom/android/server/am/ActiveServices$$ExternalSyntheticLambda7;->apply(Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->getPid(Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->getPid(Ljava/lang/Object;)I+]Lcom/android/server/am/ActiveServices$ProcessAnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer; +HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->getUid(Lcom/android/server/am/ProcessRecord;)I +HSPLcom/android/server/am/ActiveServices$ProcessAnrTimer;->getUid(Ljava/lang/Object;)I+]Lcom/android/server/am/ActiveServices$ProcessAnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer; HSPLcom/android/server/am/ActiveServices$ServiceLookupResult;->(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ServiceRecord;Landroid/content/ComponentName;)V -HSPLcom/android/server/am/ActiveServices$ServiceMap;->ensureNotStartingBackgroundLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActiveServices$ServiceMap;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ActiveServices$ServiceMap;->rescheduleDelayedStartsLocked()V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices$ServiceRestarter;->(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices$ServiceRestarter-IA;)V +HSPLcom/android/server/am/ActiveServices$ServiceMap;->ensureNotStartingBackgroundLocked(Lcom/android/server/am/ServiceRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices$ServiceRestarter;->(Lcom/android/server/am/ActiveServices;)V +HSPLcom/android/server/am/ActiveServices$ServiceRestarter;->(Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices-IA;)V +HSPLcom/android/server/am/ActiveServices$ServiceRestarter;->setService(Lcom/android/server/am/ServiceRecord;)V HSPLcom/android/server/am/ActiveServices;->attachApplicationLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZZLjava/lang/String;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ForegroundServiceTypeLoggerModule;Lcom/android/server/am/ForegroundServiceTypeLoggerModule;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->bringUpServiceInnerLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String;+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppStartInfoTracker;Lcom/android/server/am/AppStartInfoTracker;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->bringUpServiceLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String;+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;IZ)V+]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HPLcom/android/server/am/ActiveServices;->canBindingClientStartFgsLocked(I)Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->deferServiceBringupIfFrozenLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IZZILandroid/app/BackgroundStartPrivileges;ZLandroid/app/IServiceConnection;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->dropFgsNotificationStateLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->generateAdditionalSeInfoFromService(Landroid/content/Intent;)Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->getAllowMode(Landroid/content/Intent;Ljava/lang/String;)I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->getHostingRecordTriggerType(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String;+]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->getProcessNameForService(Landroid/content/pm/ServiceInfo;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ZZZ)Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ActiveServices;->bindServiceLocked(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->bringDownServiceIfNeededLocked(Lcom/android/server/am/ServiceRecord;ZZZLjava/lang/String;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->bringDownServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ForegroundServiceTypeLoggerModule;Lcom/android/server/am/ForegroundServiceTypeLoggerModule;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->bringUpServiceInnerLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String;+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->bringUpServiceLocked(Lcom/android/server/am/ServiceRecord;IZZZZZI)Ljava/lang/String; +HSPLcom/android/server/am/ActiveServices;->bumpServiceExecutingLocked(Lcom/android/server/am/ServiceRecord;ZLjava/lang/String;IZ)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HSPLcom/android/server/am/ActiveServices;->cancelForegroundNotificationLocked(Lcom/android/server/am/ServiceRecord;)V +HSPLcom/android/server/am/ActiveServices;->deferServiceBringupIfFrozenLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;IZZILandroid/app/BackgroundStartPrivileges;ZLandroid/app/IServiceConnection;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->dropFgsNotificationStateLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/ActiveServices;->generateAdditionalSeInfoFromService(Landroid/content/Intent;)Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/ActiveServices;->getAllowMode(Landroid/content/Intent;Ljava/lang/String;)I+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/ActiveServices;->getHostingRecordTriggerType(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String; +HSPLcom/android/server/am/ActiveServices;->getProcessNameForService(Landroid/content/pm/ServiceInfo;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ZZZ)Ljava/lang/String; +HPLcom/android/server/am/ActiveServices;->getRunningServiceInfoLocked(IIIZZ)Ljava/util/List;+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ActiveServices;->getServiceBindingOomAdjPolicyForAddLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)I+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ActiveServices;->getServiceBindingOomAdjPolicyForRemovalLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)I+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/ActiveServices;->getServiceMapLocked(I)Lcom/android/server/am/ActiveServices$ServiceMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/ActiveServices;->getShortProcessNameForStats(ILjava/lang/String;)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/lang/String;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->getShortServiceNameForStats(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HSPLcom/android/server/am/ActiveServices;->isServiceNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)Z+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HSPLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ActiveServices;->lambda$canBindingClientStartFgsLocked$6(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Landroid/util/Pair;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsStartForegroundNoBindingCheckLocked$7(IZLcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsWhileInUsePermissionByBindingsLocked$5(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ActiveServices;->makeRunningServiceInfoLocked(Lcom/android/server/am/ServiceRecord;)Landroid/app/ActivityManager$RunningServiceInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->maybeLogBindCrossProfileService(ILjava/lang/String;I)V+]Landroid/app/admin/DevicePolicyEventLogger;Landroid/app/admin/DevicePolicyEventLogger;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; -HSPLcom/android/server/am/ActiveServices;->maybeStopFgsTimeoutLocked(Lcom/android/server/am/ServiceRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ServiceRecord$TimeLimitedFgsInfo;Lcom/android/server/am/ServiceRecord$TimeLimitedFgsInfo;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ServiceAnrTimer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActiveServices;->notifyBindingServiceEventLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message; -HSPLcom/android/server/am/ActiveServices;->publishServiceLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Landroid/os/IBinder;)V+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->realStartServiceLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;ZZI)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/wm/ActivityServiceConnectionsHolder;Z)I+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->requestServiceBindingLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;ZZI)Z+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/Intent$FilterComparison;Landroid/content/Intent$FilterComparison;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->requestServiceBindingsLocked(Lcom/android/server/am/ServiceRecord;ZI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; +HSPLcom/android/server/am/ActiveServices;->getShortProcessNameForStats(ILjava/lang/String;)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; +HSPLcom/android/server/am/ActiveServices;->getShortServiceNameForStats(Lcom/android/server/am/ServiceRecord;)Ljava/lang/String; +HSPLcom/android/server/am/ActiveServices;->isServiceNeededLocked(Lcom/android/server/am/ServiceRecord;ZZ)Z +HSPLcom/android/server/am/ActiveServices;->killServicesLocked(Lcom/android/server/am/ProcessRecord;Z)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/am/ActiveServices;->lambda$canBindingClientStartFgsLocked$6(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Landroid/util/Pair;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsStartForegroundNoBindingCheckLocked$7(IZLcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActiveServices;->lambda$shouldAllowFgsWhileInUsePermissionByBindingsLocked$5(ILandroid/util/ArraySet;Lcom/android/server/am/ProcessRecord;)Ljava/lang/Integer;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/am/ActiveServices;->makeRunningServiceInfoLocked(Lcom/android/server/am/ServiceRecord;)Landroid/app/ActivityManager$RunningServiceInfo;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->maybeLogBindCrossProfileService(ILjava/lang/String;I)V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; +HSPLcom/android/server/am/ActiveServices;->notifyBindingServiceEventLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;)V +HSPLcom/android/server/am/ActiveServices;->publishServiceLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Landroid/os/IBinder;)V+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->realStartServiceLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;ZZI)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->removeConnectionLocked(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/wm/ActivityServiceConnectionsHolder;Z)I+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->requestServiceBindingLocked(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;ZZI)Z+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->requestServiceBindingsLocked(Lcom/android/server/am/ServiceRecord;ZI)V HSPLcom/android/server/am/ActiveServices;->requestStartTargetPermissionsReviewIfNeededLocked(Lcom/android/server/am/ServiceRecord;Ljava/lang/String;Ljava/lang/String;ILandroid/content/Intent;ZIZLandroid/app/IServiceConnection;)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActiveServices;->resetFgsRestrictionLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices$ServiceRestarter;Lcom/android/server/am/ActiveServices$ServiceRestarter;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->scheduleServiceTimeoutLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ActiveServices$ProcessAnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer; -HSPLcom/android/server/am/ActiveServices;->sendServiceArgsLocked(Lcom/android/server/am/ServiceRecord;ZZ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;IIIZLandroid/content/Intent;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;ZZZI)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;Z)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;ZZ)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundNoBindingCheckLocked(IIILjava/lang/String;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundWithBindingCheckLocked(ILjava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;Z)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ActiveServices;->resetFgsRestrictionLocked(Lcom/android/server/am/ServiceRecord;)V +HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult; +HSPLcom/android/server/am/ActiveServices;->retrieveServiceLocked(Landroid/content/Intent;Ljava/lang/String;ZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIZZZZLandroid/app/ForegroundServiceDelegationOptions;ZZZ)Lcom/android/server/am/ActiveServices$ServiceLookupResult;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->scheduleServiceTimeoutLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer; +HSPLcom/android/server/am/ActiveServices;->sendServiceArgsLocked(Lcom/android/server/am/ServiceRecord;ZZ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;IIIZLandroid/content/Intent;)V+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->serviceDoneExecutingLocked(Lcom/android/server/am/ServiceRecord;ZZZI)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;Z)V +HSPLcom/android/server/am/ActiveServices;->setFgsRestrictionLocked(Ljava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;ILandroid/app/BackgroundStartPrivileges;ZZ)V +HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundNoBindingCheckLocked(IIILjava/lang/String;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsStartForegroundWithBindingCheckLocked(ILjava/lang/String;IILandroid/content/Intent;Lcom/android/server/am/ServiceRecord;Landroid/app/BackgroundStartPrivileges;Z)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionByBindingsLocked(I)I -HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionLocked(Ljava/lang/String;IILcom/android/server/am/ProcessRecord;Landroid/app/BackgroundStartPrivileges;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZILjava/lang/String;IZLjava/lang/String;)Landroid/content/ComponentName;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;IILjava/lang/String;IZZLandroid/app/BackgroundStartPrivileges;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;ILandroid/app/BackgroundStartPrivileges;ZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HPLcom/android/server/am/ActiveServices;->stopInBackgroundLocked(I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActiveServices$ServiceMap;Lcom/android/server/am/ActiveServices$ServiceMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->stopServiceAndUpdateAllowlistManagerLocked(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; +HSPLcom/android/server/am/ActiveServices;->shouldAllowFgsWhileInUsePermissionLocked(Ljava/lang/String;IILcom/android/server/am/ProcessRecord;Landroid/app/BackgroundStartPrivileges;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ActiveServices$ServiceMap;Landroid/content/Intent;Lcom/android/server/am/ServiceRecord;ZZILjava/lang/String;IZLjava/lang/String;)Landroid/content/ComponentName;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->startServiceInnerLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;IILjava/lang/String;IZZLandroid/app/BackgroundStartPrivileges;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;ILandroid/app/BackgroundStartPrivileges;ZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; +HSPLcom/android/server/am/ActiveServices;->startServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IIZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName; +HPLcom/android/server/am/ActiveServices;->stopInBackgroundLocked(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HSPLcom/android/server/am/ActiveServices;->stopServiceAndUpdateAllowlistManagerLocked(Lcom/android/server/am/ServiceRecord;)V HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HPLcom/android/server/am/ActiveServices;->stopServiceLocked(Lcom/android/server/am/ServiceRecord;Z)V HPLcom/android/server/am/ActiveServices;->stopServiceTokenLocked(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->traceInstant(Ljava/lang/String;Lcom/android/server/am/ServiceRecord;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ActiveServices;->traceInstant(Ljava/lang/String;Lcom/android/server/am/ServiceRecord;)V HPLcom/android/server/am/ActiveServices;->unbindFinishedLocked(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent;Z)V+]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->unscheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;IZ)Z+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ConnectionRecord;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActiveServices;->updateServiceForegroundLocked(Lcom/android/server/am/ProcessServiceRecord;Z)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; -HPLcom/android/server/am/ActiveServices;->verifyPackage(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HSPLcom/android/server/am/ActiveServices;->unbindServiceLocked(Landroid/app/IServiceConnection;)Z+]Landroid/app/IServiceConnection;Landroid/app/IServiceConnection$Stub$Proxy;,Landroid/app/LoadedApk$ServiceDispatcher$InnerConnection;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->unscheduleServiceRestartLocked(Lcom/android/server/am/ServiceRecord;IZ)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->updateServiceClientActivitiesLocked(Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ConnectionRecord;Z)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActiveServices;->updateServiceForegroundLocked(Lcom/android/server/am/ProcessServiceRecord;Z)V HSPLcom/android/server/am/ActiveUids;->get(I)Lcom/android/server/am/UidRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/ActiveUids;->put(ILcom/android/server/am/UidRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/ActiveUids;->put(ILcom/android/server/am/UidRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/am/ActivityManagerConstants;->shouldDebugUidForProcState(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/am/ActivityManagerService$3;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService$3;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3; -HSPLcom/android/server/am/ActivityManagerService$3;->getIntentFilter(Lcom/android/server/am/BroadcastFilter;)Landroid/content/IntentFilter; -HSPLcom/android/server/am/ActivityManagerService$3;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3; -HSPLcom/android/server/am/ActivityManagerService$3;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/am/BroadcastFilter;)Z+]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActivityManagerService$3;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3; -HSPLcom/android/server/am/ActivityManagerService$3;->newResult(Lcom/android/server/pm/Computer;Lcom/android/server/am/BroadcastFilter;IIJ)Lcom/android/server/am/BroadcastFilter; -HSPLcom/android/server/am/ActivityManagerService$3;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/am/ActivityManagerService$3;Lcom/android/server/am/ActivityManagerService$3; HSPLcom/android/server/am/ActivityManagerService$Injector;->clearCallingIdentity()J HSPLcom/android/server/am/ActivityManagerService$Injector;->ensureHasNetworkManagementInternal()Z HSPLcom/android/server/am/ActivityManagerService$Injector;->getCallingPid()I @@ -367,269 +353,272 @@ HSPLcom/android/server/am/ActivityManagerService$Injector;->restoreCallingIdenti HSPLcom/android/server/am/ActivityManagerService$LocalService;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; HSPLcom/android/server/am/ActivityManagerService$LocalService;->deletePendingTopUid(IJ)V HSPLcom/android/server/am/ActivityManagerService$LocalService;->getCurrentUserId()I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; -HSPLcom/android/server/am/ActivityManagerService$LocalService;->getRestrictionLevel(I)I+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; +HSPLcom/android/server/am/ActivityManagerService$LocalService;->getRestrictionLevel(I)I HSPLcom/android/server/am/ActivityManagerService$LocalService;->getUidProcessState(I)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService$LocalService;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAppBad(Ljava/lang/String;I)Z HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAppStartModeDisabled(ILjava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HPLcom/android/server/am/ActivityManagerService$LocalService;->isAssociatedCompanionApp(II)Z+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/ArraySet; -HSPLcom/android/server/am/ActivityManagerService$LocalService;->isBgAutoRestrictedBucketFeatureFlagEnabled()Z+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; +HSPLcom/android/server/am/ActivityManagerService$LocalService;->isAssociatedCompanionApp(II)Z+]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/am/ActivityManagerService$LocalService;->isBgAutoRestrictedBucketFeatureFlagEnabled()Z HSPLcom/android/server/am/ActivityManagerService$LocalService;->isDeviceOwner(I)Z -HSPLcom/android/server/am/ActivityManagerService$LocalService;->isPendingTopUid(I)Z+]Lcom/android/server/am/PendingStartActivityUids;Lcom/android/server/am/PendingStartActivityUids; -HSPLcom/android/server/am/ActivityManagerService$LocalService;->isProfileOwner(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/ActivityManagerService$LocalService;->isPendingTopUid(I)Z +HSPLcom/android/server/am/ActivityManagerService$LocalService;->isProfileOwner(I)Z HPLcom/android/server/am/ActivityManagerService$LocalService;->isTempAllowlistedForFgsWhileInUse(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; HSPLcom/android/server/am/ActivityManagerService$LocalService;->isUidActive(I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService$LocalService;->notifyNetworkPolicyRulesUpdated(IJ)V HSPLcom/android/server/am/ActivityManagerService$LocalService;->onUidBlockedReasonsChanged(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HPLcom/android/server/am/ActivityManagerService$LocalService;->startServiceInPackage(ILandroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;ILandroid/app/BackgroundStartPrivileges;)Landroid/content/ComponentName; -HSPLcom/android/server/am/ActivityManagerService$LocalService;->updateDeviceIdleTempAllowlist([IIZJIILjava/lang/String;I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; +HSPLcom/android/server/am/ActivityManagerService$LocalService;->updateDeviceIdleTempAllowlist([IIZJIILjava/lang/String;I)V+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; HSPLcom/android/server/am/ActivityManagerService$MainHandler$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V HSPLcom/android/server/am/ActivityManagerService$MainHandler$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V -HSPLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/IUiAutomationConnection;Landroid/app/IUiAutomationConnection$Stub$Proxy;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Thread;Lcom/android/server/am/ActivityManagerService$MainHandler$1;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; +HSPLcom/android/server/am/ActivityManagerService$MainHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; HSPLcom/android/server/am/ActivityManagerService$MainHandler;->lambda$handleMessage$1(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BroadcastEventListener;)V+]Landroid/app/ActivityManagerInternal$BroadcastEventListener;Lcom/android/server/am/AppBroadcastEventsTracker; -HSPLcom/android/server/am/ActivityManagerService$MainHandler;->lambda$handleMessage$2(Landroid/os/Message;Landroid/app/ActivityManagerInternal$BindServiceEventListener;)V+]Landroid/app/ActivityManagerInternal$BindServiceEventListener;Lcom/android/server/am/AppBindServiceEventsTracker; HSPLcom/android/server/am/ActivityManagerService$PendingTempAllowlist;->(IJILjava/lang/String;II)V HSPLcom/android/server/am/ActivityManagerService$PidMap;->get(I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/ActivityManagerService;->addErrorToDropBox(Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Ljava/io/File;Landroid/app/ApplicationErrorReport$CrashInfo;Ljava/lang/Float;Landroid/os/incremental/IncrementalMetrics;Ljava/util/UUID;Lcom/android/server/am/ActivityManagerService$VolatileDropboxEntryStates;)V+]Landroid/os/DropBoxManager;Landroid/os/DropBoxManager;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/DropboxRateLimiter$RateLimitResult;Lcom/android/server/am/DropboxRateLimiter$RateLimitResult;]Lcom/android/server/am/DropboxRateLimiter;Lcom/android/server/am/DropboxRateLimiter;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ActivityManagerService;->addPidLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;ZLjava/lang/String;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ActivityManagerService;->attachApplication(Landroid/app/IApplicationThread;J)V -HSPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;IIJ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/autofill/AutofillManagerInternal;Lcom/android/server/autofill/AutofillManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;]Lcom/android/server/graphics/fonts/FontManagerInternal;Lcom/android/server/graphics/fonts/FontManagerService$Lifecycle$1;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ActivityManagerService;->addStartInfoTimestampInternal(IJII)V +HSPLcom/android/server/am/ActivityManagerService;->appDiedLocked(Lcom/android/server/am/ProcessRecord;ILandroid/app/IApplicationThread;ZLjava/lang/String;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActivityManagerService;->attachApplicationLocked(Landroid/app/IApplicationThread;IIJ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/os/IBinder;Landroid/os/BinderProxy;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/autofill/AutofillManagerInternal;Lcom/android/server/autofill/AutofillManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;]Lcom/android/server/graphics/fonts/FontManagerInternal;Lcom/android/server/graphics/fonts/FontManagerService$Lifecycle$1;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;Ljava/lang/String;I)I +HSPLcom/android/server/am/ActivityManagerService;->bindServiceInstance(Landroid/app/IApplicationThread;Landroid/os/IBinder;Landroid/content/Intent;Ljava/lang/String;Landroid/app/IServiceConnection;JLjava/lang/String;ZILjava/lang/String;Landroid/app/IApplicationThread;Ljava/lang/String;I)I+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->boostPriorityForLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster; HSPLcom/android/server/am/ActivityManagerService;->boostPriorityForProcLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster; -HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentLockedTraced(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/IIntentReceiver;megamorphic_types]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HPLcom/android/server/am/ActivityManagerService;->cancelIntentSender(Landroid/content/IIntentSender;)V+]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController; -HSPLcom/android/server/am/ActivityManagerService;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActivityManagerService;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastController;Lcom/android/server/am/BroadcastController; HSPLcom/android/server/am/ActivityManagerService;->checkCallingPermission(Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIIZ)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIIZ)I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/ActivityManagerService;->checkComponentPermission(Ljava/lang/String;IIIZ)I HSPLcom/android/server/am/ActivityManagerService;->checkPermission(Ljava/lang/String;II)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->checkPermissionForDevice(Ljava/lang/String;III)I -HSPLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;IZZIZZ)Z+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;I[I[I)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/HashSet;Ljava/util/HashSet;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/am/ActivityManagerService;->cleanUpApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;IZZIZZ)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ActivityManagerService;->enforceAllowedToStartOrBindServiceIfSdkSandbox(Landroid/content/Intent;)V+]Lcom/android/server/sdksandbox/SdkSandboxManagerLocal;Lcom/android/server/sdksandbox/SdkSandboxManagerService$LocalImpl; -HSPLcom/android/server/am/ActivityManagerService;->enforceBroadcastOptionPermissionsInternal(Landroid/app/BroadcastOptions;I)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions; -HSPLcom/android/server/am/ActivityManagerService;->enforceBroadcastOptionPermissionsInternal(Landroid/os/Bundle;I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->enforceNotIsolatedCaller(Ljava/lang/String;)V -HSPLcom/android/server/am/ActivityManagerService;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/ActivityManagerService;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/ActivityManagerService;->enqueuePendingTopAppIfNecessaryLocked()V -HSPLcom/android/server/am/ActivityManagerService;->enqueueUidChangeLocked(Lcom/android/server/am/UidRecord;II)V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; +HSPLcom/android/server/am/ActivityManagerService;->enqueueUidChangeLocked(Lcom/android/server/am/UidRecord;II)V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController; HSPLcom/android/server/am/ActivityManagerService;->ensureAllowedAssociations()V -HSPLcom/android/server/am/ActivityManagerService;->filterNonExportedComponents(Landroid/content/Intent;IILjava/util/List;Lcom/android/server/compat/PlatformCompat;Ljava/lang/String;Ljava/lang/String;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplicationInner(JII)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActivityManagerService;->getAppInfoForUser(Landroid/content/pm/ApplicationInfo;I)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo; -HSPLcom/android/server/am/ActivityManagerService;->getAppStartModeLOSP(ILjava/lang/String;IIZZZ)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/ActivityManagerService;->getBackgroundLaunchBroadcasts()Landroid/util/ArraySet; +HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplication(JJ)V +HSPLcom/android/server/am/ActivityManagerService;->finishAttachApplicationInner(JII)V+]Landroid/app/IApplicationThread;Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/ActivityManagerService;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastController;Lcom/android/server/am/BroadcastController;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl; +HSPLcom/android/server/am/ActivityManagerService;->getAppStartModeLOSP(ILjava/lang/String;IIZZZ)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; -HSPLcom/android/server/am/ActivityManagerService;->getCurrentUserId()I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/ActivityManagerService;->getHistoricalProcessExitReasons(Ljava/lang/String;III)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/ActivityManagerService;->getInfoForIntentSender(Landroid/content/IIntentSender;)Landroid/app/ActivityManager$PendingIntentInfo;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->getIntentSenderWithFeature(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;I)Landroid/content/IIntentSender;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->getIntentSenderWithFeatureAsApp(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;II)Landroid/content/IIntentSender;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; +HSPLcom/android/server/am/ActivityManagerService;->getIntentSenderWithFeatureAsApp(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;II)Landroid/content/IIntentSender;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/ActivityManagerService;->getMemoryTrimLevel()I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler; -HSPLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; +HPLcom/android/server/am/ActivityManagerService;->getMyMemoryState(Landroid/app/ActivityManager$RunningAppProcessInfo;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal; -HSPLcom/android/server/am/ActivityManagerService;->getPackageProcessState(Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ActivityManagerService;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ActivityManagerService;->getRealProcessStateLocked(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/ActivityManagerService;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/app/IApplicationThread;)Lcom/android/server/am/ProcessRecord;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActivityManagerService;->getRecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Landroid/app/IApplicationThread;Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ActivityManagerService;->getRunningAppProcesses()Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/am/ActivityManagerService;->getShortAction(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/server/am/ActivityManagerService;->getShortAction(Ljava/lang/String;)Ljava/lang/String; HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSender(Landroid/content/IIntentSender;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActivityManagerService;->getTopApp()Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActivityManagerService;->getUidProcessCapabilityLocked(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ActivityManagerService;->getUidState(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ActivityManagerService;->getUidStateLocked(I)I+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; +HSPLcom/android/server/am/ActivityManagerService;->getTagForIntentSenderLocked(Lcom/android/server/am/PendingIntentRecord;Ljava/lang/String;)Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/ActivityManagerService;->getTopApp()Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/ActivityManagerService;->getUidProcessCapabilityLocked(I)I +HSPLcom/android/server/am/ActivityManagerService;->getUidState(I)I +HSPLcom/android/server/am/ActivityManagerService;->getUidStateLocked(I)I HSPLcom/android/server/am/ActivityManagerService;->grantImplicitAccess(ILandroid/content/Intent;II)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->handleIncomingUser(IIIZZLjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; -HSPLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;II)Z+]Landroid/app/SyncNotedAppOp;Landroid/app/SyncNotedAppOp;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/am/ActivityManagerService;->hasUsageStatsPermission(Ljava/lang/String;II)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; HSPLcom/android/server/am/ActivityManagerService;->isAllowlistedForFgsStartLOSP(I)Lcom/android/server/am/ActivityManagerService$FgsTempAllowListItem;+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; -HSPLcom/android/server/am/ActivityManagerService;->isAppBad(Ljava/lang/String;I)Z+]Lcom/android/server/am/AppErrors;Lcom/android/server/am/AppErrors; HSPLcom/android/server/am/ActivityManagerService;->isAppStartModeDisabled(ILjava/lang/String;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; HSPLcom/android/server/am/ActivityManagerService;->isReceivingBroadcastLocked(Lcom/android/server/am/ProcessRecord;[I)Z+]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl; -HSPLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z+]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ActivityManagerService;->isUidActiveLOSP(I)Z+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/ActivityManagerService;->lambda$getPackageProcessState$0([ILjava/lang/String;Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/ActivityManagerService;->maybeSendBootCompletedLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ActivityManagerService;->noteUidProcessState(III)V+]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/stats/pull/StatsPullAtomServiceInternal;Lcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomServiceInternalImpl; -HPLcom/android/server/am/ActivityManagerService;->noteWakeupAlarm(Landroid/content/IIntentSender;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/os/WorkSource;Landroid/os/WorkSource; -HSPLcom/android/server/am/ActivityManagerService;->notifyBroadcastFinishedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message; +HSPLcom/android/server/am/ActivityManagerService;->isSingleton(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;I)Z +HSPLcom/android/server/am/ActivityManagerService;->isUidActiveLOSP(I)Z +HPLcom/android/server/am/ActivityManagerService;->lambda$checkExcessivePowerUsage$20(JJZZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActivityManagerService;->lambda$getPackageProcessState$0([ILjava/lang/String;Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActivityManagerService;->maybeSendBootCompletedLocked(Lcom/android/server/am/ProcessRecord;Z)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ActivityManagerService;->noteUidProcessState(III)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/stats/pull/StatsPullAtomServiceInternal;Lcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomServiceInternalImpl; HSPLcom/android/server/am/ActivityManagerService;->notifyPackageUse(Ljava/lang/String;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HPLcom/android/server/am/ActivityManagerService;->onProcessFreezableChangedLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/ActivityManagerService;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z -HSPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActivityManagerService;->pushTempAllowlist()V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/am/PendingTempAllowlists;Lcom/android/server/am/PendingTempAllowlists; +HSPLcom/android/server/am/ActivityManagerService;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActivityManagerService;->publishService(Landroid/os/IBinder;Landroid/content/Intent;Landroid/os/IBinder;)V+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/ActivityManagerService;->pushTempAllowlist()V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService; HSPLcom/android/server/am/ActivityManagerService;->refContentProvider(Landroid/os/IBinder;II)Z+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; -HSPLcom/android/server/am/ActivityManagerService;->registerReceiverWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;,Lcom/android/server/am/BroadcastFilter;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ReceiverList;Lcom/android/server/am/ReceiverList;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/sdksandbox/SdkSandboxManagerLocal;Lcom/android/server/sdksandbox/SdkSandboxManagerService$LocalImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;,Ljava/util/ArrayList;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HSPLcom/android/server/am/ActivityManagerService;->registerReceiverWithFeatureTraced(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HSPLcom/android/server/am/ActivityManagerService;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; -HPLcom/android/server/am/ActivityManagerService;->removeReceiverLocked(Lcom/android/server/am/ReceiverList;)V+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/IntentResolver;Lcom/android/server/am/ActivityManagerService$3;]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList;]Ljava/util/HashMap;Ljava/util/HashMap; -HPLcom/android/server/am/ActivityManagerService;->reportUidFrozenStateChanged([I[I)V+]Landroid/app/IUidFrozenStateChangedCallback;Landroid/app/ActivityManager$1;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList; +HSPLcom/android/server/am/ActivityManagerService;->registerReceiverWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;+]Lcom/android/server/am/BroadcastController;Lcom/android/server/am/BroadcastController; +HPLcom/android/server/am/ActivityManagerService;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; +HPLcom/android/server/am/ActivityManagerService;->reportUidFrozenStateChanged([I[I)V+]Landroid/app/IUidFrozenStateChangedCallback;Landroid/app/ActivityManager$1;,Landroid/app/ActivityManager$2;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList; HSPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster; HSPLcom/android/server/am/ActivityManagerService;->resetPriorityAfterProcLockedSection()V+]Lcom/android/server/ThreadPriorityBooster;Lcom/android/server/ThreadPriorityBooster; -HSPLcom/android/server/am/ActivityManagerService;->rotateBroadcastStatsIfNeededLocked()V -HPLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/app/IApplicationThread;Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I+]Landroid/content/IIntentSender;Lcom/android/server/pm/PackageManagerShellCommand$LocalIntentReceiver$1;]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord; -HSPLcom/android/server/am/ActivityManagerService;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLOSP(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/ActivityManagerService;->shouldIgnoreDeliveryGroupPolicy(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HPLcom/android/server/am/ActivityManagerService;->sendIntentSender(Landroid/app/IApplicationThread;Landroid/content/IIntentSender;Landroid/os/IBinder;ILandroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/Bundle;)I+]Landroid/content/IIntentSender;Lcom/android/server/pm/PackageManagerShellCommand$LocalIntentReceiver$1; +HSPLcom/android/server/am/ActivityManagerService;->serviceDoneExecuting(Landroid/os/IBinder;IIILandroid/content/Intent;)V +HSPLcom/android/server/am/ActivityManagerService;->setProcessTrackerStateLOSP(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ActivityManagerService;->shouldIgnoreDeliveryGroupPolicy(Ljava/lang/String;)Z HSPLcom/android/server/am/ActivityManagerService;->startAssociationLocked(ILjava/lang/String;IIJLandroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/am/ActivityManagerService$Association; -HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;I)Landroid/content/ComponentName;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;I)Landroid/content/ComponentName; +HSPLcom/android/server/am/ActivityManagerService;->startService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;ZLjava/lang/String;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)Landroid/content/ComponentName;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ActivityManagerService;->stopAssociationLocked(ILjava/lang/String;IJLandroid/content/ComponentName;Ljava/lang/String;)V HPLcom/android/server/am/ActivityManagerService;->stopService(Landroid/app/IApplicationThread;Landroid/content/Intent;Ljava/lang/String;IZILjava/lang/String;Ljava/lang/String;)I+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HPLcom/android/server/am/ActivityManagerService;->stopServiceToken(Landroid/content/ComponentName;Landroid/os/IBinder;I)Z -HSPLcom/android/server/am/ActivityManagerService;->tempAllowlistUidLocked(IJILjava/lang/String;II)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$UiHandler;]Landroid/os/Message;Landroid/os/Message;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;]Lcom/android/server/am/PendingTempAllowlists;Lcom/android/server/am/PendingTempAllowlists; -HSPLcom/android/server/am/ActivityManagerService;->traceBegin(JLjava/lang/String;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ActivityManagerService;->trimApplicationsLocked(ZI)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->unbindService(Landroid/app/IServiceConnection;)Z+]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices; -HSPLcom/android/server/am/ActivityManagerService;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/ActivityManagerService;->updateProcessForegroundLocked(Lcom/android/server/am/ProcessRecord;ZIZZ)V+]Landroid/app/ActivityManagerInternal$ForegroundServiceStateListener;Lcom/android/server/am/AppFGSTracker;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ActivityManagerService;->validateAssociationAllowedLocked(Ljava/lang/String;ILjava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService$PackageAssociationInfo;Lcom/android/server/am/ActivityManagerService$PackageAssociationInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ActivityManagerService;->verifyBroadcastLocked(Landroid/content/Intent;)Landroid/content/Intent;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/ActivityManagerService;->tempAllowlistUidLocked(IJILjava/lang/String;II)V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; +HSPLcom/android/server/am/ActivityManagerService;->traceBegin(JLjava/lang/String;Ljava/lang/String;)V +HSPLcom/android/server/am/ActivityManagerService;->trimApplicationsLocked(ZI)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActivityManagerService;->unbindService(Landroid/app/IServiceConnection;)Z +HSPLcom/android/server/am/ActivityManagerService;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V +HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/ActivityManagerService;->updateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/ActivityManagerService;->updateProcessForegroundLocked(Lcom/android/server/am/ProcessRecord;ZIZZ)V+]Landroid/app/ActivityManagerInternal$ForegroundServiceStateListener;Lcom/android/server/am/AppFGSTracker;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ActivityManagerService;->validateAssociationAllowedLocked(Ljava/lang/String;ILjava/lang/String;I)Z HSPLcom/android/server/am/AppBindRecord;->(Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/IntentBindRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)V -HSPLcom/android/server/am/AppBindServiceEventsTracker;->onBindingService(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBindServiceEventsTracker;]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; -HSPLcom/android/server/am/AppBroadcastEventsTracker;->onSendingBroadcast(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBroadcastEventsTracker;]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; +HSPLcom/android/server/am/AppBindServiceEventsTracker;->onBindingService(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; +HSPLcom/android/server/am/AppBroadcastEventsTracker;->onSendingBroadcast(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; HSPLcom/android/server/am/AppErrors;->isBadProcess(Ljava/lang/String;I)Z+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap; -HSPLcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->addInfoLocked(Landroid/util/SparseArray;Landroid/app/ApplicationExitInfo;)V+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/io/File;Ljava/io/File; -HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker; -HSPLcom/android/server/am/AppExitInfoTracker;->forEachPackageLocked(Ljava/util/function/BiFunction;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/function/BiFunction;Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda0;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda14;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda17;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda8; -HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;IIILjava/util/ArrayList;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/AppExitInfoTracker;->handleNoteProcessDiedLocked(Landroid/app/ApplicationExitInfo;)V -HSPLcom/android/server/am/AppExitInfoTracker;->lambda$getExitInfo$3(ILjava/util/ArrayList;ILjava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessaryLocked$2(ILjava/util/ArrayList;ILjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/app/ApplicationExitInfo;Landroid/app/ApplicationExitInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;Lcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;]Lcom/android/server/am/AppExitInfoTracker;Lcom/android/server/am/AppExitInfoTracker;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->addExitInfoLocked(Landroid/app/ApplicationExitInfo;)V+]Ljava/io/File;Ljava/io/File;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->getExitInfosLocked(IILjava/util/List;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/am/AppExitInfoTracker$AppExitInfoContainer;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppExitInfoTracker$KillHandler;->handleMessage(Landroid/os/Message;)V +HSPLcom/android/server/am/AppExitInfoTracker;->forEachPackageLocked(Ljava/util/function/BiFunction;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/util/function/BiFunction;Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda0;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda10;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda14;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda16;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda17;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda6;,Lcom/android/server/am/AppExitInfoTracker$$ExternalSyntheticLambda8; +HSPLcom/android/server/am/AppExitInfoTracker;->getExitInfo(Ljava/lang/String;IIILjava/util/List;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppExitInfoTracker;->lambda$getExitInfo$3(IILjava/util/List;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/AppExitInfoTracker;->lambda$updateExitInfoIfNecessaryLocked$2(II[ZLjava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Long;Ljava/lang/String;Landroid/util/SparseArray;)Ljava/lang/Integer;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/AppExitInfoTracker;->obtainRawRecord(Lcom/android/server/am/ProcessRecord;J)Landroid/app/ApplicationExitInfo;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/AppFGSTracker;->hasForegroundServices(Ljava/lang/String;I)Z+]Lcom/android/server/am/AppFGSTracker$PackageDurations;Lcom/android/server/am/AppFGSTracker$PackageDurations;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap; HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->(Lcom/android/server/am/AppPermissionTracker;ILjava/lang/String;I)V+]Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;Lcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState; HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->updateAppOps()V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/internal/app/IAppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; -HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->updatePermissionState()V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; +HPLcom/android/server/am/AppPermissionTracker$UidGrantedPermissionState;->updatePermissionState()V+]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector; HPLcom/android/server/am/AppPermissionTracker;->handlePermissionsInit()V HSPLcom/android/server/am/AppProfiler$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V -HSPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsHighWatermarkIfNecessaryLocked(IJ)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/Message;Landroid/os/Message; -HSPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsSnapshot(J)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->lambda$updateCachedAppsSnapshot$0(JLcom/android/server/am/ProcessRecord;)V +HSPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsHighWatermarkIfNecessaryLocked(IJ)V +HPLcom/android/server/am/AppProfiler$CachedAppsWatermarkData;->updateCachedAppsSnapshot(J)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/am/AppProfiler;->collectRssInBackground()V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/am/AppProfiler;->getCpuDelayTimeForPid(I)J+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker; -HPLcom/android/server/am/AppProfiler;->isProfilingPss()Z -HSPLcom/android/server/am/AppProfiler;->lambda$updateLowMemStateLSP$3(Lcom/android/server/am/ProcessRecord;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HPLcom/android/server/am/AppProfiler;->requestPssLPf(Lcom/android/server/am/ProcessProfileRecord;I)Z+]Landroid/os/Handler;Lcom/android/server/am/AppProfiler$BgHandler;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppProfiler;->lambda$updateLowMemStateLSP$3(Lcom/android/server/am/ProcessRecord;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/AppProfiler;->requestPssLPf(Lcom/android/server/am/ProcessProfileRecord;I)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/AppProfiler;->setupProfilerInfoLocked(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ActiveInstrumentation;)Landroid/app/ProfilerInfo;+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/AppProfiler$ProfileData;Lcom/android/server/am/AppProfiler$ProfileData;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/AppProfiler;->updateCpuStatsNow()V+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/BatteryStatsService;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong; +HSPLcom/android/server/am/AppProfiler;->updateCpuStatsNow()V+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/am/AppProfiler;->updateLowMemStateLSP(IIIJ)V+]Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/am/AppProfiler;->updateNextPssTimeLPf(ILcom/android/server/am/ProcessProfileRecord;JZ)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/am/AppRestrictionController$BgHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController$RestrictionSettings;Lcom/android/server/am/AppRestrictionController$RestrictionSettings;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; +HSPLcom/android/server/am/AppProfiler;->updateNextPssTimeLPf(ILcom/android/server/am/ProcessProfileRecord;JZ)V+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +HSPLcom/android/server/am/AppRestrictionController$BgHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector; +HSPLcom/android/server/am/AppRestrictionController$Injector;->getActivityManagerService()Lcom/android/server/am/ActivityManagerService; +HSPLcom/android/server/am/AppRestrictionController$Injector;->getAppFGSTracker()Lcom/android/server/am/AppFGSTracker; HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;->update(III)I -HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->forEachPackageInUidLocked(ILcom/android/internal/util/function/TriConsumer;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/internal/util/function/TriConsumer;Lcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda3; -HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->getRestrictionLevel(I)I+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings;Lcom/android/server/am/AppRestrictionController$RestrictionSettings$PkgSettings; +HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->getRestrictionLevel(I)I+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; HSPLcom/android/server/am/AppRestrictionController$RestrictionSettings;->loadOneFromXml(Lcom/android/modules/utils/TypedXmlPullParser;J[JZ)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/am/AppRestrictionController;->applyRestrictionLevel(Ljava/lang/String;IILcom/android/server/am/AppRestrictionController$TrackerInfo;IZII)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/am/AppRestrictionController;->calcAppRestrictionLevel(IILjava/lang/String;IZZ)Landroid/util/Pair;+]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/apphibernation/AppHibernationManagerInternal;Lcom/android/server/apphibernation/AppHibernationService$LocalService; -HSPLcom/android/server/am/AppRestrictionController;->getBackgroundRestrictionExemptionReason(I)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; -HSPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(I)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; -HPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(ILjava/lang/String;)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Ljava/util/Set;Ljava/util/Collections$EmptySet; -HPLcom/android/server/am/AppRestrictionController;->getPotentialUserAllowedExemptionReason(ILjava/lang/String;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; -HSPLcom/android/server/am/AppRestrictionController;->isBgAutoRestrictedBucketFeatureFlagEnabled()Z -HPLcom/android/server/am/AppRestrictionController;->isCarrierApp(Ljava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/am/AppRestrictionController;->isOnSystemDeviceIdleAllowlist(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HPLcom/android/server/am/AppRestrictionController;->isRoleHeldByUid(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/AppRestrictionController;->isSystemModule(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Ljava/io/File;Ljava/io/File;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/HashMap;Ljava/util/HashMap; -HSPLcom/android/server/am/AppRestrictionController;->refreshAppRestrictionLevelForUser(III)V +HSPLcom/android/server/am/AppRestrictionController;->getBackgroundRestrictionExemptionReason(I)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector; +HSPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(I)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HSPLcom/android/server/am/AppRestrictionController;->getPotentialSystemExemptionReason(ILjava/lang/String;)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Ljava/util/Set;Ljava/util/Collections$EmptySet; +HSPLcom/android/server/am/AppRestrictionController;->getPotentialUserAllowedExemptionReason(ILjava/lang/String;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector; +HSPLcom/android/server/am/AppRestrictionController;->isCarrierApp(Ljava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; +HSPLcom/android/server/am/AppRestrictionController;->isOnDeviceIdleAllowlist(I)Z +HSPLcom/android/server/am/AppRestrictionController;->isOnSystemDeviceIdleAllowlist(I)Z +HSPLcom/android/server/am/AppRestrictionController;->isSystemModule(Ljava/lang/String;)Z+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/am/AppRestrictionController$Injector;Lcom/android/server/am/AppRestrictionController$Injector;]Ljava/io/File;Ljava/io/File;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/AppStartInfoTracker$AppStartInfoContainer;->addStartInfoLocked(Landroid/app/ApplicationStartInfo;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppStartInfoTracker$AppStartInfoContainer;->addTimestampToStartLocked(IJ)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/AppStartInfoTracker$AppStartInfoContainer;->isAddTimestampAllowed(Landroid/app/ApplicationStartInfo;IJ)Z +HPLcom/android/server/am/AppStartInfoTracker$AppStartInfoContainer;->writeToProto(Landroid/util/proto/ProtoOutputStream;J)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/AppStartInfoTracker;->addBaseFieldsFromProcessRecord(Landroid/app/ApplicationStartInfo;Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/AppStartInfoTracker;->addStartInfoLocked(Landroid/app/ApplicationStartInfo;)Landroid/app/ApplicationStartInfo;+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap; +HSPLcom/android/server/am/AppStartInfoTracker;->addTimestampToStart(Ljava/lang/String;IJI)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap; +HSPLcom/android/server/am/ApplicationThreadDeferred;->(Landroid/app/IApplicationThread;Z)V +HSPLcom/android/server/am/ApplicationThreadDeferred;->asBinder()Landroid/os/IBinder;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy; HSPLcom/android/server/am/BaseAppStateEventsTracker$BaseAppStateEventsPolicy;->getMaxTrackingDuration()J -HSPLcom/android/server/am/BaseAppStateEventsTracker;->isUidOnTop(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/BaseAppStateEventsTracker;->isUidOnTop(I)Z HSPLcom/android/server/am/BaseAppStatePolicy;->isEnabled()Z -HSPLcom/android/server/am/BaseAppStatePolicy;->shouldExemptUid(I)I+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController; -HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->addEvent(JI)V+]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/LinkedList;Ljava/util/LinkedList; -HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getTotalEventsSince(JJI)I+]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Iterator;Ljava/util/LinkedList$DescendingIterator;]Ljava/util/LinkedList;Ljava/util/LinkedList; -HPLcom/android/server/am/BaseAppStateTimeSlotEvents;->trimEvents(JI)V+]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/LinkedList;Ljava/util/LinkedList; -HPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->getNumOfEventsThreshold()I -HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->shouldExempt(Ljava/lang/String;I)I+]Lcom/android/server/am/AppRestrictionController;Lcom/android/server/am/AppRestrictionController;]Lcom/android/server/am/BaseAppStateEventsTracker;Lcom/android/server/am/AppBindServiceEventsTracker;,Lcom/android/server/am/AppBroadcastEventsTracker;]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;,Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy; +HSPLcom/android/server/am/BaseAppStatePolicy;->shouldExemptUid(I)I +HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->addEvent(JI)V+]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/LinkedList;Ljava/util/LinkedList; +HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->getTotalEventsSince(JJI)I+]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/Iterator;Ljava/util/LinkedList$DescendingIterator;]Ljava/util/LinkedList;Ljava/util/LinkedList; +HSPLcom/android/server/am/BaseAppStateTimeSlotEvents;->trimEvents(JI)V+]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Ljava/util/LinkedList;Ljava/util/LinkedList; +HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->getNumOfEventsThreshold()I +HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;->shouldExempt(Ljava/lang/String;I)I+]Lcom/android/server/am/BaseAppStateEventsTracker;Lcom/android/server/am/AppBindServiceEventsTracker;,Lcom/android/server/am/AppBroadcastEventsTracker;]Lcom/android/server/am/BaseAppStatePolicy;Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;,Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy; HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker;Lcom/android/server/am/AppBindServiceEventsTracker;,Lcom/android/server/am/AppBroadcastEventsTracker; HSPLcom/android/server/am/BaseAppStateTimeSlotEventsTracker;->handleNewEvent(Ljava/lang/String;I)V+]Lcom/android/server/am/BaseAppStateEvents$Factory;Lcom/android/server/am/AppBindServiceEventsTracker;,Lcom/android/server/am/AppBroadcastEventsTracker;]Lcom/android/server/am/BaseAppStateEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/BaseAppStateTimeSlotEvents;Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents;]Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy;Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy;,Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy;]Lcom/android/server/am/BaseAppStateTracker$Injector;Lcom/android/server/am/BaseAppStateTracker$Injector;]Lcom/android/server/am/UidProcessMap;Lcom/android/server/am/UidProcessMap; +HSPLcom/android/server/am/BaseAppStateTracker$Injector;->getPolicy()Lcom/android/server/am/BaseAppStatePolicy; HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda11;->(Lcom/android/server/am/BatteryStatsService;IIIIIIIIJJJJ)V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda11;->run()V -HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda19;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda19;->run()V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda1;->(Lcom/android/server/am/BatteryStatsService;IILjava/lang/String;Ljava/lang/String;IZJJ)V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda1;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda20;->(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda20;->run()V -HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda32;->(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda32;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda35;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;->(Lcom/android/server/am/BatteryStatsService;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda38;->run()V -HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda5;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V -HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda5;->run()V -HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda61;->(Lcom/android/server/am/BatteryStatsService;Ljava/lang/String;Landroid/os/WorkSource;IJJ)V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda37;->run()V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda5;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda5;->run()V HPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda61;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda76;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;IJJ)V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda67;->run()V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda76;->run()V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda79;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda96;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda96;->run()V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda98;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V -HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda98;->run()V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda97;->(Lcom/android/server/am/BatteryStatsService;ILjava/lang/String;Ljava/lang/String;JJ)V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda97;->run()V +HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda99;->run()V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda9;->(Lcom/android/server/am/BatteryStatsService;IILjava/lang/String;Ljava/lang/String;IJJ)V HSPLcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda9;->run()V +HPLcom/android/server/am/BatteryStatsService$StatsPerUidLogger;->addStatsForPowerComponent(Ljava/util/List;Lcom/android/server/am/BatteryStatsService$StatsPerUidLogger$SessionInfo;IIFJLandroid/os/BatteryConsumer;I)Z+]Landroid/os/BatteryConsumer;Landroid/os/AggregateBatteryConsumer;,Landroid/os/UidBatteryConsumer; +HPLcom/android/server/am/BatteryStatsService$StatsPerUidLogger;->logStats(Landroid/os/BatteryUsageStats;Ljava/util/List;)I+]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->run()V -HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;+]Ljava/nio/ByteBuffer;Ljava/nio/DirectByteBuffer;]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer;]Ljava/nio/charset/CharsetDecoder;Lcom/android/icu/charset/CharsetDecoderICU; -HPLcom/android/server/am/BatteryStatsService;->awaitCompletion()V+]Landroid/os/Handler;Landroid/os/Handler;]Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/CountDownLatch; -HSPLcom/android/server/am/BatteryStatsService;->fillLowPowerStats(Lcom/android/internal/os/RpmStats;)V+]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Lcom/android/internal/os/RpmStats$PowerStateSubsystem;Lcom/android/internal/os/RpmStats$PowerStateSubsystem;]Lcom/android/internal/os/RpmStats;Lcom/android/internal/os/RpmStats;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartLaunch$105(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStartRunning$103(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteServiceStopLaunch$106(ILjava/lang/String;Ljava/lang/String;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelock$23(IILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStartWakelockFromSource$25(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelock$24(IILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteStopWakelockFromSource$27(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/am/BatteryStatsService;->lambda$noteUidProcessState$13(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats;Lcom/android/server/power/stats/wakeups/CpuWakeupStats; +HSPLcom/android/server/am/BatteryStatsService$WakeupReasonThread;->waitWakeup()Ljava/lang/String;+]Ljava/nio/ByteBuffer;Ljava/nio/DirectByteBuffer;]Ljava/nio/CharBuffer;Ljava/nio/HeapCharBuffer; +HSPLcom/android/server/am/BatteryStatsService;->fillLowPowerStats(Lcom/android/internal/os/RpmStats;)V+]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Lcom/android/internal/os/RpmStats$PowerStateSubsystem;Lcom/android/internal/os/RpmStats$PowerStateSubsystem;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; HPLcom/android/server/am/BatteryStatsService;->monitor()V -HPLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/Handler;Landroid/os/Handler; +HPLcom/android/server/am/BatteryStatsService;->noteAlarmFinish(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl; +HPLcom/android/server/am/BatteryStatsService;->noteAlarmStart(Ljava/lang/String;Landroid/os/WorkSource;I)V+]Landroid/content/Context;Landroid/app/ContextImpl; HPLcom/android/server/am/BatteryStatsService;->noteChangeWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V HSPLcom/android/server/am/BatteryStatsService;->noteEvent(ILjava/lang/String;I)V -HPLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;II)V +HSPLcom/android/server/am/BatteryStatsService;->noteJobFinish(Ljava/lang/String;II)V HSPLcom/android/server/am/BatteryStatsService;->noteJobStart(Ljava/lang/String;I)V -HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartLaunch(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartRunning(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteServiceStopLaunch(ILjava/lang/String;Ljava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler; +HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartLaunch(ILjava/lang/String;Ljava/lang/String;)V +HSPLcom/android/server/am/BatteryStatsService;->noteServiceStartRunning(ILjava/lang/String;Ljava/lang/String;)V +HSPLcom/android/server/am/BatteryStatsService;->noteServiceStopLaunch(ILjava/lang/String;Ljava/lang/String;)V HPLcom/android/server/am/BatteryStatsService;->noteServiceStopRunning(ILjava/lang/String;Ljava/lang/String;)V -HSPLcom/android/server/am/BatteryStatsService;->noteStartSensor(II)V -HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelock(IILjava/lang/String;Ljava/lang/String;IZ)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteStopSensor(II)V -HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelock(IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BatteryStatsService;->noteUidProcessState(II)V+]Landroid/os/Handler;Landroid/os/Handler; +HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelock(IILjava/lang/String;Ljava/lang/String;IZ)V +HSPLcom/android/server/am/BatteryStatsService;->noteStartWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V +HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelock(IILjava/lang/String;Ljava/lang/String;I)V +HSPLcom/android/server/am/BatteryStatsService;->noteStopWakelockFromSource(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;I)V +HSPLcom/android/server/am/BatteryStatsService;->noteUidProcessState(II)V HPLcom/android/server/am/BatteryStatsService;->noteWakupAlarm(Ljava/lang/String;ILandroid/os/WorkSource;Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/am/BatteryStatsService;->setBatteryState(IIIIIIIIJ)V+]Landroid/os/Handler;Landroid/os/Handler; +HSPLcom/android/server/am/BatteryStatsService;->setBatteryState(IIIIIIIIJ)V +HSPLcom/android/server/am/BroadcastController$1;->allowFilterResult(Lcom/android/server/am/BroadcastFilter;Ljava/util/List;)Z+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastController$1;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/am/BroadcastController$1;Lcom/android/server/am/BroadcastController$1; +HSPLcom/android/server/am/BroadcastController$1;->getIntentFilter(Lcom/android/server/am/BroadcastFilter;)Landroid/content/IntentFilter; +HSPLcom/android/server/am/BroadcastController$1;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/am/BroadcastController$1;Lcom/android/server/am/BroadcastController$1; +HSPLcom/android/server/am/BroadcastController$1;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/am/BroadcastFilter;)Z +HSPLcom/android/server/am/BroadcastController$1;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/am/BroadcastController$1;Lcom/android/server/am/BroadcastController$1; +HSPLcom/android/server/am/BroadcastController$1;->newResult(Lcom/android/server/pm/Computer;Lcom/android/server/am/BroadcastFilter;IIJ)Lcom/android/server/am/BroadcastFilter; +HSPLcom/android/server/am/BroadcastController$1;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/am/BroadcastController$1;Lcom/android/server/am/BroadcastController$1; +HSPLcom/android/server/am/BroadcastController$StickyBroadcast;->create(Landroid/content/Intent;ZIILjava/lang/String;)Lcom/android/server/am/BroadcastController$StickyBroadcast; +HSPLcom/android/server/am/BroadcastController;->broadcastIntentLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;)I +HSPLcom/android/server/am/BroadcastController;->broadcastIntentLockedTraced(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;ZZIIIIILandroid/app/BackgroundStartPrivileges;[ILjava/util/function/BiFunction;Lcom/android/server/am/BroadcastSentEventRecord;)I+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/IIntentReceiver;megamorphic_types]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/net/Uri;Landroid/net/Uri$OpaqueUri;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/IntentResolver;Lcom/android/server/am/BroadcastController$1;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastController;->broadcastIntentWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/os/Bundle;ZZI)I+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastController;Lcom/android/server/am/BroadcastController; +HSPLcom/android/server/am/BroadcastController;->checkBroadcastFromSystem(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;IZLjava/util/List;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastController;->collectReceiverComponents(Landroid/content/Intent;Ljava/lang/String;II[I[I)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/am/BroadcastController;->enforceBroadcastOptionPermissionsInternal(Landroid/os/Bundle;I)V +HSPLcom/android/server/am/BroadcastController;->finishReceiver(Landroid/os/IBinder;ILjava/lang/String;Landroid/os/Bundle;ZI)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl; +HSPLcom/android/server/am/BroadcastController;->getBackgroundLaunchBroadcasts()Landroid/util/ArraySet; +HSPLcom/android/server/am/BroadcastController;->getRealProcessStateLocked(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastController;->getRealUidStateLocked(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastController;->isInstantApp(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/am/BroadcastController;->notifyBroadcastFinishedLocked(Lcom/android/server/am/BroadcastRecord;)V +HSPLcom/android/server/am/BroadcastController;->registerReceiverWithFeature(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent; +HSPLcom/android/server/am/BroadcastController;->registerReceiverWithFeatureTraced(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;Ljava/lang/String;II)Landroid/content/Intent;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/IntentResolver;Lcom/android/server/am/BroadcastController$1;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; +HPLcom/android/server/am/BroadcastController;->removeReceiverLocked(Lcom/android/server/am/ReceiverList;)V+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/IntentResolver;Lcom/android/server/am/BroadcastController$1;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/BroadcastController;->rotateBroadcastStatsIfNeededLocked()V +HSPLcom/android/server/am/BroadcastController;->traceBroadcastIntentBegin(Landroid/content/Intent;Landroid/content/IIntentReceiver;ZZIII)I+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/BroadcastController;->traceBroadcastIntentEnd(I)V +HSPLcom/android/server/am/BroadcastController;->traceRegistrationBegin(Ljava/lang/String;Landroid/content/IIntentReceiver;Landroid/content/IntentFilter;I)V+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy; +HPLcom/android/server/am/BroadcastController;->traceUnregistrationBegin(Landroid/content/IIntentReceiver;)V+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy; +HPLcom/android/server/am/BroadcastController;->unregisterReceiverTraced(Landroid/content/IIntentReceiver;)V+]Landroid/content/IIntentReceiver;Landroid/app/LoadedApk$ReceiverDispatcher$InnerReceiver;,Landroid/content/IIntentReceiver$Stub$Proxy;]Lcom/android/server/am/BroadcastController;Lcom/android/server/am/BroadcastController;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/BroadcastController;->verifyBroadcastLocked(Landroid/content/Intent;)Landroid/content/Intent;+]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/BroadcastFilter;->(Landroid/content/IntentFilter;Lcom/android/server/am/ReceiverList;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IIZZZ)V -HSPLcom/android/server/am/BroadcastHistory;->addBroadcastToHistoryLocked(Lcom/android/server/am/BroadcastRecord;)V+]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; +HSPLcom/android/server/am/BroadcastHistory;->addBroadcastToHistoryLocked(Lcom/android/server/am/BroadcastRecord;)V HSPLcom/android/server/am/BroadcastHistory;->onBroadcastEnqueuedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/BroadcastHistory;->onBroadcastFinishedLocked(Lcom/android/server/am/BroadcastRecord;)V+]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastLoopers;->addMyLooper()V+]Landroid/os/Looper;Landroid/os/Looper;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/BroadcastLoopers;->addMyLooper()V HSPLcom/android/server/am/BroadcastProcessQueue;->(Lcom/android/server/am/BroadcastConstants;Ljava/lang/String;I)V -HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked(Ljava/util/ArrayDeque;)V+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DescendingIterator; -HSPLcom/android/server/am/BroadcastProcessQueue;->enqueueOrReplaceBroadcast(Lcom/android/server/am/BroadcastRecord;ILcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;)Lcom/android/server/am/BroadcastRecord;+]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/am/BroadcastProcessQueue;->forEachMatchingBroadcast(Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->forEachMatchingBroadcastInQueue(Ljava/util/ArrayDeque;Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;megamorphic_types]Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;megamorphic_types]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DeqIterator; +HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; +HSPLcom/android/server/am/BroadcastProcessQueue;->assertHealthLocked(Ljava/util/ArrayDeque;)V+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DescendingIterator; +HSPLcom/android/server/am/BroadcastProcessQueue;->enqueueOrReplaceBroadcast(Lcom/android/server/am/BroadcastRecord;ILcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;)Lcom/android/server/am/BroadcastRecord;+]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/am/BroadcastProcessQueue;->forEachMatchingBroadcast(Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z +HSPLcom/android/server/am/BroadcastProcessQueue;->forEachMatchingBroadcastInQueue(Ljava/util/ArrayDeque;Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda13;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda16;]Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;megamorphic_types]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DeqIterator; HSPLcom/android/server/am/BroadcastProcessQueue;->getActive()Lcom/android/server/am/BroadcastRecord; HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveCountSinceIdle()I +HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveFirstLaunch()Z HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveIndex()I HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveViaColdStart()Z HSPLcom/android/server/am/BroadcastProcessQueue;->getActiveWasStopped()Z -HSPLcom/android/server/am/BroadcastProcessQueue;->getPreferredSchedulingGroupLocked()I+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->getQueueForBroadcast(Lcom/android/server/am/BroadcastRecord;)Ljava/util/ArrayDeque;+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; +HSPLcom/android/server/am/BroadcastProcessQueue;->getPreferredSchedulingGroupLocked()I +HSPLcom/android/server/am/BroadcastProcessQueue;->getQueueForBroadcast(Lcom/android/server/am/BroadcastRecord;)Ljava/util/ArrayDeque; HSPLcom/android/server/am/BroadcastProcessQueue;->getRunnableAt()J+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->insertIntoRunnableList(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;)Lcom/android/server/am/BroadcastProcessQueue;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->invalidateRunnableAt()V @@ -637,96 +626,98 @@ HSPLcom/android/server/am/BroadcastProcessQueue;->isActive()Z HSPLcom/android/server/am/BroadcastProcessQueue;->isEmpty()Z+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; HSPLcom/android/server/am/BroadcastProcessQueue;->isPendingManifest()Z HSPLcom/android/server/am/BroadcastProcessQueue;->isProcessWarm()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/BroadcastProcessQueue;->isQueueEmpty(Ljava/util/ArrayDeque;)Z+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; HSPLcom/android/server/am/BroadcastProcessQueue;->isRunnable()Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveIdle()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveNextPending()V+]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; -HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastDequeued(Lcom/android/server/am/BroadcastRecord;I)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastEnqueued(Lcom/android/server/am/BroadcastRecord;I)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastProcessQueue;->makeActiveNextPending()V +HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastDequeued(Lcom/android/server/am/BroadcastRecord;I)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastProcessQueue;->onBroadcastEnqueued(Lcom/android/server/am/BroadcastRecord;I)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/am/BroadcastProcessQueue;->peekNextBroadcast()Lcom/android/internal/os/SomeArgs;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HPLcom/android/server/am/BroadcastProcessQueue;->peekNextBroadcastRecord()Lcom/android/server/am/BroadcastRecord;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/am/BroadcastProcessQueue;->queueForNextBroadcast()Ljava/util/ArrayDeque;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->queueForNextBroadcast(Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;II)Ljava/util/ArrayDeque;+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/am/BroadcastProcessQueue;->queueForNextBroadcast()Ljava/util/ArrayDeque; +HSPLcom/android/server/am/BroadcastProcessQueue;->queueForNextBroadcast(Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;II)Ljava/util/ArrayDeque;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; HSPLcom/android/server/am/BroadcastProcessQueue;->removeFromRunnableList(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;)Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->removeNextBroadcast()Lcom/android/internal/os/SomeArgs;+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/am/BroadcastProcessQueue;->setProcessAndUidState(Lcom/android/server/am/ProcessRecord;ZZ)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastProcessQueue;->setActiveFirstLaunch(Z)V +HSPLcom/android/server/am/BroadcastProcessQueue;->setActiveWasStopped(Z)V +HSPLcom/android/server/am/BroadcastProcessQueue;->setProcessAndUidState(Lcom/android/server/am/ProcessRecord;ZZ)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/BroadcastProcessQueue;->setTimeoutScheduled(Z)V HSPLcom/android/server/am/BroadcastProcessQueue;->shouldBeDeferred()Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->timeoutScheduled()Z -HSPLcom/android/server/am/BroadcastProcessQueue;->toShortString()Ljava/lang/String;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveBegin()V+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/BroadcastProcessQueue;->toShortString()Ljava/lang/String;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveBegin()V+]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->traceActiveEnd()V+]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessEnd()V+]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessRunningBegin()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/BroadcastProcessQueue;->traceProcessRunningBegin()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/lang/Object;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastProcessQueue;->updateDeferredStates(Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastProcessQueue;->updateRunnableAt()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/am/BroadcastQueue;->traceBegin(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/am/BroadcastProcessQueue;->updateRunnableAt()V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/am/BroadcastQueue;->traceBegin(Ljava/lang/String;)I HSPLcom/android/server/am/BroadcastQueue;->traceEnd(I)V HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda12;->handleMessage(Landroid/os/Message;)Z HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda19;->test(Lcom/android/server/am/BroadcastRecord;I)Z HSPLcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6;->test(Ljava/lang/Object;)Z -HSPLcom/android/server/am/BroadcastQueueModernImpl;->applyDeliveryGroupPolicy(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->assertHealthLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->applyDeliveryGroupPolicy(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->assertHealthLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastQueueModernImpl;->cancelDeliveryTimeoutLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer; HSPLcom/android/server/am/BroadcastQueueModernImpl;->checkAndRemoveWaitingFor()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->checkPendingColdStartValidityLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->demoteFromRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->dispatchReceivers(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastRecord;I)Z+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/SameProcessApplicationThread;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueUpdateRunningList()V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverActiveLocked(Lcom/android/server/am/BroadcastProcessQueue;ILjava/lang/String;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverLocked(Lcom/android/server/am/ProcessRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->forEachMatchingBroadcast(Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda2;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda5;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->getOrCreateProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->checkPendingColdStartValidityLocked()V +HSPLcom/android/server/am/BroadcastQueueModernImpl;->demoteFromRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->dispatchReceivers(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastRecord;I)Z+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;,Lcom/android/server/am/SameProcessApplicationThread;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueBroadcastLocked(Lcom/android/server/am/BroadcastRecord;)V+]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->enqueueUpdateRunningList()V +HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverActiveLocked(Lcom/android/server/am/BroadcastProcessQueue;ILjava/lang/String;)V+]Lcom/android/internal/os/TimeoutRecord;Lcom/android/internal/os/TimeoutRecord;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->finishReceiverLocked(Lcom/android/server/am/ProcessRecord;ILjava/lang/String;Landroid/os/Bundle;ZZ)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->forEachMatchingBroadcast(Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate;Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Z)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/function/Predicate;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda2;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda5;,Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->getOrCreateProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/BroadcastQueueModernImpl;->getPreferredSchedulingGroupLocked(Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/BroadcastQueueModernImpl;->getProcessQueue(Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/BroadcastProcessQueue;+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/BroadcastQueueModernImpl;->getProcessQueue(Ljava/lang/String;I)Lcom/android/server/am/BroadcastProcessQueue;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRecordsLookupCache()Landroid/util/ArrayMap; HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningIndexOf(Lcom/android/server/am/BroadcastProcessQueue;)I HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningSize()I -HSPLcom/android/server/am/BroadcastQueueModernImpl;->handleProcessFreezableChanged(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->getRunningUrgentCount()I+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; +HPLcom/android/server/am/BroadcastQueueModernImpl;->handleProcessFreezableChanged(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/BroadcastQueueModernImpl;->isPendingColdStartValid()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->isProcessFreezable(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$applyDeliveryGroupPolicy$3(Lcom/android/server/am/BroadcastRecord;Landroid/util/ArrayMap;Lcom/android/server/am/BroadcastRecord;I)Z+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->isProcessFreezable(Lcom/android/server/am/ProcessRecord;)Z +HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$applyDeliveryGroupPolicy$3(Lcom/android/server/am/BroadcastRecord;Landroid/util/ArrayMap;Lcom/android/server/am/BroadcastRecord;I)Z+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/BroadcastQueueModernImpl;->logBootCompletedBroadcastCompletionLatencyIfPossible(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->logBroadcastDeliveryEventReported(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishBroadcast(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->logBroadcastDeliveryEventReported(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishBroadcast(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/BroadcastHistory;Lcom/android/server/am/BroadcastHistory;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyFinishReceiver(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;)V+]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleRegisteredReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;)V+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStartedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessReceiverRecord;Lcom/android/server/am/ProcessReceiverRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyScheduleRegisteredReceiver(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;)V +HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStartedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/BroadcastQueueModernImpl;->notifyStoppedRunning(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->onProcessFreezableChangedLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->promoteToRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/am/BroadcastQueueModernImpl;->onProcessFreezableChangedLocked(Lcom/android/server/am/ProcessRecord;)V +HSPLcom/android/server/am/BroadcastQueueModernImpl;->promoteToRunningLocked(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; HSPLcom/android/server/am/BroadcastQueueModernImpl;->reportUsageStatsBroadcastDispatched(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverColdLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverWarmLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleResultTo(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/SameProcessApplicationThread;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->setDeliveryState(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;ILjava/lang/String;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverColdLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleReceiverWarmLocked(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->scheduleResultTo(Lcom/android/server/am/BroadcastRecord;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;,Lcom/android/server/am/SameProcessApplicationThread;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->setDeliveryState(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/BroadcastRecord;ILjava/lang/Object;ILjava/lang/String;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/am/BroadcastQueueModernImpl;->setQueueProcess(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/BroadcastQueueModernImpl;->shouldRetire(Lcom/android/server/am/BroadcastProcessQueue;)Z+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->shouldSkipReceiver(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastRecord;I)Ljava/lang/String;+]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->skipAndCancelReplacedBroadcasts(Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->startDeliveryTimeoutLocked(Lcom/android/server/am/BroadcastProcessQueue;I)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->shouldSkipReceiver(Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastRecord;I)Ljava/lang/String;+]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->skipAndCancelReplacedBroadcasts(Landroid/util/ArraySet;)V+]Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer;Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->startDeliveryTimeoutLocked(Lcom/android/server/am/BroadcastProcessQueue;I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer; HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunnableList(Lcom/android/server/am/BroadcastProcessQueue;)V+]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunningList()V -HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunningListLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateWarmProcess(Lcom/android/server/am/BroadcastProcessQueue;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateRunningListLocked()V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/BroadcastQueueModernImpl;->updateWarmProcess(Lcom/android/server/am/BroadcastProcessQueue;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/am/BroadcastProcessQueue;Lcom/android/server/am/BroadcastProcessQueue;]Lcom/android/server/am/BroadcastQueueModernImpl;Lcom/android/server/am/BroadcastQueueModernImpl; HSPLcom/android/server/am/BroadcastRecord;->(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZIILandroid/app/BackgroundStartPrivileges;ZLjava/util/function/BiFunction;I)V+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/am/BroadcastRecord;->(Lcom/android/server/am/BroadcastQueue;Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;[Ljava/lang/String;[Ljava/lang/String;[Ljava/lang/String;ILandroid/app/BroadcastOptions;Ljava/util/List;Lcom/android/server/am/ProcessRecord;Landroid/content/IIntentReceiver;ILjava/lang/String;Landroid/os/Bundle;ZZZILandroid/app/BackgroundStartPrivileges;ZLjava/util/function/BiFunction;I)V HSPLcom/android/server/am/BroadcastRecord;->(Lcom/android/server/am/BroadcastRecord;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/BroadcastRecord;->applySingletonPolicy(Lcom/android/server/am/ActivityManagerService;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; HSPLcom/android/server/am/BroadcastRecord;->calculateBlockedUntilBeyondCount(Ljava/util/List;Z)[I+]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; HSPLcom/android/server/am/BroadcastRecord;->calculateDeferUntilActive(ILandroid/app/BroadcastOptions;Landroid/content/IIntentReceiver;ZZ)Z+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions; -HSPLcom/android/server/am/BroadcastRecord;->calculateTypeForLogging()I+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; +HSPLcom/android/server/am/BroadcastRecord;->calculateTypeForLogging()I +HSPLcom/android/server/am/BroadcastRecord;->calculateTypesForLogging()[I HSPLcom/android/server/am/BroadcastRecord;->calculateUrgent(Landroid/content/Intent;Landroid/app/BroadcastOptions;)Z+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/BroadcastRecord;->getDeliveryGroupMatchingKeyFragment(Lcom/android/server/am/BroadcastRecord;)Ljava/lang/String;+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions; HSPLcom/android/server/am/BroadcastRecord;->getDeliveryGroupMatchingNamespaceFragment(Lcom/android/server/am/BroadcastRecord;)Ljava/lang/String;+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions; HSPLcom/android/server/am/BroadcastRecord;->getDeliveryGroupPolicy()I+]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions; HSPLcom/android/server/am/BroadcastRecord;->getDeliveryState(I)I HSPLcom/android/server/am/BroadcastRecord;->getReceiverIntent(Ljava/lang/Object;)Landroid/content/Intent;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Ljava/util/function/BiFunction;Lcom/android/server/om/OverlayManagerService$$ExternalSyntheticLambda4;,Lcom/android/server/pm/BroadcastHelper$$ExternalSyntheticLambda8; -HSPLcom/android/server/am/BroadcastRecord;->getReceiverPriority(Ljava/lang/Object;)I+]Landroid/content/IntentFilter;Lcom/android/server/am/BroadcastFilter; +HSPLcom/android/server/am/BroadcastRecord;->getReceiverPriority(Ljava/lang/Object;)I HSPLcom/android/server/am/BroadcastRecord;->getReceiverProcessName(Ljava/lang/Object;)Ljava/lang/String; HSPLcom/android/server/am/BroadcastRecord;->getReceiverUid(Ljava/lang/Object;)I HSPLcom/android/server/am/BroadcastRecord;->isAssumedDelivered(I)Z+]Ljava/util/List;Ljava/util/ArrayList; @@ -740,264 +731,298 @@ HSPLcom/android/server/am/BroadcastRecord;->isReplacePending()Z+]Landroid/conten HSPLcom/android/server/am/BroadcastRecord;->isUrgent()Z HSPLcom/android/server/am/BroadcastRecord;->matchesDeliveryGroup(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;)Z+]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/BroadcastRecord;->maybeStripForHistory()Lcom/android/server/am/BroadcastRecord;+]Landroid/content/Intent;Landroid/content/Intent; -HSPLcom/android/server/am/BroadcastRecord;->setDeliveryState(IILjava/lang/String;)Z+]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord; -HSPLcom/android/server/am/BroadcastRecord;->toShortString()Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/BroadcastRecord;->toString()Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/BroadcastRecord;->setDeliveryState(IILjava/lang/String;)Z +HSPLcom/android/server/am/BroadcastRecord;->toShortString()Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/BroadcastRecord;->toString()Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/BroadcastSentEventRecord;->calculateTypesForLogging()[I +HSPLcom/android/server/am/BroadcastSentEventRecord;->logToStatsd()V+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$ListN; HSPLcom/android/server/am/BroadcastSkipPolicy;->createAttributionSourcesForResolveInfo(Landroid/content/pm/ResolveInfo;)[Landroid/content/AttributionSource; HSPLcom/android/server/am/BroadcastSkipPolicy;->disallowBackgroundStart(Lcom/android/server/am/BroadcastRecord;)Z+]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/BroadcastSkipPolicy;->requestStartTargetPermissionsReviewIfNeededLocked(Lcom/android/server/am/BroadcastRecord;Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Ljava/lang/Object;)Ljava/lang/String;+]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy; -HSPLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->freezeProcess(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Random;Ljava/util/Random; -HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/ProcLocksReader;Lcom/android/internal/os/ProcLocksReader;]Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Landroid/content/pm/ResolveInfo;)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastSkipPolicy;Lcom/android/server/am/BroadcastSkipPolicy;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall; +HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Lcom/android/server/am/BroadcastFilter;)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/BroadcastQueue;Lcom/android/server/am/BroadcastQueueModernImpl;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall; +HSPLcom/android/server/am/BroadcastSkipPolicy;->shouldSkipMessage(Lcom/android/server/am/BroadcastRecord;Ljava/lang/Object;)Ljava/lang/String; +HSPLcom/android/server/am/BroadcastStats;->addBroadcast(Ljava/lang/String;Ljava/lang/String;IIJ)V +HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->freezeProcess(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/Freezer;Lcom/android/server/am/Freezer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/Random;Ljava/util/Random; +HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/ProcLocksReader;Lcom/android/internal/os/ProcLocksReader; HPLcom/android/server/am/CachedAppOptimizer$FreezeHandler;->reportUnfreeze(Lcom/android/server/am/ProcessRecord;IILjava/lang/String;I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/Random;Ljava/util/Random; -HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats;Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats;,Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats;]Lcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;Lcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;]Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies;Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;]Lcom/android/server/am/CachedAppOptimizer$SingleCompactionStats;Lcom/android/server/am/CachedAppOptimizer$SingleCompactionStats;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Enum;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;,Lcom/android/server/am/CachedAppOptimizer$CompactSource;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3;]Ljava/util/LinkedList;Lcom/android/server/am/CachedAppOptimizer$4; -HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldRssThrottleCompaction(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;ILjava/lang/String;[J)Z+]Lcom/android/server/am/CachedAppOptimizer$SingleCompactionStats;Lcom/android/server/am/CachedAppOptimizer$SingleCompactionStats;]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3; -HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldTimeThrottleCompaction(Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;)Z+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; -HSPLcom/android/server/am/CachedAppOptimizer;->cancelCompactionForProcess(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;)V+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/EnumMap;Ljava/util/EnumMap; -HPLcom/android/server/am/CachedAppOptimizer;->compactApp(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;Z)Z+]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/lang/Enum;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/CachedAppOptimizer;->freezeAppAsyncInternalLSP(Lcom/android/server/am/ProcessRecord;JZ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats;Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats;,Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats;]Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies;Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3;]Ljava/util/LinkedList;Lcom/android/server/am/CachedAppOptimizer$4; +HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldRssThrottleCompaction(Lcom/android/server/am/CachedAppOptimizer$CompactProfile;ILjava/lang/String;[J)Z+]Ljava/util/LinkedHashMap;Lcom/android/server/am/CachedAppOptimizer$3; +HPLcom/android/server/am/CachedAppOptimizer$MemCompactionHandler;->shouldTimeThrottleCompaction(Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;)Z +HPLcom/android/server/am/CachedAppOptimizer;->binderError(ILcom/android/server/am/ProcessRecord;III)V +HSPLcom/android/server/am/CachedAppOptimizer;->cancelCompactionForProcess(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/EnumMap;Ljava/util/EnumMap; +HPLcom/android/server/am/CachedAppOptimizer;->compactApp(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/CachedAppOptimizer$CompactProfile;Lcom/android/server/am/CachedAppOptimizer$CompactSource;Z)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/am/CachedAppOptimizer;->freezeAppAsyncInternalLSP(Lcom/android/server/am/ProcessRecord;JZ)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/CachedAppOptimizer;->getUnfreezeReasonCodeFromOomAdjReason(I)I +HPLcom/android/server/am/CachedAppOptimizer;->lambda$binderErrorInternal$3(Ljava/lang/Integer;Ljava/lang/Integer;)V HSPLcom/android/server/am/CachedAppOptimizer;->onCleanupApplicationRecordLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HPLcom/android/server/am/CachedAppOptimizer;->onProcessFrozen(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/CachedAppOptimizer;->onOomAdjustChanged(IILcom/android/server/am/ProcessRecord;)V HPLcom/android/server/am/CachedAppOptimizer;->postUidFrozenMessage(IZ)V -HPLcom/android/server/am/CachedAppOptimizer;->traceAppFreeze(Ljava/lang/String;II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/CachedAppOptimizer;->unfreezeAppInternalLSP(Lcom/android/server/am/ProcessRecord;IZ)V+]Landroid/os/Handler;Lcom/android/server/am/CachedAppOptimizer$FreezeHandler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/am/CachedAppOptimizer;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;IJ)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; -HSPLcom/android/server/am/CachedAppOptimizer;->updateEarliestFreezableTime(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; +HPLcom/android/server/am/CachedAppOptimizer;->traceAppFreeze(Ljava/lang/String;II)V +HSPLcom/android/server/am/CachedAppOptimizer;->unfreezeAppInternalLSP(Lcom/android/server/am/ProcessRecord;IZ)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/Freezer;Lcom/android/server/am/Freezer;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/CachedAppOptimizer;->unfreezeAppLSP(Lcom/android/server/am/ProcessRecord;IZ)V +HPLcom/android/server/am/CachedAppOptimizer;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;IJ)V +HPLcom/android/server/am/CachedAppOptimizer;->updateEarliestFreezableTime(Lcom/android/server/am/ProcessRecord;J)J HSPLcom/android/server/am/CachedAppOptimizer;->useCompaction()Z HSPLcom/android/server/am/ComponentAliasResolver$$ExternalSyntheticLambda1;->(Landroid/content/Intent;Ljava/lang/String;III)V HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->getAlias()Ljava/lang/Object;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution; HSPLcom/android/server/am/ComponentAliasResolver$Resolution;->isAlias()Z HSPLcom/android/server/am/ComponentAliasResolver;->resolveComponentAlias(Ljava/util/function/Supplier;)Lcom/android/server/am/ComponentAliasResolver$Resolution; -HSPLcom/android/server/am/ComponentAliasResolver;->resolveReceiver(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Ljava/lang/String;JIIZ)Lcom/android/server/am/ComponentAliasResolver$Resolution;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver; +HSPLcom/android/server/am/ComponentAliasResolver;->resolveReceiver(Landroid/content/Intent;Landroid/content/pm/ResolveInfo;Ljava/lang/String;JIII)Lcom/android/server/am/ComponentAliasResolver$Resolution;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver; HSPLcom/android/server/am/ComponentAliasResolver;->resolveService(Landroid/content/Intent;Ljava/lang/String;III)Lcom/android/server/am/ComponentAliasResolver$Resolution;+]Lcom/android/server/am/ComponentAliasResolver$Resolution;Lcom/android/server/am/ComponentAliasResolver$Resolution;]Lcom/android/server/am/ComponentAliasResolver;Lcom/android/server/am/ComponentAliasResolver; HSPLcom/android/server/am/ConnectionRecord;->(Lcom/android/server/am/AppBindRecord;Lcom/android/server/wm/ActivityServiceConnectionsHolder;Landroid/app/IServiceConnection;JILandroid/app/PendingIntent;ILjava/lang/String;Ljava/lang/String;Landroid/content/ComponentName;)V HSPLcom/android/server/am/ConnectionRecord;->computeHostOomAdjLSP(Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZII)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/ConnectionRecord;->hasFlag(I)Z -HSPLcom/android/server/am/ConnectionRecord;->notHasFlag(I)Z+]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord; -HSPLcom/android/server/am/ConnectionRecord;->startAssociationIfNeeded()V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/internal/app/procstats/AssociationState;Lcom/android/internal/app/procstats/AssociationState;]Lcom/android/internal/app/procstats/ProcessStats$PackageState;Lcom/android/internal/app/procstats/ProcessStats$PackageState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ConnectionRecord;->stopAssociation()V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState; -HSPLcom/android/server/am/ConnectionRecord;->trackProcState(II)V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState; +HSPLcom/android/server/am/ConnectionRecord;->notHasFlag(I)Z +HSPLcom/android/server/am/ConnectionRecord;->startAssociationIfNeeded()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ConnectionRecord;->stopAssociation()V +HSPLcom/android/server/am/ConnectionRecord;->trackProcState(II)V HSPLcom/android/server/am/ContentProviderConnection;->(Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;I)V -HSPLcom/android/server/am/ContentProviderConnection;->adjustCounts(II)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ContentProviderConnection;->adjustCounts(II)V +HSPLcom/android/server/am/ContentProviderConnection;->computeHostOomAdjLSP(Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZII)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HPLcom/android/server/am/ContentProviderConnection;->decrementCount(Z)I HPLcom/android/server/am/ContentProviderConnection;->incrementCount(Z)I HSPLcom/android/server/am/ContentProviderConnection;->initializeCount(Z)V -HSPLcom/android/server/am/ContentProviderConnection;->startAssociationIfNeeded()V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/internal/app/procstats/AssociationState;Lcom/android/internal/app/procstats/AssociationState;]Lcom/android/internal/app/procstats/ProcessStats$PackageState;Lcom/android/internal/app/procstats/ProcessStats$PackageState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/am/ContentProviderConnection;->stopAssociation()V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState; -HSPLcom/android/server/am/ContentProviderConnection;->trackProcState(II)V+]Lcom/android/internal/app/procstats/AssociationState$SourceState;Lcom/android/internal/app/procstats/AssociationState$SourceState; +HSPLcom/android/server/am/ContentProviderConnection;->startAssociationIfNeeded()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/ContentProviderConnection;->stopAssociation()V +HSPLcom/android/server/am/ContentProviderConnection;->trackProcState(II)V HSPLcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Ljava/lang/Object; -HSPLcom/android/server/am/ContentProviderHelper;->canAccessContentProviderFromSdkSandbox(Landroid/content/pm/ProviderInfo;I)Z+]Lcom/android/server/sdksandbox/SdkSandboxManagerLocal;Lcom/android/server/sdksandbox/SdkSandboxManagerService$LocalImpl; -HSPLcom/android/server/am/ContentProviderHelper;->checkAssociationAndPermissionLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;IIZLjava/lang/String;J)V+]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAssociation(Lcom/android/server/am/ProcessRecord;ILandroid/content/pm/ProviderInfo;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderPermission(Landroid/content/pm/ProviderInfo;IIIZLjava/lang/String;)Ljava/lang/String;+]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Landroid/content/pm/ProviderInfo;Landroid/content/pm/ProviderInfo;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ContentProviderHelper;->checkTime(JLjava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ContentProviderHelper;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ZZZ)Z+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; -HSPLcom/android/server/am/ContentProviderHelper;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/am/ContentProviderHelper;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/am/ContentProviderHelper;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZI)Landroid/app/ContentProviderHolder;+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/UserProperties;Landroid/content/pm/UserProperties;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ContentProviderHelper;->handleProviderRemoval(Lcom/android/server/am/ContentProviderConnection;ZZ)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ContentProviderHelper;->hasProviderConnectionLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ContentProviderHelper;->incProviderCountLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZZJLcom/android/server/am/ProcessList;I)Lcom/android/server/am/ContentProviderConnection;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ContentProviderHelper;->isAuthorityRedirectedForCloneProfileCached(Ljava/lang/String;)Z+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/Map;Ljava/util/HashMap; -HSPLcom/android/server/am/ContentProviderHelper;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ContentProviderHelper;->canAccessContentProviderFromSdkSandbox(Landroid/content/pm/ProviderInfo;I)Z +HSPLcom/android/server/am/ContentProviderHelper;->checkAssociationAndPermissionLocked(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;IIZLjava/lang/String;J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAccess(Ljava/lang/String;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderAssociation(Lcom/android/server/am/ProcessRecord;ILandroid/content/pm/ProviderInfo;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ContentProviderHelper;->checkContentProviderPermission(Landroid/content/pm/ProviderInfo;IIIZLjava/lang/String;)Ljava/lang/String;+]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService; +HSPLcom/android/server/am/ContentProviderHelper;->checkTime(JLjava/lang/String;)V +HPLcom/android/server/am/ContentProviderHelper;->decProviderCountLocked(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ZZZ)Z +HSPLcom/android/server/am/ContentProviderHelper;->generateApplicationProvidersLocked(Lcom/android/server/am/ProcessRecord;)Ljava/util/List;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/am/ContentProviderHelper;->getContentProvider(Landroid/app/IApplicationThread;Ljava/lang/String;Ljava/lang/String;IZ)Landroid/app/ContentProviderHolder;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/am/ContentProviderHelper;->getContentProviderImpl(Landroid/app/IApplicationThread;Ljava/lang/String;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZI)Landroid/app/ContentProviderHolder;+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/am/ContentProviderHelper;->handleProviderRemoval(Lcom/android/server/am/ContentProviderConnection;ZZ)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ContentProviderHelper;->hasProviderConnectionLocked(Lcom/android/server/am/ProcessRecord;)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ContentProviderHelper;->incProviderCountLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;ZZJLcom/android/server/am/ProcessList;I)Lcom/android/server/am/ContentProviderConnection;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ContentProviderHelper;->isAuthorityRedirectedForCloneProfileCached(Ljava/lang/String;)Z+]Ljava/util/Map;Ljava/util/HashMap; +HSPLcom/android/server/am/ContentProviderHelper;->isProcessAliveLocked(Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ContentProviderHelper;->isSingletonOrSystemUserOnly(Landroid/content/pm/ProviderInfo;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/ContentProviderHelper;->lambda$checkContentProviderAssociation$4(Lcom/android/server/am/ProcessRecord;Landroid/content/pm/ProviderInfo;Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/am/ContentProviderHelper;->maybeUpdateProviderUsageStatsLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/Long;Ljava/lang/Long; -HSPLcom/android/server/am/ContentProviderHelper;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ContentProviderHelper;->refContentProvider(Landroid/os/IBinder;II)Z+]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection; -HSPLcom/android/server/am/ContentProviderHelper;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper; -HPLcom/android/server/am/ContentProviderHelper;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/lang/Object;Lcom/android/server/am/ContentProviderRecord;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ContentProviderRecord;->(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ProviderInfo;Landroid/content/pm/ApplicationInfo;Landroid/content/ComponentName;Z)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/am/ContentProviderRecord;->canRunHere(Lcom/android/server/am/ProcessRecord;)Z+]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/am/ContentProviderHelper;->maybeUpdateProviderUsageStatsLocked(Lcom/android/server/am/ProcessRecord;Ljava/lang/String;Ljava/lang/String;)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; +HSPLcom/android/server/am/ContentProviderHelper;->publishContentProviders(Landroid/app/IApplicationThread;Ljava/util/List;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/am/ContentProviderHelper;->refContentProvider(Landroid/os/IBinder;II)Z +HPLcom/android/server/am/ContentProviderHelper;->removeContentProvider(Landroid/os/IBinder;Z)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HPLcom/android/server/am/ContentProviderHelper;->removeDyingProviderLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ContentProviderRecord;Z)Z+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/content/IContentProvider;Landroid/content/ContentProviderProxy;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ContentProviderRecord;->(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ProviderInfo;Landroid/content/pm/ApplicationInfo;Landroid/content/ComponentName;Z)V +HSPLcom/android/server/am/ContentProviderRecord;->canRunHere(Lcom/android/server/am/ProcessRecord;)Z HSPLcom/android/server/am/ContentProviderRecord;->hasExternalProcessHandles()Z HSPLcom/android/server/am/ContentProviderRecord;->newHolder(Lcom/android/server/am/ContentProviderConnection;Z)Landroid/app/ContentProviderHolder; -HSPLcom/android/server/am/FgsTempAllowList;->add(IJLjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long; -HSPLcom/android/server/am/FgsTempAllowList;->get(I)Landroid/util/Pair;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long; -HPLcom/android/server/am/FgsTempAllowList;->isAllowed(I)Z+]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList; -HSPLcom/android/server/am/Flags;->serviceBindingOomAdjPolicy()Z+]Lcom/android/server/am/FeatureFlags;Lcom/android/server/am/FeatureFlagsImpl; -HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeUid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats;Landroid/os/BatteryStats$Uid;)V+]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Landroid/os/BatteryStats$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/HealthStatsBatteryStatsWriter;Lcom/android/server/am/HealthStatsBatteryStatsWriter;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; -HSPLcom/android/server/am/HostingRecord;->(Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName; +HPLcom/android/server/am/EventLogTags;->writeAmPss(IILjava/lang/String;JJJJIIJ)V +HSPLcom/android/server/am/FgsTempAllowList;->add(IJLjava/lang/Object;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/FgsTempAllowList;->get(I)Landroid/util/Pair;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/am/HealthStatsBatteryStatsWriter;->writeUid(Landroid/os/health/HealthStatsWriter;Landroid/os/BatteryStats;Landroid/os/BatteryStats$Uid;)V+]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$Uid$Sensor;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor;]Landroid/os/BatteryStats$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/health/HealthStatsWriter;Landroid/os/health/HealthStatsWriter;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/HealthStatsBatteryStatsWriter;Lcom/android/server/am/HealthStatsBatteryStatsWriter;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; +HSPLcom/android/server/am/HostingRecord;->(Ljava/lang/String;Landroid/content/ComponentName;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V HSPLcom/android/server/am/HostingRecord;->(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;IZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V HSPLcom/android/server/am/IntentBindRecord;->(Lcom/android/server/am/ServiceRecord;Landroid/content/Intent$FilterComparison;)V -HSPLcom/android/server/am/LmkdConnection;->exchange(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z+]Lcom/android/server/am/LmkdConnection;Lcom/android/server/am/LmkdConnection;]Ljava/lang/Object;Ljava/lang/Object; +HSPLcom/android/server/am/LmkdConnection;->exchange(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z HSPLcom/android/server/am/LmkdConnection;->isConnected()Z -HSPLcom/android/server/am/LmkdConnection;->write(Ljava/nio/ByteBuffer;)Z+]Ljava/io/OutputStream;Landroid/net/LocalSocketImpl$SocketOutputStream;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; +HSPLcom/android/server/am/LmkdConnection;->write(Ljava/nio/ByteBuffer;)Z+]Ljava/io/OutputStream;Landroid/net/LocalSocketImpl$SocketOutputStream; HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->initialize(Lcom/android/server/am/ProcessRecord;IZZIIIII)V -HPLcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;->onOtherActivity()V -HSPLcom/android/server/am/OomAdjuster;->applyOomAdjLSP(Lcom/android/server/am/ProcessRecord;ZJJI)Z+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong; -HSPLcom/android/server/am/OomAdjuster;->assignCachedAdjIfNecessary(Ljava/util/ArrayList;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster$Injector;->batchSetOomAdj(Ljava/util/ArrayList;)V +HSPLcom/android/server/am/OomAdjuster$Injector;->getElapsedRealtimeMillis()J +HSPLcom/android/server/am/OomAdjuster$Injector;->getUptimeMillis()J +HSPLcom/android/server/am/OomAdjuster;->applyOomAdjLSP(Lcom/android/server/am/ProcessRecord;ZJJIZ)Z+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster;->assignCachedAdjIfNecessary(Ljava/util/ArrayList;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/OomAdjuster;->checkAndEnqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)Z -HSPLcom/android/server/am/OomAdjuster;->collectReachableProcessesLocked(Landroid/util/ArraySet;Ljava/util/ArrayList;Lcom/android/server/am/ActiveUids;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/OomAdjuster;->computeOomAdjLSP(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJZZIZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; -HSPLcom/android/server/am/OomAdjuster;->computeProviderHostOomAdjLSP(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ContentProviderConnection;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/OomAdjuster;->computeServiceHostOomAdjLSP(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; -HSPLcom/android/server/am/OomAdjuster;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HPLcom/android/server/am/OomAdjuster;->collectReachableProcessesLocked(Landroid/util/ArraySet;Ljava/util/ArrayList;Lcom/android/server/am/ActiveUids;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster;->computeOomAdjLSP(Lcom/android/server/am/ProcessRecord;ILcom/android/server/am/ProcessRecord;ZJZZIZ)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/OomAdjuster;->computeProviderHostOomAdjLSP(Lcom/android/server/am/ContentProviderConnection;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->computeServiceHostOomAdjLSP(Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;JLcom/android/server/am/ProcessRecord;ZZZIIZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->enqueueOomAdjTargetLocked(Lcom/android/server/am/ProcessRecord;)V HSPLcom/android/server/am/OomAdjuster;->enqueuePendingTopAppIfNecessaryLSP()I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/am/OomAdjuster;->evaluateConnectionPrelude(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/OomAdjuster;->evaluateProviderConnectionAdd(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/OomAdjuster;->evaluateServiceConnectionAdd(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/OomAdjuster;->getBfslCapabilityFromClient(Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/OomAdjuster;->evaluateProviderConnectionAdd(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/OomAdjuster;->evaluateProviderConnectionRemoval(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->evaluateServiceConnectionAdd(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->evaluateServiceConnectionRemoval(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ConnectionRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->getBfslCapabilityFromClient(Lcom/android/server/am/ProcessRecord;)I HSPLcom/android/server/am/OomAdjuster;->getDefaultCapability(Lcom/android/server/am/ProcessRecord;I)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HPLcom/android/server/am/OomAdjuster;->idleUidsLocked()V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/OomAdjuster;->lambda$new$0(Landroid/os/Message;)Z+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/OomAdjuster;->maybeUpdateLastTopTime(Lcom/android/server/am/ProcessStateRecord;J)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/OomAdjuster;->maybeUpdateUsageStatsLSP(Lcom/android/server/am/ProcessRecord;J)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HPLcom/android/server/am/OomAdjuster;->idleUidsLocked()V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger; +HSPLcom/android/server/am/OomAdjuster;->lambda$new$0(Landroid/os/Message;)Z +HPLcom/android/server/am/OomAdjuster;->maybeSetProcessFollowUpUpdateLocked(Lcom/android/server/am/ProcessRecord;JJ)V +HSPLcom/android/server/am/OomAdjuster;->maybeUpdateLastTopTime(Lcom/android/server/am/ProcessStateRecord;J)V +HSPLcom/android/server/am/OomAdjuster;->maybeUpdateUsageStatsLSP(Lcom/android/server/am/ProcessRecord;J)V+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/OomAdjuster;->oomAdjReasonToString(I)Ljava/lang/String; -HSPLcom/android/server/am/OomAdjuster;->postUpdateOomAdjInnerLSP(ILcom/android/server/am/ActiveUids;JJJZ)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/OomAdjuster;->setAttachingProcessStatesLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/OomAdjuster;->setIntermediateAdjLSP(Lcom/android/server/am/ProcessRecord;III)I+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/OomAdjuster;->setIntermediateProcStateLSP(Lcom/android/server/am/ProcessRecord;II)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/OomAdjuster;->setIntermediateSchedGroupLSP(Lcom/android/server/am/ProcessStateRecord;I)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; +HSPLcom/android/server/am/OomAdjuster;->postUpdateOomAdjInnerLSP(ILcom/android/server/am/ActiveUids;JJJZ)V+]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HPLcom/android/server/am/OomAdjuster;->scheduleFollowUpOomAdjusterUpdateLocked(JJ)V +HSPLcom/android/server/am/OomAdjuster;->setAttachingProcessStatesLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/OomAdjuster;->setIntermediateAdjLSP(Lcom/android/server/am/ProcessRecord;III)I +HSPLcom/android/server/am/OomAdjuster;->setIntermediateProcStateLSP(Lcom/android/server/am/ProcessRecord;II)V +HSPLcom/android/server/am/OomAdjuster;->setIntermediateSchedGroupLSP(Lcom/android/server/am/ProcessStateRecord;I)V HSPLcom/android/server/am/OomAdjuster;->setUidTempAllowlistStateLSP(IZ)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/OomAdjuster;->shouldKillExcessiveProcesses(J)Z+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; -HSPLcom/android/server/am/OomAdjuster;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/OomAdjuster;->updateAndTrimProcessLSP(JJJLcom/android/server/am/ActiveUids;IZ)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/OomAdjuster;->updateAppFreezeStateLSP(Lcom/android/server/am/ProcessRecord;IZ)V+]Lcom/android/server/am/CachedAppOptimizer;Lcom/android/server/am/CachedAppOptimizer;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecIfNecessaryLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; -HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecLSP(Lcom/android/server/am/ProcessRecord;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/OomAdjuster;->unfreezeTemporarily(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster;->updateAndTrimProcessLSP(JJJLcom/android/server/am/ActiveUids;IZ)V+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster;->updateAppFreezeStateLSP(Lcom/android/server/am/ProcessRecord;IZI)V +HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecIfNecessaryLSP(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->updateAppUidRecLSP(Lcom/android/server/am/ProcessRecord;)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/OomAdjuster;->updateOomAdjFollowUpTargetsLocked()V+]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLSP(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLocked(I)V -HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster; -HSPLcom/android/server/am/OomAdjuster;->updateOomAdjPendingTargetsLocked(I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/OomAdjuster;->updateUidsLSP(Lcom/android/server/am/ActiveUids;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/ActiveServices;Lcom/android/server/am/ActiveServices;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjuster;->updateOomAdjLocked(Lcom/android/server/am/ProcessRecord;I)Z +HSPLcom/android/server/am/OomAdjuster;->updateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/OomAdjuster;->updateUidsLSP(Lcom/android/server/am/ActiveUids;J)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjusterDebugLogger;Lcom/android/server/am/OomAdjusterDebugLogger;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/OomAdjusterDebugLogger;->shouldLog(I)Z HSPLcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer;->accept(Lcom/android/server/am/OomAdjusterModernImpl$Connection;Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjusterModernImpl$Connection;Lcom/android/server/am/ConnectionRecord;,Lcom/android/server/am/ContentProviderConnection; +HSPLcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer;->init(Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;)V HSPLcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionsConsumer;->accept(Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/OomAdjusterModernImpl$ComputeHostConsumer;->accept(Lcom/android/server/am/OomAdjusterModernImpl$Connection;Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjusterModernImpl$Connection;Lcom/android/server/am/ConnectionRecord;,Lcom/android/server/am/ContentProviderConnection; HSPLcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;->update(Lcom/android/server/am/ProcessRecord;JIILcom/android/server/am/ActiveUids;Z)V HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;->unlink()V -HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->resetLastNodes()V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList; -HSPLcom/android/server/am/OomAdjusterModernImpl;->adjToSlot(I)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda0;->applyAsInt(Ljava/lang/Object;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda1;->applyAsInt(Ljava/lang/Object;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda2;->applyAsInt(Ljava/lang/Object;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;->offer(Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;)V+]Ljava/util/function/ToIntFunction;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda0;,Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda2; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;->poll()Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;->reset()V +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->lambda$new$1(Lcom/android/server/am/ProcessRecord;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->lambda$new$2(Lcom/android/server/am/ProcessRecord;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->lambda$new$3(Lcom/android/server/am/ProcessRecord;)I +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->offer(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;]Ljava/util/function/ToIntFunction;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda1;,Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda3; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->poll()Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->reset()V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->resetLastNodes()V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; +HSPLcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;->setLastNodeToHead(I)V +HSPLcom/android/server/am/OomAdjusterModernImpl$ReachableCollectingConsumer;->accept(Lcom/android/server/am/OomAdjusterModernImpl$Connection;Lcom/android/server/am/ProcessRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/OomAdjusterModernImpl;->collectAndMarkReachableProcessesLSP(Ljava/util/ArrayList;)V+]Lcom/android/server/am/OomAdjusterModernImpl$ReachableCollectingConsumer;Lcom/android/server/am/OomAdjusterModernImpl$ReachableCollectingConsumer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/OomAdjusterModernImpl;->computeConnectionsLSP()V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; +HSPLcom/android/server/am/OomAdjusterModernImpl;->computeConnectionsLSP()V+]Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionsConsumer;Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionsConsumer;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; +HSPLcom/android/server/am/OomAdjusterModernImpl;->computeOomAdjIgnoringReachablesLSP(Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer;Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer; HSPLcom/android/server/am/OomAdjusterModernImpl;->forEachClientConnectionLSP(Lcom/android/server/am/ProcessRecord;Ljava/util/function/BiConsumer;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/BiConsumer;Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer; HSPLcom/android/server/am/OomAdjusterModernImpl;->forEachConnectionLSP(Lcom/android/server/am/ProcessRecord;Ljava/util/function/BiConsumer;)V+]Ljava/util/function/BiConsumer;Lcom/android/server/am/OomAdjusterModernImpl$ComputeHostConsumer;,Lcom/android/server/am/OomAdjusterModernImpl$ReachableCollectingConsumer; -HSPLcom/android/server/am/OomAdjusterModernImpl;->fullUpdateLSP(I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/OomAdjusterModernImpl;->partialUpdateLSP(ILandroid/util/ArraySet;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjusterModernImpl;->fullUpdateLSP(I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjusterModernImpl;->initReachableStatesLSP(Ljava/util/ArrayList;ILcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/OomAdjusterModernImpl;->partialUpdateLSP(ILandroid/util/ArraySet;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/OomAdjuster$Injector;Lcom/android/server/am/OomAdjuster$Injector;]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs;]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/OomAdjusterModernImpl;->performUpdateOomAdjLSP(I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/am/OomAdjusterModernImpl;->performUpdateOomAdjLSP(Lcom/android/server/am/ProcessRecord;I)Z+]Lcom/android/server/am/OomAdjusterModernImpl;Lcom/android/server/am/OomAdjusterModernImpl; HSPLcom/android/server/am/OomAdjusterModernImpl;->performUpdateOomAdjPendingTargetsLocked(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/OomAdjusterModernImpl;->updateAdjSlot(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; HSPLcom/android/server/am/OomAdjusterModernImpl;->updateAdjSlotIfNecessary(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; -HSPLcom/android/server/am/OomAdjusterModernImpl;->updateProcStateSlot(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; HSPLcom/android/server/am/OomAdjusterModernImpl;->updateProcStateSlotIfNecessary(Lcom/android/server/am/ProcessRecord;I)V+]Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes;Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; -HSPLcom/android/server/am/PackageList;->containsKey(Ljava/lang/Object;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/am/PackageList;->forEachPackage(Ljava/util/function/BiConsumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/BiConsumer;Lcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda1; -HSPLcom/android/server/am/PackageList;->getPackageList()[Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/am/PackageList;->searchEachPackage(Ljava/util/function/Function;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Function;Lcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda2; +HSPLcom/android/server/am/PackageList;->containsKey(Ljava/lang/Object;)Z +HSPLcom/android/server/am/PackageList;->forEachPackage(Ljava/util/function/BiConsumer;)V+]Ljava/util/function/BiConsumer;Lcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda1; +HSPLcom/android/server/am/PackageList;->getPackageList()[Ljava/lang/String; +HSPLcom/android/server/am/PackageList;->searchEachPackage(Ljava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/function/Function;Lcom/android/server/am/ContentProviderHelper$$ExternalSyntheticLambda2; HPLcom/android/server/am/PendingIntentController;->cancelIntentSender(Landroid/content/IIntentSender;)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController; -HSPLcom/android/server/am/PendingIntentController;->decrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/am/PendingIntentController;->cancelIntentSender(Lcom/android/server/am/PendingIntentRecord;ZI)V+]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/PendingIntentController;->decrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/am/PendingIntentController;->getIntentSender(ILjava/lang/String;Ljava/lang/String;IILandroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILandroid/os/Bundle;)Lcom/android/server/am/PendingIntentRecord;+]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Ljava/util/HashMap;Ljava/util/HashMap; -HSPLcom/android/server/am/PendingIntentController;->incrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer; -HSPLcom/android/server/am/PendingIntentRecord$Key;->(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILcom/android/server/wm/SafeActivityOptions;I)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/IBinder;Lcom/android/server/wm/ActivityRecord$Token;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/am/PendingIntentController;->incrementUidStatLocked(Lcom/android/server/am/PendingIntentRecord;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/am/PendingIntentController;->makeIntentSenderCanceled(Lcom/android/server/am/PendingIntentRecord;I)V+]Lcom/android/server/AlarmManagerInternal;Lcom/android/server/alarm/AlarmManagerService$LocalService; +HSPLcom/android/server/am/PendingIntentRecord$Key;->(ILjava/lang/String;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;I[Landroid/content/Intent;[Ljava/lang/String;ILcom/android/server/wm/SafeActivityOptions;I)V+]Landroid/content/Intent;Landroid/content/Intent; HSPLcom/android/server/am/PendingIntentRecord$Key;->equals(Ljava/lang/Object;)Z+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/am/PendingIntentRecord$Key;->hashCode()I HSPLcom/android/server/am/PendingIntentRecord;->(Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentRecord$Key;I)V HSPLcom/android/server/am/PendingIntentRecord;->completeFinalize()V+]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Ljava/util/HashMap;Ljava/util/HashMap; -HPLcom/android/server/am/PendingIntentRecord;->getBackgroundStartPrivilegesForActivitySender(Landroid/util/ArraySet;Landroid/os/IBinder;Landroid/os/Bundle;I)Landroid/app/BackgroundStartPrivileges;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HPLcom/android/server/am/PendingIntentRecord;->sendInner(Landroid/app/IApplicationThread;ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Landroid/app/BroadcastOptions;Landroid/app/BroadcastOptions;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/IIntentReceiver;Landroid/app/PendingIntent$FinishedDispatcher;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Lcom/android/server/am/PendingIntentRecord;Lcom/android/server/am/PendingIntentRecord;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/SafeActivityOptions;Lcom/android/server/wm/SafeActivityOptions;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/PendingStartActivityUids;->delete(IJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/am/PendingIntentRecord;->sendInner(Landroid/app/IApplicationThread;ILandroid/content/Intent;Ljava/lang/String;Landroid/os/IBinder;Landroid/content/IIntentReceiver;Ljava/lang/String;Landroid/os/IBinder;Ljava/lang/String;IIILandroid/os/Bundle;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Landroid/content/IIntentReceiver;Landroid/app/PendingIntent$FinishedDispatcher;,Landroid/content/IIntentReceiver$Stub$Proxy;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/am/PendingIntentController;Lcom/android/server/am/PendingIntentController;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Lcom/android/server/wm/SafeActivityOptions;Lcom/android/server/wm/SafeActivityOptions; +HSPLcom/android/server/am/PendingStartActivityUids;->delete(IJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/PendingStartActivityUids;->enqueuePendingTopAppIfNecessaryLocked(Lcom/android/server/am/ActivityManagerService;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; HSPLcom/android/server/am/PendingStartActivityUids;->isPendingTopUid(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/am/PhantomProcessList;->getOrCreatePhantomProcessIfNeededLocked(Ljava/lang/String;IIZ)Lcom/android/server/am/PhantomProcessRecord;+]Landroid/os/Handler;Lcom/android/server/am/ProcessList$KillHandler;]Landroid/os/Looper;Landroid/os/Looper;]Landroid/os/MessageQueue;Landroid/os/MessageQueue;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/PhantomProcessRecord;Lcom/android/server/am/PhantomProcessRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/io/FileDescriptor;Ljava/io/FileDescriptor;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/am/PhantomProcessList;->isAppProcess(I)Z+]Lcom/android/server/am/ActivityManagerService$PidMap;Lcom/android/server/am/ActivityManagerService$PidMap; -HPLcom/android/server/am/PhantomProcessList;->lookForPhantomProcessesLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/PhantomProcessList$Injector;Lcom/android/server/am/PhantomProcessList$Injector;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/io/InputStream;Ljava/io/FileInputStream; -HPLcom/android/server/am/PhantomProcessList;->updateProcessCpuStatesLocked(Lcom/android/internal/os/ProcessCpuTracker;)V+]Lcom/android/internal/os/ProcessCpuTracker;Lcom/android/internal/os/ProcessCpuTracker;]Lcom/android/server/am/PhantomProcessList;Lcom/android/server/am/PhantomProcessList;]Lcom/android/server/am/PhantomProcessRecord;Lcom/android/server/am/PhantomProcessRecord; +HPLcom/android/server/am/PhantomProcessList;->getOrCreatePhantomProcessIfNeededLocked(Ljava/lang/String;IIZ)Lcom/android/server/am/PhantomProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/PhantomProcessList;->isAppProcess(I)Z +HPLcom/android/server/am/PhantomProcessList;->lookForPhantomProcessesLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/am/PhantomProcessList;->lookForPhantomProcessesLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/PhantomProcessList$Injector;Lcom/android/server/am/PhantomProcessList$Injector;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/io/InputStream;Ljava/io/FileInputStream; +HPLcom/android/server/am/PhantomProcessList;->updateProcessCpuStatesLocked(Lcom/android/internal/os/ProcessCpuTracker;)V HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->fetchLocked(Landroid/content/pm/ApplicationInfo;I)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; -HSPLcom/android/server/am/PlatformCompatCache$CacheItem;->isChangeEnabled(Landroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/am/PlatformCompatCache$CacheItem;Lcom/android/server/am/PlatformCompatCache$CacheItem;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; -HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(Z)V+]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; -HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(ZZ)Z +HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->(Lcom/android/server/am/ProcessRecord;)V +HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(ZII)V +HSPLcom/android/server/am/ProcessCachedOptimizerRecord;->setShouldNotFreeze(ZZII)Z HSPLcom/android/server/am/ProcessErrorStateRecord;->(Lcom/android/server/am/ProcessRecord;)V HSPLcom/android/server/am/ProcessErrorStateRecord;->isCrashing()Z HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda1;->(Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda1;->run()V HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda5;->(Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessRecord;Ljava/lang/String;[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V -HSPLcom/android/server/am/ProcessList$$ExternalSyntheticLambda5;->run()V HSPLcom/android/server/am/ProcessList$MyProcessMap;->put(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/am/ProcessList$MyProcessMap;->remove(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/am/ProcessList$ProcStateMemTracker;->()V HSPLcom/android/server/am/ProcessList;->addProcessNameLocked(Lcom/android/server/am/ProcessRecord;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->checkSlow(JLjava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ProcessList;->computeGidsForProcess(II[IZ)[I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->batchSetOomAdj(Ljava/util/ArrayList;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->checkSlow(JLjava/lang/String;)V +HSPLcom/android/server/am/ProcessList;->computeGidsForProcess(II[IZ)[I HSPLcom/android/server/am/ProcessList;->computeNextPssTime(ILcom/android/server/am/ProcessList$ProcStateMemTracker;ZZJJ)J -HSPLcom/android/server/am/ProcessList;->fillInProcMemInfoLOSP(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessList;->fillInProcMemInfoLOSP(Lcom/android/server/am/ProcessRecord;Landroid/app/ActivityManager$RunningAppProcessInfo;I)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessList;->forEachLruProcessesLOSP(ZLjava/util/function/Consumer;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Consumer;megamorphic_types HSPLcom/android/server/am/ProcessList;->getBlockStateForUid(Lcom/android/server/am/UidRecord;)I -HSPLcom/android/server/am/ProcessList;->getLRURecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->getLRURecordForAppLOSP(Landroid/os/IBinder;)Lcom/android/server/am/ProcessRecord;+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ProcessList;->getMemLevel(I)J -HSPLcom/android/server/am/ProcessList;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList; -HSPLcom/android/server/am/ProcessList;->getNumForegroundServices()Landroid/util/Pair;+]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap; -HSPLcom/android/server/am/ProcessList;->getRunningAppProcessesLOSP(ZIZII)Ljava/util/List;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/wm/ActivityServiceConnectionsHolder;Lcom/android/server/wm/ActivityServiceConnectionsHolder;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->getUidProcStateLOSP(I)I+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/ProcessList;->getUidProcessCapabilityLOSP(I)I+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord; -HSPLcom/android/server/am/ProcessList;->getUidRecordLOSP(I)Lcom/android/server/am/UidRecord;+]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids; +HSPLcom/android/server/am/ProcessList;->getMemoryInfo(Landroid/app/ActivityManager$MemoryInfo;)V +HSPLcom/android/server/am/ProcessList;->getNumForegroundServices()Landroid/util/Pair;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->getPackageAppDataInfoMap(Landroid/content/pm/PackageManagerInternal;[Ljava/lang/String;I)Ljava/util/Map;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/am/ProcessList;->getProcessRecordLocked(Ljava/lang/String;I)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/ProcessList;->getRunningAppProcessesLOSP(ZIZII)Ljava/util/List;+]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->getUidProcStateLOSP(I)I +HSPLcom/android/server/am/ProcessList;->getUidProcessCapabilityLOSP(I)I +HSPLcom/android/server/am/ProcessList;->getUidRecordLOSP(I)Lcom/android/server/am/UidRecord; HSPLcom/android/server/am/ProcessList;->handleProcessStartedLocked(Lcom/android/server/am/ProcessRecord;IZJZ)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/Watchdog;Lcom/android/server/Watchdog;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessList;->incrementProcStateSeqAndNotifyAppsLOSP(Lcom/android/server/am/ActiveUids;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->incrementProcStateSeqAndNotifyAppsLOSP(Lcom/android/server/am/ActiveUids;)V+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Lcom/android/server/am/ActivityManagerService$Injector;Lcom/android/server/am/ActivityManagerService$Injector;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ProcessList;->isProcStartValidLocked(Lcom/android/server/am/ProcessRecord;J)Ljava/lang/String;+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ProcessList;->killAppIfBgRestrictedAndCachedIdleLocked(Lcom/android/server/am/ProcessRecord;J)J+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessList;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZIZILjava/lang/String;Lcom/android/server/am/HostingRecord;)Lcom/android/server/am/ProcessRecord;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessList;->newProcessRecordLocked(Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ZIZILjava/lang/String;Lcom/android/server/am/HostingRecord;)Lcom/android/server/am/ProcessRecord;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessList;->noteProcessDiedLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/Watchdog;Lcom/android/server/Watchdog;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessList;->procStateToImportance(IILandroid/app/ActivityManager$RunningAppProcessInfo;I)I HSPLcom/android/server/am/ProcessList;->removeLruProcessLocked(Lcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;]Lcom/android/server/am/ProcessList$IsolatedUidRange;Lcom/android/server/am/ProcessList$IsolatedUidRange;]Lcom/android/server/am/ProcessList$MyProcessMap;Lcom/android/server/am/ProcessList$MyProcessMap;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->searchEachLruProcessesLOSP(ZLjava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Function;Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda0;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda1;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda2;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda5;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda6;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8; -HSPLcom/android/server/am/ProcessList;->sendPackageBroadcastLocked(I[Ljava/lang/String;I)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->setOomAdj(III)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/nio/ByteBuffer;Ljava/nio/HeapByteBuffer; -HSPLcom/android/server/am/ProcessList;->startProcess(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Landroid/os/Process$ProcessStartResult;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/AppZygote;Landroid/os/AppZygote;]Landroid/os/ChildZygoteProcess;Landroid/os/ChildZygoteProcess;]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/HostingRecord;Lcom/android/server/am/HostingRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/am/ProcessList;->removeProcessNameLocked(Ljava/lang/String;ILcom/android/server/am/ProcessRecord;)Lcom/android/server/am/ProcessRecord;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/FgsTempAllowList;Lcom/android/server/am/FgsTempAllowList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->searchEachLruProcessesLOSP(ZLjava/util/function/Function;)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Function;Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda1;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda5;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda6;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda7;,Lcom/android/server/am/ActiveServices$$ExternalSyntheticLambda8; +HPLcom/android/server/am/ProcessList;->sendPackageBroadcastLocked(I[Ljava/lang/String;I)V+]Landroid/app/IApplicationThread;Landroid/app/ActivityThread$ApplicationThread;,Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->startProcess(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)Landroid/os/Process$ProcessStartResult;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/AppZygote;Landroid/os/AppZygote;]Lcom/android/server/AppStateTracker;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/HostingRecord;Ljava/lang/String;Lcom/android/server/am/ProcessRecord;I[IIIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;JJ)Z+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; HSPLcom/android/server/am/ProcessList;->startProcessLocked(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/HostingRecord;IZZLjava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/storage/StorageManagerInternal;Lcom/android/server/StorageManagerService$StorageManagerInternalImpl;]Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;Lcom/android/server/am/ActivityManagerService$HiddenApiSettings;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ProcessList;->startProcessLocked(Ljava/lang/String;Landroid/content/pm/ApplicationInfo;ZILcom/android/server/am/HostingRecord;IZZIZILjava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/Runnable;)Lcom/android/server/am/ProcessRecord;+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/am/AppErrors;Lcom/android/server/am/AppErrors;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessList;->updateClientActivitiesOrderingLSP(Lcom/android/server/am/ProcessRecord;III)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/am/ProcessList;->updateLruProcessInternalLSP(Lcom/android/server/am/ProcessRecord;JIILjava/lang/String;Ljava/lang/Object;Lcom/android/server/am/ProcessRecord;)I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->updateLruProcessLSP(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;ZZ)V+]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessProviderRecord;Lcom/android/server/am/ProcessProviderRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessList;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; +HSPLcom/android/server/am/ProcessList;->updateClientActivitiesOrderingLSP(Lcom/android/server/am/ProcessRecord;III)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->updateLruProcessLSP(Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;ZZ)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessList;->updateLruProcessLocked(Lcom/android/server/am/ProcessRecord;ZLcom/android/server/am/ProcessRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ProcessList;->updateSeInfo(Lcom/android/server/am/ProcessRecord;)Ljava/lang/String;+]Lcom/android/server/am/ProcessList$ProcessListSettingsListener;Lcom/android/server/am/ProcessList$ProcessListSettingsListener; HSPLcom/android/server/am/ProcessList;->writeLmkd(Ljava/nio/ByteBuffer;Ljava/nio/ByteBuffer;)Z+]Lcom/android/server/am/LmkdConnection;Lcom/android/server/am/LmkdConnection; HSPLcom/android/server/am/ProcessProfileRecord$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;)V HSPLcom/android/server/am/ProcessProfileRecord;->(Lcom/android/server/am/ProcessRecord;)V -HSPLcom/android/server/am/ProcessProfileRecord;->addHostingComponentType(I)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; +HSPLcom/android/server/am/ProcessProfileRecord;->addHostingComponentType(I)V HSPLcom/android/server/am/ProcessProfileRecord;->computeNextPssTime(IZZJ)J HSPLcom/android/server/am/ProcessProfileRecord;->lambda$onProcessActive$0(Lcom/android/internal/app/procstats/ProcessState;Lcom/android/server/am/ProcessStatsService;ILcom/android/internal/app/procstats/ProcessState;Ljava/lang/String;Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;)V HSPLcom/android/server/am/ProcessProfileRecord;->onProcessActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HPLcom/android/server/am/ProcessProfileRecord;->onProcessFrozen()V+]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/ProcessProfileRecord;->onProcessFrozen()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ProcessProfileRecord;->onProcessInactive(Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessProfileRecord;->setProcessTrackerState(II)V+]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessProfileRecord;->updateProcState(Lcom/android/server/am/ProcessStateRecord;)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HPLcom/android/server/am/ProcessProfileRecord;->onProcessUnfrozen()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ProcessProfileRecord;->setProcessTrackerState(II)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ProcessProfileRecord;->updateProcState(Lcom/android/server/am/ProcessStateRecord;)V HSPLcom/android/server/am/ProcessProviderRecord;->(Lcom/android/server/am/ProcessRecord;)V HSPLcom/android/server/am/ProcessProviderRecord;->addProviderConnection(Lcom/android/server/am/ContentProviderConnection;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessProviderRecord;->getProviderAt(I)Lcom/android/server/am/ContentProviderRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/am/ProcessProviderRecord;->getProviderAt(I)Lcom/android/server/am/ContentProviderRecord; HSPLcom/android/server/am/ProcessProviderRecord;->getProviderConnectionAt(I)Lcom/android/server/am/ContentProviderConnection;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ProcessProviderRecord;->numberOfProviderConnections()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessProviderRecord;->numberOfProviders()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/am/ProcessProviderRecord;->onCleanupApplicationRecordLocked(Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ContentProviderRecord;Lcom/android/server/am/ContentProviderRecord;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessList;Lcom/android/server/am/ProcessList;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessProviderRecord;->numberOfProviders()I +HSPLcom/android/server/am/ProcessProviderRecord;->onCleanupApplicationRecordLocked(Z)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ContentProviderHelper;Lcom/android/server/am/ContentProviderHelper;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ProcessReceiverRecord;->(Lcom/android/server/am/ProcessRecord;)V -HSPLcom/android/server/am/ProcessReceiverRecord;->addReceiver(Lcom/android/server/am/ReceiverList;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/am/ProcessReceiverRecord;->numberOfReceivers()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/ProcessReceiverRecord;->addReceiver(Lcom/android/server/am/ReceiverList;)V +HSPLcom/android/server/am/ProcessReceiverRecord;->numberOfReceivers()I HSPLcom/android/server/am/ProcessRecord;->(Lcom/android/server/am/ActivityManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;ILjava/lang/String;ILjava/lang/String;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;JLcom/android/server/am/ProcessStatsService;)Z+]Lcom/android/internal/app/procstats/ProcessState;Lcom/android/internal/app/procstats/ProcessState;]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService; +HSPLcom/android/server/am/ProcessRecord;->addPackage(Ljava/lang/String;JLcom/android/server/am/ProcessStatsService;)Z +HSPLcom/android/server/am/ProcessRecord;->forEachConnectionHost(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda12; +HSPLcom/android/server/am/ProcessRecord;->getActiveInstrumentation()Lcom/android/server/am/ActiveInstrumentation; HSPLcom/android/server/am/ProcessRecord;->getCpuDelayTime()J+]Lcom/android/server/am/AppProfiler;Lcom/android/server/am/AppProfiler; HSPLcom/android/server/am/ProcessRecord;->getHostingRecord()Lcom/android/server/am/HostingRecord; HSPLcom/android/server/am/ProcessRecord;->getLastActivityTime()J HSPLcom/android/server/am/ProcessRecord;->getLruSeq()I -HSPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String;+]Lcom/android/server/am/PackageList;Lcom/android/server/am/PackageList; +HSPLcom/android/server/am/ProcessRecord;->getOnewayThread()Landroid/app/IApplicationThread; +HSPLcom/android/server/am/ProcessRecord;->getPackageList()[Ljava/lang/String; HSPLcom/android/server/am/ProcessRecord;->getPid()I HSPLcom/android/server/am/ProcessRecord;->getPkgDeps()Landroid/util/ArraySet; HSPLcom/android/server/am/ProcessRecord;->getPkgList()Lcom/android/server/am/PackageList; HSPLcom/android/server/am/ProcessRecord;->getSetAdj()I +HSPLcom/android/server/am/ProcessRecord;->getSetCapability()I HSPLcom/android/server/am/ProcessRecord;->getSetProcState()I HSPLcom/android/server/am/ProcessRecord;->getStartUid()I HSPLcom/android/server/am/ProcessRecord;->getThread()Landroid/app/IApplicationThread; HSPLcom/android/server/am/ProcessRecord;->getUidRecord()Lcom/android/server/am/UidRecord; +HSPLcom/android/server/am/ProcessRecord;->getWaitingToKill()Ljava/lang/String; HSPLcom/android/server/am/ProcessRecord;->getWindowProcessController()Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessRecord;->hasActivities()Z+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessRecord;->hasActivitiesOrRecentTasks()Z+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessRecord;->isCached()Z +HPLcom/android/server/am/ProcessRecord;->isFreezable()Z HSPLcom/android/server/am/ProcessRecord;->isInFullBackup()Z HSPLcom/android/server/am/ProcessRecord;->isKilled()Z HSPLcom/android/server/am/ProcessRecord;->isKilledByAm()Z @@ -1005,126 +1030,123 @@ HSPLcom/android/server/am/ProcessRecord;->isPendingFinishAttach()Z HSPLcom/android/server/am/ProcessRecord;->isPersistent()Z HSPLcom/android/server/am/ProcessRecord;->isRemoved()Z HSPLcom/android/server/am/ProcessRecord;->isThreadReady()Z -HPLcom/android/server/am/ProcessRecord;->killLocked(Ljava/lang/String;Ljava/lang/String;IIZZ)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/ProcessRecord;->makeActive(Landroid/app/IApplicationThread;Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessRecord;->onCleanupApplicationRecordLSP(Lcom/android/server/am/ProcessStatsService;ZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/ProcessRecord;->killLocked(Ljava/lang/String;Ljava/lang/String;IIZZ)V+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ProcessRecord;->makeActive(Lcom/android/server/am/ApplicationThreadDeferred;Lcom/android/server/am/ProcessStatsService;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessRecord;->onCleanupApplicationRecordLSP(Lcom/android/server/am/ProcessStatsService;ZZ)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessErrorStateRecord;Lcom/android/server/am/ProcessErrorStateRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HPLcom/android/server/am/ProcessRecord;->onProcessUnfrozen()V HSPLcom/android/server/am/ProcessRecord;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessRecord;->resetPackageList(Lcom/android/server/am/ProcessStatsService;)V -HSPLcom/android/server/am/ProcessRecord;->setBackgroundStartPrivileges(Landroid/os/Binder;Landroid/app/BackgroundStartPrivileges;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/am/ProcessRecord;->setBackgroundStartPrivileges(Landroid/os/Binder;Landroid/app/BackgroundStartPrivileges;)V HSPLcom/android/server/am/ProcessRecord;->setLastActivityTime(J)V HSPLcom/android/server/am/ProcessRecord;->setLruSeq(I)V -HSPLcom/android/server/am/ProcessRecord;->setPid(I)V+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ProcessRecord;->setPid(I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessRecord;->toShortString(Ljava/lang/StringBuilder;)V +HSPLcom/android/server/am/ProcessRecord;->toString()Ljava/lang/String;+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ProcessServiceRecord;->(Lcom/android/server/am/ProcessRecord;)V HSPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUid(ILjava/lang/String;J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUidsOfNewService(Lcom/android/server/am/ServiceRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessServiceRecord;->addConnection(Lcom/android/server/am/ConnectionRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; -HSPLcom/android/server/am/ProcessServiceRecord;->addSdkSandboxConnectionIfNecessary(Lcom/android/server/am/ConnectionRecord;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/ProcessServiceRecord;->addBoundClientUidsOfNewService(Lcom/android/server/am/ServiceRecord;)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessServiceRecord;->addConnection(Lcom/android/server/am/ConnectionRecord;)V +HSPLcom/android/server/am/ProcessServiceRecord;->addSdkSandboxConnectionIfNecessary(Lcom/android/server/am/ConnectionRecord;)V HSPLcom/android/server/am/ProcessServiceRecord;->areForegroundServiceTypesSame(IZ)Z HSPLcom/android/server/am/ProcessServiceRecord;->clearBoundClientUids()V -HSPLcom/android/server/am/ProcessServiceRecord;->getNumForegroundServices()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/am/ProcessServiceRecord;->getRunningServiceAt(I)Lcom/android/server/am/ServiceRecord;+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/ProcessServiceRecord;->getNumForegroundServices()I +HSPLcom/android/server/am/ProcessServiceRecord;->getRunningServiceAt(I)Lcom/android/server/am/ServiceRecord; HSPLcom/android/server/am/ProcessServiceRecord;->hasNonShortForegroundServices()Z HSPLcom/android/server/am/ProcessServiceRecord;->hasTopStartedAlmostPerceptibleServices()Z HSPLcom/android/server/am/ProcessServiceRecord;->modifyRawOomAdj(I)I -HSPLcom/android/server/am/ProcessServiceRecord;->numberOfConnections()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/am/ProcessServiceRecord;->numberOfExecutingServices()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/am/ProcessServiceRecord;->numberOfRunningServices()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/am/ProcessServiceRecord;->numberOfConnections()I +HSPLcom/android/server/am/ProcessServiceRecord;->numberOfExecutingServices()I +HSPLcom/android/server/am/ProcessServiceRecord;->numberOfRunningServices()I HSPLcom/android/server/am/ProcessServiceRecord;->removeSdkSandboxConnectionIfNecessary(Lcom/android/server/am/ConnectionRecord;)V -HSPLcom/android/server/am/ProcessServiceRecord;->startService(Lcom/android/server/am/ServiceRecord;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessServiceRecord;->stopService(Lcom/android/server/am/ServiceRecord;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord; -HSPLcom/android/server/am/ProcessServiceRecord;->updateBoundClientUids()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ProcessServiceRecord;->updateHostingComonentTypeForBindingsLocked()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; +HSPLcom/android/server/am/ProcessServiceRecord;->startService(Lcom/android/server/am/ServiceRecord;)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessServiceRecord;->stopService(Lcom/android/server/am/ServiceRecord;)Z +HSPLcom/android/server/am/ProcessServiceRecord;->updateBoundClientUids()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ProcessServiceRecord;->updateHostingComonentTypeForBindingsLocked()V HSPLcom/android/server/am/ProcessStateRecord;->(Lcom/android/server/am/ProcessRecord;)V -HPLcom/android/server/am/ProcessStateRecord;->computeOomAdjFromActivitiesIfNecessary(Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;IZZIIIII)V+]Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessStateRecord;->forceProcessStateUpTo(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; -HSPLcom/android/server/am/ProcessStateRecord;->getCachedCompatChange(I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjuster;,Lcom/android/server/am/OomAdjusterModernImpl; -HSPLcom/android/server/am/ProcessStateRecord;->getCachedHasActivities()Z+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HPLcom/android/server/am/ProcessStateRecord;->computeOomAdjFromActivitiesIfNecessary(Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback;IZZIIIII)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessStateRecord;->forceProcessStateUpTo(I)V+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/ProcessStateRecord;->getCachedCompatChange(I)Z+]Lcom/android/server/am/OomAdjuster;Lcom/android/server/am/OomAdjusterModernImpl; +HSPLcom/android/server/am/ProcessStateRecord;->getCachedHasActivities()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->getCachedHasRecentTasks()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->getCachedHasVisibleActivities()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->getCachedIsHeavyWeight()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->getCachedIsHomeProcess()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->getCachedIsPreviousProcess()Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessStateRecord;->getCachedIsReceivingBroadcast([I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord; +HSPLcom/android/server/am/ProcessStateRecord;->getCachedIsReceivingBroadcast([I)Z+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HSPLcom/android/server/am/ProcessStateRecord;->getCurAdj()I HSPLcom/android/server/am/ProcessStateRecord;->getCurProcState()I +HSPLcom/android/server/am/ProcessStateRecord;->getCurRawAdj()I HSPLcom/android/server/am/ProcessStateRecord;->getSetAdj()I HSPLcom/android/server/am/ProcessStateRecord;->getSetProcState()I HSPLcom/android/server/am/ProcessStateRecord;->isCached()Z -HSPLcom/android/server/am/ProcessStateRecord;->onCleanupApplicationRecordLSP()V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/ProcessStateRecord;->onCleanupApplicationRecordLSP()V HSPLcom/android/server/am/ProcessStateRecord;->resetCachedInfo()V HSPLcom/android/server/am/ProcessStateRecord;->setCurAdj(I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->setCurProcState(I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessStateRecord;->setCurRawAdj(I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/am/ProcessStateRecord;->setCurRawAdj(I)V HSPLcom/android/server/am/ProcessStateRecord;->setCurRawAdj(IZ)Z+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessStateRecord;->setCurRawProcState(I)V+]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/ProcessStateRecord;->setCurRawProcState(I)V HSPLcom/android/server/am/ProcessStateRecord;->setCurRawProcState(IZ)Z HSPLcom/android/server/am/ProcessStateRecord;->setCurrentSchedulingGroup(I)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/am/ProcessStateRecord;->setHasStartedServices(Z)V+]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord; +HSPLcom/android/server/am/ProcessStateRecord;->setHasStartedServices(Z)V HSPLcom/android/server/am/ProcessStateRecord;->setSetProcState(I)V -HPLcom/android/server/am/ProcessStateRecord;->setWhenUnimportant(J)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/am/ProcessStateRecord;->updateLastInvisibleTime(Z)V HSPLcom/android/server/am/ProcessStatsService;->getMemFactorLocked()I HSPLcom/android/server/am/ProcessStatsService;->getServiceState(Ljava/lang/String;IJLjava/lang/String;Ljava/lang/String;)Lcom/android/internal/app/procstats/ServiceState; -HSPLcom/android/server/am/ProcessStatsService;->setMemFactorLocked(IZJ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState; +HSPLcom/android/server/am/ProcessStatsService;->setMemFactorLocked(IZJ)Z+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap; HSPLcom/android/server/am/ProcessStatsService;->shouldWriteNowLocked(J)Z -HSPLcom/android/server/am/ProcessStatsService;->updateProcessStateHolderLocked(Lcom/android/internal/app/procstats/ProcessStats$ProcessStateHolder;Ljava/lang/String;IJLjava/lang/String;)V -HSPLcom/android/server/am/ProviderMap;->getProviderByClass(Landroid/content/ComponentName;I)Lcom/android/server/am/ContentProviderRecord;+]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/util/HashMap;Ljava/util/HashMap; -HSPLcom/android/server/am/ProviderMap;->getProviderByName(Ljava/lang/String;I)Lcom/android/server/am/ContentProviderRecord;+]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/ProviderMap;->getProviderByClass(Landroid/content/ComponentName;I)Lcom/android/server/am/ContentProviderRecord;+]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/ProviderMap;->getProviderByName(Ljava/lang/String;I)Lcom/android/server/am/ContentProviderRecord;+]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/am/ProviderMap;->getProvidersByClass(I)Ljava/util/HashMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/ProviderMap;->getProvidersByName(I)Ljava/util/HashMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/ProviderMap;->putProviderByClass(Landroid/content/ComponentName;Lcom/android/server/am/ContentProviderRecord;)V+]Lcom/android/server/am/ProviderMap;Lcom/android/server/am/ProviderMap;]Ljava/util/HashMap;Ljava/util/HashMap; -HSPLcom/android/server/am/ProviderMap;->putProviderByName(Ljava/lang/String;Lcom/android/server/am/ContentProviderRecord;)V+]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/am/ProviderMap;->putProviderByClass(Landroid/content/ComponentName;Lcom/android/server/am/ContentProviderRecord;)V+]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/am/ReceiverList;->(Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ProcessRecord;IIILandroid/content/IIntentReceiver;)V -HSPLcom/android/server/am/ReceiverList;->containsFilter(Landroid/content/IntentFilter;)Z+]Ljava/util/ArrayList;Lcom/android/server/am/ReceiverList; +HSPLcom/android/server/am/ReceiverList;->containsFilter(Landroid/content/IntentFilter;)Z HSPLcom/android/server/am/ReceiverList;->hashCode()I HSPLcom/android/server/am/SameProcessApplicationThread$$ExternalSyntheticLambda1;->(Lcom/android/server/am/SameProcessApplicationThread;Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIIILjava/lang/String;)V HSPLcom/android/server/am/SameProcessApplicationThread$$ExternalSyntheticLambda1;->run()V -HSPLcom/android/server/am/SameProcessApplicationThread;->scheduleRegisteredReceiver(Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIIILjava/lang/String;)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/am/ServiceRecord$1;->run()V+]Lcom/android/server/notification/NotificationManagerInternal;Lcom/android/server/notification/NotificationManagerService$12;,Lcom/android/server/notification/NotificationManagerService$13; +HSPLcom/android/server/am/SameProcessApplicationThread;->scheduleRegisteredReceiver(Landroid/content/IIntentReceiver;Landroid/content/Intent;ILjava/lang/String;Landroid/os/Bundle;ZZZIIILjava/lang/String;)V +HSPLcom/android/server/am/ServiceRecord$1;->run()V+]Lcom/android/server/notification/NotificationManagerInternal;Lcom/android/server/notification/NotificationManagerService$13; HSPLcom/android/server/am/ServiceRecord$StartItem;->(Lcom/android/server/am/ServiceRecord;ZILandroid/content/Intent;Lcom/android/server/uri/NeededUriGrants;ILjava/lang/String;Ljava/lang/String;I)V -HSPLcom/android/server/am/ServiceRecord;->(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/content/ComponentName;Ljava/lang/String;ILandroid/content/Intent$FilterComparison;Landroid/content/pm/ServiceInfo;ZLjava/lang/Runnable;Ljava/lang/String;ILjava/lang/String;Z)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HSPLcom/android/server/am/ServiceRecord;->addConnection(Landroid/os/IBinder;Lcom/android/server/am/ConnectionRecord;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessProfileRecord;Lcom/android/server/am/ProcessProfileRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ServiceRecord;->(Lcom/android/server/am/ActivityManagerService;Landroid/content/ComponentName;Landroid/content/ComponentName;Ljava/lang/String;ILandroid/content/Intent$FilterComparison;Landroid/content/pm/ServiceInfo;ZLjava/lang/Runnable;Ljava/lang/String;ILjava/lang/String;Z)V +HSPLcom/android/server/am/ServiceRecord;->addConnection(Landroid/os/IBinder;Lcom/android/server/am/ConnectionRecord;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ServiceRecord;->clearDeliveredStartsLocked()V+]Lcom/android/server/am/ServiceRecord$StartItem;Lcom/android/server/am/ServiceRecord$StartItem;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ServiceRecord;->findDeliveredStart(IZZ)Lcom/android/server/am/ServiceRecord$StartItem;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ServiceRecord;->getBackgroundStartPrivilegesWithExclusiveToken()Landroid/app/BackgroundStartPrivileges;+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_forStart()I+]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord; -HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_legacy()I -HSPLcom/android/server/am/ServiceRecord;->getTracker()Lcom/android/internal/app/procstats/ServiceState;+]Lcom/android/internal/app/procstats/ServiceState;Lcom/android/internal/app/procstats/ServiceState;]Lcom/android/server/am/ProcessStatsService;Lcom/android/server/am/ProcessStatsService; -HSPLcom/android/server/am/ServiceRecord;->hasAutoCreateConnections()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_forStart()I +HSPLcom/android/server/am/ServiceRecord;->getFgsAllowWiu_new()I +HSPLcom/android/server/am/ServiceRecord;->getTracker()Lcom/android/internal/app/procstats/ServiceState; +HSPLcom/android/server/am/ServiceRecord;->hasAutoCreateConnections()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/am/ServiceRecord;->isShortFgs()Z -HSPLcom/android/server/am/ServiceRecord;->postNotification(Z)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; +HSPLcom/android/server/am/ServiceRecord;->postNotification(Z)V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ServiceRecord;->removeConnection(Landroid/os/IBinder;)V -HSPLcom/android/server/am/ServiceRecord;->retrieveAppBindingLocked(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/AppBindRecord;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/am/ServiceRecord;->setProcess(Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;)V+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/am/ConnectionRecord;Lcom/android/server/am/ConnectionRecord;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessServiceRecord;Lcom/android/server/am/ProcessServiceRecord;]Lcom/android/server/am/ServiceRecord;Lcom/android/server/am/ServiceRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/ServiceRecord;->toString()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/ServiceRecord;->retrieveAppBindingLocked(Landroid/content/Intent;Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;)Lcom/android/server/am/AppBindRecord; +HSPLcom/android/server/am/ServiceRecord;->setProcess(Lcom/android/server/am/ProcessRecord;Landroid/app/IApplicationThread;ILcom/android/server/am/UidRecord;)V+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/ServiceRecord;->toString()Ljava/lang/String; HSPLcom/android/server/am/ServiceRecord;->updateFgsHasNotificationPermission()V -HSPLcom/android/server/am/ServiceRecord;->updateKeepWarmLocked()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; +HSPLcom/android/server/am/ServiceRecord;->updateKeepWarmLocked()V+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/ServiceRecord;->updateOomAdjSeq()V -HSPLcom/android/server/am/ServiceRecord;->updateProcessStateOnRequest()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord;]Lcom/android/server/am/ProcessStateRecord;Lcom/android/server/am/ProcessStateRecord; +HSPLcom/android/server/am/ServiceRecord;->updateProcessStateOnRequest()V+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/ServiceRecord;->useNewWiuLogic_forStart()Z HSPLcom/android/server/am/ServiceRecord;->wasOomAdjUpdated()Z HSPLcom/android/server/am/UidObserverController$$ExternalSyntheticLambda0;->run()V+]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController; HSPLcom/android/server/am/UidObserverController$ChangeRecord;->copyTo(Lcom/android/server/am/UidObserverController$ChangeRecord;)V -HSPLcom/android/server/am/UidObserverController;->dispatchUidsChanged()V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Lcom/android/server/am/ActiveUids;Lcom/android/server/am/ActiveUids;]Lcom/android/server/am/UidObserverController$ChangeRecord;Lcom/android/server/am/UidObserverController$ChangeRecord;]Lcom/android/server/am/UidObserverController;Lcom/android/server/am/UidObserverController;]Lcom/android/server/am/UidRecord;Lcom/android/server/am/UidRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/UidObserverController;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/UidObserverController$UidObserverRegistration;I)V+]Landroid/app/IUidObserver;megamorphic_types]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/am/UidObserverController$UidObserverRegistration;Lcom/android/server/am/UidObserverController$UidObserverRegistration; -HSPLcom/android/server/am/UidObserverController;->enqueueUidChange(Lcom/android/server/am/UidObserverController$ChangeRecord;IIIIJIZ)I+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$UiHandler;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/am/UidProcessMap;->get(ILjava/lang/String;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/am/UidObserverController;->dispatchUidsChanged()V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/UidObserverController;->dispatchUidsChangedForObserver(Landroid/app/IUidObserver;Lcom/android/server/am/UidObserverController$UidObserverRegistration;I)V+]Landroid/app/IUidObserver;megamorphic_types]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/am/UidObserverController;->enqueueUidChange(Lcom/android/server/am/UidObserverController$ChangeRecord;IIIIJIZ)I+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/am/UidProcessMap;->get(ILjava/lang/String;)Ljava/lang/Object;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/am/UidRecord;->(ILcom/android/server/am/ActivityManagerService;)V -HPLcom/android/server/am/UidRecord;->areAllProcessesFrozen(Lcom/android/server/am/ProcessRecord;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessCachedOptimizerRecord;Lcom/android/server/am/ProcessCachedOptimizerRecord; -HSPLcom/android/server/am/UidRecord;->getMinProcAdj()I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; -HSPLcom/android/server/am/UserController$Injector;->checkCallingPermission(Ljava/lang/String;)I+]Lcom/android/server/am/ActivityManagerService;Lcom/android/server/am/ActivityManagerService; +HPLcom/android/server/am/UidRecord;->areAllProcessesFrozen(Lcom/android/server/am/ProcessRecord;)Z +HSPLcom/android/server/am/UidRecord;->forEachProcess(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;Lcom/android/server/am/ActiveUids$$ExternalSyntheticLambda0;,Lcom/android/server/am/ProcessList$$ExternalSyntheticLambda3; +HSPLcom/android/server/am/UidRecord;->getMinProcAdj()I+]Lcom/android/server/am/ProcessRecord;Lcom/android/server/am/ProcessRecord; HSPLcom/android/server/am/UserController$Injector;->getUserManager()Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/am/UserController;->checkGetCurrentUserPermissions()V+]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector; HSPLcom/android/server/am/UserController;->exists(I)Z+]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/am/UserController;->getCurrentUserId()I -HSPLcom/android/server/am/UserController;->getCurrentUserIdChecked()I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/UserController;->getLastUserUnlockingUptime()J HSPLcom/android/server/am/UserController;->getStartedUserArray()[I HSPLcom/android/server/am/UserController;->getStartedUserState(I)Lcom/android/server/am/UserState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/UserController;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/am/UserController;->handleIncomingUser(IIIZILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/am/UserController$Injector;Lcom/android/server/am/UserController$Injector;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/UserController;->hasStartedUserState(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/am/UserController;->isSameProfileGroup(II)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/am/UserController;->isUserOrItsParentRunning(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/UserController;->isUserRunning(II)Z+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; HSPLcom/android/server/am/UserController;->unsafeConvertIncomingUser(I)I+]Lcom/android/server/am/UserController;Lcom/android/server/am/UserController; @@ -1133,436 +1155,469 @@ HSPLcom/android/server/app/GameManagerService;->getConfig(Ljava/lang/String;I)Lc HSPLcom/android/server/app/GameManagerService;->getGameModeFromSettingsUnchecked(Ljava/lang/String;I)I+]Lcom/android/server/app/GameManagerSettings;Lcom/android/server/app/GameManagerSettings; HSPLcom/android/server/apphibernation/AppHibernationService;->checkUserStatesExist(ILjava/lang/String;Z)Z+]Landroid/os/UserManager;Landroid/os/UserManager;]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/apphibernation/AppHibernationService;->handleIncomingUser(ILjava/lang/String;)I+]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService; -HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingForUser(Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Map;Landroid/util/ArrayMap; +HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingForUser(Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Landroid/util/ArrayMap; HSPLcom/android/server/apphibernation/AppHibernationService;->isHibernatingGlobally(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/Map;Landroid/util/ArrayMap; -HPLcom/android/server/apphibernation/AppHibernationService;->lambda$new$6(ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService; -HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingForUser(Ljava/lang/String;IZ)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Lcom/android/server/apphibernation/AppHibernationService;Lcom/android/server/apphibernation/AppHibernationService;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; -HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingGlobally(Ljava/lang/String;Z)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/SystemService;Lcom/android/server/apphibernation/AppHibernationService;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; +HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingForUser(Ljava/lang/String;IZ)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; +HPLcom/android/server/apphibernation/AppHibernationService;->setHibernatingGlobally(Ljava/lang/String;Z)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/apphibernation/HibernationStateDiskStore;Lcom/android/server/apphibernation/HibernationStateDiskStore;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getForegroundOps(ILjava/lang/String;)Landroid/util/SparseBooleanArray;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/permission/access/appop/AppOpService; -HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getPackageMode(Ljava/lang/String;II)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceImpl;,Lcom/android/server/permission/access/appop/AppOpService; -HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getUidMode(ILjava/lang/String;I)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceImpl;,Lcom/android/server/permission/access/appop/AppOpService; -HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;II)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;IILjava/lang/String;Ljava/lang/String;Z)Z+]Landroid/os/PackageTagsList;Landroid/os/PackageTagsList;]Lcom/android/server/appop/AppOpsRestrictionsImpl;Lcom/android/server/appop/AppOpsRestrictionsImpl; -HPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda13;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getPackageMode(Ljava/lang/String;II)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/permission/access/appop/AppOpService; +HSPLcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;->getUidMode(ILjava/lang/String;I)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/permission/access/appop/AppOpService; +HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;II)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/appop/AppOpsRestrictionsImpl;->getUserRestriction(Ljava/lang/Object;IILjava/lang/String;Ljava/lang/String;Z)Z+]Lcom/android/server/appop/AppOpsRestrictionsImpl;Lcom/android/server/appop/AppOpsRestrictionsImpl; +HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda11;->execute(Ljava/lang/Runnable;)V +HPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda13;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V +HSPLcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda7;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V +HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V +HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->checkOperation(IILjava/lang/String;Ljava/lang/String;IZ)I+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy; HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy; HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->noteOperation(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy; HSPLcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Landroid/app/AppOpsManagerInternal$CheckOpsDelegate;Lcom/android/server/policy/AppOpsPolicy; HSPLcom/android/server/appop/AppOpsService$ClientUserRestrictionState;->hasRestriction(ILjava/lang/String;Ljava/lang/String;IZ)Z+]Lcom/android/server/appop/AppOpsRestrictions;Lcom/android/server/appop/AppOpsRestrictionsImpl; -HSPLcom/android/server/appop/AppOpsService$Op;->createEntryLocked(Ljava/lang/String;)Landroid/app/AppOpsManager$OpEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp; -HSPLcom/android/server/appop/AppOpsService$Op;->getOrCreateAttribution(Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AttributedOp;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/appop/AppOpsService$Op;->isRunning()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp; +HSPLcom/android/server/appop/AppOpsService$Op;->(Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;II)V +HSPLcom/android/server/appop/AppOpsService$Op;->createEntryLocked(Ljava/lang/String;)Landroid/app/AppOpsManager$OpEntry;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +HSPLcom/android/server/appop/AppOpsService$Op;->getOrCreateAttribution(Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AttributedOp; +HSPLcom/android/server/appop/AppOpsService$Op;->isRunning()Z HSPLcom/android/server/appop/AppOpsService$UidState;->evalMode(II)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; HSPLcom/android/server/appop/AppOpsService$UidState;->getState()I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsService;->checkOperation(IILjava/lang/String;)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; -HSPLcom/android/server/appop/AppOpsService;->checkOperationImpl(IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->checkOperationRaw(IILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; -HSPLcom/android/server/appop/AppOpsService;->checkOperationUnchecked(IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AppOpsService$UidState;Lcom/android/server/appop/AppOpsService$UidState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->checkPackage(ILjava/lang/String;)I+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->collectAsyncNotedOp(ILjava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)V+]Landroid/os/RemoteCallbackList;Lcom/android/server/appop/AppOpsService$8;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/appop/AppOpsService;->collectOps(Lcom/android/server/appop/AppOpsService$Ops;[ILjava/lang/String;)Ljava/util/ArrayList;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseArray;Lcom/android/server/appop/AppOpsService$Ops;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/appop/AppOpsService;->checkOperation(IILjava/lang/String;)I +HSPLcom/android/server/appop/AppOpsService;->checkOperationImpl(IILjava/lang/String;Ljava/lang/String;IZ)I +HSPLcom/android/server/appop/AppOpsService;->checkOperationRaw(IILjava/lang/String;Ljava/lang/String;)I +HSPLcom/android/server/appop/AppOpsService;->checkOperationUnchecked(IILjava/lang/String;Ljava/lang/String;IZ)I+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +HSPLcom/android/server/appop/AppOpsService;->checkPackage(ILjava/lang/String;)I +HSPLcom/android/server/appop/AppOpsService;->collectAsyncNotedOp(ILjava/lang/String;ILjava/lang/String;ILjava/lang/String;Z)V+]Landroid/os/RemoteCallbackList;Lcom/android/server/appop/AppOpsService$8;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/appop/AppOpsService;->collectOps(Lcom/android/server/appop/AppOpsService$Ops;[ILjava/lang/String;)Ljava/util/ArrayList;+]Landroid/content/Context;Landroid/app/ContextImpl; +HPLcom/android/server/appop/AppOpsService;->doForAllAttributedOpsInUidLocked(ILjava/util/function/Consumer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda17;,Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda18; HSPLcom/android/server/appop/AppOpsService;->enforceManageAppOpsModes(III)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/appop/AppOpsService;->filterAppAccessUnlocked(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/appop/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; -HSPLcom/android/server/appop/AppOpsService;->finishOperationImpl(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->finishOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/appop/AppOpsService;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;)V +HSPLcom/android/server/appop/AppOpsService;->finishOperationImpl(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V +HSPLcom/android/server/appop/AppOpsService;->finishOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;I)V HSPLcom/android/server/appop/AppOpsService;->getAsyncNotedOpsKey(Ljava/lang/String;I)Landroid/util/Pair; HSPLcom/android/server/appop/AppOpsService;->getBypassforPackage(Lcom/android/server/pm/pkg/PackageState;)Landroid/app/AppOpsManager$RestrictionBypass;+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Op;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->getOpLocked(Lcom/android/server/appop/AppOpsService$Ops;IIZ)Lcom/android/server/appop/AppOpsService$Op;+]Landroid/util/SparseArray;Lcom/android/server/appop/AppOpsService$Ops;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->getOpsLocked(ILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Ops;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/appop/AppOpsService;->getOpLocked(IILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Op; +HSPLcom/android/server/appop/AppOpsService;->getOpLocked(Lcom/android/server/appop/AppOpsService$Ops;IIZ)Lcom/android/server/appop/AppOpsService$Op; +HSPLcom/android/server/appop/AppOpsService;->getOpsLocked(ILjava/lang/String;Ljava/lang/String;ZLandroid/app/AppOpsManager$RestrictionBypass;Z)Lcom/android/server/appop/AppOpsService$Ops; HSPLcom/android/server/appop/AppOpsService;->getPackageManagerInternal()Landroid/content/pm/PackageManagerInternal; -HSPLcom/android/server/appop/AppOpsService;->getPackagesForOpsForDevice([ILjava/lang/String;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/appop/AppOpsService;->getPersistentId(I)Ljava/lang/String;+]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService; +HSPLcom/android/server/appop/AppOpsService;->getPackagesForOpsForDevice([ILjava/lang/String;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/appop/AppOpsService;->getPersistentId(I)Ljava/lang/String; HSPLcom/android/server/appop/AppOpsService;->getUidStateLocked(IZ)Lcom/android/server/appop/AppOpsService$UidState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/appop/AppOpsService;->getUidStateTracker()Lcom/android/server/appop/AppOpsUidStateTracker; -HSPLcom/android/server/appop/AppOpsService;->isAttributionInPackage(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z+]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; -HSPLcom/android/server/appop/AppOpsService;->isIncomingPackageValid(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/appop/AppOpsService;->isAttributionInPackage(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z+]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; +HSPLcom/android/server/appop/AppOpsService;->isIncomingPackageValid(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HSPLcom/android/server/appop/AppOpsService;->isOpAllowedForUid(I)Z HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedDueToSuspend(ILjava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$RestrictionBypass;Z)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AppOpsService$ClientGlobalRestrictionState;Lcom/android/server/appop/AppOpsService$ClientGlobalRestrictionState;]Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;Lcom/android/server/appop/AppOpsService$ClientUserRestrictionState;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/appop/AppOpsService;->isOpRestrictedLocked(IILjava/lang/String;Ljava/lang/String;ILandroid/app/AppOpsManager$RestrictionBypass;Z)Z HSPLcom/android/server/appop/AppOpsService;->isSpecialPackage(ILjava/lang/String;)Z HSPLcom/android/server/appop/AppOpsService;->isValidVirtualDeviceId(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService; -HSPLcom/android/server/appop/AppOpsService;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; -HSPLcom/android/server/appop/AppOpsService;->noteOperationImpl(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->notifyOpChanged(Lcom/android/server/appop/OnOpModeChangedListener;IILjava/lang/String;Ljava/lang/String;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; -HSPLcom/android/server/appop/AppOpsService;->notifyOpChangedForAllPkgsInUid(IIZLjava/lang/String;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/IAppOpsCallback;Lcom/android/server/policy/PermissionPolicyService$2;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; -HPLcom/android/server/appop/AppOpsService;->notifyOpChecked(Landroid/util/ArraySet;IILjava/lang/String;Ljava/lang/String;III)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/app/IAppOpsNotedCallback;Landroid/app/AppOpsManager$5;,Lcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->onUidStateChanged(IIZ)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;,Lcom/android/server/appop/AppOpsService$Ops;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; +HSPLcom/android/server/appop/AppOpsService;->noteOperation(IILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp; +HSPLcom/android/server/appop/AppOpsService;->noteOperationImpl(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp; +HSPLcom/android/server/appop/AppOpsService;->noteOperationUnchecked(IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;IIZLjava/lang/String;Z)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +HSPLcom/android/server/appop/AppOpsService;->notifyOpChanged(Lcom/android/server/appop/OnOpModeChangedListener;IILjava/lang/String;Ljava/lang/String;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; +HSPLcom/android/server/appop/AppOpsService;->notifyOpChangedForAllPkgsInUid(IIZLjava/lang/String;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/IAppOpsCallback;Lcom/android/server/policy/PermissionPolicyService$2;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; +HPLcom/android/server/appop/AppOpsService;->notifyOpChecked(Landroid/util/ArraySet;IILjava/lang/String;Ljava/lang/String;III)V+]Lcom/android/internal/app/IAppOpsNotedCallback;Landroid/app/AppOpsManager$5;,Lcom/android/internal/app/IAppOpsNotedCallback$Stub$Proxy; +HSPLcom/android/server/appop/AppOpsService;->onUidStateChanged(IIZ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/OnOpModeChangedListener;Lcom/android/server/appop/AppOpsService$ModeCallback; HSPLcom/android/server/appop/AppOpsService;->readAttributionOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$Op;Ljava/lang/String;)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; HSPLcom/android/server/appop/AppOpsService;->readOp(Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/server/appop/AppOpsService$UidState;Ljava/lang/String;)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; -HSPLcom/android/server/appop/AppOpsService;->reportRuntimeAppOpAccessMessageAsyncLocked(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->resolveUid(Ljava/lang/String;)I+]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/appop/AppOpsService;->scheduleOpActiveChangedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IZII)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/appop/AppOpsService;->scheduleOpNotedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;III)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/appop/AppOpsService;->scheduleOpStartedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IIIIII)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/appop/AppOpsService;->reportRuntimeAppOpAccessMessageAsyncLocked(ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)V +HSPLcom/android/server/appop/AppOpsService;->resolveUid(Ljava/lang/String;)I +HSPLcom/android/server/appop/AppOpsService;->scheduleOpActiveChangedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IZII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/appop/AppOpsService;->scheduleOpNotedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;III)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/appop/AppOpsService;->scheduleOpStartedIfNeededLocked(IILjava/lang/String;Ljava/lang/String;IIIIII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/appop/AppOpsService;->scheduleWriteLocked()V -HSPLcom/android/server/appop/AppOpsService;->setUidMode(IIILcom/android/internal/app/IAppOpsCallback;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/appop/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; +HSPLcom/android/server/appop/AppOpsService;->setMode(IILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +HPLcom/android/server/appop/AppOpsService;->setUidMode(IIILcom/android/internal/app/IAppOpsCallback;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +HSPLcom/android/server/appop/AppOpsService;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp; HSPLcom/android/server/appop/AppOpsService;->startOperationImpl(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->startWatchingModeWithFlags(ILjava/lang/String;ILcom/android/internal/app/IAppOpsCallback;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/app/IAppOpsCallback;megamorphic_types -HSPLcom/android/server/appop/AppOpsService;->switchPackageIfBootTimeOrRarelyUsedLocked(Ljava/lang/String;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/util/concurrent/ThreadLocalRandom;Ljava/util/concurrent/ThreadLocalRandom; -HSPLcom/android/server/appop/AppOpsService;->updatePermissionRevokedCompat(III)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/appop/AppOpsService;->startOperationUnchecked(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IILjava/lang/String;Ljava/lang/String;IIZZLjava/lang/String;ZII)Landroid/app/SyncNotedAppOp;+]Lcom/android/server/appop/AppOpsCheckingServiceInterface;Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/appop/AppOpsService;->switchPackageIfBootTimeOrRarelyUsedLocked(Ljava/lang/String;)V+]Ljava/util/concurrent/ThreadLocalRandom;Ljava/util/concurrent/ThreadLocalRandom; +HPLcom/android/server/appop/AppOpsService;->updatePermissionRevokedCompat(III)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/appop/AppOpsService;->updateUidProcState(III)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AppOpsUidStateTracker;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$PackageVerificationResult;+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; -HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lcom/android/server/appop/AppOpsService$PackageVerificationResult;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/compat/IPlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/appop/AppOpsService$PackageVerificationResult; +HSPLcom/android/server/appop/AppOpsService;->verifyAndGetBypass(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lcom/android/server/appop/AppOpsService$PackageVerificationResult;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/compat/IPlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/appop/AppOpsService;->verifyIncomingOp(I)V+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/server/appop/AppOpsService;->verifyIncomingUid(I)V+]Landroid/content/Context;Landroid/app/ContextImpl; -HPLcom/android/server/appop/AppOpsService;->writeRecentAccesses()V+]Landroid/app/AppOpsManager$AttributedOpEntry;Landroid/app/AppOpsManager$AttributedOpEntry;]Landroid/app/AppOpsManager$OpEntry;Landroid/app/AppOpsManager$OpEntry;]Landroid/app/AppOpsManager$OpEventProxyInfo;Landroid/app/AppOpsManager$OpEventProxyInfo;]Landroid/app/AppOpsManager$PackageOps;Landroid/app/AppOpsManager$PackageOps;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTracker$UidStateChangedCallback;Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda10;,Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda12;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; +HPLcom/android/server/appop/AppOpsService;->writeRecentAccesses()V+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;)V +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTracker$UidStateChangedCallback;Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda12; HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1$$ExternalSyntheticLambda0;->run()V -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1;->execute(Ljava/lang/Runnable;)V+]Landroid/os/Handler;Lcom/android/server/am/ActivityManagerService$MainHandler; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1;->executeDelayed(Ljava/lang/Runnable;J)V -HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1;->execute(Ljava/lang/Runnable;)V +HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$1;->executeDelayed(Ljava/lang/Runnable;J)V HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog; HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logCommitUidState(IIIZZ)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1; HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logCommitUidStateAsync(JIIIZZ)V HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logEvalForegroundMode(IIIII)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1; -HPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logEvalForegroundModeAsync(JIIIII)V HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logUpdateUidProcState(III)V+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1; HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;->logUpdateUidProcStateAsync(JIII)V -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->commitUidPendingState(I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Ljava/util/concurrent/Executor;Landroid/os/HandlerExecutor; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->commitUidPendingState(I)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Ljava/util/concurrent/Executor;Landroid/os/HandlerExecutor; HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->evalMode(III)I+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->evalModeInternal(IIII)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->getUidState(I)I+]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->getUidStateLocked(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->updateUidPendingStateIfNeededLocked(I)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; -HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->updateUidProcState(III)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl;Lcom/android/server/appop/AppOpsUidStateTrackerImpl; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->getUidState(I)I +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->getUidStateLocked(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->updateUidPendingStateIfNeededLocked(I)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1; +HSPLcom/android/server/appop/AppOpsUidStateTrackerImpl;->updateUidProcState(III)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$DelayableExecutor;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$1;]Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog;Lcom/android/server/appop/AppOpsUidStateTrackerImpl$EventLog; HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEvent;->reinit(JJLandroid/os/IBinder;Ljava/lang/String;ILjava/lang/Runnable;IILandroid/app/AppOpsManager$OpEventProxyInfo;IILandroid/util/Pools$Pool;)V+]Landroid/os/IBinder;Landroid/os/Binder;,Landroid/os/BinderProxy;]Landroid/util/Pools$Pool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool; -HPLcom/android/server/appop/AttributedOp;->createAttributedOpEntryLocked()Landroid/app/AppOpsManager$AttributedOpEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp; +HSPLcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;->acquire(JJLandroid/os/IBinder;Ljava/lang/String;ILjava/lang/Runnable;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIII)Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;+]Landroid/util/Pools$SimplePool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool; +HSPLcom/android/server/appop/AttributedOp;->accessed(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V +HSPLcom/android/server/appop/AttributedOp;->accessed(JJILjava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool;Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool; +HPLcom/android/server/appop/AttributedOp;->createAttributedOpEntryLocked()Landroid/app/AppOpsManager$AttributedOpEntry;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; HPLcom/android/server/appop/AttributedOp;->deepClone(Landroid/util/LongSparseArray;)Landroid/util/LongSparseArray;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; -HSPLcom/android/server/appop/AttributedOp;->finishOrPause(Landroid/os/IBinder;ZZ)V+]Landroid/app/AppOpsManager$NoteOpEvent;Landroid/app/AppOpsManager$NoteOpEvent;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/Pools$SimplePool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AppOpsService$Op;Lcom/android/server/appop/AppOpsService$Op;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HSPLcom/android/server/appop/AttributedOp;->isRunning()Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/appop/AttributedOp;->onUidStateChanged(I)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;Lcom/android/server/appop/AttributedOp$InProgressStartOpEvent;]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/appop/AttributedOp;->rejected(II)V+]Lcom/android/server/appop/AttributedOp;Lcom/android/server/appop/AttributedOp;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HSPLcom/android/server/appop/AttributedOp;->rejected(JII)V+]Landroid/app/AppOpsManager$NoteOpEvent;Landroid/app/AppOpsManager$NoteOpEvent;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; -HPLcom/android/server/appop/DiscreteRegistry$DiscreteOp;->addDiscreteAccess(Ljava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;Lcom/android/server/appop/DiscreteRegistry$DiscreteOp;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/appop/AttributedOp;->finishOrPause(Landroid/os/IBinder;ZZ)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/Pools$SimplePool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService; +HSPLcom/android/server/appop/AttributedOp;->isRunning()Z +HSPLcom/android/server/appop/AttributedOp;->onUidStateChanged(I)V +HSPLcom/android/server/appop/AttributedOp;->rejected(II)V +HSPLcom/android/server/appop/AttributedOp;->rejected(JII)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; +HSPLcom/android/server/appop/AttributedOp;->startedOrPaused(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIIIZZ)V+]Lcom/android/server/appop/AppOpsService;Lcom/android/server/appop/AppOpsService;]Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool;Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool; HSPLcom/android/server/appop/DiscreteRegistry;->isDiscreteOp(II)Z -HSPLcom/android/server/appop/DiscreteRegistry;->recordDiscreteAccess(ILjava/lang/String;ILjava/lang/String;IIJJII)V+]Lcom/android/server/appop/DiscreteRegistry$DiscreteOps;Lcom/android/server/appop/DiscreteRegistry$DiscreteOps; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->handlePersistHistoricalOpsRecursiveDLocked(Ljava/io/File;Ljava/io/File;Ljava/util/List;Ljava/util/Set;I)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;,Ljava/util/LinkedList;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readStateDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;ILcom/android/modules/utils/TypedXmlPullParser;ID)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$AttributedHistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$AttributedHistoricalOps;Landroid/app/AppOpsManager$AttributedHistoricalOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOp;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalPackageOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalPackageOps;Landroid/app/AppOpsManager$HistoricalPackageOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalUidOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalUidOps;Landroid/app/AppOpsManager$HistoricalUidOps;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appop/HistoricalRegistry$Persistence;Lcom/android/server/appop/HistoricalRegistry$Persistence; -HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeStateOnLocked(Landroid/app/AppOpsManager$HistoricalOp;JLcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/AppOpsManager$HistoricalOp;Landroid/app/AppOpsManager$HistoricalOp;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; -HSPLcom/android/server/appop/HistoricalRegistry;->getUpdatedPendingHistoricalOpsMLocked(J)Landroid/app/AppOpsManager$HistoricalOps;+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HSPLcom/android/server/appop/HistoricalRegistry;->increaseOpAccessDuration(IILjava/lang/String;Ljava/lang/String;IIJJII)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/DiscreteRegistry;Lcom/android/server/appop/DiscreteRegistry;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpAccessedCount(IILjava/lang/String;Ljava/lang/String;IIJII)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/DiscreteRegistry;Lcom/android/server/appop/DiscreteRegistry;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpRejected(IILjava/lang/String;Ljava/lang/String;II)V+]Landroid/app/AppOpsManager$HistoricalOps;Landroid/app/AppOpsManager$HistoricalOps;]Lcom/android/server/appop/HistoricalRegistry;Lcom/android/server/appop/HistoricalRegistry; -HPLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->equals(Ljava/lang/Object;)Z+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/lang/Object;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId; +HSPLcom/android/server/appop/DiscreteRegistry;->recordDiscreteAccess(ILjava/lang/String;Ljava/lang/String;ILjava/lang/String;IIJJIII)V +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->handlePersistHistoricalOpsRecursiveDLocked(Ljava/io/File;Ljava/io/File;Ljava/util/List;Ljava/util/Set;I)V+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;,Ljava/util/LinkedList;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;Lcom/android/modules/utils/TypedXmlPullParser;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readStateDLocked(Landroid/app/AppOpsManager$HistoricalOps;ILjava/lang/String;Ljava/lang/String;ILcom/android/modules/utils/TypedXmlPullParser;ID)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->readeHistoricalOpsDLocked(Lcom/android/modules/utils/TypedXmlPullParser;ILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;IJJI[J)Landroid/app/AppOpsManager$HistoricalOps;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalAttributionOpsDLocked(Landroid/app/AppOpsManager$AttributedHistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOp;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalOpDLocked(Landroid/app/AppOpsManager$HistoricalOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalPackageOpsDLocked(Landroid/app/AppOpsManager$HistoricalPackageOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeHistoricalUidOpsDLocked(Landroid/app/AppOpsManager$HistoricalUidOps;Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appop/HistoricalRegistry$Persistence;->writeStateOnLocked(Landroid/app/AppOpsManager$HistoricalOp;JLcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HSPLcom/android/server/appop/HistoricalRegistry;->getUpdatedPendingHistoricalOpsMLocked(J)Landroid/app/AppOpsManager$HistoricalOps; +HSPLcom/android/server/appop/HistoricalRegistry;->increaseOpAccessDuration(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIJJIII)V +HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpAccessedCount(IILjava/lang/String;Ljava/lang/String;Ljava/lang/String;IIJIII)V +HSPLcom/android/server/appop/HistoricalRegistry;->incrementOpRejected(IILjava/lang/String;Ljava/lang/String;II)V +HPLcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;->equals(Ljava/lang/Object;)Z HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getEnabledGroupProfileIds(I)[I+]Landroid/os/UserManager;Landroid/os/UserManager; HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getGroupParent(I)I -HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/os/UserManager;Landroid/os/UserManager; -HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(IZ)V+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;]Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl; -HPLcom/android/server/appwidget/AppWidgetServiceImpl;->getAppWidgetIds(Landroid/content/ComponentName;)[I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;]Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl; -HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->getInstalledProvidersForProfile(IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Landroid/appwidget/AppWidgetProviderInfo;Landroid/appwidget/AppWidgetProviderInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;]Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;Lcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;]Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->isBoundWidgetPackage(Ljava/lang/String;I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithLockedParent(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/appwidget/AppWidgetServiceImpl;Lcom/android/server/appwidget/AppWidgetServiceImpl; -HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;+]Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/appwidget/AppWidgetServiceImpl;->serializeProvider(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Z)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer; -HPLcom/android/server/appwidget/AppWidgetServiceImpl;->writeProfileStateToStreamLocked(Ljava/io/OutputStream;I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;Lcom/android/server/appwidget/AppWidgetServiceImpl$Host;]Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HPLcom/android/server/appwidget/AppWidgetXmlUtil;->writeAppWidgetProviderInfoLocked(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/appwidget/AppWidgetProviderInfo;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/appwidget/AppWidgetServiceImpl$SecurityPolicy;->getProfileParent(I)I+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager; +HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->ensureGroupStateLoadedLocked(IZ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HPLcom/android/server/appwidget/AppWidgetServiceImpl;->getAppWidgetIds(Landroid/content/ComponentName;)[I +HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->getInstalledProvidersForProfile(IILjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/appwidget/AppWidgetServiceImpl;->isBoundWidgetPackage(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/appwidget/AppWidgetServiceImpl;->isProfileWithLockedParent(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager; +HPLcom/android/server/appwidget/AppWidgetServiceImpl;->lookupProviderLocked(Lcom/android/server/appwidget/AppWidgetServiceImpl$ProviderId;)Lcom/android/server/appwidget/AppWidgetServiceImpl$Provider;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/appwidget/AppWidgetXmlUtil;->writeAppWidgetProviderInfoLocked(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/appwidget/AppWidgetProviderInfo;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/audio/AudioService$VolumeStreamState$1;->record(Ljava/lang/String;II)V+]Landroid/media/MediaMetrics$Item;Landroid/media/MediaMetrics$Item; -HSPLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)Ljava/util/Set;+]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Lcom/android/server/audio/SystemServerAdapter;Lcom/android/server/audio/SystemServerAdapter;]Ljava/lang/Object;Ljava/util/TreeSet;]Ljava/util/Set;Ljava/util/TreeSet; +HSPLcom/android/server/audio/AudioService$VolumeStreamState;->observeDevicesForStream_syncVSS(Z)Ljava/util/Set;+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService;]Lcom/android/server/audio/SystemServerAdapter;Lcom/android/server/audio/SystemServerAdapter;]Ljava/util/Set;Ljava/util/TreeSet; HSPLcom/android/server/audio/AudioService;->getDeviceSetForStream(I)Ljava/util/Set;+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService; -HSPLcom/android/server/audio/AudioService;->getDevicesForAttributesInt(Landroid/media/AudioAttributes;Z)Ljava/util/ArrayList;+]Lcom/android/server/audio/AudioSystemAdapter;Lcom/android/server/audio/AudioSystemAdapter; -HPLcom/android/server/audio/AudioService;->getStreamVolume(II)I+]Lcom/android/server/audio/AudioService$VolumeStreamState;Lcom/android/server/audio/AudioService$VolumeStreamState;]Lcom/android/server/audio/AudioService;Lcom/android/server/audio/AudioService; -HSPLcom/android/server/audio/AudioService;->selectOneAudioDevice(Ljava/util/Set;)I+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Iterator;Ljava/util/TreeMap$KeyIterator;]Ljava/util/Set;Ljava/util/TreeSet; +HSPLcom/android/server/audio/AudioService;->selectOneAudioDevice(Ljava/util/Set;)I+]Ljava/util/Iterator;Ljava/util/TreeMap$KeyIterator;]Ljava/util/Set;Ljava/util/TreeSet; HSPLcom/android/server/audio/AudioSystemAdapter;->getDevicesForAttributesImpl(Landroid/media/AudioAttributes;Z)Ljava/util/ArrayList;+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/autofill/AutofillManagerService$LocalService;->getAutofillOptions(Ljava/lang/String;JI)Landroid/content/AutofillOptions; HSPLcom/android/server/autofill/AutofillManagerService$LocalService;->injectDisableAppInfo(Landroid/content/AutofillOptions;ILjava/lang/String;)V +HPLcom/android/server/backup/BackupManagerService;->getServiceForUserIfCallerHasPermission(ILjava/lang/String;)Lcom/android/server/backup/UserBackupManagerService;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService; HSPLcom/android/server/backup/BackupManagerService;->isUserReadyForBackup(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/backup/BackupManagerService;Lcom/android/server/backup/BackupManagerService; -HPLcom/android/server/backup/UserBackupManagerService;->dataChangedTargets(Ljava/lang/String;)Ljava/util/HashSet;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/backup/utils/SparseArrayUtils;->union(Landroid/util/SparseArray;)Ljava/util/HashSet;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/HashSet;Ljava/util/HashSet; +HPLcom/android/server/backup/TransportManager;->updateTransportAttributes(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/CharSequence;)V+]Ljava/util/Map;Landroid/util/ArrayMap; +HPLcom/android/server/backup/UserBackupManagerService;->isAppEligibleForBackup(Ljava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/TransportManager;]Lcom/android/server/backup/utils/BackupEligibilityRules;Lcom/android/server/backup/utils/BackupEligibilityRules; +HPLcom/android/server/backup/UserBackupManagerService;->updateTransportAttributes(ILandroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/CharSequence;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/backup/TransportManager;Lcom/android/server/backup/TransportManager; +HPLcom/android/server/backup/transport/TransportConnection;->(ILandroid/content/Context;Lcom/android/server/backup/transport/TransportStats;Landroid/content/Intent;Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Landroid/os/Handler;)V +HPLcom/android/server/backup/transport/TransportConnection;->checkStateIntegrityLocked()V+]Ljava/util/Map;Landroid/util/ArrayMap; +HPLcom/android/server/backup/transport/TransportConnection;->connect(Ljava/lang/String;)Lcom/android/server/backup/transport/BackupTransportClient;+]Lcom/android/server/backup/transport/TransportConnection;Lcom/android/server/backup/transport/TransportConnection;]Lcom/android/server/backup/transport/TransportStats;Lcom/android/server/backup/transport/TransportStats; +HPLcom/android/server/backup/transport/TransportConnection;->saveLogEntry(Ljava/lang/String;)V+]Ljava/util/List;Ljava/util/LinkedList; +HPLcom/android/server/backup/transport/TransportConnection;->setStateLocked(ILcom/android/server/backup/transport/BackupTransportClient;)V +HPLcom/android/server/backup/transport/TransportConnection;->toString()Ljava/lang/String; +HPLcom/android/server/backup/transport/TransportConnection;->unbind(Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl; +HPLcom/android/server/backup/transport/TransportConnectionManager;->disposeOfTransportClient(Lcom/android/server/backup/transport/TransportConnection;Ljava/lang/String;)V+]Lcom/android/server/backup/transport/TransportConnection;Lcom/android/server/backup/transport/TransportConnection;]Ljava/util/Map;Ljava/util/WeakHashMap; +HPLcom/android/server/backup/transport/TransportConnectionManager;->getTransportClient(Landroid/content/ComponentName;Ljava/lang/String;Landroid/content/Intent;)Lcom/android/server/backup/transport/TransportConnection;+]Ljava/util/Map;Ljava/util/WeakHashMap; +HPLcom/android/server/backup/transport/TransportUtils;->formatMessage(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; HPLcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter;->augmentStatsForPackageForUser(Landroid/content/pm/PackageStats;Ljava/lang/String;Landroid/os/UserHandle;Z)V -HPLcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter;->augmentStatsForUid(Landroid/content/pm/PackageStats;IZ)V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong; -HPLcom/android/server/blob/BlobStoreManagerService;->forEachBlobLocked(Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;megamorphic_types -HPLcom/android/server/blob/BlobStoreManagerService;->forEachSessionInUser(Ljava/util/function/Consumer;I)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/blob/BlobStoreManagerService;Lcom/android/server/blob/BlobStoreManagerService;]Ljava/util/function/Consumer;Lcom/android/server/blob/BlobStoreManagerService$$ExternalSyntheticLambda16;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda0;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda2;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda4; +HPLcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter;->augmentStatsForUid(Landroid/content/pm/PackageStats;IZ)V +HPLcom/android/server/blob/BlobStoreManagerService;->forEachBlobLocked(Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;megamorphic_types +HPLcom/android/server/blob/BlobStoreManagerService;->forEachSessionInUser(Ljava/util/function/Consumer;I)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Ljava/util/function/Consumer;Lcom/android/server/blob/BlobStoreManagerService$$ExternalSyntheticLambda16;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda0;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda2;,Lcom/android/server/blob/BlobStoreManagerService$BlobStorageStatsAugmenter$$ExternalSyntheticLambda4; HPLcom/android/server/blob/BlobStoreManagerService;->getUserSessionsLocked(I)Landroid/util/LongSparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService;->getDeviceIdsForUid(I)Landroid/util/ArraySet;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/companion/virtual/VirtualDeviceManagerService;->getVirtualDevicesSnapshot()Ljava/util/ArrayList;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/compat/CompatChange;->isEnabled(Landroid/content/pm/ApplicationInfo;Lcom/android/internal/compat/AndroidBuildClassifier;)Z+]Lcom/android/internal/compat/AndroidBuildClassifier;Lcom/android/internal/compat/AndroidBuildClassifier;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/compat/CompatConfig;->getDisabledChanges(Landroid/content/pm/ApplicationInfo;)[J+]Landroid/util/LongArray;Landroid/util/LongArray;]Lcom/android/internal/compat/CompatibilityChangeInfo;Lcom/android/server/compat/CompatChange;]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/compat/CompatChange;->isEnabled(Landroid/content/pm/ApplicationInfo;Lcom/android/internal/compat/AndroidBuildClassifier;)Z+]Lcom/android/internal/compat/AndroidBuildClassifier;Lcom/android/internal/compat/AndroidBuildClassifier;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/compat/CompatConfig;->getDisabledChanges(Landroid/content/pm/ApplicationInfo;)[J+]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/compat/CompatConfig;->getLoggableChanges(Landroid/content/pm/ApplicationInfo;)[J+]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/compat/CompatConfig;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/CompatChange;Lcom/android/server/compat/CompatChange;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/compat/CompatConfig;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/compat/CompatConfig;->isChangeTargetingLatestSdk(Lcom/android/server/compat/CompatChange;I)Z +HPLcom/android/server/compat/CompatConfig;->isLoggingOnly(J)Z+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/compat/CompatConfig;->maxTargetSdkForCompatChange(Lcom/android/server/compat/CompatChange;)I +HPLcom/android/server/compat/OverrideValidatorImpl;->getOverrideAllowedStateInternal(JLjava/lang/String;Z)Lcom/android/internal/compat/OverrideAllowedState;+]Lcom/android/internal/compat/AndroidBuildClassifier;Lcom/android/internal/compat/AndroidBuildClassifier; HSPLcom/android/server/compat/PlatformCompat;->getApplicationInfo(Ljava/lang/String;I)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByPackageName(JLjava/lang/String;I)Z+]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabled(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByPackageName(JLjava/lang/String;I)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUid(JI)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; -HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUidInternal(JI)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; -HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternal(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; -HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternalNoLogging(JLandroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/compat/CompatConfig;Lcom/android/server/compat/CompatConfig; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUidInternal(JI)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledByUidInternalNoLogging(JI)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternal(JLandroid/content/pm/ApplicationInfo;)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/compat/ChangeReporter;Lcom/android/internal/compat/ChangeReporter; +HSPLcom/android/server/compat/PlatformCompat;->isChangeEnabledInternalNoLogging(JLandroid/content/pm/ApplicationInfo;)Z HSPLcom/android/server/compat/config/Change;->read(Lorg/xmlpull/v1/XmlPullParser;)Lcom/android/server/compat/config/Change; HPLcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;->getNetworkCapabilities(I)Landroid/net/NetworkCapabilities;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HPLcom/android/server/connectivity/NetdEventListenerService;->collectPendingMetricsSnapshot(JZ)V+]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/connectivity/NetdEventListenerService;->getMetricsForNetwork(JI)Landroid/net/metrics/NetworkMetrics;+]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService; -HPLcom/android/server/connectivity/NetdEventListenerService;->onConnectEvent(IIILjava/lang/String;II)V+]Landroid/net/INetdEventCallback;Lcom/android/server/devicepolicy/NetworkLogger$1;,Lcom/android/server/net/watchlist/NetworkWatchlistService$1;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService; -HPLcom/android/server/connectivity/NetdEventListenerService;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V+]Landroid/net/INetdEventCallback;Lcom/android/server/devicepolicy/NetworkLogger$1;,Lcom/android/server/net/watchlist/NetworkWatchlistService$1;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService; -HPLcom/android/server/connectivity/NetdEventListenerService;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/os/BatteryStatsInternal;Lcom/android/server/am/BatteryStatsService$LocalService;]Lcom/android/server/connectivity/NetdEventListenerService;Lcom/android/server/connectivity/NetdEventListenerService;]Ljava/lang/String;Ljava/lang/String; +HPLcom/android/server/connectivity/NetdEventListenerService;->getMetricsForNetwork(JI)Landroid/net/metrics/NetworkMetrics;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback;Lcom/android/server/connectivity/NetdEventListenerService$TransportForNetIdNetworkCallback; +HPLcom/android/server/connectivity/NetdEventListenerService;->onConnectEvent(IIILjava/lang/String;II)V+]Landroid/net/INetdEventCallback;Lcom/android/server/devicepolicy/NetworkLogger$1;,Lcom/android/server/net/watchlist/NetworkWatchlistService$1;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics; +HPLcom/android/server/connectivity/NetdEventListenerService;->onDnsEvent(IIIILjava/lang/String;[Ljava/lang/String;II)V+]Landroid/net/INetdEventCallback;Lcom/android/server/devicepolicy/NetworkLogger$1;,Lcom/android/server/net/watchlist/NetworkWatchlistService$1;]Landroid/net/metrics/NetworkMetrics;Landroid/net/metrics/NetworkMetrics; +HPLcom/android/server/connectivity/NetdEventListenerService;->onWakeupEvent(Ljava/lang/String;III[BLjava/lang/String;Ljava/lang/String;IIJ)V+]Landroid/os/BatteryStatsInternal;Lcom/android/server/am/BatteryStatsService$LocalService; HSPLcom/android/server/content/ContentService$ObserverCollector$Key;->hashCode()I HSPLcom/android/server/content/ContentService$ObserverCollector;->()V -HSPLcom/android/server/content/ContentService$ObserverCollector;->collect(Landroid/database/IContentObserver;IZLandroid/net/Uri;II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/content/ContentService$ObserverCollector;->dispatch()V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Runnable;Lcom/android/server/content/ContentService$ObserverCollector$$ExternalSyntheticLambda0; +HSPLcom/android/server/content/ContentService$ObserverCollector;->collect(Landroid/database/IContentObserver;IZLandroid/net/Uri;II)V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/content/ContentService$ObserverCollector;->dispatch()V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService; HSPLcom/android/server/content/ContentService$ObserverCollector;->lambda$dispatch$0(Lcom/android/server/content/ContentService$ObserverCollector$Key;Ljava/util/List;)V+]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/content/ContentService$ObserverNode$ObserverEntry;->(Lcom/android/server/content/ContentService$ObserverNode;Landroid/database/IContentObserver;ZLjava/lang/Object;IIILandroid/net/Uri;)V+]Lcom/android/internal/os/BinderDeathDispatcher;Lcom/android/internal/os/BinderDeathDispatcher; HSPLcom/android/server/content/ContentService$ObserverNode;->(Ljava/lang/String;)V -HSPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/content/ContentService$ObserverNode;->addObserverLocked(Landroid/net/Uri;ILandroid/database/IContentObserver;ZLjava/lang/Object;III)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/content/ContentService$ObserverNode;->collectMyObserversLocked(Landroid/net/Uri;ZLandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V+]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;]Lcom/android/server/content/ContentService$ObserverCollector;Lcom/android/server/content/ContentService$ObserverCollector;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;IILandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/content/ContentService$ObserverNode;->collectObserversLocked(Landroid/net/Uri;IILandroid/database/IContentObserver;ZIILcom/android/server/content/ContentService$ObserverCollector;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/content/ContentService$ObserverNode;->countUriSegments(Landroid/net/Uri;)I+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Ljava/util/List;Landroid/net/Uri$PathSegments; HSPLcom/android/server/content/ContentService$ObserverNode;->getUriSegment(Landroid/net/Uri;I)Ljava/lang/String;+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Ljava/util/List;Landroid/net/Uri$PathSegments; -HSPLcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z+]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;]Lcom/android/internal/os/BinderDeathDispatcher;Lcom/android/internal/os/BinderDeathDispatcher;]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/content/ContentService$ObserverNode;->removeObserverLocked(Landroid/database/IContentObserver;)Z+]Landroid/database/IContentObserver;Landroid/database/ContentObserver$Transport;,Landroid/database/IContentObserver$Stub$Proxy;]Lcom/android/internal/os/BinderDeathDispatcher;Lcom/android/internal/os/BinderDeathDispatcher;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/content/ContentService;->getProviderPackageName(Landroid/net/Uri;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri; HPLcom/android/server/content/ContentService;->getSyncAdapterPackageAsUser(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager; HSPLcom/android/server/content/ContentService;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;I)[Ljava/lang/String;+]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager; HPLcom/android/server/content/ContentService;->getSyncAutomaticallyAsUser(Landroid/accounts/Account;Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine; -HSPLcom/android/server/content/ContentService;->getSyncExemptionAndCleanUpExtrasForCaller(ILandroid/os/Bundle;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService; +HSPLcom/android/server/content/ContentService;->getSyncExemptionAndCleanUpExtrasForCaller(ILandroid/os/Bundle;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService; HSPLcom/android/server/content/ContentService;->getSyncManager()Lcom/android/server/content/SyncManager; -HSPLcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/content/ContentService;->invalidateCacheLocked(ILjava/lang/String;Landroid/net/Uri;)V+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/String;Ljava/lang/String; -HSPLcom/android/server/content/ContentService;->notifyChange([Landroid/net/Uri;Landroid/database/IContentObserver;ZIIILjava/lang/String;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/content/ContentService$ObserverCollector;Lcom/android/server/content/ContentService$ObserverCollector;]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode;]Lcom/android/server/content/ContentService;Lcom/android/server/content/ContentService; -HSPLcom/android/server/content/ContentService;->unregisterContentObserver(Landroid/database/IContentObserver;)V+]Lcom/android/server/content/ContentService$ObserverNode;Lcom/android/server/content/ContentService$ObserverNode; -HPLcom/android/server/content/SyncJobService;->onStartJob(Landroid/app/job/JobParameters;)Z+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger; -HSPLcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/content/SyncLogger$RotatingFileLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger; +HSPLcom/android/server/content/ContentService;->handleIncomingUser(Landroid/net/Uri;IIIZI)I+]Landroid/content/Context;Landroid/app/ContextImpl; +HSPLcom/android/server/content/ContentService;->invalidateCacheLocked(ILjava/lang/String;Landroid/net/Uri;)V+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/content/ContentService;->notifyChange([Landroid/net/Uri;Landroid/database/IContentObserver;ZIIILjava/lang/String;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager; +HSPLcom/android/server/content/ContentService;->registerContentObserver(Landroid/net/Uri;ZLandroid/database/IContentObserver;II)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri; +HSPLcom/android/server/content/ContentService;->unregisterContentObserver(Landroid/database/IContentObserver;)V +HPLcom/android/server/content/SyncJobService;->onStartJob(Landroid/app/job/JobParameters;)Z HSPLcom/android/server/content/SyncLogger$RotatingFileLogger$MyHandler;->log(J[Ljava/lang/Object;)V -HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->logInner(J[Ljava/lang/Object;)V+]Lcom/android/server/content/SyncLogger$RotatingFileLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Ljava/io/Writer;Ljava/io/FileWriter;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/text/SimpleDateFormat;Ljava/text/SimpleDateFormat;]Ljava/util/Date;Ljava/util/Date; +HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->logInner(J[Ljava/lang/Object;)V+]Ljava/io/Writer;Ljava/io/FileWriter;]Ljava/util/Date;Ljava/util/Date; HSPLcom/android/server/content/SyncLogger$RotatingFileLogger;->openLogLocked(J)V+]Ljava/io/File;Ljava/io/File;]Ljava/util/Date;Ljava/util/Date; -HPLcom/android/server/content/SyncManager$ActiveSyncContext;->bindToSyncAdapter(Landroid/content/ComponentName;I)Z -HPLcom/android/server/content/SyncManager$SyncHandler;->dispatchSyncOperation(Lcom/android/server/content/SyncOperation;)Z HPLcom/android/server/content/SyncManager$SyncHandler;->handleSyncMessage(Landroid/os/Message;)V+]Landroid/content/ISyncAdapter;Landroid/content/ISyncAdapter$Stub$Proxy;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Lcom/android/server/content/SyncManager$SyncTimeTracker;Lcom/android/server/content/SyncManager$SyncTimeTracker; HPLcom/android/server/content/SyncManager$SyncHandler;->runBoundToAdapterH(Lcom/android/server/content/SyncManager$ActiveSyncContext;Landroid/os/IBinder;)V HPLcom/android/server/content/SyncManager$SyncHandler;->runSyncFinishedOrCanceledH(Landroid/content/SyncResult;Lcom/android/server/content/SyncManager$ActiveSyncContext;)V HPLcom/android/server/content/SyncManager;->computeSyncable(Landroid/accounts/Account;ILjava/lang/String;ZZ)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache; -HPLcom/android/server/content/SyncManager;->getAllPendingSyncs()Ljava/util/List;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/content/SyncManager;->getIsSyncable(Landroid/accounts/Account;ILjava/lang/String;)I+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine; +HPLcom/android/server/content/SyncManager;->getAllPendingSyncs()Ljava/util/List;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/content/SyncManager;->getSyncAdapterPackageAsUser(Ljava/lang/String;Ljava/lang/String;II)Ljava/lang/String;+]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;II)[Ljava/lang/String;+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/content/SyncManager;->scheduleLocalSync(Landroid/accounts/Account;IILjava/lang/String;IIILjava/lang/String;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager; -HSPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJZIIILjava/lang/String;)V+]Landroid/accounts/AccountManagerInternal;Lcom/android/server/accounts/AccountManagerService$AccountManagerInternalImpl;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/HashSet;Ljava/util/HashSet;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;,Ljava/util/HashMap$KeyIterator; -HPLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V+]Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo$Builder;]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncManagerConstants;Lcom/android/server/content/SyncManagerConstants;]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/content/SyncOperation;->(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZZIJJI)V+]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation; +HSPLcom/android/server/content/SyncManager;->getSyncAdapterPackagesForAuthorityAsUser(Ljava/lang/String;II)[Ljava/lang/String;+]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; +HSPLcom/android/server/content/SyncManager;->scheduleLocalSync(Landroid/accounts/Account;IILjava/lang/String;IIILjava/lang/String;)V +HSPLcom/android/server/content/SyncManager;->scheduleSync(Landroid/accounts/Account;IILjava/lang/String;Landroid/os/Bundle;IJZIIILjava/lang/String;)V+]Landroid/content/SyncAdapterType;Landroid/content/SyncAdapterType;]Landroid/content/SyncAdaptersCache;Landroid/content/SyncAdaptersCache;]Lcom/android/server/content/SyncLogger;Lcom/android/server/content/SyncLogger$RotatingFileLogger;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;,Ljava/util/HashMap$KeyIterator; +HPLcom/android/server/content/SyncManager;->scheduleSyncOperationH(Lcom/android/server/content/SyncOperation;J)V+]Landroid/app/job/JobScheduler;Landroid/app/JobSchedulerImpl;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/content/SyncManager;Lcom/android/server/content/SyncManager;]Lcom/android/server/content/SyncManagerConstants;Lcom/android/server/content/SyncManagerConstants;]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/content/SyncOperation;->(Lcom/android/server/content/SyncStorageEngine$EndPoint;ILjava/lang/String;IILandroid/os/Bundle;ZZIJJI)V HPLcom/android/server/content/SyncOperation;->dump(Landroid/content/pm/PackageManager;ZLcom/android/server/content/SyncAdapterStateFetcher;Z)Ljava/lang/String;+]Lcom/android/server/content/SyncAdapterStateFetcher;Lcom/android/server/content/SyncAdapterStateFetcher;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; -HPLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; -HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HPLcom/android/server/content/SyncOperation;->extrasToStringBuilder(Landroid/os/Bundle;Ljava/lang/StringBuilder;)V+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HPLcom/android/server/content/SyncOperation;->maybeCreateFromJobExtras(Landroid/os/PersistableBundle;)Lcom/android/server/content/SyncOperation;+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; HPLcom/android/server/content/SyncOperation;->toJobInfoExtras()Landroid/os/PersistableBundle;+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; -HPLcom/android/server/content/SyncOperation;->toKey()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/content/SyncOperation;->wakeLockName()Ljava/lang/String; +HPLcom/android/server/content/SyncOperation;->toKey()Ljava/lang/String; HSPLcom/android/server/content/SyncStorageEngine$EndPoint;->(Landroid/accounts/Account;Ljava/lang/String;I)V HPLcom/android/server/content/SyncStorageEngine;->getAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;Ljava/lang/String;)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;+]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/content/SyncStorageEngine;->getOrCreateAuthorityLocked(Lcom/android/server/content/SyncStorageEngine$EndPoint;IZ)Lcom/android/server/content/SyncStorageEngine$AuthorityInfo;+]Ljava/util/HashMap;Ljava/util/HashMap; -HPLcom/android/server/content/SyncStorageEngine;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;J)J+]Lcom/android/server/content/SyncOperation;Lcom/android/server/content/SyncOperation;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/content/SyncStorageEngine;->reportChange(ILjava/lang/String;I)V+]Landroid/content/ISyncStatusObserver;Landroid/content/ISyncStatusObserver$Stub$Proxy;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/content/SyncStorageEngine;->stopSyncEvent(JJLjava/lang/String;JJLjava/lang/String;I)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Landroid/os/Handler;Lcom/android/server/content/SyncStorageEngine$MyHandler;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/content/SyncStorageEngine;->writeStatusInfoLocked(Ljava/io/OutputStream;)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine; +HPLcom/android/server/content/SyncStorageEngine;->insertStartSyncEvent(Lcom/android/server/content/SyncOperation;J)J +HPLcom/android/server/content/SyncStorageEngine;->reportChange(ILjava/lang/String;I)V+]Landroid/content/ISyncStatusObserver;Landroid/content/ISyncStatusObserver$Stub$Proxy;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList; +HPLcom/android/server/content/SyncStorageEngine;->stopSyncEvent(JJLjava/lang/String;JJLjava/lang/String;I)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Lcom/android/server/content/SyncStorageEngine;Lcom/android/server/content/SyncStorageEngine;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/content/SyncStorageEngine;->writeStatusInfoLocked(Ljava/io/OutputStream;)V+]Landroid/content/SyncStatusInfo;Landroid/content/SyncStatusInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/contentcapture/ContentCaptureManagerService$ContentCaptureManagerServiceStub;->registerContentCaptureOptionsCallback(Ljava/lang/String;Landroid/view/contentcapture/IContentCaptureOptionsCallback;)V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/view/contentcapture/IContentCaptureOptionsCallback;Landroid/view/contentcapture/IContentCaptureOptionsCallback$Stub$Proxy;]Lcom/android/server/contentcapture/ContentCaptureManagerService;Lcom/android/server/contentcapture/ContentCaptureManagerService; HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->getOptions(ILjava/lang/String;)Landroid/content/ContentCaptureOptions;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/contentcapture/ContentCaptureManagerService$GlobalContentCaptureOptions;->isContentProtectionReceiverEnabled(ILjava/lang/String;)Z+]Lcom/android/server/contentprotection/ContentProtectionAllowlistManager;Lcom/android/server/contentprotection/ContentProtectionAllowlistManager;]Lcom/android/server/contentprotection/ContentProtectionConsentManager;Lcom/android/server/contentprotection/ContentProtectionConsentManager; HSPLcom/android/server/contentcapture/ContentCaptureManagerService;->isContentProtectionEnabledLocked()Z+]Ljava/util/List;Ljava/util/ImmutableCollections$ListN; -HSPLcom/android/server/cpu/CpuAvailabilityInfo;->(IJIIJ)V HSPLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;->(JJJJJJJJJJ)V HPLcom/android/server/cpu/CpuInfoReader$CpuUsageStats;->delta(Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats;)Lcom/android/server/cpu/CpuInfoReader$CpuUsageStats; -HSPLcom/android/server/cpu/CpuInfoReader;->calculateAvgCpuFreq(Landroid/util/LongSparseLongArray;)J+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray; -HSPLcom/android/server/cpu/CpuInfoReader;->readAvgTimeInStateCpuFrequency(ILjava/io/File;)J+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/cpu/CpuInfoReader;->readCpuCores(Ljava/io/File;)Landroid/util/IntArray;+]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/io/File;Ljava/io/File;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/cpu/CpuInfoReader;->readCpuInfos()Landroid/util/SparseArray;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader; -HSPLcom/android/server/cpu/CpuInfoReader;->readCumulativeCpuUsageStats()Landroid/util/SparseArray;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/io/File;Ljava/io/File;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern; +HSPLcom/android/server/cpu/CpuInfoReader;->readCpuCores(Ljava/io/File;)Landroid/util/IntArray;+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/cpu/CpuInfoReader;->readCpuFreqKHz(Ljava/io/File;)J+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/cpu/CpuInfoReader;->readCpuInfos()Landroid/util/SparseArray;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/cpu/CpuInfoReader;->readCumulativeCpuUsageStats()Landroid/util/SparseArray;+]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/cpu/CpuInfoReader;->readDynamicPolicyInfo()Landroid/util/SparseArray;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/cpu/CpuInfoReader;->readTimeInState(Ljava/io/File;)Landroid/util/LongSparseLongArray;+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;]Ljava/io/File;Ljava/io/File;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern; -HSPLcom/android/server/cpu/CpuMonitorService$CpusetInfo;->appendCpuInfo(JLcom/android/server/cpu/CpuInfoReader$CpuInfo;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot;Lcom/android/server/cpu/CpuMonitorService$CpusetInfo$Snapshot; -HSPLcom/android/server/cpu/CpuMonitorService;->monitorCpuStats()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/cpu/CpuInfoReader;Lcom/android/server/cpu/CpuInfoReader;]Lcom/android/server/cpu/CpuMonitorService$CpusetInfo;Lcom/android/server/cpu/CpuMonitorService$CpusetInfo;]Lcom/android/server/cpu/CpuMonitorService;Lcom/android/server/cpu/CpuMonitorService; -HSPLcom/android/server/devicepolicy/ActiveAdmin;->getUid()I +HSPLcom/android/server/cpu/CpuInfoReader;->readTimeInState(Ljava/io/File;)Landroid/util/LongSparseLongArray;+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/cpu/CpuMonitorService;->monitorCpuStats()V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/devicepolicy/ActiveAdmin;->getUid()I HSPLcom/android/server/devicepolicy/ActiveAdmin;->getUserHandle()Landroid/os/UserHandle; HPLcom/android/server/devicepolicy/ActiveAdmin;->writeToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Ljava/lang/CharSequence;Ljava/lang/String;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet; HSPLcom/android/server/devicepolicy/CallerIdentity;->(ILjava/lang/String;Landroid/content/ComponentName;)V HSPLcom/android/server/devicepolicy/CallerIdentity;->getUserId()I HPLcom/android/server/devicepolicy/CallerIdentity;->toString()Ljava/lang/String; HPLcom/android/server/devicepolicy/DevicePolicyData;->store(Lcom/android/server/devicepolicy/DevicePolicyData;Lcom/android/internal/util/JournaledFile;)Z+]Lcom/android/internal/util/JournaledFile;Lcom/android/internal/util/JournaledFile;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet; -HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeLocalPoliciesInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/admin/PolicyKey;Landroid/app/admin/IntentFilterPolicyKey;,Landroid/app/admin/NoArgsPolicyKey;,Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/devicepolicy/PolicyState;Lcom/android/server/devicepolicy/PolicyState;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashMap$EntrySet; +HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeEnforcingAdminSizeInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;]Ljava/util/Set;Ljava/util/HashMap$KeySet; +HPLcom/android/server/devicepolicy/DevicePolicyEngine$DevicePoliciesReaderWriter;->writeLocalPoliciesInner(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/admin/PolicyKey;Landroid/app/admin/NoArgsPolicyKey;,Landroid/app/admin/PackagePolicyKey;,Landroid/app/admin/UserRestrictionPolicyKey;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashMap$EntrySet; +HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getDevicePolicyState()Landroid/app/admin/DevicePolicyState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Iterator;Ljava/util/HashMap$KeyIterator;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/HashMap$KeySet; HPLcom/android/server/devicepolicy/DevicePolicyEngine;->getLocalPolicyStateLocked(Lcom/android/server/devicepolicy/PolicyDefinition;I)Lcom/android/server/devicepolicy/PolicyState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Ljava/util/HashMap; HSPLcom/android/server/devicepolicy/DevicePolicyEngine;->hasLocalPolicyLocked(Lcom/android/server/devicepolicy/PolicyDefinition;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Ljava/util/HashMap; HPLcom/android/server/devicepolicy/DevicePolicyEngine;->lambda$forceEnforcementRefreshLocked$0(Lcom/android/server/devicepolicy/PolicyDefinition;)V+]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda203;->runOrThrow()V +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda40;->getOrThrow()Ljava/lang/Object; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda6;->getOrThrow()Ljava/lang/Object; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderClearCallingIdentity()J +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda70;->getOrThrow()Ljava/lang/Object; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda81;->getOrThrow()Ljava/lang/Object; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService$$ExternalSyntheticLambda84;->getOrThrow()Ljava/lang/Object; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderGetCallingUid()I HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderRestoreCallingIdentity(J)V -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderWithCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingRunnable;)V -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->binderWithCleanCallingIdentity(Lcom/android/internal/util/FunctionalUtils$ThrowingSupplier;)Ljava/lang/Object; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getAppOpsManager()Landroid/app/AppOpsManager; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManager()Landroid/content/pm/PackageManager;+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;->getPackageManagerLocal()Lcom/android/server/pm/PackageManagerLocal; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveDeviceOwner(I)Z -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService$LocalService;->isActiveProfileOwner(I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->ensureLocked()V HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminUncheckedLocked(Landroid/content/ComponentName;I)Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdmins(I)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForLockscreenPoliciesLocked(I)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getActiveAdminsForUserAndItsManagedProfilesLocked(ILjava/util/function/Predicate;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector; HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getBindDeviceAdminTargetUsers(Landroid/content/ComponentName;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/devicepolicy/CallerIdentity;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getCallerIdentity(Landroid/content/ComponentName;Ljava/lang/String;)Lcom/android/server/devicepolicy/CallerIdentity;+]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDelegatedScopes(Landroid/content/ComponentName;Ljava/lang/String;)Ljava/util/List;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Landroid/app/admin/DeviceAdminInfo;Landroid/app/admin/DeviceAdminInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerAdminLocked()Lcom/android/server/devicepolicy/ActiveAdmin;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponent(Z)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getDeviceOwnerComponentOnUser(I)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getKeyguardDisabledFeatures(Landroid/content/ComponentName;IZ)I+]Lcom/android/server/devicepolicy/ActiveAdmin;Lcom/android/server/devicepolicy/ActiveAdmin;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getLockObject()Ljava/lang/Object;+]Lcom/android/internal/util/StatLogger;Lcom/android/internal/util/StatLogger; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/lang/Integer;Ljava/lang/Integer; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantStateForUser(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;I)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAdminLocked(I)Lcom/android/server/devicepolicy/ActiveAdmin;+]Landroid/app/admin/DeviceAdminInfo;Landroid/app/admin/DeviceAdminInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileParentId(I)I+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/lang/Integer;Ljava/lang/Integer; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPackageInfoWithNullCheck(Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;)Landroid/content/pm/ApplicationInfo;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantState(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getPermissionGrantStateForUser(Ljava/lang/String;Ljava/lang/String;Lcom/android/server/devicepolicy/CallerIdentity;I)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileOwnerAsUser(I)Landroid/content/ComponentName;+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getProfileParentId(I)I HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getTargetSdk(Ljava/lang/String;I)I+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/DeviceStateCacheImpl;Lcom/android/server/devicepolicy/DeviceStateCacheImpl; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserData(I)Lcom/android/server/devicepolicy/DevicePolicyData;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserDataUnchecked(I)Lcom/android/server/devicepolicy/DevicePolicyData; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getWifiSsidPolicy(Ljava/lang/String;)Landroid/app/admin/WifiSsidPolicy;+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasFullCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z+]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->hasCrossUsersPermission(Lcom/android/server/devicepolicy/CallerIdentity;I)Z HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isAdminActive(Landroid/content/ComponentName;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isCallingFromPackage(Ljava/lang/String;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDefaultDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwnerLocked(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isFinancedDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isManagedProfile(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDefaultDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isDeviceOwnerLocked(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isFinancedDeviceOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Lcom/android/server/devicepolicy/Owners;Lcom/android/server/devicepolicy/Owners; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPackageSuspended(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isPermissionCheckFlagEnabled()Z -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; -HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Ljava/lang/Boolean;Ljava/lang/Boolean; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUninstallBlocked(Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isProfileOwner(Lcom/android/server/devicepolicy/CallerIdentity;)Z +HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isSeparateProfileChallengeEnabled(I)Z +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->isUninstallBlocked(Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->logUserRestrictionCall(Ljava/lang/String;ZZLcom/android/server/devicepolicy/CallerIdentity;I)V HSPLcom/android/server/devicepolicy/DevicePolicyManagerService;->packageHasActiveAdmins(Ljava/lang/String;I)Z+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setApplicationExemptions(Ljava/lang/String;Ljava/lang/String;[I)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/admin/DevicePolicyEventLogger;Landroid/app/admin/DevicePolicyEventLogger;]Lcom/android/server/devicepolicy/CallerIdentity;Lcom/android/server/devicepolicy/CallerIdentity;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; -HSPLcom/android/server/devicepolicy/DeviceStateCacheImpl;->isUserOrganizationManaged(I)Z+]Lcom/android/server/devicepolicy/DeviceStateCacheImpl;Lcom/android/server/devicepolicy/DeviceStateCacheImpl;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setApplicationExemptions(Ljava/lang/String;Ljava/lang/String;[I)V+]Landroid/app/admin/DevicePolicyEventLogger;Landroid/app/admin/DevicePolicyEventLogger;]Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector;Lcom/android/server/devicepolicy/DevicePolicyManagerService$Injector; +HPLcom/android/server/devicepolicy/DevicePolicyManagerService;->setUserRestriction(Landroid/content/ComponentName;Ljava/lang/String;Ljava/lang/String;ZZ)V+]Lcom/android/server/devicepolicy/DevicePolicyManagerService;Lcom/android/server/devicepolicy/DevicePolicyManagerService; +HSPLcom/android/server/devicepolicy/DeviceStateCacheImpl;->isUserOrganizationManaged(I)Z+]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/devicepolicy/EnforcingAdmin;->(Ljava/lang/String;Landroid/content/ComponentName;Ljava/util/Set;ILcom/android/server/devicepolicy/ActiveAdmin;)V -HSPLcom/android/server/devicepolicy/EnforcingAdmin;->hashCode()I+]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin; -HPLcom/android/server/devicepolicy/EnforcingAdmin;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin; +HPLcom/android/server/devicepolicy/EnforcingAdmin;->equals(Ljava/lang/Object;)Z +HSPLcom/android/server/devicepolicy/EnforcingAdmin;->hashCode()I +HPLcom/android/server/devicepolicy/EnforcingAdmin;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerComponent()Landroid/content/ComponentName; HSPLcom/android/server/devicepolicy/Owners;->getDeviceOwnerUserId()I -HSPLcom/android/server/devicepolicy/Owners;->getProfileOwnerComponent(I)Landroid/content/ComponentName;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/devicepolicy/Owners;->getProfileOwnerComponent(I)Landroid/content/ComponentName; HSPLcom/android/server/devicepolicy/Owners;->hasDeviceOwner()Z -HSPLcom/android/server/devicepolicy/Owners;->isProfileOwnerOfOrganizationOwnedDevice(I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HPLcom/android/server/devicepolicy/PolicyState;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/admin/PolicyValue;Landroid/app/admin/BooleanPolicyValue;,Landroid/app/admin/ComponentNamePolicyValue;,Landroid/app/admin/LockTaskPolicy;,Landroid/app/admin/PackageSetPolicyValue;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/devicepolicy/EnforcingAdmin;Lcom/android/server/devicepolicy/EnforcingAdmin;]Lcom/android/server/devicepolicy/PolicyDefinition;Lcom/android/server/devicepolicy/PolicyDefinition;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedKeyIterator;]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet; +HSPLcom/android/server/devicepolicy/PolicyDefinition$$ExternalSyntheticLambda18;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/devicepolicy/PolicyEnforcerCallbacks;->lambda$setUserRestriction$7(Landroid/app/admin/PolicyKey;ILjava/lang/Boolean;)Ljava/lang/Boolean;+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HPLcom/android/server/devicepolicy/PolicyState;->getParcelablePolicyState()Landroid/app/admin/PolicyState;+]Lcom/android/server/devicepolicy/ResolutionMechanism;Lcom/android/server/devicepolicy/MostRecent;,Lcom/android/server/devicepolicy/MostRestrictive;,Lcom/android/server/devicepolicy/PackageSetUnion;,Lcom/android/server/devicepolicy/TopPriority;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedKeyIterator;]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet; +HPLcom/android/server/devicepolicy/PolicyState;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/app/admin/PolicyValue;Landroid/app/admin/BooleanPolicyValue;,Landroid/app/admin/LockTaskPolicy;,Landroid/app/admin/PackageSetPolicyValue;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedKeyIterator;]Ljava/util/LinkedHashMap;Ljava/util/LinkedHashMap;]Ljava/util/Set;Ljava/util/LinkedHashMap$LinkedKeySet; +HSPLcom/android/server/display/AmbientBrightnessStatsTracker$$ExternalSyntheticLambda0;->elapsedTimeMillis()J HSPLcom/android/server/display/AmbientBrightnessStatsTracker;->add(IF)V+]Lcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;Lcom/android/server/display/AmbientBrightnessStatsTracker$AmbientBrightnessStats;]Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;Lcom/android/server/display/AmbientBrightnessStatsTracker$Injector;]Lcom/android/server/display/AmbientBrightnessStatsTracker$Timer;Lcom/android/server/display/AmbientBrightnessStatsTracker$Timer; +HPLcom/android/server/display/AutomaticBrightnessController$2;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Lcom/android/server/display/AutomaticBrightnessController$Clock;Lcom/android/server/display/AutomaticBrightnessController$RealClock;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->offsetOf(I)I -HPLcom/android/server/display/AutomaticBrightnessController;->calculateAmbientLux(JJ)F+]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController; -HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightDarkeningTransition(J)J+]Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;Lcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController; -HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux(J)V+]Landroid/os/Handler;Lcom/android/server/display/AutomaticBrightnessController$AutomaticBrightnessHandler;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController; +HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->prune(J)V +HPLcom/android/server/display/AutomaticBrightnessController$AmbientLightRingBuffer;->push(JF)V +HPLcom/android/server/display/AutomaticBrightnessController;->calculateAmbientLux(JJ)F +HPLcom/android/server/display/AutomaticBrightnessController;->handleLightSensorEvent(JF)V +HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightBrighteningTransition(J)J+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController; +HPLcom/android/server/display/AutomaticBrightnessController;->nextAmbientLightDarkeningTransition(J)J+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController; +HPLcom/android/server/display/AutomaticBrightnessController;->updateAmbientLux(J)V HSPLcom/android/server/display/BrightnessRangeController;->getCurrentBrightnessMax()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Lcom/android/server/display/NormalBrightnessModeController;Lcom/android/server/display/NormalBrightnessModeController; -HSPLcom/android/server/display/BrightnessTracker$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker; +HSPLcom/android/server/display/BrightnessRangeController;->setAutoBrightnessEnabled(I)V+]Lcom/android/server/display/brightness/clamper/HdrClamper;Lcom/android/server/display/brightness/clamper/HdrClamper; +HSPLcom/android/server/display/BrightnessTracker$Receiver;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/display/BrightnessTracker;->recordAmbientBrightnessStats(Landroid/hardware/SensorEvent;)V+]Lcom/android/server/display/AmbientBrightnessStatsTracker;Lcom/android/server/display/AmbientBrightnessStatsTracker; +HSPLcom/android/server/display/DisplayBrightnessState$Builder;->()V HSPLcom/android/server/display/DisplayBrightnessState$Builder;->from(Lcom/android/server/display/DisplayBrightnessState;)Lcom/android/server/display/DisplayBrightnessState$Builder; HSPLcom/android/server/display/DisplayBrightnessState;->(Lcom/android/server/display/DisplayBrightnessState$Builder;)V+]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder; HSPLcom/android/server/display/DisplayDevice;->populateViewportLocked(Landroid/hardware/display/DisplayViewport;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice; HSPLcom/android/server/display/DisplayDeviceInfo;->()V HSPLcom/android/server/display/DisplayDeviceInfo;->diff(Lcom/android/server/display/DisplayDeviceInfo;)I +HSPLcom/android/server/display/DisplayDeviceInfo;->flagsToString(I)Ljava/lang/String; HSPLcom/android/server/display/DisplayDeviceInfo;->toString()Ljava/lang/String; HSPLcom/android/server/display/DisplayDeviceRepository;->handleDisplayDeviceChanged(Lcom/android/server/display/DisplayDevice;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/display/DisplayGroup;->getIdLocked(I)I+]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/display/DisplayGroup;->getSizeLocked()I+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/display/DisplayInfoProxy;->get()Landroid/view/DisplayInfo; HSPLcom/android/server/display/DisplayManagerService$1;->requestDisplayState(IIFF)V+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerCallbacks;Lcom/android/server/power/PowerManagerService$1;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/display/DisplayManagerService$BinderService;->getBrightnessInfo(I)Landroid/hardware/display/BrightnessInfo;+]Landroid/hardware/display/IDisplayManager$Stub;Lcom/android/server/display/DisplayManagerService$BinderService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; +HSPLcom/android/server/display/DisplayManagerService$BinderService;->getBrightnessInfo(I)Landroid/hardware/display/BrightnessInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; HSPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayIds(Z)[I+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; HSPLcom/android/server/display/DisplayManagerService$BinderService;->getDisplayInfo(I)Landroid/view/DisplayInfo; HSPLcom/android/server/display/DisplayManagerService$BinderService;->getOverlaySupport()Landroid/hardware/OverlayProperties; HSPLcom/android/server/display/DisplayManagerService$BinderService;->getPreferredWideGamutColorSpaceId()I -HSPLcom/android/server/display/DisplayManagerService$CallbackRecord;->notifyDisplayEventAsync(II)Z+]Landroid/hardware/display/IDisplayManagerCallback;Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;,Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy;]Lcom/android/server/display/DisplayManagerService$CallbackRecord;Lcom/android/server/display/DisplayManagerService$CallbackRecord;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/hardware/display/DisplayViewport;Landroid/hardware/display/DisplayViewport;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; -HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayIdToMirror(I)I+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; -HSPLcom/android/server/display/DisplayManagerService$LocalService;->getRefreshRateSwitchingType()I+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService; -HSPLcom/android/server/display/DisplayManagerService$LocalService;->performTraversal(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService; -HSPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(ILandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; -HSPLcom/android/server/display/DisplayManagerService$LocalService;->setDisplayProperties(IZFIFFZZZ)V+]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService; -HPLcom/android/server/display/DisplayManagerService$PendingCallback;->addDisplayEvent(II)V+]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/display/DisplayManagerService$UidImportanceListener;->onUidImportance(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayManagerService$PendingCallback;Lcom/android/server/display/DisplayManagerService$PendingCallback;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(ILandroid/util/ArraySet;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayManagerService$CallbackRecord;Lcom/android/server/display/DisplayManagerService$CallbackRecord;]Lcom/android/server/display/DisplayManagerService$PendingCallback;Lcom/android/server/display/DisplayManagerService$PendingCallback;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoForFrameRateOverride([Landroid/view/DisplayEventReceiver$FrameRateOverride;Landroid/view/DisplayInfo;I)Landroid/view/DisplayInfo;+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo; -HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;+]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; -HSPLcom/android/server/display/DisplayManagerService;->isMinimalPostProcessingAllowed()Z -HSPLcom/android/server/display/DisplayManagerService;->performTraversalInternal(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;Lcom/android/server/display/ColorFade$NaturalSurfaceLayout;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; -HSPLcom/android/server/display/DisplayManagerService;->requestDisplayStateInternal(IIFF)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Ljava/lang/Runnable;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/display/DisplayManagerService$CallbackRecord;->notifyDisplayEventAsync(II)Z+]Landroid/hardware/display/IDisplayManagerCallback;Landroid/hardware/display/DisplayManagerGlobal$DisplayManagerCallback;,Landroid/hardware/display/IDisplayManagerCallback$Stub$Proxy; +HSPLcom/android/server/display/DisplayManagerService$DisplayManagerHandler;->handleMessage(Landroid/os/Message;)V+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayIdToMirror(I)I+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; +HSPLcom/android/server/display/DisplayManagerService$LocalService;->getDisplayInfo(I)Landroid/view/DisplayInfo; +HSPLcom/android/server/display/DisplayManagerService$LocalService;->getRefreshRateSwitchingType()I +HSPLcom/android/server/display/DisplayManagerService$LocalService;->requestPowerState(ILandroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; +HSPLcom/android/server/display/DisplayManagerService;->deliverDisplayEvent(ILandroid/util/ArraySet;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoForFrameRateOverride([Landroid/view/DisplayEventReceiver$FrameRateOverride;Landroid/view/DisplayInfo;I)Landroid/view/DisplayInfo; +HSPLcom/android/server/display/DisplayManagerService;->getDisplayInfoInternal(II)Landroid/view/DisplayInfo;+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; +HSPLcom/android/server/display/DisplayManagerService;->performTraversalInternal(Landroid/view/SurfaceControl$Transaction;Landroid/util/SparseArray;)V+]Landroid/hardware/display/DisplayManagerInternal$DisplayTransactionListener;Lcom/android/server/display/ColorFade$NaturalSurfaceLayout;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; +HSPLcom/android/server/display/DisplayManagerService;->requestDisplayStateInternal(IIFF)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Ljava/lang/Runnable;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1; HSPLcom/android/server/display/DisplayManagerService;->scheduleTraversalLocked(Z)V HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventIfEnabledLocked(Lcom/android/server/display/LogicalDisplay;I)V HSPLcom/android/server/display/DisplayManagerService;->sendDisplayEventLocked(Lcom/android/server/display/LogicalDisplay;I)V -HSPLcom/android/server/display/DisplayManagerService;->setDisplayPropertiesInternal(IZFIFFZZZ)V+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/DisplayManagerService;Lcom/android/server/display/DisplayManagerService;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;]Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector; -HSPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; -HSPLcom/android/server/display/DisplayManagerService;->updateViewportPowerStateLocked(Lcom/android/server/display/LogicalDisplay;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HSPLcom/android/server/display/DisplayManagerService;->setDisplayPropertiesInternal(IZFIFFZZZ)V+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/mode/DisplayModeDirector;Lcom/android/server/display/mode/DisplayModeDirector; +HSPLcom/android/server/display/DisplayManagerService;->updateDisplayStateLocked(Lcom/android/server/display/DisplayDevice;)Ljava/lang/Runnable;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; +HSPLcom/android/server/display/DisplayPowerController;->animateScreenStateChange(IIZ)V+]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator; +HSPLcom/android/server/display/DisplayPowerController;->clampScreenBrightness(F)F+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController; HSPLcom/android/server/display/DisplayPowerController;->getBrightnessInfo()Landroid/hardware/display/BrightnessInfo; -HSPLcom/android/server/display/DisplayPowerController;->logBrightnessEvent(Lcom/android/server/display/brightness/BrightnessEvent;F)V+]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController; HSPLcom/android/server/display/DisplayPowerController;->notifyBrightnessTrackerChanged(FZZZZZ)V+]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessTracker;Lcom/android/server/display/BrightnessTracker; -HSPLcom/android/server/display/DisplayPowerController;->onDisplayChanged(Lcom/android/server/display/HighBrightnessModeMetadata;I)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayPowerController$Clock;Lcom/android/server/display/DisplayPowerController$Injector$$ExternalSyntheticLambda0; -HSPLcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;]Lcom/android/server/display/DisplayPowerController;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/DisplayPowerProximityStateController;Lcom/android/server/display/DisplayPowerProximityStateController; -HSPLcom/android/server/display/DisplayPowerController;->saveBrightnessInfo(FFLcom/android/server/display/DisplayBrightnessState;)Z+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController; -HSPLcom/android/server/display/DisplayPowerController;->updatePowerStateInternal()V+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/DisplayPowerControllerInterface;Lcom/android/server/display/DisplayPowerController;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;]Lcom/android/server/display/ScreenOffBrightnessSensorController;Lcom/android/server/display/ScreenOffBrightnessSensorController;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2;]Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Lcom/android/server/display/state/DisplayStateController;Lcom/android/server/display/state/DisplayStateController;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; +HSPLcom/android/server/display/DisplayPowerController;->requestPowerState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Z)Z+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest; +HSPLcom/android/server/display/DisplayPowerController;->saveBrightnessInfo(FFLcom/android/server/display/DisplayBrightnessState;)Z+]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo;Lcom/android/server/display/DisplayPowerController$CachedBrightnessInfo; +HSPLcom/android/server/display/DisplayPowerController;->sendUpdatePowerStateLocked()V+]Lcom/android/server/display/DisplayPowerController$Clock;Lcom/android/server/display/DisplayPowerController$Injector$$ExternalSyntheticLambda0; +HSPLcom/android/server/display/DisplayPowerController;->setScreenState(IIZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; +HSPLcom/android/server/display/DisplayPowerController;->updatePowerStateInternal()V+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/RingBuffer;Lcom/android/internal/util/RingBuffer;]Lcom/android/server/display/AutomaticBrightnessController;Lcom/android/server/display/AutomaticBrightnessController;]Lcom/android/server/display/BrightnessRangeController;Lcom/android/server/display/BrightnessRangeController;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;]Lcom/android/server/display/brightness/clamper/BrightnessClamperController;Lcom/android/server/display/brightness/clamper/BrightnessClamperController;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;]Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Lcom/android/server/display/state/DisplayStateController;Lcom/android/server/display/state/DisplayStateController;]Lcom/android/server/display/whitebalance/DisplayWhiteBalanceController;Lcom/android/server/display/whitebalance/DisplayWhiteBalanceController;]Lcom/android/server/display/whitebalance/DisplayWhiteBalanceSettings;Lcom/android/server/display/whitebalance/DisplayWhiteBalanceSettings;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; HSPLcom/android/server/display/DisplayPowerProximityStateController;->setPendingWaitForNegativeProximityLocked(Z)Z -HSPLcom/android/server/display/DisplayPowerState$4;->run()V+]Lcom/android/server/display/DisplayPowerState$PhotonicModulator;Lcom/android/server/display/DisplayPowerState$PhotonicModulator; -HSPLcom/android/server/display/DisplayPowerState$PhotonicModulator;->run()V+]Lcom/android/server/display/DisplayBlanker;Lcom/android/server/display/DisplayManagerService$1; -HSPLcom/android/server/display/DisplayPowerState$PhotonicModulator;->setState(IFF)Z+]Ljava/lang/Object;Ljava/lang/Object; +HSPLcom/android/server/display/DisplayPowerProximityStateController;->updateProximityState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;I)V +HSPLcom/android/server/display/DisplayPowerState$4;->run()V +HSPLcom/android/server/display/DisplayPowerState$PhotonicModulator;->run()V +HSPLcom/android/server/display/DisplayPowerState$PhotonicModulator;->setState(IFF)Z HSPLcom/android/server/display/DisplayPowerState;->postScreenUpdateThreadSafe()V -HSPLcom/android/server/display/DisplayPowerState;->setSdrScreenBrightness(F)V+]Lcom/android/server/display/DisplayPowerState;Lcom/android/server/display/DisplayPowerState; -HSPLcom/android/server/display/HighBrightnessModeController;->calculateRemainingTime(J)J+]Lcom/android/server/display/HbmEvent;Lcom/android/server/display/HbmEvent;]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/Iterator;Ljava/util/ArrayDeque$DeqIterator; -HSPLcom/android/server/display/HighBrightnessModeController;->onBrightnessChanged(FFI)V+]Lcom/android/server/display/DisplayManagerService$Clock;Lcom/android/server/display/HighBrightnessModeController$Injector$$ExternalSyntheticLambda0;]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController;]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata; -HSPLcom/android/server/display/HighBrightnessModeController;->recalculateTimeAllowance()V+]Lcom/android/server/display/DisplayManagerService$Clock;Lcom/android/server/display/HighBrightnessModeController$Injector$$ExternalSyntheticLambda0;]Lcom/android/server/display/HbmEvent;Lcom/android/server/display/HbmEvent;]Lcom/android/server/display/HighBrightnessModeMetadata;Lcom/android/server/display/HighBrightnessModeMetadata;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;->hasMatchingMode(Landroid/view/SurfaceControl$DisplayMode;)Z+]Landroid/view/Display$Mode;Landroid/view/Display$Mode; -HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V+]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1; -HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(FF)V+]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/display/HighBrightnessModeController;->getCurrentBrightnessMax()F+]Lcom/android/server/display/HighBrightnessModeController;Lcom/android/server/display/HighBrightnessModeController; +HSPLcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord;->hasMatchingMode(Landroid/view/SurfaceControl$DisplayMode;)Z +HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->run()V +HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;->setDisplayBrightness(FF)V+]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice$1;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceConfig()Lcom/android/server/display/DisplayDeviceConfig; -HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/display/DisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;]Lcom/android/server/display/LocalDisplayAdapter;Lcom/android/server/display/LocalDisplayAdapter;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getDisplayDeviceInfoLocked()Lcom/android/server/display/DisplayDeviceInfo;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;->getLogicalDensity()I+]Lcom/android/server/display/DensityMapping;Lcom/android/server/display/DensityMapping;]Lcom/android/server/display/DisplayDeviceConfig;Lcom/android/server/display/DisplayDeviceConfig; HSPLcom/android/server/display/LogicalDisplay;->configureDisplayLocked(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/display/DisplayDevice;Z)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice; -HSPLcom/android/server/display/LogicalDisplay;->getDisplayIdLocked()I HSPLcom/android/server/display/LogicalDisplay;->getDisplayInfoLocked()Landroid/view/DisplayInfo;+]Lcom/android/server/display/DisplayInfoProxy;Lcom/android/server/display/DisplayInfoProxy; HSPLcom/android/server/display/LogicalDisplay;->getMaskingInsets(Lcom/android/server/display/DisplayDeviceInfo;)Landroid/graphics/Rect; -HSPLcom/android/server/display/LogicalDisplay;->updateFrameRateOverrides(Lcom/android/server/display/DisplayDeviceInfo;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Float;Ljava/lang/Float; +HSPLcom/android/server/display/LogicalDisplay;->getPrimaryDisplayDeviceLocked()Lcom/android/server/display/DisplayDevice; +HSPLcom/android/server/display/LogicalDisplay;->updateFrameRateOverrides(Lcom/android/server/display/DisplayDeviceInfo;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/display/LogicalDisplay;->updateLocked(Lcom/android/server/display/DisplayDeviceRepository;Lcom/android/server/display/mode/SyntheticModeManager;)V+]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/DisplayDeviceRepository;Lcom/android/server/display/DisplayDeviceRepository;]Lcom/android/server/display/DisplayInfoProxy;Lcom/android/server/display/DisplayInfoProxy;]Lcom/android/server/display/mode/SyntheticModeManager;Lcom/android/server/display/mode/SyntheticModeManager; HSPLcom/android/server/display/LogicalDisplayMapper;->assignDisplayGroupLocked(Lcom/android/server/display/LogicalDisplay;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/DisplayDevice;Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice;,Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayGroupIdFromDisplayIdLocked(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayGroupLocked(I)Lcom/android/server/display/DisplayGroup;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayIdsLocked(IZ)[I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay; +HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayIdsLocked(IZ)[I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(I)Lcom/android/server/display/LogicalDisplay;+]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper; -HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(IZ)Lcom/android/server/display/LogicalDisplay;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay; -HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(Lcom/android/server/display/DisplayDevice;Z)Lcom/android/server/display/LogicalDisplay;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay; +HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(IZ)Lcom/android/server/display/LogicalDisplay;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/display/LogicalDisplayMapper;->getDisplayLocked(Lcom/android/server/display/DisplayDevice;Z)Lcom/android/server/display/LogicalDisplay;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/display/LogicalDisplayMapper;->sendUpdatesForDisplaysLocked(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/LogicalDisplayMapper$Listener;Lcom/android/server/display/DisplayManagerService$LogicalDisplayListener;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; -HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked(IZ)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplay;Lcom/android/server/display/LogicalDisplay;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; -HPLcom/android/server/display/RampAnimator$DualRampAnimator$1;->run()V+]Landroid/view/Choreographer;Landroid/view/Choreographer;]Lcom/android/server/display/RampAnimator$DualRampAnimator;Lcom/android/server/display/RampAnimator$DualRampAnimator;]Lcom/android/server/display/RampAnimator$Listener;Lcom/android/server/display/DisplayPowerController$3;]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator; -HPLcom/android/server/display/RampAnimator;->performNextAnimationStep(J)V+]Lcom/android/server/display/RampAnimator;Lcom/android/server/display/RampAnimator; +HSPLcom/android/server/display/LogicalDisplayMapper;->updateLogicalDisplaysLocked(IZ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/display/DisplayGroup;Lcom/android/server/display/DisplayGroup;]Lcom/android/server/display/LogicalDisplayMapper;Lcom/android/server/display/LogicalDisplayMapper;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; +HPLcom/android/server/display/RampAnimator;->performNextAnimationStep(J)V +HSPLcom/android/server/display/RampAnimator;->setPropertyValue(F)V+]Landroid/util/FloatProperty;Lcom/android/server/display/DisplayPowerState$2;,Lcom/android/server/display/DisplayPowerState$3; HSPLcom/android/server/display/brightness/BrightnessEvent;->copyFrom(Lcom/android/server/display/brightness/BrightnessEvent;)V HSPLcom/android/server/display/brightness/BrightnessEvent;->equalsMainData(Lcom/android/server/display/brightness/BrightnessEvent;)Z HSPLcom/android/server/display/brightness/BrightnessEvent;->reset()V HSPLcom/android/server/display/brightness/BrightnessEvent;->toString(Z)Ljava/lang/String; -HSPLcom/android/server/display/brightness/BrightnessReason;->toString(I)Ljava/lang/String; -HSPLcom/android/server/display/brightness/BrightnessUtils;->constructDisplayBrightnessState(IFFLjava/lang/String;Z)Lcom/android/server/display/DisplayBrightnessState; -HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->clamp(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;FZ)Lcom/android/server/display/DisplayBrightnessState;+]Lcom/android/server/display/DisplayBrightnessState$Builder;Lcom/android/server/display/DisplayBrightnessState$Builder;]Lcom/android/server/display/brightness/BrightnessReason;Lcom/android/server/display/brightness/BrightnessReason;]Lcom/android/server/display/brightness/clamper/BrightnessStateModifier;Lcom/android/server/display/brightness/clamper/BrightnessLowPowerModeModifier;,Lcom/android/server/display/brightness/clamper/DisplayDimModifier;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->-$$Nest$misEnabled(Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;)Z+]Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;Lcom/android/server/display/feature/DisplayManagerFlags$FlagState; +HSPLcom/android/server/display/brightness/BrightnessReason;->equals(Ljava/lang/Object;)Z+]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLcom/android/server/display/brightness/BrightnessReason;->set(Lcom/android/server/display/brightness/BrightnessReason;)V +HSPLcom/android/server/display/brightness/DisplayBrightnessController;->getScreenBrightnessSetting()F+]Lcom/android/server/display/BrightnessSetting;Lcom/android/server/display/BrightnessSetting; +HSPLcom/android/server/display/brightness/DisplayBrightnessController;->updateBrightness(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;ILandroid/hardware/display/DisplayManagerInternal$DisplayOffloadSession;)Lcom/android/server/display/DisplayBrightnessState;+]Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;]Lcom/android/server/display/brightness/strategy/DisplayBrightnessStrategy;megamorphic_types +HSPLcom/android/server/display/brightness/DisplayBrightnessStrategySelector;->selectStrategy(Lcom/android/server/display/brightness/StrategySelectionRequest;)Lcom/android/server/display/brightness/strategy/DisplayBrightnessStrategy;+]Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;Lcom/android/server/display/brightness/DisplayBrightnessStrategySelector;]Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2;Lcom/android/server/display/brightness/strategy/AutomaticBrightnessStrategy;]Lcom/android/server/display/brightness/strategy/DisplayBrightnessStrategy;megamorphic_types]Lcom/android/server/display/brightness/strategy/FollowerBrightnessStrategy;Lcom/android/server/display/brightness/strategy/FollowerBrightnessStrategy;]Lcom/android/server/display/brightness/strategy/OffloadBrightnessStrategy;Lcom/android/server/display/brightness/strategy/OffloadBrightnessStrategy;]Lcom/android/server/display/brightness/strategy/TemporaryBrightnessStrategy;Lcom/android/server/display/brightness/strategy/TemporaryBrightnessStrategy;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags; +HSPLcom/android/server/display/brightness/clamper/BrightnessClamperController;->clamp(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;FZI)Lcom/android/server/display/DisplayBrightnessState;+]Lcom/android/server/display/brightness/clamper/BrightnessStateModifier;Lcom/android/server/display/brightness/clamper/BrightnessLowPowerModeModifier;,Lcom/android/server/display/brightness/clamper/BrightnessThermalModifier;,Lcom/android/server/display/brightness/clamper/BrightnessWearBedtimeModeModifier;,Lcom/android/server/display/brightness/clamper/DisplayDimModifier;]Lcom/android/server/display/brightness/clamper/LightSensorController;Lcom/android/server/display/brightness/clamper/LightSensorController;]Lcom/android/server/display/feature/DisplayManagerFlags;Lcom/android/server/display/feature/DisplayManagerFlags;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->-$$Nest$misEnabled(Lcom/android/server/display/feature/DisplayManagerFlags$FlagState;)Z HSPLcom/android/server/display/feature/DisplayManagerFlags$FlagState;->isEnabled()Z -HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppPreferredRefreshRateRangeLocked(IFF)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage; -HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppRequestedModeLocked(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage; -HSPLcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;->onBrightnessChangedLocked()V+]Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver;]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage; +HSPLcom/android/server/display/feature/DisplayManagerFlags;->areAutoBrightnessModesEnabled()Z +HSPLcom/android/server/display/feature/DisplayManagerFlags;->isConnectedDisplayManagementEnabled()Z +HSPLcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver;->setAppRequest(IIFFF)V+]Lcom/android/server/display/mode/VotesStorage;Lcom/android/server/display/mode/VotesStorage; HSPLcom/android/server/display/mode/DisplayModeDirector;->getModeSwitchingType()I HSPLcom/android/server/display/mode/VotesStorage;->updateVote(IILcom/android/server/display/mode/Vote;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/display/mode/VotesStatsReporter;Lcom/android/server/display/mode/VotesStatsReporter;]Lcom/android/server/display/mode/VotesStorage$Listener;Lcom/android/server/display/mode/DisplayModeDirector$$ExternalSyntheticLambda0;]Ljava/lang/Object;megamorphic_types +HSPLcom/android/server/display/state/DisplayStateController;->updateDisplayState(Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;ZZ)Landroid/util/Pair; +HSPLcom/android/server/display/utils/SensorUtils;->findSensor(Landroid/hardware/SensorManager;Ljava/lang/String;Ljava/lang/String;I)Landroid/hardware/Sensor;+]Landroid/hardware/SensorManager;Landroid/hardware/SystemSensorManager;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/dreams/DreamManagerService$LocalService;->isDreaming()Z HSPLcom/android/server/dreams/DreamManagerService;->isDreamingInternal()Z HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->queryByComponent(Landroid/content/ComponentName;Ljava/util/List;)V +HSPLcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;->sortResults(Ljava/util/List;)V HSPLcom/android/server/firewall/IntentFirewall;->checkBroadcast(Landroid/content/Intent;IILjava/lang/String;I)Z+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall; HSPLcom/android/server/firewall/IntentFirewall;->checkIntent(Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Landroid/content/ComponentName;ILandroid/content/Intent;IILjava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/IntentResolver;Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;]Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver;]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/firewall/IntentFirewall;->checkService(Landroid/content/ComponentName;Landroid/content/Intent;IILjava/lang/String;Landroid/content/pm/ApplicationInfo;)Z+]Lcom/android/server/firewall/IntentFirewall;Lcom/android/server/firewall/IntentFirewall; HSPLcom/android/server/firewall/IntentFirewall;->getPackageManager()Landroid/content/pm/PackageManagerInternal; -HSPLcom/android/server/health/HealthServiceWrapperAidl;->getProperty(ILandroid/os/BatteryProperty;)I+]Lcom/android/server/health/HealthServiceWrapperAidl;Lcom/android/server/health/HealthServiceWrapperAidl; -HSPLcom/android/server/health/HealthServiceWrapperAidl;->getPropertyInternal(ILandroid/os/BatteryProperty;)I+]Landroid/hardware/health/IHealth;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/BatteryProperty;Landroid/os/BatteryProperty;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference; -HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceForUserLocked(I)Lcom/android/server/infra/AbstractPerUserSystemService;+]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/grammaticalinflection/GrammaticalInflectionUtils;->checkSystemGrammaticalGenderPermission(Landroid/permission/PermissionManager;Landroid/content/AttributionSource;)Z +HSPLcom/android/server/health/HealthRegCallbackAidl$HalInfoCallback;->healthInfoChanged(Landroid/hardware/health/HealthInfo;)V+]Lcom/android/server/health/HealthInfoCallback;Lcom/android/server/BatteryService$$ExternalSyntheticLambda5; +HPLcom/android/server/health/HealthServiceWrapperAidl;->getProperty(ILandroid/os/BatteryProperty;)I +HPLcom/android/server/health/HealthServiceWrapperAidl;->getPropertyInternal(ILandroid/os/BatteryProperty;)I+]Landroid/hardware/health/IHealth;Landroid/hardware/health/IHealth$Stub$Proxy;]Landroid/os/BatteryProperty;Landroid/os/BatteryProperty; +HSPLcom/android/server/infra/AbstractMasterSystemService;->assertCalledByPackageOwner(Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HSPLcom/android/server/infra/AbstractMasterSystemService;->getServiceListForUserLocked(I)Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/infra/AbstractMasterSystemService;megamorphic_types]Lcom/android/server/infra/ServiceNameResolver;Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;,Lcom/android/server/infra/SecureSettingsServiceNameResolver;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/input/InputManagerService;->monitor()V+]Lcom/android/server/input/NativeInputManagerService;Lcom/android/server/input/NativeInputManagerService$NativeImpl; HSPLcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutDescriptor;->format(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -HSPLcom/android/server/input/KeyboardLayoutManager;->getLocalesFromLanguageTags(Ljava/lang/String;)Landroid/os/LocaleList; -HSPLcom/android/server/input/KeyboardLayoutManager;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda0;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda1;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda5;,Lcom/android/server/input/KeyboardLayoutManager$2;]Ljava/lang/CharSequence;Ljava/lang/String;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/inputmethod/InputMethodSettings;->createEnabledInputMethodList(Ljava/util/List;Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Predicate;Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda11;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda12;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda19;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda20;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda21; -HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/List;+]Landroid/view/inputmethod/InputMethodInfo;Landroid/view/inputmethod/InputMethodInfo;]Landroid/view/inputmethod/InputMethodSubtype;Landroid/view/inputmethod/InputMethodSubtype;]Lcom/android/server/inputmethod/InputMethodMap;Lcom/android/server/inputmethod/InputMethodMap;]Lcom/android/server/inputmethod/InputMethodSettings;Lcom/android/server/inputmethod/InputMethodSettings;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodsAndSubtypeList()Ljava/util/List;+]Landroid/text/TextUtils$SimpleStringSplitter;Landroid/text/TextUtils$SimpleStringSplitter;]Lcom/android/server/inputmethod/InputMethodSettings;Lcom/android/server/inputmethod/InputMethodSettings;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/input/KeyboardLayoutManager;->visitKeyboardLayoutsInPackage(Landroid/content/pm/PackageManager;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;)V+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Lcom/android/server/input/KeyboardLayoutManager$KeyboardLayoutVisitor;Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda0;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda1;,Lcom/android/server/input/KeyboardLayoutManager$$ExternalSyntheticLambda5;,Lcom/android/server/input/KeyboardLayoutManager$2;]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLcom/android/server/inputmethod/InputMethodSettings;->createEnabledInputMethodList(Ljava/util/List;Ljava/util/function/Predicate;)Ljava/util/ArrayList;+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Predicate;Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda10;,Lcom/android/server/inputmethod/InputMethodManagerService$$ExternalSyntheticLambda19; +HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodSubtypeList(Landroid/view/inputmethod/InputMethodInfo;)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/inputmethod/InputMethodSettings;->getEnabledInputMethodsAndSubtypeList()Ljava/util/List; +HSPLcom/android/server/inputmethod/InputMethodSubtypeSwitchingController;->getSortedInputMethodAndSubtypeList(ZZZLandroid/content/Context;Lcom/android/server/inputmethod/InputMethodSettings;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/inputmethod/SecureSettingsWrapper;->get(I)Lcom/android/server/inputmethod/SecureSettingsWrapper$ReaderWriter;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/JobConcurrencyManager$$ExternalSyntheticLambda0;->accept(Ljava/lang/Object;)V HPLcom/android/server/job/JobConcurrencyManager$$ExternalSyntheticLambda2;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/android/server/job/JobConcurrencyManager$ContextAssignment;->clear()V @@ -1574,424 +1629,399 @@ HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->canJobStart( HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->getRunningJobCount(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->incrementPendingJobCount(I)V HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->incrementRunningJobCount(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->maybeAdjustReservations(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->maybeAdjustReservations(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onCountDone()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobFinished(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobFinished(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->onJobStarted(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetCounts()V +HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->resetStagingCount()V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->setConfig(Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig; HSPLcom/android/server/job/JobConcurrencyManager$WorkCountTracker;->stageJob(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker; +HSPLcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;->getMaxTotal()I HSPLcom/android/server/job/JobConcurrencyManager;->assignJobsToContextsInternalLocked()V+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; -HSPLcom/android/server/job/JobConcurrencyManager;->assignJobsToContextsLocked()V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager; -HSPLcom/android/server/job/JobConcurrencyManager;->carryOutAssignmentChangesLocked(Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext; -HSPLcom/android/server/job/JobConcurrencyManager;->cleanUpAfterAssignmentChangesLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Landroid/util/SparseIntArray;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;]Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobConcurrencyManager;->determineAssignmentsLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobConcurrencyManager;->getJobWorkTypes(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/JobConcurrencyManager;->assignJobsToContextsLocked()V+]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger; +HSPLcom/android/server/job/JobConcurrencyManager;->carryOutAssignmentChangesLocked(Landroid/util/ArraySet;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool; +HSPLcom/android/server/job/JobConcurrencyManager;->cleanUpAfterAssignmentChangesLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;Landroid/util/SparseIntArray;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->determineAssignmentsLocked(Landroid/util/ArraySet;Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->getJobWorkTypes(Lcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager; HSPLcom/android/server/job/JobConcurrencyManager;->getPkgStatsLocked(ILjava/lang/String;)Lcom/android/server/job/JobConcurrencyManager$PackageStats;+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; HSPLcom/android/server/job/JobConcurrencyManager;->getRunningJobsLocked()Landroid/util/ArraySet; -HSPLcom/android/server/job/JobConcurrencyManager;->hasImmediacyPrivilegeLocked(Lcom/android/server/job/controllers/JobStatus;Landroid/util/SparseIntArray;)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobConcurrencyManager;->isJobRunningLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/job/JobConcurrencyManager;->isPkgConcurrencyLimitedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/JobConcurrencyManager;->lambda$static$0(Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;)I+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext; -HSPLcom/android/server/job/JobConcurrencyManager;->noteConcurrency(Z)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobConcurrencyManager;->onJobCompletedLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobConcurrencyManager;->prepareForAssignmentDeterminationLocked(Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->hasImmediacyPrivilegeLocked(Lcom/android/server/job/controllers/JobStatus;Landroid/util/SparseIntArray;)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/job/JobConcurrencyManager;->isJobRunningLocked(Lcom/android/server/job/controllers/JobStatus;)Z +HSPLcom/android/server/job/JobConcurrencyManager;->isPkgConcurrencyLimitedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HPLcom/android/server/job/JobConcurrencyManager;->lambda$static$0(Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;Lcom/android/server/job/JobConcurrencyManager$ContextAssignment;)I +HSPLcom/android/server/job/JobConcurrencyManager;->noteConcurrency(Z)V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->onJobCompletedLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->prepareForAssignmentDeterminationLocked(Landroid/util/ArraySet;Ljava/util/List;Ljava/util/List;Lcom/android/server/job/JobConcurrencyManager$AssignmentInfo;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/JobConcurrencyManager;->refreshSystemStateLocked()Z+]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Lcom/android/internal/util/jobs/StatLogger;Lcom/android/internal/util/jobs/StatLogger;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; HSPLcom/android/server/job/JobConcurrencyManager;->shouldRunAsFgUserJob(Lcom/android/server/job/controllers/JobStatus;)Z -HPLcom/android/server/job/JobConcurrencyManager;->shouldStopRunningJobLocked(Lcom/android/server/job/JobServiceContext;)Ljava/lang/String;+]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/job/JobConcurrencyManager;->startJobLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobConcurrencyManager;->stopJobOnServiceContextLocked(Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobConcurrencyManager;->updateCounterConfigLocked()V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager; -HSPLcom/android/server/job/JobConcurrencyManager;->updateNonRunningPrioritiesLocked(Lcom/android/server/job/PendingJobQueue;Z)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; -HPLcom/android/server/job/JobNotificationCoordinator;->removeNotificationAssociation(Lcom/android/server/job/JobServiceContext;ILcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/notification/NotificationManagerInternal;Lcom/android/server/notification/NotificationManagerService$13; -HPLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/job/JobConcurrencyManager;->shouldStopRunningJobLocked(Lcom/android/server/job/JobServiceContext;)Ljava/lang/String;+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;Lcom/android/server/job/JobConcurrencyManager$WorkTypeConfig;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HSPLcom/android/server/job/JobConcurrencyManager;->startJobLocked(Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/controllers/JobStatus;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/job/JobConcurrencyManager;->stopJobOnServiceContextLocked(Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)Z+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobConcurrencyManager;->updateCounterConfigLocked()V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker; +HSPLcom/android/server/job/JobConcurrencyManager;->updateNonRunningPrioritiesLocked(Lcom/android/server/job/PendingJobQueue;Z)V+]Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;Lcom/android/server/job/JobConcurrencyManager$WorkCountTracker;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HSPLcom/android/server/job/JobNotificationCoordinator;->removeNotificationAssociation(Lcom/android/server/job/JobServiceContext;ILcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/notification/NotificationManagerInternal;Lcom/android/server/notification/NotificationManagerService$13; +HSPLcom/android/server/job/JobPackageTracker$DataSet;->decActive(ILjava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobPackageTracker$DataSet;->decPending(ILjava/lang/String;J)V -HSPLcom/android/server/job/JobPackageTracker$DataSet;->getEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobPackageTracker$DataSet;->getEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobPackageTracker$DataSet;->getOrCreateEntry(ILjava/lang/String;)Lcom/android/server/job/JobPackageTracker$PackageEntry;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/JobPackageTracker$DataSet;->getTotalTime(J)J HSPLcom/android/server/job/JobPackageTracker$DataSet;->incActive(ILjava/lang/String;J)V HSPLcom/android/server/job/JobPackageTracker$DataSet;->incPending(ILjava/lang/String;J)V HSPLcom/android/server/job/JobPackageTracker;->addEvent(IILjava/lang/String;IILjava/lang/String;)V+]Lcom/android/internal/util/jobs/RingBufferIndices;Lcom/android/internal/util/jobs/RingBufferIndices;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/JobPackageTracker;->getLoadFactor(Lcom/android/server/job/controllers/JobStatus;)F+]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;]Lcom/android/server/job/JobPackageTracker$PackageEntry;Lcom/android/server/job/JobPackageTracker$PackageEntry;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; +HSPLcom/android/server/job/JobPackageTracker;->getLoadFactor(Lcom/android/server/job/controllers/JobStatus;)F+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; HSPLcom/android/server/job/JobPackageTracker;->noteActive(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; HSPLcom/android/server/job/JobPackageTracker;->noteConcurrency(II)V -HPLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; +HSPLcom/android/server/job/JobPackageTracker;->noteInactive(Lcom/android/server/job/controllers/JobStatus;ILjava/lang/String;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; HSPLcom/android/server/job/JobPackageTracker;->noteNonpending(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; -HSPLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; -HSPLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V+]Lcom/android/server/job/JobPackageTracker$DataSet;Lcom/android/server/job/JobPackageTracker$DataSet; +HSPLcom/android/server/job/JobPackageTracker;->notePending(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; +HSPLcom/android/server/job/JobPackageTracker;->rebatchIfNeeded(J)V HPLcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1;->test(Ljava/lang/Object;)Z HSPLcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda4;->getCategory(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category; HSPLcom/android/server/job/JobSchedulerService$1;->millis()J HSPLcom/android/server/job/JobSchedulerService$2;->millis()J -HSPLcom/android/server/job/JobSchedulerService$4;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/os/Message;Landroid/os/Message; +HSPLcom/android/server/job/JobSchedulerService$4;->onUidStateChanged(IIJI)V HSPLcom/android/server/job/JobSchedulerService$BatteryStateTracker;->isConsideredCharging()Z -HSPLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/job/IUserVisibleJobObserver;Landroid/app/job/IUserVisibleJobObserver$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService$JobHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/job/IUserVisibleJobObserver;Landroid/app/job/IUserVisibleJobObserver$Stub$Proxy;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->cancel(Ljava/lang/String;I)V HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceBuilderApiPermissions(IILandroid/app/job/JobInfo;)Landroid/app/job/JobInfo;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(IILandroid/app/job/JobInfo;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enforceValidJobRequest(IILandroid/app/job/JobInfo;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->enqueue(Ljava/lang/String;Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;)I+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getAllPendingJobsInNamespace(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub; +HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getAllPendingJobsInNamespace(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice; HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->getPendingJob(Ljava/lang/String;I)Landroid/app/job/JobInfo; -HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->schedule(Ljava/lang/String;Landroid/app/job/JobInfo;)I+]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->scheduleAsPackage(Ljava/lang/String;Landroid/app/job/JobInfo;Ljava/lang/String;ILjava/lang/String;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateJob(Landroid/app/job/JobInfo;IIILjava/lang/String;Landroid/app/job/JobWorkItem;)I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;Lcom/android/server/job/JobSchedulerService$JobSchedulerStub;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateNamespace(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String; +HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->schedule(Ljava/lang/String;Landroid/app/job/JobInfo;)I+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateJob(Landroid/app/job/JobInfo;IIILjava/lang/String;Landroid/app/job/JobWorkItem;)I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/Context;Landroid/app/ContextImpl; +HSPLcom/android/server/job/JobSchedulerService$JobSchedulerStub;->validateNamespace(Ljava/lang/String;)Ljava/lang/String; HSPLcom/android/server/job/JobSchedulerService$LocalService;->isAppConsideredBuggy(ILjava/lang/String;ILjava/lang/String;)Z+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; -HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor; -HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcessLocked()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->postProcessLocked()V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;->reset()V+]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor; -HSPLcom/android/server/job/JobSchedulerService;->adjustJobBias(ILcom/android/server/job/controllers/JobStatus;)I+]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker; -HSPLcom/android/server/job/JobSchedulerService;->areComponentsInPlaceLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobSchedulerService;->areUsersStartedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HPLcom/android/server/job/JobSchedulerService$ReadyJobQueueFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/JobSchedulerService;->adjustJobBias(ILcom/android/server/job/controllers/JobStatus;)I +HSPLcom/android/server/job/JobSchedulerService;->areComponentsInPlaceLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/JobSchedulerService;->areUsersStartedLocked(Lcom/android/server/job/controllers/JobStatus;)Z HPLcom/android/server/job/JobSchedulerService;->cancelJob(ILjava/lang/String;III)Z -HPLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobSchedulerService;->checkChangedJobListLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor;Lcom/android/server/job/JobSchedulerService$MaybeReadyJobQueueFunctor; +HPLcom/android/server/job/JobSchedulerService;->cancelJobImplLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;IILjava/lang/String;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HSPLcom/android/server/job/JobSchedulerService;->checkChangedJobListLocked()V HSPLcom/android/server/job/JobSchedulerService;->checkIfRestricted(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/restrictions/JobRestriction;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/restrictions/JobRestriction;Lcom/android/server/job/restrictions/ThermalStatusRestriction;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobSchedulerService;->deriveWorkSource(ILjava/lang/String;)Landroid/os/WorkSource;+]Lcom/android/server/SystemService;Lcom/android/server/job/JobSchedulerService; -HSPLcom/android/server/job/JobSchedulerService;->evaluateControllerStatesLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobSchedulerService;->evaluateJobBiasLocked(Lcom/android/server/job/controllers/JobStatus;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobSchedulerService;->getMaxJobExecutionTimeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; -HSPLcom/android/server/job/JobSchedulerService;->getMinJobExecutionGuaranteeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; -HSPLcom/android/server/job/JobSchedulerService;->getPendingJob(ILjava/lang/String;I)Landroid/app/job/JobInfo;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/JobSchedulerService;->deriveWorkSource(ILjava/lang/String;)Landroid/os/WorkSource; +HSPLcom/android/server/job/JobSchedulerService;->evaluateControllerStatesLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService;->evaluateJobBiasLocked(Lcom/android/server/job/controllers/JobStatus;)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/job/JobSchedulerService;->getMaxJobExecutionTimeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; +HSPLcom/android/server/job/JobSchedulerService;->getMinJobExecutionGuaranteeMs(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; +HSPLcom/android/server/job/JobSchedulerService;->getPendingJob(ILjava/lang/String;I)Landroid/app/job/JobInfo; HSPLcom/android/server/job/JobSchedulerService;->getPendingJobQueue()Lcom/android/server/job/PendingJobQueue; -HPLcom/android/server/job/JobSchedulerService;->getPendingJobsInNamespace(ILjava/lang/String;)Ljava/util/List;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForFailureLocked(Lcom/android/server/job/controllers/JobStatus;II)Lcom/android/server/job/controllers/JobStatus;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForPeriodic(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock; +HPLcom/android/server/job/JobSchedulerService;->getPendingJobsInNamespace(ILjava/lang/String;)Ljava/util/List; +HSPLcom/android/server/job/JobSchedulerService;->getRescheduleJobForPeriodic(Lcom/android/server/job/controllers/JobStatus;)Lcom/android/server/job/controllers/JobStatus;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock; HSPLcom/android/server/job/JobSchedulerService;->getUidBias(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/job/JobSchedulerService;->getUidProcState(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HPLcom/android/server/job/JobSchedulerService;->hasPermission(IILjava/lang/String;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; -HSPLcom/android/server/job/JobSchedulerService;->isBatteryCharging()Z+]Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;Lcom/android/server/job/JobSchedulerService$BatteryStateTracker; -HSPLcom/android/server/job/JobSchedulerService;->isBatteryNotLow()Z+]Lcom/android/server/job/JobSchedulerService$BatteryStateTracker;Lcom/android/server/job/JobSchedulerService$BatteryStateTracker; -HSPLcom/android/server/job/JobSchedulerService;->isComponentUsable(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/JobSchedulerService;->isBatteryCharging()Z +HSPLcom/android/server/job/JobSchedulerService;->isBatteryNotLow()Z +HSPLcom/android/server/job/JobSchedulerService;->isComponentUsable(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService; HSPLcom/android/server/job/JobSchedulerService;->isCurrentlyRunningLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager; HSPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HSPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/job/JobSchedulerService;->lambda$new$2(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category;+]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/job/JobSchedulerService;->lambda$onBootPhase$4(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService;->maybeProcessBuggyJob(Lcom/android/server/job/controllers/JobStatus;I)V+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; +HSPLcom/android/server/job/JobSchedulerService;->isReadyToBeExecutedLocked(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HSPLcom/android/server/job/JobSchedulerService;->lambda$new$2(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/Category; +HSPLcom/android/server/job/JobSchedulerService;->maybeProcessBuggyJob(Lcom/android/server/job/controllers/JobStatus;I)V+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$1; HSPLcom/android/server/job/JobSchedulerService;->maybeRunPendingJobsLocked()V+]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HSPLcom/android/server/job/JobSchedulerService;->onControllerStateChanged(Landroid/util/ArraySet;)V+]Landroid/os/Handler;Lcom/android/server/job/JobSchedulerService$JobHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; -HPLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;IIZ)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/JobSchedulerService;->reportActiveLocked()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobSchedulerService;->resetPendingJobReasonCache(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/modules/expresslog/Histogram;Lcom/android/modules/expresslog/Histogram;]Lcom/android/server/job/JobPackageTracker;Lcom/android/server/job/JobPackageTracker;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/job/JobSchedulerService;->onControllerStateChanged(Landroid/util/ArraySet;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/JobSchedulerService;->onJobCompletedLocked(Lcom/android/server/job/controllers/JobStatus;IIZ)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/JobSchedulerService;->reportActiveLocked()V+]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue; +HSPLcom/android/server/job/JobSchedulerService;->resetPendingJobReasonCache(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/job/JobSchedulerService;->scheduleAsPackage(Landroid/app/job/JobInfo;Landroid/app/job/JobWorkItem;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; HSPLcom/android/server/job/JobSchedulerService;->standbyBucketForPackage(Ljava/lang/String;IJ)I+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService; -HSPLcom/android/server/job/JobSchedulerService;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobSchedulerService;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/JobSchedulerService;->updateUidState(III)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/controllers/StateController;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/JobServiceContext;->applyStoppedReasonLocked(Ljava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/JobServiceContext$JobCallback;->(Lcom/android/server/job/JobServiceContext;)V +HSPLcom/android/server/job/JobServiceContext;->applyStoppedReasonLocked(Ljava/lang/String;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HSPLcom/android/server/job/JobServiceContext;->canGetNetworkInformation(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HPLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/job/JobCompletedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobNotificationCoordinator;Lcom/android/server/job/JobNotificationCoordinator;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/JobServiceContext;->doCallback(Lcom/android/server/job/JobServiceContext$JobCallback;ZLjava/lang/String;)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext; -HPLcom/android/server/job/JobServiceContext;->doCallbackLocked(ZLjava/lang/String;)V+]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext; +HSPLcom/android/server/job/JobServiceContext;->closeAndCleanupJobLocked(ZLjava/lang/String;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/job/JobCompletedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobConcurrencyManager;Lcom/android/server/job/JobConcurrencyManager;]Lcom/android/server/job/JobNotificationCoordinator;Lcom/android/server/job/JobNotificationCoordinator;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/JobServiceContext;->doCallback(Lcom/android/server/job/JobServiceContext$JobCallback;ZLjava/lang/String;)V +HSPLcom/android/server/job/JobServiceContext;->doCallbackLocked(ZLjava/lang/String;)V HPLcom/android/server/job/JobServiceContext;->doDequeueWork(Lcom/android/server/job/JobServiceContext$JobCallback;I)Landroid/app/job/JobWorkItem;+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters; -HPLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters; -HSPLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;I)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V -HPLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V+]Landroid/app/job/IJobService;Landroid/app/job/IJobService$Stub$Proxy;,Landroid/app/job/JobServiceEngine$JobInterface; -HPLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/JobServiceContext;->doJobFinished(Lcom/android/server/job/JobServiceContext$JobCallback;IZ)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters; +HSPLcom/android/server/job/JobServiceContext;->executeRunnableJob(Lcom/android/server/job/controllers/JobStatus;I)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/JobServiceContext;->handleFinishedLocked(ZLjava/lang/String;)V +HSPLcom/android/server/job/JobServiceContext;->handleServiceBoundLocked()V+]Landroid/app/job/IJobService;Landroid/app/job/IJobService$Stub$Proxy;,Landroid/app/job/JobServiceEngine$JobInterface; +HSPLcom/android/server/job/JobServiceContext;->handleStartedLocked(Z)V+]Landroid/app/job/JobParameters;Landroid/app/job/JobParameters;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; HPLcom/android/server/job/JobServiceContext;->isWithinExecutionGuaranteeTime()Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V -HSPLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler; -HSPLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V+]Landroid/os/Handler;Lcom/android/server/job/JobServiceContext$JobServiceHandler;]Lcom/android/server/job/JobServiceContext;Lcom/android/server/job/JobServiceContext;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/JobStore$2$CopyConsumer;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobServiceContext;->onServiceConnected(Landroid/content/ComponentName;Landroid/os/IBinder;)V +HSPLcom/android/server/job/JobServiceContext;->removeOpTimeOutLocked()V +HSPLcom/android/server/job/JobServiceContext;->scheduleOpTimeOutLocked()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/JobServiceContext;->verifyCallerLocked(Lcom/android/server/job/JobServiceContext$JobCallback;)Z +HPLcom/android/server/job/JobStore$2$CopyConsumer;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/job/JobStore$2$CopyConsumer;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/JobStore$2$CopyConsumer;Lcom/android/server/job/JobStore$2$CopyConsumer; HPLcom/android/server/job/JobStore$2$CopyConsumer;->prepare()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HPLcom/android/server/job/JobStore$2;->addAttributesToJobTag(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/JobStore$2;->deepCopyBundle(Landroid/os/PersistableBundle;I)Landroid/os/PersistableBundle;+]Landroid/os/PersistableBundle;Landroid/os/PersistableBundle;]Lcom/android/server/job/JobStore$2;Lcom/android/server/job/JobStore$2;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HPLcom/android/server/job/JobStore$2;->addAttributesToJobTag(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/job/JobStore$2;->deepCopyBundle(Landroid/os/PersistableBundle;I)Landroid/os/PersistableBundle;+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; HPLcom/android/server/job/JobStore$2;->run()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/io/File;Ljava/io/File;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock; -HPLcom/android/server/job/JobStore$2;->writeBundleToXml(Landroid/os/PersistableBundle;Lorg/xmlpull/v1/XmlSerializer;)V+]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; -HPLcom/android/server/job/JobStore$2;->writeConstraintsToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/JobStore$2;->writeDebugInfoToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/JobStore$2;->writeExecutionCriteriaToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock;]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; -HPLcom/android/server/job/JobStore$2;->writeJobsMapImpl(Landroid/util/AtomicFile;Ljava/util/List;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Landroid/util/SystemConfigFileCommitEventLogger;Landroid/util/SystemConfigFileCommitEventLogger;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/job/JobStore$2;Lcom/android/server/job/JobStore$2;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobStore$JobSet;->contains(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobStore$JobSet;->countJobsForUid(I)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobStore$JobSet;->forEachJob(Ljava/util/function/Predicate;Ljava/util/function/Consumer;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/function/Predicate;megamorphic_types -HSPLcom/android/server/job/JobStore$JobSet;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;Lcom/android/server/job/JobSchedulerService$DeferredJobCounter;,Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;,Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;,Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater; -HSPLcom/android/server/job/JobStore$JobSet;->get(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HPLcom/android/server/job/JobStore$2;->writeConstraintsToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/job/JobStore$2;->writeDebugInfoToXml(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HPLcom/android/server/job/JobStore$2;->writeExecutionCriteriaToXml(Lorg/xmlpull/v1/XmlSerializer;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock;]Lorg/xmlpull/v1/XmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; +HPLcom/android/server/job/JobStore$2;->writeJobsMapImpl(Landroid/util/AtomicFile;Ljava/util/List;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Landroid/util/SystemConfigFileCommitEventLogger;Landroid/util/SystemConfigFileCommitEventLogger;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/JobStore$JobSet;->add(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobStore$JobSet;->contains(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobStore$JobSet;->countJobsForUid(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobStore$JobSet;->forEachJob(Ljava/util/function/Predicate;Ljava/util/function/Consumer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;megamorphic_types]Ljava/util/function/Predicate;megamorphic_types +HSPLcom/android/server/job/JobStore$JobSet;->forEachJobForSourceUid(ILjava/util/function/Consumer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/function/Consumer;Lcom/android/server/job/JobSchedulerService$DeferredJobCounter;,Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;,Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;,Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater; +HSPLcom/android/server/job/JobStore$JobSet;->get(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/JobStore$JobSet;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->buildConstraintsFromXml(Landroid/app/job/JobInfo$Builder;Lcom/android/modules/utils/TypedXmlPullParser;)V HSPLcom/android/server/job/JobStore$ReadJobMapFromDiskRunnable;->restoreJobFromXml(ZLcom/android/modules/utils/TypedXmlPullParser;IJ)Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/JobStore;->countJobsForUid(I)I+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet; -HSPLcom/android/server/job/JobStore;->getJobByUidAndJobId(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus;+]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet; -HPLcom/android/server/job/JobStore;->intArrayToString([I)Ljava/lang/String;+]Ljava/lang/Object;Ljava/util/StringJoiner;]Ljava/util/StringJoiner;Ljava/util/StringJoiner; +HSPLcom/android/server/job/JobStore;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/job/JobStore;->countJobsForUid(I)I +HSPLcom/android/server/job/JobStore;->getJobByUidAndJobId(ILjava/lang/String;I)Lcom/android/server/job/controllers/JobStatus; +HPLcom/android/server/job/JobStore;->intArrayToString([I)Ljava/lang/String; HPLcom/android/server/job/JobStore;->maybeWriteStatusToDiskAsync()V -HPLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobStore$JobSet;Lcom/android/server/job/JobStore$JobSet;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/JobStore;->remove(Lcom/android/server/job/controllers/JobStatus;Z)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HPLcom/android/server/job/PendingJobQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I HSPLcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;->clear()V HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->addAll(Ljava/util/List;)V+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->indexOf(Lcom/android/server/job/controllers/JobStatus;)I+]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->lambda$static$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;)I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->lambda$static$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;)I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/job/PendingJobQueue$AppJobQueue;->peekNextOverrideState()I+]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->peekNextTimestamp()J+]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;Lcom/android/server/job/PendingJobQueue$AppJobQueue$AdjustedJobStatus;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/PendingJobQueue$AppJobQueue;->resetIterator(J)V HPLcom/android/server/job/PendingJobQueue;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HSPLcom/android/server/job/PendingJobQueue;->addAll(Landroid/util/ArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/PendingJobQueue;->addAll(Landroid/util/ArraySet;)V+]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; HSPLcom/android/server/job/PendingJobQueue;->contains(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/PendingJobQueue;->getAppJobQueue(IZ)Lcom/android/server/job/PendingJobQueue$AppJobQueue;+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/job/PendingJobQueue;->lambda$new$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;)I+]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue; -HSPLcom/android/server/job/PendingJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HSPLcom/android/server/job/PendingJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;]Lcom/android/server/job/PendingJobQueue;Lcom/android/server/job/PendingJobQueue;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController; -HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Ljava/lang/Object;)V+]Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor; +HPLcom/android/server/job/PendingJobQueue;->lambda$new$0(Lcom/android/server/job/PendingJobQueue$AppJobQueue;Lcom/android/server/job/PendingJobQueue$AppJobQueue;)I +HSPLcom/android/server/job/PendingJobQueue;->next()Lcom/android/server/job/controllers/JobStatus;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/PendingJobQueue;->remove(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/PendingJobQueue;->size()I +HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->accept(Ljava/lang/Object;)V HSPLcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;->prepare(I)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/BackgroundJobsController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/BackgroundJobsController;->isPackageStoppedLocked(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/job/controllers/BackgroundJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsLocked(II)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor;Lcom/android/server/job/controllers/BackgroundJobsController$UpdateJobFunctor; -HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateSingleJobRestrictionLocked(Lcom/android/server/job/controllers/JobStatus;JI)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl;]Lcom/android/server/job/controllers/BackgroundJobsController;Lcom/android/server/job/controllers/BackgroundJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/BatteryController;->hasTopExemptionLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/BatteryController;Lcom/android/server/job/controllers/BatteryController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/BatteryController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/ComponentController;->getServiceProcessLocked(Lcom/android/server/job/controllers/JobStatus;)Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/job/controllers/ComponentController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/ComponentController;Lcom/android/server/job/controllers/ComponentController; -HSPLcom/android/server/job/controllers/ComponentController;->updateComponentEnabledStateLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/ComponentController;Lcom/android/server/job/controllers/ComponentController; +HSPLcom/android/server/job/controllers/BackgroundJobsController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/BackgroundJobsController;->isPackageStoppedLocked(Ljava/lang/String;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; +HSPLcom/android/server/job/controllers/BackgroundJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateJobRestrictionsLocked(II)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/BackgroundJobsController;->updateSingleJobRestrictionLocked(Lcom/android/server/job/controllers/JobStatus;JI)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Lcom/android/server/AppStateTrackerImpl;Lcom/android/server/AppStateTrackerImpl; +HSPLcom/android/server/job/controllers/BatteryController;->hasTopExemptionLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/BatteryController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/BatteryController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/ComponentController;->getServiceProcessLocked(Lcom/android/server/job/controllers/JobStatus;)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/ComponentController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/ComponentController;->updateComponentEnabledStateLocked(Lcom/android/server/job/controllers/JobStatus;)Z HSPLcom/android/server/job/controllers/ConnectivityController$CcHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HPLcom/android/server/job/controllers/ConnectivityController$UidDefaultNetworkCallback;->onBlockedStatusChanged(Landroid/net/Network;I)V -HSPLcom/android/server/job/controllers/ConnectivityController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController; -HSPLcom/android/server/job/controllers/ConnectivityController;->getNetworkLocked(Lcom/android/server/job/controllers/JobStatus;)Landroid/net/Network;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/ConnectivityController;->getNetworkMetadata(Landroid/net/Network;)Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/job/controllers/ConnectivityController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HSPLcom/android/server/job/controllers/ConnectivityController;->getNetworkLocked(Lcom/android/server/job/controllers/JobStatus;)Landroid/net/Network;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/controllers/ConnectivityController;->getNetworkMetadata(Landroid/net/Network;)Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata; HSPLcom/android/server/job/controllers/ConnectivityController;->getUidStats(ILjava/lang/String;Z)Lcom/android/server/job/controllers/ConnectivityController$UidStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HPLcom/android/server/job/controllers/ConnectivityController;->isCongestionDelayed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z -HPLcom/android/server/job/controllers/ConnectivityController;->isInsane(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/ConnectivityController;->isMeteredAllowed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;)Z+]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/net/NetworkPolicyManager;Landroid/net/NetworkPolicyManager;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/ConnectivityController;->isSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController; -HSPLcom/android/server/job/controllers/ConnectivityController;->isStandbyExceptionRequestedLocked(I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/job/controllers/ConnectivityController;->isStrictSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/net/NetworkCapabilities$Builder;Landroid/net/NetworkCapabilities$Builder;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/ConnectivityController;->isStrongEnough(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/ArraySet; -HSPLcom/android/server/job/controllers/ConnectivityController;->maybeAdjustRegisteredCallbacksLocked()V+]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/os/Handler;Lcom/android/server/job/controllers/ConnectivityController$CcHandler;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/ConnectivityController;->maybeRevokeStandbyExceptionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/ConnectivityController; -HPLcom/android/server/job/controllers/ConnectivityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HPLcom/android/server/job/controllers/ConnectivityController;->isInsane(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HPLcom/android/server/job/controllers/ConnectivityController;->isMeteredAllowed(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;)Z+]Landroid/net/NetworkPolicyManager;Landroid/net/NetworkPolicyManager;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/ConnectivityController;->isSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z +HSPLcom/android/server/job/controllers/ConnectivityController;->isStandbyExceptionRequestedLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/job/controllers/ConnectivityController;->isStrictSatisfied(Lcom/android/server/job/controllers/JobStatus;Landroid/net/Network;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest; +HPLcom/android/server/job/controllers/ConnectivityController;->isStrongEnough(Lcom/android/server/job/controllers/JobStatus;Landroid/net/NetworkCapabilities;Lcom/android/server/job/JobSchedulerService$Constants;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; +HSPLcom/android/server/job/controllers/ConnectivityController;->maybeAdjustRegisteredCallbacksLocked()V+]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/util/Pools$Pool;Landroid/util/Pools$SimplePool;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/ConnectivityController;->maybeRevokeStandbyExceptionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/controllers/ConnectivityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/job/controllers/ConnectivityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/controllers/ConnectivityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;JLandroid/net/Network;Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(ILandroid/net/Network;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController; -HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(Landroid/util/ArraySet;Landroid/net/Network;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/controllers/ConnectivityController;Lcom/android/server/job/controllers/ConnectivityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Object;Landroid/net/Network;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/ConnectivityController;->updateConstraintsSatisfied(Lcom/android/server/job/controllers/JobStatus;JLandroid/net/Network;Lcom/android/server/job/controllers/ConnectivityController$CachedNetworkMetadata;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService; +HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(ILandroid/net/Network;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService; +HPLcom/android/server/job/controllers/ConnectivityController;->updateTrackedJobsLocked(Landroid/util/ArraySet;Landroid/net/Network;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Object;Landroid/net/Network;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HPLcom/android/server/job/controllers/ContentObserverController$JobInstance;->(Lcom/android/server/job/controllers/ContentObserverController;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ContentObserverController$JobInstance;Lcom/android/server/job/controllers/ContentObserverController$JobInstance;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HPLcom/android/server/job/controllers/ContentObserverController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/ContentObserverController$JobInstance;Lcom/android/server/job/controllers/ContentObserverController$JobInstance;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/DeviceIdleJobsController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/PowerManager;Landroid/os/PowerManager;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Ljava/lang/Object;Ljava/lang/String;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->isWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->setUidActiveLocked(IZ)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor;Lcom/android/server/job/controllers/DeviceIdleJobsController$DeviceIdleUpdateFunctor; -HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->updateTaskStateLocked(Lcom/android/server/job/controllers/JobStatus;J)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/controllers/DeviceIdleJobsController;Lcom/android/server/job/controllers/DeviceIdleJobsController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;->scheduleDropNumConstraintsAlarm(Lcom/android/server/job/controllers/JobStatus;J)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/os/Handler;Lcom/android/server/job/controllers/FlexibilityController$FcHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/job/controllers/ContentObserverController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; +HSPLcom/android/server/job/controllers/ContentObserverController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/DeviceIdleJobsController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->isWhitelistedLocked(Lcom/android/server/job/controllers/JobStatus;)Z +HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->setUidActiveLocked(IZ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/DeviceIdleJobsController;->updateTaskStateLocked(Lcom/android/server/job/controllers/JobStatus;J)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;->scheduleDropNumConstraintsAlarm(Lcom/android/server/job/controllers/JobStatus;J)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue; HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->add(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->remove(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;->remove(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->addScore(IJ)V+]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker; -HPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->getScore(J)I -HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleBeginningElapsedLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Ljava/lang/Long;Ljava/lang/Long; -HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleEndElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController; -HSPLcom/android/server/job/controllers/FlexibilityController;->getNextConstraintDropTimeElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;->getScore(J)I +HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleBeginningElapsedLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController; +HSPLcom/android/server/job/controllers/FlexibilityController;->getLifeCycleEndElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController; +HSPLcom/android/server/job/controllers/FlexibilityController;->getNextConstraintDropTimeElapsedLocked(Lcom/android/server/job/controllers/JobStatus;JJ)J HSPLcom/android/server/job/controllers/FlexibilityController;->getPercentsToDropConstraints(I)[I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/job/controllers/FlexibilityController;->getRelevantAppliedConstraintsLocked(Lcom/android/server/job/controllers/JobStatus;)I HSPLcom/android/server/job/controllers/FlexibilityController;->getScoreLocked(ILjava/lang/String;J)I+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker; HSPLcom/android/server/job/controllers/FlexibilityController;->isFlexibilitySatisfiedLocked(Lcom/android/server/job/controllers/JobStatus;)Z -HSPLcom/android/server/job/controllers/FlexibilityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/FlexibilityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue; -HSPLcom/android/server/job/controllers/FlexibilityController;->onUidBiasChangedLocked(III)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/FlexibilityController;Lcom/android/server/job/controllers/FlexibilityController;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/FlexibilityController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/FlexibilityController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityTracker;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue; +HSPLcom/android/server/job/controllers/FlexibilityController;->onUidBiasChangedLocked(III)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HSPLcom/android/server/job/controllers/FlexibilityController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;Lcom/android/server/job/controllers/FlexibilityController$JobScoreTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/idle/IdlenessTracker;Lcom/android/server/job/controllers/idle/DeviceIdlenessTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/IdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->(Landroid/app/job/JobInfo;ILjava/lang/String;IILjava/lang/String;Ljava/lang/String;IIJJJJJII)V+]Landroid/app/job/JobInfo$Builder;Landroid/app/job/JobInfo$Builder;]Landroid/app/job/JobInfo$TriggerContentUri;Landroid/app/job/JobInfo$TriggerContentUri;]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/net/NetworkRequest$Builder;Landroid/net/NetworkRequest$Builder;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/job/controllers/JobStatus;->(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/JobStatus;->(Lcom/android/server/job/controllers/JobStatus;JJIIJJJ)V -HSPLcom/android/server/job/controllers/JobStatus;->addDynamicConstraints(I)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->canRunInBatterySaver()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->canRunInDoze()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/IdleController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/idle/IdlenessTracker;Lcom/android/server/job/controllers/idle/DeviceIdlenessTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/IdleController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/JobStatus;->(Landroid/app/job/JobInfo;ILjava/lang/String;IILjava/lang/String;Ljava/lang/String;IIJJJJJII)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/net/NetworkRequest$Builder;Landroid/net/NetworkRequest$Builder;]Landroid/net/NetworkRequest;Landroid/net/NetworkRequest; +HPLcom/android/server/job/controllers/JobStatus;->(Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/JobStatus;->(Lcom/android/server/job/controllers/JobStatus;JJIIJJJ)V +HSPLcom/android/server/job/controllers/JobStatus;->addDynamicConstraints(I)V +HPLcom/android/server/job/controllers/JobStatus;->applyBasicPiiFilters(Ljava/lang/String;)Ljava/lang/String; +HSPLcom/android/server/job/controllers/JobStatus;->canRunInBatterySaver()Z +HSPLcom/android/server/job/controllers/JobStatus;->canRunInDoze()Z HSPLcom/android/server/job/controllers/JobStatus;->clearTrackingController(I)Z -HSPLcom/android/server/job/controllers/JobStatus;->createFromJobInfo(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/job/controllers/JobStatus;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HPLcom/android/server/job/controllers/JobStatus;->computeSystemTraceTag()Ljava/lang/String; +HPLcom/android/server/job/controllers/JobStatus;->computeSystemTraceTagInner()Ljava/lang/String; +HSPLcom/android/server/job/controllers/JobStatus;->createFromJobInfo(Landroid/app/job/JobInfo;ILjava/lang/String;ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/job/controllers/JobStatus;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HPLcom/android/server/job/controllers/JobStatus;->dequeueWorkLocked()Landroid/app/job/JobWorkItem;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/job/controllers/JobStatus;->enqueueWorkLocked(Landroid/app/job/JobWorkItem;)V+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/JobStatus;->generateNamespaceHash(Ljava/lang/String;)Ljava/lang/String;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate; +HSPLcom/android/server/job/controllers/JobStatus;->generateNamespaceHash(Ljava/lang/String;)Ljava/lang/String;+]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate; HSPLcom/android/server/job/controllers/JobStatus;->getAppTraceTag()Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HSPLcom/android/server/job/controllers/JobStatus;->getBias()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getEarliestRunTime()J -HSPLcom/android/server/job/controllers/JobStatus;->getEffectivePriority()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->getEffectiveStandbyBucket()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->getFilteredDebugTags()[Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/job/controllers/JobStatus;->getEffectivePriority()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HSPLcom/android/server/job/controllers/JobStatus;->getEffectiveStandbyBucket()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService; +HSPLcom/android/server/job/controllers/JobStatus;->getFilteredDebugTags()[Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getFilteredTraceTag()Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getFlags()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HSPLcom/android/server/job/controllers/JobStatus;->getJob()Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getJobId()I+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getLatestRunTimeElapsed()J HSPLcom/android/server/job/controllers/JobStatus;->getServiceComponent()Landroid/content/ComponentName;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; HSPLcom/android/server/job/controllers/JobStatus;->getSourcePackageName()Ljava/lang/String; HSPLcom/android/server/job/controllers/JobStatus;->getSourceUid()I -HSPLcom/android/server/job/controllers/JobStatus;->getSourceUserId()I -HSPLcom/android/server/job/controllers/JobStatus;->getTimeoutBlamePackageName()Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->getTimeoutBlameUserId()I+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/JobStatus;->getTimeoutBlamePackageName()Ljava/lang/String; +HSPLcom/android/server/job/controllers/JobStatus;->getTimeoutBlameUserId()I HSPLcom/android/server/job/controllers/JobStatus;->getUid()I HSPLcom/android/server/job/controllers/JobStatus;->getUserId()I -HSPLcom/android/server/job/controllers/JobStatus;->getWakelockTag()Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/job/controllers/JobStatus;->getWakelockTag()Ljava/lang/String; HSPLcom/android/server/job/controllers/JobStatus;->getWorkCount()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/JobStatus;->hasBatteryNotLowConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->hasChargingConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/JobStatus;->hasBatteryNotLowConstraint()Z +HSPLcom/android/server/job/controllers/JobStatus;->hasChargingConstraint()Z HSPLcom/android/server/job/controllers/JobStatus;->hasConstraint(I)Z HSPLcom/android/server/job/controllers/JobStatus;->hasContentTriggerConstraint()Z -HSPLcom/android/server/job/controllers/JobStatus;->hasDeadlineConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->hasIdleConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->hasStorageNotLowConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->hasTimingDelayConstraint()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->isConstraintSatisfied(I)Z +HSPLcom/android/server/job/controllers/JobStatus;->hasDeadlineConstraint()Z +HSPLcom/android/server/job/controllers/JobStatus;->hasIdleConstraint()Z +HSPLcom/android/server/job/controllers/JobStatus;->hasStorageNotLowConstraint()Z +HSPLcom/android/server/job/controllers/JobStatus;->hasTimingDelayConstraint()Z HSPLcom/android/server/job/controllers/JobStatus;->isConstraintsSatisfied(I)Z HSPLcom/android/server/job/controllers/JobStatus;->isPersisted()Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HSPLcom/android/server/job/controllers/JobStatus;->isReady(I)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->isRequestedExpeditedJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->isUserVisibleJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->maybeAddForegroundExemption(Ljava/util/function/Predicate;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/function/Predicate;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1; +HSPLcom/android/server/job/controllers/JobStatus;->isReady(I)Z +HSPLcom/android/server/job/controllers/JobStatus;->isRequestedExpeditedJob()Z +HSPLcom/android/server/job/controllers/JobStatus;->isUserVisibleJob()Z +HSPLcom/android/server/job/controllers/JobStatus;->maybeAddForegroundExemption(Ljava/util/function/Predicate;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/function/Predicate;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda1; HSPLcom/android/server/job/controllers/JobStatus;->prepareLocked()V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HSPLcom/android/server/job/controllers/JobStatus;->readinessStatusWithConstraint(IZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/JobStatus;->readinessStatusWithConstraint(IZ)Z HSPLcom/android/server/job/controllers/JobStatus;->setBackgroundNotRestrictedConstraintSatisfied(JZZ)Z -HSPLcom/android/server/job/controllers/JobStatus;->setConstraintSatisfied(IJZ)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; +HSPLcom/android/server/job/controllers/JobStatus;->setConstraintSatisfied(IJZ)Z HSPLcom/android/server/job/controllers/JobStatus;->setDeviceNotDozingConstraintSatisfied(JZZ)Z -HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsExpeditedJob()Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsUserInitiatedJob()Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsExpeditedJob()Z +HSPLcom/android/server/job/controllers/JobStatus;->shouldTreatAsUserInitiatedJob()Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; +HSPLcom/android/server/job/controllers/JobStatus;->stopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/job/controllers/JobStatus;->toShortString()Ljava/lang/String;+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HPLcom/android/server/job/controllers/JobStatus;->unprepareLocked()V+]Ljava/lang/Throwable;Ljava/lang/Throwable; +HSPLcom/android/server/job/controllers/JobStatus;->unprepareLocked()V HSPLcom/android/server/job/controllers/JobStatus;->updateMediaBackupExemptionStatus()Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo; -HSPLcom/android/server/job/controllers/JobStatus;->updateNetworkBytesLocked()V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/app/job/JobWorkItem;Landroid/app/job/JobWorkItem;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/PrefetchController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/PrefetchController;Lcom/android/server/job/controllers/PrefetchController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock; -HPLcom/android/server/job/controllers/PrefetchController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener; -HSPLcom/android/server/job/controllers/QuotaController$QcHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppAdded(I)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/JobStatus;->updateNetworkBytesLocked()V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/PrefetchController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;,Ljava/time/Clock$SystemClock; +HSPLcom/android/server/job/controllers/PrefetchController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener; +HSPLcom/android/server/job/controllers/QuotaController$QcHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppAdded(I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HPLcom/android/server/job/controllers/QuotaController$TempAllowlistTracker;->onAppRemoved(I)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/QuotaController$Timer;->cancelCutoff()V HPLcom/android/server/job/controllers/QuotaController$Timer;->emitSessionLocked(J)V HPLcom/android/server/job/controllers/QuotaController$Timer;->getCurrentDuration(J)J HPLcom/android/server/job/controllers/QuotaController$Timer;->isActive()Z HPLcom/android/server/job/controllers/QuotaController$Timer;->scheduleCutoff()V HSPLcom/android/server/job/controllers/QuotaController$Timer;->shouldTrackLocked()Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HSPLcom/android/server/job/controllers/QuotaController$Timer;->startTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/QuotaController$Timer;->stopTrackingJob(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/QuotaController$TimingSession;->(JJI)V -HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; -HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->postProcess()V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/job/controllers/QuotaController$Timer;->stopTrackingJob(Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->accept(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; +HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->postProcess()V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; HSPLcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;->prepare()V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/QuotaController;->calculateTimeUntilQuotaConsumedLocked(Ljava/util/List;JJZ)J+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/QuotaController;->getEJDebitsLocked(ILjava/lang/String;)Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/QuotaController;->getExecutionStatsLocked(ILjava/lang/String;IZ)Lcom/android/server/job/controllers/QuotaController$ExecutionStats;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/QuotaController;->getMaxJobExecutionTimeMsLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController; -HSPLcom/android/server/job/controllers/QuotaController;->getRemainingEJExecutionTimeLocked(ILjava/lang/String;)J+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;Lcom/android/server/job/controllers/QuotaController$ShrinkableDebits;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Lcom/android/server/job/controllers/QuotaController$TopAppTimer;Lcom/android/server/job/controllers/QuotaController$TopAppTimer;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/QuotaController;->getExecutionStatsLocked(ILjava/lang/String;IZ)Lcom/android/server/job/controllers/QuotaController$ExecutionStats;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->getMaxJobExecutionTimeMsLocked(Lcom/android/server/job/controllers/JobStatus;)J+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/QuotaController;->getRemainingEJExecutionTimeLocked(ILjava/lang/String;)J+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/job/controllers/QuotaController;->getRemainingExecutionTimeLocked(Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)J -HPLcom/android/server/job/controllers/QuotaController;->getTimeUntilQuotaConsumedLocked(ILjava/lang/String;)J+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/job/controllers/QuotaController;->getTimeUntilQuotaConsumedLocked(ILjava/lang/String;)J+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/job/controllers/QuotaController;->incrementJobCountLocked(ILjava/lang/String;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HPLcom/android/server/job/controllers/QuotaController;->incrementTimingSessionCountLocked(ILjava/lang/String;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; HPLcom/android/server/job/controllers/QuotaController;->invalidateAllExecutionStatsLocked(ILjava/lang/String;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->isQuotaFreeLocked(I)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; HSPLcom/android/server/job/controllers/QuotaController;->isUidInForeground(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/job/controllers/QuotaController;->isWithinQuotaLocked(ILjava/lang/String;I)Z+]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController; -HSPLcom/android/server/job/controllers/QuotaController;->isWithinQuotaLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController; -HSPLcom/android/server/job/controllers/QuotaController;->maybeScheduleStartAlarmLocked(ILjava/lang/String;I)V+]Landroid/os/Handler;Lcom/android/server/job/controllers/QuotaController$QcHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/QuotaController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/QuotaController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; -HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForPkgLocked(JILjava/lang/String;)Landroid/util/ArraySet;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController;Lcom/android/server/job/controllers/QuotaController;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; -HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForUidLocked(I)Landroid/util/ArraySet;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/JobStore;Lcom/android/server/job/JobStore;]Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater; +HSPLcom/android/server/job/controllers/QuotaController;->isUnderJobCountQuotaLocked(Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->isUnderSessionCountQuotaLocked(Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)Z+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->isWithinQuotaLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/QuotaController;->maybeScheduleStartAlarmLocked(ILjava/lang/String;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/QuotaController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; +HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForPkgLocked(JILjava/lang/String;)Landroid/util/ArraySet;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; +HSPLcom/android/server/job/controllers/QuotaController;->maybeUpdateConstraintForUidLocked(I)Landroid/util/ArraySet;+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater;Lcom/android/server/job/controllers/QuotaController$UidConstraintUpdater; HSPLcom/android/server/job/controllers/QuotaController;->prepareForExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HPLcom/android/server/job/controllers/QuotaController;->saveTimingSession(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$TimingSession;ZJ)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/QuotaController;->setConstraintSatisfied(Lcom/android/server/job/controllers/JobStatus;JZZ)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/QuotaController;->unprepareFromExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer; -HSPLcom/android/server/job/controllers/QuotaController;->updateExecutionStatsLocked(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$TimedEvent;Lcom/android/server/job/controllers/QuotaController$TimingSession;]Lcom/android/server/job/controllers/QuotaController$Timer;Lcom/android/server/job/controllers/QuotaController$Timer;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/job/controllers/QuotaController;->updateStandbyBucket(ILjava/lang/String;I)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HSPLcom/android/server/job/controllers/StateController;->wouldBeReadyWithConstraintLocked(Lcom/android/server/job/controllers/JobStatus;I)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/StorageController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StorageController$StorageTracker;Lcom/android/server/job/controllers/StorageController$StorageTracker;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; -HPLcom/android/server/job/controllers/StorageController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HSPLcom/android/server/job/controllers/TimeController;->canStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)Z+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus; -HPLcom/android/server/job/controllers/TimeController;->checkExpiredDeadlinesAndResetAlarm()V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Ljava/util/PriorityQueue$Itr;]Ljava/util/List;Ljava/util/LinkedList;]Ljava/util/ListIterator;Ljava/util/LinkedList$ListItr;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HPLcom/android/server/job/controllers/TimeController;->checkExpiredDelaysAndResetAlarm()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Ljava/util/LinkedList$ListItr;,Ljava/util/PriorityQueue$Itr;]Ljava/util/List;Ljava/util/LinkedList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/controllers/QuotaController;->setConstraintSatisfied(Lcom/android/server/job/controllers/JobStatus;JZZ)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/QuotaController;->unprepareFromExecutionLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; +HSPLcom/android/server/job/controllers/QuotaController;->updateExecutionStatsLocked(ILjava/lang/String;Lcom/android/server/job/controllers/QuotaController$ExecutionStats;)V+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/job/controllers/QuotaController$TimedEvent;Lcom/android/server/job/controllers/QuotaController$TimingSession;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/job/controllers/StateController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/StateController;->wouldBeReadyWithConstraintLocked(Lcom/android/server/job/controllers/JobStatus;I)Z+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; +HSPLcom/android/server/job/controllers/StorageController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2; +HSPLcom/android/server/job/controllers/StorageController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V +HSPLcom/android/server/job/controllers/TimeController$1;->compare(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)I +HSPLcom/android/server/job/controllers/TimeController$1;->compare(Ljava/lang/Object;Ljava/lang/Object;)I+]Lcom/android/server/job/controllers/TimeController$1;Lcom/android/server/job/controllers/TimeController$1; +HSPLcom/android/server/job/controllers/TimeController;->canStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;)Z +HSPLcom/android/server/job/controllers/TimeController;->checkExpiredDeadlinesAndResetAlarm()V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Ljava/util/PriorityQueue$Itr;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/controllers/TimeController;->checkExpiredDelaysAndResetAlarm()V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/Iterator;Ljava/util/PriorityQueue$Itr;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; HSPLcom/android/server/job/controllers/TimeController;->evaluateDeadlineConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z -HSPLcom/android/server/job/controllers/TimeController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/LinkedList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/controllers/TimeController;->evaluateStateLocked(Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/StateChangedListener;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; HSPLcom/android/server/job/controllers/TimeController;->evaluateTimingDelayConstraint(Lcom/android/server/job/controllers/JobStatus;J)Z -HSPLcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/StateController;Lcom/android/server/job/controllers/TimeController;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/List;Ljava/util/LinkedList;]Ljava/util/ListIterator;Ljava/util/LinkedList$ListItr;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HSPLcom/android/server/job/controllers/TimeController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController;]Ljava/util/List;Ljava/util/LinkedList;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; -HSPLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JLandroid/os/WorkSource;)V+]Lcom/android/server/job/controllers/TimeController;Lcom/android/server/job/controllers/TimeController; +HSPLcom/android/server/job/controllers/TimeController;->maybeStartTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService;]Ljava/time/Clock;Lcom/android/server/job/JobSchedulerService$2;]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/controllers/TimeController;->maybeStopTrackingJobLocked(Lcom/android/server/job/controllers/JobStatus;Lcom/android/server/job/controllers/JobStatus;)V+]Ljava/util/PriorityQueue;Ljava/util/PriorityQueue; +HSPLcom/android/server/job/controllers/TimeController;->setDelayExpiredAlarmLocked(JLandroid/os/WorkSource;)V +HSPLcom/android/server/job/restrictions/ThermalStatusRestriction;->isJobRestricted(Lcom/android/server/job/controllers/JobStatus;I)Z+]Landroid/app/job/JobInfo;Landroid/app/job/JobInfo;]Lcom/android/server/job/JobSchedulerService;Lcom/android/server/job/JobSchedulerService; HSPLcom/android/server/lights/LightsService$LightImpl;->setLightLocked(IIIII)V -HSPLcom/android/server/location/LocationManagerService;->getLocationProviderManager(Ljava/lang/String;)Lcom/android/server/location/provider/LocationProviderManager;+]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/provider/PassiveLocationProviderManager;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; HSPLcom/android/server/location/LocationManagerService;->isLocationEnabledForUser(I)Z+]Lcom/android/server/location/injector/Injector;Lcom/android/server/location/LocationManagerService$SystemInjector;]Lcom/android/server/location/injector/SettingsHelper;Lcom/android/server/location/injector/SystemSettingsHelper; -HSPLcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;->add(Ljava/lang/Object;)Z+]Ljava/util/concurrent/ConcurrentLinkedDeque;Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque; -HPLcom/android/server/location/contexthub/ContextHubClientBroker;->doSendMessageToNanoApp(Landroid/hardware/location/NanoAppMessage;Landroid/hardware/location/IContextHubTransactionCallback;)I+]Landroid/hardware/location/ContextHubInfo;Landroid/hardware/location/ContextHubInfo;]Lcom/android/server/location/contexthub/ContextHubEventLogger;Lcom/android/server/location/contexthub/ContextHubEventLogger;]Lcom/android/server/location/contexthub/IContextHubWrapper;Lcom/android/server/location/contexthub/IContextHubWrapper$ContextHubWrapperAidl;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/location/contexthub/ContextHubClientBroker;->sendMessageToClient(Landroid/hardware/location/NanoAppMessage;Ljava/util/List;Ljava/util/List;)B+]Landroid/hardware/location/NanoAppMessage;Landroid/hardware/location/NanoAppMessage;]Lcom/android/server/location/contexthub/ContextHubClientBroker;Lcom/android/server/location/contexthub/ContextHubClientBroker;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/location/contexthub/ContextHubServiceTransaction;->toString()Ljava/lang/String; -HPLcom/android/server/location/contexthub/ContextHubServiceUtil;->createAidlContextHubMessage(SLandroid/hardware/location/NanoAppMessage;)Landroid/hardware/contexthub/ContextHubMessage; -HSPLcom/android/server/location/contexthub/ContextHubServiceUtil;->createNanoAppStateList([Landroid/hardware/contexthub/NanoappInfo;)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->addTransaction(Lcom/android/server/location/contexthub/ContextHubServiceTransaction;)V+]Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;Lcom/android/server/location/contexthub/ConcurrentLinkedEvictingDeque;]Lcom/android/server/location/contexthub/ContextHubServiceTransaction;Lcom/android/server/location/contexthub/ContextHubTransactionManager$6;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; -HSPLcom/android/server/location/contexthub/ContextHubTransactionManager;->startNextTransaction()V+]Lcom/android/server/location/contexthub/ContextHubServiceTransaction;Lcom/android/server/location/contexthub/ContextHubTransactionManager$6;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque;]Ljava/util/concurrent/ScheduledThreadPoolExecutor;Ljava/util/concurrent/ScheduledThreadPoolExecutor; -HSPLcom/android/server/location/contexthub/NanoAppStateManager;->getNanoAppHandle(IJ)I+]Landroid/hardware/location/NanoAppInstanceInfo;Landroid/hardware/location/NanoAppInstanceInfo;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator; -HSPLcom/android/server/location/contexthub/NanoAppStateManager;->updateCache(ILjava/util/List;)V+]Landroid/hardware/location/NanoAppInstanceInfo;Landroid/hardware/location/NanoAppInstanceInfo;]Landroid/hardware/location/NanoAppState;Landroid/hardware/location/NanoAppState;]Lcom/android/server/location/contexthub/NanoAppStateManager;Lcom/android/server/location/contexthub/NanoAppStateManager;]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/HashSet;Ljava/util/HashSet;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Ljava/util/HashMap$ValueIterator;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/location/eventlog/LocalEventLog;->addLog(JLjava/lang/Object;)V+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;,Lcom/android/server/location/eventlog/LocationEventLog; -HSPLcom/android/server/location/eventlog/LocalEventLog;->addLogEventInternal(ZILjava/lang/Object;)V+]Lcom/android/server/location/eventlog/LocalEventLog;Lcom/android/server/location/eventlog/LocationEventLog$LocationsEventLog;,Lcom/android/server/location/eventlog/LocationEventLog; -HSPLcom/android/server/location/injector/AppForegroundHelper;->notifyAppForeground(IZ)V+]Lcom/android/server/location/injector/AppForegroundHelper$AppForegroundListener;Lcom/android/server/location/gnss/GnssListenerMultiplexer$$ExternalSyntheticLambda4;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda6;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda7;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList; -HPLcom/android/server/location/injector/SystemAppOpsHelper;->noteOpNoThrow(ILandroid/location/util/identity/CallerIdentity;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity; -HSPLcom/android/server/location/injector/SystemSettingsHelper$IntegerSecureSetting;->getValueForUser(II)I+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;->acquire()Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard; -HSPLcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;->close()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/gnss/GnssStatusProvider;,Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/provider/PassiveLocationProviderManager;]Ljava/util/Map$Entry;Ljava/util/AbstractMap$SimpleImmutableEntry; -HSPLcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;->close()V+]Lcom/android/server/location/listeners/ListenerMultiplexer;megamorphic_types -HPLcom/android/server/location/listeners/ListenerMultiplexer;->deliverToListeners(Ljava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Lcom/android/server/location/listeners/ListenerRegistration;Lcom/android/server/location/gnss/GnssListenerMultiplexer$GnssListenerRegistration;,Lcom/android/server/location/gnss/GnssMeasurementsProvider$GnssMeasurementListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationPendingIntentRegistration;]Ljava/util/function/Function;Lcom/android/server/location/gnss/GnssMeasurementsProvider$$ExternalSyntheticLambda0;,Lcom/android/server/location/gnss/GnssNmeaProvider$1;,Lcom/android/server/location/gnss/GnssStatusProvider$$ExternalSyntheticLambda1;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda12;,Lcom/android/server/location/provider/LocationProviderManager$$ExternalSyntheticLambda13; -HSPLcom/android/server/location/listeners/ListenerMultiplexer;->updateRegistrations(Ljava/util/function/Predicate;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;Lcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;]Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;Lcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;]Lcom/android/server/location/listeners/ListenerMultiplexer;Lcom/android/server/location/gnss/GnssStatusProvider;,Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/provider/PassiveLocationProviderManager;]Ljava/util/function/Predicate;megamorphic_types -HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$1;->test(Landroid/location/Location;)Z+]Landroid/location/Location;Landroid/location/Location;]Landroid/location/LocationRequest;Landroid/location/LocationRequest;]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationPendingIntentRegistration; -HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration$2;->operate(Lcom/android/server/location/provider/LocationProviderManager$LocationTransport;)V+]Landroid/location/LocationResult;Landroid/location/LocationResult;]Landroid/location/util/identity/CallerIdentity;Landroid/location/util/identity/CallerIdentity;]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Lcom/android/server/location/provider/LocationProviderManager$LocationTransport;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerTransport;,Lcom/android/server/location/provider/LocationProviderManager$LocationPendingIntentTransport;]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationPendingIntentRegistration; -HPLcom/android/server/location/provider/LocationProviderManager$LocationRegistration;->acceptLocationChange(Landroid/location/LocationResult;)Lcom/android/internal/listeners/ListenerExecutor$ListenerOperation;+]Landroid/location/LocationRequest;Landroid/location/LocationRequest;]Landroid/location/LocationResult;Landroid/location/LocationResult;]Lcom/android/server/location/injector/AppOpsHelper;Lcom/android/server/location/injector/SystemAppOpsHelper;]Lcom/android/server/location/provider/LocationProviderManager$Registration;Lcom/android/server/location/provider/LocationProviderManager$LocationListenerRegistration;,Lcom/android/server/location/provider/LocationProviderManager$LocationPendingIntentRegistration;]Lcom/android/server/location/provider/LocationProviderManager;Lcom/android/server/location/provider/LocationProviderManager;,Lcom/android/server/location/provider/PassiveLocationProviderManager; -HSPLcom/android/server/location/provider/LocationProviderManager;->isEnabled(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/location/listeners/ListenerMultiplexer$ReentrancyGuard;->close()V+]Ljava/util/Map$Entry;Ljava/util/AbstractMap$SimpleImmutableEntry; +HSPLcom/android/server/location/listeners/ListenerMultiplexer$UpdateServiceBuffer;->close()V +HSPLcom/android/server/location/listeners/ListenerMultiplexer;->updateRegistrations(Ljava/util/function/Predicate;)V+]Ljava/util/function/Predicate;megamorphic_types +HSPLcom/android/server/location/provider/LocationProviderManager$Registration;->onForegroundChanged(IZ)Z+]Lcom/android/server/location/eventlog/LocationEventLog;Lcom/android/server/location/eventlog/LocationEventLog;]Lcom/android/server/location/injector/LocationPowerSaveModeHelper;Lcom/android/server/location/injector/SystemLocationPowerSaveModeHelper; HSPLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->equals(Ljava/lang/Object;)Z -HSPLcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;->hashCode()I -HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->contains(ILjava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey; -HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->peek(ILjava/lang/String;I)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey;Lcom/android/server/locksettings/LockSettingsStorage$Cache$CacheKey; -HSPLcom/android/server/locksettings/LockSettingsStorage$Cache;->peekKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String; -HSPLcom/android/server/locksettings/LockSettingsStorage;->readKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteDatabase;Landroid/database/sqlite/SQLiteDatabase;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;]Lcom/android/server/locksettings/LockSettingsStorage$Cache;Lcom/android/server/locksettings/LockSettingsStorage$Cache; -HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->maybeUpdateDiscoveryPreferenceForUid(I)V+]Landroid/os/Handler;Lcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head; +HSPLcom/android/server/locksettings/LockSettingsStorage;->readKeyValue(Ljava/lang/String;Ljava/lang/String;I)Ljava/lang/String;+]Landroid/database/Cursor;Landroid/database/sqlite/SQLiteCursor;]Landroid/database/sqlite/SQLiteOpenHelper;Lcom/android/server/locksettings/LockSettingsStorage$DatabaseHelper;]Lcom/android/server/locksettings/LockSettingsStorage$Cache;Lcom/android/server/locksettings/LockSettingsStorage$Cache; +HPLcom/android/server/media/MediaRouter2ServiceImpl$UserHandler;->maybeUpdateDiscoveryPreferenceForUid(I)V+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/stream/Stream;Ljava/util/stream/ReferencePipeline$Head; HSPLcom/android/server/net/NetworkManagementService$Dependencies;->getCallingUid()I HSPLcom/android/server/net/NetworkManagementService$LocalService;->isNetworkRestrictedForUid(I)Z -HPLcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener$$ExternalSyntheticLambda3;->run()V HSPLcom/android/server/net/NetworkManagementService;->enforceSystemUid()V+]Lcom/android/server/net/NetworkManagementService$Dependencies;Lcom/android/server/net/NetworkManagementService$Dependencies; HSPLcom/android/server/net/NetworkManagementService;->getFirewallChainState(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/net/NetworkManagementService;->getFirewallRuleName(II)Ljava/lang/String; HSPLcom/android/server/net/NetworkManagementService;->getUidFirewallRulesLR(I)Landroid/util/SparseIntArray; -HSPLcom/android/server/net/NetworkManagementService;->isNetworkRestrictedInternal(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService; -HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRule(III)V+]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService; -HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRuleLocked(III)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService; +HSPLcom/android/server/net/NetworkManagementService;->isNetworkRestrictedInternal(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRule(III)V +HSPLcom/android/server/net/NetworkManagementService;->setFirewallUidRuleLocked(III)V+]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager; HSPLcom/android/server/net/NetworkManagementService;->setUidCleartextNetworkPolicy(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkManagementService$Dependencies;Lcom/android/server/net/NetworkManagementService$Dependencies; -HSPLcom/android/server/net/NetworkManagementService;->setUidOnMeteredNetworkList(IZZ)V+]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/net/NetworkManagementService;->updateFirewallUidRuleLocked(III)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkManagementService;Lcom/android/server/net/NetworkManagementService;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->appIdleStateChanged(IZ)V +HSPLcom/android/server/net/NetworkManagementService;->updateFirewallUidRuleLocked(III)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->tempPowerSaveWlChanged(IZILjava/lang/String;)V -HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidFirewallRuleChanged(III)V+]Lcom/android/internal/util/RingBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;]Lcom/android/server/net/NetworkPolicyLogger$Data;Lcom/android/server/net/NetworkPolicyLogger$Data; +HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidFirewallRuleChanged(III)V HSPLcom/android/server/net/NetworkPolicyLogger$LogBuffer;->uidStateChanged(IIJI)V -HSPLcom/android/server/net/NetworkPolicyLogger;->uidFirewallRuleChanged(III)V+]Lcom/android/server/net/NetworkPolicyLogger$LogBuffer;Lcom/android/server/net/NetworkPolicyLogger$LogBuffer; -HSPLcom/android/server/net/NetworkPolicyManagerService$15;->handleMessage(Landroid/os/Message;)Z+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/SomeArgs;Lcom/android/internal/os/SomeArgs;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long; +HSPLcom/android/server/net/NetworkPolicyLogger;->uidFirewallRuleChanged(III)V +HSPLcom/android/server/net/NetworkPolicyLogger;->uidStateChanged(IIJI)V +HSPLcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda5;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/net/NetworkPolicyManagerService$15;->handleMessage(Landroid/os/Message;)Z+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; HSPLcom/android/server/net/NetworkPolicyManagerService$4;->isUidStateChangeRelevant(Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;IJI)Z -HSPLcom/android/server/net/NetworkPolicyManagerService$4;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/net/NetworkPolicyManagerService$4;Lcom/android/server/net/NetworkPolicyManagerService$4;]Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo;Lcom/android/server/net/NetworkPolicyManagerService$UidStateCallbackInfo; -HSPLcom/android/server/net/NetworkPolicyManagerService$NetPolicyAppIdleStateChangeListener;->onAppIdleStateChanged(Ljava/lang/String;IZII)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; +HSPLcom/android/server/net/NetworkPolicyManagerService$4;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl;->onTempPowerSaveWhitelistChange(IZILjava/lang/String;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger; +HSPLcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;->deriveUidRules()I HSPLcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;->updateEffectiveBlockedReasons()V HSPLcom/android/server/net/NetworkPolicyManagerService;->getOrCreateUidBlockedStateForUid(Landroid/util/SparseArray;I)Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/net/NetworkPolicyManagerService;->handleUidChanged(I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; +HSPLcom/android/server/net/NetworkPolicyManagerService;->handleUidChanged(I)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger; HSPLcom/android/server/net/NetworkPolicyManagerService;->hasInternetPermissionUL(I)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/net/NetworkPolicyManagerService;->isAllowlistedFromPowerSaveUL(IZ)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; +HSPLcom/android/server/net/NetworkPolicyManagerService;->isAllowlistedFromPowerSaveUL(IZ)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidExemptFromBackgroundRestrictions(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray; HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidForegroundOnRestrictPowerUL(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidIdle(II)Z+]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForAllowlistRulesUL(I)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; -HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForDenylistRulesUL(I)Z+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; -HSPLcom/android/server/net/NetworkPolicyManagerService;->lambda$forEachUid$7(Landroid/util/SparseBooleanArray;ILjava/util/function/IntConsumer;Lcom/android/server/pm/pkg/AndroidPackage;)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/function/IntConsumer;Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda0;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda2;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda3;,Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda7; +HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForDenylistRulesUL(I)Z +HSPLcom/android/server/net/NetworkPolicyManagerService;->isUidValidForRulesUL(I)Z HSPLcom/android/server/net/NetworkPolicyManagerService;->postBlockedReasonsChangedMsg(III)V -HSPLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRuleUL(III)V+]Landroid/os/INetworkManagementService;Lcom/android/server/net/NetworkManagementService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/net/Network;Landroid/net/Network;]Landroid/net/NetworkCapabilities;Landroid/net/NetworkCapabilities;]Landroid/net/NetworkIdentity$Builder;Landroid/net/NetworkIdentity$Builder;]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Landroid/net/NetworkStateSnapshot;Landroid/net/NetworkStateSnapshot;]Landroid/net/NetworkTemplate;Landroid/net/NetworkTemplate;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/time/Instant;Ljava/time/Instant;]Ljava/time/ZonedDateTime;Ljava/time/ZonedDateTime;]Ljava/util/Iterator;Landroid/net/NetworkPolicyManager$1;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/net/NetworkPolicyManagerService;->setUidFirewallRuleUL(III)V+]Landroid/os/INetworkManagementService;Lcom/android/server/net/NetworkManagementService;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkPolicyLogger;Lcom/android/server/net/NetworkPolicyLogger; +HPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkRulesNL()V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/ConnectivityManager;Landroid/net/ConnectivityManager;]Landroid/net/Network;Landroid/net/Network;]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNetworkStats(IZ)V+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager; HSPLcom/android/server/net/NetworkPolicyManagerService;->updateNotificationsNL()V+]Landroid/net/NetworkPolicy;Landroid/net/NetworkPolicy;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/time/Clock;Landroid/os/BestClock; -HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(II)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForAppIdleUL(II)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRuleForBackgroundUL(I)V HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForDataUsageRestrictionsULInner(I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; -HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(II)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; -HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IZ)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IZ)V+]Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;Lcom/android/server/net/NetworkPolicyManagerService$UidBlockedState;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; +HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsUL(IZ)V +HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForPowerRestrictionsULInner(IZ)V+]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; HSPLcom/android/server/net/NetworkPolicyManagerService;->updateRulesForTempAllowlistChangeUL(I)V+]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/net/NetworkPolicyManagerService;->updateUidStateUL(IIJI)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/net/NetworkPolicyManagerService;Lcom/android/server/net/NetworkPolicyManagerService; HSPLcom/android/server/net/watchlist/DigestUtils;->getSha256Hash(Ljava/io/InputStream;)[B+]Ljava/io/InputStream;Ljava/io/FileInputStream;]Ljava/security/MessageDigest;Ljava/security/MessageDigest$Delegate; @@ -1999,207 +2029,226 @@ HPLcom/android/server/net/watchlist/NetworkWatchlistService$1;->onConnectEvent(L HPLcom/android/server/net/watchlist/NetworkWatchlistService$1;->onDnsEvent(IIILjava/lang/String;[Ljava/lang/String;IJI)V+]Lcom/android/server/net/watchlist/WatchlistLoggingHandler;Lcom/android/server/net/watchlist/WatchlistLoggingHandler; HPLcom/android/server/net/watchlist/WatchlistConfig;->containsDomain(Ljava/lang/String;)Z HPLcom/android/server/net/watchlist/WatchlistConfig;->containsIp(Ljava/lang/String;)Z -HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->asyncNetworkEvent(Ljava/lang/String;[Ljava/lang/String;I)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/Handler;Lcom/android/server/net/watchlist/WatchlistLoggingHandler;]Landroid/os/Message;Landroid/os/Message; -HSPLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; -HSPLcom/android/server/notification/BubbleExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/BubbleExtractor;Lcom/android/server/notification/BubbleExtractor;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; +HPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->asyncNetworkEvent(Ljava/lang/String;[Ljava/lang/String;I)V +HSPLcom/android/server/net/watchlist/WatchlistLoggingHandler;->handleMessage(Landroid/os/Message;)V +HSPLcom/android/server/notification/BadgeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; +HSPLcom/android/server/notification/BubbleExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/BubbleExtractor;Lcom/android/server/notification/BubbleExtractor;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->enabledAndUserMatches(I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles; +HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->getService()Landroid/os/IInterface; HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->hashCode()I -HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isPermittedForProfile(I)Z+]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles; +HSPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isEnabledForCurrentProfiles()Z HPLcom/android/server/notification/ManagedServices$ManagedServiceInfo;->isSameUser(I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo; -HSPLcom/android/server/notification/ManagedServices$UserProfiles;->isCurrentProfile(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/notification/ManagedServices;->getServiceFromTokenLocked(Landroid/os/IInterface;)Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;+]Landroid/os/IInterface;Landroid/service/notification/ConditionProviderService$Provider;,Landroid/service/notification/IConditionProvider$Stub$Proxy;,Landroid/service/notification/INotificationListener$Stub$Proxy;,Landroid/service/notification/NotificationListenerService$NotificationListenerWrapper;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/notification/ManagedServices;->getServices()Ljava/util/List; -HSPLcom/android/server/notification/ManagedServices;->isPackageOrComponentAllowed(Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/notification/ManagedServices;->isServiceTokenValidLocked(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants; -HSPLcom/android/server/notification/ManagedServices;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/ConditionProviders;,Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;,Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/notification/NotificationAttentionHelper;->buzzBeepBlinkLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)I+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/media/AudioManager;Landroid/media/AudioManager;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/view/accessibility/AccessibilityManager;Landroid/view/accessibility/AccessibilityManager;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationChannelExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; -HPLcom/android/server/notification/NotificationComparator;->compare(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationComparator;Lcom/android/server/notification/NotificationComparator;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationIntrusivenessExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HPLcom/android/server/notification/NotificationManagerService$12;->applyEnqueuedAdjustmentFromAssistant(Landroid/service/notification/INotificationListener;Landroid/service/notification/Adjustment;)V+]Landroid/service/notification/Adjustment;Landroid/service/notification/Adjustment;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12; -HPLcom/android/server/notification/NotificationManagerService$12;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/notification/ManagedServices;->isPackageOrComponentAllowed(Ljava/lang/String;I)Z +HSPLcom/android/server/notification/ManagedServices;->isServiceTokenValidLocked(Landroid/os/IInterface;)Z +HSPLcom/android/server/notification/ManagedServices;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/ConditionProviders;,Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;,Lcom/android/server/notification/NotificationManagerService$NotificationListeners; +HSPLcom/android/server/notification/NotificationAttentionHelper;->buzzBeepBlinkLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationAttentionHelper$Signals;)I+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/media/AudioManager;Landroid/media/AudioManager;]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationChannelExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/media/AudioAttributes$Builder;Landroid/media/AudioAttributes$Builder;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; +HSPLcom/android/server/notification/NotificationIntrusivenessExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration; +HPLcom/android/server/notification/NotificationManagerService$12;->applyEnqueuedAdjustmentFromAssistant(Landroid/service/notification/INotificationListener;Landroid/service/notification/Adjustment;)V+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabled(Ljava/lang/String;)Z+]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12; +HPLcom/android/server/notification/NotificationManagerService$12;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z +HPLcom/android/server/notification/NotificationManagerService$12;->canNotifyAsPackage(Ljava/lang/String;Ljava/lang/String;I)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; HSPLcom/android/server/notification/NotificationManagerService$12;->cancelNotificationWithTag(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannels(Ljava/lang/String;Landroid/content/pm/ParceledListSlice;)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; HSPLcom/android/server/notification/NotificationManagerService$12;->createNotificationChannelsImpl(Ljava/lang/String;ILandroid/content/pm/ParceledListSlice;I)V+]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/ConditionProviders;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Arrays$ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/notification/NotificationManagerService$12;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; +HPLcom/android/server/notification/NotificationManagerService$12;->enforceSystemOrSystemUIOrSamePackage(Ljava/lang/String;Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl; +HSPLcom/android/server/notification/NotificationManagerService$12;->getAppActiveNotifications(Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HPLcom/android/server/notification/NotificationManagerService$12;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZLjava/lang/String;)Landroid/app/NotificationChannel;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannelGroup(Ljava/lang/String;Ljava/lang/String;)Landroid/app/NotificationChannelGroup;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; +HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannelGroups(Ljava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; HPLcom/android/server/notification/NotificationManagerService$12;->getNotificationChannels(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/ParceledListSlice;+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/notification/NotificationManagerService$12;Lcom/android/server/notification/NotificationManagerService$12;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; -HPLcom/android/server/notification/NotificationManagerService$12;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/notification/NotificationManagerService$13;->areNotificationsEnabledForPackage(Ljava/lang/String;I)Z +HPLcom/android/server/notification/NotificationManagerService$12;->sanitizeSbn(Ljava/lang/String;ILandroid/service/notification/StatusBarNotification;)Landroid/service/notification/StatusBarNotification;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; HSPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;->(Lcom/android/server/notification/NotificationManagerService;IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;J)V -HSPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;->run()V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper; -HSPLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;->enqueueNotification()Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationEnqueuedLocked(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService$TrimCache;Lcom/android/server/notification/NotificationManagerService$TrimCache;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getNotificationListenerFilter(Landroid/util/Pair;)Landroid/service/notification/NotificationListenerFilter;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isListenerPackage(Ljava/lang/String;)Z+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;->run()V+]Landroid/app/Notification;Landroid/app/Notification;]Lcom/android/server/notification/NotificationDelegate;Lcom/android/server/notification/NotificationManagerService$1;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper; +HSPLcom/android/server/notification/NotificationManagerService$EnqueueNotificationRunnable;->enqueueNotification()Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/TimeToLiveHelper;Lcom/android/server/notification/TimeToLiveHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/notification/NotificationManagerService$NotificationAssistants;->onNotificationEnqueuedLocked(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/service/notification/INotificationListener;Landroid/service/notification/INotificationListener$Stub$Proxy;]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->getNotificationListenerFilter(Landroid/util/Pair;)Landroid/service/notification/NotificationListenerFilter; HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->isUidTrusted(I)Z -HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->prepareNotifyPostedLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Z)Ljava/util/List;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService$TrimCache;Lcom/android/server/notification/NotificationManagerService$TrimCache;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->postNotification()Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/logging/InstanceIdSequence;Lcom/android/internal/logging/InstanceIdSequence;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles;]Lcom/android/server/notification/NotificationAttentionHelper;Lcom/android/server/notification/NotificationAttentionHelper;]Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->notifyNotificationChannelGroupChanged(Ljava/lang/String;Landroid/os/UserHandle;Landroid/app/NotificationChannelGroup;I)V+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService$NotificationListeners;->prepareNotifyPostedLocked(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Z)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService$PostNotificationRunnable;->postNotification()Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/internal/logging/InstanceIdSequence;Lcom/android/internal/logging/InstanceIdSequence;]Lcom/android/server/notification/ManagedServices$UserProfiles;Lcom/android/server/notification/ManagedServices$UserProfiles;]Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/notification/NotificationManagerService$StrongAuthTracker;->isInLockDownMode(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HSPLcom/android/server/notification/NotificationManagerService$TrimCache;->ForListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/StatusBarNotification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners; -HSPLcom/android/server/notification/NotificationManagerService;->areNotificationsEnabledForPackageInt(Ljava/lang/String;I)Z+]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper; +HSPLcom/android/server/notification/NotificationManagerService$WorkerHandler;->scheduleCancelNotification(Lcom/android/server/notification/NotificationManagerService$CancelNotificationRunnable;I)V +HPLcom/android/server/notification/NotificationManagerService;->applyAdjustmentLocked(Lcom/android/server/notification/NotificationRecord;Landroid/service/notification/Adjustment;Z)V+]Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HSPLcom/android/server/notification/NotificationManagerService;->areNotificationsEnabledForPackageInt(Ljava/lang/String;I)Z HSPLcom/android/server/notification/NotificationManagerService;->cancelNotification(IILjava/lang/String;Ljava/lang/String;IIIZIIIILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)V+]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler; HSPLcom/android/server/notification/NotificationManagerService;->cancelNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;III)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; -HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; -HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;II)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;)V +HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSameApp(Ljava/lang/String;II)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HSPLcom/android/server/notification/NotificationManagerService;->checkCallerIsSystemOrSameApp(Ljava/lang/String;)V+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; -HSPLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;ZZ)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/Notification$Action;Landroid/app/Notification$Action;]Landroid/app/Notification$BubbleMetadata;Landroid/app/Notification$BubbleMetadata;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/SnoozeHelper;Lcom/android/server/notification/SnoozeHelper;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZLcom/android/server/notification/NotificationManagerService$PostNotificationTracker;Z)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/PendingIntent;Landroid/app/PendingIntent;]Landroid/os/Handler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Set;Ljava/util/ImmutableCollections$SetN; -HSPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService;->findNotificationLocked(Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationManagerService;->fixNotification(Landroid/app/Notification;Ljava/lang/String;Ljava/lang/String;IIILandroid/app/ActivityManagerInternal$ServiceNotificationPolicy;Z)V+]Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;]Landroid/app/Notification$CallStyle;Landroid/app/Notification$CallStyle;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/content/AttributionSource$Builder;Landroid/content/AttributionSource$Builder;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/notification/NotificationManagerService;->getNotificationCount(Ljava/lang/String;IILjava/lang/String;)I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService;->handleRankingSort()V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationRecordExtractorData;Lcom/android/server/notification/NotificationRecordExtractorData;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService;->checkDisqualifyingFeatures(IIILjava/lang/String;Lcom/android/server/notification/NotificationRecord;ZZ)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/Notification$Action;Landroid/app/Notification$Action;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats; +HSPLcom/android/server/notification/NotificationManagerService;->enqueueNotificationInternal(Ljava/lang/String;Ljava/lang/String;IILjava/lang/String;ILandroid/app/Notification;IZLcom/android/server/notification/NotificationManagerService$PostNotificationTracker;ZZ)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/DeviceIdleInternal;Lcom/android/server/DeviceIdleController$LocalService;]Lcom/android/server/job/JobSchedulerInternal;Lcom/android/server/job/JobSchedulerService$LocalService;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/ShortcutHelper;Lcom/android/server/notification/ShortcutHelper;]Ljava/util/Set;Ljava/util/ImmutableCollections$SetN; +HSPLcom/android/server/notification/NotificationManagerService;->findNotificationByListLocked(Ljava/util/ArrayList;Ljava/lang/String;Ljava/lang/String;II)Lcom/android/server/notification/NotificationRecord;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService;->fixNotification(Landroid/app/Notification;Ljava/lang/String;Ljava/lang/String;IIILandroid/app/ActivityManagerInternal$ServiceNotificationPolicy;Z)V+]Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;]Landroid/app/Notification$CallStyle;Landroid/app/Notification$CallStyle;]Landroid/app/Notification;Landroid/app/Notification;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService;->handleRankingSort()V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$WorkerHandler;Lcom/android/server/notification/NotificationManagerService$WorkerHandler;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecordLogger;Lcom/android/server/notification/NotificationRecordLoggerImpl;]Lcom/android/server/notification/RankingHelper;Lcom/android/server/notification/RankingHelper;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/notification/NotificationManagerService;->isCallerSystemOrPhone()Z+]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; HSPLcom/android/server/notification/NotificationManagerService;->isInLockDownMode(I)Z+]Lcom/android/server/notification/NotificationManagerService$StrongAuthTracker;Lcom/android/server/notification/NotificationManagerService$StrongAuthTracker; -HSPLcom/android/server/notification/NotificationManagerService;->isInteractionVisibleToListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; -HSPLcom/android/server/notification/NotificationManagerService;->isRecordBlockedLocked(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; +HSPLcom/android/server/notification/NotificationManagerService;->isInteractionVisibleToListener(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;I)Z+]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo; +HSPLcom/android/server/notification/NotificationManagerService;->isRecordBlockedLocked(Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; HSPLcom/android/server/notification/NotificationManagerService;->isServiceTokenValid(Landroid/os/IInterface;)Z+]Lcom/android/server/notification/ManagedServices;Lcom/android/server/notification/NotificationManagerService$NotificationAssistants; HSPLcom/android/server/notification/NotificationManagerService;->isUidSystemOrPhone(I)Z -HSPLcom/android/server/notification/NotificationManagerService;->isVisibleToListener(Landroid/service/notification/StatusBarNotification;ILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; -HSPLcom/android/server/notification/NotificationManagerService;->isVisuallyInterruptive(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/SystemService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/service/notification/NotificationListenerService$Ranking;Landroid/service/notification/NotificationListenerService$Ranking;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/NotificationHistory$HistoricalNotification$Builder;Landroid/app/NotificationHistory$HistoricalNotification$Builder;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationHistoryManager;Lcom/android/server/notification/NotificationHistoryManager;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/CharSequence;Ljava/lang/String; -HPLcom/android/server/notification/NotificationManagerService;->notificationMatchesUserId(Lcom/android/server/notification/NotificationRecord;IZ)Z+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationManagerService;->resolveNotificationUid(Ljava/lang/String;Ljava/lang/String;II)I+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; -HSPLcom/android/server/notification/NotificationManagerService;->updateUriPermissions(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;IZ)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/notification/NotificationRecord;->(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->applyAdjustments()V+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/service/notification/Adjustment;Landroid/service/notification/Adjustment;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/notification/NotificationRecord;->calculateGrantableUris()V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->calculateImportance()V+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->calculateInitialImportance()I+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->calculateVibration()Landroid/os/VibrationEffect;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->getFlags()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->getImportance()I +HSPLcom/android/server/notification/NotificationManagerService;->isVisibleToListener(Landroid/service/notification/StatusBarNotification;ILcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Z+]Landroid/service/notification/NotificationListenerFilter;Landroid/service/notification/NotificationListenerFilter;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService; +HSPLcom/android/server/notification/NotificationManagerService;->isVisuallyInterruptive(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;)Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationManagerService;->lambda$acquireWakeLockForPost$7(Ljava/lang/String;I)Lcom/android/server/notification/NotificationManagerService$PostNotificationTracker;+]Lcom/android/server/notification/NotificationManagerService$PostNotificationTrackerFactory;Lcom/android/server/notification/NotificationManagerService$10; +HSPLcom/android/server/notification/NotificationManagerService;->makeRankingUpdateLocked(Lcom/android/server/notification/ManagedServices$ManagedServiceInfo;)Landroid/service/notification/NotificationRankingUpdate;+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationManagerService$NotificationListeners;Lcom/android/server/notification/NotificationManagerService$NotificationListeners;]Lcom/android/server/notification/NotificationManagerService;Lcom/android/server/notification/NotificationManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationManagerService;->maybeRecordInterruptionLocked(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationHistoryManager;Lcom/android/server/notification/NotificationHistoryManager; +HPLcom/android/server/notification/NotificationManagerService;->notificationMatchesUserId(Lcom/android/server/notification/NotificationRecord;IZ)Z +HSPLcom/android/server/notification/NotificationManagerService;->resolveNotificationUid(Ljava/lang/String;Ljava/lang/String;II)I +HSPLcom/android/server/notification/NotificationManagerService;->updateUriPermissions(Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;Ljava/lang/String;IZ)V+]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService; +HSPLcom/android/server/notification/NotificationRecord;->(Landroid/content/Context;Landroid/service/notification/StatusBarNotification;Landroid/app/NotificationChannel;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->applyAdjustments()V+]Ljava/lang/Object;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/notification/NotificationRecord;->calculateGrantableUris()V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->calculateImportance()V +HSPLcom/android/server/notification/NotificationRecord;->calculateInitialImportance()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->calculateLights()Lcom/android/server/notification/NotificationRecord$Light;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources; +HSPLcom/android/server/notification/NotificationRecord;->calculateVibration()Landroid/os/VibrationEffect;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; HSPLcom/android/server/notification/NotificationRecord;->getImportanceExplanation()Ljava/lang/CharSequence; -HSPLcom/android/server/notification/NotificationRecord;->getKey()Ljava/lang/String;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/notification/NotificationRecord;->getNotification()Landroid/app/Notification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->getNotificationType()I+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; +HSPLcom/android/server/notification/NotificationRecord;->getLogMaker(J)Landroid/metrics/LogMaker;+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->getNotification()Landroid/app/Notification;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->getNotificationType()I HSPLcom/android/server/notification/NotificationRecord;->getSbn()Landroid/service/notification/StatusBarNotification; -HSPLcom/android/server/notification/NotificationRecord;->getUser()Landroid/os/UserHandle;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->getUserId()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecord;->isConversation()Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HPLcom/android/server/notification/NotificationRecord;->visitGrantableUri(Landroid/net/Uri;ZZ)V+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->shouldLogReported(I)Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord; -HSPLcom/android/server/notification/NotificationRecordLogger$NotificationReported;->(Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;Lcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvent;IILcom/android/internal/logging/InstanceId;)V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification;]Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair; -HSPLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->countApiUse(Lcom/android/server/notification/NotificationRecord;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HSPLcom/android/server/notification/NotificationRecord;->getUser()Landroid/os/UserHandle;+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->getUserId()I+]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecord;->isConversation()Z+]Landroid/app/Notification;Landroid/app/Notification; +HSPLcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;->shouldLogReported(I)Z+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/service/notification/StatusBarNotification;Landroid/service/notification/StatusBarNotification; +HSPLcom/android/server/notification/NotificationRecordLogger$NotificationReported;->(Lcom/android/server/notification/NotificationRecordLogger$NotificationRecordPair;Lcom/android/server/notification/NotificationRecordLogger$NotificationReportedEvent;IILcom/android/internal/logging/InstanceId;)V +HSPLcom/android/server/notification/NotificationUsageStats$AggregatedStats;->countApiUse(Lcom/android/server/notification/NotificationRecord;)V+]Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;Lcom/android/server/notification/NotificationUsageStats$ImportanceHistogram;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; HSPLcom/android/server/notification/NotificationUsageStats$SingleNotificationStats;->()V -HSPLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Ljava/lang/String;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;+]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/notification/NotificationUsageStats;->getAggregatedStatsLocked(Ljava/lang/String;)[Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; HSPLcom/android/server/notification/NotificationUsageStats;->getOrCreateAggregatedStatsLocked(Ljava/lang/String;)Lcom/android/server/notification/NotificationUsageStats$AggregatedStats;+]Ljava/util/Map;Ljava/util/HashMap; HSPLcom/android/server/notification/PermissionHelper;->hasPermission(I)Z+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/notification/PermissionHelper;->isPermissionFixed(Ljava/lang/String;I)Z+]Landroid/permission/IPermissionManager;Lcom/android/server/pm/permission/PermissionManagerService; HSPLcom/android/server/notification/PreferencesHelper$PackagePreferences;->()V -HSPLcom/android/server/notification/PreferencesHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZIZ)Z+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Lcom/android/server/notification/NotificationChannelLogger;Lcom/android/server/notification/NotificationChannelLoggerImpl;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/notification/PreferencesHelper;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZZ)Landroid/app/NotificationChannel;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; -HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroupWithChannels(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannelGroup;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; -HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroups(Ljava/lang/String;IZZZZLjava/util/Set;)Landroid/content/pm/ParceledListSlice;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/notification/PreferencesHelper;->getNotificationChannels(Ljava/lang/String;IZ)Landroid/content/pm/ParceledListSlice;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;+]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/time/Clock;Ljava/time/Clock$SystemClock; +HSPLcom/android/server/notification/PreferencesHelper;->createNotificationChannel(Ljava/lang/String;ILandroid/app/NotificationChannel;ZZIZ)Z+]Landroid/metrics/LogMaker;Landroid/metrics/LogMaker;]Lcom/android/server/notification/NotificationChannelLogger;Lcom/android/server/notification/NotificationChannelLoggerImpl;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/notification/PreferencesHelper;->getConversationNotificationChannel(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;ZZ)Landroid/app/NotificationChannel; +HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroupWithChannels(Ljava/lang/String;ILjava/lang/String;Z)Landroid/app/NotificationChannelGroup;+]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap; +HPLcom/android/server/notification/PreferencesHelper;->getNotificationChannelGroups(Ljava/lang/String;IZZZZLjava/util/Set;)Landroid/content/pm/ParceledListSlice;+]Ljava/util/Collection;Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap;]Ljava/util/Set;Ljava/util/HashSet; +HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences;+]Ljava/time/Clock;Ljava/time/Clock$SystemClock; HSPLcom/android/server/notification/PreferencesHelper;->getOrCreatePackagePreferencesLocked(Ljava/lang/String;IIIIIZIJ)Lcom/android/server/notification/PreferencesHelper$PackagePreferences; HSPLcom/android/server/notification/PreferencesHelper;->getPackagePreferencesLocked(Ljava/lang/String;I)Lcom/android/server/notification/PreferencesHelper$PackagePreferences; -HSPLcom/android/server/notification/PreferencesHelper;->packagePreferencesKey(Ljava/lang/String;I)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/notification/PreferencesHelper;->packagePreferencesKey(Ljava/lang/String;I)Ljava/lang/String; HPLcom/android/server/notification/PreferencesHelper;->pullPackagePreferencesStats(Ljava/util/List;Landroid/util/ArrayMap;)V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; HSPLcom/android/server/notification/PreferencesHelper;->restoreChannel(Lcom/android/modules/utils/TypedXmlPullParser;ZLcom/android/server/notification/PreferencesHelper$PackagePreferences;)V HSPLcom/android/server/notification/PreferencesHelper;->restorePackage(Lcom/android/modules/utils/TypedXmlPullParser;ZILjava/lang/String;ZZ)V HSPLcom/android/server/notification/PreferencesHelper;->writePackageXml(Lcom/android/server/notification/PreferencesHelper$PackagePreferences;Lcom/android/modules/utils/TypedXmlSerializer;Landroid/util/ArrayMap;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/notification/PreferencesHelper;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Landroid/app/NotificationChannelGroup;Landroid/app/NotificationChannelGroup;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/notification/PermissionHelper;Lcom/android/server/notification/PermissionHelper;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/concurrent/ConcurrentHashMap$ValuesView;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/concurrent/ConcurrentHashMap$ValueIterator;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/notification/RankingHelper;->sort(Ljava/util/ArrayList;)V+]Landroid/app/Notification;Landroid/app/Notification;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; +HSPLcom/android/server/notification/PreferencesHelper;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;ZI)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/notification/PreferencesHelper;Lcom/android/server/notification/PreferencesHelper; +HSPLcom/android/server/notification/RankingHelper;->sort(Ljava/util/ArrayList;)V+]Landroid/app/Notification;Landroid/app/Notification;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/SnoozeHelper;->cancel(ILjava/lang/String;Ljava/lang/String;I)Z+]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; HSPLcom/android/server/notification/SnoozeHelper;->getSnoozed(ILjava/lang/String;)Ljava/util/Collection;+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HPLcom/android/server/notification/ValidateNotificationPeople;->getExtraPeopleForKey(Landroid/os/Bundle;Ljava/lang/String;)[Ljava/lang/String;+]Landroid/app/Person;Landroid/app/Person;]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/notification/ValidateNotificationPeople;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ValidateNotificationPeople;Lcom/android/server/notification/ValidateNotificationPeople; -HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;]Lcom/android/server/notification/ValidateNotificationPeople;Lcom/android/server/notification/ValidateNotificationPeople; -HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Ljava/lang/String;Landroid/os/Bundle;Ljava/util/List;[FLandroid/util/ArraySet;)Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/LruCache;Landroid/util/LruCache;]Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;Lcom/android/server/notification/ValidateNotificationPeople$LookupResult;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/Set;Landroid/util/ArraySet; +HPLcom/android/server/notification/ValidateNotificationPeople;->validatePeople(Landroid/content/Context;Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationUsageStats;Lcom/android/server/notification/NotificationUsageStats;]Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration;Lcom/android/server/notification/ValidateNotificationPeople$PeopleRankingReconsideration; HSPLcom/android/server/notification/VibratorHelper;->(Landroid/content/Context;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources; -HSPLcom/android/server/notification/VisibilityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Landroid/app/NotificationChannel;Landroid/app/NotificationChannel;]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper;]Lcom/android/server/notification/VisibilityExtractor;Lcom/android/server/notification/VisibilityExtractor; -HSPLcom/android/server/notification/ZenModeExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/NotificationRecord;Lcom/android/server/notification/NotificationRecord;]Lcom/android/server/notification/ZenModeHelper;Lcom/android/server/notification/ZenModeHelper; -HSPLcom/android/server/om/OverlayManagerServiceImpl;->updateState(Landroid/content/om/CriticalOverlayInfo;II)Z -HSPLcom/android/server/om/OverlayManagerSettings$SettingsItem;->-$$Nest$fgetmUserId(Lcom/android/server/om/OverlayManagerSettings$SettingsItem;)I -HSPLcom/android/server/om/OverlayManagerSettings;->forEachMatching(ILjava/lang/String;Ljava/lang/String;Ljava/util/function/Consumer;)V+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Consumer;Lcom/android/server/om/OverlayManagerServiceImpl$$ExternalSyntheticLambda1; -HSPLcom/android/server/om/OverlayManagerSettings;->select(Landroid/content/om/OverlayIdentifier;I)I+]Landroid/content/om/OverlayIdentifier;Landroid/content/om/OverlayIdentifier;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/notification/VisibilityExtractor;->process(Lcom/android/server/notification/NotificationRecord;)Lcom/android/server/notification/RankingReconsideration;+]Lcom/android/server/notification/RankingConfig;Lcom/android/server/notification/PreferencesHelper; HSPLcom/android/server/om/OverlayReferenceMapper$1;->getTargetToOverlayables(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/util/Map;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; HSPLcom/android/server/om/OverlayReferenceMapper;->addPkg(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;)Landroid/util/ArraySet; HSPLcom/android/server/om/OverlayReferenceMapper;->addTarget(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;Ljava/util/Collection;)V+]Lcom/android/server/om/OverlayReferenceMapper$Provider;Lcom/android/server/om/OverlayReferenceMapper$1;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;,Ljava/util/Collections$UnmodifiableMap;,Ljava/util/HashMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;,Ljava/util/HashSet; HSPLcom/android/server/om/OverlayReferenceMapper;->ensureMapBuilt()V -HSPLcom/android/server/om/OverlayReferenceMapper;->isValidActor(Ljava/lang/String;Ljava/lang/String;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper; +HSPLcom/android/server/om/OverlayReferenceMapper;->isValidActor(Ljava/lang/String;Ljava/lang/String;)Z HSPLcom/android/server/os/NativeTombstoneManager;->collectTombstones(Ljava/util/ArrayList;III)V HSPLcom/android/server/permission/access/AccessCheckingService;->access$getState$p(Lcom/android/server/permission/access/AccessCheckingService;)Lcom/android/server/permission/access/AccessState; HSPLcom/android/server/permission/access/AccessPersistence;->write(Lcom/android/server/permission/access/AccessState;)V HSPLcom/android/server/permission/access/AccessPersistence;->write(Lcom/android/server/permission/access/WritableState;Lcom/android/server/permission/access/AccessState;I)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/permission/access/WritableState;Lcom/android/server/permission/access/MutableSystemState;,Lcom/android/server/permission/access/MutableUserState; +HSPLcom/android/server/permission/access/AccessPersistence;->writeUserState(Lcom/android/server/permission/access/AccessState;I)V HSPLcom/android/server/permission/access/AccessPolicy;->onStateMutated(Lcom/android/server/permission/access/GetStateScope;)V+]Lcom/android/server/permission/access/SchemePolicy;Lcom/android/server/permission/access/appop/AppIdAppOpPolicy;,Lcom/android/server/permission/access/appop/PackageAppOpPolicy;,Lcom/android/server/permission/access/permission/AppIdPermissionPolicy;,Lcom/android/server/permission/access/permission/DevicePermissionPolicy; HSPLcom/android/server/permission/access/AccessPolicy;->serializePackageVersions(Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/server/permission/access/immutable/IndexedMap;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/AccessState;->getExternalState()Lcom/android/server/permission/access/ExternalState; +HSPLcom/android/server/permission/access/AccessState;->getSystemState()Lcom/android/server/permission/access/SystemState; HSPLcom/android/server/permission/access/AccessState;->getUserStates()Lcom/android/server/permission/access/immutable/IntReferenceMap; -HSPLcom/android/server/permission/access/ExternalState;->getAppIdPackageNames()Lcom/android/server/permission/access/immutable/IntReferenceMap; +HSPLcom/android/server/permission/access/AccessState;->toMutable()Lcom/android/server/permission/access/MutableAccessState; +HSPLcom/android/server/permission/access/GetStateScope;->(Lcom/android/server/permission/access/AccessState;)V +HSPLcom/android/server/permission/access/GetStateScope;->getState()Lcom/android/server/permission/access/AccessState; HSPLcom/android/server/permission/access/MutableAccessState;->(Lcom/android/server/permission/access/AccessState;)V +HSPLcom/android/server/permission/access/MutableAccessState;->mutateSystemState$default(Lcom/android/server/permission/access/MutableAccessState;IILjava/lang/Object;)Lcom/android/server/permission/access/MutableSystemState; HSPLcom/android/server/permission/access/MutableAccessState;->mutateSystemState(I)Lcom/android/server/permission/access/MutableSystemState; +HSPLcom/android/server/permission/access/MutableSystemState;->requestWriteMode(I)V +HSPLcom/android/server/permission/access/MutateStateScope;->getNewState()Lcom/android/server/permission/access/MutableAccessState; +HSPLcom/android/server/permission/access/SystemState;->getPermissions()Lcom/android/server/permission/access/immutable/IndexedMap; +HSPLcom/android/server/permission/access/SystemState;->getWriteMode()I +HSPLcom/android/server/permission/access/SystemState;->setWriteMode(I)V +HSPLcom/android/server/permission/access/UserState;->getAppIdAppOpModes()Lcom/android/server/permission/access/immutable/IntReferenceMap; +HSPLcom/android/server/permission/access/UserState;->getAppIdPermissionFlags()Lcom/android/server/permission/access/immutable/IntReferenceMap; +HSPLcom/android/server/permission/access/appop/AppIdAppOpPersistence;->serializeAppIdAppOps(Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/server/permission/access/immutable/IntReferenceMap;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer; HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;->getAppOpMode(Lcom/android/server/permission/access/GetStateScope;IILjava/lang/String;)I+]Ljava/lang/Number;Ljava/lang/Integer; +HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;->getAppOpModes(Lcom/android/server/permission/access/GetStateScope;II)Lcom/android/server/permission/access/immutable/IndexedMap; HSPLcom/android/server/permission/access/appop/AppIdAppOpPolicy;->onStateMutated(Lcom/android/server/permission/access/GetStateScope;)V+]Lcom/android/server/permission/access/appop/AppIdAppOpPolicy$OnAppOpModeChangedListener;Lcom/android/server/permission/access/appop/AppOpService$OnAppIdAppOpModeChangedListener; HSPLcom/android/server/permission/access/appop/AppOpService$OnAppIdAppOpModeChangedListener;->onStateMutated()V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;Lcom/android/server/appop/AppOpsService$2;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/appop/AppOpService$OnPackageAppOpModeChangedListener;->onStateMutated()V+]Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;Lcom/android/server/appop/AppOpsService$2;]Ljava/lang/Number;Ljava/lang/Integer; -HSPLcom/android/server/permission/access/appop/AppOpService$OnPermissionFlagsChangedListener;->onStateMutated()V+]Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;Lcom/android/server/appop/AppOpsService$2;]Ljava/lang/Number;Ljava/lang/Integer; +HPLcom/android/server/permission/access/appop/AppOpService$OnPermissionFlagsChangedListener;->onStateMutated()V+]Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener;Lcom/android/server/appop/AppOpsService$2;]Ljava/lang/Number;Ljava/lang/Integer; +HSPLcom/android/server/permission/access/appop/AppOpService;->access$getListeners$p(Lcom/android/server/permission/access/appop/AppOpService;)Landroid/util/ArraySet; HSPLcom/android/server/permission/access/appop/AppOpService;->evaluateModeFromPermissionFlags(II)I HSPLcom/android/server/permission/access/appop/AppOpService;->getForegroundOps(ILjava/lang/String;)Landroid/util/SparseBooleanArray;+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/Number;Ljava/lang/Integer; +HSPLcom/android/server/permission/access/appop/AppOpService;->getForegroundOps(Ljava/lang/String;I)Landroid/util/SparseBooleanArray;+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/appop/AppOpService;->getPackageMode(Ljava/lang/String;II)I +HSPLcom/android/server/permission/access/appop/AppOpService;->getPackageModes(Ljava/lang/String;I)Landroid/util/ArrayMap; HSPLcom/android/server/permission/access/appop/AppOpService;->getUidMode(ILjava/lang/String;I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/permission/access/appop/AppOpService;->getUidModeFromPermissionState(Lcom/android/server/permission/access/GetStateScope;IILjava/lang/String;Ljava/lang/String;)I -HSPLcom/android/server/permission/access/appop/AppOpService;->setUidMode(ILjava/lang/String;II)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/permission/access/AccessState;Lcom/android/server/permission/access/MutableAccessState; +HSPLcom/android/server/permission/access/appop/AppOpService;->getUidModes(I)Landroid/util/ArrayMap; +HPLcom/android/server/permission/access/appop/AppOpService;->setUidMode(ILjava/lang/String;II)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/permission/access/AccessState;Lcom/android/server/permission/access/MutableAccessState; HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence;->serializeAppOp(Lcom/android/modules/utils/BinaryXmlSerializer;Ljava/lang/String;I)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer; HSPLcom/android/server/permission/access/appop/BaseAppOpPersistence;->serializeAppOps(Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/server/permission/access/immutable/IndexedMap;)V+]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;->getAppOpMode(Lcom/android/server/permission/access/GetStateScope;Ljava/lang/String;ILjava/lang/String;)I+]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;->getAppOpModes(Lcom/android/server/permission/access/GetStateScope;Ljava/lang/String;I)Lcom/android/server/permission/access/immutable/IndexedMap; HSPLcom/android/server/permission/access/appop/PackageAppOpPolicy;->onStateMutated(Lcom/android/server/permission/access/GetStateScope;)V+]Lcom/android/server/permission/access/appop/PackageAppOpPolicy$OnAppOpModeChangedListener;Lcom/android/server/permission/access/appop/AppOpService$OnPackageAppOpModeChangedListener; +HSPLcom/android/server/permission/access/immutable/IndexedList;->(Ljava/util/ArrayList;)V HSPLcom/android/server/permission/access/immutable/IndexedListSet;->elementAt(I)Ljava/lang/Object;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/permission/access/immutable/IndexedListSet;->getSize()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/permission/access/immutable/IndexedMap;->get(Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/server/permission/access/immutable/IndexedMap;->getSize()I HSPLcom/android/server/permission/access/immutable/IndexedMap;->keyAt(I)Ljava/lang/Object; HSPLcom/android/server/permission/access/immutable/IndexedMap;->valueAt(I)Ljava/lang/Object; HSPLcom/android/server/permission/access/immutable/IndexedReferenceMap;->get(Ljava/lang/Object;)Lcom/android/server/permission/access/immutable/Immutable; +HSPLcom/android/server/permission/access/immutable/IndexedSetExtensionsKt;->plusAssign(Lcom/android/server/permission/access/immutable/MutableIndexedSet;Ljava/util/Collection;)V+]Ljava/lang/Iterable;Ljava/util/Collections$UnmodifiableSet;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; HSPLcom/android/server/permission/access/immutable/IntReferenceMap;->get(I)Lcom/android/server/permission/access/immutable/Immutable;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/permission/access/immutable/IntReferenceMap;->keyAt(I)I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/permission/access/immutable/IntReferenceMap;->valueAt(I)Lcom/android/server/permission/access/immutable/Immutable;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/permission/access/immutable/MutableIndexedMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/permission/access/immutable/MutableReference;->get()Lcom/android/server/permission/access/immutable/Immutable; HSPLcom/android/server/permission/access/immutable/MutableReference;->mutate()Lcom/android/server/permission/access/immutable/Immutable;+]Lcom/android/server/permission/access/immutable/Immutable;megamorphic_types +HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->parsePermission(Lcom/android/modules/utils/BinaryXmlPullParser;Lcom/android/server/permission/access/immutable/MutableIndexedMap;)V HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->serializeAppId(Lcom/android/modules/utils/BinaryXmlSerializer;ILcom/android/server/permission/access/immutable/IndexedMap;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->serializeAppIdPermission(Lcom/android/modules/utils/BinaryXmlSerializer;Ljava/lang/String;I)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer; -HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->serializePermission(Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/server/permission/access/permission/Permission;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->serializePermission(Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/server/permission/access/permission/Permission;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer; HSPLcom/android/server/permission/access/permission/AppIdPermissionPersistence;->serializePermissions(Lcom/android/modules/utils/BinaryXmlSerializer;Ljava/lang/String;Lcom/android/server/permission/access/immutable/IndexedMap;)V+]Lcom/android/modules/utils/BinaryXmlSerializer;Lcom/android/modules/utils/BinaryXmlSerializer; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->addPermissions(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/immutable/MutableIndexedSet;)V -HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->checkPrivilegedPermissionAllowlist(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->checkPrivilegedPermissionAllowlistIfNeeded(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->evaluateAllPermissionStatesForPackageAndUser(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;ILcom/android/server/pm/pkg/PackageState;)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Iterable;Ljava/util/Collections$UnmodifiableSet;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->evaluatePermissionState(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;Lcom/android/server/pm/pkg/PackageState;)V+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->findPermissionTree(Lcom/android/server/permission/access/GetStateScope;Ljava/lang/String;)Lcom/android/server/permission/access/permission/Permission; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getPermissionFlags(Lcom/android/server/permission/access/AccessState;IILjava/lang/String;)I+]Ljava/lang/Number;Ljava/lang/Integer; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getPermissionFlags(Lcom/android/server/permission/access/GetStateScope;IILjava/lang/String;)I HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getPermissions(Lcom/android/server/permission/access/GetStateScope;)Lcom/android/server/permission/access/immutable/IndexedMap; -HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getPrivilegedPermissionAllowlistState(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Ljava/lang/String;)Ljava/lang/Boolean;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getPrivilegedPermissionAllowlistState(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Ljava/lang/String;)Ljava/lang/Boolean; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->getUidPermissionFlags(Lcom/android/server/permission/access/GetStateScope;II)Lcom/android/server/permission/access/immutable/IndexedMap; -HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->inheritImplicitPermissionStates(Lcom/android/server/permission/access/MutateStateScope;II)V HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->onStateMutated(Lcom/android/server/permission/access/GetStateScope;)V+]Lcom/android/server/permission/access/permission/AppIdPermissionPolicy$OnPermissionFlagsChangedListener;Lcom/android/server/permission/access/appop/AppOpService$OnPermissionFlagsChangedListener;,Lcom/android/server/permission/access/permission/PermissionService$OnPermissionFlagsChangedListener; -HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->revokePermissionsOnPackageUpdate(Lcom/android/server/permission/access/MutateStateScope;I)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Number;Ljava/lang/Integer;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->onStorageVolumeMounted(Lcom/android/server/permission/access/MutateStateScope;Ljava/lang/String;Ljava/util/List;Z)V +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->revokePermissionsOnPackageUpdate(Lcom/android/server/permission/access/MutateStateScope;I)V HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->shouldGrantPermissionByProtectionFlags(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->shouldGrantPermissionBySignature(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; -HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->shouldGrantPrivilegedOrOemPermission(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->shouldGrantPrivilegedOrOemPermission(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/permission/access/permission/Permission;)Z HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->trimPermissionStates(Lcom/android/server/permission/access/MutateStateScope;I)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Number;Ljava/lang/Integer;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->trimPermissions(Lcom/android/server/permission/access/MutateStateScope;Ljava/lang/String;Lcom/android/server/permission/access/immutable/MutableIndexedSet;)V+]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->updatePermissionFlags(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;II)Z+]Lcom/android/server/permission/access/permission/AppIdPermissionPolicy$OnPermissionFlagsChangedListener;Lcom/android/server/permission/access/appop/AppOpService$OnPermissionFlagsChangedListener;,Lcom/android/server/permission/access/permission/PermissionService$OnPermissionFlagsChangedListener;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/permission/AppIdPermissionPolicy;->updatePermissionIfDynamic(Lcom/android/server/permission/access/MutateStateScope;Lcom/android/server/permission/access/permission/Permission;)Lcom/android/server/permission/access/permission/Permission; HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;->onStateMutated(Lcom/android/server/permission/access/GetStateScope;)V+]Lcom/android/server/permission/access/permission/DevicePermissionPolicy$OnDevicePermissionFlagsChangedListener;Lcom/android/server/permission/access/appop/AppOpService$OnPermissionFlagsChangedListener;,Lcom/android/server/permission/access/permission/PermissionService$OnPermissionFlagsChangedListener; +HSPLcom/android/server/permission/access/permission/DevicePermissionPolicy;->trimPermissionStates(Lcom/android/server/permission/access/MutateStateScope;I)V HSPLcom/android/server/permission/access/permission/Permission;->(Landroid/content/pm/PermissionInfo;ZII[IZ)V HSPLcom/android/server/permission/access/permission/Permission;->getGidsForUser(I)[I +HSPLcom/android/server/permission/access/permission/Permission;->getPermissionInfo()Landroid/content/pm/PermissionInfo; +HSPLcom/android/server/permission/access/permission/Permission;->getType()I HSPLcom/android/server/permission/access/permission/PermissionFlags;->fromApiFlags(ILcom/android/server/permission/access/permission/Permission;I)I HSPLcom/android/server/permission/access/permission/PermissionFlags;->isAppOpGranted(I)Z HSPLcom/android/server/permission/access/permission/PermissionFlags;->isPermissionGranted(I)Z HSPLcom/android/server/permission/access/permission/PermissionFlags;->toApiFlags(I)I +HSPLcom/android/server/permission/access/permission/PermissionFlags;->updateFlags(Lcom/android/server/permission/access/permission/Permission;III)I HSPLcom/android/server/permission/access/permission/PermissionService$OnPermissionFlagsChangedListener;->onStateMutated()V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/Iterable;Ljava/util/LinkedHashSet;]Ljava/util/Iterator;Ljava/util/LinkedHashMap$LinkedKeyIterator; HSPLcom/android/server/permission/access/permission/PermissionService;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; HSPLcom/android/server/permission/access/permission/PermissionService;->checkUidPermission(ILjava/lang/String;Ljava/lang/String;)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->enforceCallingOrSelfAnyPermission(Ljava/lang/String;[Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->enforceCallingOrSelfCrossUserPermission(IZZLjava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->generatePermissionInfo(Lcom/android/server/permission/access/permission/Permission;II)Landroid/content/pm/PermissionInfo; -HSPLcom/android/server/permission/access/permission/PermissionService;->getAllowlistedRestrictedPermissions(Ljava/lang/String;II)Ljava/util/ArrayList;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/permission/access/permission/PermissionService;->getAllowlistedRestrictedPermissionsUnchecked(III)Ljava/util/ArrayList;+]Ljava/lang/Number;Ljava/lang/Integer; +HPLcom/android/server/permission/access/permission/PermissionService;->getAllowlistedRestrictedPermissions(Ljava/lang/String;II)Ljava/util/ArrayList;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HPLcom/android/server/permission/access/permission/PermissionService;->getAllowlistedRestrictedPermissionsUnchecked(III)Ljava/util/ArrayList;+]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/permission/PermissionService;->getGidsForUid(I)[I+]Lcom/android/server/SystemConfig;Lcom/android/server/SystemConfig;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/permission/PermissionService;->getGrantedPermissions(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Number;Ljava/lang/Integer; HSPLcom/android/server/permission/access/permission/PermissionService;->getInstalledPermissions(Ljava/lang/String;)Ljava/util/Set; @@ -2209,210 +2258,199 @@ HSPLcom/android/server/permission/access/permission/PermissionService;->getPermi HSPLcom/android/server/permission/access/permission/PermissionService;->isPackageVisibleToUid(Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;Ljava/lang/String;II)Z+]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->isPermissionGranted(Lcom/android/server/permission/access/GetStateScope;Lcom/android/server/pm/pkg/PackageState;ILjava/lang/String;Ljava/lang/String;)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Number;Ljava/lang/Integer; +HSPLcom/android/server/permission/access/permission/PermissionService;->isRootOrSystemOrShellUid(I)Z HSPLcom/android/server/permission/access/permission/PermissionService;->isSinglePermissionGranted(Lcom/android/server/permission/access/GetStateScope;IIZLjava/lang/String;Ljava/lang/String;)Z+]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo; +HSPLcom/android/server/permission/access/permission/PermissionService;->isSystemUidPermissionGranted(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/SystemConfig;Lcom/android/server/SystemConfig; HSPLcom/android/server/permission/access/permission/PermissionService;->isUidInstantApp(Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot;I)Z+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HSPLcom/android/server/permission/access/permission/PermissionService;->onPackageAdded(Lcom/android/server/pm/pkg/PackageState;ZLcom/android/server/pm/pkg/AndroidPackage;)V -HSPLcom/android/server/permission/access/permission/PermissionService;->queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl; -HSPLcom/android/server/permission/access/permission/PermissionService;->setPermissionFlagsWithPolicy(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;Ljava/lang/String;I)Z -HSPLcom/android/server/permission/access/permission/PermissionService;->updatePermissionFlags(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;Ljava/lang/String;IIZZZLjava/lang/String;Ljava/lang/String;)V -HSPLcom/android/server/permission/access/permission/PermissionService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/permission/access/AccessState;Lcom/android/server/permission/access/MutableAccessState;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; +HPLcom/android/server/permission/access/permission/PermissionService;->queryPermissionsByGroup(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl; +HPLcom/android/server/permission/access/permission/PermissionService;->setPermissionFlagsWithPolicy(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;Ljava/lang/String;I)Z +HPLcom/android/server/permission/access/permission/PermissionService;->updatePermissionFlags(Lcom/android/server/permission/access/MutateStateScope;IILjava/lang/String;Ljava/lang/String;IIZZZLjava/lang/String;Ljava/lang/String;)V +HPLcom/android/server/permission/access/permission/PermissionService;->updatePermissionFlags(Ljava/lang/String;Ljava/lang/String;IIZLjava/lang/String;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/permission/access/AccessState;Lcom/android/server/permission/access/MutableAccessState;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; HSPLcom/android/server/permission/access/util/IntExtensionsKt;->hasBits(II)Z HSPLcom/android/server/permission/jarjar/kotlin/jdk7/AutoCloseableKt;->closeFinally(Ljava/lang/AutoCloseable;Ljava/lang/Throwable;)V+]Ljava/lang/AutoCloseable;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;,Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl; -HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/content/pm/SigningDetails;,Ljava/lang/Integer;,Ljava/lang/String; +HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->areEqual(Ljava/lang/Object;Ljava/lang/Object;)Z+]Ljava/lang/Object;Ljava/lang/Integer;,Ljava/lang/String; HSPLcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics;->checkNotNullExpressionValue(Ljava/lang/Object;Ljava/lang/String;)V HSPLcom/android/server/pm/ApexManager$ApexManagerImpl;->getActivePackageNameForApexModuleName(Ljava/lang/String;)Ljava/lang/String; +HSPLcom/android/server/pm/AppDataHelper$$ExternalSyntheticLambda3;->accept(Ljava/lang/Object;Ljava/lang/Object;)V HSPLcom/android/server/pm/AppDataHelper;->prepareAppData(Lcom/android/server/pm/Installer$Batch;Lcom/android/server/pm/PackageSetting;III)Ljava/util/concurrent/CompletableFuture;+]Lcom/android/server/pm/Installer$Batch;Lcom/android/server/pm/Installer$Batch;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; -HSPLcom/android/server/pm/AppDataHelper;->prepareAppDataAndMigrate(Lcom/android/server/pm/Installer$Batch;Lcom/android/server/pm/pkg/AndroidPackage;IIZ)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; HSPLcom/android/server/pm/AppIdSettingMap;->(Lcom/android/server/pm/AppIdSettingMap;)V HSPLcom/android/server/pm/AppIdSettingMap;->getSetting(I)Lcom/android/server/pm/SettingBase;+]Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray; HSPLcom/android/server/pm/AppsFilterBase;->()V -HSPLcom/android/server/pm/AppsFilterBase;->getVisibilityAllowList(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/pkg/PackageStateInternal;[ILandroid/util/ArrayMap;)Landroid/util/SparseArray;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HPLcom/android/server/pm/AppsFilterBase;->getVisibilityAllowList(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/pkg/PackageStateInternal;[ILandroid/util/ArrayMap;)Landroid/util/SparseArray;+]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/AppsFilterBase;->isForceQueryable(I)Z+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; HSPLcom/android/server/pm/AppsFilterBase;->isImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; -HSPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesLibrary(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; HSPLcom/android/server/pm/AppsFilterBase;->isQueryableViaUsesPermission(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; HSPLcom/android/server/pm/AppsFilterBase;->isRetainedImplicitlyQueryable(II)Z+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; HSPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplication(Lcom/android/server/pm/snapshot/PackageDataSnapshot;ILjava/lang/Object;Lcom/android/server/pm/pkg/PackageStateInternal;I)Z+]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplicationInternal(Lcom/android/server/pm/Computer;ILjava/lang/Object;Lcom/android/server/pm/pkg/PackageStateInternal;I)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean; +HSPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplicationInternal(Lcom/android/server/pm/Computer;ILjava/lang/Object;Lcom/android/server/pm/pkg/PackageStateInternal;I)Z+]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting; HPLcom/android/server/pm/AppsFilterBase;->shouldFilterApplicationUsingCache(III)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->(Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;)V HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->isGloballyEnabled()Z -HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->packageIsEnabled(Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->packageIsEnabled(Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->updateEnabledState(Lcom/android/server/pm/pkg/AndroidPackage;)V HSPLcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;->updatePackageState(Lcom/android/server/pm/pkg/PackageStateInternal;Z)V HSPLcom/android/server/pm/AppsFilterImpl;->addPackage(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;ZZ)V -HSPLcom/android/server/pm/AppsFilterImpl;->addPackageInternal(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;)Landroid/util/ArraySet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean; +HSPLcom/android/server/pm/AppsFilterImpl;->addPackageInternal(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;)Landroid/util/ArraySet;+]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/server/om/OverlayReferenceMapper;Lcom/android/server/om/OverlayReferenceMapper;]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/AppsFilterImpl;->grantImplicitAccess(IIZ)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix;]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; -HSPLcom/android/server/pm/AppsFilterImpl;->pkgInstruments(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/internal/pm/pkg/component/ParsedInstrumentation;Lcom/android/internal/pm/pkg/component/ParsedInstrumentationImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; -HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForPackage(Lcom/android/server/pm/Computer;Ljava/lang/String;Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;[Landroid/content/pm/UserInfo;II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/AppsFilterImpl;Lcom/android/server/pm/AppsFilterImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; -HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForUser(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;[Landroid/content/pm/UserInfo;Lcom/android/server/pm/pkg/PackageStateInternal;I)V+]Lcom/android/server/pm/AppsFilterBase;Lcom/android/server/pm/AppsFilterImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; -HSPLcom/android/server/pm/AppsFilterLocked;->isForceQueryable(I)Z +HSPLcom/android/server/pm/AppsFilterImpl;->pkgInstruments(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForPackage(Lcom/android/server/pm/Computer;Ljava/lang/String;Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/util/ArrayMap;[Landroid/content/pm/UserInfo;II)V+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; +HPLcom/android/server/pm/AppsFilterImpl;->updateShouldFilterCacheForUser(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/PackageStateInternal;[Landroid/content/pm/UserInfo;Lcom/android/server/pm/pkg/PackageStateInternal;I)V+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; +HPLcom/android/server/pm/AppsFilterLocked;->isForceQueryable(I)Z HPLcom/android/server/pm/AppsFilterLocked;->isImplicitlyQueryable(II)Z HPLcom/android/server/pm/AppsFilterLocked;->isQueryableViaComponent(II)Z HPLcom/android/server/pm/AppsFilterLocked;->isQueryableViaPackage(II)Z HPLcom/android/server/pm/AppsFilterLocked;->isQueryableViaUsesLibrary(II)Z HPLcom/android/server/pm/AppsFilterLocked;->isQueryableViaUsesPermission(II)Z HPLcom/android/server/pm/AppsFilterLocked;->isRetainedImplicitlyQueryable(II)Z -HSPLcom/android/server/pm/AppsFilterSnapshotImpl;->(Lcom/android/server/pm/AppsFilterImpl;)V+]Lcom/android/server/pm/FeatureConfig;Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl; -HPLcom/android/server/pm/AppsFilterUtils$ParallelComputeComponentVisibility;->getVisibleListOfQueryViaComponents(Lcom/android/server/pm/pkg/PackageStateInternal;)Landroid/util/ArraySet;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/AppsFilterUtils;->canQueryAsInstaller(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/AppsFilterUtils;->canQueryAsUpdateOwner(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/pm/AppsFilterSnapshotImpl;->(Lcom/android/server/pm/AppsFilterImpl;)V +HPLcom/android/server/pm/AppsFilterUtils$ParallelComputeComponentVisibility;->getVisibleListOfQueryViaComponents(Lcom/android/server/pm/pkg/PackageStateInternal;)Landroid/util/ArraySet;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/AppsFilterUtils;->canQueryAsInstaller(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/AppsFilterUtils;->canQueryAsUpdateOwner(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/AppsFilterUtils;->canQueryViaComponents(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/utils/WatchedArraySet;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; HSPLcom/android/server/pm/AppsFilterUtils;->canQueryViaPackage(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/AppsFilterUtils;->canQueryViaUsesLibrary(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HPLcom/android/server/pm/AppsFilterUtils;->matchesAnyComponents(Landroid/content/Intent;Ljava/util/List;Lcom/android/server/utils/WatchedArraySet;)Z+]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HPLcom/android/server/pm/AppsFilterUtils;->matchesAnyFilter(Landroid/content/Intent;Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/server/utils/WatchedArraySet;)Z+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/pm/AppsFilterUtils;->matchesIntentFilter(Landroid/content/Intent;Landroid/content/IntentFilter;Lcom/android/server/utils/WatchedArraySet;)Z+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; +HPLcom/android/server/pm/AppsFilterUtils;->matchesIntentFilter(Landroid/content/Intent;Landroid/content/IntentFilter;Lcom/android/server/utils/WatchedArraySet;)Z+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; HPLcom/android/server/pm/AppsFilterUtils;->matchesPackage(Landroid/content/Intent;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/utils/WatchedArraySet;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HPLcom/android/server/pm/AppsFilterUtils;->matchesProviders(Ljava/util/Set;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet;]Ljava/util/StringTokenizer;Ljava/util/StringTokenizer; +HPLcom/android/server/pm/AppsFilterUtils;->matchesProviders(Ljava/util/Set;Lcom/android/server/pm/pkg/AndroidPackage;)Z+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; HSPLcom/android/server/pm/ComputerEngine$Settings;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I -HSPLcom/android/server/pm/ComputerEngine$Settings;->getCrossProfileIntentResolver(I)Lcom/android/server/pm/CrossProfileIntentResolver;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings; -HSPLcom/android/server/pm/ComputerEngine$Settings;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings; -HSPLcom/android/server/pm/ComputerEngine$Settings;->getPackages()Landroid/util/ArrayMap;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine$Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings; -HSPLcom/android/server/pm/ComputerEngine$Settings;->getSettingBase(I)Lcom/android/server/pm/SettingBase;+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings; +HSPLcom/android/server/pm/ComputerEngine$Settings;->getCrossProfileIntentResolver(I)Lcom/android/server/pm/CrossProfileIntentResolver; +HSPLcom/android/server/pm/ComputerEngine$Settings;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal; +HSPLcom/android/server/pm/ComputerEngine$Settings;->getPackages()Landroid/util/ArrayMap;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine$Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String; +HSPLcom/android/server/pm/ComputerEngine$Settings;->getSettingBase(I)Lcom/android/server/pm/SettingBase; HSPLcom/android/server/pm/ComputerEngine$Settings;->isEnabledAndMatch(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;JI)Z+]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->(Lcom/android/server/pm/PackageManagerService$Snapshot;I)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; -HSPLcom/android/server/pm/ComputerEngine;->addPackageHoldingPermissions(Ljava/util/ArrayList;Lcom/android/server/pm/pkg/PackageStateInternal;[Ljava/lang/String;[ZJI)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/pm/ComputerEngine;->applyPostResolutionFilter(Ljava/util/List;Ljava/lang/String;ZIZILandroid/content/Intent;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; HSPLcom/android/server/pm/ComputerEngine;->applyPostServiceResolutionFilter(Ljava/util/List;Ljava/lang/String;II)Ljava/util/List;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->canQueryPackage(ILjava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HPLcom/android/server/pm/ComputerEngine;->canQueryPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->canViewInstantApps(II)Z+]Landroid/content/Context;Landroid/app/ContextImpl; -HSPLcom/android/server/pm/ComputerEngine;->checkSignatures(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->checkSignatures(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/ComputerEngine;->checkUidPermission(Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl; -HPLcom/android/server/pm/ComputerEngine;->createForwardingResolveInfoUnchecked(Lcom/android/server/pm/WatchedIntentFilter;II)Landroid/content/pm/ResolveInfo;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/WatchedIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter; HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserOrProfilePermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector; -HSPLcom/android/server/pm/ComputerEngine;->filterAppAccess(Ljava/lang/String;IIZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZLjava/lang/String;)V +HSPLcom/android/server/pm/ComputerEngine;->enforceCrossUserPermission(IIZZZLjava/lang/String;)V+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector; +HSPLcom/android/server/pm/ComputerEngine;->filterAppAccess(Ljava/lang/String;IIZ)Z HSPLcom/android/server/pm/ComputerEngine;->filterIfNotSystemUser(Ljava/util/List;I)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->filterSdkLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/ComputerEngine;->filterSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->filterStaticSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/ComputerEngine;->generatePackageInfo(Lcom/android/server/pm/pkg/PackageStateInternal;JI)Landroid/content/pm/PackageInfo;+]Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/ArchiveState;Lcom/android/server/pm/pkg/ArchiveState;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/ComputerEngine;->filterSdkLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->filterSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z +HSPLcom/android/server/pm/ComputerEngine;->filterStaticSharedLibPackage(Lcom/android/server/pm/pkg/PackageStateInternal;IIJ)Z+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->generatePackageInfo(Lcom/android/server/pm/pkg/PackageStateInternal;JI)Landroid/content/pm/PackageInfo;+]Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;]Lcom/android/server/pm/ApexManager;Lcom/android/server/pm/ApexManager$ApexManagerImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/ArchiveState;Lcom/android/server/pm/pkg/ArchiveState;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternal(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternalBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolver;,Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getActivityInfoInternalBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ActivityInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/ComputerEngine;->getApplicationEnabledSetting(Ljava/lang/String;I)I+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo; HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfoInternal(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfoInternalBody(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/lang/Object;Ljava/lang/String; -HPLcom/android/server/pm/ComputerEngine;->getBlockUninstallForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSetting(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSettingInternal(Landroid/content/ComponentName;II)I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/ComputerEngine;->getDeclaredSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Landroid/content/pm/VersionedPackage;Landroid/content/pm/VersionedPackage;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ComputerEngine;->getApplicationInfoInternalBody(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HPLcom/android/server/pm/ComputerEngine;->getBlockUninstallForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; +HPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSetting(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->getComponentEnabledSettingInternal(Landroid/content/ComponentName;II)I+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/ComputerEngine;->getComponentResolver()Lcom/android/server/pm/resolution/ComponentResolverApi; +HPLcom/android/server/pm/ComputerEngine;->getDeclaredSharedLibraries(Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray; HSPLcom/android/server/pm/ComputerEngine;->getInstallSource(Ljava/lang/String;II)Lcom/android/server/pm/InstallSource;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->getInstallSourceInfo(Ljava/lang/String;I)Landroid/content/pm/InstallSourceInfo;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->getInstalledApplications(JIIZ)Ljava/util/List;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; +HSPLcom/android/server/pm/ComputerEngine;->getInstalledApplications(JIIZ)Ljava/util/List;+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; HSPLcom/android/server/pm/ComputerEngine;->getInstalledPackages(JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getInstalledPackagesBody(JII)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1; +HSPLcom/android/server/pm/ComputerEngine;->getInstalledPackagesBody(JII)Landroid/content/pm/ParceledListSlice;+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;,Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$UnmodifiableCollection$1; HPLcom/android/server/pm/ComputerEngine;->getInstallerPackageName(Ljava/lang/String;I)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; HSPLcom/android/server/pm/ComputerEngine;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/ComputerEngine;->getMatchingCrossProfileIntentFilters(Landroid/content/Intent;Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; -HSPLcom/android/server/pm/ComputerEngine;->getNameForUid(I)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/ComputerEngine;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getNameForUid(I)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/ComputerEngine;->getPackageGids(Ljava/lang/String;JI)[I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/ComputerEngine;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo; HSPLcom/android/server/pm/ComputerEngine;->getPackageInfoInternal(Ljava/lang/String;JJII)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getPackageInfoInternalBody(Ljava/lang/String;JJII)Landroid/content/pm/PackageInfo;+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->getPackageStartability(ZLjava/lang/String;II)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->getPackageStateFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->getPackageStateForInstalledAndFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->getPackageInfoInternalBody(Ljava/lang/String;JJII)Landroid/content/pm/PackageInfo;+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getPackageStartability(ZLjava/lang/String;II)I+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getPackageStateFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; +HSPLcom/android/server/pm/ComputerEngine;->getPackageStateForInstalledAndFiltered(Ljava/lang/String;II)Lcom/android/server/pm/pkg/PackageStateInternal; HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/ComputerEngine;->getPackageStateInternal(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; HSPLcom/android/server/pm/ComputerEngine;->getPackageStates()Landroid/util/ArrayMap;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings; HSPLcom/android/server/pm/ComputerEngine;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getPackageUidInternal(Ljava/lang/String;JII)I+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUid(I)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/ComputerEngine;->getPackageUidInternal(Ljava/lang/String;JII)I+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUid(I)[Ljava/lang/String; HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUidInternal(II)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUidInternalBody(IIIZ)[Ljava/lang/String;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/ComputerEngine;->getPackagesHoldingPermissions([Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HSPLcom/android/server/pm/ComputerEngine;->getPackagesUsingSharedLibrary(Landroid/content/pm/SharedLibraryInfo;JII)Landroid/util/Pair;+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ComputerEngine;->getPackagesForUidInternalBody(IIIZ)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/ComputerEngine;->getPackagesUsingSharedLibrary(Landroid/content/pm/SharedLibraryInfo;JII)Landroid/util/Pair;+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->getProcessesForUid(I)Landroid/util/ArrayMap;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/pm/ComputerEngine;->getReceiverInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot; +HSPLcom/android/server/pm/ComputerEngine;->getReceiverInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ActivityInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot; HSPLcom/android/server/pm/ComputerEngine;->getServiceInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ServiceInfo;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->getServiceInfoBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ServiceInfo;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->getSharedUserPackagesForPackage(Ljava/lang/String;I)[Ljava/lang/String;+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting; +HSPLcom/android/server/pm/ComputerEngine;->getServiceInfoBody(Landroid/content/ComponentName;JII)Landroid/content/pm/ServiceInfo;+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->getSharedUserPackagesForPackage(Ljava/lang/String;I)[Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SharedUserApi;Lcom/android/server/pm/SharedUserSetting; HSPLcom/android/server/pm/ComputerEngine;->getSigningDetails(I)Landroid/content/pm/SigningDetails;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/ComputerEngine;->getTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/ComputerEngine;->getUidTargetSdkVersion(I)I+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/ComputerEngine;->getUserStateOrDefaultForUser(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/ComputerEngine;->getTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->getUidTargetSdkVersion(I)I+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->getUserStateOrDefaultForUser(Ljava/lang/String;I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->getVersion()I -HSPLcom/android/server/pm/ComputerEngine;->hasCrossUserPermission(IIIZZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->hasCrossUserPermission(IIIZZ)Z HSPLcom/android/server/pm/ComputerEngine;->hasNonNegativePriority(Ljava/util/List;)Z+]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/pm/ComputerEngine;->hasSigningCertificate(Ljava/lang/String;[BI)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/ComputerEngine;->instantAppInstallerActivity()Landroid/content/pm/ActivityInfo; HSPLcom/android/server/pm/ComputerEngine;->isApexPackage(Ljava/lang/String;)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->isCallerInstallerOfRecord(Lcom/android/server/pm/pkg/AndroidPackage;I)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/ComputerEngine;->isCallerSameApp(Ljava/lang/String;IZ)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->isImplicitImageCaptureIntentAndNotSetByDpc(Landroid/content/Intent;ILjava/lang/String;J)Z+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/ComputerEngine;->isInstantApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternal(Ljava/lang/String;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternalBody(Ljava/lang/String;II)Z+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/ComputerEngine;->isImplicitImageCaptureIntentAndNotSetByDpc(Landroid/content/Intent;ILjava/lang/String;J)Z+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/pm/ComputerEngine;->isInstantApp(Ljava/lang/String;I)Z +HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternal(Ljava/lang/String;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->isInstantAppInternalBody(Ljava/lang/String;II)Z+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/ComputerEngine;->isInstantAppResolutionAllowed(Landroid/content/Intent;Ljava/util/List;IZJ)Z+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$OpaqueUri;,Landroid/net/Uri$StringUri;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->isPackageAvailable(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/ComputerEngine;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/ComputerEngine;->isKnownIsolatedComputeApp(I)Z+]Lcom/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerInternal;Lcom/android/server/ondeviceintelligence/OnDeviceIntelligenceManagerService$$ExternalSyntheticLambda2;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl; +HSPLcom/android/server/pm/ComputerEngine;->isPackageAvailable(Ljava/lang/String;I)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/ComputerEngine;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/ComputerEngine;->isRecentsAccessingChildProfiles(II)Z+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService; -HSPLcom/android/server/pm/ComputerEngine;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ComputerEngine;->queryContentProviders(Ljava/lang/String;IJLjava/lang/String;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List; -HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JJIIZZ)Ljava/util/List;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIIZZLjava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolver;,Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternal(Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIILjava/lang/String;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/ComputerEngine;->resolveContentProvider(Ljava/lang/String;JII)Landroid/content/pm/ProviderInfo;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService; +HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternal(Landroid/content/Intent;Ljava/lang/String;JJIIIZZ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ComputerEngine;->queryIntentActivitiesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIIZZLjava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolver;,Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternal(Landroid/content/Intent;Ljava/lang/String;JIIIZZ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/ComputerEngine;->queryIntentServicesInternalBody(Landroid/content/Intent;Ljava/lang/String;JIILjava/lang/String;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/ComputerEngine;->resolveContentProvider(Ljava/lang/String;JII)Landroid/content/pm/ProviderInfo;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/uri/UriGrantsManagerInternal;Lcom/android/server/uri/UriGrantsManagerService$LocalService; HSPLcom/android/server/pm/ComputerEngine;->resolveExternalPackageName(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageName(Ljava/lang/String;J)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageNameInternalLocked(Ljava/lang/String;JI)Ljava/lang/String;+]Landroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;]Landroid/content/pm/VersionedPackage;Landroid/content/pm/VersionedPackage;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedLibrariesRead;Lcom/android/server/pm/SharedLibrariesImpl;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray; -HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/SharedUserSetting;II)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting; -HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZ)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/ComputerEngine;->resolveInternalPackageNameInternalLocked(Ljava/lang/String;JI)Ljava/lang/String;+]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/SharedLibrariesRead;Lcom/android/server/pm/SharedLibrariesImpl;]Lcom/android/server/utils/WatchedLongSparseArray;Lcom/android/server/utils/WatchedLongSparseArray; +HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/SharedUserSetting;II)Z +HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z +HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZ)Z HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplication(Lcom/android/server/pm/pkg/PackageStateInternal;ILandroid/content/ComponentName;IIZZ)Z+]Lcom/android/server/pm/AppsFilterSnapshot;Lcom/android/server/pm/AppsFilterImpl;,Lcom/android/server/pm/AppsFilterSnapshotImpl;]Lcom/android/server/pm/ComputerEngine$Settings;Lcom/android/server/pm/ComputerEngine$Settings;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/SharedUserSetting;II)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/SharedUserSetting;II)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/ComputerEngine;->shouldFilterApplicationIncludingUninstalled(Lcom/android/server/pm/pkg/PackageStateInternal;II)Z HSPLcom/android/server/pm/ComputerEngine;->updateFlags(JI)J+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; -HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForComponent(JI)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; -HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForPackage(JI)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForResolve(JIIZZ)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForPackage(JI)J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForResolve(JIIZZ)J HSPLcom/android/server/pm/ComputerEngine;->updateFlagsForResolve(JIIZZZ)J+]Lcom/android/server/pm/ComputerEngine;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; HSPLcom/android/server/pm/ComputerEngine;->use()Lcom/android/server/pm/Computer; -HPLcom/android/server/pm/CrossProfileAppsServiceImpl;->lambda$getTargetUserProfilesUnchecked$3(ILjava/lang/String;)Ljava/util/List;+]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/pm/CrossProfileAppsServiceImpl$Injector;Lcom/android/server/pm/CrossProfileAppsServiceImpl$InjectorImpl;]Lcom/android/server/pm/CrossProfileAppsServiceImpl;Lcom/android/server/pm/CrossProfileAppsServiceImpl;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/CrossProfileIntentFilter;->snapshot()Lcom/android/server/pm/CrossProfileIntentFilter; -HSPLcom/android/server/pm/CrossProfileIntentResolver;->getIntentFilter(Lcom/android/server/pm/CrossProfileIntentFilter;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/WatchedIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter; -HSPLcom/android/server/pm/CrossProfileIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver; -HSPLcom/android/server/pm/CrossProfileIntentResolver;->isPackageForFilter(Ljava/lang/String;Lcom/android/server/pm/CrossProfileIntentFilter;)Z -HSPLcom/android/server/pm/CrossProfileIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver; -HSPLcom/android/server/pm/CrossProfileIntentResolver;->snapshot(Lcom/android/server/pm/CrossProfileIntentFilter;)Lcom/android/server/pm/CrossProfileIntentFilter;+]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter; -HSPLcom/android/server/pm/CrossProfileIntentResolver;->snapshot(Ljava/lang/Object;)Ljava/lang/Object;+]Lcom/android/server/pm/CrossProfileIntentResolver;Lcom/android/server/pm/CrossProfileIntentResolver; HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->(Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/DefaultAppProvider;Landroid/content/Context;)V -HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->combineFilterAndCreateQueryActivitiesResponse(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZJIIZLjava/util/List;Ljava/util/List;ZZZLjava/util/function/Function;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->combineFilterAndCreateQueryActivitiesResponse(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZJIIZLjava/util/List;Ljava/util/List;ZZZLjava/util/function/Function;)Lcom/android/server/pm/QueryIntentActivitiesResult;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/pm/CrossProfileIntentResolverEngine;->filterCandidatesWithDomainPreferredActivitiesLPrBody(Lcom/android/server/pm/Computer;Landroid/content/Intent;JLjava/util/List;Ljava/util/List;IZZZLjava/util/function/Function;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/DefaultAppProvider;Lcom/android/server/pm/DefaultAppProvider;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveInfoFromCrossProfileDomainInfo(Ljava/util/List;)Ljava/util/List;+]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IJLjava/lang/String;ZZLjava/util/function/Function;)Ljava/util/List;+]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine; -HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IIJLjava/lang/String;ZZLjava/util/function/Function;Ljava/util/Set;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileIntentResolverEngine;Lcom/android/server/pm/CrossProfileIntentResolverEngine;]Lcom/android/server/pm/CrossProfileResolver;Lcom/android/server/pm/DefaultCrossProfileResolver;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Ljava/util/HashSet; +HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IJLjava/lang/String;ZZLjava/util/function/Function;)Ljava/util/List; +HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;IIJLjava/lang/String;ZZLjava/util/function/Function;Ljava/util/Set;)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileResolver;Lcom/android/server/pm/DefaultCrossProfileResolver;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Ljava/util/HashSet; HSPLcom/android/server/pm/CrossProfileIntentResolverEngine;->shouldSkipCurrentProfile(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/DefaultCrossProfileResolver;->createForwardingResolveInfo(Lcom/android/server/pm/Computer;Lcom/android/server/pm/CrossProfileIntentFilter;Landroid/content/Intent;Ljava/lang/String;JILjava/util/function/Function;)Lcom/android/server/pm/CrossProfileDomainInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/CrossProfileIntentFilter;Lcom/android/server/pm/CrossProfileIntentFilter;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolver;,Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Function;Lcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda0; -HSPLcom/android/server/pm/DexOptHelper;->getDexUseManagerLocal()Lcom/android/server/art/DexUseManagerLocal; -HSPLcom/android/server/pm/GentleUpdateHelper;->onUidImportance(II)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/pm/IPackageManagerBase;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; +HPLcom/android/server/pm/DexOptHelper$DexoptDoneHandler;->onDexoptDone(Lcom/android/server/art/model/DexoptResult;)V+]Lcom/android/server/art/model/DexoptResult$DexContainerFileDexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult_DexContainerFileDexoptResult;]Lcom/android/server/art/model/DexoptResult$PackageDexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult_PackageDexoptResult;]Lcom/android/server/art/model/DexoptResult;Lcom/android/server/art/model/AutoValue_DexoptResult;]Lcom/android/server/pm/AbstractStatsBase;Lcom/android/server/pm/PackageUsage;]Lcom/android/server/pm/CompilerStats$PackageStats;Lcom/android/server/pm/CompilerStats$PackageStats;]Lcom/android/server/pm/CompilerStats;Lcom/android/server/pm/CompilerStats;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/GentleUpdateHelper;->onUidImportance(II)V+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->checkUidPermission(Ljava/lang/String;I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getApplicationInfo(Ljava/lang/String;JI)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HPLcom/android/server/pm/IPackageManagerBase;->getBlockUninstallForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; -HSPLcom/android/server/pm/IPackageManagerBase;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; +HPLcom/android/server/pm/IPackageManagerBase;->getComponentEnabledSetting(Landroid/content/ComponentName;I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getInstallSourceInfo(Ljava/lang/String;I)Landroid/content/pm/InstallSourceInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getNameForUid(I)Ljava/lang/String;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getPackageInfo(Ljava/lang/String;JI)Landroid/content/pm/PackageInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getPackagesForUid(I)[Ljava/lang/String;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; +HSPLcom/android/server/pm/IPackageManagerBase;->getPropertyAsUser(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PackageManager$Property;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/PackageProperty;Lcom/android/server/pm/PackageProperty; HSPLcom/android/server/pm/IPackageManagerBase;->getServiceInfo(Landroid/content/ComponentName;JI)Landroid/content/pm/ServiceInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->getTargetSdkVersion(Ljava/lang/String;)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->hasSystemFeature(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; HSPLcom/android/server/pm/IPackageManagerBase;->isInstantApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->isPackageAvailable(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; -HSPLcom/android/server/pm/IPackageManagerBase;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/IPackageManagerBase;->isPackageSuspendedForUser(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentActivities(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; -HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper; +HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->queryIntentServices(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->resolveContentProvider(Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; -HSPLcom/android/server/pm/IPackageManagerBase;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper; +HSPLcom/android/server/pm/IPackageManagerBase;->resolveIntent(Landroid/content/Intent;Ljava/lang/String;JI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; HSPLcom/android/server/pm/IPackageManagerBase;->snapshot()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; HSPLcom/android/server/pm/InstallPackageHelper;->addForInitLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)Lcom/android/server/pm/pkg/AndroidPackage; HSPLcom/android/server/pm/InstallPackageHelper;->assertPackageIsValid(Lcom/android/server/pm/pkg/AndroidPackage;II)V @@ -2420,207 +2458,217 @@ HSPLcom/android/server/pm/InstallPackageHelper;->commitPackageSettings(Lcom/andr HSPLcom/android/server/pm/InstallPackageHelper;->commitReconciledScanResultLocked(Lcom/android/server/pm/ReconciledPackage;[I)Lcom/android/server/pm/pkg/AndroidPackage; HSPLcom/android/server/pm/InstallPackageHelper;->installPackagesFromDir(Ljava/io/File;IILcom/android/internal/pm/parsing/PackageParser2;Ljava/util/concurrent/ExecutorService;Lcom/android/server/pm/ApexManager$ActiveApexInfo;)V HSPLcom/android/server/pm/InstallPackageHelper;->prepareInitialScanRequest(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/pm/ScanRequest; +HSPLcom/android/server/pm/InstallPackageHelper;->scanPackageForInitLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;)Landroid/util/Pair; HSPLcom/android/server/pm/InstallPackageHelper;->scanPackageNewLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IIJLandroid/os/UserHandle;Ljava/lang/String;)Lcom/android/server/pm/ScanResult; -HSPLcom/android/server/pm/InstallPackageHelper;->scanSystemPackageLI(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;)Landroid/util/Pair; HSPLcom/android/server/pm/InstallRequest;->(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;IILandroid/os/UserHandle;Lcom/android/server/pm/ScanResult;Lcom/android/server/pm/PackageSetting;)V HSPLcom/android/server/pm/Installer;->checkBeforeRemote()Z+]Ljava/util/concurrent/CountDownLatch;Ljava/util/concurrent/CountDownLatch; -HPLcom/android/server/pm/Installer;->getAppSize(Ljava/lang/String;[Ljava/lang/String;III[J[Ljava/lang/String;Landroid/content/pm/PackageStats;)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Ldalvik/system/BlockGuard$VmPolicy;Landroid/os/StrictMode$5;,Ldalvik/system/BlockGuard$2; +HPLcom/android/server/pm/Installer;->getAppSize(Ljava/lang/String;[Ljava/lang/String;III[J[Ljava/lang/String;Landroid/content/pm/PackageStats;)V+]Landroid/os/IInstalld;Landroid/os/IInstalld$Stub$Proxy;]Ldalvik/system/BlockGuard$VmPolicy;Landroid/os/StrictMode$5; HSPLcom/android/server/pm/InstantAppRegistry;->snapshot()Lcom/android/server/pm/InstantAppRegistry; -HSPLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSet(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/InstructionSets;->getDexCodeInstructionSet(Ljava/lang/String;)Ljava/lang/String; HSPLcom/android/server/pm/KeySetManagerService;->(Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/utils/WatchedArrayMap;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; HSPLcom/android/server/pm/KeySetManagerService;->addDefinedKeySetsToPackageLPw(Lcom/android/server/pm/PackageSetting;Ljava/util/Map;)V HSPLcom/android/server/pm/KeySetManagerService;->addScannedPackageLPw(Lcom/android/server/pm/pkg/AndroidPackage;)V HSPLcom/android/server/pm/KeySetManagerService;->assertScannedPackageValid(Lcom/android/server/pm/pkg/AndroidPackage;)V HSPLcom/android/server/pm/KeySetManagerService;->getPublicKeysFromKeySetLPr(J)Landroid/util/ArraySet; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$$ExternalSyntheticLambda2;->getOrThrow()Ljava/lang/Object; HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$MyPackageMonitor;->onShortcutChangedInner(Ljava/lang/String;I)V+]Landroid/content/pm/IOnAppsChangedListener;Landroid/content/pm/IOnAppsChangedListener$Stub$Proxy;]Landroid/content/pm/ShortcutServiceInternal;Lcom/android/server/pm/ShortcutService$LocalService;]Landroid/os/RemoteCallbackList;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl$PackageCallbackList;]Ljava/lang/RuntimeException;Ljava/lang/IllegalStateException; HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->canAccessProfile(ILjava/lang/String;)Z+]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl; -HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/LauncherActivityInfoInternal;Landroid/content/pm/LauncherActivityInfoInternal;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/HashSet;Ljava/util/HashSet;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getShortcuts(Ljava/lang/String;Landroid/content/pm/ShortcutQueryWrapper;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/content/pm/ShortcutServiceInternal;Lcom/android/server/pm/ShortcutService$LocalService;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->generateLauncherActivitiesForArchivedApp(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/pkg/ArchiveState;Lcom/android/server/pm/pkg/ArchiveState;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getApplicationInfoForArchivedApp(Ljava/lang/String;Landroid/os/UserHandle;)Ljava/util/List;+]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->getLauncherActivities(Ljava/lang/String;Ljava/lang/String;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/LauncherActivityInfoInternal;Landroid/content/pm/LauncherActivityInfoInternal;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/ParceledListSlice;Landroid/content/pm/ParceledListSlice;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->injectBinderCallingUid()I -HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl; -HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryIntentLauncherActivities(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryActivitiesForUser(Ljava/lang/String;Landroid/content/Intent;Landroid/os/UserHandle;)Landroid/content/pm/ParceledListSlice;+]Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;Lcom/android/server/pm/LauncherAppsService$LauncherAppsImpl; +HPLcom/android/server/pm/LauncherAppsService$LauncherAppsImpl;->queryIntentLauncherActivities(Landroid/content/Intent;ILandroid/os/UserHandle;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths;->applyTo(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;)V HSPLcom/android/server/pm/PackageAbiHelperImpl;->calculateBundledApkRoot(Ljava/lang/String;)Ljava/lang/String; HSPLcom/android/server/pm/PackageAbiHelperImpl;->deriveNativeLibraryPaths(Lcom/android/server/pm/PackageAbiHelper$Abis;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;ZZ)Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths; HSPLcom/android/server/pm/PackageAbiHelperImpl;->derivePackageAbi(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/String;Ljava/io/File;)Landroid/util/Pair; +HSPLcom/android/server/pm/PackageAbiHelperImpl;->getBundledAppAbi(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/PackageAbiHelper$Abis; HSPLcom/android/server/pm/PackageArchiver;->isArchived(Lcom/android/server/pm/pkg/PackageUserState;)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; HPLcom/android/server/pm/PackageInstallerSession;->generateInfoInternal(ZZ)Landroid/content/pm/PackageInstaller$SessionInfo;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageInstaller$SessionParams;Landroid/content/pm/PackageInstaller$SessionParams;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Ljava/io/File;Ljava/io/File;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/PackageInstallerSession;->write(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/io/File;)V+]Landroid/content/pm/Checksum;Landroid/content/pm/Checksum;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Ljava/io/File;Ljava/io/File; +HSPLcom/android/server/pm/PackageInstallerSession;->write(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/io/File;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;Lcom/android/server/pm/PackageInstallerSession$PerFileChecksum;]Lcom/android/server/pm/PackageInstallerSession;Lcom/android/server/pm/PackageInstallerSession;]Ljava/io/File;Ljava/io/File; +HSPLcom/android/server/pm/PackageInstallerSession;->writeAutoRevokePermissionsMode(Lcom/android/modules/utils/TypedXmlSerializer;I)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/pm/PackageKeySetData;->()V HSPLcom/android/server/pm/PackageKeySetData;->(Lcom/android/server/pm/PackageKeySetData;)V -HPLcom/android/server/pm/PackageManagerInternalBase;->canQueryPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->filterAppAccess(Ljava/lang/String;IIZ)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getApplicationInfo(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(Ljava/lang/String;)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZ)V+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; -HSPLcom/android/server/pm/PackageManagerInternalBase;->isInstantApp(Ljava/lang/String;I)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; -HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageEphemeral(ILjava/lang/String;)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageFrozen(Ljava/lang/String;II)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; +HPLcom/android/server/pm/PackageManagerInternalBase;->canQueryPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerInternalBase;->filterAppAccess(Ljava/lang/String;IIZ)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getApplicationInfo(Ljava/lang/String;JII)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getInstantAppPackageName(I)Ljava/lang/String;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackage(I)Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageStateInternal(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageStateInternal;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getPackageUid(Ljava/lang/String;JI)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerInternalBase;->getUidTargetSdkVersion(I)I+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZ)V +HSPLcom/android/server/pm/PackageManagerInternalBase;->grantImplicitAccess(ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; +HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageEphemeral(ILjava/lang/String;)Z+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageFrozen(Ljava/lang/String;II)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; HSPLcom/android/server/pm/PackageManagerInternalBase;->isPackageSuspended(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HSPLcom/android/server/pm/PackageManagerInternalBase;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->notifyComponentUsed(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; -HSPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerInternalBase;->resolveService(Landroid/content/Intent;Ljava/lang/String;JII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper; +HSPLcom/android/server/pm/PackageManagerInternalBase;->notifyComponentUsed(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; +HSPLcom/android/server/pm/PackageManagerInternalBase;->queryIntentReceivers(Landroid/content/Intent;Ljava/lang/String;JIIIZ)Ljava/util/List;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; +HSPLcom/android/server/pm/PackageManagerInternalBase;->resolveService(Landroid/content/Intent;Ljava/lang/String;JIII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; HSPLcom/android/server/pm/PackageManagerInternalBase;->snapshot()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; -HSPLcom/android/server/pm/PackageManagerInternalBase;->snapshot()Lcom/android/server/pm/snapshot/PackageDataSnapshot;+]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda23;->produce(Ljava/lang/Class;)Ljava/lang/Object; -HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda55;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/pm/PackageManagerInternalBase;->snapshot()Lcom/android/server/pm/snapshot/PackageDataSnapshot; +HSPLcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda52;->accept(Ljava/lang/Object;)V HSPLcom/android/server/pm/PackageManagerService$1;->onChange(Lcom/android/server/utils/Watchable;)V -HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->isProtectedBroadcast(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/lang/String;Ljava/lang/String; -HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V+]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/art/DexUseManagerLocal;Lcom/android/server/art/DexUseManagerLocal;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->isProtectedBroadcast(Ljava/lang/String;)Z +HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->notifyDexLoad(Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;)V+]Lcom/android/server/art/DexUseManagerLocal;Lcom/android/server/art/DexUseManagerLocal;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/IPackageManagerBase;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->onTransact(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z HSPLcom/android/server/pm/PackageManagerService$IPackageManagerImpl;->setComponentEnabledSetting(Landroid/content/ComponentName;IIILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getIncrementalStatesInfo(Ljava/lang/String;II)Landroid/content/pm/IncrementalStatesInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getPermissionManager()Lcom/android/server/pm/permission/PermissionManagerServiceInternal; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getResolveIntentHelper()Lcom/android/server/pm/ResolveIntentHelper; -HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->getSuspendPackageHelper()Lcom/android/server/pm/SuspendPackageHelper; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->hasSignatureCapability(III)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isSameApp(Ljava/lang/String;II)Z+]Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isSameApp(Ljava/lang/String;JII)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerInternalBase;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->isSameApp(Ljava/lang/String;JII)Z+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; HSPLcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;->notifyPackageUse(Ljava/lang/String;I)V HSPLcom/android/server/pm/PackageManagerService$Snapshot;->(Lcom/android/server/pm/PackageManagerService;I)V+]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/resolution/ComponentResolver;Lcom/android/server/pm/resolution/ComponentResolver;]Lcom/android/server/utils/WatchedSparseBooleanArray;Lcom/android/server/utils/WatchedSparseBooleanArray; -HSPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Lcom/android/server/pm/Computer;Ljava/lang/String;I)V+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/PackageManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl; -HSPLcom/android/server/pm/PackageManagerService;->forEachPackageState(Landroid/util/ArrayMap;Ljava/util/function/Consumer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Consumer;megamorphic_types +HSPLcom/android/server/pm/PackageManagerService;->boostPriorityForPackageManagerTracedLockedSection()V +HSPLcom/android/server/pm/PackageManagerService;->checkPackageStartable(Lcom/android/server/pm/Computer;Ljava/lang/String;I)V+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/PackageManagerService;->forEachPackageState(Landroid/util/ArrayMap;Ljava/util/function/Consumer;)V+]Ljava/util/function/Consumer;Lcom/android/server/BinaryTransparencyService$BinaryTransparencyServiceImpl$$ExternalSyntheticLambda0;,Lcom/android/server/pm/DexOptHelper$$ExternalSyntheticLambda8;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda52;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda53;,Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl$$ExternalSyntheticLambda3;,Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl$$ExternalSyntheticLambda4; HSPLcom/android/server/pm/PackageManagerService;->getSafeMode()Z -HSPLcom/android/server/pm/PackageManagerService;->grantImplicitAccess(Lcom/android/server/pm/Computer;ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/AppsFilterImpl;Lcom/android/server/pm/AppsFilterImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/InstantAppRegistry;Lcom/android/server/pm/InstantAppRegistry;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/pm/PackageManagerService;->hasSystemFeature(Ljava/lang/String;I)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/pm/PackageManagerService;->lambda$forEachInstalledPackage$60(ILjava/util/function/Consumer;Lcom/android/server/pm/pkg/PackageStateInternal;)V+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/function/Consumer;Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/people/data/DataManager$$ExternalSyntheticLambda11;,Lcom/android/server/people/data/DataManager$$ExternalSyntheticLambda12;,Lcom/android/server/policy/role/RoleServicePlatformHelperImpl$$ExternalSyntheticLambda0; -HSPLcom/android/server/pm/PackageManagerService;->notifyComponentUsed(Lcom/android/server/pm/Computer;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/PackageManagerService;->notifyPackageUseInternal(Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; -HSPLcom/android/server/pm/PackageManagerService;->onChange(Lcom/android/server/utils/Watchable;)V+]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; +HSPLcom/android/server/pm/PackageManagerService;->grantImplicitAccess(Lcom/android/server/pm/Computer;ILandroid/content/Intent;IIZZ)V+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HSPLcom/android/server/pm/PackageManagerService;->hasSystemFeature(Ljava/lang/String;I)Z +HSPLcom/android/server/pm/PackageManagerService;->lambda$forEachInstalledPackage$58(ILjava/util/function/Consumer;Lcom/android/server/pm/pkg/PackageStateInternal;)V+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/function/Consumer;Lcom/android/server/net/NetworkPolicyManagerService$$ExternalSyntheticLambda5;,Lcom/android/server/people/data/DataManager$$ExternalSyntheticLambda11;,Lcom/android/server/policy/role/RoleServicePlatformHelperImpl$$ExternalSyntheticLambda0; +HSPLcom/android/server/pm/PackageManagerService;->notifyComponentUsed(Lcom/android/server/pm/Computer;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/PackageManagerService;->notifyPackageUseInternal(Ljava/lang/String;I)V+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; +HSPLcom/android/server/pm/PackageManagerService;->onChange(Lcom/android/server/utils/Watchable;)V HSPLcom/android/server/pm/PackageManagerService;->rebuildSnapshot(Lcom/android/server/pm/Computer;I)Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerService;->resetPriorityAfterPackageManagerTracedLockedSection()V HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettingInternalLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/PackageSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;ILjava/lang/String;)Z+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettings(Ljava/util/List;ILjava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager$ComponentEnabledSetting;Landroid/content/pm/PackageManager$ComponentEnabledSetting;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/BroadcastHelper;Lcom/android/server/pm/BroadcastHelper;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PendingPackageBroadcasts;Lcom/android/server/pm/PendingPackageBroadcasts;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$List12;]Ljava/util/Map;Landroid/util/ArrayMap; -HSPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Lcom/android/server/pm/Computer;Ljava/lang/String;ZI)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/Handler;Lcom/android/server/pm/PackageHandler;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/PackageMonitorCallbackHelper;Lcom/android/server/pm/PackageMonitorCallbackHelper;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/PackageManagerService;->setEnabledSettings(Ljava/util/List;ILjava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/ImmutableCollections$List12; +HSPLcom/android/server/pm/PackageManagerService;->setPackageStoppedState(Lcom/android/server/pm/Computer;Ljava/lang/String;ZI)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/PackageMonitorCallbackHelper;Lcom/android/server/pm/PackageMonitorCallbackHelper;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/PackageManagerService;->snapshotComputer()Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService; -HSPLcom/android/server/pm/PackageManagerService;->snapshotComputer(Z)Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger;]Ljava/util/concurrent/atomic/AtomicReference;Ljava/util/concurrent/atomic/AtomicReference; -HSPLcom/android/server/pm/PackageManagerServiceInjector$Singleton;->get(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;+]Lcom/android/server/pm/PackageManagerServiceInjector$Producer;megamorphic_types +HSPLcom/android/server/pm/PackageManagerService;->snapshotComputer(Z)Lcom/android/server/pm/Computer;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine; +HSPLcom/android/server/pm/PackageManagerServiceInjector$Singleton;->get(Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerService;)Ljava/lang/Object;+]Lcom/android/server/pm/PackageManagerServiceInjector$Producer;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda15;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda16;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda18;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda19;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda24;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda26; HSPLcom/android/server/pm/PackageManagerServiceInjector;->getCompatibility()Lcom/android/server/compat/PlatformCompat;+]Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;Lcom/android/server/pm/PackageManagerServiceInjector$Singleton; HSPLcom/android/server/pm/PackageManagerServiceInjector;->getLocalService(Ljava/lang/Class;)Ljava/lang/Object;+]Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda23; +HSPLcom/android/server/pm/PackageManagerServiceInjector;->getSystemConfig()Lcom/android/server/SystemConfig; HSPLcom/android/server/pm/PackageManagerServiceInjector;->getUserManagerInternal()Lcom/android/server/pm/UserManagerInternal;+]Lcom/android/server/pm/PackageManagerServiceInjector;Lcom/android/server/pm/PackageManagerServiceInjector;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/pm/PackageManagerServiceInjector;->getUserManagerService()Lcom/android/server/pm/UserManagerService;+]Lcom/android/server/pm/PackageManagerServiceInjector$Singleton;Lcom/android/server/pm/PackageManagerServiceInjector$Singleton; -HSPLcom/android/server/pm/PackageManagerServiceUtils;->applyEnforceIntentFilterMatching(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/snapshot/PackageDataSnapshot;Ljava/util/List;ZLandroid/content/Intent;Ljava/lang/String;I)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/PackageManagerServiceUtils;->applyNullActionBlocking(Lcom/android/server/compat/PlatformCompat;Lcom/android/server/pm/snapshot/PackageDataSnapshot;Ljava/util/List;ZLandroid/content/Intent;I)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatures(Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;)I+]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails; -HSPLcom/android/server/pm/PackageManagerServiceUtils;->componentInfoToComponent(Landroid/content/pm/ComponentInfo;Lcom/android/server/pm/resolution/ComponentResolverApi;Z)Lcom/android/internal/pm/pkg/component/ParsedMainComponent;+]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ActivityInfo;,Landroid/content/pm/ServiceInfo;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolver;,Lcom/android/server/pm/resolution/ComponentResolverSnapshot; -HSPLcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Lcom/android/server/pm/pkg/AndroidPackage;)J+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HSPLcom/android/server/pm/PackageManagerServiceUtils;->compareSignatures(Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;)I +HSPLcom/android/server/pm/PackageManagerServiceUtils;->getLastModifiedTime(Lcom/android/server/pm/pkg/AndroidPackage;)J +HSPLcom/android/server/pm/PackageMetrics$ComponentStateMetrics;->(Landroid/content/pm/PackageManager$ComponentEnabledSetting;III)V HSPLcom/android/server/pm/PackageProperty;->addAllProperties(Lcom/android/server/pm/pkg/AndroidPackage;)V -HSPLcom/android/server/pm/PackageProperty;->addComponentProperties(Ljava/util/List;Landroid/util/ArrayMap;)Landroid/util/ArrayMap;+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Map;Landroid/util/ArrayMap;,Ljava/util/Collections$EmptyMap;,Ljava/util/HashMap; -HSPLcom/android/server/pm/PackageSetting$1;->createSnapshot()Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->(Lcom/android/server/pm/PackageSetting;Z)V+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->(Ljava/lang/String;Ljava/lang/String;Ljava/io/File;IILjava/util/UUID;)V -HSPLcom/android/server/pm/PackageSetting;->copyMimeGroups(Ljava/util/Map;)V+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$EmptyIterator;]Ljava/util/Map;Landroid/util/ArrayMap;,Lcom/android/server/pm/Settings$KeySetToValueMap;,Ljava/util/Collections$EmptyMap;]Ljava/util/Set;Landroid/util/ArraySet;,Landroid/util/MapCollections$KeySet;,Ljava/util/Collections$EmptySet; -HSPLcom/android/server/pm/PackageSetting;->copyPackageSetting(Lcom/android/server/pm/PackageSetting;Z)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;][B[B -HSPLcom/android/server/pm/PackageSetting;->enableComponentLPw(Ljava/lang/String;I)Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; +HSPLcom/android/server/pm/PackageSetting;->copyMimeGroups(Ljava/util/Map;)V+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;,Ljava/util/Collections$EmptyIterator;]Ljava/util/Map;Landroid/util/ArrayMap;,Lcom/android/server/pm/Settings$KeySetToValueMap;,Ljava/util/Collections$EmptyMap;]Ljava/util/Set;Landroid/util/MapCollections$KeySet;,Ljava/util/Collections$EmptySet; +HSPLcom/android/server/pm/PackageSetting;->copyPackageSetting(Lcom/android/server/pm/PackageSetting;Z)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/PackageSetting;->getAndroidPackage()Lcom/android/server/pm/pkg/AndroidPackage;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->getApexModuleName()Ljava/lang/String;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/PackageSetting;->getAppId()I +HSPLcom/android/server/pm/PackageSetting;->getBaseRevisionCode()I HSPLcom/android/server/pm/PackageSetting;->getBoolean(I)Z HSPLcom/android/server/pm/PackageSetting;->getCategoryOverride()I +HSPLcom/android/server/pm/PackageSetting;->getCpuAbiOverride()Ljava/lang/String; HSPLcom/android/server/pm/PackageSetting;->getCurrentEnabledStateLPr(Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; -HSPLcom/android/server/pm/PackageSetting;->getEnabled(I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/PackageSetting;->getInstallSource()Lcom/android/server/pm/InstallSource; +HSPLcom/android/server/pm/PackageSetting;->getKeySetData()Lcom/android/server/pm/PackageKeySetData; HSPLcom/android/server/pm/PackageSetting;->getLastUpdateTime()J -HSPLcom/android/server/pm/PackageSetting;->getLoadingCompletedTime()J +HSPLcom/android/server/pm/PackageSetting;->getLoadingProgress()F HSPLcom/android/server/pm/PackageSetting;->getMimeGroups()Ljava/util/Map; +HSPLcom/android/server/pm/PackageSetting;->getPackageName()Ljava/lang/String; HSPLcom/android/server/pm/PackageSetting;->getPkg()Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal; HSPLcom/android/server/pm/PackageSetting;->getPkgState()Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/PackageSetting;->getPrimaryCpuAbi()Ljava/lang/String; +HSPLcom/android/server/pm/PackageSetting;->getPrimaryCpuAbiLegacy()Ljava/lang/String; HSPLcom/android/server/pm/PackageSetting;->getSeInfo()Ljava/lang/String;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/PackageSetting;->getSecondaryCpuAbi()Ljava/lang/String; HSPLcom/android/server/pm/PackageSetting;->getSharedLibraryDependencies()Ljava/util/List;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; +HSPLcom/android/server/pm/PackageSetting;->getSignatures()Lcom/android/server/pm/PackageSignatures; HSPLcom/android/server/pm/PackageSetting;->getSigningDetails()Landroid/content/pm/SigningDetails; HSPLcom/android/server/pm/PackageSetting;->getStateForUser(Landroid/os/UserHandle;)Lcom/android/server/pm/pkg/PackageUserState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->getTransientState()Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/PackageSetting;->getUserStates()Landroid/util/SparseArray; HSPLcom/android/server/pm/PackageSetting;->getUsesSdkLibraries()[Ljava/lang/String; -HSPLcom/android/server/pm/PackageSetting;->getUsesStaticLibraries()[Ljava/lang/String; -HSPLcom/android/server/pm/PackageSetting;->getVersionCode()J HSPLcom/android/server/pm/PackageSetting;->getVolumeUuid()Ljava/lang/String; HSPLcom/android/server/pm/PackageSetting;->hasSharedUser()Z HSPLcom/android/server/pm/PackageSetting;->isApex()Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/pm/PackageSetting;->isLoading()Z +HSPLcom/android/server/pm/PackageSetting;->isDebuggable()Z HSPLcom/android/server/pm/PackageSetting;->isPrivileged()Z+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/PackageSetting;->isScannedAsStoppedSystemApp()Z+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/PackageSetting;->isScannedAsStoppedSystemApp()Z HSPLcom/android/server/pm/PackageSetting;->isSystem()Z+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->isUpdatedSystemApp()Z+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/PackageSetting;->modifyUserState(I)Lcom/android/server/pm/pkg/PackageUserStateImpl;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/PackageSetting;->modifyUserStateComponents(IZZ)Lcom/android/server/pm/pkg/PackageUserStateImpl;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/PackageSetting;->modifyUserStateComponents(IZZ)Lcom/android/server/pm/pkg/PackageUserStateImpl;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/PackageSetting;->readUserState(I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/PackageSetting;->setUserState(IJJIZZZZILandroid/util/ArrayMap;ZZLjava/lang/String;Landroid/util/ArraySet;Landroid/util/ArraySet;IILjava/lang/String;Ljava/lang/String;JILcom/android/server/pm/pkg/ArchiveState;)V -HSPLcom/android/server/pm/PackageSetting;->snapshot()Lcom/android/server/pm/PackageSetting;+]Lcom/android/server/utils/SnapshotCache;Lcom/android/server/pm/PackageSetting$1; +HSPLcom/android/server/pm/PackageSetting;->snapshot()Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->snapshot()Ljava/lang/Object;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSetting;->updateMimeGroups(Ljava/util/Set;)Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/PackageSignatures;->readCertsListXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;Ljava/util/ArrayList;IZLandroid/content/pm/SigningDetails$Builder;)I HSPLcom/android/server/pm/PackageSignatures;->readXml(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;)V HSPLcom/android/server/pm/PackageSignatures;->writeCertsListXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/ArrayList;[Landroid/content/pm/Signature;Z)V+]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/pm/PackageSignatures;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V+]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures; +HSPLcom/android/server/pm/PackageSignatures;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/lang/String;Ljava/util/ArrayList;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/pm/ParallelPackageParser;->lambda$submit$0(Ljava/io/File;I)V HSPLcom/android/server/pm/Policy;->getMatchedSeInfo(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/Map;Ljava/util/Collections$UnmodifiableMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/pm/PreferredActivityHelper;->replacePreferredActivity(Lcom/android/server/pm/Computer;Lcom/android/server/pm/WatchedIntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PreferredComponent;Lcom/android/server/pm/PreferredComponent;]Lcom/android/server/pm/WatchedIntentResolver;Lcom/android/server/pm/PreferredIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/ProtectedPackages;->isOwnerProtectedPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages; +HPLcom/android/server/pm/PreferredActivityHelper;->replacePreferredActivity(Lcom/android/server/pm/Computer;Lcom/android/server/pm/WatchedIntentFilter;I[Landroid/content/ComponentName;Landroid/content/ComponentName;I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/PackageManagerService;Lcom/android/server/pm/PackageManagerService;]Lcom/android/server/pm/PreferredComponent;Lcom/android/server/pm/PreferredComponent;]Lcom/android/server/pm/WatchedIntentResolver;Lcom/android/server/pm/PreferredIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/pm/ProtectedPackages;->hasDeviceOwnerOrProfileOwner(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/pm/ProtectedPackages;->isOwnerProtectedPackage(ILjava/lang/String;)Z HSPLcom/android/server/pm/ProtectedPackages;->isPackageProtectedForUser(ILjava/lang/String;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet; -HSPLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(ILjava/lang/String;)Z+]Lcom/android/server/pm/ProtectedPackages;Lcom/android/server/pm/ProtectedPackages;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/pm/ProtectedPackages;->isPackageStateProtected(ILjava/lang/String;)Z +HSPLcom/android/server/pm/ProtectedPackages;->isProtectedPackage(ILjava/lang/String;)Z HSPLcom/android/server/pm/ReconcilePackageUtils;->reconcilePackages(Ljava/util/List;Ljava/util/Map;Ljava/util/Map;Lcom/android/server/pm/SharedLibrariesImpl;Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/pm/Settings;Lcom/android/server/SystemConfig;)Ljava/util/List; HSPLcom/android/server/pm/ReconciledPackage;->(Ljava/util/List;Ljava/util/Map;Lcom/android/server/pm/InstallRequest;Lcom/android/server/pm/DeletePackageAction;Ljava/util/List;Landroid/content/pm/SigningDetails;ZZ)V HSPLcom/android/server/pm/ReconciledPackage;->getCombinedAvailablePackages()Ljava/util/Map; HSPLcom/android/server/pm/ResilientAtomicFile;->(Ljava/io/File;Ljava/io/File;Ljava/io/File;ILjava/lang/String;Lcom/android/server/pm/ResilientAtomicFile$ReadEventLogger;)V HSPLcom/android/server/pm/ResilientAtomicFile;->close()V -HSPLcom/android/server/pm/ResilientAtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V+]Landroid/os/ParcelFileDescriptor;Landroid/os/ParcelFileDescriptor;]Ljava/io/File;Ljava/io/File;]Ljava/io/FileInputStream;Ljava/io/FileInputStream;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream; -HSPLcom/android/server/pm/ResilientAtomicFile;->startWrite()Ljava/io/FileOutputStream;+]Ljava/io/File;Ljava/io/File; -HSPLcom/android/server/pm/ResolveIntentHelper;->chooseBestActivity(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJLjava/util/List;IZ)Landroid/content/pm/ResolveInfo;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/server/pm/PreferredActivityHelper;Lcom/android/server/pm/PreferredActivityHelper;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;]Ljava/util/function/Supplier;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda41;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda42; -HSPLcom/android/server/pm/ResolveIntentHelper;->queryIntentReceiversInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JIIZ)Ljava/util/List;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/ResolveIntentHelper;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJIZIZI)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/ResolveIntentHelper;Lcom/android/server/pm/ResolveIntentHelper;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/ResolveIntentHelper;->resolveServiceInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/pm/ResilientAtomicFile;->finishWrite(Ljava/io/FileOutputStream;)V +HSPLcom/android/server/pm/ResilientAtomicFile;->startWrite()Ljava/io/FileOutputStream; +HSPLcom/android/server/pm/ResolveIntentHelper;->chooseBestActivity(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJLjava/util/List;IZ)Landroid/content/pm/ResolveInfo;+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList;]Ljava/util/function/Supplier;Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda38;,Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda39; +HSPLcom/android/server/pm/ResolveIntentHelper;->queryIntentReceiversInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JIIIZ)Ljava/util/List;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot; +HSPLcom/android/server/pm/ResolveIntentHelper;->resolveIntentInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JJIZII)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/ResolveIntentHelper;->resolveServiceInternal(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JIIIZ)Landroid/content/pm/ResolveInfo;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; HSPLcom/android/server/pm/RestrictionsSet;->getRestrictions(I)Landroid/os/Bundle;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/RestrictionsSet;->updateRestrictions(ILandroid/os/Bundle;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/SELinuxMMAC;->getSeInfo(Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/pkg/AndroidPackage;ZI)Ljava/lang/String;+]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/SaferIntentUtils$IntentArgs;->(Landroid/content/Intent;Ljava/lang/String;ZZII)V +HSPLcom/android/server/pm/SaferIntentUtils$IntentArgs;->isChangeEnabled(J)Z+]Lcom/android/server/compat/PlatformCompat;Lcom/android/server/compat/PlatformCompat; +HSPLcom/android/server/pm/SaferIntentUtils;->blockNullAction(Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Ljava/util/List;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Lcom/android/server/pm/SaferIntentUtils$IntentArgs;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/pm/SaferIntentUtils;->enforceIntentFilterMatching(Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Ljava/util/List;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Lcom/android/server/pm/SaferIntentUtils$IntentArgs;]Ljava/lang/ThreadLocal;Ljava/lang/ThreadLocal$SuppliedThreadLocal;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/SaferIntentUtils;->filterNonExportedComponents(Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Ljava/util/List;)V+]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Lcom/android/server/pm/SaferIntentUtils$IntentArgs;Lcom/android/server/pm/SaferIntentUtils$IntentArgs;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/SaferIntentUtils;->infoToComponent(Landroid/content/pm/ComponentInfo;Lcom/android/server/pm/resolution/ComponentResolverApi;Z)Lcom/android/internal/pm/pkg/component/ParsedMainComponent;+]Landroid/content/pm/ComponentInfo;Landroid/content/pm/ActivityInfo;,Landroid/content/pm/ServiceInfo;]Lcom/android/server/pm/resolution/ComponentResolverApi;Lcom/android/server/pm/resolution/ComponentResolverSnapshot; HSPLcom/android/server/pm/ScanPackageUtils;->applyPolicy(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ILcom/android/server/pm/pkg/AndroidPackage;Z)V HSPLcom/android/server/pm/ScanPackageUtils;->collectCertificatesLI(Lcom/android/server/pm/PackageSetting;Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/Settings$VersionInfo;ZZZ)V HSPLcom/android/server/pm/ScanPackageUtils;->scanPackageOnlyLI(Lcom/android/server/pm/ScanRequest;Lcom/android/server/pm/PackageManagerServiceInjector;ZJ)Lcom/android/server/pm/ScanResult; HSPLcom/android/server/pm/ScanRequest;->(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Ljava/lang/String;IIZLandroid/os/UserHandle;Ljava/lang/String;)V HSPLcom/android/server/pm/ScanResult;->(Lcom/android/server/pm/ScanRequest;Lcom/android/server/pm/PackageSetting;Ljava/util/List;ZILandroid/content/pm/SharedLibraryInfo;Landroid/content/pm/SharedLibraryInfo;Ljava/util/List;)V HSPLcom/android/server/pm/SettingBase;->(II)V -HSPLcom/android/server/pm/SettingBase;->(Lcom/android/server/pm/SettingBase;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting; -HSPLcom/android/server/pm/SettingBase;->copySettingBase(Lcom/android/server/pm/SettingBase;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting;]Lcom/android/server/pm/permission/LegacyPermissionState;Lcom/android/server/pm/permission/LegacyPermissionState; +HSPLcom/android/server/pm/SettingBase;->(Lcom/android/server/pm/SettingBase;)V +HSPLcom/android/server/pm/SettingBase;->copySettingBase(Lcom/android/server/pm/SettingBase;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting; HSPLcom/android/server/pm/SettingBase;->dispatchChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/utils/WatchableImpl; +HSPLcom/android/server/pm/SettingBase;->getFlags()I +HSPLcom/android/server/pm/SettingBase;->getPrivateFlags()I HSPLcom/android/server/pm/SettingBase;->onChanged()V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting; -HSPLcom/android/server/pm/SettingBase;->registerObserver(Lcom/android/server/utils/Watcher;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/utils/WatchableImpl; -HSPLcom/android/server/pm/Settings$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings; +HSPLcom/android/server/pm/SettingBase;->registerObserver(Lcom/android/server/utils/Watcher;)V +HSPLcom/android/server/pm/Settings$1;->onChange(Lcom/android/server/utils/Watchable;)V HSPLcom/android/server/pm/Settings$2;->createSnapshot()Lcom/android/server/pm/Settings;+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchableImpl; -HSPLcom/android/server/pm/Settings$RuntimePermissionPersistence;->getPermissionsFromPermissionsState(Lcom/android/server/pm/permission/LegacyPermissionState;I)Ljava/util/List;+]Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;]Lcom/android/server/pm/permission/LegacyPermissionState;Lcom/android/server/pm/permission/LegacyPermissionState;]Ljava/util/Collection;Ljava/util/Collections$EmptyList;,Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$EmptyIterator;,Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/Settings;->(Lcom/android/server/pm/Settings;)V +HSPLcom/android/server/pm/Settings;->dispatchChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchableImpl; HSPLcom/android/server/pm/Settings;->getApplicationEnabledSettingLPr(Ljava/lang/String;I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/Settings;->getComponentEnabledSettingLPr(Landroid/content/ComponentName;I)I+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HPLcom/android/server/pm/Settings;->getBlockUninstallLPr(ILjava/lang/String;)Z+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray; +HSPLcom/android/server/pm/Settings;->getComponentEnabledSettingLPr(Landroid/content/ComponentName;I)I+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/Settings;->getCrossProfileIntentResolver(I)Lcom/android/server/pm/CrossProfileIntentResolver;+]Lcom/android/server/utils/WatchedSparseArray;Lcom/android/server/utils/WatchedSparseArray; HSPLcom/android/server/pm/Settings;->getDisabledSystemPkgLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/Settings;->getPackageLPr(Ljava/lang/String;)Lcom/android/server/pm/PackageSetting;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/Settings;->getRenamedPackageLPr(Ljava/lang/String;)Ljava/lang/String;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/pm/Settings;->getSettingLPr(I)Lcom/android/server/pm/SettingBase;+]Lcom/android/server/pm/AppIdSettingMap;Lcom/android/server/pm/AppIdSettingMap; +HSPLcom/android/server/pm/Settings;->getSettingLPr(I)Lcom/android/server/pm/SettingBase; HSPLcom/android/server/pm/Settings;->getSharedUserSettingLPr(Lcom/android/server/pm/PackageSetting;)Lcom/android/server/pm/SharedUserSetting;+]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/Settings;->readPackageLPw(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/util/ArrayList;Landroid/util/ArrayMap;Ljava/util/List;Landroid/util/ArrayMap;)V HSPLcom/android/server/pm/Settings;->readPackageRestrictionsLPr(ILandroid/util/ArrayMap;)V HSPLcom/android/server/pm/Settings;->updatePackageSetting(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/SharedUserSetting;Lcom/android/server/pm/SharedUserSetting;Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;IILcom/android/server/pm/UserManagerService;[Ljava/lang/String;[J[Z[Ljava/lang/String;[JLjava/util/Set;Ljava/util/UUID;I[BZ)V HSPLcom/android/server/pm/Settings;->writeDisabledSysPackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageSetting;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/Settings;->writeKeySetAliasesLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/PackageKeySetData;Lcom/android/server/pm/PackageKeySetData;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; -HSPLcom/android/server/pm/Settings;->writeLPr(Lcom/android/server/pm/Computer;Z)V+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/pm/KeySetManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/server/pm/ResilientAtomicFile;Lcom/android/server/pm/ResilientAtomicFile;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/permission/LegacyPermissionSettings;Lcom/android/server/pm/permission/LegacyPermissionSettings;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; -HSPLcom/android/server/pm/Settings;->writePackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/lang/Object;Ljava/util/UUID; -HSPLcom/android/server/pm/Settings;->writePackageListLPrInternal(I)V+]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/internal/util/JournaledFile;Lcom/android/internal/util/JournaledFile;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/io/BufferedWriter;Ljava/io/BufferedWriter;]Ljava/io/File;Ljava/io/File;]Ljava/io/FileOutputStream;Ljava/io/FileOutputStream;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/Settings;->writePackageRestrictions(IJZ)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/ResilientAtomicFile;Lcom/android/server/pm/ResilientAtomicFile;]Lcom/android/server/pm/Settings;Lcom/android/server/pm/Settings;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SuspendParams;Lcom/android/server/pm/pkg/SuspendParams;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; +HSPLcom/android/server/pm/Settings;->writeKeySetAliasesLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V+]Lcom/android/server/pm/PackageKeySetData;Lcom/android/server/pm/PackageKeySetData;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; +HSPLcom/android/server/pm/Settings;->writeLPr(Lcom/android/server/pm/Computer;Z)V+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/KeySetManagerService;Lcom/android/server/pm/KeySetManagerService;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/server/pm/permission/LegacyPermissionSettings;Lcom/android/server/pm/permission/LegacyPermissionSettings;]Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal;Lcom/android/server/pm/verify/domain/DomainVerificationService;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; +HSPLcom/android/server/pm/Settings;->writePackageLPr(Lcom/android/modules/utils/TypedXmlSerializer;Ljava/util/ArrayList;Lcom/android/server/pm/PackageSetting;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/PackageSignatures;Lcom/android/server/pm/PackageSignatures;]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HSPLcom/android/server/pm/Settings;->writePackageListLPrInternal(I)V+]Lcom/android/internal/pm/parsing/pkg/AndroidPackageInternal;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/permission/LegacyPermissionDataProvider;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/io/File;Ljava/io/File;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/Settings;->writePackageRestrictions(IJZ)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Collection;Ljava/util/Collections$UnmodifiableCollection;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1; HSPLcom/android/server/pm/Settings;->writeSigningKeySetLPr(Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/server/pm/PackageKeySetData;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/pm/PackageKeySetData;Lcom/android/server/pm/PackageKeySetData; HSPLcom/android/server/pm/Settings;->writeUserRestrictionsLPw(Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/PackageSetting;)V HSPLcom/android/server/pm/SettingsXml$ReadSectionImpl;->moveToNextInternal(Ljava/lang/String;)Z+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Ljava/util/Stack;Ljava/util/Stack; HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;I)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->attribute(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->close()V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Stack;Ljava/util/Stack; -HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->finish()V+]Lcom/android/server/pm/SettingsXml$WriteSectionImpl;Lcom/android/server/pm/SettingsXml$WriteSectionImpl; HSPLcom/android/server/pm/SettingsXml$WriteSectionImpl;->startSection(Ljava/lang/String;)Lcom/android/server/pm/SettingsXml$WriteSection;+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Ljava/util/Stack;Ljava/util/Stack; HSPLcom/android/server/pm/SharedLibrariesImpl;->collectSharedLibraryInfos(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/Map;Ljava/util/Map;)Ljava/util/ArrayList; HSPLcom/android/server/pm/SharedLibrariesImpl;->executeSharedLibrariesUpdateLPw(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/PackageSetting;Ljava/util/ArrayList;[I)V @@ -2631,28 +2679,28 @@ HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda29;->(Lco HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda29;->accept(Ljava/lang/Object;)V HPLcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda36;->apply(Ljava/lang/Object;)Ljava/lang/Object; HPLcom/android/server/pm/ShortcutPackage;->(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V -HPLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;IZ)V+]Lcom/android/server/pm/ShortcutLauncher;Lcom/android/server/pm/ShortcutLauncher;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService; -HPLcom/android/server/pm/ShortcutPackage;->forEachShortcutStopWhen(Ljava/util/function/Function;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean;]Ljava/util/function/Function;Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda28;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda36;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda3; -HPLcom/android/server/pm/ShortcutPackage;->fromAppSearch()Lcom/android/internal/infra/AndroidFuture;+]Lcom/android/internal/infra/AndroidFuture;Lcom/android/internal/infra/AndroidFuture;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser; -HPLcom/android/server/pm/ShortcutPackage;->parseShortcut(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;IZ)Landroid/content/pm/ShortcutInfo;+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser; +HPLcom/android/server/pm/ShortcutPackage;->findAll(Ljava/util/List;Ljava/util/function/Predicate;ILjava/lang/String;IZ)V+]Lcom/android/server/pm/ShortcutLauncher;Lcom/android/server/pm/ShortcutLauncher;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService; +HPLcom/android/server/pm/ShortcutPackage;->forEachShortcutStopWhen(Ljava/util/function/Function;)V+]Ljava/util/function/Function;Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda28;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda36;,Lcom/android/server/pm/ShortcutPackage$$ExternalSyntheticLambda3; +HPLcom/android/server/pm/ShortcutPackage;->parseShortcut(Lcom/android/modules/utils/TypedXmlPullParser;Ljava/lang/String;IZ)Landroid/content/pm/ShortcutInfo; HPLcom/android/server/pm/ShortcutPackage;->rescanPackageIfNeeded(ZZ)Z+]Landroid/content/pm/PackageInfo;Landroid/content/pm/PackageInfo;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/content/pm/ShortcutInfo;ZZ)V+]Landroid/app/Person;Landroid/app/Person;]Landroid/content/LocusId;Landroid/content/LocusId;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Ljava/util/Set;Landroid/util/ArraySet; -HPLcom/android/server/pm/ShortcutPackage;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;Z)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/pm/ShareTargetInfo;Lcom/android/server/pm/ShareTargetInfo;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/pm/ShortcutPackage;->saveShortcut(Lcom/android/modules/utils/TypedXmlSerializer;Landroid/content/pm/ShortcutInfo;ZZ)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage; +HPLcom/android/server/pm/ShortcutPackage;->saveShortcutsAsync(Ljava/util/Collection;)V +HPLcom/android/server/pm/ShortcutPackage;->saveToXml(Lcom/android/modules/utils/TypedXmlSerializer;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Lcom/android/server/pm/ShareTargetInfo;Lcom/android/server/pm/ShareTargetInfo;]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutPackageInfo;Lcom/android/server/pm/ShortcutPackageInfo;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/pm/ShortcutPackageInfo;->saveToXml(Lcom/android/server/pm/ShortcutService;Lcom/android/modules/utils/TypedXmlSerializer;Z)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;,Lcom/android/internal/util/XmlUtils$ForcedTypedXmlSerializer;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Base64$Encoder;Ljava/util/Base64$Encoder; -HPLcom/android/server/pm/ShortcutPackageItem;->(Lcom/android/server/pm/ShortcutUser;ILjava/lang/String;Lcom/android/server/pm/ShortcutPackageInfo;)V -HPLcom/android/server/pm/ShortcutPackageItem;->getResilientFile(Ljava/io/File;)Lcom/android/server/pm/ResilientAtomicFile;+]Ljava/io/File;Ljava/io/File; -HPLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;Ljava/util/List;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/pm/ShortcutPackageItem;->getResilientFile(Ljava/io/File;)Lcom/android/server/pm/ResilientAtomicFile; +HPLcom/android/server/pm/ShortcutParser;->parseShortcutsOneFile(Lcom/android/server/pm/ShortcutService;Landroid/content/pm/ActivityInfo;Ljava/lang/String;ILjava/util/List;Ljava/util/List;)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/res/XmlResourceParser;Landroid/content/res/XmlBlock$Parser;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/ShortcutService$4;->onUidStateChanged(IIJI)V+]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService; +HPLcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda10;->(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZ)V +HPLcom/android/server/pm/ShortcutService$LocalService$$ExternalSyntheticLambda10;->test(Ljava/lang/Object;)Z HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcuts(ILjava/lang/String;JLjava/lang/String;Ljava/util/List;Ljava/util/List;Landroid/content/ComponentName;IIII)Ljava/util/List;+]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutLauncher;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser; -HPLcom/android/server/pm/ShortcutService$LocalService;->getShortcutsInnerLocked(ILjava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;JLandroid/content/ComponentName;IILjava/util/ArrayList;III)V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutService$LocalService;Lcom/android/server/pm/ShortcutService$LocalService;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser; -HPLcom/android/server/pm/ShortcutService$LocalService;->lambda$getFilterFromQuery$1(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/pm/ShortcutInfo;Landroid/content/pm/ShortcutInfo;]Landroid/util/ArraySet;Landroid/util/ArraySet; +HPLcom/android/server/pm/ShortcutService$LocalService;->lambda$getFilterFromQuery$1(JLandroid/util/ArraySet;Landroid/util/ArraySet;Landroid/content/ComponentName;ZZZZZLandroid/content/pm/ShortcutInfo;)Z HPLcom/android/server/pm/ShortcutService;->getUserShortcutsLocked(I)Lcom/android/server/pm/ShortcutUser;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService; -HSPLcom/android/server/pm/ShortcutService;->injectPostToHandler(Ljava/lang/Runnable;)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/pm/ShortcutService;->isUserUnlockedL(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; -HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/pm/ShortcutService;->injectPostToHandler(Ljava/lang/Runnable;)V +HPLcom/android/server/pm/ShortcutService;->isUserUnlockedL(I)Z+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HPLcom/android/server/pm/ShortcutService;->queryActivities(Landroid/content/Intent;IZ)Ljava/util/List;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/pm/ShortcutService;Lcom/android/server/pm/ShortcutService;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/pm/ShortcutUser;->getAppSearch(Landroid/app/appsearch/AppSearchManager$SearchContext;)Lcom/android/internal/infra/AndroidFuture;+]Landroid/app/appsearch/AppSearchManager;Landroid/app/appsearch/AppSearchManager;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutLauncher; -HPLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage; +HPLcom/android/server/pm/ShortcutUser;->getLauncherShortcuts(Ljava/lang/String;I)Lcom/android/server/pm/ShortcutLauncher;+]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutLauncher; +HPLcom/android/server/pm/ShortcutUser;->getPackageShortcutsIfExists(Ljava/lang/String;)Lcom/android/server/pm/ShortcutPackage;+]Lcom/android/server/pm/ShortcutPackageItem;Lcom/android/server/pm/ShortcutPackage; HPLcom/android/server/pm/ShortcutUser;->rescanPackageIfNeeded(Ljava/lang/String;Z)V+]Lcom/android/server/pm/ShortcutPackage;Lcom/android/server/pm/ShortcutPackage;]Lcom/android/server/pm/ShortcutUser;Lcom/android/server/pm/ShortcutUser; HSPLcom/android/server/pm/SnapshotStatistics$BinMap;->getBin(I)I HSPLcom/android/server/pm/SnapshotStatistics$Stats;->(Lcom/android/server/pm/SnapshotStatistics;J)V+]Lcom/android/server/pm/SnapshotStatistics$BinMap;Lcom/android/server/pm/SnapshotStatistics$BinMap; @@ -2664,72 +2712,64 @@ HSPLcom/android/server/pm/UserManagerService$LocalService;->exists(I)Z HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserInfos()[Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/UserManagerService$LocalService;->getUserProperties(I)Landroid/content/pm/UserProperties; -HSPLcom/android/server/pm/UserManagerService$LocalService;->hasUserRestriction(Ljava/lang/String;I)Z+]Landroid/os/Bundle;Landroid/os/Bundle; -HPLcom/android/server/pm/UserManagerService$LocalService;->isProfileAccessible(IILjava/lang/String;Z)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/UserManagerService$LocalService;->hasUserRestriction(Ljava/lang/String;I)Z HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserRunning(I)Z+]Lcom/android/server/pm/UserManagerService$WatchedUserStates;Lcom/android/server/pm/UserManagerService$WatchedUserStates; HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserUnlockingOrUnlocked(I)Z+]Lcom/android/server/pm/UserManagerService$WatchedUserStates;Lcom/android/server/pm/UserManagerService$WatchedUserStates; -HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserVisible(I)Z+]Lcom/android/server/pm/UserVisibilityMediator;Lcom/android/server/pm/UserVisibilityMediator; +HSPLcom/android/server/pm/UserManagerService$LocalService;->isUserVisible(I)Z HSPLcom/android/server/pm/UserManagerService$WatchedUserStates;->get(II)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/pm/UserManagerService;->-$$Nest$mgetUserInfoNoChecks(Lcom/android/server/pm/UserManagerService;I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/pm/UserManagerService;->checkCreateUsersPermission(Ljava/lang/String;)V -HSPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->checkQueryOrCreateUsersPermission(Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/UserManagerService;->checkQueryOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/UserManagerService;->checkManageOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V +HSPLcom/android/server/pm/UserManagerService;->checkQueryOrCreateUsersPermission(Ljava/lang/String;)V +HSPLcom/android/server/pm/UserManagerService;->checkQueryOrInteractPermissionIfCallerInOtherProfileGroup(ILjava/lang/String;)V HSPLcom/android/server/pm/UserManagerService;->exists(I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService; -HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/pm/UserManagerService;->getApplicationRestrictionsForUser(Ljava/lang/String;I)Landroid/os/Bundle; HSPLcom/android/server/pm/UserManagerService;->getEffectiveUserRestrictions(I)Landroid/os/Bundle;+]Lcom/android/server/pm/RestrictionsSet;Lcom/android/server/pm/RestrictionsSet; HSPLcom/android/server/pm/UserManagerService;->getInternalForInjectorOnly()Lcom/android/server/pm/UserManagerInternal; -HSPLcom/android/server/pm/UserManagerService;->getProfileIds(ILjava/lang/String;ZZ)[I+]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/UserManagerService;->getProfileIds(ILjava/lang/String;ZZ)[I+]Landroid/util/IntArray;Landroid/util/IntArray; HSPLcom/android/server/pm/UserManagerService;->getProfileIds(IZ)[I+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getProfileIdsLU(ILjava/lang/String;ZZ)Landroid/util/IntArray;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getProfileParentLU(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getProfileType(I)Ljava/lang/String;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getProfiles(IZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/UserManagerService;->getProfilesLU(ILjava/lang/String;ZZ)Ljava/util/List;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/pm/UserManagerService;->getProfileIdsLU(ILjava/lang/String;ZZ)Landroid/util/IntArray;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; +HSPLcom/android/server/pm/UserManagerService;->getProfileParent(I)Landroid/content/pm/UserInfo; +HSPLcom/android/server/pm/UserManagerService;->getProfileParentLU(I)Landroid/content/pm/UserInfo; +HSPLcom/android/server/pm/UserManagerService;->getProfileType(I)Ljava/lang/String;+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo; +HSPLcom/android/server/pm/UserManagerService;->getProfiles(IZ)Ljava/util/List; +HSPLcom/android/server/pm/UserManagerService;->getProfilesLU(ILjava/lang/String;ZZ)Ljava/util/List;+]Landroid/util/IntArray;Landroid/util/IntArray;]Landroid/util/SparseArray;Landroid/util/SparseArray; HPLcom/android/server/pm/UserManagerService;->getUidForPackage(Ljava/lang/String;)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HSPLcom/android/server/pm/UserManagerService;->getUserDataLU(I)Lcom/android/server/pm/UserManagerService$UserData;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/pm/UserManagerService;->getUserHandle(I)I -HSPLcom/android/server/pm/UserManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/UserManagerService;->getUserInfo(I)Landroid/content/pm/UserInfo; +HSPLcom/android/server/pm/UserManagerService;->getUserInfoLU(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/pm/UserManagerService;->getUserInfoNoChecks(I)Landroid/content/pm/UserInfo;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesCopy(I)Landroid/content/pm/UserProperties;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesInternal(I)Landroid/content/pm/UserProperties;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getUserSerialNumber(I)I -HPLcom/android/server/pm/UserManagerService;->getUserStartRealtime()J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HPLcom/android/server/pm/UserManagerService;->getUserUnlockRealtime()J+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getUsers(ZZZ)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->getUsersInternal(ZZZ)Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesCopy(I)Landroid/content/pm/UserProperties; +HSPLcom/android/server/pm/UserManagerService;->getUserPropertiesInternal(I)Landroid/content/pm/UserProperties; +HPLcom/android/server/pm/UserManagerService;->getUserStartRealtime()J +HPLcom/android/server/pm/UserManagerService;->getUserUnlockRealtime()J +HSPLcom/android/server/pm/UserManagerService;->getUsers(ZZZ)Ljava/util/List; +HSPLcom/android/server/pm/UserManagerService;->getUsersInternal(ZZZ)Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HSPLcom/android/server/pm/UserManagerService;->hasCreateUsersPermission()Z HSPLcom/android/server/pm/UserManagerService;->hasManageUsersOrPermission(Ljava/lang/String;)Z HSPLcom/android/server/pm/UserManagerService;->hasManageUsersPermission(I)Z -HSPLcom/android/server/pm/UserManagerService;->hasProfile(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/pm/UserManagerService;->hasQueryOrCreateUsersPermission()Z HSPLcom/android/server/pm/UserManagerService;->hasUserRestriction(Ljava/lang/String;I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; HSPLcom/android/server/pm/UserManagerService;->isProfileOf(Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;)Z -HSPLcom/android/server/pm/UserManagerService;->isSameProfileGroupNoChecks(II)Z+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserManagerService;->isUserRunning(I)Z+]Lcom/android/server/pm/UserManagerService$LocalService;Lcom/android/server/pm/UserManagerService$LocalService; -HPLcom/android/server/pm/UserManagerService;->packageToRestrictionsFileName(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/pm/UserManagerService;->packageToRestrictionsFileName(Ljava/lang/String;)Ljava/lang/String; HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Landroid/util/AtomicFile;)Landroid/os/Bundle;+]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Ljava/io/File;Ljava/io/File; HPLcom/android/server/pm/UserManagerService;->readApplicationRestrictionsLAr(Ljava/lang/String;I)Landroid/os/Bundle; -HPLcom/android/server/pm/UserManagerService;->readEntry(Landroid/os/Bundle;Ljava/util/ArrayList;Lcom/android/modules/utils/TypedXmlPullParser;)V+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/pm/UserManagerService;->readEntry(Landroid/os/Bundle;Ljava/util/ArrayList;Lcom/android/modules/utils/TypedXmlPullParser;)V+]Lcom/android/modules/utils/TypedXmlPullParser;Lcom/android/internal/util/ArtBinaryXmlPullParser;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/pm/UserManagerService;->setUserRestrictionInner(ILjava/lang/String;Z)V+]Lcom/android/server/pm/RestrictionsSet;Lcom/android/server/pm/RestrictionsSet; -HSPLcom/android/server/pm/UserManagerService;->userExists(I)Z -HSPLcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; +HSPLcom/android/server/pm/UserManagerService;->userWithName(Landroid/content/pm/UserInfo;)Landroid/content/pm/UserInfo; HSPLcom/android/server/pm/UserNeedsBadgingCache;->get(I)Z+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/UserRestrictionsUtils;->areEqual(Landroid/os/Bundle;Landroid/os/Bundle;)Z+]Landroid/os/Bundle;Landroid/os/Bundle;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; +HSPLcom/android/server/pm/UserRestrictionsUtils;->areEqual(Landroid/os/Bundle;Landroid/os/Bundle;)Z+]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/Set;Landroid/util/MapCollections$KeySet; HSPLcom/android/server/pm/UserRestrictionsUtils;->isSettingRestrictedForUser(Landroid/content/Context;Ljava/lang/String;ILjava/lang/String;I)Z+]Landroid/os/UserManager;Landroid/os/UserManager; -HSPLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/pm/UserRestrictionsUtils;->isValidRestriction(Ljava/lang/String;)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Ljava/util/Set;Landroid/util/ArraySet; HSPLcom/android/server/pm/UserVisibilityMediator;->isCurrentUserOrRunningProfileOfCurrentUser(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/pm/UserVisibilityMediator;->isUserVisible(I)Z+]Lcom/android/server/pm/UserVisibilityMediator;Lcom/android/server/pm/UserVisibilityMediator; +HSPLcom/android/server/pm/UserVisibilityMediator;->isUserVisible(I)Z +HSPLcom/android/server/pm/WatchedIntentFilter;->getIntentFilter()Landroid/content/IntentFilter; HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;->(Lcom/android/server/pm/snapshot/PackageDataSnapshot;)V HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;->checkClosed()V HSPLcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;->close()V -HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->(ILandroid/os/UserHandle;Lcom/android/server/pm/snapshot/PackageDataSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;)V+]Landroid/os/UserHandle;Landroid/os/UserHandle; HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->checkClosed()V+]Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl; HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->close()V HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->getPackageState(Ljava/lang/String;)Lcom/android/server/pm/pkg/PackageState;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl; -HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->getPackageStates()Ljava/util/Map;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl; +HSPLcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;->getPackageStates()Ljava/util/Map;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl; HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;->close()V HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;->filtered(ILandroid/os/UserHandle;)Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot; HSPLcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl;->getPackageStates()Ljava/util/Map;+]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl;Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl; @@ -2746,73 +2786,75 @@ HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoFlags(Lcom/android/s HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoPrivateFlags(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;)I HSPLcom/android/server/pm/parsing/PackageInfoUtils;->appInfoPrivateFlagsExt(ILcom/android/server/pm/pkg/PackageStateInternal;)I+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignFieldsComponentInfoParsedMainComponent(Landroid/content/pm/ComponentInfo;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;)V+]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignFieldsComponentInfoParsedMainComponent(Landroid/content/pm/ComponentInfo;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/server/pm/pkg/PackageStateInternal;I)V+]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignFieldsComponentInfoParsedMainComponent(Landroid/content/pm/ComponentInfo;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/server/pm/pkg/PackageStateInternal;I)V HSPLcom/android/server/pm/parsing/PackageInfoUtils;->assignFieldsPackageItemInfoParsedComponent(Landroid/content/pm/PackageItemInfo;Lcom/android/internal/pm/pkg/component/ParsedComponent;)V+]Lcom/android/internal/pm/pkg/component/ParsedComponent;megamorphic_types HSPLcom/android/server/pm/parsing/PackageInfoUtils;->checkUseInstalledOrHidden(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/pkg/PackageUserStateInternal;J)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateActivityInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedActivity;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ActivityInfo;+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Lcom/android/server/pm/pkg/AndroidPackage;JLcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Lcom/android/server/pm/pkg/SharedLibraryWrapper;Lcom/android/server/pm/pkg/SharedLibraryWrapper;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionInfo(Lcom/android/internal/pm/pkg/component/ParsedPermission;J)Landroid/content/pm/PermissionInfo;+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateProviderInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedProvider;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ProviderInfo;+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedService;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ServiceInfo;+]Landroid/os/Bundle;Landroid/os/Bundle;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateWithComponents(Lcom/android/server/pm/pkg/AndroidPackage;[IJJJLjava/util/Set;Ljava/util/Set;Lcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/PackageInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Set;Landroid/util/ArraySet;,Lcom/android/server/permission/jarjar/kotlin/collections/EmptySet;,Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDataDir(Lcom/android/server/pm/pkg/PackageStateInternal;I)Ljava/io/File;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDeprecatedSignatures(Landroid/content/pm/SigningDetails;J)[Landroid/content/pm/Signature;+]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails; -HSPLcom/android/server/pm/parsing/PackageInfoUtils;->initForUser(Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/pkg/AndroidPackage;ILcom/android/server/pm/pkg/PackageUserStateInternal;)V+]Lcom/android/internal/pm/parsing/pkg/PackageImpl;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateActivityInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedActivity;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ActivityInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateApplicationInfo(Lcom/android/server/pm/pkg/AndroidPackage;JLcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized;]Lcom/android/server/pm/pkg/SharedLibraryWrapper;Lcom/android/server/pm/pkg/SharedLibraryWrapper;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generatePermissionInfo(Lcom/android/internal/pm/pkg/component/ParsedPermission;J)Landroid/content/pm/PermissionInfo;+]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateProviderInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedProvider;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ProviderInfo;+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateServiceInfo(Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/pkg/component/ParsedService;JLcom/android/server/pm/pkg/PackageUserStateInternal;Landroid/content/pm/ApplicationInfo;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/ServiceInfo;+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->generateWithComponents(Lcom/android/server/pm/pkg/AndroidPackage;[IJJJLjava/util/Set;Ljava/util/Set;Lcom/android/server/pm/pkg/PackageUserStateInternal;ILcom/android/server/pm/pkg/PackageStateInternal;)Landroid/content/pm/PackageInfo;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedAttribution;Lcom/android/internal/pm/pkg/component/ParsedAttributionImpl;]Lcom/android/internal/pm/pkg/component/ParsedPermission;Lcom/android/internal/pm/pkg/component/ParsedPermissionImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/internal/pm/pkg/component/ParsedUsesPermission;Lcom/android/internal/pm/pkg/component/ParsedUsesPermissionImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/Set;Landroid/util/ArraySet;,Lcom/android/server/permission/jarjar/kotlin/collections/EmptySet;,Ljava/util/Collections$UnmodifiableSet; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDataDir(Lcom/android/server/pm/pkg/PackageStateInternal;I)Ljava/io/File;+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->getDeprecatedSignatures(Landroid/content/pm/SigningDetails;J)[Landroid/content/pm/Signature; +HSPLcom/android/server/pm/parsing/PackageInfoUtils;->initForUser(Landroid/content/pm/ApplicationInfo;Lcom/android/server/pm/pkg/AndroidPackage;ILcom/android/server/pm/pkg/PackageUserStateInternal;)V+]Lcom/android/internal/pm/parsing/pkg/PackageImpl;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/parsing/PackageInfoUtils;->updateApplicationInfo(Landroid/content/pm/ApplicationInfo;JLcom/android/server/pm/pkg/PackageUserState;)V+]Landroid/content/pm/overlay/OverlayPaths;Landroid/content/pm/overlay/OverlayPaths;]Lcom/android/server/pm/pkg/ArchiveState$ArchiveActivityInfo;Lcom/android/server/pm/pkg/ArchiveState$ArchiveActivityInfo;]Lcom/android/server/pm/pkg/ArchiveState;Lcom/android/server/pm/pkg/ArchiveState;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/parsing/ParsedComponentStateUtils;->getNonLocalizedLabelAndIcon(Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/server/pm/pkg/PackageStateInternal;I)Landroid/util/Pair;+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedInstrumentationImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/pm/parsing/ParsedComponentStateUtils;->getNonLocalizedLabelAndIcon(Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/server/pm/pkg/PackageStateInternal;I)Landroid/util/Pair;+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedInstrumentationImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserStateInternal;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater;->updatePackage(Lcom/android/internal/pm/parsing/pkg/ParsedPackage;ZZ)V HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->fillVersionCodes(Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PackageInfo;)V+]Lcom/android/internal/pm/pkg/parsing/ParsingPackageHidden;Lcom/android/internal/pm/parsing/pkg/PackageImpl; +HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->getRawSecondaryCpuAbi(Lcom/android/server/pm/pkg/AndroidPackage;)Ljava/lang/String; HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->hasComponentClassName(Lcom/android/server/pm/pkg/AndroidPackage;Ljava/lang/String;)Z+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/parsing/pkg/AndroidPackageUtils;->isMatchForSystemOnly(Lcom/android/server/pm/pkg/PackageState;J)Z+]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Landroid/content/pm/PackageInfo;Ljava/util/Set;ZZZI)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/permission/PermissionManager$SplitPermissionInfo;Landroid/permission/PermissionManager$SplitPermissionInfo;]Landroid/permission/PermissionManager;Landroid/permission/PermissionManager;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;,Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet; +HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;->getPermissionInfo(Ljava/lang/String;)Landroid/content/pm/PermissionInfo;+]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1; +HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;->getPermissionState(Ljava/lang/String;Landroid/content/pm/PackageInfo;Landroid/os/UserHandle;)Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache$PermissionState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/pm/permission/DefaultPermissionGrantPolicy;->grantRuntimePermissions(Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Landroid/content/pm/PackageInfo;Ljava/util/Set;ZZZI)V+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper;Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1;,Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Set;Landroid/util/ArraySet; HSPLcom/android/server/pm/permission/LegacyPermission;->write(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer; -HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->checkDeviceIdentifierAccess(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;II)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector; HSPLcom/android/server/pm/permission/LegacyPermissionManagerService;->verifyCallerCanCheckAccess(Ljava/lang/String;Ljava/lang/String;II)V+]Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector;Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector; -HSPLcom/android/server/pm/permission/LegacyPermissionState$PermissionState;->(Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;)V -HSPLcom/android/server/pm/permission/LegacyPermissionState$PermissionState;->(Ljava/lang/String;ZZI)V -HSPLcom/android/server/pm/permission/LegacyPermissionState$UserState;->(Lcom/android/server/pm/permission/LegacyPermissionState$UserState;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/pm/permission/LegacyPermissionSettings;->writePermissions(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; HSPLcom/android/server/pm/permission/LegacyPermissionState;->()V HSPLcom/android/server/pm/permission/LegacyPermissionState;->copyFrom(Lcom/android/server/pm/permission/LegacyPermissionState;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; -HSPLcom/android/server/pm/permission/LegacyPermissionState;->putPermissionState(Lcom/android/server/pm/permission/LegacyPermissionState$PermissionState;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/permission/LegacyPermissionState$UserState;Lcom/android/server/pm/permission/LegacyPermissionState$UserState; -HSPLcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;->isRegisteredAttributionSource(Landroid/content/AttributionSource;)Z+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkAppOpPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZ)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;)Z+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;->isRegisteredAttributionSource(Landroid/content/AttributionSource;)Z+]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap; +HPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkAppOpPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZ)I +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal$HotwordDetectionServiceProvider;Lcom/android/server/voiceinteraction/HotwordDetectionConnection$2$$ExternalSyntheticLambda0;]Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;]Ljava/util/Set;Landroid/util/ArraySet;,Ljava/util/Collections$EmptySet; +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkPermission(Ljava/lang/String;Landroid/content/AttributionSourceState;Ljava/lang/String;ZZZI)I -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkRuntimePermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->getAttributionChainId(ZLandroid/content/AttributionSource;)I+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->performOpTransaction(Landroid/content/Context;Landroid/os/IBinder;ILandroid/content/AttributionSource;Ljava/lang/String;ZZZZZIIII)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolveAttributionSource(Landroid/content/Context;Landroid/content/AttributionSource;)Landroid/content/AttributionSource;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolvePackageName(Landroid/content/Context;Landroid/content/AttributionSource;)Ljava/lang/String;+]Landroid/content/AttributionSource;Landroid/content/AttributionSource;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->checkRuntimePermission(Landroid/content/Context;Lcom/android/server/pm/permission/PermissionManagerServiceInternal;Ljava/lang/String;Landroid/content/AttributionSource;Ljava/lang/String;ZZZI)I+]Ljava/util/concurrent/ConcurrentHashMap;Ljava/util/concurrent/ConcurrentHashMap; +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->getAttributionChainId(ZLandroid/content/AttributionSource;)I +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->performOpTransaction(Landroid/content/Context;Landroid/os/IBinder;ILandroid/content/AttributionSource;Ljava/lang/String;ZZZZZIIII)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager; +HPLcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService;->resolvePackageName(Landroid/content/Context;Landroid/content/AttributionSource;)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager; HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService; HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->checkUidPermission(ILjava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService; HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGidsForUid(I)[I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getGrantedPermissions(Ljava/lang/String;I)Ljava/util/Set;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->getInstalledPermissions(Ljava/lang/String;)Ljava/util/Set;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; -HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl; +HSPLcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl;->isPermissionsReviewRequired(Ljava/lang/String;I)Z+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; HSPLcom/android/server/pm/permission/PermissionManagerService;->-$$Nest$fgetmPermissionManagerServiceImpl(Lcom/android/server/pm/permission/PermissionManagerService;)Lcom/android/server/pm/permission/PermissionManagerServiceInterface; -HSPLcom/android/server/pm/permission/PermissionManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl; -HSPLcom/android/server/pm/permission/PermissionManagerService;->checkUidPermission(ILjava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerService;Lcom/android/server/pm/permission/PermissionManagerService;]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl; -HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl; -HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService;,Lcom/android/server/pm/permission/PermissionManagerServiceImpl; +HSPLcom/android/server/pm/permission/PermissionManagerService;->checkPermission(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; +HSPLcom/android/server/pm/permission/PermissionManagerService;->checkUidPermission(ILjava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; +HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionFlags(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)I+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; +HSPLcom/android/server/pm/permission/PermissionManagerService;->getPermissionInfo(Ljava/lang/String;Ljava/lang/String;I)Landroid/content/pm/PermissionInfo;+]Lcom/android/server/pm/permission/PermissionManagerServiceInterface;Lcom/android/server/permission/access/permission/PermissionService; HSPLcom/android/server/pm/permission/PermissionManagerService;->getPersistentDeviceId(I)Ljava/lang/String;+]Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal;Lcom/android/server/companion/virtual/VirtualDeviceManagerService$LocalService; -HSPLcom/android/server/pm/permission/PermissionManagerService;->isRegisteredAttributionSource(Landroid/content/AttributionSourceState;)Z+]Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry;Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry; +HSPLcom/android/server/pm/permission/PermissionManagerService;->isRegisteredAttributionSource(Landroid/content/AttributionSourceState;)Z HSPLcom/android/server/pm/pkg/PackageStateInternal;->getUserStateOrDefault(I)Lcom/android/server/pm/pkg/PackageUserState;+]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/pkg/PackageStateInternal;->getUserStateOrDefault(I)Lcom/android/server/pm/pkg/PackageUserStateInternal;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->(Lcom/android/server/pm/PackageSetting;)V -HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getLastPackageUsageTimeInMills()[J+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getApexModuleName()Ljava/lang/String; +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getLastPackageUsageTimeInMills()[J +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getOverrideSeInfo()Ljava/lang/String; +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getSeInfo()Ljava/lang/String; +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getUsesLibraryFiles()Ljava/util/List; +HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->getUsesLibraryInfos()Ljava/util/List; HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->isHiddenUntilInstalled()Z HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->isUpdatedSystemApp()Z HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->setLastPackageUsageTimeInMills(IJ)Lcom/android/server/pm/pkg/PackageStateUnserialized;+]Lcom/android/server/pm/pkg/PackageStateUnserialized;Lcom/android/server/pm/pkg/PackageStateUnserialized; HSPLcom/android/server/pm/pkg/PackageStateUnserialized;->updateFrom(Lcom/android/server/pm/pkg/PackageStateUnserialized;)V+]Lcom/android/server/pm/SettingBase;Lcom/android/server/pm/PackageSetting;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; HSPLcom/android/server/pm/pkg/PackageStateUtils;->isEnabledAndMatches(Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/internal/pm/pkg/component/ParsedMainComponent;JI)Z+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/pkg/PackageUserStateImpl$1;->createSnapshot()Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->(Lcom/android/server/utils/Watchable;)V HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->(Lcom/android/server/utils/Watchable;Lcom/android/server/pm/pkg/PackageUserStateImpl;)V+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; -HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getAllOverlayPaths()Landroid/content/pm/overlay/OverlayPaths;+]Landroid/content/pm/overlay/OverlayPaths$Builder;Landroid/content/pm/overlay/OverlayPaths$Builder; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getAllOverlayPaths()Landroid/content/pm/overlay/OverlayPaths; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getArchiveState()Lcom/android/server/pm/pkg/ArchiveState; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getBoolean(I)Z -HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getDisabledComponents()Landroid/util/ArraySet;+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getDisabledComponentsNoCopy()Lcom/android/server/utils/WatchedArraySet; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getEnabledComponents()Landroid/util/ArraySet;+]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getEnabledComponentsNoCopy()Lcom/android/server/utils/WatchedArraySet; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getEnabledState()I HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getFirstInstallTimeMillis()J HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->getOverrideLabelIconForComponent(Landroid/content/ComponentName;)Landroid/util/Pair;+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; @@ -2821,94 +2863,93 @@ HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isComponentEnabled(Ljava/la HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isHidden()Z HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isInstalled()Z HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isInstantApp()Z -HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isQuarantined()Z+]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/pm/pkg/SuspendParams;Lcom/android/server/pm/pkg/SuspendParams;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isNotLaunched()Z +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isQuarantined()Z+]Lcom/android/server/pm/pkg/PackageUserStateImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isStopped()Z HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isSuspended()Z HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->isVirtualPreload()Z HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->onChanged()V+]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setBoolean(IZ)V HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setDisabledComponents(Landroid/util/ArraySet;)Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->setEnabledComponents(Landroid/util/ArraySet;)Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/pkg/PackageUserStateImpl;->snapshot()Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isAvailable(Lcom/android/server/pm/pkg/PackageUserState;J)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateDefault;,Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isEnabled(Lcom/android/server/pm/pkg/PackageUserState;ZZLjava/lang/String;J)Z+]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;Landroid/content/pm/ComponentInfo;J)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo; HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;ZZLcom/android/internal/pm/pkg/component/ParsedMainComponent;J)Z+]Lcom/android/internal/pm/pkg/component/ParsedMainComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl; HSPLcom/android/server/pm/pkg/PackageUserStateUtils;->isMatch(Lcom/android/server/pm/pkg/PackageUserState;ZZZZLjava/lang/String;J)Z -HSPLcom/android/server/pm/pkg/mutate/PackageStateMutator;->onPackageStateChanged()V+]Ljava/util/concurrent/atomic/AtomicLong;Ljava/util/concurrent/atomic/AtomicLong; +HSPLcom/android/server/pm/pkg/SharedLibraryWrapper;->getInfo()Landroid/content/pm/SharedLibraryInfo; HSPLcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->addActivity(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedActivity;Ljava/lang/String;Ljava/util/List;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->addActivity(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedActivity;Ljava/lang/String;Ljava/util/List;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->allowFilterResult(Landroid/util/Pair;Ljava/util/List;)Z+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->getIntentFilter(Landroid/util/Pair;)Landroid/content/IntentFilter;+]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver; -HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/util/Pair;)Z+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/util/Pair;)Z+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;,Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/UserNeedsBadgingCache;Lcom/android/server/pm/UserNeedsBadgingCache;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->queryIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList; +HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;->sortResults(Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->addFilter(Lcom/android/server/pm/snapshot/PackageDataSnapshot;Landroid/util/Pair;)V+]Lcom/android/server/IntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->isFilterStopped(Lcom/android/server/pm/Computer;Landroid/util/Pair;I)Z+]Lcom/android/internal/pm/pkg/component/ParsedComponent;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;,Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageState;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; HSPLcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;->isFilterStopped(Lcom/android/server/pm/Computer;Ljava/lang/Object;I)Z+]Lcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver;,Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->addService(Lcom/android/server/pm/Computer;Lcom/android/internal/pm/pkg/component/ParsedService;)V+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Landroid/util/Pair;Ljava/util/List;)Z+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->allowFilterResult(Ljava/lang/Object;Ljava/util/List;)Z HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->getIntentFilter(Landroid/util/Pair;)Landroid/content/IntentFilter;+]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter;+]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/util/Pair;)Z+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z+]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;+]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object;+]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->getIntentFilter(Ljava/lang/Object;)Landroid/content/IntentFilter; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Landroid/util/Pair;)Z+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->isPackageForFilter(Ljava/lang/String;Ljava/lang/Object;)Z +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->newResult(Lcom/android/server/pm/Computer;Landroid/util/Pair;IIJ)Landroid/content/pm/ResolveInfo;+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Lcom/android/server/pm/pkg/PackageUserState;Lcom/android/server/pm/pkg/PackageUserStateImpl; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->newResult(Lcom/android/server/pm/Computer;Ljava/lang/Object;IIJ)Ljava/lang/Object; HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->queryIntent(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService; -HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList; +HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->queryIntentForPackage(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/internal/pm/pkg/component/ParsedService;Lcom/android/internal/pm/pkg/component/ParsedServiceImpl;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver;->sortResults(Ljava/util/List;)V+]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/pm/resolution/ComponentResolver;->addActivitiesLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Ljava/util/List;Z)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver;->addAllComponents(Lcom/android/server/pm/pkg/AndroidPackage;ZLjava/lang/String;Lcom/android/server/pm/Computer;)V+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerLocked;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/resolution/ComponentResolver;->addProvidersLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver;->addReceiversLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver;->addServicesLocked(Lcom/android/server/pm/Computer;Lcom/android/server/pm/pkg/AndroidPackage;Z)V+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; +HSPLcom/android/server/pm/resolution/ComponentResolver;->findMatchingActivity(Ljava/util/List;Lcom/android/internal/pm/pkg/component/ParsedActivity;)Lcom/android/internal/pm/pkg/component/ParsedActivity;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/pm/resolution/ComponentResolver;->lambda$static$0(Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;)I HSPLcom/android/server/pm/resolution/ComponentResolver;->snapshot()Lcom/android/server/pm/resolution/ComponentResolverApi; -HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getActivity(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getReceiver(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getService(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedService;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getActivity(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity; +HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getReceiver(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedActivity; +HSPLcom/android/server/pm/resolution/ComponentResolverBase;->getService(Landroid/content/ComponentName;)Lcom/android/internal/pm/pkg/component/ParsedService; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryActivities(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List;+]Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver;Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver; -HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProvider(Lcom/android/server/pm/Computer;Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; -HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProviders(Lcom/android/server/pm/Computer;Ljava/lang/String;Ljava/lang/String;IJI)Ljava/util/List;+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;Lcom/android/server/pm/parsing/PackageInfoUtils$CachedApplicationInfoGenerator;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting;]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProvider(Lcom/android/server/pm/Computer;Ljava/lang/String;JI)Landroid/content/pm/ProviderInfo;+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; +HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryProviders(Lcom/android/server/pm/Computer;Ljava/lang/String;Ljava/lang/String;IJI)Ljava/util/List;+]Lcom/android/internal/pm/pkg/component/ParsedProvider;Lcom/android/internal/pm/pkg/component/ParsedProviderImpl;]Lcom/android/server/pm/Computer;Lcom/android/server/pm/ComputerEngine;]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/pkg/PackageStateInternal;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryReceivers(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryReceivers(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryServices(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JI)Ljava/util/List; HSPLcom/android/server/pm/resolution/ComponentResolverBase;->queryServices(Lcom/android/server/pm/Computer;Landroid/content/Intent;Ljava/lang/String;JLjava/util/List;I)Ljava/util/List; -HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectDomainsInternal(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;+]Landroid/content/IntentFilter$AuthorityEntry;Landroid/content/IntentFilter$AuthorityEntry;]Landroid/content/IntentFilter;Landroid/content/IntentFilter;]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Lcom/android/server/pm/verify/domain/DomainVerificationCollector;Lcom/android/server/pm/verify/domain/DomainVerificationCollector;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/function/BiFunction;Lcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0; -HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->isValidHost(Ljava/lang/String;)Z +HSPLcom/android/server/pm/verify/domain/DomainVerificationCollector;->collectDomainsInternal(Lcom/android/server/pm/pkg/AndroidPackage;ZZLjava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object;+]Lcom/android/internal/pm/pkg/component/ParsedActivity;Lcom/android/internal/pm/pkg/component/ParsedActivityImpl;]Lcom/android/internal/pm/pkg/component/ParsedIntentInfo;Lcom/android/internal/pm/pkg/component/ParsedIntentInfoImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/function/BiFunction;Lcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0; HSPLcom/android/server/pm/verify/domain/DomainVerificationEnforcer;->callerIsLegacyUserSelector(IILjava/lang/String;I)Z -HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->writeSettings(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/pm/SettingsXml$Serializer;Lcom/android/server/pm/SettingsXml$Serializer;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState; +HSPLcom/android/server/pm/verify/domain/DomainVerificationLegacySettings;->writeSettings(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState;Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState; HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->createPkgStateFromXml(Lcom/android/server/pm/SettingsXml$ReadSection;)Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState; -HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writePkgStateToXml(Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;ILjava/util/function/Function;)V+]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;]Ljava/lang/Object;Ljava/util/UUID;]Ljava/util/function/Function;Lcom/android/server/pm/verify/domain/DomainVerificationService$$ExternalSyntheticLambda0;,Lcom/android/server/pm/verify/domain/DomainVerificationService$$ExternalSyntheticLambda1; -HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writeStateMap(Lcom/android/server/pm/SettingsXml$WriteSection;Landroid/util/ArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writePkgStateToXml(Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;ILjava/util/function/Function;)V+]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl;]Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;]Ljava/util/function/Function;Lcom/android/server/pm/verify/domain/DomainVerificationService$$ExternalSyntheticLambda1; +HSPLcom/android/server/pm/verify/domain/DomainVerificationPersistence;->writeStateMap(Lcom/android/server/pm/SettingsXml$WriteSection;Landroid/util/ArrayMap;)V+]Lcom/android/server/pm/SettingsXml$WriteSection;Lcom/android/server/pm/SettingsXml$WriteSectionImpl; HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->addPackage(Lcom/android/server/pm/pkg/PackageStateInternal;Landroid/content/pm/verify/domain/DomainSet;)V HSPLcom/android/server/pm/verify/domain/DomainVerificationService;->setLegacyUserState(Ljava/lang/String;II)Z HSPLcom/android/server/pm/verify/domain/DomainVerificationUtils;->buildMockAppInfo(Lcom/android/server/pm/pkg/AndroidPackage;)Landroid/content/pm/ApplicationInfo;+]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->(Ljava/lang/String;Ljava/util/UUID;ZLandroid/util/ArrayMap;Landroid/util/SparseArray;Ljava/lang/String;Landroid/util/ArrayMap;)V -HSPLcom/android/server/policy/AppOpsPolicy;->checkOperation(IILjava/lang/String;Ljava/lang/String;IZLcom/android/internal/util/function/HexFunction;)I+]Lcom/android/internal/util/function/HexFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy;]Ljava/lang/Integer;Ljava/lang/Integer; -HSPLcom/android/server/policy/AppOpsPolicy;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ILcom/android/internal/util/function/HexConsumer;)V+]Lcom/android/internal/util/function/HexConsumer;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy; -HSPLcom/android/server/policy/AppOpsPolicy;->noteOperation(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;ZLcom/android/internal/util/function/OctFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/OctFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy; -HSPLcom/android/server/policy/AppOpsPolicy;->resolveDatasourceOp(IILjava/lang/String;Ljava/lang/String;)I+]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy; -HSPLcom/android/server/policy/AppOpsPolicy;->resolveRecordAudioOp(II)I+]Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;]Landroid/service/voice/VoiceInteractionManagerInternal;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService; +HSPLcom/android/server/pm/verify/domain/models/DomainVerificationPkgState;->getPackageName()Ljava/lang/String; +HSPLcom/android/server/policy/AppOpsPolicy;->checkOperation(IILjava/lang/String;Ljava/lang/String;IZLcom/android/internal/util/function/HexFunction;)I+]Lcom/android/internal/util/function/HexFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9; +HSPLcom/android/server/policy/AppOpsPolicy;->finishOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;ILcom/android/internal/util/function/HexConsumer;)V+]Lcom/android/internal/util/function/HexConsumer;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11; +HSPLcom/android/server/policy/AppOpsPolicy;->noteOperation(IILjava/lang/String;Ljava/lang/String;IZLjava/lang/String;ZLcom/android/internal/util/function/OctFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/OctFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1; +HSPLcom/android/server/policy/AppOpsPolicy;->resolveDatasourceOp(IILjava/lang/String;Ljava/lang/String;)I HSPLcom/android/server/policy/AppOpsPolicy;->resolveSandboxedServiceOp(II)I HSPLcom/android/server/policy/AppOpsPolicy;->resolveUid(II)I+]Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;Landroid/service/voice/VoiceInteractionManagerInternal$HotwordDetectionServiceIdentity;]Landroid/service/voice/VoiceInteractionManagerInternal;Lcom/android/server/voiceinteraction/VoiceInteractionManagerService$LocalService; -HSPLcom/android/server/policy/AppOpsPolicy;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZIILcom/android/internal/util/function/DodecFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/DodecFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7;]Lcom/android/server/policy/AppOpsPolicy;Lcom/android/server/policy/AppOpsPolicy; -HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPackage(Ljava/lang/String;)V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser; -HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPermissionAppOp(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PermissionInfo;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/policy/AppOpsPolicy;->startOperation(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;IZZLjava/lang/String;ZIILcom/android/internal/util/function/DodecFunction;)Landroid/app/SyncNotedAppOp;+]Lcom/android/internal/util/function/DodecFunction;Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7; +HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->addPermissionAppOp(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PermissionInfo;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->shouldGrantAppOp(Landroid/content/pm/PackageInfo;Lcom/android/server/pm/pkg/AndroidPackage;Landroid/content/pm/PermissionInfo;)Z+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/pm/PermissionInfo;Landroid/content/pm/PermissionInfo;]Lcom/android/server/policy/SoftRestrictedPermissionPolicy;Lcom/android/server/policy/SoftRestrictedPermissionPolicy$2;,Lcom/android/server/policy/SoftRestrictedPermissionPolicy$3; -HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->syncPackages()V+]Landroid/util/LongSparseLongArray;Landroid/util/LongSparseLongArray;]Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;Lcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardOccluded()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate; +HSPLcom/android/server/policy/PermissionPolicyService$PermissionToOpSynchroniser;->syncPackages()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate; HSPLcom/android/server/policy/PhoneWindowManager;->isKeyguardShowingAndNotOccluded()Z+]Lcom/android/server/policy/PhoneWindowManager;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate; HSPLcom/android/server/policy/PhoneWindowManager;->setAllowLockscreenWhenOn(IZ)V+]Ljava/util/HashSet;Ljava/util/HashSet; -HSPLcom/android/server/policy/PhoneWindowManager;->updateLockScreenTimeout()V+]Landroid/os/Handler;Lcom/android/server/policy/PhoneWindowManager$PolicyHandler;]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/HashSet;Ljava/util/HashSet; +HSPLcom/android/server/policy/PhoneWindowManager;->updateLockScreenTimeout()V+]Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;Lcom/android/server/policy/keyguard/KeyguardServiceDelegate;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/HashSet;Ljava/util/HashSet; HSPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerFromTypeLw(I)I+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; HSPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerFromTypeLw(IZ)I+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; HSPLcom/android/server/policy/WindowManagerPolicy;->getWindowLayerLw(Lcom/android/server/policy/WindowManagerPolicy$WindowState;)I+]Lcom/android/server/policy/WindowManagerPolicy$WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; @@ -2917,15 +2958,32 @@ HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isSecure(I)Z+]L HSPLcom/android/server/policy/keyguard/KeyguardServiceDelegate;->isShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardServiceWrapper;Lcom/android/server/policy/keyguard/KeyguardServiceWrapper; HPLcom/android/server/policy/keyguard/KeyguardServiceWrapper;->isShowing()Z+]Lcom/android/server/policy/keyguard/KeyguardStateMonitor;Lcom/android/server/policy/keyguard/KeyguardStateMonitor; HPLcom/android/server/policy/keyguard/KeyguardStateMonitor;->isShowing()Z -HSPLcom/android/server/policy/role/RoleServicePlatformHelperImpl;->lambda$computePackageStateHash$0(Ljava/io/DataOutputStream;Landroid/content/pm/PackageManagerInternal;ILcom/android/server/pm/pkg/AndroidPackage;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Landroid/content/pm/SigningDetails;Landroid/content/pm/SigningDetails;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/io/DataOutputStream;Ljava/io/DataOutputStream;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/power/AttentionDetector;->updateUserActivity(JJ)J+]Landroid/attention/AttentionManagerInternal;Lcom/android/server/attention/AttentionManagerService$LocalService;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean; -HSPLcom/android/server/power/FaceDownDetector;->onSensorChanged(Landroid/hardware/SensorEvent;)V+]Landroid/hardware/Sensor;Landroid/hardware/Sensor;]Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;]Ljava/time/Duration;Ljava/time/Duration; -HSPLcom/android/server/power/Notifier$NotifierHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler; -HSPLcom/android/server/power/Notifier;->getBatteryStatsWakeLockMonitorType(I)I -HSPLcom/android/server/power/Notifier;->onScreenPolicyUpdate(II)V+]Landroid/os/Handler;Lcom/android/server/power/Notifier$NotifierHandler;]Landroid/os/Message;Landroid/os/Message; -HSPLcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/WakeLockLog;Lcom/android/server/power/WakeLockLog;]Lcom/android/server/power/WakefulnessSessionObserver;Lcom/android/server/power/WakefulnessSessionObserver;]Lcom/android/server/power/feature/PowerManagerFlags;Lcom/android/server/power/feature/PowerManagerFlags; +HSPLcom/android/server/policy/role/RoleServicePlatformHelperImpl;->lambda$computePackageStateHash$0(Ljava/io/DataOutputStream;Landroid/content/pm/PackageManagerInternal;ILcom/android/server/pm/pkg/AndroidPackage;)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/Signature;Landroid/content/pm/Signature;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl;]Ljava/io/DataOutputStream;Ljava/io/DataOutputStream;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; +HSPLcom/android/server/power/AttentionDetector;->updateUserActivity(JJ)J+]Landroid/attention/AttentionManagerInternal;Lcom/android/server/attention/AttentionManagerService$LocalService;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/wm/WindowManagerInternal;Lcom/android/server/wm/WindowManagerService$LocalService; +HSPLcom/android/server/power/FaceDownDetector;->onSensorChanged(Landroid/hardware/SensorEvent;)V +HSPLcom/android/server/power/InattentiveSleepWarningController;->isShown()Z +HSPLcom/android/server/power/Notifier$$ExternalSyntheticLambda2;->(Lcom/android/server/power/Notifier;ZLjava/lang/String;IIILandroid/os/WorkSource;Ljava/lang/String;Ljava/lang/String;JLandroid/os/IWakeLockCallback;)V +HSPLcom/android/server/power/Notifier$$ExternalSyntheticLambda2;->run()V +HPLcom/android/server/power/Notifier$$ExternalSyntheticLambda5;->(Lcom/android/server/power/Notifier;Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;ILandroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZ)V +HPLcom/android/server/power/Notifier$$ExternalSyntheticLambda5;->run()V +HSPLcom/android/server/power/Notifier$NotifierHandler;->handleMessage(Landroid/os/Message;)V +HSPLcom/android/server/power/Notifier$RealInjector;->currentTimeMillis()J +HSPLcom/android/server/power/Notifier;->lambda$notifyWakeLockListener$9(ZLjava/lang/String;IIILandroid/os/WorkSource;Ljava/lang/String;Ljava/lang/String;JLandroid/os/IWakeLockCallback;)V+]Landroid/os/IWakeLockCallback;Landroid/os/IWakeLockCallback$Stub$Proxy;]Lcom/android/server/power/feature/PowerManagerFlags;Lcom/android/server/power/feature/PowerManagerFlags; +HSPLcom/android/server/power/Notifier;->notifyWakeLockListener(Landroid/os/IWakeLockCallback;Ljava/lang/String;ZIIILandroid/os/WorkSource;Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/power/Notifier$Injector;Lcom/android/server/power/Notifier$RealInjector; +HSPLcom/android/server/power/Notifier;->notifyWakelockAcquisition(Ljava/lang/String;IIILandroid/os/WorkSource;Ljava/lang/String;Ljava/lang/String;J)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService; +HSPLcom/android/server/power/Notifier;->notifyWakelockRelease(Ljava/lang/String;IIILandroid/os/WorkSource;Ljava/lang/String;Ljava/lang/String;J)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService; +HSPLcom/android/server/power/Notifier;->onScreenPolicyUpdate(II)V+]Lcom/android/server/power/WakefulnessSessionObserver;Lcom/android/server/power/WakefulnessSessionObserver; +HSPLcom/android/server/power/Notifier;->onUserActivity(III)V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/WakefulnessSessionObserver;Lcom/android/server/power/WakefulnessSessionObserver; +HSPLcom/android/server/power/Notifier;->onWakeLockAcquired(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/WakefulnessSessionObserver;Lcom/android/server/power/WakefulnessSessionObserver;]Lcom/android/server/power/feature/PowerManagerFlags;Lcom/android/server/power/feature/PowerManagerFlags; HSPLcom/android/server/power/Notifier;->onWakeLockChanging(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; +HSPLcom/android/server/power/Notifier;->onWakeLockReleased(ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;I)V+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/internal/app/IBatteryStats;Lcom/android/server/am/BatteryStatsService;]Lcom/android/server/power/WakefulnessSessionObserver;Lcom/android/server/power/WakefulnessSessionObserver;]Lcom/android/server/power/feature/PowerManagerFlags;Lcom/android/server/power/feature/PowerManagerFlags; +HSPLcom/android/server/power/Notifier;->sendUserActivity(II)V+]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;]Lcom/android/server/input/InputManagerInternal;Lcom/android/server/input/InputManagerService$LocalService;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/power/FaceDownDetector;Lcom/android/server/power/FaceDownDetector;]Lcom/android/server/power/ScreenUndimDetector;Lcom/android/server/power/ScreenUndimDetector; HSPLcom/android/server/power/PowerGroup;->getDesiredScreenPolicyLocked(ZZZZZ)I+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; +HSPLcom/android/server/power/PowerGroup;->getGroupId()I +HSPLcom/android/server/power/PowerGroup;->getLastUserActivityTimeLocked()J +HSPLcom/android/server/power/PowerGroup;->getLastUserActivityTimeNoChangeLightsLocked()J +HSPLcom/android/server/power/PowerGroup;->getLastWakeTimeLocked()J +HPLcom/android/server/power/PowerGroup;->getUserActivitySummaryLocked()I HSPLcom/android/server/power/PowerGroup;->getWakeLockSummaryLocked()I HSPLcom/android/server/power/PowerGroup;->getWakefulnessLocked()I HSPLcom/android/server/power/PowerGroup;->isBrightOrDimLocked()Z+]Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest;Landroid/hardware/display/DisplayManagerInternal$DisplayPowerRequest; @@ -2934,122 +2992,129 @@ HSPLcom/android/server/power/PowerGroup;->isReadyLocked()Z HSPLcom/android/server/power/PowerGroup;->isSandmanSummonedLocked()Z HSPLcom/android/server/power/PowerGroup;->needSuspendBlockerLocked(ZZ)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; HSPLcom/android/server/power/PowerGroup;->setReadyLocked(Z)Z +HSPLcom/android/server/power/PowerGroup;->setUserActivitySummaryLocked(I)V HSPLcom/android/server/power/PowerGroup;->supportsSandmanLocked()Z -HSPLcom/android/server/power/PowerGroup;->updateLocked(FZZIIFZLandroid/os/PowerSaveState;ZZZZZZ)Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; -HSPLcom/android/server/power/PowerManagerService$BinderService;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;ILandroid/os/IWakeLockCallback;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource; -HSPLcom/android/server/power/PowerManagerService$BinderService;->isDeviceIdleMode()Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerGroup;->updateLocked(FLjava/lang/CharSequence;ZZIIFZZLandroid/os/PowerSaveState;ZZZZZZ)Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; +HSPLcom/android/server/power/PowerManagerService$BinderService;->acquireWakeLock(Landroid/os/IBinder;ILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;ILandroid/os/IWakeLockCallback;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource;]Lcom/android/server/power/feature/PowerManagerFlags;Lcom/android/server/power/feature/PowerManagerFlags; +HSPLcom/android/server/power/PowerManagerService$BinderService;->isDeviceIdleMode()Z HSPLcom/android/server/power/PowerManagerService$BinderService;->isInteractive()Z HSPLcom/android/server/power/PowerManagerService$BinderService;->isLightDeviceIdleMode()Z HSPLcom/android/server/power/PowerManagerService$BinderService;->releaseWakeLock(Landroid/os/IBinder;I)V+]Landroid/content/Context;Landroid/app/ContextImpl; HSPLcom/android/server/power/PowerManagerService$BinderService;->updateWakeLockWorkSource(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/WorkSource;Landroid/os/WorkSource; HSPLcom/android/server/power/PowerManagerService$Injector$2;->uptimeMillis()J -HSPLcom/android/server/power/PowerManagerService$LocalService;->finishUidChanges()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService$LocalService;->startUidChanges()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService$LocalService;->updateUidProcState(II)V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService$NativeWrapper;->nativeAcquireSuspendBlocker(Ljava/lang/String;)V -HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;->handleMessage(Landroid/os/Message;)Z+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl; -HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->recordReferenceLocked(Ljava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongArray;Landroid/util/LongArray; -HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->release(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl; -HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->removeReferenceLocked(Ljava/lang/String;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongArray;Landroid/util/LongArray; -HSPLcom/android/server/power/PowerManagerService$WakeLock;->(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILcom/android/server/power/PowerManagerService$UidState;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock; +HSPLcom/android/server/power/PowerManagerService$LocalService;->finishUidChanges()V +HSPLcom/android/server/power/PowerManagerService$LocalService;->startUidChanges()V +HSPLcom/android/server/power/PowerManagerService$LocalService;->updateUidProcState(II)V +HSPLcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback;->handleMessage(Landroid/os/Message;)Z +HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->acquire(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper; +HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->recordReferenceLocked(Ljava/lang/String;)V+]Landroid/util/LongArray;Landroid/util/LongArray; +HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->release(Ljava/lang/String;)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper; +HSPLcom/android/server/power/PowerManagerService$SuspendBlockerImpl;->removeReferenceLocked(Ljava/lang/String;)V+]Landroid/util/LongArray;Landroid/util/LongArray; +HSPLcom/android/server/power/PowerManagerService$WakeLock;->(Lcom/android/server/power/PowerManagerService;Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILcom/android/server/power/PowerManagerService$UidState;Landroid/os/IWakeLockCallback;)V HSPLcom/android/server/power/PowerManagerService$WakeLock;->getPowerGroupId()Ljava/lang/Integer;+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService; HSPLcom/android/server/power/PowerManagerService$WakeLock;->linkToDeath()V+]Landroid/os/IBinder;Landroid/os/Binder;,Landroid/os/BinderProxy; HSPLcom/android/server/power/PowerManagerService$WakeLock;->unlinkToDeath()V+]Landroid/os/IBinder;Landroid/os/Binder;,Landroid/os/BinderProxy; -HSPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILandroid/os/IWakeLockCallback;)V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/power/PowerManagerService;->acquireWakeLockInternal(Landroid/os/IBinder;IILjava/lang/String;Ljava/lang/String;Landroid/os/WorkSource;Ljava/lang/String;IILandroid/os/IWakeLockCallback;)V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/power/PowerManagerService;->adjustWakeLockSummary(II)I -HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/lang/Integer;Ljava/lang/Integer; +HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnAcquireLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; HSPLcom/android/server/power/PowerManagerService;->applyWakeLockFlagsOnReleaseLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; HSPLcom/android/server/power/PowerManagerService;->areAllPowerGroupsReadyLocked()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; -HSPLcom/android/server/power/PowerManagerService;->doesIdleStateBlockWakeLocksLocked()Z HSPLcom/android/server/power/PowerManagerService;->findWakeLockIndexLocked(Landroid/os/IBinder;)I+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/PowerManagerService;->finishUidChangesInternal()V+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->finishUidChangesInternal()V +HSPLcom/android/server/power/PowerManagerService;->finishWakefulnessChangeIfNeededLocked()V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; HSPLcom/android/server/power/PowerManagerService;->getAttentiveTimeoutLocked()J HSPLcom/android/server/power/PowerManagerService;->getNextProfileTimeoutLocked(J)J+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/power/PowerManagerService;->getScreenOffTimeoutLocked(JJ)J+]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->getScreenOffTimeoutLocked(JJ)J HSPLcom/android/server/power/PowerManagerService;->getScreenOffTimeoutOverrideLocked(JJ)J HSPLcom/android/server/power/PowerManagerService;->getSleepTimeoutLocked(J)J HSPLcom/android/server/power/PowerManagerService;->getWakeLockSummaryFlags(Lcom/android/server/power/PowerManagerService$WakeLock;)I -HSPLcom/android/server/power/PowerManagerService;->handleSandman(I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/service/dreams/DreamManagerInternal;Lcom/android/server/dreams/DreamManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->isAttentiveTimeoutExpired(Lcom/android/server/power/PowerGroup;J)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->handleSandman(I)V+]Landroid/service/dreams/DreamManagerInternal;Lcom/android/server/dreams/DreamManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; +HSPLcom/android/server/power/PowerManagerService;->isAttentiveTimeoutExpired(Lcom/android/server/power/PowerGroup;J)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; HPLcom/android/server/power/PowerManagerService;->isBeingKeptAwakeLocked(Lcom/android/server/power/PowerGroup;)Z+]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; HSPLcom/android/server/power/PowerManagerService;->isDeviceIdleModeInternal()Z HSPLcom/android/server/power/PowerManagerService;->isGloballyInteractiveInternal()Z HSPLcom/android/server/power/PowerManagerService;->isItBedTimeYetLocked(Lcom/android/server/power/PowerGroup;)Z+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; HSPLcom/android/server/power/PowerManagerService;->isMaximumScreenOffTimeoutFromDeviceAdminEnforcedLocked()Z -HSPLcom/android/server/power/PowerManagerService;->maybeHideInattentiveSleepWarningLocked(JJ)Z+]Lcom/android/server/power/InattentiveSleepWarningController;Lcom/android/server/power/InattentiveSleepWarningController;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->needSuspendBlockerLocked()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockAcquiredLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->maybeHideInattentiveSleepWarningLocked(JJ)Z+]Lcom/android/server/power/InattentiveSleepWarningController;Lcom/android/server/power/InattentiveSleepWarningController; +HSPLcom/android/server/power/PowerManagerService;->needSuspendBlockerLocked()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; +HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockAcquiredLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; +HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockChangingLocked(Lcom/android/server/power/PowerManagerService$WakeLock;ILjava/lang/String;Ljava/lang/String;IILandroid/os/WorkSource;Ljava/lang/String;Landroid/os/IWakeLockCallback;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockLongFinishedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; -HSPLcom/android/server/power/PowerManagerService;->releaseWakeLockInternal(Landroid/os/IBinder;I)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; +HSPLcom/android/server/power/PowerManagerService;->notifyWakeLockReleasedLocked(Lcom/android/server/power/PowerManagerService$WakeLock;I)V+]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier; +HSPLcom/android/server/power/PowerManagerService;->releaseWakeLockInternal(Landroid/os/IBinder;I)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/power/PowerManagerService;->removeWakeLockNoUpdateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/power/PowerManagerService;->restartNofifyLongTimerLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; +HSPLcom/android/server/power/PowerManagerService;->scheduleSandmanLocked()V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; HSPLcom/android/server/power/PowerManagerService;->scheduleUserInactivityTimeout(J)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->setHalAutoSuspendModeLocked(Z)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper; +HSPLcom/android/server/power/PowerManagerService;->setHalInteractiveModeLocked(Z)V+]Lcom/android/server/power/PowerManagerService$NativeWrapper;Lcom/android/server/power/PowerManagerService$NativeWrapper; +HSPLcom/android/server/power/PowerManagerService;->setWakeLockDisabledStateLocked(Lcom/android/server/power/PowerManagerService$WakeLock;)Z HSPLcom/android/server/power/PowerManagerService;->shouldUseProximitySensorLocked()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; -HSPLcom/android/server/power/PowerManagerService;->startUidChangesInternal()V HSPLcom/android/server/power/PowerManagerService;->uidActiveInternal(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; HSPLcom/android/server/power/PowerManagerService;->uidIdleInternal(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/power/PowerManagerService;->updateAttentiveStateLocked(JI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->updateAttentiveStateLocked(JI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; HSPLcom/android/server/power/PowerManagerService;->updateDreamLocked(IZ)V -HSPLcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/BatteryManagerInternal;Lcom/android/server/BatteryService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/WirelessChargerDetector;Lcom/android/server/power/WirelessChargerDetector;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/power/PowerManagerService;->updatePowerGroupsLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/LatencyTracker;Lcom/android/internal/util/LatencyTracker;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->updateIsPoweredLocked(I)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/BatteryManagerInternal;Lcom/android/server/BatteryService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/WirelessChargerDetector;Lcom/android/server/power/WirelessChargerDetector;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine; +HSPLcom/android/server/power/PowerManagerService;->updatePowerGroupsLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/util/LatencyTracker;Lcom/android/internal/util/LatencyTracker;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy;]Lcom/android/server/power/batterysaver/BatterySaverStateMachine;Lcom/android/server/power/batterysaver/BatterySaverStateMachine; +HSPLcom/android/server/power/PowerManagerService;->updatePowerStateLocked()V+]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; HSPLcom/android/server/power/PowerManagerService;->updateProfilesLocked(J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/power/PowerManagerService;->updateStayOnLocked(I)V -HSPLcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Lcom/android/server/power/SuspendBlocker;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl; -HSPLcom/android/server/power/PowerManagerService;->updateUidProcStateInternal(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V+]Lcom/android/server/power/PowerManagerService$WakeLock;Lcom/android/server/power/PowerManagerService$WakeLock;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; -HSPLcom/android/server/power/PowerManagerService;->userActivityNoUpdateLocked(Lcom/android/server/power/PowerGroup;JIII)Z+]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService;Lcom/android/server/power/PowerManagerService; +HSPLcom/android/server/power/PowerManagerService;->updateStayOnLocked(I)V+]Landroid/os/BatteryManagerInternal;Lcom/android/server/BatteryService$LocalService; +HSPLcom/android/server/power/PowerManagerService;->updateSuspendBlockerLocked()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/SuspendBlocker;Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl; +HSPLcom/android/server/power/PowerManagerService;->updateUidProcStateInternal(II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/power/PowerManagerService;->updateUserActivitySummaryLocked(JI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; +HSPLcom/android/server/power/PowerManagerService;->updateWakeLockSummaryLocked(I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/power/PowerManagerService;->updateWakeLockWorkSourceInternal(Landroid/os/IBinder;Landroid/os/WorkSource;Ljava/lang/String;I)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/power/PowerManagerService;->updateWakefulnessLocked(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup;]Lcom/android/server/power/PowerManagerService$Clock;Lcom/android/server/power/PowerManagerService$Injector$2; +HSPLcom/android/server/power/PowerManagerService;->userActivityNoUpdateLocked(Lcom/android/server/power/PowerGroup;JIII)Z+]Lcom/android/server/power/AttentionDetector;Lcom/android/server/power/AttentionDetector;]Lcom/android/server/power/Notifier;Lcom/android/server/power/Notifier;]Lcom/android/server/power/PowerGroup;Lcom/android/server/power/PowerGroup; +HSPLcom/android/server/power/ScreenTimeoutOverridePolicy;->getScreenTimeoutOverrideLocked(IJ)J HSPLcom/android/server/power/ScreenUndimDetector;->recordScreenPolicy(II)V -HSPLcom/android/server/power/ThermalManagerService$1;->getCurrentThermalStatus()I+]Ljava/util/concurrent/atomic/AtomicBoolean;Ljava/util/concurrent/atomic/AtomicBoolean; -HSPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->fromBytes([BJLcom/android/server/power/WakeLockLog$LogEntry;)Lcom/android/server/power/WakeLockLog$LogEntry;+]Lcom/android/server/power/WakeLockLog$LogEntry;Lcom/android/server/power/WakeLockLog$LogEntry;]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase; -HSPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->toBytes(Lcom/android/server/power/WakeLockLog$LogEntry;[BJ)I+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase; -HSPLcom/android/server/power/WakeLockLog$Injector;->currentTimeMillis()J +HSPLcom/android/server/power/ThermalManagerService$1;->getCurrentThermalStatus()I +HPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->fromBytes([BJLcom/android/server/power/WakeLockLog$LogEntry;)Lcom/android/server/power/WakeLockLog$LogEntry;+]Lcom/android/server/power/WakeLockLog$LogEntry;Lcom/android/server/power/WakeLockLog$LogEntry;]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase; +HSPLcom/android/server/power/WakeLockLog$EntryByteTranslator;->toBytes(Lcom/android/server/power/WakeLockLog$LogEntry;[BJ)I+]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase; HSPLcom/android/server/power/WakeLockLog$LogEntry;->set(JILcom/android/server/power/WakeLockLog$TagData;I)V HSPLcom/android/server/power/WakeLockLog$TagData;->equals(Ljava/lang/Object;)Z -HSPLcom/android/server/power/WakeLockLog$TagDatabase;->findOrCreateTag(Ljava/lang/String;IZ)Lcom/android/server/power/WakeLockLog$TagData;+]Lcom/android/server/power/WakeLockLog$TagData;Lcom/android/server/power/WakeLockLog$TagData;]Lcom/android/server/power/WakeLockLog$TagDatabase$Callback;Lcom/android/server/power/WakeLockLog$TheLog$1;]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase; -HSPLcom/android/server/power/WakeLockLog$TagDatabase;->getTag(I)Lcom/android/server/power/WakeLockLog$TagData; +HSPLcom/android/server/power/WakeLockLog$TagDatabase;->findOrCreateTag(Ljava/lang/String;IZ)Lcom/android/server/power/WakeLockLog$TagData;+]Lcom/android/server/power/WakeLockLog$TagDatabase$Callback;Lcom/android/server/power/WakeLockLog$TheLog$1; +HPLcom/android/server/power/WakeLockLog$TagDatabase;->getTag(I)Lcom/android/server/power/WakeLockLog$TagData; HSPLcom/android/server/power/WakeLockLog$TheLog;->addEntry(Lcom/android/server/power/WakeLockLog$LogEntry;)V+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;]Lcom/android/server/power/WakeLockLog$TheLog;Lcom/android/server/power/WakeLockLog$TheLog; HSPLcom/android/server/power/WakeLockLog$TheLog;->getAvailableSpace()I -HSPLcom/android/server/power/WakeLockLog$TheLog;->makeSpace(I)Z+]Lcom/android/server/power/WakeLockLog$TheLog;Lcom/android/server/power/WakeLockLog$TheLog; -HSPLcom/android/server/power/WakeLockLog$TheLog;->readEntryAt(IJLcom/android/server/power/WakeLockLog$LogEntry;)Lcom/android/server/power/WakeLockLog$LogEntry;+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator; -HPLcom/android/server/power/WakeLockLog$TheLog;->removeOldestItem()V+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;]Lcom/android/server/power/WakeLockLog$TheLog;Lcom/android/server/power/WakeLockLog$TheLog;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/power/WakeLockLog$TheLog;->removeTagIndex(I)V+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;]Lcom/android/server/power/WakeLockLog$TheLog;Lcom/android/server/power/WakeLockLog$TheLog; +HSPLcom/android/server/power/WakeLockLog$TheLog;->makeSpace(I)Z +HPLcom/android/server/power/WakeLockLog$TheLog;->readEntryAt(IJLcom/android/server/power/WakeLockLog$LogEntry;)Lcom/android/server/power/WakeLockLog$LogEntry;+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator; +HPLcom/android/server/power/WakeLockLog$TheLog;->removeOldestItem()V+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/power/WakeLockLog$TheLog;->removeTagIndex(I)V+]Lcom/android/server/power/WakeLockLog$EntryByteTranslator;Lcom/android/server/power/WakeLockLog$EntryByteTranslator; HSPLcom/android/server/power/WakeLockLog$TheLog;->writeBytesAt(I[BI)V HSPLcom/android/server/power/WakeLockLog;->handleWakeLockEventInternal(ILjava/lang/String;IIJ)V+]Lcom/android/server/power/WakeLockLog$TagDatabase;Lcom/android/server/power/WakeLockLog$TagDatabase;]Lcom/android/server/power/WakeLockLog$TheLog;Lcom/android/server/power/WakeLockLog$TheLog; -HSPLcom/android/server/power/WakeLockLog;->tagNameReducer(Ljava/lang/String;)Ljava/lang/String;+]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/power/WakeLockLog;->onWakeLockEvent(ILjava/lang/String;IIJ)V+]Lcom/android/server/power/WakeLockLog$Injector;Lcom/android/server/power/WakeLockLog$Injector; +HSPLcom/android/server/power/WakeLockLog;->tagNameReducer(Ljava/lang/String;)Ljava/lang/String; +HSPLcom/android/server/power/WakefulnessSessionObserver$WakefulnessSessionPowerGroup;->onScreenPolicyUpdate(JI)V +HSPLcom/android/server/power/WakefulnessSessionObserver;->onScreenPolicyUpdate(JII)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/WakefulnessSessionObserver$WakefulnessSessionPowerGroup;Lcom/android/server/power/WakefulnessSessionObserver$WakefulnessSessionPowerGroup; HSPLcom/android/server/power/batterysaver/BatterySaverController$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler;Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler; +HSPLcom/android/server/power/batterysaver/BatterySaverController;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy; HSPLcom/android/server/power/batterysaver/BatterySaverController;->updateBatterySavingStats()V+]Lcom/android/server/power/batterysaver/BatterySavingStats;Lcom/android/server/power/batterysaver/BatterySavingStats; HSPLcom/android/server/power/batterysaver/BatterySaverPolicy$Policy;->(FZZZZZZZZZZZZZZZII)V -HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;->getBatterySaverPolicy(I)Landroid/os/PowerSaveState;+]Landroid/os/PowerSaveState$Builder;Landroid/os/PowerSaveState$Builder;]Lcom/android/server/power/batterysaver/BatterySaverPolicy;Lcom/android/server/power/batterysaver/BatterySaverPolicy; +HSPLcom/android/server/power/batterysaver/BatterySaverPolicy;->getBatterySaverPolicy(I)Landroid/os/PowerSaveState; HSPLcom/android/server/power/batterysaver/BatterySaverStateMachine;->getBatterySaverPolicy()Lcom/android/server/power/batterysaver/BatterySaverPolicy;+]Lcom/android/server/power/batterysaver/BatterySaverController;Lcom/android/server/power/batterysaver/BatterySaverController; +HSPLcom/android/server/power/feature/PowerManagerFlags$FlagState;->isEnabled()Z +HSPLcom/android/server/power/feature/PowerManagerFlags;->improveWakelockLatency()Z +HPLcom/android/server/power/hint/HintManagerService$AppHintSession;->close()V+]Landroid/os/IBinder;Landroid/os/BinderProxy;]Lcom/android/server/power/hint/HintManagerService$AppHintSessionSnapshot;Lcom/android/server/power/hint/HintManagerService$AppHintSessionSnapshot;]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->isHintAllowed()Z +HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->reportActualWorkDuration2([Landroid/hardware/power/WorkDuration;)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper; HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->sendHint(I)V+]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper; -HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver$$ExternalSyntheticLambda0;->run()V -HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->isUidForeground(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->lambda$onUidStateChanged$1(II)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/hint/HintManagerService$MyUidObserver;Lcom/android/server/power/hint/HintManagerService$MyUidObserver;]Ljava/util/Collection;Landroid/util/MapCollections$ValuesCollection;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator; -HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/power/stats/AggregatedPowerStats;->setUidState(IIIJ)V+]Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/hint/HintManagerService$AppHintSession;->validateWorkDuration(Landroid/hardware/power/WorkDuration;)V +HSPLcom/android/server/power/hint/HintManagerService$BinderService;->createHintSessionWithConfig(Landroid/os/IBinder;[IJILandroid/hardware/power/SessionConfig;)Landroid/os/IHintSession;+]Lcom/android/server/power/hint/HintManagerService$AppHintSessionSnapshot;Lcom/android/server/power/hint/HintManagerService$AppHintSessionSnapshot;]Lcom/android/server/power/hint/HintManagerService$NativeWrapper;Lcom/android/server/power/hint/HintManagerService$NativeWrapper;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->lambda$onUidStateChanged$1(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HSPLcom/android/server/power/hint/HintManagerService$MyUidObserver;->onUidStateChanged(IIJI)V HSPLcom/android/server/power/stats/BatteryExternalStatsWorker$1;->run()V+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;+]Landroid/os/Bundle;Landroid/os/Bundle;]Landroid/os/SynchronousResultReceiver;Landroid/os/SynchronousResultReceiver; -HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/os/connectivity/WifiActivityEnergyInfo;)Landroid/os/connectivity/WifiActivityEnergyInfo; +HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->awaitControllerInfo(Landroid/os/SynchronousResultReceiver;)Landroid/os/Parcelable;+]Landroid/os/SynchronousResultReceiver;Landroid/os/SynchronousResultReceiver; +HPLcom/android/server/power/stats/BatteryExternalStatsWorker;->extractDeltaLocked(Landroid/os/connectivity/WifiActivityEnergyInfo;)Landroid/os/connectivity/WifiActivityEnergyInfo; HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->getEnergyConsumersLocked(I)Ljava/util/concurrent/CompletableFuture; -HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleCpuSyncDueToWakelockChange(J)Ljava/util/concurrent/Future;+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker; HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleDelayedSyncLocked(Ljava/util/concurrent/Future;Ljava/lang/Runnable;J)Ljava/util/concurrent/Future;+]Ljava/util/concurrent/Future;Ljava/util/concurrent/ScheduledThreadPoolExecutor$ScheduledFutureTask;]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; -HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncDueToProcessStateChange(IJ)V+]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker; +HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncDueToProcessStateChange(IJ)V HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->scheduleSyncLocked(Ljava/lang/String;I)Ljava/util/concurrent/Future;+]Ljava/util/concurrent/ScheduledExecutorService;Ljava/util/concurrent/Executors$DelegatedScheduledExecutorService; HSPLcom/android/server/power/stats/BatteryExternalStatsWorker;->updateExternalStatsLocked(Ljava/lang/String;IZZI[IZ)V+]Landroid/net/wifi/WifiManager;Landroid/net/wifi/WifiManager;]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;]Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector;]Lcom/android/server/power/stats/BatteryExternalStatsWorker;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/EnergyConsumerSnapshot;Lcom/android/server/power/stats/EnergyConsumerSnapshot;]Lcom/android/server/power/stats/PowerStatsCollector;Lcom/android/server/power/stats/BluetoothPowerStatsCollector;,Lcom/android/server/power/stats/MobileRadioPowerStatsCollector;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; -HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->addCpuClusterSpeedDurationsMs(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;IIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator; -HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->getOrCreateUidCpuClusterCharges(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)[D+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V +HPLcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda1;->onUidCpuTime(ILjava/lang/Object;)V +HSPLcom/android/server/power/stats/BatteryStatsImpl$Counter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V +HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->addCpuClusterSpeedDurationsMs(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;IIJ)V+]Lcom/android/server/power/stats/CpuPowerCalculator;Lcom/android/server/power/stats/CpuPowerCalculator; +HPLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;->getOrCreateUidCpuClusterCharges(Lcom/android/server/power/stats/BatteryStatsImpl$Uid;)[D HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; HSPLcom/android/server/power/stats/BatteryStatsImpl$DualTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; @@ -3058,20 +3123,18 @@ HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->getMaxDurati HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->getTotalDurationMsLocked(J)J+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; -HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; -HSPLcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;->uidProcessStateChanged(II)V -HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; -HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(JZ)V -HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel; -HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->addCountLocked([JZ)V -HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->startObject(Ljava/lang/String;J)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3; -HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->stopObject(Ljava/lang/String;J)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->computeCurrentCountLocked()I -HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->computeRunTimeLocked(JJ)J +HSPLcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; +HSPLcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;->wakelockStateChanged(ILandroid/os/WorkSource$WorkChain;Ljava/lang/String;IZI)V +HPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->addCountLocked(JZ)V +HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;->writeSummaryFromParcelLocked(Landroid/os/Parcel;)V +HPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->addCountLocked([JZ)V +HSPLcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;->writeSummaryToParcelLocked(Landroid/os/Parcel;)V +HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->getMap()Landroid/util/ArrayMap; +HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->startObject(Ljava/lang/String;J)Ljava/lang/Object;+]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3; +HSPLcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;->stopObject(Ljava/lang/String;J)Ljava/lang/Object; HSPLcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;->update(JJIJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer; -HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->(Lcom/android/internal/os/Clock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;ILjava/util/ArrayList;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V +HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->computeCurrentCountLocked()I HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->computeRunTimeLocked(JJ)J+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->onTimeStopped(JJJ)V HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->refreshTimersLocked(JLjava/util/ArrayList;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;)J+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Ljava/util/ArrayList;Ljava/util/ArrayList; @@ -3082,243 +3145,338 @@ HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->computeUptime(JI) HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->getRealtime(J)J HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->getUptime(J)J HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->init(JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; +HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->isRunning()Z HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->setRunning(ZJJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs;megamorphic_types]Ljava/util/Collection;Ljava/util/ArrayList;,Ljava/util/HashSet;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;,Ljava/util/HashMap$KeyIterator; -HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; +HSPLcom/android/server/power/stats/BatteryStatsImpl$TimeBase;->writeSummaryToParcel(Landroid/os/Parcel;JJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->(Lcom/android/internal/os/Clock;ILcom/android/server/power/stats/BatteryStatsImpl$TimeBase;)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->getTimeSinceMarkLocked(J)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; -HPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types +HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->getTotalTimeLocked(JI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->readSummaryFromParcelLocked(Landroid/os/Parcel;)V -HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types +HSPLcom/android/server/power/stats/BatteryStatsImpl$Timer;->writeSummaryFromParcelLocked(Landroid/os/Parcel;J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;megamorphic_types HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->getStartTimeToNowLocked(J)J HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->startLaunchedLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->startRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopLaunchedLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;->stopRunningLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;->writeExcessivePowerToParcelLocked(Landroid/os/Parcel;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->(Lcom/android/server/power/stats/BatteryStatsImpl;IJJ)V HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->createAggregatedPartialWakelockTimerLocked()Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->ensureNetworkActivityLocked()V HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getCpuActiveTimeCounter()Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1; -HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getEnergyConsumptionUC(I)J+]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getMobileRadioActiveTimeCounter()Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getOrCreateEnergyConsumerStatsIfSupportedLocked()Lcom/android/internal/power/EnergyConsumerStats; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPackageStatsLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPackageStatsLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getPidStatsLocked(I)Landroid/os/BatteryStats$Uid$Pid;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcessStateTime(IJI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcessStatsLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getSensorTimerLocked(IZ)Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getServiceStatsLocked(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getUid()I +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcessStateTime(IJI)J+]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getProcessStatsLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getServiceStatsLocked(Ljava/lang/String;Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWakelockTimerLocked(Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;I)Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWifiControllerActivity()Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->getWifiBatchedScanTime(IJI)J HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->maybeScheduleExternalStatsSync(II)V+]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStartWakeLocked(ILjava/lang/String;IJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; -HPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopJobLocked(Ljava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopJobLocked(Ljava/lang/String;JI)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->noteStopWakeLocked(ILjava/lang/String;IJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateOnBatteryBgTimeBase(JJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateOnBatteryScreenOffBgTimeBase(JJ)Z+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateUidProcessStateLocked(IJJ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/LongArrayMultiStateCounter;Lcom/android/internal/os/LongArrayMultiStateCounter;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->writeJobCompletionsToParcelLocked(Landroid/os/Parcel;)V+]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;->exists(I)Z +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->updateUidProcessStateLocked(IJJ)V+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid; +HSPLcom/android/server/power/stats/BatteryStatsImpl$Uid;->writeJobCompletionsToParcelLocked(Landroid/os/Parcel;)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/power/stats/BatteryStatsImpl;->clearPendingRemovedUidsLocked()V+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Ljava/util/Queue;Ljava/util/LinkedList; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->computeDelta(Landroid/net/NetworkStats;Landroid/net/NetworkStats;)Ljava/util/List;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->computeDelta(Landroid/net/NetworkStats;Landroid/net/NetworkStats;)Ljava/util/List;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry; HSPLcom/android/server/power/stats/BatteryStatsImpl;->getBatteryUptimeLocked(J)J+]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; HSPLcom/android/server/power/stats/BatteryStatsImpl;->getRpmTimerLocked(Ljava/lang/String;)Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;+]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/power/stats/BatteryStatsImpl;->getServiceStatsLocked(ILjava/lang/String;Ljava/lang/String;JJ)Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;+]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->getUidStatsLocked(IJJ)Lcom/android/server/power/stats/BatteryStatsImpl$Uid;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuActiveTimesLocked$5(JJILjava/lang/Long;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HPLcom/android/server/power/stats/BatteryStatsImpl;->lambda$readKernelUidCpuFreqTimesLocked$4(JJZZZII[ILcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;I[J)V+]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray;]Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider;Lcom/android/server/am/BatteryStatsService$3;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->mapUid(I)I+]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver; HSPLcom/android/server/power/stats/BatteryStatsImpl;->markPartialTimersAsEligible()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteEventLocked(ILjava/lang/String;IJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory; -HPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobFinishLocked(Ljava/lang/String;IIJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobFinishLocked(Ljava/lang/String;IIJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteJobStartLocked(Ljava/lang/String;IJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HPLcom/android/server/power/stats/BatteryStatsImpl;->noteModemControllerActivity(Landroid/telephony/ModemActivityInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Landroid/telephony/ModemActivityInfo;Landroid/telephony/ModemActivityInfo;]Landroid/util/SparseDoubleArray;Landroid/util/SparseDoubleArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IZJJ)V+]Landroid/os/BatteryStats$HistoryEventTracker;Landroid/os/BatteryStats$HistoryEventTracker;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IJJ)V+]Landroid/os/BatteryStats$HistoryEventTracker;Landroid/os/BatteryStats$HistoryEventTracker;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IZJJ)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStartWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IZJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeFromSourceLocked(Landroid/os/WorkSource;ILjava/lang/String;Ljava/lang/String;IJJ)V+]Landroid/os/WorkSource;Landroid/os/WorkSource;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteStopWakeLocked(IILandroid/os/WorkSource$WorkChain;Ljava/lang/String;Ljava/lang/String;IJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->noteUidProcessStateLocked(IIJJ)V+]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HPLcom/android/server/power/stats/BatteryStatsImpl;->noteWakeupReasonLocked(Ljava/lang/String;JJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger;]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->readSummaryFromParcel(Landroid/os/Parcel;)V -HSPLcom/android/server/power/stats/BatteryStatsImpl;->setBatteryStateLocked(IIIIIIIIJJJJ)V+]Landroid/os/BatteryStats$LevelStepTracker;Landroid/os/BatteryStats$LevelStepTracker;]Landroid/os/Handler;Lcom/android/server/power/stats/BatteryStatsImpl$MyHandler;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->retrieveBluetoothScanTimesLocked(Lcom/android/server/power/stats/BluetoothPowerStatsCollector$BluetoothStatsRetriever$Callback;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BluetoothPowerStatsCollector$BluetoothStatsRetriever$Callback;Lcom/android/server/power/stats/BluetoothPowerStatsCollector$$ExternalSyntheticLambda0; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->retrieveWifiScanTimesLocked(Lcom/android/server/power/stats/WifiPowerStatsCollector$WifiStatsRetriever$Callback;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/WifiPowerStatsCollector$WifiStatsRetriever$Callback;Lcom/android/server/power/stats/WifiPowerStatsCollector$$ExternalSyntheticLambda1; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->setBatteryStateLocked(IIIIIIIIJJJJ)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync;Lcom/android/server/power/stats/BatteryExternalStatsWorker;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateClusterSpeedTimes(Landroid/util/SparseLongArray;ZLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/internal/os/KernelCpuSpeedReader;Lcom/android/internal/os/KernelCpuSpeedReader;]Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;Lcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl; -HPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuEnergyConsumerStatsLocked([JLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats; +HPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuEnergyConsumerStatsLocked([JLcom/android/server/power/stats/BatteryStatsImpl$CpuDeltaPowerAccumulator;)V+]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats; HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateCpuTimeLocked(ZZ[J)V+]Lcom/android/internal/os/CpuScalingPolicies;Lcom/android/internal/os/CpuScalingPolicies;]Lcom/android/internal/os/KernelCpuSpeedReader;Lcom/android/internal/os/KernelCpuSpeedReader;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidActiveTimeReader;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidClusterTimeReader;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidUserSysTimeReader;]Lcom/android/internal/power/EnergyConsumerStats;Lcom/android/internal/power/EnergyConsumerStats;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateKernelWakelocksLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;,Ljava/util/HashMap;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/Set;Ljava/util/HashMap$EntrySet; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateRpmStatsLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateWifiState(Landroid/os/connectivity/WifiActivityEnergyInfo;JJJLandroid/app/usage/NetworkStatsManager;)V+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Landroid/os/connectivity/WifiActivityEnergyInfo;Landroid/os/connectivity/WifiActivityEnergyInfo;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/internal/os/RailStats;Lcom/android/internal/os/RailStats;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/PowerStatsCollector;Lcom/android/server/power/stats/WifiPowerStatsCollector;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V+]Landroid/os/BatteryStats$LevelStepTracker;Landroid/os/BatteryStats$LevelStepTracker;]Landroid/os/Parcel;Landroid/os/Parcel;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/MonotonicClock;Lcom/android/internal/os/MonotonicClock;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;]Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;,Ljava/util/HashMap$EntryIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;,Ljava/util/HashMap$Node;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;,Ljava/util/HashMap$EntrySet; -HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->getCurrentBatteryUsageStats(Lcom/android/server/power/stats/BatteryStatsImpl;Landroid/os/BatteryUsageStatsQuery;J)Landroid/os/BatteryUsageStats;+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/BatteryUsageStatsProvider;Lcom/android/server/power/stats/BatteryUsageStatsProvider;]Lcom/android/server/power/stats/PowerCalculator;megamorphic_types]Lcom/android/server/power/stats/PowerStatsExporter;Lcom/android/server/power/stats/PowerStatsExporter;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->verify(Landroid/os/BatteryUsageStats;)V+]Landroid/os/BatteryUsageStats;Landroid/os/BatteryUsageStats;]Landroid/os/UidBatteryConsumer;Landroid/os/UidBatteryConsumer;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/power/stats/BluetoothPowerCalculator;->calculateApp(Landroid/os/UidBatteryConsumer$Builder;Lcom/android/server/power/stats/BluetoothPowerCalculator$PowerAndDuration;Landroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;]Lcom/android/server/power/stats/BluetoothPowerCalculator;Lcom/android/server/power/stats/BluetoothPowerCalculator; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateRpmStatsLocked(J)V+]Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->updateWifiBatteryStats(Landroid/os/connectivity/WifiActivityEnergyInfo;Ljava/util/List;JJJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;Lcom/android/server/power/stats/BatteryStatsImpl$NetworkStatsDelta;]Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/BatteryStatsImpl;->writeSummaryToParcel(Landroid/os/Parcel;Z)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/internal/os/MonotonicClock;Lcom/android/internal/os/MonotonicClock;]Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Lcom/android/server/power/stats/BatteryStatsImpl$Counter;Lcom/android/server/power/stats/BatteryStatsImpl$Counter;]Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2;,Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3;]Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Lcom/android/server/power/stats/BatteryStatsImpl$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer;,Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc;]Lcom/android/server/power/stats/BatteryStatsImpl$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/HashMap;Ljava/util/HashMap;]Ljava/util/Iterator;Landroid/util/MapCollections$MapIterator;,Ljava/util/HashMap$EntryIterator;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;,Ljava/util/HashMap$Node;]Ljava/util/Set;Landroid/util/MapCollections$EntrySet;,Ljava/util/HashMap$EntrySet; +HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->getCurrentBatteryUsageStats(Lcom/android/server/power/stats/BatteryStatsImpl;Landroid/os/BatteryUsageStatsQuery;J)Landroid/os/BatteryUsageStats;+]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/BatteryStatsImpl;Lcom/android/server/power/stats/BatteryStatsImpl;]Lcom/android/server/power/stats/PowerAttributor;Lcom/android/server/power/stats/processor/MultiStatePowerAttributor;]Lcom/android/server/power/stats/PowerCalculator;megamorphic_types]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/power/stats/BatteryUsageStatsProvider;->verify(Landroid/os/BatteryUsageStats;)V+]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/BluetoothPowerStatsCollector;->collectBluetoothActivityInfo()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/BluetoothPowerStatsCollector$BluetoothStatsRetriever;Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothStatsRetrieverImpl;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;]Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/power/stats/CpuPowerCalculator;->calculatePerCpuFreqPowerMah(IIJ)D+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator; -HSPLcom/android/server/power/stats/CpuPowerStatsProcessor;->estimateUidPowerConsumption(Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/CpuPowerStatsLayout;Lcom/android/server/power/stats/CpuPowerStatsLayout;]Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/PowerStatsLayout;Lcom/android/server/power/stats/CpuPowerStatsLayout;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/CpuPowerStatsCollector;->collectStats()Lcom/android/internal/os/PowerStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader;Lcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader;]Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;]Lcom/android/server/power/stats/format/CpuPowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout; +HSPLcom/android/server/power/stats/CpuPowerStatsCollector;->processUidStats(I[J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;]Lcom/android/server/power/stats/format/CpuPowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout; HSPLcom/android/server/power/stats/EnergyConsumerSnapshot;->updateAndGetDelta([Landroid/hardware/power/stats/EnergyConsumerResult;I)Lcom/android/server/power/stats/EnergyConsumerSnapshot$EnergyConsumerDeltaData;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray; HSPLcom/android/server/power/stats/KernelWakelockReader;->getWakelockStatsFromSystemSuspend(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Landroid/system/suspend/internal/ISuspendControlServiceInternal;Landroid/system/suspend/internal/ISuspendControlServiceInternal$Stub$Proxy;]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader; HSPLcom/android/server/power/stats/KernelWakelockReader;->readKernelWakelockStats(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader; HSPLcom/android/server/power/stats/KernelWakelockReader;->removeOldStats(Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Ljava/util/Collection;Ljava/util/HashMap$Values;]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;]Ljava/util/Iterator;Ljava/util/HashMap$ValueIterator; HSPLcom/android/server/power/stats/KernelWakelockReader;->updateWakelockStats([Landroid/system/suspend/internal/WakeLockInfo;Lcom/android/server/power/stats/KernelWakelockStats;)Lcom/android/server/power/stats/KernelWakelockStats;+]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats; -HPLcom/android/server/power/stats/MobileRadioPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/MobileRadioPowerCalculator;Lcom/android/server/power/stats/MobileRadioPowerCalculator;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/power/stats/MultiStateStats$Factory;->getSerialState([I)I+]Lcom/android/server/power/stats/MultiStateStats$Factory;Lcom/android/server/power/stats/MultiStateStats$Factory; -HSPLcom/android/server/power/stats/MultiStateStats$Factory;->setStateInComposite(III)I -HSPLcom/android/server/power/stats/MultiStateStats$States;->forEachTrackedStateCombination(Ljava/util/function/Consumer;[Lcom/android/server/power/stats/MultiStateStats$States;[II)V+]Ljava/util/function/Consumer;Lcom/android/server/power/stats/MultiStateStats$$ExternalSyntheticLambda0;,Lcom/android/server/power/stats/MultiStateStats$$ExternalSyntheticLambda1;,Lcom/android/server/power/stats/PowerStatsExporter$$ExternalSyntheticLambda1;,Lcom/android/server/power/stats/PowerStatsExporter$$ExternalSyntheticLambda2; -HSPLcom/android/server/power/stats/MultiStateStats;->getStats([J[I)V+]Lcom/android/server/power/stats/MultiStateStats$Factory;Lcom/android/server/power/stats/MultiStateStats$Factory; -HSPLcom/android/server/power/stats/MultiStateStats;->setState(IIJ)V+]Lcom/android/server/power/stats/MultiStateStats$Factory;Lcom/android/server/power/stats/MultiStateStats$Factory; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->addPowerStats(Lcom/android/internal/os/PowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/MultiStateStats;Lcom/android/server/power/stats/MultiStateStats; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->createUidStats(Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats$UidStats;J)V+]Lcom/android/server/power/stats/MultiStateStats$Factory;Lcom/android/server/power/stats/MultiStateStats$Factory;]Lcom/android/server/power/stats/MultiStateStats;Lcom/android/server/power/stats/MultiStateStats; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->getUidStats(I)Lcom/android/server/power/stats/PowerComponentAggregatedPowerStats$UidStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/MultiStateStats$States;Lcom/android/server/power/stats/MultiStateStats$States; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->getUidStats([JI[I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/MultiStateStats;Lcom/android/server/power/stats/MultiStateStats; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->setState(IIJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/MultiStateStats$States;Lcom/android/server/power/stats/MultiStateStats$States;]Lcom/android/server/power/stats/MultiStateStats;Lcom/android/server/power/stats/MultiStateStats; -HSPLcom/android/server/power/stats/PowerComponentAggregatedPowerStats;->setUidState(IIIJ)V+]Lcom/android/server/power/stats/MultiStateStats$States;Lcom/android/server/power/stats/MultiStateStats$States;]Lcom/android/server/power/stats/MultiStateStats;Lcom/android/server/power/stats/MultiStateStats; -HSPLcom/android/server/power/stats/PowerStatsAggregator;->aggregatePowerStats(JJLjava/util/function/Consumer;)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/BatteryStatsHistoryIterator;Lcom/android/internal/os/BatteryStatsHistoryIterator;]Lcom/android/server/power/stats/AggregatedPowerStats;Lcom/android/server/power/stats/AggregatedPowerStats;]Ljava/util/function/Consumer;Lcom/android/server/power/stats/PowerStatsExporter$$ExternalSyntheticLambda0;,Lcom/android/server/power/stats/PowerStatsScheduler$$ExternalSyntheticLambda2; +HSPLcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;->collectConsumedEnergy(Lcom/android/internal/os/PowerStats;Lcom/android/server/power/stats/format/PowerStatsLayout;)Z+]Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyRetriever;Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyRetrieverImpl; +HSPLcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;->populatePowerStats(Lcom/android/internal/os/PowerStats;Lcom/android/server/power/stats/format/PowerStatsLayout;[Landroid/hardware/power/stats/EnergyConsumerResult;II)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;]Lcom/android/server/power/stats/format/PowerStatsLayout;megamorphic_types HSPLcom/android/server/power/stats/PowerStatsUidResolver;->mapUid(I)I+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HPLcom/android/server/power/stats/UsageBasedPowerEstimator;->calculatePower(J)D -HPLcom/android/server/power/stats/WifiPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/os/AggregateBatteryConsumer$Builder;Landroid/os/AggregateBatteryConsumer$Builder;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Landroid/os/BatteryStats;Lcom/android/server/power/stats/BatteryStatsImpl;]Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryUsageStats$Builder;]Landroid/os/BatteryUsageStatsQuery;Landroid/os/BatteryUsageStatsQuery;]Landroid/os/UidBatteryConsumer$Builder;Landroid/os/UidBatteryConsumer$Builder;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/WifiPowerCalculator;Lcom/android/server/power/stats/WifiPowerCalculator; -HPLcom/android/server/power/stats/WifiPowerCalculator;->calculateApp(Lcom/android/server/power/stats/WifiPowerCalculator$PowerDurationAndTraffic;Landroid/os/BatteryStats$Uid;IJIZJ)V+]Landroid/os/BatteryStats$ControllerActivityCounter;Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl;]Landroid/os/BatteryStats$LongCounter;Lcom/android/server/power/stats/BatteryStatsImpl$1;,Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/WifiPowerCalculator;Lcom/android/server/power/stats/WifiPowerCalculator; -HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;->parseWakeup(Ljava/lang/String;JJLcom/android/server/power/stats/wakeups/IrqDeviceMap;)Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/power/stats/wakeups/IrqDeviceMap;Lcom/android/server/power/stats/wakeups/IrqDeviceMap;]Ljava/lang/String;Ljava/lang/String;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList;]Ljava/util/regex/Matcher;Ljava/util/regex/Matcher;]Ljava/util/regex/Pattern;Ljava/util/regex/Pattern; +HSPLcom/android/server/power/stats/ScreenPowerStatsCollector;->collectStats()Lcom/android/internal/os/PowerStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/Clock;Lcom/android/internal/os/Clock$1;]Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;Lcom/android/server/power/stats/PowerStatsCollector$ConsumedEnergyHelper;]Lcom/android/server/power/stats/ScreenPowerStatsCollector$ScreenUsageTimeRetriever;Lcom/android/server/power/stats/BatteryStatsImpl$2;]Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;Lcom/android/server/power/stats/format/ScreenPowerStatsLayout; +HSPLcom/android/server/power/stats/UsageBasedPowerEstimator;->calculatePower(J)D +HPLcom/android/server/power/stats/WakelockPowerCalculator;->calculate(Landroid/os/BatteryUsageStats$Builder;Landroid/os/BatteryStats;JJLandroid/os/BatteryUsageStatsQuery;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/power/stats/WakelockPowerCalculator;->calculateApp(Lcom/android/server/power/stats/WakelockPowerCalculator$PowerAndDuration;Landroid/os/BatteryStats$Uid;JI)V+]Landroid/os/BatteryStats$Timer;Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer;]Landroid/os/BatteryStats$Uid$Wakelock;Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock;]Landroid/os/BatteryStats$Uid;Lcom/android/server/power/stats/BatteryStatsImpl$Uid;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator; +HSPLcom/android/server/power/stats/format/BluetoothPowerStatsLayout;->getUidRxBytes([J)J +HSPLcom/android/server/power/stats/format/CpuPowerStatsLayout;->getCpuPowerBracketCount()I +HSPLcom/android/server/power/stats/format/CpuPowerStatsLayout;->getTimeByScalingStep([JI)J +HSPLcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;->getUidRxPackets([J)J +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->()V +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->(Lcom/android/internal/os/PowerStats$Descriptor;)V +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->getUidConsumedEnergy([JI)J +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->getUidUsageDuration([J)J +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->setUidPowerEstimate([JD)V +HSPLcom/android/server/power/stats/format/PowerStatsLayout;->toExtras(Landroid/os/PersistableBundle;)V +HSPLcom/android/server/power/stats/format/ScreenPowerStatsLayout;->(Lcom/android/internal/os/PowerStats$Descriptor;)V +HSPLcom/android/server/power/stats/format/WifiPowerStatsLayout;->getUidRxPackets([J)J +HSPLcom/android/server/power/stats/format/WifiPowerStatsLayout;->getUidTxPackets([J)J +HSPLcom/android/server/power/stats/processor/AggregatedPowerStats;->addPowerStats(Lcom/android/internal/os/PowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HPLcom/android/server/power/stats/processor/AggregatedPowerStats;->getPowerComponentStats()Ljava/util/List;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStats;->noteStateChange(Landroid/os/BatteryStats$HistoryItem;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStats;->reset()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStats;->setUidState(IIIJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;->getDeviceStateConfig()[Lcom/android/server/power/stats/processor/MultiStateStats$States; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;->getUidStateConfig()[Lcom/android/server/power/stats/processor/MultiStateStats$States; +HSPLcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;->isTracked([II)Z +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->combineDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout;,Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Z)V+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout;,Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->computeUidActivityTotals(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Ljava/util/List;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout;,Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Ljava/util/List;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout;,Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;megamorphic_types]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->flushPowerStats(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->noteStateChange(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Landroid/os/BatteryStats$HistoryItem;)V+]Lcom/android/server/power/stats/PowerStatsUidResolver;Lcom/android/server/power/stats/PowerStatsUidResolver;]Lcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;megamorphic_types +HSPLcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor;->recordUsageDuration(Lcom/android/internal/os/PowerStats;IJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout;,Lcom/android/server/power/stats/format/GnssPowerStatsLayout; +HSPLcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor;->combineDeviceStateEstimates()V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;[ILcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor$Intermediates;)V+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor;->computeUidActivityTotals(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CpuPowerStatsProcessor;->adjustEstimatesUsingEnergyConsumers(Lcom/android/server/power/stats/processor/CpuPowerStatsProcessor$Intermediates;Lcom/android/server/power/stats/processor/CpuPowerStatsProcessor$DeviceStatsIntermediates;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout; +HSPLcom/android/server/power/stats/processor/CpuPowerStatsProcessor;->combineDeviceStateEstimates()V+]Lcom/android/server/power/stats/format/CpuPowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CpuPowerStatsProcessor;->computeTotals(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/CpuPowerStatsProcessor$Intermediates;)V+]Lcom/android/server/power/stats/format/CpuPowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CpuPowerStatsProcessor;->estimatePowerByScalingStep(Lcom/android/server/power/stats/processor/CpuPowerStatsProcessor$Intermediates;)V +HSPLcom/android/server/power/stats/processor/CpuPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/format/CpuPowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/CpuPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/EnergyConsumerPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Ljava/util/List;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/EnergyConsumerPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/CustomEnergyConsumerPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/GnssPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Z)V+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/GnssPowerStatsLayout;Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/GnssPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/GnssPowerStatsProcessor;->noteStateChange(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Landroid/os/BatteryStats$HistoryItem;)V +HSPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->combineDeviceStateEstimates()V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;[ILcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor$Intermediates;)V+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->computeUidRxTxTotals(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor;->lambda$computeDevicePowerEstimates$0(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;[ILcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor$Intermediates;I)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/MultiStateStats$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/power/stats/processor/MultiStateStats$Factory;->(I[Lcom/android/server/power/stats/processor/MultiStateStats$States;)V +HSPLcom/android/server/power/stats/processor/MultiStateStats$Factory;->create()Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/MultiStateStats$Factory;->getSerialState([I)I+]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory; +HSPLcom/android/server/power/stats/processor/MultiStateStats$Factory;->isValidCompositeState(I)Z +HSPLcom/android/server/power/stats/processor/MultiStateStats$Factory;->setStateInComposite(III)I +HSPLcom/android/server/power/stats/processor/MultiStateStats$States;->(Ljava/lang/String;Z[Ljava/lang/String;)V +HSPLcom/android/server/power/stats/processor/MultiStateStats$States;->forEachTrackedStateCombination(Ljava/util/function/Consumer;[Lcom/android/server/power/stats/processor/MultiStateStats$States;[II)V+]Ljava/util/function/Consumer;megamorphic_types +HSPLcom/android/server/power/stats/processor/MultiStateStats$States;->getLabels()[Ljava/lang/String; +HSPLcom/android/server/power/stats/processor/MultiStateStats$States;->isTracked()Z +HSPLcom/android/server/power/stats/processor/MultiStateStats;->(Lcom/android/server/power/stats/processor/MultiStateStats$Factory;I)V +HSPLcom/android/server/power/stats/processor/MultiStateStats;->getStats([J[I)V+]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory; +HSPLcom/android/server/power/stats/processor/MultiStateStats;->increment([JJ)V +HSPLcom/android/server/power/stats/processor/MultiStateStats;->setState(IIJ)V+]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory; +HSPLcom/android/server/power/stats/processor/MultiStateStats;->setStats([I[J)V+]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory; +HSPLcom/android/server/power/stats/processor/MultiStateStats;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;)V +HSPLcom/android/server/power/stats/processor/MultiStateStats;->writeXmlForStates(Lcom/android/modules/utils/TypedXmlSerializer;[I[J)V+]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->addProcessedPowerStats(Lcom/android/internal/os/PowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->collectUids(Ljava/util/Collection;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Collection;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->createDeviceStats(J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->createUidStats(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats$UidStats;J)V+]Lcom/android/server/power/stats/processor/MultiStateStats$Factory;Lcom/android/server/power/stats/processor/MultiStateStats$Factory;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->getDeviceStats([J[I)Z+]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->getUidStats(I)Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats$UidStats;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->getUidStats([JI[I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->noteStateChange(Landroid/os/BatteryStats$HistoryItem;)V+]Lcom/android/server/power/stats/processor/PowerStatsProcessor;megamorphic_types +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->reset()V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->setDeviceStats([I[J)V+]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->setState(IIJ)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->setUidState(IIIJ)V+]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->setUidStats(I[I[J)V+]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;->writeXml(Lcom/android/modules/utils/TypedXmlSerializer;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/PowerStats$Descriptor;Lcom/android/internal/os/PowerStats$Descriptor;]Lcom/android/modules/utils/TypedXmlSerializer;Lcom/android/internal/util/ArtBinaryXmlSerializer;]Lcom/android/server/power/stats/processor/MultiStateStats;Lcom/android/server/power/stats/processor/MultiStateStats; +HSPLcom/android/server/power/stats/processor/PowerStatsAggregator;->aggregatePowerStats(Lcom/android/internal/os/BatteryStatsHistory;JJLjava/util/function/Consumer;)V+]Lcom/android/internal/os/BatteryStatsHistory;Lcom/android/internal/os/BatteryStatsHistory;]Lcom/android/internal/os/BatteryStatsHistoryIterator;Lcom/android/internal/os/BatteryStatsHistoryIterator;]Lcom/android/server/power/stats/processor/AggregatedPowerStats;Lcom/android/server/power/stats/processor/AggregatedPowerStats;]Ljava/util/function/Consumer;Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda15;,Lcom/android/server/power/stats/processor/PowerStatsExporter$$ExternalSyntheticLambda0; +HPLcom/android/server/power/stats/processor/PowerStatsExporter$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V +HPLcom/android/server/power/stats/processor/PowerStatsExporter$$ExternalSyntheticLambda2;->accept(Ljava/lang/Object;)V +HPLcom/android/server/power/stats/processor/PowerStatsExporter;->areMatchingStates([III)Z +HPLcom/android/server/power/stats/processor/PowerStatsExporter;->populateBatteryConsumers(Landroid/os/BatteryUsageStats$Builder;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/format/PowerStatsLayout;)V+]Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HPLcom/android/server/power/stats/processor/PowerStatsExporter;->populateBatteryUsageStatsBuilder(Landroid/os/BatteryUsageStats$Builder;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;)V+]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HPLcom/android/server/power/stats/processor/PowerStatsExporter;->populateUidBatteryConsumers(Landroid/os/BatteryUsageStats$Builder;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/format/PowerStatsLayout;Ljava/util/List;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;[JZII)V+]Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;->addUidStateEstimations()V+]Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;->getCombinedDeviceStateEstimate([Lcom/android/server/power/stats/processor/MultiStateStats$States;[I)Lcom/android/server/power/stats/processor/PowerStatsProcessor$CombinedDeviceStateEstimate;+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;->getUidStateEstimate(Lcom/android/server/power/stats/processor/PowerStatsProcessor$CombinedDeviceStateEstimate;)Lcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;->resetIntermediates()V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor;->concatLabels([Lcom/android/server/power/stats/processor/MultiStateStats$States;[I)Ljava/lang/String;+]Lcom/android/server/power/stats/processor/MultiStateStats$States;Lcom/android/server/power/stats/processor/MultiStateStats$States; +HSPLcom/android/server/power/stats/processor/PowerStatsProcessor;->noteStateChange(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Landroid/os/BatteryStats$HistoryItem;)V +HSPLcom/android/server/power/stats/processor/ScreenPowerStatsProcessor;->combineDeviceStateEstimates()V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/ScreenPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;]Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/ScreenPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Ljava/util/List;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;]Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;Lcom/android/server/power/stats/format/ScreenPowerStatsLayout;]Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/ScreenPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan; +HSPLcom/android/server/power/stats/processor/ScreenPowerStatsProcessor;->unpackPowerStatsDescriptor(Lcom/android/internal/os/PowerStats$Descriptor;)Z+]Lcom/android/internal/os/PowerStats$Descriptor;Lcom/android/internal/os/PowerStats$Descriptor; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/SensorPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Ljava/util/List;)V+]Landroid/hardware/SensorManager;Landroid/hardware/SystemSensorManager;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/SensorPowerStatsLayout;]Lcom/android/server/power/stats/format/SensorPowerStatsLayout;Lcom/android/server/power/stats/format/SensorPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$UnmodifiableRandomAccessList; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor;Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->flushPowerStats(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->noteStateChange(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Landroid/os/BatteryStats$HistoryItem;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor;Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor; +HSPLcom/android/server/power/stats/processor/SensorPowerStatsProcessor;->recordUsageDuration(Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor$SensorState;J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/power/stats/format/SensorPowerStatsLayout;Lcom/android/server/power/stats/format/SensorPowerStatsLayout; +HSPLcom/android/server/power/stats/processor/WifiPowerStatsProcessor;->combineDeviceStateEstimates()V+]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/WifiPowerStatsProcessor;->computeDevicePowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;[ILcom/android/server/power/stats/processor/WifiPowerStatsProcessor$Intermediates;)V+]Lcom/android/server/power/stats/UsageBasedPowerEstimator;Lcom/android/server/power/stats/UsageBasedPowerEstimator;]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/format/WifiPowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats; +HSPLcom/android/server/power/stats/processor/WifiPowerStatsProcessor;->computeUidActivityTotals(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/WifiPowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/WifiPowerStatsProcessor;->computeUidPowerEstimates(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;ILcom/android/server/power/stats/processor/PowerStatsProcessor$UidStateEstimate;)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/format/WifiPowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/power/stats/processor/WifiPowerStatsProcessor;->finish(Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;J)V+]Lcom/android/server/power/stats/format/PowerStatsLayout;Lcom/android/server/power/stats/format/WifiPowerStatsLayout;]Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;Lcom/android/server/power/stats/processor/PowerComponentAggregatedPowerStats;]Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;Lcom/android/server/power/stats/processor/PowerStatsProcessor$PowerEstimationPlan;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;->parseWakeup(Ljava/lang/String;JJLcom/android/server/power/stats/wakeups/IrqDeviceMap;)Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;+]Lcom/android/server/power/stats/wakeups/IrqDeviceMap;Lcom/android/server/power/stats/wakeups/IrqDeviceMap;]Ljava/util/List;Ljava/util/Collections$UnmodifiableRandomAccessList; HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;->recordActivity(IJLandroid/util/SparseIntArray;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/util/function/LongSupplier;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$$ExternalSyntheticLambda0; -HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionFor(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory; +HPLcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;->removeBetween(IJJ)Landroid/util/SparseIntArray;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionFor(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray; HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->attemptAttributionWith(IJLandroid/util/SparseIntArray;)Z+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->logWakeupAttribution(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Ljava/lang/String;Ljava/lang/String;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->logWakeupAttribution(Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Wakeup;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteUidProcessState(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteWakingActivity(IJ[I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory;]Lcom/android/server/power/stats/wakeups/CpuWakeupStats;Lcom/android/server/power/stats/wakeups/CpuWakeupStats; +HPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteWakeupTimeAndReason(JJLjava/lang/String;)V+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; +HSPLcom/android/server/power/stats/wakeups/CpuWakeupStats;->noteWakingActivity(IJ[I)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HPLcom/android/server/powerstats/BatteryTrigger$1;->onReceive(Landroid/content/Context;Landroid/content/Intent;)V+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;->get()Ljava/lang/Object;+]Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache;Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache; HSPLcom/android/server/powerstats/PowerStatsService;->getHandler()Landroid/os/Handler; HPLcom/android/server/powerstats/StatsPullAtomCallbackImpl;->pullOnDevicePowerMeasurement(ILjava/util/List;)I+]Landroid/power/PowerStatsInternal;Lcom/android/server/powerstats/PowerStatsService$LocalService;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map;Ljava/util/HashMap;]Ljava/util/concurrent/CompletableFuture;Ljava/util/concurrent/CompletableFuture; -HPLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->addPath(Ljava/util/List;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/slice/DirtyTracker;Lcom/android/server/slice/SliceClientPermissions;]Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;Lcom/android/server/slice/SliceClientPermissions$SliceAuthority;]Ljava/util/List;Landroid/net/Uri$PathSegments; +HPLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->addPath(Ljava/util/List;)V+]Lcom/android/server/slice/DirtyTracker;Lcom/android/server/slice/SliceClientPermissions;]Ljava/util/List;Landroid/net/Uri$PathSegments; HPLcom/android/server/slice/SliceClientPermissions$SliceAuthority;->isPathPrefixMatch([Ljava/lang/String;[Ljava/lang/String;)Z HPLcom/android/server/slice/SliceManagerService;->getProviderPkg(Landroid/net/Uri;I)Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri; -HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->equals(Ljava/lang/Object;)Z+]Ljava/lang/Object;Lcom/android/server/slice/SlicePermissionManager$PkgUser;,Ljava/lang/Class; -HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->hashCode()I+]Ljava/lang/Object;Ljava/lang/String; +HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->equals(Ljava/lang/Object;)Z +HPLcom/android/server/slice/SlicePermissionManager$PkgUser;->hashCode()I HPLcom/android/server/slice/SlicePermissionManager;->grantSliceAccess(Ljava/lang/String;ILjava/lang/String;ILandroid/net/Uri;)V+]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;]Lcom/android/server/slice/SliceClientPermissions;Lcom/android/server/slice/SliceClientPermissions;]Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;Lcom/android/server/slice/SliceProviderPermissions$SliceAuthority;]Lcom/android/server/slice/SliceProviderPermissions;Lcom/android/server/slice/SliceProviderPermissions; HSPLcom/android/server/smartspace/SmartspaceManagerService$SmartspaceManagerStub;->runForUserLocked(Ljava/lang/String;Landroid/app/smartspace/SmartspaceSessionId;Ljava/util/function/Consumer;)V+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Lcom/android/server/infra/ServiceNameResolver;Lcom/android/server/infra/FrameworkResourcesServiceNameResolver;]Lcom/android/server/wm/ActivityTaskManagerInternal;Lcom/android/server/wm/ActivityTaskManagerService$LocalService;]Ljava/util/function/Consumer;megamorphic_types HSPLcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;->noteUidProcessState(IIJJ)V -HPLcom/android/server/stats/pull/ProcfsMemoryUtil;->readMemorySnapshotFromProcfs(I)Lcom/android/server/stats/pull/ProcfsMemoryUtil$MemorySnapshot;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda16;->onUidCpuTime(ILjava/lang/Object;)V -HPLcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomCallbackImpl;->onPullAtom(ILjava/util/List;)I+]Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;]Lcom/android/server/stats/pull/StatsPullAtomService;Lcom/android/server/stats/pull/StatsPullAtomService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/stats/pull/ProcfsMemoryUtil;->readMemorySnapshotFromProcfs(I)Lcom/android/server/stats/pull/ProcfsMemoryUtil$MemorySnapshot; +HPLcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomCallbackImpl;->onPullAtom(ILjava/util/List;)I+]Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;]Lcom/android/server/stats/pull/StatsPullAtomService;Lcom/android/server/stats/pull/StatsPullAtomService; HSPLcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomServiceInternalImpl;->noteUidProcessState(II)V+]Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller;Lcom/android/server/stats/pull/AggregatedMobileDataStatsPuller; -HPLcom/android/server/stats/pull/StatsPullAtomService;->addNetworkStats(ILjava/util/List;Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)V+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/stats/pull/StatsPullAtomService;->collectNetworkStatsSnapshotForAtom(I)Ljava/util/List;+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; -HSPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSnapshotForTemplate(Landroid/net/NetworkTemplate;Z)Landroid/net/NetworkStats;+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/content/Context;Landroid/app/ContextImpl; -HPLcom/android/server/stats/pull/StatsPullAtomService;->lambda$pullCpuCyclesPerUidClusterLocked$13(Landroid/util/SparseArray;I[I[J[DI[J)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HPLcom/android/server/stats/pull/StatsPullAtomService;->pullCpuCyclesPerUidClusterLocked(ILjava/util/List;)I+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Lcom/android/internal/os/PowerProfile;Lcom/android/internal/os/PowerProfile;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/stats/pull/StatsPullAtomService;->pullDataBytesTransferLocked(ILjava/util/List;)I+]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Lcom/android/server/stats/pull/StatsPullAtomService;Lcom/android/server/stats/pull/StatsPullAtomService;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;,Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/stats/pull/StatsPullAtomService;->getUidNetworkStatsSnapshotForTemplateLocked(Landroid/net/NetworkTemplate;Z)Landroid/net/NetworkStats;+]Landroid/app/usage/NetworkStatsManager;Landroid/app/usage/NetworkStatsManager;]Landroid/content/Context;Landroid/app/ContextImpl; +HPLcom/android/server/stats/pull/StatsPullAtomService;->pullCpuCyclesPerUidClusterLocked(ILjava/util/List;)I+]Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;Lcom/android/internal/os/KernelCpuUidTimeReader$KernelCpuUidFreqTimeReader;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/stats/pull/StatsPullAtomService;->pullDataBytesTransferLocked(ILjava/util/List;)I+]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/stats/pull/StatsPullAtomService;->pullKernelWakelockLocked(ILjava/util/List;)I+]Lcom/android/server/power/stats/KernelWakelockReader;Lcom/android/server/power/stats/KernelWakelockReader;]Ljava/util/HashMap;Lcom/android/server/power/stats/KernelWakelockStats;]Ljava/util/Iterator;Ljava/util/HashMap$EntryIterator;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/Map$Entry;Ljava/util/HashMap$Node;]Ljava/util/Set;Ljava/util/HashMap$EntrySet; -HPLcom/android/server/stats/pull/StatsPullAtomService;->pullModemActivityInfoLocked(ILjava/util/List;)I+]Landroid/telephony/TelephonyManager;Landroid/telephony/TelephonyManager;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/stats/pull/StatsPullAtomService;->removeEmptyEntries(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry;]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/Iterator;Landroid/net/NetworkStats$1; -HSPLcom/android/server/stats/pull/StatsPullAtomService;->sliceNetworkStats(Landroid/net/NetworkStats;Ljava/util/function/Function;)Landroid/net/NetworkStats;+]Landroid/net/NetworkStats;Landroid/net/NetworkStats;]Ljava/util/Iterator;Landroid/net/NetworkStats$1;]Ljava/util/function/Function;Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda2;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda3;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda4;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda5; +HPLcom/android/server/stats/pull/StatsPullAtomService;->pullModemActivityInfoLocked(ILjava/util/List;)I +HPLcom/android/server/stats/pull/StatsPullAtomService;->pullProcessMemorySnapshot(ILjava/util/List;)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/stats/pull/StatsPullAtomService;->removeEmptyEntries(Landroid/net/NetworkStats;)Landroid/net/NetworkStats;+]Landroid/net/NetworkStats$Entry;Landroid/net/NetworkStats$Entry; +HSPLcom/android/server/stats/pull/StatsPullAtomService;->sliceNetworkStats(Landroid/net/NetworkStats;Ljava/util/function/Function;)Landroid/net/NetworkStats;+]Ljava/util/function/Function;Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda2;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda3;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda4;,Lcom/android/server/stats/pull/StatsPullAtomService$$ExternalSyntheticLambda5; HSPLcom/android/server/stats/pull/netstats/NetworkStatsExt;->(Landroid/net/NetworkStats;[IZZZILcom/android/server/stats/pull/netstats/SubInfo;IZ)V HPLcom/android/server/stats/pull/netstats/NetworkStatsExt;->hasSameSlicing(Lcom/android/server/stats/pull/netstats/NetworkStatsExt;)Z -HPLcom/android/server/statusbar/StatusBarManagerService$1;->setTopAppHidesStatusBar(Z)V+]Lcom/android/internal/statusbar/IStatusBar;Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy; -HPLcom/android/server/storage/CacheQuotaStrategy;->getUnfulfilledRequests()Ljava/util/List;+]Landroid/app/usage/CacheQuotaHint$Builder;Landroid/app/usage/CacheQuotaHint$Builder;]Landroid/app/usage/UsageStats;Landroid/app/usage/UsageStats;]Landroid/app/usage/UsageStatsManagerInternal;Lcom/android/server/usage/UsageStatsService$LocalService;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/os/UserManager;Landroid/os/UserManager;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/timedetector/TimeDetectorService;->latestNetworkTime()Landroid/app/time/UnixEpochTime;+]Lcom/android/server/timedetector/NetworkTimeSuggestion;Lcom/android/server/timedetector/NetworkTimeSuggestion;]Lcom/android/server/timedetector/TimeDetectorStrategy;Lcom/android/server/timedetector/TimeDetectorStrategyImpl; -HSPLcom/android/server/timezonedetector/ReferenceWithHistory;->get()Ljava/lang/Object;+]Landroid/os/TimestampedValue;Landroid/os/TimestampedValue;]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/stats/pull/netstats/NetworkStatsUtils;->fromBucket(Landroid/app/usage/NetworkStats$Bucket;)Landroid/net/NetworkStats$Entry;+]Landroid/app/usage/NetworkStats$Bucket;Landroid/app/usage/NetworkStats$Bucket; +HSPLcom/android/server/stats/pull/netstats/NetworkStatsUtils;->fromPublicNetworkStats(Landroid/app/usage/NetworkStats;)Landroid/net/NetworkStats; +HPLcom/android/server/statusbar/StatusBarManagerService$1;->setTopAppHidesStatusBar(IZ)V+]Lcom/android/internal/statusbar/IStatusBar;Lcom/android/internal/statusbar/IStatusBar$Stub$Proxy; +HSPLcom/android/server/timedetector/TimeDetectorService;->latestNetworkTime()Landroid/app/time/UnixEpochTime;+]Lcom/android/server/timedetector/TimeDetectorStrategy;Lcom/android/server/timedetector/TimeDetectorStrategyImpl; +HSPLcom/android/server/timedetector/TimeDetectorStrategyImpl;->getLatestNetworkSuggestion()Lcom/android/server/timedetector/NetworkTimeSuggestion; +HSPLcom/android/server/timezonedetector/ReferenceWithHistory;->get()Ljava/lang/Object;+]Ljava/util/ArrayDeque;Ljava/util/ArrayDeque; +HSPLcom/android/server/trust/TrustManagerService$3;->isDeviceLocked(II)Z+]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils;]Lcom/android/server/trust/TrustManagerService;Lcom/android/server/trust/TrustManagerService; +HSPLcom/android/server/trust/TrustManagerService$3;->isDeviceSecure(II)Z+]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils; HSPLcom/android/server/trust/TrustManagerService;->refreshAgentList(I)V+]Landroid/app/ActivityManager;Landroid/app/ActivityManager;]Landroid/app/admin/DevicePolicyManager;Landroid/app/admin/DevicePolicyManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/ResolveInfo;Landroid/content/pm/ResolveInfo;]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager;]Lcom/android/internal/widget/LockPatternUtils$StrongAuthTracker;Lcom/android/server/trust/TrustManagerService$StrongAuthTracker;]Lcom/android/internal/widget/LockPatternUtils;Lcom/android/internal/widget/LockPatternUtils;]Lcom/android/server/trust/TrustAgentWrapper;Lcom/android/server/trust/TrustAgentWrapper;]Lcom/android/server/trust/TrustManagerService$StrongAuthTracker;Lcom/android/server/trust/TrustManagerService$StrongAuthTracker;]Lcom/android/server/trust/TrustManagerService;Lcom/android/server/trust/TrustManagerService;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Landroid/os/UserManager;Landroid/os/UserManager; -HSPLcom/android/server/uri/GrantUri;->(ILandroid/net/Uri;I)V -HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->checkGrantUriPermissionFromIntent(Landroid/content/Intent;ILjava/lang/String;I)Lcom/android/server/uri/NeededUriGrants;+]Lcom/android/server/uri/UriGrantsManagerService$LocalService;Lcom/android/server/uri/UriGrantsManagerService$LocalService; -HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->internalCheckGrantUriPermissionFromIntent(Landroid/content/Intent;ILjava/lang/String;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/Intent;Landroid/content/Intent; -HSPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionFromIntentUnlocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/uri/NeededUriGrants;ILjava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/ClipData$Item;Landroid/content/ClipData$Item;]Landroid/content/ClipData;Landroid/content/ClipData;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService; -HPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionUnlocked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;II)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/os/PatternMatcher;Landroid/os/PatternMatcher;]Lcom/android/server/uri/UriGrantsManagerService;Lcom/android/server/uri/UriGrantsManagerService; -HSPLcom/android/server/uri/UriGrantsManagerService;->enforceRequireContentUriPermissionFromCallerOnIntentExtraStream(Landroid/content/Intent;IIILjava/lang/Integer;)V+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/usage/AppIdleHistory;->getAppStandbyBucket(Ljava/lang/String;IJ)I+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; +HSPLcom/android/server/trust/TrustManagerService;->resolveProfileParent(I)I+]Landroid/content/pm/UserInfo;Landroid/content/pm/UserInfo;]Landroid/os/UserManager;Landroid/os/UserManager; +HSPLcom/android/server/twilight/TwilightService$1;->unregisterListener(Lcom/android/server/twilight/TwilightListener;)V +HPLcom/android/server/uri/GrantUri;->(ILandroid/net/Uri;I)V +HSPLcom/android/server/uri/UriGrantsManagerService$LocalService;->internalCheckGrantUriPermissionFromIntent(Landroid/content/Intent;ILjava/lang/String;ILjava/lang/Integer;Ljava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionFromIntentUnlocked(ILjava/lang/String;Landroid/content/Intent;ILcom/android/server/uri/NeededUriGrants;ILjava/lang/Integer;Ljava/lang/Integer;)Lcom/android/server/uri/NeededUriGrants;+]Landroid/content/ClipData$Item;Landroid/content/ClipData$Item;]Landroid/content/ClipData;Landroid/content/ClipData;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; +HPLcom/android/server/uri/UriGrantsManagerService;->checkGrantUriPermissionUnlocked(ILjava/lang/String;Lcom/android/server/uri/GrantUri;II)I+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/content/pm/PathPermission;Landroid/content/pm/PathPermission;]Landroid/net/Uri;Landroid/net/Uri$HierarchicalUri;,Landroid/net/Uri$StringUri;]Landroid/os/PatternMatcher;Landroid/os/PatternMatcher; +HSPLcom/android/server/uri/UriGrantsManagerService;->enforceRequireContentUriPermissionFromCallerOnIntentExtraStreamUnlocked(Landroid/content/Intent;IIILjava/lang/Integer;Ljava/lang/Integer;)V+]Landroid/content/Intent;Landroid/content/Intent;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/usage/AppIdleHistory;->getAppStandbyBucket(Ljava/lang/String;IJ)I HSPLcom/android/server/usage/AppIdleHistory;->getElapsedTime(J)J -HSPLcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;JZ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; -HSPLcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; +HSPLcom/android/server/usage/AppIdleHistory;->getPackageHistory(Landroid/util/ArrayMap;Ljava/lang/String;JZ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory; +HSPLcom/android/server/usage/AppIdleHistory;->getUserHistory(I)Landroid/util/ArrayMap;+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/usage/AppIdleHistory;->isIdle(Ljava/lang/String;IJ)Z HSPLcom/android/server/usage/AppIdleHistory;->readAppIdleTimes(ILandroid/util/ArrayMap;)V -HPLcom/android/server/usage/AppIdleHistory;->removeElapsedExpiryTimes(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;J)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray; HPLcom/android/server/usage/AppIdleHistory;->reportUsage(Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;Ljava/lang/String;IIIJJ)Lcom/android/server/usage/AppIdleHistory$AppUsageHistory;+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; -HSPLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJIIZ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; +HPLcom/android/server/usage/AppIdleHistory;->setAppStandbyBucket(Ljava/lang/String;IJIIZ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; HSPLcom/android/server/usage/AppIdleHistory;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; -HSPLcom/android/server/usage/AppIdleHistory;->shouldInformListeners(Ljava/lang/String;IJI)Z -HPLcom/android/server/usage/AppIdleHistory;->writeAppIdleTimes(IJ)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/AtomicFile;Landroid/util/AtomicFile;]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/internal/util/jobs/FastXmlSerializer;Lcom/android/internal/util/jobs/FastXmlSerializer;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Ljava/nio/charset/Charset;Lcom/android/icu/charset/CharsetICU; +HPLcom/android/server/usage/AppIdleHistory;->shouldInformListeners(Ljava/lang/String;IJI)Z +HPLcom/android/server/usage/AppIdleHistory;->writeAppIdleTimes(IJ)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; HSPLcom/android/server/usage/AppStandbyController$AppStandbyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController; -HSPLcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;->obtain(Ljava/lang/String;Ljava/lang/String;I)Lcom/android/server/usage/AppStandbyController$ContentProviderUsageRecord;+]Lcom/android/server/usage/AppStandbyController$Pool;Lcom/android/server/usage/AppStandbyController$Pool; HSPLcom/android/server/usage/AppStandbyController$Injector;->getActiveNetworkScorer()Ljava/lang/String;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/net/NetworkScoreManager;Landroid/net/NetworkScoreManager; HPLcom/android/server/usage/AppStandbyController$Injector;->getValidCrossProfileTargets(Ljava/lang/String;I)Ljava/util/List;+]Landroid/content/pm/CrossProfileAppsInternal;Lcom/android/server/pm/CrossProfileAppsServiceImpl$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/pm/pkg/AndroidPackage;Lcom/android/internal/pm/parsing/pkg/PackageImpl; -HSPLcom/android/server/usage/AppStandbyController$Injector;->isNonIdleWhitelisted(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/usage/AppStandbyController$Injector;->isWellbeingPackage(Ljava/lang/String;)Z -HSPLcom/android/server/usage/AppStandbyController$Injector;->shouldGetExactAlarmBucketElevation(Ljava/lang/String;I)Z+]Lcom/android/server/AlarmManagerInternal;Lcom/android/server/alarm/AlarmManagerService$LocalService; -HSPLcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;->obtain(Ljava/lang/String;IIIZ)Lcom/android/server/usage/AppStandbyController$StandbyUpdateRecord;+]Lcom/android/server/usage/AppStandbyController$Pool;Lcom/android/server/usage/AppStandbyController$Pool; -HSPLcom/android/server/usage/AppStandbyController;->checkAndUpdateStandbyState(Ljava/lang/String;IIJ)V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController; -HSPLcom/android/server/usage/AppStandbyController;->checkIdleStates(I)Z+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/usage/AppStandbyController;->getAppMinBucket(Ljava/lang/String;II)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/usage/AppStandbyController$Injector;->isNonIdleWhitelisted(Ljava/lang/String;)Z +HPLcom/android/server/usage/AppStandbyController;->checkAndUpdateStandbyState(Ljava/lang/String;IIJ)V+]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector; +HSPLcom/android/server/usage/AppStandbyController;->getAppMinBucket(Ljava/lang/String;II)I+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/usage/AppStandbyController;->getAppStandbyBucket(Ljava/lang/String;IJZ)I+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; -HPLcom/android/server/usage/AppStandbyController;->getCrossProfileTargets(Ljava/lang/String;I)Ljava/util/List;+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector; -HSPLcom/android/server/usage/AppStandbyController;->informListeners(Ljava/lang/String;IIIZ)V+]Lcom/android/server/usage/AppStandbyInternal$AppIdleStateChangeListener;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr; HSPLcom/android/server/usage/AppStandbyController;->isActiveDeviceAdmin(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet; -HSPLcom/android/server/usage/AppStandbyController;->isActiveNetworkScorer(Ljava/lang/String;)Z+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/usage/AppStandbyController;->isActiveNetworkScorer(Ljava/lang/String;)Z+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector; HSPLcom/android/server/usage/AppStandbyController;->isAdminProtectedPackages(Ljava/lang/String;I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Set;Landroid/util/ArraySet; HSPLcom/android/server/usage/AppStandbyController;->isAppIdleEnabled()Z HSPLcom/android/server/usage/AppStandbyController;->isAppIdleFiltered(Ljava/lang/String;IIJ)Z HSPLcom/android/server/usage/AppStandbyController;->isCarrierApp(Ljava/lang/String;)Z+]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; -HSPLcom/android/server/usage/AppStandbyController;->isDeviceProvisioningPackage(Ljava/lang/String;)Z HSPLcom/android/server/usage/AppStandbyController;->isInParole()Z -HSPLcom/android/server/usage/AppStandbyController;->maybeInformListeners(Ljava/lang/String;IJIIZ)V+]Landroid/os/Handler;Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; -HPLcom/android/server/usage/AppStandbyController;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V+]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Landroid/os/UserHandle;Landroid/os/UserHandle;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; +HPLcom/android/server/usage/AppStandbyController;->maybeInformListeners(Ljava/lang/String;IJIIZ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; +HPLcom/android/server/usage/AppStandbyController;->onUsageEvent(ILandroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/List;Ljava/util/ArrayList;,Ljava/util/Collections$EmptyList; HSPLcom/android/server/usage/AppStandbyController;->reportContentProviderUsage(Ljava/lang/String;Ljava/lang/String;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/usage/AppStandbyController$Injector;Lcom/android/server/usage/AppStandbyController$Injector;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/usage/AppStandbyController;->reportEventLocked(Ljava/lang/String;IJI)V+]Landroid/os/Handler;Lcom/android/server/usage/AppStandbyController$AppStandbyHandler;]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory;]Lcom/android/server/usage/AppStandbyController;Lcom/android/server/usage/AppStandbyController; +HPLcom/android/server/usage/AppStandbyController;->reportEventLocked(Ljava/lang/String;IJI)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; HSPLcom/android/server/usage/AppStandbyController;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppIdleHistory;Lcom/android/server/usage/AppIdleHistory; HPLcom/android/server/usage/IntervalStats;->()V -HPLcom/android/server/usage/IntervalStats;->addEvent(Landroid/app/usage/UsageEvents$Event;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList; -HPLcom/android/server/usage/IntervalStats;->deobfuscateEvents(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/usage/IntervalStats;->deobfuscateUsageStats(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/usage/IntervalStats;->getOrCreateUsageStats(Ljava/lang/String;)Landroid/app/usage/UsageStats;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats; -HPLcom/android/server/usage/IntervalStats;->obfuscateEventsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData; -HPLcom/android/server/usage/IntervalStats;->obfuscateUsageStatsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/usage/PackagesTokenData;Lcom/android/server/usage/PackagesTokenData;]Ljava/lang/Integer;Ljava/lang/Integer; -HPLcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;Ljava/lang/String;JII)V+]Landroid/app/usage/UsageStats;Landroid/app/usage/UsageStats;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats; +HPLcom/android/server/usage/IntervalStats;->deobfuscateEvents(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList; +HPLcom/android/server/usage/IntervalStats;->deobfuscateUsageStats(Lcom/android/server/usage/PackagesTokenData;)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/usage/IntervalStats;->obfuscateEventsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList; +HPLcom/android/server/usage/IntervalStats;->obfuscateUsageStatsData(Lcom/android/server/usage/PackagesTokenData;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/usage/IntervalStats;->update(Ljava/lang/String;Ljava/lang/String;JII)V+]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats; HPLcom/android/server/usage/PackagesTokenData;->getPackageString(I)Ljava/lang/String;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/usage/PackagesTokenData;->getPackageTokenOrAdd(Ljava/lang/String;J)I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/usage/PackagesTokenData;->getPackageTokenOrAdd(Ljava/lang/String;J)I+]Landroid/util/SparseArray;Landroid/util/SparseArray; HPLcom/android/server/usage/PackagesTokenData;->getString(II)Ljava/lang/String;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;->accept(Ljava/lang/Object;)V HSPLcom/android/server/usage/StorageStatsService$H;->handleMessage(Landroid/os/Message;)V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/os/StatFs;Landroid/os/StatFs;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService;]Ljava/io/File;Ljava/io/File; -HPLcom/android/server/usage/StorageStatsService;->checkStatsPermission(ILjava/lang/String;Z)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HPLcom/android/server/usage/StorageStatsService;->checkStatsPermission(ILjava/lang/String;Z)Ljava/lang/String;+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Context;Landroid/app/ContextImpl; HPLcom/android/server/usage/StorageStatsService;->computeAppStatsByDataTypes(Landroid/content/pm/PackageStats;Ljava/lang/String;Ljava/lang/String;)V+]Lcom/android/server/art/model/ArtManagedFileStats;Lcom/android/server/art/model/ArtManagedFileStats;]Lcom/android/server/pm/PackageManagerLocal$FilteredSnapshot;Lcom/android/server/pm/local/PackageManagerLocalImpl$FilteredSnapshotImpl;]Lcom/android/server/pm/PackageManagerLocal;Lcom/android/server/pm/local/PackageManagerLocalImpl; -HPLcom/android/server/usage/StorageStatsService;->forEachStorageStatsAugmenter(Ljava/util/function/Consumer;Ljava/lang/String;)V+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/function/Consumer;Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda0;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda2; +HPLcom/android/server/usage/StorageStatsService;->forEachStorageStatsAugmenter(Ljava/util/function/Consumer;Ljava/lang/String;)V+]Ljava/util/concurrent/CopyOnWriteArrayList;Ljava/util/concurrent/CopyOnWriteArrayList;]Ljava/util/function/Consumer;Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda0;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda1;,Lcom/android/server/usage/StorageStatsService$$ExternalSyntheticLambda2; +HPLcom/android/server/usage/StorageStatsService;->getDirBytes(Ljava/io/File;)J+]Ljava/io/File;Ljava/io/File; +HPLcom/android/server/usage/StorageStatsService;->getFileBytesInDir(Ljava/io/File;Ljava/lang/String;)J+]Ljava/io/File;Ljava/io/File; HPLcom/android/server/usage/StorageStatsService;->queryStatsForPackage(Ljava/lang/String;Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService; HPLcom/android/server/usage/StorageStatsService;->queryStatsForUid(Ljava/lang/String;ILjava/lang/String;)Landroid/app/usage/StorageStats;+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Lcom/android/server/pm/Installer;Lcom/android/server/pm/Installer;]Lcom/android/server/usage/StorageStatsService;Lcom/android/server/usage/StorageStatsService; HPLcom/android/server/usage/StorageStatsService;->translate(Landroid/content/pm/PackageStats;)Landroid/app/usage/StorageStats; -HPLcom/android/server/usage/UsageStatsProtoV2;->loadConfigStats(Landroid/util/proto/ProtoInputStream;Lcom/android/server/usage/IntervalStats;)V+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats; -HPLcom/android/server/usage/UsageStatsProtoV2;->parseEvent(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageEvents$Event;+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream; -HPLcom/android/server/usage/UsageStatsProtoV2;->parseUsageStats(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageStats;+]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream; -HPLcom/android/server/usage/UsageStatsProtoV2;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;Z)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/proto/ProtoInputStream;Landroid/util/proto/ProtoInputStream; -HPLcom/android/server/usage/UsageStatsProtoV2;->write(Ljava/io/OutputStream;Lcom/android/server/usage/IntervalStats;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream; -HPLcom/android/server/usage/UsageStatsProtoV2;->writeOffsetTimestamp(Landroid/util/proto/ProtoOutputStream;JJJ)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream; -HPLcom/android/server/usage/UsageStatsProtoV2;->writeUsageStats(Landroid/util/proto/ProtoOutputStream;JLandroid/app/usage/UsageStats;)V+]Landroid/util/proto/ProtoOutputStream;Landroid/util/proto/ProtoOutputStream; -HSPLcom/android/server/usage/UsageStatsService$$ExternalSyntheticLambda0;->handleMessage(Landroid/os/Message;)Z -HSPLcom/android/server/usage/UsageStatsService$1;->onAppIdleStateChanged(Ljava/lang/String;IZII)V -HSPLcom/android/server/usage/UsageStatsService$3;->onUidStateChanged(IIJI)V+]Landroid/os/Handler;Landroid/os/Handler;]Landroid/os/Message;Landroid/os/Message; +HPLcom/android/server/usage/UsageStatsProtoV2;->loadConfigStats(Landroid/util/proto/ProtoInputStream;Lcom/android/server/usage/IntervalStats;)V+]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats; +HPLcom/android/server/usage/UsageStatsProtoV2;->parseEvent(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageEvents$Event; +HPLcom/android/server/usage/UsageStatsProtoV2;->parseUsageStats(Landroid/util/proto/ProtoInputStream;J)Landroid/app/usage/UsageStats; +HPLcom/android/server/usage/UsageStatsProtoV2;->read(Ljava/io/InputStream;Lcom/android/server/usage/IntervalStats;Z)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/usage/UsageStatsProtoV2;->write(Ljava/io/OutputStream;Lcom/android/server/usage/IntervalStats;)V+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/util/SparseArray;Landroid/util/SparseArray; +HPLcom/android/server/usage/UsageStatsProtoV2;->writeOffsetTimestamp(Landroid/util/proto/ProtoOutputStream;JJJ)V +HSPLcom/android/server/usage/UsageStatsService$3;->onUidStateChanged(IIJI)V +HPLcom/android/server/usage/UsageStatsService$BinderService;->$r8$lambda$KcrJYyWcmAOKG3NFhWUYPCQlNFI(Lcom/android/server/usage/UsageStatsService$BinderService;IIZLandroid/app/usage/AppStandbyInfo;)Z HPLcom/android/server/usage/UsageStatsService$BinderService;->getAppStandbyBucket(Ljava/lang/String;Ljava/lang/String;I)I+]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HPLcom/android/server/usage/UsageStatsService$BinderService;->hasQueryPermission(Ljava/lang/String;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Landroid/content/Context;Landroid/app/ContextImpl; HPLcom/android/server/usage/UsageStatsService$BinderService;->isAppInactive(Ljava/lang/String;ILjava/lang/String;)Z+]Landroid/app/IActivityManager;Lcom/android/server/am/ActivityManagerService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; -HSPLcom/android/server/usage/UsageStatsService$H;->handleMessage(Landroid/os/Message;)V+]Landroid/app/usage/UsageStatsManagerInternal$EstimatedLaunchTimeChangedListener;Lcom/android/server/job/controllers/PrefetchController$1;]Landroid/os/Handler;Lcom/android/server/usage/UsageStatsService$H;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/BroadcastResponseStatsTracker;Lcom/android/server/usage/BroadcastResponseStatsTracker;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Iterator;Ljava/util/concurrent/CopyOnWriteArrayList$COWIterator;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet; HSPLcom/android/server/usage/UsageStatsService$LocalService;->getAppStandbyBucket(Ljava/lang/String;IJ)I+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/usage/UsageStatsService$LocalService;->isAppIdle(Ljava/lang/String;II)Z+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; HSPLcom/android/server/usage/UsageStatsService$LocalService;->reportEvent(Ljava/lang/String;II)V HSPLcom/android/server/usage/UsageStatsService$LocalService;->setLastJobRunTime(Ljava/lang/String;IJ)V+]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController; +HPLcom/android/server/usage/UsageStatsService;->-$$Nest$msameApp(Lcom/android/server/usage/UsageStatsService;IILjava/lang/String;)Z HPLcom/android/server/usage/UsageStatsService;->getUserUsageStatsServiceLocked(I)Lcom/android/server/usage/UserUsageStatsService;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/usage/UsageStatsService;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/app/usage/UsageStatsManagerInternal$UsageEventListener;Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;,Lcom/android/server/job/controllers/QuotaController$UsageEventTracker;,Lcom/android/server/pm/BackgroundInstallControlService$$ExternalSyntheticLambda0;,Lcom/android/server/usage/AppStandbyController;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/usage/UsageStatsService$H;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppTimeLimitController;Lcom/android/server/usage/AppTimeLimitController;]Lcom/android/server/usage/UsageStatsService;Lcom/android/server/usage/UsageStatsService;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet; -HSPLcom/android/server/usage/UsageStatsService;->reportEventOrAddToQueue(ILandroid/app/usage/UsageEvents$Event;)V+]Landroid/os/Handler;Lcom/android/server/usage/UsageStatsService$H;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet; -HPLcom/android/server/usage/UserUsageStatsService$4;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/usage/UserUsageStatsService;->checkAndGetTimeLocked()J+]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/usage/UsageStatsService;->lambda$new$0(Landroid/os/Message;)Z+]Landroid/app/usage/UsageStatsManagerInternal$UsageEventListener;Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0;,Lcom/android/server/job/controllers/QuotaController$UsageEventTracker;,Lcom/android/server/pm/BackgroundInstallControlService$$ExternalSyntheticLambda0;,Lcom/android/server/usage/AppStandbyController;]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; +HPLcom/android/server/usage/UsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/usage/AppStandbyInternal;Lcom/android/server/usage/AppStandbyController;]Lcom/android/server/usage/AppTimeLimitController;Lcom/android/server/usage/AppTimeLimitController;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/util/Map;Landroid/util/ArrayMap;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet; +HSPLcom/android/server/usage/UsageStatsService;->reportEventOrAddToQueue(ILandroid/app/usage/UsageEvents$Event;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Ljava/util/LinkedList;Ljava/util/LinkedList;]Ljava/util/concurrent/CopyOnWriteArraySet;Ljava/util/concurrent/CopyOnWriteArraySet; +HPLcom/android/server/usage/UserUsageStatsService$1;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)Z+]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/usage/UserUsageStatsService$4;->combine(Lcom/android/server/usage/IntervalStats;ZLjava/util/List;)Z+]Landroid/app/usage/EventList;Landroid/app/usage/EventList;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/usage/UserUsageStatsService;->checkAndGetTimeLocked()J HPLcom/android/server/usage/UserUsageStatsService;->queryEvents(JJI[ILandroid/util/ArraySet;)Landroid/app/usage/UsageEvents;+]Ljava/util/List;Ljava/util/ArrayList; HPLcom/android/server/usage/UserUsageStatsService;->queryStats(IJJLcom/android/server/usage/UsageStatsDatabase$StatCombiner;Z)Ljava/util/List;+]Lcom/android/server/usage/UsageStatsDatabase$StatCombiner;megamorphic_types]Lcom/android/server/usage/UsageStatsDatabase;Lcom/android/server/usage/UsageStatsDatabase; -HPLcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V+]Landroid/app/usage/UsageEvents$Event;Landroid/app/usage/UsageEvents$Event;]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;]Lcom/android/server/usage/UnixCalendar;Lcom/android/server/usage/UnixCalendar;]Lcom/android/server/usage/UserUsageStatsService;Lcom/android/server/usage/UserUsageStatsService;]Ljava/lang/Object;Ljava/lang/String; -HSPLcom/android/server/usb/UsbDeviceManager$UsbHandler;->updateUsbNotification(Z)V+]Landroid/app/Notification$Builder;Landroid/app/Notification$Builder;]Landroid/app/NotificationManager;Landroid/app/NotificationManager;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/pm/PackageManager;Landroid/app/ApplicationPackageManager;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Lcom/android/server/usb/UsbDeviceManager$UsbHandler;Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal; +HPLcom/android/server/usage/UserUsageStatsService;->reportEvent(Landroid/app/usage/UsageEvents$Event;)V+]Lcom/android/server/usage/IntervalStats;Lcom/android/server/usage/IntervalStats;]Lcom/android/server/usage/UnixCalendar;Lcom/android/server/usage/UnixCalendar; HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue$$ExternalSyntheticLambda0;->compare(Ljava/lang/Object;Ljava/lang/Object;)I -HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->lambda$static$0(Landroid/util/Pair;Landroid/util/Pair;)I+]Ljava/lang/Long;Ljava/lang/Long; +HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->lambda$static$0(Landroid/util/Pair;Landroid/util/Pair;)I HSPLcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;->removeKey(Ljava/lang/Object;)Z+]Ljava/lang/Object;Landroid/content/pm/UserPackage;,Lcom/android/server/job/controllers/JobStatus;,Ljava/lang/String;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; -HSPLcom/android/server/utils/AlarmQueue;->addAlarm(Ljava/lang/Object;J)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;,Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;,Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue;,Lcom/android/server/usage/UsageStatsService$LaunchTimeAlarmQueue;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; -HSPLcom/android/server/utils/AlarmQueue;->removeAlarmForKey(Ljava/lang/Object;)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Lcom/android/server/utils/AlarmQueue;Lcom/android/server/job/controllers/FlexibilityController$FlexibilityAlarmQueue;,Lcom/android/server/job/controllers/PrefetchController$ThresholdAlarmListener;,Lcom/android/server/job/controllers/QuotaController$InQuotaAlarmQueue; -HSPLcom/android/server/utils/AlarmQueue;->setNextAlarmLocked(J)V+]Landroid/os/Handler;Landroid/os/Handler;]Ljava/lang/Long;Ljava/lang/Long;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; -HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->cancel(Ljava/lang/Object;)Z+]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/am/ActivityManagerService$MainHandler; -HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->start(Ljava/lang/Object;IIJ)V+]Landroid/os/Handler;Landroid/os/Handler;,Lcom/android/server/am/ActivityManagerService$MainHandler; +HSPLcom/android/server/utils/AlarmQueue;->addAlarm(Ljava/lang/Object;J)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; +HSPLcom/android/server/utils/AlarmQueue;->removeAlarmForKey(Ljava/lang/Object;)V+]Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; +HSPLcom/android/server/utils/AlarmQueue;->setNextAlarmLocked(J)V+]Ljava/util/PriorityQueue;Lcom/android/server/utils/AlarmQueue$AlarmPriorityQueue; +HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->cancel(Ljava/lang/Object;)Z +HSPLcom/android/server/utils/AnrTimer$FeatureDisabled;->start(Ljava/lang/Object;IIJ)V HSPLcom/android/server/utils/AnrTimer;->cancel(Ljava/lang/Object;)Z+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled; HSPLcom/android/server/utils/AnrTimer;->serviceEnabled()Z+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled; +HSPLcom/android/server/utils/AnrTimer;->start(Ljava/lang/Object;J)V+]Lcom/android/server/utils/AnrTimer$FeatureSwitch;Lcom/android/server/utils/AnrTimer$FeatureDisabled;]Lcom/android/server/utils/AnrTimer;Lcom/android/server/am/ActiveServices$ProcessAnrTimer;,Lcom/android/server/am/ActiveServices$ServiceAnrTimer;,Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer; HSPLcom/android/server/utils/Slogf;->getMessage(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String; HSPLcom/android/server/utils/SnapshotCache$Auto;->createSnapshot()Lcom/android/server/utils/Snappable;+]Lcom/android/server/utils/Snappable;megamorphic_types HSPLcom/android/server/utils/SnapshotCache;->()V HSPLcom/android/server/utils/SnapshotCache;->(Ljava/lang/Object;Lcom/android/server/utils/Watchable;Ljava/lang/String;)V+]Lcom/android/server/utils/Watchable;megamorphic_types]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap; HSPLcom/android/server/utils/SnapshotCache;->onChange(Lcom/android/server/utils/Watchable;)V -HSPLcom/android/server/utils/SnapshotCache;->snapshot()Ljava/lang/Object;+]Lcom/android/server/utils/SnapshotCache;megamorphic_types]Ljava/util/concurrent/atomic/AtomicInteger;Ljava/util/concurrent/atomic/AtomicInteger; +HSPLcom/android/server/utils/SnapshotCache;->snapshot()Ljava/lang/Object;+]Lcom/android/server/utils/SnapshotCache;megamorphic_types HSPLcom/android/server/utils/Snapshots;->maybeSnapshot(Ljava/lang/Object;)Ljava/lang/Object;+]Lcom/android/server/utils/Snappable;megamorphic_types HSPLcom/android/server/utils/WatchableImpl;->()V HSPLcom/android/server/utils/WatchableImpl;->dispatchChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/Watcher;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; @@ -3330,25 +3488,25 @@ HSPLcom/android/server/utils/WatchedArrayList;->size()I+]Ljava/util/ArrayList;Lj HSPLcom/android/server/utils/WatchedArrayList;->snapshot(Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayList;]Lcom/android/server/utils/WatchedArrayList;Lcom/android/server/utils/WatchedArrayList;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/utils/WatchedArrayMap$1;->onChange(Lcom/android/server/utils/Watchable;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayMap; HSPLcom/android/server/utils/WatchedArrayMap;->(IZ)V -HSPLcom/android/server/utils/WatchedArrayMap;->containsKey(Ljava/lang/Object;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/utils/WatchedArrayMap;->containsKey(Ljava/lang/Object;)Z HSPLcom/android/server/utils/WatchedArrayMap;->entrySet()Ljava/util/Set; -HSPLcom/android/server/utils/WatchedArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/utils/WatchedArrayMap;->keyAt(I)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/utils/WatchedArrayMap;->get(Ljava/lang/Object;)Ljava/lang/Object; +HSPLcom/android/server/utils/WatchedArrayMap;->keyAt(I)Ljava/lang/Object; HSPLcom/android/server/utils/WatchedArrayMap;->put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/server/utils/WatchedArrayMap;->putAll(Ljava/util/Map;)V+]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Iterator;Ljava/util/Collections$UnmodifiableCollection$1;]Ljava/util/Map$Entry;Landroid/util/MapCollections$MapIterator;]Ljava/util/Map;Lcom/android/server/utils/WatchedArrayMap;]Ljava/util/Set;Ljava/util/Collections$UnmodifiableSet; -HSPLcom/android/server/utils/WatchedArrayMap;->registerChild(Ljava/lang/Object;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/pm/SharedUserSetting;,Lcom/android/server/utils/WatchedLongSparseArray; -HSPLcom/android/server/utils/WatchedArrayMap;->size()I+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/utils/WatchedArrayMap;->snapshot(Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; -HSPLcom/android/server/utils/WatchedArrayMap;->valueAt(I)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; +HSPLcom/android/server/utils/WatchedArrayMap;->registerChild(Ljava/lang/Object;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting;,Lcom/android/server/utils/WatchedLongSparseArray; +HSPLcom/android/server/utils/WatchedArrayMap;->size()I +HSPLcom/android/server/utils/WatchedArrayMap;->snapshot(Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArrayMap;]Lcom/android/server/utils/WatchedArrayMap;Lcom/android/server/utils/WatchedArrayMap; +HSPLcom/android/server/utils/WatchedArrayMap;->untrackedStorage()Landroid/util/ArrayMap; +HSPLcom/android/server/utils/WatchedArrayMap;->valueAt(I)Ljava/lang/Object; HSPLcom/android/server/utils/WatchedArraySet;->(IZ)V HSPLcom/android/server/utils/WatchedArraySet;->add(Ljava/lang/Object;)Z HSPLcom/android/server/utils/WatchedArraySet;->clear()V -HSPLcom/android/server/utils/WatchedArraySet;->contains(Ljava/lang/Object;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/utils/WatchedArraySet;->contains(Ljava/lang/Object;)Z HSPLcom/android/server/utils/WatchedArraySet;->registerChild(Ljava/lang/Object;)V+]Lcom/android/server/utils/Watchable;Lcom/android/server/pm/PackageSetting; HSPLcom/android/server/utils/WatchedArraySet;->registerObserver(Lcom/android/server/utils/Watcher;)V -HSPLcom/android/server/utils/WatchedArraySet;->size()I+]Landroid/util/ArraySet;Landroid/util/ArraySet; -HSPLcom/android/server/utils/WatchedArraySet;->snapshot(Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; -HSPLcom/android/server/utils/WatchedArraySet;->valueAt(I)Ljava/lang/Object;+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/utils/WatchedArraySet;->snapshot(Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet;)V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedArraySet;]Lcom/android/server/utils/WatchedArraySet;Lcom/android/server/utils/WatchedArraySet; +HSPLcom/android/server/utils/WatchedArraySet;->untrackedStorage()Landroid/util/ArraySet; HSPLcom/android/server/utils/WatchedLongSparseArray;->size()I+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; HSPLcom/android/server/utils/WatchedLongSparseArray;->valueAt(I)Ljava/lang/Object;+]Landroid/util/LongSparseArray;Landroid/util/LongSparseArray; HSPLcom/android/server/utils/WatchedSparseArray;->()V @@ -3360,102 +3518,140 @@ HSPLcom/android/server/utils/WatchedSparseBooleanArray;->snapshot()Lcom/android/ HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->binarySearch([III)I HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->copyFrom(Lcom/android/server/utils/WatchedSparseBooleanMatrix;)V HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->indexOfKey(I)I -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->indexOfKey(IZ)I+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->nextFree(Z)I -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->onChanged()V+]Lcom/android/server/utils/WatchableImpl;Lcom/android/server/utils/WatchedSparseBooleanMatrix; +HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->indexOfKey(IZ)I HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->put(IIZ)V+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->setValueAt(IIZ)V+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; +HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->setValueAt(IIZ)V HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->setValueAtInternal(IIZ)V -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->validateIndex(II)V+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; -HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->valueAt(II)Z+]Lcom/android/server/utils/WatchedSparseBooleanMatrix;Lcom/android/server/utils/WatchedSparseBooleanMatrix; +HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->validateIndex(II)V +HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->valueAt(II)Z HPLcom/android/server/utils/WatchedSparseBooleanMatrix;->valueAtInternal(II)Z -HSPLcom/android/server/utils/WatchedSparseSetArray;->(Lcom/android/server/utils/WatchedSparseSetArray;)V+]Lcom/android/server/utils/WatchedSparseSetArray;Lcom/android/server/utils/WatchedSparseSetArray; +HSPLcom/android/server/utils/WatchedSparseSetArray;->(Lcom/android/server/utils/WatchedSparseSetArray;)V HSPLcom/android/server/utils/WatchedSparseSetArray;->add(ILjava/lang/Object;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray; HSPLcom/android/server/utils/WatchedSparseSetArray;->contains(ILjava/lang/Object;)Z+]Landroid/util/SparseSetArray;Landroid/util/SparseSetArray; HSPLcom/android/server/utils/quota/Category;->equals(Ljava/lang/Object;)Z -HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; -HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;Z)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/utils/quota/Categorizer;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda4;,Lcom/android/server/utils/quota/Categorizer$$ExternalSyntheticLambda0;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/utils/quota/QuotaTracker$Injector;Lcom/android/server/utils/quota/QuotaTracker$Injector;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap;]Ljava/lang/Integer;Ljava/lang/Integer;]Ljava/lang/Long;Ljava/lang/Long; +HSPLcom/android/server/utils/quota/Category;->hashCode()I +HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats; +HSPLcom/android/server/utils/quota/CountQuotaTracker;->getExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;Z)Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;+]Lcom/android/server/utils/quota/Categorizer;Lcom/android/server/job/JobSchedulerService$$ExternalSyntheticLambda4;,Lcom/android/server/utils/quota/Categorizer$$ExternalSyntheticLambda0;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/utils/quota/QuotaTracker$Injector;Lcom/android/server/utils/quota/QuotaTracker$Injector;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap; HSPLcom/android/server/utils/quota/CountQuotaTracker;->isWithinQuota(ILjava/lang/String;Ljava/lang/String;)Z HSPLcom/android/server/utils/quota/CountQuotaTracker;->isWithinQuotaLocked(ILjava/lang/String;Ljava/lang/String;)Z+]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/utils/quota/QuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; HPLcom/android/server/utils/quota/CountQuotaTracker;->noteEvent(ILjava/lang/String;Ljava/lang/String;)Z+]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Lcom/android/server/utils/quota/CountQuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/utils/quota/QuotaTracker$Injector;Lcom/android/server/utils/quota/QuotaTracker$Injector;]Lcom/android/server/utils/quota/QuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap; HSPLcom/android/server/utils/quota/CountQuotaTracker;->updateExecutionStatsLocked(ILjava/lang/String;Ljava/lang/String;Lcom/android/server/utils/quota/CountQuotaTracker$ExecutionStats;)V+]Landroid/util/LongArrayQueue;Landroid/util/LongArrayQueue;]Lcom/android/server/utils/quota/QuotaTracker$Injector;Lcom/android/server/utils/quota/QuotaTracker$Injector;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap; HSPLcom/android/server/utils/quota/QuotaTracker$Injector;->getElapsedRealtime()J -HSPLcom/android/server/utils/quota/QuotaTracker;->isQuotaFreeLocked(ILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Ljava/lang/Boolean;Ljava/lang/Boolean; +HSPLcom/android/server/utils/quota/QuotaTracker;->isEnabledLocked()Z +HSPLcom/android/server/utils/quota/QuotaTracker;->isQuotaFreeLocked(ILjava/lang/String;)Z+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap; HSPLcom/android/server/utils/quota/QuotaTracker;->isWithinQuota(ILjava/lang/String;Ljava/lang/String;)Z+]Lcom/android/server/utils/quota/QuotaTracker;Lcom/android/server/utils/quota/CountQuotaTracker; -HSPLcom/android/server/utils/quota/UptcMap;->getOrCreate(ILjava/lang/String;Ljava/lang/String;Ljava/util/function/Function;)Ljava/lang/Object;+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap;]Ljava/util/function/Function;Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda1;,Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda2; +HSPLcom/android/server/utils/quota/UptcMap;->getOrCreate(ILjava/lang/String;Ljava/lang/String;Ljava/util/function/Function;)Ljava/lang/Object;+]Landroid/util/SparseArrayMap;Landroid/util/SparseArrayMap;]Lcom/android/server/utils/quota/UptcMap;Lcom/android/server/utils/quota/UptcMap;]Ljava/util/function/Function;Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda1;,Lcom/android/server/utils/quota/CountQuotaTracker$$ExternalSyntheticLambda2; HSPLcom/android/server/vibrator/VibrationSettings$VibrationUidObserver;->onUidStateChanged(IIJI)V+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/vibrator/VibrationStats$StatsInfo;->(IIILcom/android/server/vibrator/Vibration$Status;Lcom/android/server/vibrator/VibrationStats;J)V HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->getCurrentWebViewPackage()Landroid/content/pm/PackageInfo;+]Lcom/android/server/webkit/WebViewUpdateServiceInterface;Lcom/android/server/webkit/WebViewUpdateServiceImpl2; HPLcom/android/server/webkit/WebViewUpdateService$BinderService;->grantVisibilityToCaller(Ljava/lang/String;I)V+]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; -HSPLcom/android/server/wm/AccessibilityController;->hasCallbacks()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl;Lcom/android/server/wm/AccessibilityController$AccessibilityControllerInternalImpl; -HSPLcom/android/server/wm/ActivityRecord;->(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/WindowProcessController;IILjava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;IZZLcom/android/server/wm/ActivityTaskSupervisor;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Landroid/os/PersistableBundle;Landroid/app/ActivityManager$TaskDescription;J)V+]Landroid/app/ActivityOptions$SceneTransitionInfo;Landroid/app/ActivityOptions$SceneTransitionInfo;]Landroid/app/ActivityOptions;Landroid/app/ActivityOptions;]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/content/res/Resources;Landroid/content/res/Resources;]Landroid/content/res/TypedArray;Landroid/content/res/TypedArray;]Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;Lcom/android/server/display/color/ColorDisplayService$ColorDisplayServiceInternal;]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService;]Lcom/android/server/wm/PackageConfigPersister;Lcom/android/server/wm/PackageConfigPersister; +HSPLcom/android/server/wm/AccessibilityController;->hasCallbacks()Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; +HSPLcom/android/server/wm/ActivityRecord;->(Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/WindowProcessController;IILjava/lang/String;Ljava/lang/String;Landroid/content/Intent;Ljava/lang/String;Landroid/content/pm/ActivityInfo;Landroid/content/res/Configuration;Lcom/android/server/wm/ActivityRecord;Ljava/lang/String;IZZLcom/android/server/wm/ActivityTaskSupervisor;Landroid/app/ActivityOptions;Lcom/android/server/wm/ActivityRecord;Landroid/os/PersistableBundle;Landroid/app/ActivityManager$TaskDescription;J)V HSPLcom/android/server/wm/ActivityRecord;->canAffectSystemUiFlags()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/ActivityRecord;->canBeTopRunning()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->canReceiveKeys()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLocked(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLockedInner(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->containsDismissKeyguardWindow()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/ActivityRecord;->containsShowWhenLockedWindow()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/ActivityRecord;->containsTurnScreenOnWindow()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/ActivityRecord;->findMainWindow(Z)Lcom/android/server/wm/WindowState;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/ActivityRecord;->canBeTopRunning()Z +HSPLcom/android/server/wm/ActivityRecord;->canReceiveKeys()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; +HSPLcom/android/server/wm/ActivityRecord;->canShowWhenLockedInner(Lcom/android/server/wm/ActivityRecord;)Z +HSPLcom/android/server/wm/ActivityRecord;->containsDismissKeyguardWindow()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/ActivityRecord;->containsShowWhenLockedWindow()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/ActivityRecord;->containsTurnScreenOnWindow()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/ActivityRecord;->findMainWindow(Z)Lcom/android/server/wm/WindowState;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/ActivityRecord;->getActivity(Ljava/util/function/Predicate;ZLcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityRecord;+]Ljava/util/function/Predicate;megamorphic_types -HSPLcom/android/server/wm/ActivityRecord;->getAppCompatState(Z)I+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController; -HSPLcom/android/server/wm/ActivityRecord;->getBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Ljava/util/Optional;Ljava/util/Optional; -HSPLcom/android/server/wm/ActivityRecord;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/ActivityRecord;->getAppCompatState(Z)I+]Lcom/android/server/wm/AppCompatAspectRatioPolicy;Lcom/android/server/wm/AppCompatAspectRatioPolicy;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatSizeCompatModePolicy;Lcom/android/server/wm/AppCompatSizeCompatModePolicy;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/ActivityRecord;->getBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/ActivityRecord;->getScreenResolvedBounds()Landroid/graphics/Rect;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatSizeCompatModePolicy;Lcom/android/server/wm/AppCompatSizeCompatModePolicy; HSPLcom/android/server/wm/ActivityRecord;->getTask()Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/ActivityRecord;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/ActivityRecord;->isFocusable()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord; +HSPLcom/android/server/wm/ActivityRecord;->getTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/ActivityRecord;->hasSizeCompatBounds()Z+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatSizeCompatModePolicy;Lcom/android/server/wm/AppCompatSizeCompatModePolicy; HSPLcom/android/server/wm/ActivityRecord;->isVisible()Z -HSPLcom/android/server/wm/ActivityRecord;->isWaitingForTransitionStart()Z+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->occludesParent(Z)Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->prepareSurfaces()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/ActivityRecord;->setState(Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V+]Lcom/android/server/contentcapture/ContentCaptureManagerInternal;Lcom/android/server/contentcapture/ContentCaptureManagerService$LocalService;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/wm/ActivityRecord;->shouldBeVisibleUnchecked()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/ActivityRecord;->shouldMakeActive(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/ActivityRecord;->isWaitingForTransitionStart()Z+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition; +HSPLcom/android/server/wm/ActivityRecord;->occludesParent(Z)Z +HSPLcom/android/server/wm/ActivityRecord;->prepareSurfaces()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/ActivityRecord;->setState(Lcom/android/server/wm/ActivityRecord$State;Ljava/lang/String;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/ActivityRecord;->shouldBeVisibleUnchecked()Z+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/ActivityRecord;->showToCurrentUser()Z+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; -HSPLcom/android/server/wm/ActivityRecord;->toString()Ljava/lang/String;+]Landroid/content/ComponentName;Landroid/content/ComponentName;]Landroid/content/Intent;Landroid/content/Intent;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/wm/ActivityRecord;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/internal/protolog/ProtoLogGroup;Lcom/android/internal/protolog/ProtoLogGroup;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/ActivityRecord;->updateReportedConfigurationAndSend()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController; -HSPLcom/android/server/wm/ActivityRecord;->updateReportedVisibilityLocked()V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/ActivityRecordInputSink;->getInputWindowHandleWrapper()Lcom/android/server/wm/InputWindowHandleWrapper;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/ActivityRecord;->toString()Ljava/lang/String;+]Landroid/content/Intent;Landroid/content/Intent; +HSPLcom/android/server/wm/ActivityRecord;->updateDrawnWindowStates(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/ActivityRecord;->updateReportedVisibilityLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/ActivityRecord;->windowsAreFocusable(Z)Z +HSPLcom/android/server/wm/ActivityRecordInputSink;->getInputWindowHandleWrapper()Lcom/android/server/wm/InputWindowHandleWrapper;+]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/ActivityStarter$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->attachApplication(Lcom/android/server/wm/WindowProcessController;)Z+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopApp()Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->getTopProcessState()I -HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->handleAppDied(Lcom/android/server/wm/WindowProcessController;ZLjava/lang/Runnable;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isCallerRecents(I)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isSleeping()Z HPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->isUidForeground(I)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; -HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessAdded(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap; +HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessAdded(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Lcom/android/server/wm/PackageConfigPersister;Lcom/android/server/wm/PackageConfigPersister; HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onProcessRemoved(Ljava/lang/String;I)V+]Lcom/android/internal/app/ProcessMap;Lcom/android/internal/app/ProcessMap;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->preBindApplication(Lcom/android/server/wm/WindowProcessController;)V+]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor; -HSPLcom/android/server/wm/ActivityTaskManagerService;->deferWindowLayout()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; +HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->onUidProcStateChanged(II)V +HSPLcom/android/server/wm/ActivityTaskManagerService$LocalService;->preBindApplication(Lcom/android/server/wm/WindowProcessController;Landroid/content/pm/ApplicationInfo;)Lcom/android/server/wm/ActivityTaskManagerInternal$PreBindInfo;+]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HPLcom/android/server/wm/ActivityTaskManagerService;->getLastStopAppSwitchesTime()J +HPLcom/android/server/wm/ActivityTaskManagerService;->getTasks(IZZI)Ljava/util/List;+]Lcom/android/server/pm/UserManagerService;Lcom/android/server/pm/UserManagerService;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; HSPLcom/android/server/wm/ActivityTaskManagerService;->hasActiveVisibleWindow(I)Z+]Lcom/android/server/wm/MirrorActiveUids;Lcom/android/server/wm/MirrorActiveUids;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker; -HPLcom/android/server/wm/ActivityTaskManagerService;->hasSystemAlertWindowPermission(IILjava/lang/String;)Z+]Landroid/app/AppOpsManager;Landroid/app/AppOpsManager;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; HSPLcom/android/server/wm/ActivityTaskManagerService;->isCallerRecents(I)Z+]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks; HSPLcom/android/server/wm/ActivityTaskManagerService;->isGetTasksAllowed(Ljava/lang/String;II)Z+]Landroid/content/pm/IPackageManager;Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->getVisibleOpaqueActivity(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord; +HSPLcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->accept(Lcom/android/server/wm/ActivityRecord;)V+]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo; HSPLcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;->fillAndReturnTop(Lcom/android/server/wm/Task;Landroid/app/TaskInfo;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/ActivityTaskSupervisor;->beginActivityVisibilityUpdate()V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController; HSPLcom/android/server/wm/ActivityTaskSupervisor;->endActivityVisibilityUpdate()V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor; +HSPLcom/android/server/wm/ActivityTaskSupervisor;->getKeyguardController()Lcom/android/server/wm/KeyguardController; +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides$$ExternalSyntheticLambda0;->getAsBoolean()Z +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides$$ExternalSyntheticLambda1;->getAsBoolean()Z +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides;->isSystemOverrideToFullscreenEnabled()Z+]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp; +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides;->isUserFullscreenOverrideEnabled()Z+]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp; +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides;->shouldApplyUserFullscreenOverride()Z+]Lcom/android/server/wm/AppCompatAspectRatioOverrides;Lcom/android/server/wm/AppCompatAspectRatioOverrides; +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides;->shouldEnableUserAspectRatioSettings()Z+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp; +HSPLcom/android/server/wm/AppCompatAspectRatioOverrides;->shouldOverrideMinAspectRatio()Z+]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp; +HSPLcom/android/server/wm/AppCompatAspectRatioPolicy;->isLetterboxedForAspectRatioOnly()Z+]Lcom/android/server/wm/AppCompatAspectRatioPolicy$AppCompatAspectRatioState;Lcom/android/server/wm/AppCompatAspectRatioPolicy$AppCompatAspectRatioState; +HSPLcom/android/server/wm/AppCompatAspectRatioPolicy;->isLetterboxedForFixedOrientationAndAspectRatio()Z+]Lcom/android/server/wm/AppCompatAspectRatioPolicy$AppCompatAspectRatioState;Lcom/android/server/wm/AppCompatAspectRatioPolicy$AppCompatAspectRatioState; +HSPLcom/android/server/wm/AppCompatConfiguration;->getDefaultLetterboxBackgroundType()I +HSPLcom/android/server/wm/AppCompatConfiguration;->isUserAppAspectRatioFullscreenEnabled()Z +HSPLcom/android/server/wm/AppCompatConfiguration;->isUserAppAspectRatioSettingsEnabled()Z +HSPLcom/android/server/wm/AppCompatController;->getAppCompatAspectRatioPolicy()Lcom/android/server/wm/AppCompatAspectRatioPolicy; +HSPLcom/android/server/wm/AppCompatController;->getAppCompatLetterboxOverrides()Lcom/android/server/wm/AppCompatLetterboxOverrides;+]Lcom/android/server/wm/AppCompatOverrides;Lcom/android/server/wm/AppCompatOverrides; +HSPLcom/android/server/wm/AppCompatController;->getAppCompatSizeCompatModePolicy()Lcom/android/server/wm/AppCompatSizeCompatModePolicy; +HSPLcom/android/server/wm/AppCompatController;->getTransparentPolicy()Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/AppCompatLetterboxPolicy$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z +HSPLcom/android/server/wm/AppCompatLetterboxPolicy;->shouldNotLayoutLetterbox(Lcom/android/server/wm/WindowState;)Z +HSPLcom/android/server/wm/AppCompatLetterboxPolicy;->shouldShowLetterboxUi(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatOrientationOverrides;Lcom/android/server/wm/AppCompatOrientationOverrides;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/AppCompatLetterboxPolicy;->start(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/AppCompatLetterboxPolicy$LetterboxPolicyState;Lcom/android/server/wm/AppCompatLetterboxPolicy$LetterboxPolicyState;]Lcom/android/server/wm/AppCompatLetterboxPolicy;Lcom/android/server/wm/AppCompatLetterboxPolicy;]Lcom/android/server/wm/AppCompatRoundedCorners;Lcom/android/server/wm/AppCompatRoundedCorners; +HSPLcom/android/server/wm/AppCompatLetterboxPolicy;->updateLetterboxSurfaceIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/AppCompatLetterboxPolicy$LetterboxPolicyState;Lcom/android/server/wm/AppCompatLetterboxPolicy$LetterboxPolicyState; +HSPLcom/android/server/wm/AppCompatLetterboxPolicy;->updateWallpaperForLetterbox(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatLetterboxOverrides;Lcom/android/server/wm/AppCompatLetterboxOverrides; +HSPLcom/android/server/wm/AppCompatOrientationPolicy;->overrideOrientationIfNeeded(I)I+]Lcom/android/server/wm/AppCompatAspectRatioOverrides;Lcom/android/server/wm/AppCompatAspectRatioOverrides;]Lcom/android/server/wm/AppCompatCameraOverrides;Lcom/android/server/wm/AppCompatCameraOverrides;]Lcom/android/server/wm/AppCompatCameraPolicy;Lcom/android/server/wm/AppCompatCameraPolicy;]Lcom/android/server/wm/AppCompatOrientationOverrides;Lcom/android/server/wm/AppCompatOrientationOverrides;]Lcom/android/server/wm/AppCompatOverrides;Lcom/android/server/wm/AppCompatOverrides;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; +HSPLcom/android/server/wm/AppCompatReachabilityOverrides;->isHorizontalReachabilityEnabled()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/AppCompatReachabilityOverrides;->isHorizontalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatReachabilityOverrides;Lcom/android/server/wm/AppCompatReachabilityOverrides;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/AppCompatReachabilityOverrides;->isVerticalReachabilityEnabled()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/AppCompatReachabilityOverrides;->isVerticalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatReachabilityOverrides;Lcom/android/server/wm/AppCompatReachabilityOverrides;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/AppCompatRoundedCorners;->requiresRoundedCorners(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatLetterboxOverrides;Lcom/android/server/wm/AppCompatLetterboxOverrides;]Ljava/util/function/Predicate;Lcom/android/server/wm/AppCompatLetterboxPolicy$$ExternalSyntheticLambda0; +HSPLcom/android/server/wm/AppCompatRoundedCorners;->updateRoundedCornersIfNeeded(Lcom/android/server/wm/WindowState;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/AppCompatRoundedCorners;Lcom/android/server/wm/AppCompatRoundedCorners;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/AppCompatSizeCompatModePolicy;->getAppCompatDisplayInsets()Lcom/android/server/wm/AppCompatDisplayInsets;+]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/AppCompatSizeCompatModePolicy;->hasSizeCompatBounds()Z +HSPLcom/android/server/wm/AppCompatUtils;->clearAppCompatTaskInfo(Landroid/app/AppCompatTaskInfo;)V+]Landroid/app/AppCompatTaskInfo;Landroid/app/AppCompatTaskInfo; +HSPLcom/android/server/wm/AppCompatUtils;->fillAppCompatTaskInfo(Lcom/android/server/wm/Task;Landroid/app/TaskInfo;Lcom/android/server/wm/ActivityRecord;)V+]Landroid/app/AppCompatTaskInfo;Landroid/app/AppCompatTaskInfo;]Lcom/android/server/wm/AppCompatAspectRatioOverrides;Lcom/android/server/wm/AppCompatAspectRatioOverrides;]Lcom/android/server/wm/AppCompatCameraOverrides;Lcom/android/server/wm/AppCompatCameraOverrides;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatLetterboxOverrides;Lcom/android/server/wm/AppCompatLetterboxOverrides;]Lcom/android/server/wm/AppCompatReachabilityOverrides;Lcom/android/server/wm/AppCompatReachabilityOverrides;]Lcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;Lcom/android/server/wm/DesktopAppCompatAspectRatioPolicy; +HSPLcom/android/server/wm/AppCompatUtils;->getAppBounds(Lcom/android/server/wm/ActivityRecord;)Landroid/graphics/Rect;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/AppCompatUtils;->isChangeEnabled(Lcom/android/server/wm/ActivityRecord;J)Z+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo; HSPLcom/android/server/wm/AppTransition;->isTransitionSet()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->finishNow()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener;Lcom/android/server/wm/Transition;,Lcom/android/server/wm/WindowOrganizerController;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/lang/Runnable;Lcom/android/server/wm/TransitionController$$ExternalSyntheticLambda3;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24; +HSPLcom/android/server/wm/BLASTSyncEngine$SyncGroup;->finishNow()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener;Lcom/android/server/wm/Transition;,Lcom/android/server/wm/WindowOrganizerController;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/lang/Runnable;Lcom/android/server/wm/TransitionController$$ExternalSyntheticLambda3;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/Iterator;Landroid/util/MapCollections$ArrayIterator;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; HSPLcom/android/server/wm/BLASTSyncEngine;->onSurfacePlacement()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/BackNavigationController;->shouldPauseTouch(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/BackNavigationController$AnimationHandler;Lcom/android/server/wm/BackNavigationController$AnimationHandler;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; HSPLcom/android/server/wm/BackgroundLaunchProcessController;->addBoundClientUid(ILjava/lang/String;J)V+]Landroid/util/IntArray;Landroid/util/IntArray; -HPLcom/android/server/wm/BackgroundLaunchProcessController;->areBackgroundActivityStartsAllowed(IILjava/lang/String;IZZZJJJ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController; +HPLcom/android/server/wm/BackgroundLaunchProcessController;->areBackgroundActivityStartsAllowed(IILjava/lang/String;ILcom/android/server/wm/BackgroundLaunchProcessController$BalCheckConfiguration;ZZJJJ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict; HSPLcom/android/server/wm/BackgroundLaunchProcessController;->clearBalOptInBoundClientUids()V+]Landroid/util/IntArray;Landroid/util/IntArray; -HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBackgroundStartAllowedByToken(ILjava/lang/String;Z)Z+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/BackgroundActivityStartCallback;Lcom/android/server/notification/NotificationManagerService$NotificationTrampolineCallback;]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Ljava/util/List;Ljava/util/ArrayList; -HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBoundByForegroundUid()Z+]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/function/IntPredicate;Lcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda4;,Lcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda8; -HSPLcom/android/server/wm/BackgroundLaunchProcessController;->removeAllowBackgroundStartPrivileges(Landroid/os/Binder;)V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap; -HSPLcom/android/server/wm/ClientLifecycleManager;->dispatchPendingTransactions()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager; +HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBackgroundStartAllowedByToken(ILjava/lang/String;Z)Z+]Landroid/app/BackgroundStartPrivileges;Landroid/app/BackgroundStartPrivileges;]Lcom/android/server/wm/BackgroundActivityStartCallback;Lcom/android/server/notification/NotificationManagerService$NotificationTrampolineCallback;]Ljava/util/List;Ljava/util/ArrayList; +HPLcom/android/server/wm/BackgroundLaunchProcessController;->isBoundByForegroundUid()Z+]Landroid/util/IntArray;Landroid/util/IntArray;]Ljava/util/function/IntPredicate;Lcom/android/server/wm/WindowProcessController$$ExternalSyntheticLambda5; +HSPLcom/android/server/wm/BackgroundLaunchProcessController;->removeAllowBackgroundStartPrivileges(Landroid/os/Binder;)V +HSPLcom/android/server/wm/ClientLifecycleManager;->dispatchPendingTransactions()V+]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager; +HSPLcom/android/server/wm/ClientLifecycleManager;->getOrCreatePendingTransaction(Landroid/app/IApplicationThread;)Landroid/app/servertransaction/ClientTransaction;+]Landroid/app/IApplicationThread;Landroid/app/IApplicationThread$Stub$Proxy;,Lcom/android/server/am/ApplicationThreadDeferred; HSPLcom/android/server/wm/ClientLifecycleManager;->shouldDispatchPendingTransactionsImmediately()Z+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; HSPLcom/android/server/wm/CompatModePackages;->compatibilityInfoForPackageLocked(Landroid/content/pm/ApplicationInfo;)Landroid/content/res/CompatibilityInfo;+]Landroid/util/SparseBooleanArray;Landroid/util/SparseBooleanArray;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; HSPLcom/android/server/wm/CompatModePackages;->getCompatScaleFromProvider(Ljava/lang/String;I)Landroid/content/res/CompatibilityInfo$CompatScale;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/CompatScaleProvider;Lcom/android/server/app/GameManagerService$LocalService; HSPLcom/android/server/wm/ConfigurationContainer;->()V +HSPLcom/android/server/wm/ConfigurationContainer;->applyAppSpecificConfig(Ljava/lang/Integer;Landroid/os/LocaleList;Ljava/lang/Integer;)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/ConfigurationContainer;->applySizeOverrideIfNeeded(Lcom/android/server/wm/DisplayContent;Landroid/content/pm/ApplicationInfo;Landroid/content/res/Configuration;Landroid/content/res/Configuration;ZZZLcom/android/server/wm/Task;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/ConfigurationContainer;->getActivityType()I+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; -HSPLcom/android/server/wm/ConfigurationContainer;->getBounds()Landroid/graphics/Rect;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types +HSPLcom/android/server/wm/ConfigurationContainer;->getBounds()Landroid/graphics/Rect;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types +HSPLcom/android/server/wm/ConfigurationContainer;->getConfiguration()Landroid/content/res/Configuration; HSPLcom/android/server/wm/ConfigurationContainer;->getWindowConfiguration()Landroid/app/WindowConfiguration; HSPLcom/android/server/wm/ConfigurationContainer;->getWindowingMode()I+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; HSPLcom/android/server/wm/ConfigurationContainer;->hasChild()Z+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types @@ -3464,70 +3660,78 @@ HSPLcom/android/server/wm/ConfigurationContainer;->inMultiWindowMode()Z+]Landroi HSPLcom/android/server/wm/ConfigurationContainer;->inPinnedWindowingMode()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; HSPLcom/android/server/wm/ConfigurationContainer;->isAlwaysOnTop()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration; HSPLcom/android/server/wm/ConfigurationContainer;->isCompatible(II)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainerListener;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/ConfigurationContainer;->onMergedOverrideConfigurationChanged()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types +HSPLcom/android/server/wm/ConfigurationContainer;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/ConfigurationContainerListener;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/ConfigurationContainer;->onMergedOverrideConfigurationChanged()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types HSPLcom/android/server/wm/ConfigurationContainer;->updateRequestedOverrideConfiguration(Landroid/content/res/Configuration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types -HSPLcom/android/server/wm/DisplayArea$Dimmable;->prepareSurfaces()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayArea$Dimmable;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Dimmable; -HSPLcom/android/server/wm/DisplayArea$Tokens;->getOrientation(I)I+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Tokens; +HSPLcom/android/server/wm/DeferredDisplayUpdater;->calculateDisplayInfoDiff(Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;)I +HSPLcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;->getMinAspectRatio(Lcom/android/server/wm/Task;)F+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/wm/AppCompatAspectRatioOverrides;Lcom/android/server/wm/AppCompatAspectRatioOverrides;]Lcom/android/server/wm/AppCompatCameraPolicy;Lcom/android/server/wm/AppCompatCameraPolicy;]Lcom/android/server/wm/AppCompatOverrides;Lcom/android/server/wm/AppCompatOverrides;]Lcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;Lcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;]Lcom/android/server/wm/TransparentPolicy;Lcom/android/server/wm/TransparentPolicy; +HSPLcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;->hasMinAspectRatioOverride(Lcom/android/server/wm/Task;)Z+]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo; +HSPLcom/android/server/wm/DesktopAppCompatAspectRatioPolicy;->shouldEnableUserAspectRatioSettings(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/AppCompatAspectRatioOverrides;Lcom/android/server/wm/AppCompatAspectRatioOverrides;]Lcom/android/server/wm/AppCompatOverrides;Lcom/android/server/wm/AppCompatOverrides;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/DisplayArea$Dimmable;->prepareSurfaces()V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/Dimmer;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/DisplayArea$Tokens;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayArea;->getItemFromTaskDisplayAreas(Ljava/util/function/Function;Z)Ljava/lang/Object;+]Lcom/android/server/wm/DisplayArea;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/DisplayArea;->asDisplayArea()Lcom/android/server/wm/DisplayArea; +HSPLcom/android/server/wm/DisplayArea;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V +HSPLcom/android/server/wm/DisplayArea;->getIgnoreOrientationRequest()Z+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; +HSPLcom/android/server/wm/DisplayArea;->getItemFromTaskDisplayAreas(Ljava/util/function/Function;Z)Ljava/lang/Object;+]Lcom/android/server/wm/DisplayArea;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/DisplayArea;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction; HSPLcom/android/server/wm/DisplayArea;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/DisplayArea;->getSyncTransaction()Landroid/view/SurfaceControl$Transaction; +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda12;->(Lcom/android/server/wm/DisplayContent;Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;)V +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda12;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda2;->apply(Ljava/lang/Object;)Z +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda34;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda35;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda41;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/wm/DisplayContent$$ExternalSyntheticLambda44;->accept(Ljava/lang/Object;)V HSPLcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;->reset()V HSPLcom/android/server/wm/DisplayContent$ImeContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z HSPLcom/android/server/wm/DisplayContent$ImeContainer;->skipImeWindowsDuringTraversal(Lcom/android/server/wm/DisplayContent;)Z HPLcom/android/server/wm/DisplayContent;->addToGlobalAndConsumeLimit(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Rect;ILcom/android/server/wm/WindowState;I)I+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction()V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;Lcom/android/server/wm/DisplayContent$ApplySurfaceChangesTransactionState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperVisibilityListeners;Lcom/android/server/wm/WallpaperVisibilityListeners;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Ljava/util/LinkedList;Ljava/util/LinkedList; -HSPLcom/android/server/wm/DisplayContent;->assignRelativeLayerForIme(Landroid/view/SurfaceControl$Transaction;Z)V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent$ImeContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->calculateSystemGestureExclusion(Landroid/graphics/Region;Landroid/graphics/Region;)Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; -HSPLcom/android/server/wm/DisplayContent;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent; -HSPLcom/android/server/wm/DisplayContent;->finishHoldScreenUpdate()V+]Landroid/os/PowerManager$WakeLock;Landroid/os/PowerManager$WakeLock; +HSPLcom/android/server/wm/DisplayContent;->adjustDisplaySizeRanges(Landroid/view/DisplayInfo;IIIZ)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy; +HSPLcom/android/server/wm/DisplayContent;->applySurfaceChangesTransaction()V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperVisibilityListeners;Lcom/android/server/wm/WallpaperVisibilityListeners;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Ljava/util/LinkedList;Ljava/util/LinkedList; +HSPLcom/android/server/wm/DisplayContent;->assignRelativeLayerForIme(Landroid/view/SurfaceControl$Transaction;Z)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent$ImeContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->calculateSystemGestureExclusion(Landroid/graphics/Region;Landroid/graphics/Region;)Z+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; +HSPLcom/android/server/wm/DisplayContent;->computeSizeRanges(Landroid/view/DisplayInfo;ZIIFLandroid/content/res/Configuration;Z)V +HSPLcom/android/server/wm/DisplayContent;->finishHoldScreenUpdate()V HSPLcom/android/server/wm/DisplayContent;->getAsyncRotationController()Lcom/android/server/wm/AsyncRotationController; HSPLcom/android/server/wm/DisplayContent;->getDefaultTaskDisplayArea()Lcom/android/server/wm/TaskDisplayArea;+]Lcom/android/server/wm/DisplayAreaPolicy;Lcom/android/server/wm/DisplayAreaPolicyBuilder$Result; HSPLcom/android/server/wm/DisplayContent;->getDisplayId()I HSPLcom/android/server/wm/DisplayContent;->getDisplayInfo()Landroid/view/DisplayInfo; HSPLcom/android/server/wm/DisplayContent;->getDisplayPolicy()Lcom/android/server/wm/DisplayPolicy; -HSPLcom/android/server/wm/DisplayContent;->getFocusedRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/DisplayContent;->getImeTarget(I)Lcom/android/server/wm/InsetsControlTarget; HSPLcom/android/server/wm/DisplayContent;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy; HSPLcom/android/server/wm/DisplayContent;->getKeepClearAreas(Ljava/util/Set;Ljava/util/Set;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; -HSPLcom/android/server/wm/DisplayContent;->getOrientation()I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayRotationCompatPolicy;Lcom/android/server/wm/DisplayRotationCompatPolicy;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController; -HSPLcom/android/server/wm/DisplayContent;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/DisplayContent;->getOrientation()I+]Lcom/android/server/wm/AppCompatCameraPolicy;Lcom/android/server/wm/AppCompatCameraPolicy;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatOrientationOverrides;Lcom/android/server/wm/AppCompatOrientationOverrides;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/DisplayContent;->hasOwnFocus()Z -HSPLcom/android/server/wm/DisplayContent;->inTransition()Z HSPLcom/android/server/wm/DisplayContent;->isKeyguardGoingAway()Z+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController; -HSPLcom/android/server/wm/DisplayContent;->isLayoutNeeded()Z -HSPLcom/android/server/wm/DisplayContent;->lambda$new$1(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->lambda$new$3(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->lambda$new$4(Lcom/android/server/wm/WindowState;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/DisplayContent;->lambda$calculateSystemGestureExclusion$34(Landroid/graphics/Region;Landroid/graphics/Region;Landroid/graphics/Region;[ILandroid/graphics/Region;Landroid/graphics/Region;Lcom/android/server/wm/WindowState;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->lambda$getKeepClearAreas$37(Ljava/util/Set;Ljava/util/Set;Landroid/graphics/Matrix;[FLcom/android/server/wm/WindowState;)Z+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->lambda$new$1(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->lambda$new$3(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->lambda$new$4(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/DisplayContent;->lambda$new$7(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->lambda$new$8(Lcom/android/server/wm/WindowState;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/LinkedList;Ljava/util/LinkedList; +HSPLcom/android/server/wm/DisplayContent;->lambda$new$8(Lcom/android/server/wm/WindowState;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/LinkedList;Ljava/util/LinkedList; HSPLcom/android/server/wm/DisplayContent;->makeChildSurface(Lcom/android/server/wm/WindowContainer;)Landroid/view/SurfaceControl$Builder;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; HSPLcom/android/server/wm/DisplayContent;->needsGestureExclusionRestrictions(Lcom/android/server/wm/WindowState;Z)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->performLayout(ZZ)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; -HSPLcom/android/server/wm/DisplayContent;->performLayoutNoTrace(ZZ)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/DisplayContent;->performLayout(ZZ)V +HSPLcom/android/server/wm/DisplayContent;->performLayoutNoTrace(ZZ)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/DisplayContent;->prepareSurfaces()V -HSPLcom/android/server/wm/DisplayContent;->setDisplayMirroring()Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; -HSPLcom/android/server/wm/DisplayContent;->shouldImeAttachedToApp()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayContent;->updateBaseDisplayMetricsIfNeeded(Landroid/view/DisplayInfo;)V+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/DisplayUpdater;Lcom/android/server/wm/DeferredDisplayUpdater;]Lcom/android/server/wm/DisplayWindowSettings;Lcom/android/server/wm/DisplayWindowSettings; -HSPLcom/android/server/wm/DisplayContent;->updateFocusedWindowLocked(IZI)Z+]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/DisplayContent;->updateKeepClearAreas()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayWindowListenerController;Lcom/android/server/wm/DisplayWindowListenerController;]Ljava/lang/Object;Landroid/util/ArraySet;]Ljava/util/Set;Landroid/util/ArraySet; -HSPLcom/android/server/wm/DisplayContent;->updateOrientation(Z)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/DisplayRotationReversionController;Lcom/android/server/wm/DisplayRotationReversionController;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/DisplayContent;->updateRecording()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/DisplayContent;->setDisplayMirroring()Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService; +HSPLcom/android/server/wm/DisplayContent;->shouldImeAttachedToApp()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent$ImeContainer;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayContent;->updateKeepClearAreas()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayWindowListenerController;Lcom/android/server/wm/DisplayWindowListenerController;]Ljava/util/Set;Landroid/util/ArraySet; +HSPLcom/android/server/wm/DisplayContent;->updateOrientation(Z)Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayRotation;Lcom/android/server/wm/DisplayRotation;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayContent;->updateSystemGestureExclusion()Z+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Landroid/view/ISystemGestureExclusionListener;Landroid/view/ISystemGestureExclusionListener$Stub$Proxy;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; -HSPLcom/android/server/wm/DisplayContent;->updateWindowsForAnimator()V+]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent; HPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;->apply(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; HSPLcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda13;->test(Ljava/lang/Object;)Z -HSPLcom/android/server/wm/DisplayPolicy;->applyKeyguardPolicy(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/ImeInsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/DisplayPolicy;->applyPostLayoutPolicyLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/DisplayPolicy;->beginPostLayoutPolicyLw()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HPLcom/android/server/wm/DisplayPolicy;->calculateInsetsFrame(Landroid/graphics/Rect;Landroid/graphics/Insets;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLcom/android/server/wm/DisplayPolicy;->adjustWindowParamsLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;)V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayPolicy;->applyKeyguardPolicy(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/DisplayPolicy;->applyPostLayoutPolicyLw(Lcom/android/server/wm/WindowState;Landroid/view/WindowManager$LayoutParams;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatLetterboxPolicy;Lcom/android/server/wm/AppCompatLetterboxPolicy;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/DisplayPolicy;->beginPostLayoutPolicyLw()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/wm/DisplayPolicy;->calculateInsetsFrame(Landroid/graphics/Rect;Landroid/graphics/Insets;)V HSPLcom/android/server/wm/DisplayPolicy;->configureNavBarOpacity(IZZ)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy; HSPLcom/android/server/wm/DisplayPolicy;->configureStatusBarOpacity(I)I+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/DisplayPolicy;->drawsBarBackground(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayPolicy;->finishPostLayoutPolicyLw()V+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy; -HPLcom/android/server/wm/DisplayPolicy;->getBarContentFrameForWindow(Lcom/android/server/wm/WindowState;I)Landroid/graphics/Rect;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HPLcom/android/server/wm/DisplayPolicy;->getBarContentFrameForWindow(Lcom/android/server/wm/WindowState;I)Landroid/graphics/Rect;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayPolicy;->getInsetsPolicy()Lcom/android/server/wm/InsetsPolicy;+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/DisplayPolicy;->getNotificationShade()Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayPolicy;->getRefreshRatePolicy()Lcom/android/server/wm/RefreshRatePolicy; @@ -3536,46 +3740,45 @@ HSPLcom/android/server/wm/DisplayPolicy;->intersectsAnyInsets(Landroid/graphics/ HSPLcom/android/server/wm/DisplayPolicy;->isImmersiveMode(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy; HSPLcom/android/server/wm/DisplayPolicy;->isKeyguardShowing()Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; HSPLcom/android/server/wm/DisplayPolicy;->isOverlappingWithNavBar(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HPLcom/android/server/wm/DisplayPolicy;->lambda$getFrameProvider$1(Lcom/android/server/wm/WindowState;IILcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowContainer;Landroid/graphics/Rect;)Ljava/lang/Integer;+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsFrameProvider$InsetsSizeOverride;Landroid/view/InsetsFrameProvider$InsetsSizeOverride;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams; +HPLcom/android/server/wm/DisplayPolicy;->lambda$getFrameProvider$1(Lcom/android/server/wm/WindowState;IILcom/android/server/wm/DisplayFrames;Lcom/android/server/wm/WindowContainer;Landroid/graphics/Rect;)Ljava/lang/Integer;+]Landroid/view/InsetsFrameProvider$InsetsSizeOverride;Landroid/view/InsetsFrameProvider$InsetsSizeOverride;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams; HSPLcom/android/server/wm/DisplayPolicy;->lambda$updateSystemBarsLw$8(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/DisplayPolicy;->layoutWindowLw(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;Lcom/android/server/wm/DisplayFrames;)V+]Landroid/view/WindowLayout;Landroid/view/WindowLayout;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HPLcom/android/server/wm/DisplayPolicy;->navigationBarPosition(I)I HSPLcom/android/server/wm/DisplayPolicy;->shouldBeHiddenByKeyguard(Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayPolicy;->topAppHidesSystemBar(I)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/DisplayPolicy;->updateLightNavigationBarLw(ILcom/android/server/wm/WindowState;)I -HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarAttributes()V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarsLw(Lcom/android/server/wm/WindowState;I)I+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/ImmersiveModeConfirmation;Lcom/android/server/wm/ImmersiveModeConfirmation;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->process(Lcom/android/server/wm/ActivityRecord;Z)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList; +HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarAttributes()V+]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/DisplayPolicy;->updateSystemBarsLw(Lcom/android/server/wm/WindowState;I)I+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/statusbar/StatusBarManagerInternal;Lcom/android/server/statusbar/StatusBarManagerService$1;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/ImmersiveModeConfirmation;Lcom/android/server/wm/ImmersiveModeConfirmation;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->process(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->reset(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->setActivityVisibilityState(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/HighRefreshRateDenylist;->isDenylisted(Ljava/lang/String;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet; +HSPLcom/android/server/wm/EnsureActivitiesVisibleHelper;->setActivityVisibilityState(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/HighRefreshRateDenylist;->isDenylisted(Ljava/lang/String;)Z +HPLcom/android/server/wm/ImeInsetsSourceProvider;->onSourceChanged()V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource; +HPLcom/android/server/wm/ImeInsetsSourceProvider;->setServerVisible(Z)V +HSPLcom/android/server/wm/InputConfigAdapter;->applyMapping(I[Lcom/android/server/wm/InputConfigAdapter$FlagMapping;)I HSPLcom/android/server/wm/InputConfigAdapter;->getInputConfigFromWindowParams(III)I -HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V+]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DragDropController;Lcom/android/server/wm/DragDropController;]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap; -HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Ljava/lang/Object;)V+]Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;Lcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer; -HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->updateInputWindows(Z)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/Map;Ljava/util/Collections$SynchronizedMap; +HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->accept(Ljava/lang/Object;)V +HSPLcom/android/server/wm/InputMonitor$UpdateInputForAllWindowsConsumer;->updateInputWindows(Z)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task; HSPLcom/android/server/wm/InputMonitor$UpdateInputWindows;->run()V+]Lcom/android/server/wm/DragDropController;Lcom/android/server/wm/DragDropController; -HSPLcom/android/server/wm/InputMonitor;->getInputConsumer(Ljava/lang/String;)Lcom/android/server/wm/InputConsumerImpl;+]Ljava/lang/Object;Ljava/lang/String;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/InputMonitor;->populateInputWindowHandle(Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/WindowState;)V+]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/InputMonitor;->getInputConsumer(Ljava/lang/String;)Lcom/android/server/wm/InputConsumerImpl;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/InputMonitor;->populateInputWindowHandle(Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/WindowState;)V+]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/InputMonitor;->resetInputConsumers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/InputConsumerImpl;Lcom/android/server/wm/InputConsumerImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/InputMonitor;->scheduleUpdateInputWindows()V+]Landroid/os/Handler;Landroid/os/Handler; -HSPLcom/android/server/wm/InputMonitor;->updateInputFocusRequest(Lcom/android/server/wm/InputConsumerImpl;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord; +HSPLcom/android/server/wm/InputMonitor;->scheduleUpdateInputWindows()V +HSPLcom/android/server/wm/InputMonitor;->updateInputFocusRequest(Lcom/android/server/wm/InputConsumerImpl;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; HSPLcom/android/server/wm/InputWindowHandleWrapper;->hasWallpaper()Z HSPLcom/android/server/wm/InputWindowHandleWrapper;->isFocusable()Z HSPLcom/android/server/wm/InputWindowHandleWrapper;->isPaused()Z HSPLcom/android/server/wm/InputWindowHandleWrapper;->setDispatchingTimeoutMillis(J)V -HSPLcom/android/server/wm/InputWindowHandleWrapper;->setInputApplicationHandle(Landroid/view/InputApplicationHandle;)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setInputConfigMasked(II)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setLayoutParamsFlags(I)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setName(Ljava/lang/String;)V -HSPLcom/android/server/wm/InputWindowHandleWrapper;->setPaused(Z)V+]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;]Lcom/android/server/wm/InputWindowHandleWrapper;Lcom/android/server/wm/InputWindowHandleWrapper; -HSPLcom/android/server/wm/InputWindowHandleWrapper;->setReplaceTouchableRegionWithCrop(Z)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setScaleFactor(F)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setToken(Landroid/os/IBinder;)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchOcclusionMode(I)V HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region; -HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchableRegionCrop(Landroid/view/SurfaceControl;)V+]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle;]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; -HSPLcom/android/server/wm/InputWindowHandleWrapper;->setWindowToken(Landroid/os/IBinder;)V+]Landroid/view/InputWindowHandle;Landroid/view/InputWindowHandle; -HSPLcom/android/server/wm/InsetsPolicy;->adjustInsetsForRoundedCorners(Lcom/android/server/wm/WindowToken;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; +HSPLcom/android/server/wm/InputWindowHandleWrapper;->setTouchableRegionCrop(Landroid/view/SurfaceControl;)V+]Ljava/lang/ref/WeakReference;Ljava/lang/ref/WeakReference; +HSPLcom/android/server/wm/InputWindowHandleWrapper;->setWindowToken(Landroid/os/IBinder;)V +HSPLcom/android/server/wm/InsetsPolicy;->adjustInsetsForRoundedCorners(Lcom/android/server/wm/WindowToken;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord; HSPLcom/android/server/wm/InsetsPolicy;->adjustInsetsForWindow(Lcom/android/server/wm/WindowState;Landroid/view/InsetsState;Z)Landroid/view/InsetsState; HSPLcom/android/server/wm/InsetsPolicy;->adjustVisibilityForFakeControllingSources(Landroid/view/InsetsState;)Landroid/view/InsetsState;+]Landroid/view/InsetsState;Landroid/view/InsetsState; HSPLcom/android/server/wm/InsetsPolicy;->adjustVisibilityForIme(Lcom/android/server/wm/WindowState;Landroid/view/InsetsState;Z)Landroid/view/InsetsState;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; @@ -3583,155 +3786,132 @@ HSPLcom/android/server/wm/InsetsPolicy;->canBeTopFullscreenOpaqueWindow(Lcom/and HSPLcom/android/server/wm/InsetsPolicy;->enforceInsetsPolicyForTarget(Landroid/view/WindowManager$LayoutParams;IZLandroid/view/InsetsState;)Landroid/view/InsetsState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; HSPLcom/android/server/wm/InsetsPolicy;->getNavControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/InsetsPolicy;->getStatusControlTarget(Lcom/android/server/wm/WindowState;Z)Lcom/android/server/wm/InsetsControlTarget;+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/InsetsPolicy;->hasHiddenSources(I)Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; -HSPLcom/android/server/wm/InsetsPolicy;->remoteInsetsControllerControlsSystemBars(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy; -HSPLcom/android/server/wm/InsetsPolicy;->updateBarControlTarget(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; +HSPLcom/android/server/wm/InsetsPolicy;->hasHiddenSources(I)Z+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; +HSPLcom/android/server/wm/InsetsPolicy;->updateBarControlTarget(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; HSPLcom/android/server/wm/InsetsPolicy;->updateSystemBars(Lcom/android/server/wm/WindowState;ZZ)V+]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; HPLcom/android/server/wm/InsetsSourceProvider;->getInsetsHint()Landroid/graphics/Insets;+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/InsetsSourceProvider;->getSource()Landroid/view/InsetsSource; HPLcom/android/server/wm/InsetsSourceProvider;->getWindowFrameSurfacePosition()Landroid/graphics/Point;+]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HPLcom/android/server/wm/InsetsSourceProvider;->isClientVisible()Z -HSPLcom/android/server/wm/InsetsSourceProvider;->onPostLayout()V+]Landroid/graphics/Insets;Landroid/graphics/Insets;]Landroid/view/InsetsSourceControl;Landroid/view/InsetsSourceControl;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/function/Consumer;Lcom/android/server/wm/InsetsSourceProvider$$ExternalSyntheticLambda0; +HSPLcom/android/server/wm/InsetsSourceProvider;->onPostLayout()V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/InsetsSourceProvider;->overridesFrame(I)Z+]Landroid/util/SparseArray;Landroid/util/SparseArray; HPLcom/android/server/wm/InsetsSourceProvider;->setServerVisible(Z)V+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider; -HPLcom/android/server/wm/InsetsSourceProvider;->updateControlForTarget(Lcom/android/server/wm/InsetsControlTarget;Z)V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/InsetsStateController$1;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrame(Landroid/graphics/Rect;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/internal/util/function/TriFunction;Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda11;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Ljava/lang/Integer;Ljava/lang/Integer; -HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrameForServerVisibility()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState; +HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrame(Landroid/graphics/Rect;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/internal/util/function/TriFunction;Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda0;,Lcom/android/server/wm/DisplayPolicy$$ExternalSyntheticLambda11;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HPLcom/android/server/wm/InsetsSourceProvider;->updateSourceFrameForServerVisibility()V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState; HPLcom/android/server/wm/InsetsSourceProvider;->updateVisibility()V+]Landroid/view/InsetsSource;Landroid/view/InsetsSource; HSPLcom/android/server/wm/InsetsStateController;->getImeSourceProvider()Lcom/android/server/wm/ImeInsetsSourceProvider;+]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; HSPLcom/android/server/wm/InsetsStateController;->getOrCreateSourceProvider(II)Lcom/android/server/wm/InsetsSourceProvider;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider; -HPLcom/android/server/wm/InsetsStateController;->lambda$notifyPendingInsetsControlChanged$3()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/DisplayContent$RemoteInsetsControlTarget;,Lcom/android/server/wm/InsetsPolicy$ControlTarget;,Lcom/android/server/wm/InsetsStateController$1;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; -HSPLcom/android/server/wm/InsetsStateController;->notifyPendingInsetsControlChanged()V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator; -HSPLcom/android/server/wm/InsetsStateController;->onBarControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; -HPLcom/android/server/wm/InsetsStateController;->onControlTargetChanged(Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsControlTarget;Z)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; +HSPLcom/android/server/wm/InsetsStateController;->getRawInsetsState()Landroid/view/InsetsState; +HSPLcom/android/server/wm/InsetsStateController;->notifyPendingInsetsControlChanged()V+]Landroid/util/SparseLongArray;Landroid/util/SparseLongArray;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator; +HSPLcom/android/server/wm/InsetsStateController;->onBarControlTargetChanged(Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/InsetsControlTarget;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider; +HPLcom/android/server/wm/InsetsStateController;->onControlTargetChanged(Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/InsetsControlTarget;Z)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsSource;Landroid/view/InsetsSource;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider; HSPLcom/android/server/wm/InsetsStateController;->onPostLayout()V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; -HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->updateVisibility(Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/DisplayContent;)V+]Landroid/os/PowerManager;Landroid/os/PowerManager;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; +HSPLcom/android/server/wm/KeyguardController$KeyguardDisplayState;->updateVisibility(Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; HSPLcom/android/server/wm/KeyguardController;->getDisplayState(I)Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;+]Landroid/util/SparseArray;Landroid/util/SparseArray; -HSPLcom/android/server/wm/KeyguardController;->updateVisibility()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;]Lcom/android/server/wm/KeyguardController;Lcom/android/server/wm/KeyguardController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer; -HSPLcom/android/server/wm/LetterboxConfiguration;->getDefaultLetterboxBackgroundType()I+]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig; -HSPLcom/android/server/wm/LetterboxConfiguration;->isUserAppAspectRatioSettingsEnabled()Z+]Lcom/android/server/wm/SynchedDeviceConfig;Lcom/android/server/wm/SynchedDeviceConfig; -HSPLcom/android/server/wm/LetterboxUiController;->findOpaqueNotFinishingActivityBelow()Ljava/util/Optional; -HSPLcom/android/server/wm/LetterboxUiController;->isHorizontalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController; -HSPLcom/android/server/wm/LetterboxUiController;->isUserFullscreenOverrideEnabled()Z+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp;]Ljava/lang/Object;Ljava/lang/Boolean; -HSPLcom/android/server/wm/LetterboxUiController;->isVerticalReachabilityEnabled(Landroid/content/res/Configuration;)Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController; -HSPLcom/android/server/wm/LetterboxUiController;->layoutLetterboxIfNeeded(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Letterbox;Lcom/android/server/wm/Letterbox;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/LetterboxUiController;->overrideOrientationIfNeeded(I)I+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp;]Ljava/lang/Object;Ljava/lang/Boolean;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/wm/LetterboxUiController;->shouldEnableUserAspectRatioSettings()Z+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration;]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp;]Ljava/lang/Object;Ljava/lang/Boolean; -HSPLcom/android/server/wm/LetterboxUiController;->shouldNotLayoutLetterbox(Lcom/android/server/wm/WindowState;)Z -HSPLcom/android/server/wm/LetterboxUiController;->shouldShowLetterboxUi(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/LetterboxUiController;->updateRoundedCornersIfNeeded(Lcom/android/server/wm/WindowState;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/view/SurfaceControl;Landroid/view/SurfaceControl;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/LetterboxUiController;->updateWallpaperForLetterbox(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/LetterboxConfiguration;Lcom/android/server/wm/LetterboxConfiguration; +HSPLcom/android/server/wm/KeyguardController;->updateVisibility()V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;Lcom/android/server/wm/KeyguardController$KeyguardDisplayState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer; HSPLcom/android/server/wm/MirrorActiveUids;->hasNonAppVisibleWindow(I)Z+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; HSPLcom/android/server/wm/MirrorActiveUids;->onUidProcStateChanged(II)V+]Landroid/util/SparseIntArray;Landroid/util/SparseIntArray; -HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;)V+]Landroid/view/InputEvent;Landroid/view/MotionEvent;]Landroid/view/InputEventReceiver;Lcom/android/server/wm/PointerEventDispatcher;]Landroid/view/WindowManagerPolicyConstants$PointerEventListener;Lcom/android/internal/widget/PointerLocationView;,Lcom/android/server/wm/RecentTasks$1;,Lcom/android/server/wm/SystemGesturesPointerEventListener; +HPLcom/android/server/wm/PointerEventDispatcher;->onInputEvent(Landroid/view/InputEvent;)V+]Landroid/view/WindowManagerPolicyConstants$PointerEventListener;Lcom/android/internal/widget/PointerLocationView;,Lcom/android/server/wm/RecentTasks$1;,Lcom/android/server/wm/SystemGesturesPointerEventListener; HSPLcom/android/server/wm/RecentTasks;->isCallerRecents(I)Z -HSPLcom/android/server/wm/RefreshRatePolicy$FrameRateVote;->update(FII)Z+]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote; +HSPLcom/android/server/wm/RefreshRatePolicy$FrameRateVote;->update(FII)Z HSPLcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;->get(Ljava/lang/String;)Landroid/view/SurfaceControl$RefreshRateRange;+]Ljava/util/HashMap;Ljava/util/HashMap; -HSPLcom/android/server/wm/RefreshRatePolicy;->calculatePriority(Lcom/android/server/wm/WindowState;)I+]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredMaxRefreshRate(Lcom/android/server/wm/WindowState;)F+]Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredMinRefreshRate(Lcom/android/server/wm/WindowState;)F+]Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;Lcom/android/server/wm/RefreshRatePolicy$PackageRefreshRate;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredModeId(Lcom/android/server/wm/WindowState;)I+]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/RefreshRatePolicy;->updateFrameRateVote(Lcom/android/server/wm/WindowState;)Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Landroid/view/Display$Mode;Landroid/view/Display$Mode;]Lcom/android/server/wm/HighRefreshRateDenylist;Lcom/android/server/wm/HighRefreshRateDenylist;]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/RootWindowContainer$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Ljava/lang/Long;Ljava/lang/Long; -HSPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction()V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/StrictModeFlash;Lcom/android/server/wm/StrictModeFlash;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/RootWindowContainer;->checkAppTransitionReady(Lcom/android/server/wm/WindowSurfacePlacer;)V+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/RefreshRatePolicy;->getPreferredModeId(Lcom/android/server/wm/WindowState;)I +HSPLcom/android/server/wm/RefreshRatePolicy;->updateFrameRateVote(Lcom/android/server/wm/WindowState;)Z+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Lcom/android/server/wm/HighRefreshRateDenylist;Lcom/android/server/wm/HighRefreshRateDenylist;]Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;Lcom/android/server/wm/RefreshRatePolicy$FrameRateVote;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/RootWindowContainer$MyHandler;->handleMessage(Landroid/os/Message;)V+]Landroid/os/PowerManagerInternal;Lcom/android/server/power/PowerManagerService$LocalService;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; +HSPLcom/android/server/wm/RootWindowContainer;->applySurfaceChangesTransaction()V+]Landroid/hardware/display/DisplayManagerInternal;Lcom/android/server/display/DisplayManagerService$LocalService;]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/StrictModeFlash;Lcom/android/server/wm/StrictModeFlash;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->checkAppTransitionReady(Lcom/android/server/wm/WindowSurfacePlacer;)V+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/AppTransitionController;Lcom/android/server/wm/AppTransitionController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/RootWindowContainer;->clearFrameChangingWindows()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/RootWindowContainer;->copyAnimToLayoutParams()Z -HSPLcom/android/server/wm/RootWindowContainer;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer; -HSPLcom/android/server/wm/RootWindowContainer;->forAllDisplays(Ljava/util/function/Consumer;)V+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/util/function/Consumer;megamorphic_types +HSPLcom/android/server/wm/RootWindowContainer;->forAllDisplays(Ljava/util/function/Consumer;)V+]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Consumer;megamorphic_types HSPLcom/android/server/wm/RootWindowContainer;->getDisplayContent(I)Lcom/android/server/wm/DisplayContent;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/RootWindowContainer; -HPLcom/android/server/wm/RootWindowContainer;->getRootTaskInfo(Lcom/android/server/wm/Task;)Landroid/app/ActivityTaskManager$RootTaskInfo;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/RootWindowContainer;->handleResizingWindows()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/RootWindowContainer;->hasPendingLayoutChanges(Lcom/android/server/wm/WindowAnimator;)Z+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/RootWindowContainer;->lambda$performSurfacePlacementNoTrace$7(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor; +HPLcom/android/server/wm/RootWindowContainer;->getRootTaskInfo(Lcom/android/server/wm/Task;)Landroid/app/ActivityTaskManager$RootTaskInfo;+]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/RootWindowContainer;->handleNotObscuredLocked(Lcom/android/server/wm/WindowState;ZZ)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/RootWindowContainer;->handleResizingWindows()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->hasPendingLayoutChanges(Lcom/android/server/wm/WindowAnimator;)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->isLayoutNeeded()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->lambda$performSurfacePlacementNoTrace$7(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacement()V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; -HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace()V+]Landroid/os/Handler;Lcom/android/server/wm/RootWindowContainer$MyHandler;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList; -HSPLcom/android/server/wm/RootWindowContainer;->updateFocusedWindowLocked(IZ)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;ILcom/android/server/wm/RecentTasks;Lcom/android/server/wm/WindowContainer;ILandroid/util/ArraySet;)V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/RunningTasks;Lcom/android/server/wm/RunningTasks;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->performSurfacePlacementNoTrace()V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/RootWindowContainer;->updateFocusedWindowLocked(IZ)Z+]Lcom/android/server/input/InputManagerService;Lcom/android/server/input/InputManagerService;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/wm/RunningTasks;->accept(Lcom/android/server/wm/Task;)V+]Lcom/android/server/wm/RecentTasks;Lcom/android/server/wm/RecentTasks;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/wm/RunningTasks;->createRunningTaskInfo(Lcom/android/server/wm/Task;J)Landroid/app/ActivityManager$RunningTaskInfo;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; +HPLcom/android/server/wm/RunningTasks;->getTasks(ILjava/util/List;ILcom/android/server/wm/RecentTasks;Lcom/android/server/wm/WindowContainer;ILandroid/util/ArraySet;)V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/wm/SafeActivityOptions;->(Landroid/app/ActivityOptions;)V -HPLcom/android/server/wm/SafeActivityOptions;->setCallerOptions(Landroid/app/ActivityOptions;)V -HPLcom/android/server/wm/Session;->setWallpaperZoomOut(Landroid/os/IBinder;F)V+]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session; -HSPLcom/android/server/wm/SmoothDimmer;->getDimBounds()Landroid/graphics/Rect; -HSPLcom/android/server/wm/SmoothDimmer;->resetDimStates()V -HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZLjava/util/function/Supplier;)Landroid/view/SurfaceControl;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken; -HSPLcom/android/server/wm/SurfaceAnimator;->hasLeash()Z +HPLcom/android/server/wm/Session;->setWallpaperZoomOut(Landroid/os/IBinder;F)V +HPLcom/android/server/wm/SurfaceAnimator;->createAnimationLeash(Lcom/android/server/wm/SurfaceAnimator$Animatable;Landroid/view/SurfaceControl;Landroid/view/SurfaceControl$Transaction;IIIIIZLjava/util/function/Supplier;)Landroid/view/SurfaceControl;+]Landroid/view/SurfaceControl$Builder;Landroid/view/SurfaceControl$Builder;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/SurfaceAnimator$Animatable;megamorphic_types HSPLcom/android/server/wm/SurfaceAnimator;->isAnimating()Z -HSPLcom/android/server/wm/SurfaceAnimator;->reset(Landroid/view/SurfaceControl$Transaction;Z)V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; -HPLcom/android/server/wm/SurfaceAnimator;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/SurfaceFreezer;)V+]Lcom/android/server/wm/AnimationAdapter;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator$Animatable;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer; +HPLcom/android/server/wm/SurfaceAnimator;->startAnimation(Landroid/view/SurfaceControl$Transaction;Lcom/android/server/wm/AnimationAdapter;ZILcom/android/server/wm/SurfaceAnimator$OnAnimationFinishedCallback;Ljava/lang/Runnable;Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/SurfaceFreezer;)V+]Lcom/android/server/wm/AnimationAdapter;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator$Animatable;megamorphic_types]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/SurfaceFreezer;Lcom/android/server/wm/SurfaceFreezer; HSPLcom/android/server/wm/SynchedDeviceConfig;->getFlagValue(Ljava/lang/String;)Z+]Ljava/util/Map;Ljava/util/concurrent/ConcurrentHashMap; HPLcom/android/server/wm/SystemGesturesPointerEventListener;->detectSwipe(IJFF)I HSPLcom/android/server/wm/SystemGesturesPointerEventListener;->onConfigurationChanged()V+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources; -HPLcom/android/server/wm/SystemGesturesPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/view/GestureDetector;Lcom/android/server/wm/SystemGesturesPointerEventListener$1;]Landroid/view/MotionEvent;Landroid/view/MotionEvent;]Lcom/android/server/wm/SystemGesturesPointerEventListener$Callbacks;Lcom/android/server/wm/DisplayPolicy$1;]Lcom/android/server/wm/SystemGesturesPointerEventListener;Lcom/android/server/wm/SystemGesturesPointerEventListener; +HPLcom/android/server/wm/SystemGesturesPointerEventListener;->onPointerEvent(Landroid/view/MotionEvent;)V+]Landroid/view/GestureDetector;Lcom/android/server/wm/SystemGesturesPointerEventListener$1;]Lcom/android/server/wm/SystemGesturesPointerEventListener$Callbacks;Lcom/android/server/wm/DisplayPolicy$1; HSPLcom/android/server/wm/Task$FindRootHelper;->findRoot(ZZ)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/Task$FindRootHelper;->test(Lcom/android/server/wm/ActivityRecord;)Z+]Landroid/content/pm/ApplicationInfo;Landroid/content/pm/ApplicationInfo; -HSPLcom/android/server/wm/Task;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/Task;->checkTranslucentActivityWaiting(Lcom/android/server/wm/ActivityRecord;)V+]Landroid/os/Handler;Lcom/android/server/wm/Task$ActivityTaskHandler;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/Task;->ensureActivitiesVisible(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;ZLcom/android/server/wm/TaskDisplayArea;)V+]Landroid/app/AppCompatTaskInfo;Landroid/app/AppCompatTaskInfo;]Landroid/app/PictureInPictureParams;Landroid/app/PictureInPictureParams;]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/Intent;Landroid/content/Intent;]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/util/function/Consumer;megamorphic_types -HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/util/function/Predicate;Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda16;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda18;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda31;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda39;,Lcom/android/server/wm/RootWindowContainer$FindTaskResult; -HSPLcom/android/server/wm/Task;->forAllRootTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Consumer;megamorphic_types -HSPLcom/android/server/wm/Task;->getDisplayCutoutInsets()Landroid/graphics/Rect;+]Landroid/view/DisplayCutout;Landroid/view/DisplayCutout;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/Task$FindRootHelper;->test(Ljava/lang/Object;)Z+]Lcom/android/server/wm/Task$FindRootHelper;Lcom/android/server/wm/Task$FindRootHelper; +HSPLcom/android/server/wm/Task;->asTask()Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/Task;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/Task;->cropWindowsToRootTaskBounds()Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/Task;->fillTaskInfo(Landroid/app/TaskInfo;ZLcom/android/server/wm/TaskDisplayArea;)V+]Landroid/app/TaskInfo;Landroid/app/ActivityManager$RecentTaskInfo;,Landroid/app/ActivityManager$RunningTaskInfo;,Landroid/app/ActivityTaskManager$RootTaskInfo;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/Intent;Landroid/content/Intent;]Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/Task;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Consumer;megamorphic_types +HSPLcom/android/server/wm/Task;->getAdjacentTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea; +HSPLcom/android/server/wm/Task;->getDisplayCutoutInsets()Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/Task;->getRootActivity(ZZ)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task$FindRootHelper;Lcom/android/server/wm/Task$FindRootHelper; HSPLcom/android/server/wm/Task;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Ljava/util/function/Predicate;megamorphic_types -HSPLcom/android/server/wm/Task;->getTopLeafTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/Task;->getTopPausingActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/Task;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/Task;->getTopLeafTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/Task;->getTopResumedActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/Task;->hasVisibleChildren()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/Task;->isLeafTask()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/Task;->isResizeable(Z)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/Task;->isFocused()Z +HSPLcom/android/server/wm/Task;->isLeafTask()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/Task;->isOrganized()Z +HSPLcom/android/server/wm/Task;->isResizeable(Z)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; HSPLcom/android/server/wm/Task;->isRootTask()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/Task;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController; -HSPLcom/android/server/wm/Task;->prepareSurfaces()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/LegacyDimmer;,Lcom/android/server/wm/SmoothDimmer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/Task;->prepareSurfaces()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/Dimmer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TrustedOverlayHost;Lcom/android/server/wm/TrustedOverlayHost;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/Task;->setTaskDescriptionFromActivityAboveRoot(Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityManager$TaskDescription;)Z+]Landroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskDescription; HSPLcom/android/server/wm/Task;->shouldIgnoreInput()Z -HSPLcom/android/server/wm/Task;->shouldSleepActivities()Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/TaskChangeNotificationController;->forAllLocalListeners(Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V+]Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/TaskChangeNotificationController;->forAllRemoteListeners(Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;Landroid/os/Message;)V+]Landroid/os/RemoteCallbackList;Landroid/os/RemoteCallbackList;]Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer;megamorphic_types HSPLcom/android/server/wm/TaskDisplayArea$$ExternalSyntheticLambda0;->test(Ljava/lang/Object;)Z HSPLcom/android/server/wm/TaskDisplayArea;->adjustRootTaskLayer(Landroid/view/SurfaceControl$Transaction;Ljava/util/ArrayList;I)I+]Landroid/util/IntArray;Landroid/util/IntArray;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/TaskDisplayArea;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/TaskDisplayArea;->assignRootTaskOrdering(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;,Ljava/util/ArrayList; -HSPLcom/android/server/wm/TaskDisplayArea;->getRootTask(II)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/TaskDisplayArea; +HSPLcom/android/server/wm/TaskDisplayArea;->assignRootTaskOrdering(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/TaskDisplayArea;->getRootTask(II)Lcom/android/server/wm/Task; HSPLcom/android/server/wm/TaskDisplayArea;->lambda$getRootTask$0(IILcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/TaskFragment;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/util/function/Predicate;Lcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda30;,Lcom/android/server/wm/ActivityRecord$$ExternalSyntheticLambda31;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda26;,Lcom/android/server/wm/RootWindowContainer$$ExternalSyntheticLambda49;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda15;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda16;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda27;,Lcom/android/server/wm/Task$$ExternalSyntheticLambda28;,Lcom/android/server/wm/TaskFragmentOrganizerController$$ExternalSyntheticLambda0; +HSPLcom/android/server/wm/TaskFragment;->asTaskFragment()Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Predicate;megamorphic_types HSPLcom/android/server/wm/TaskFragment;->getActivityType()I+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/TaskFragment;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->getDisplayArea()Lcom/android/server/wm/TaskDisplayArea; -HSPLcom/android/server/wm/TaskFragment;->getOrganizedTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; -HSPLcom/android/server/wm/TaskFragment;->getRootTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->getOrganizedTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea; +HSPLcom/android/server/wm/TaskFragment;->getRootTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/TaskFragment;->getRootTaskFragment()Lcom/android/server/wm/TaskFragment;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea; HSPLcom/android/server/wm/TaskFragment;->getTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->getTopNonFinishingActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->getVisibility(Lcom/android/server/wm/ActivityRecord;)I+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/wm/TaskFragment;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->getTopNonFinishingActivity(ZZ)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->getVisibility(Lcom/android/server/wm/ActivityRecord;)I+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->hasRunningActivity(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->isAttached()Z+]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->isFocusableAndVisible()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task; +HSPLcom/android/server/wm/TaskFragment;->isAttached()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->isForceHidden()Z -HSPLcom/android/server/wm/TaskFragment;->isLeafTaskFragment()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/TaskFragment;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/TaskFragment;->isTopActivityFocusable()Z+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->isTranslucent(Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->isTranslucent(Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->prepareSurfaces()V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/SmoothDimmer;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->prepareSurfaces()V+]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/Dimmer;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->resumeTopActivity(Lcom/android/server/wm/ActivityRecord;Landroid/app/ActivityOptions;Z)Z+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Lcom/android/server/wm/ActivityMetricsLogger;Lcom/android/server/wm/ActivityMetricsLogger;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/AppWarnings;Lcom/android/server/wm/AppWarnings;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/TaskFragment;->shouldDeferRemoval()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/TaskFragment;->supportsMultiWindowInDisplayArea(Lcom/android/server/wm/TaskDisplayArea;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/TaskFragment;->shouldSleepActivities()Z+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; +HSPLcom/android/server/wm/TaskFragment;->supportsMultiWindowInDisplayArea(Lcom/android/server/wm/TaskDisplayArea;)Z+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->topRunningActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->topRunningActivity(Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; HSPLcom/android/server/wm/TaskFragment;->updateActivityVisibilities(Lcom/android/server/wm/ActivityRecord;Z)V+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/EnsureActivitiesVisibleHelper;Lcom/android/server/wm/EnsureActivitiesVisibleHelper; -HSPLcom/android/server/wm/TaskFragmentOrganizerController;->dispatchPendingEvents()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/TaskFragmentOrganizerController;Lcom/android/server/wm/TaskFragmentOrganizerController;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; -HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchPendingEvents()V+]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/TaskOrganizerController;->dispatchPendingEvents()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; +HSPLcom/android/server/wm/TaskFragmentOrganizerController;->dispatchPendingEvents()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; +HPLcom/android/server/wm/TaskFragmentOrganizerController;->shouldDeferPendingEvents(Lcom/android/server/wm/TaskFragmentOrganizerController$TaskFragmentOrganizerState;Ljava/util/List;)Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/TaskFragment;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchPendingEvents()V+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/TaskOrganizerController$TaskOrganizerPendingEventsQueue;->dispatchTaskInfoChanged(Lcom/android/server/wm/Task;Z)V+]Landroid/app/ActivityManager$RunningTaskInfo;Landroid/app/ActivityManager$RunningTaskInfo;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;Lcom/android/server/wm/TaskOrganizerController$TaskOrganizerCallbacks;]Ljava/util/WeakHashMap;Ljava/util/WeakHashMap; +HSPLcom/android/server/wm/TaskOrganizerController;->dispatchPendingEvents()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; HSPLcom/android/server/wm/Transition$ChangeInfo;->(Lcom/android/server/wm/WindowContainer;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types +HSPLcom/android/server/wm/Transition;->(IILcom/android/server/wm/TransitionController;Lcom/android/server/wm/BLASTSyncEngine;)V HSPLcom/android/server/wm/Transition;->calculateTransitionInfo(IILjava/util/ArrayList;Landroid/view/SurfaceControl$Transaction;)Landroid/window/TransitionInfo;+]Landroid/app/ActivityManager$TaskDescription;Landroid/app/ActivityManager$TaskDescription;]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/content/pm/ActivityInfo;Landroid/content/pm/ActivityInfo;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/Transition$ChangeInfo;Lcom/android/server/wm/Transition$ChangeInfo;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer$RemoteToken;Lcom/android/server/wm/WindowContainer$RemoteToken;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/Transition;->collect(Lcom/android/server/wm/WindowContainer;)V+]Lcom/android/server/wm/BLASTSyncEngine;Lcom/android/server/wm/BLASTSyncEngine;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/Transition;->finishTransition()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/os/Handler;Landroid/os/Handler;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayRotationCompatPolicy;Lcom/android/server/wm/DisplayRotationCompatPolicy;]Lcom/android/server/wm/InputMonitor;Lcom/android/server/wm/InputMonitor;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/TaskDisplayArea;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;,Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24; -HSPLcom/android/server/wm/Transition;->isInTransition(Lcom/android/server/wm/WindowContainer;)Z+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/Transition;->onTransactionReady(ILandroid/view/SurfaceControl$Transaction;)V+]Landroid/util/ArraySet;Landroid/util/ArraySet;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/window/ITransitionPlayer;Landroid/window/ITransitionPlayer$Stub$Proxy;]Landroid/window/TransitionInfo$AnimationOptions;Landroid/window/TransitionInfo$AnimationOptions;]Landroid/window/TransitionInfo$Root;Landroid/window/TransitionInfo$Root;]Landroid/window/TransitionInfo;Landroid/window/TransitionInfo;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController$Logger;Lcom/android/server/wm/TransitionController$Logger;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda23;,Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24; +HSPLcom/android/server/wm/Transition;->finishTransition(Lcom/android/server/wm/ActionChain;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/inputmethod/InputMethodManagerInternal;Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl;]Lcom/android/server/wm/ActionChain;Lcom/android/server/wm/ActionChain;]Lcom/android/server/wm/ActivityRecordInputSink;Lcom/android/server/wm/ActivityRecordInputSink;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/AppCompatCameraPolicy;Lcom/android/server/wm/AppCompatCameraPolicy;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskChangeNotificationController;Lcom/android/server/wm/TaskChangeNotificationController;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskSnapshotController;Lcom/android/server/wm/TaskSnapshotController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; +HSPLcom/android/server/wm/Transition;->isInTransition(Lcom/android/server/wm/WindowContainer;)Z +HSPLcom/android/server/wm/Transition;->onTransactionReady(ILandroid/view/SurfaceControl$Transaction;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Landroid/window/ITransitionPlayer;Landroid/window/ITransitionPlayer$Stub$Proxy;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/SnapshotController;Lcom/android/server/wm/SnapshotController;]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController$Logger;Lcom/android/server/wm/TransitionController$Logger;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/TransitionTracer;Lcom/android/server/wm/LegacyTransitionTracer;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; HSPLcom/android/server/wm/TransitionController;->canAssignLayers(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;megamorphic_types HSPLcom/android/server/wm/TransitionController;->inCollectingTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/TransitionController;->inPlayingTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/TransitionController;->inTransition()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/TransitionController;->inTransition(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController; HSPLcom/android/server/wm/TransitionController;->isCollecting()Z HSPLcom/android/server/wm/TransitionController;->isPlaying()Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; @@ -3739,91 +3919,99 @@ HSPLcom/android/server/wm/TransitionController;->isShellTransitionsEnabled()Z+]L HSPLcom/android/server/wm/TransitionController;->isTransientVisible(Lcom/android/server/wm/Task;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/TransitionController;->isTransitionOnDisplay(Lcom/android/server/wm/DisplayContent;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/TransitionController;->shouldKeepFocus(Lcom/android/server/wm/WindowContainer;)Z+]Lcom/android/server/wm/Transition;Lcom/android/server/wm/Transition;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/TransparentPolicy$TransparentPolicyState;->findOpaqueNotFinishingActivityBelow()Ljava/util/Optional; +HSPLcom/android/server/wm/TransparentPolicy;->findOpaqueNotFinishingActivityBelow()Ljava/util/Optional; +HSPLcom/android/server/wm/TransparentPolicy;->isRunning()Z HSPLcom/android/server/wm/VisibleActivityProcessTracker;->hasVisibleActivity(I)Z -HSPLcom/android/server/wm/VisibleActivityProcessTracker;->match(ILjava/util/function/Predicate;)Z+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Ljava/util/function/Predicate;Lcom/android/server/wm/VisibleActivityProcessTracker$$ExternalSyntheticLambda0; +HSPLcom/android/server/wm/VisibleActivityProcessTracker;->match(ILjava/util/function/Predicate;)Z+]Ljava/util/function/Predicate;Lcom/android/server/wm/VisibleActivityProcessTracker$$ExternalSyntheticLambda0; HSPLcom/android/server/wm/WallpaperController;->hideWallpapers(Lcom/android/server/wm/WindowState;)V+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WallpaperController;->isWallpaperVisible()Z+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WallpaperController;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/BackNavigationController$AnimationHandler$BackWindowAnimationAdaptor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;Lcom/android/server/wm/WallpaperController$FindWallpaperTargetResult;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;Z)Z+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;]Lcom/android/server/wallpaper/WallpaperCropper$WallpaperCropUtils;Lcom/android/server/wallpaper/WallpaperManagerService$$ExternalSyntheticLambda5;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/wm/WallpaperController;->lambda$new$0(Lcom/android/server/wm/WindowState;)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/AnimationAdapter;Lcom/android/server/wm/BackNavigationController$AnimationHandler$BackWindowAnimationAdaptor;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WallpaperController;->updateWallpaperOffset(Lcom/android/server/wm/WindowState;Z)Z+]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;]Lcom/android/server/wallpaper/WallpaperCropper$WallpaperCropUtils;Lcom/android/server/wallpaper/WallpaperManagerService$$ExternalSyntheticLambda5;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WallpaperWindowToken;->isVisible()Z+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WallpaperWindowToken; -HSPLcom/android/server/wm/WallpaperWindowToken;->setVisibility(Z)V+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken; -HSPLcom/android/server/wm/WindowAnimator;->animate(J)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/WindowTracing;Lcom/android/server/wm/WindowTracing; +HSPLcom/android/server/wm/WallpaperWindowToken;->prepareSurfaces()V +HSPLcom/android/server/wm/WallpaperWindowToken;->setVisibility(Z)V+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken; +HSPLcom/android/server/wm/WindowAnimator;->animate(J)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/TaskOrganizerController;Lcom/android/server/wm/TaskOrganizerController;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Lcom/android/server/wm/WindowTracing;Lcom/android/server/wm/WindowTracing;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowAnimator;->cancelAnimation()V -HSPLcom/android/server/wm/WindowAnimator;->executeAfterPrepareSurfacesRunnables()V+]Ljava/lang/Runnable;Lcom/android/server/wm/BackNavigationController$$ExternalSyntheticLambda9;,Lcom/android/server/wm/InsetsStateController$$ExternalSyntheticLambda0;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WindowAnimator;->lambda$new$1(J)V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator; -HSPLcom/android/server/wm/WindowAnimator;->scheduleAnimation()V+]Landroid/view/Choreographer;Landroid/view/Choreographer; +HSPLcom/android/server/wm/WindowAnimator;->lambda$new$1(J)V +HSPLcom/android/server/wm/WindowAnimator;->scheduleAnimation()V HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Lcom/android/server/wm/WindowState;)Z+]Ljava/util/function/Consumer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z+]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper; -HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; -HSPLcom/android/server/wm/WindowContainer;->(Lcom/android/server/wm/WindowManagerService;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24; -HSPLcom/android/server/wm/WindowContainer;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->apply(Ljava/lang/Object;)Z +HSPLcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;->release()V +HSPLcom/android/server/wm/WindowContainer;->(Lcom/android/server/wm/WindowManagerService;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; +HSPLcom/android/server/wm/WindowContainer;->asTaskFragment()Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/WindowContainer;->asWallpaperToken()Lcom/android/server/wm/WallpaperWindowToken; +HSPLcom/android/server/wm/WindowContainer;->assignChildLayers(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Predicate;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllRootTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;]Lcom/android/server/wm/WindowContainer;megamorphic_types +HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllActivities(Ljava/util/function/Predicate;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllLeafTaskFragments(Ljava/util/function/Predicate;)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllLeafTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllRootTasks(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->forAllWindows(Ljava/util/function/Consumer;Z)V+]Lcom/android/server/wm/WindowContainer;megamorphic_types HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ[Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Lcom/android/server/wm/WindowContainer;ZZ[Z)Lcom/android/server/wm/ActivityRecord;+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;ZLcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->getAnimatingContainer(II)Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->getChildCount()I+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->getActivity(Ljava/util/function/Predicate;ZLcom/android/server/wm/ActivityRecord;)Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getAnimatingContainer(II)Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getChildAt(I)Lcom/android/server/wm/WindowContainer;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getChildCount()I+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->getDisplayArea()Lcom/android/server/wm/DisplayArea;+]Lcom/android/server/wm/WindowContainer;megamorphic_types +HSPLcom/android/server/wm/WindowContainer;->getDisplayContent()Lcom/android/server/wm/DisplayContent; HPLcom/android/server/wm/WindowContainer;->getInsetsSourceProviders()Landroid/util/SparseArray; -HSPLcom/android/server/wm/WindowContainer;->getOrientation(I)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/lang/Object;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->getOrientation(I)I+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->getParent()Lcom/android/server/wm/WindowContainer; -HSPLcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Rect;Landroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->getPendingTransaction()Landroid/view/SurfaceControl$Transaction;+]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; +HSPLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Point;)V+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types +HSPLcom/android/server/wm/WindowContainer;->getRelativePosition(Landroid/graphics/Rect;Landroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types +HSPLcom/android/server/wm/WindowContainer;->getRootTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getSurfaceControl()Landroid/view/SurfaceControl; HSPLcom/android/server/wm/WindowContainer;->getSyncTransaction()Landroid/view/SurfaceControl$Transaction;+]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->getTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->getTopChild()Lcom/android/server/wm/WindowContainer;+]Lcom/android/server/wm/WindowList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->getTopMostActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment; -HSPLcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->getTask(Ljava/util/function/Predicate;Z)Lcom/android/server/wm/Task;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getTopChild()Lcom/android/server/wm/WindowContainer;+]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->getTopMostActivity()Lcom/android/server/wm/ActivityRecord;+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskDisplayArea;,Lcom/android/server/wm/TaskFragment; +HSPLcom/android/server/wm/WindowContainer;->getWindow(Ljava/util/function/Predicate;)Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->hasInsetsSourceProvider()Z HSPLcom/android/server/wm/WindowContainer;->inTransition()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController; HSPLcom/android/server/wm/WindowContainer;->inTransitionSelfOrParent()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowContainer;->isAnimating(II)Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->isExitAnimationRunningSelfOrChild()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->isAttached()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types +HSPLcom/android/server/wm/WindowContainer;->isExitAnimationRunningSelfOrChild()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->isFocusable()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->isOnTop()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/RootWindowContainer; +HSPLcom/android/server/wm/WindowContainer;->isOnTop()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayArea$Dimmable;,Lcom/android/server/wm/RootWindowContainer; HSPLcom/android/server/wm/WindowContainer;->isSelfAnimating(II)Z+]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContainer;->isVisible()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->isVisible()Z+]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->isVisibleRequested()Z -HSPLcom/android/server/wm/WindowContainer;->needsZBoost()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool;]Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper; -HSPLcom/android/server/wm/WindowContainer;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/ContentRecorder;,Lcom/android/server/wm/DisplayContent$2;,Lcom/android/server/wm/WindowContainer$2;,Lcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WindowContainer;->prepareSurfaces()V+]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowContainer;->isWaitingForTransitionStart()Z +HSPLcom/android/server/wm/WindowContainer;->needsZBoost()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;,Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->obtainConsumerWrapper(Ljava/util/function/Consumer;)Lcom/android/server/wm/WindowContainer$ForAllWindowsConsumerWrapper;+]Landroid/util/Pools$SynchronizedPool;Landroid/util/Pools$SynchronizedPool; +HSPLcom/android/server/wm/WindowContainer;->onDisplayChanged(Lcom/android/server/wm/DisplayContent;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayArea;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowContainerListener;Lcom/android/server/wm/ContentRecorder;,Lcom/android/server/wm/DisplayContent$2;,Lcom/android/server/wm/WindowContainer$2;,Lcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowContainer;->prepareSurfaces()V+]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowContainer;->scheduleAnimation()V+]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; HSPLcom/android/server/wm/WindowContainer;->updateSurfacePositionNonOrganized()V+]Lcom/android/server/wm/WindowContainer;megamorphic_types -HSPLcom/android/server/wm/WindowContextListenerController$WindowContextListenerImpl;->dispatchWindowContextInfoChange()V+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/ConfigurationContainer;megamorphic_types]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;megamorphic_types]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/wm/WindowFrames;->didFrameSizeChange()Z+]Landroid/graphics/Rect;Landroid/graphics/Rect; +HSPLcom/android/server/wm/WindowFrames;->didFrameSizeChange()Z HSPLcom/android/server/wm/WindowFrames;->hasInsetsChanged()Z +HSPLcom/android/server/wm/WindowFrames;->setContentChanged(Z)V HSPLcom/android/server/wm/WindowFrames;->setReportResizeHints()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames; -HSPLcom/android/server/wm/WindowList;->peekLast()Ljava/lang/Object;+]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIILandroid/view/InputChannel;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/graphics/Rect;[F)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowContextListenerController;Lcom/android/server/wm/WindowContextListenerController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/wm/WindowManagerService;->addWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIILandroid/view/InputChannel;Landroid/view/InsetsState;Landroid/view/InsetsSourceControl$Array;Landroid/graphics/Rect;[F)I+]Landroid/app/ActivityManagerInternal;Lcom/android/server/am/ActivityManagerService$LocalService;]Landroid/content/pm/PackageManagerInternal;Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl;]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowContextListenerController;Lcom/android/server/wm/WindowContextListenerController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowToken;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/wm/WindowManagerService;->boostPriorityForLockedSection()V+]Lcom/android/server/wm/WindowManagerThreadPriorityBooster;Lcom/android/server/wm/WindowManagerThreadPriorityBooster; -HSPLcom/android/server/wm/WindowManagerService;->checkDrawnWindowsLocked()V+]Landroid/os/Handler;Lcom/android/server/wm/WindowManagerService$H;]Landroid/os/Message;Landroid/os/Message;]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WindowManagerService;->enableScreenIfNeededLocked()V+]Ljava/lang/RuntimeException;Ljava/lang/RuntimeException; +HSPLcom/android/server/wm/WindowManagerService;->checkDrawnWindowsLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowManagerService;->enableScreenIfNeededLocked()V HSPLcom/android/server/wm/WindowManagerService;->getDefaultDisplayContentLocked()Lcom/android/server/wm/DisplayContent;+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer; -HSPLcom/android/server/wm/WindowManagerService;->getRecentsAnimationController()Lcom/android/server/wm/RecentsAnimationController; HSPLcom/android/server/wm/WindowManagerService;->isKeyguardSecure(I)Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; HSPLcom/android/server/wm/WindowManagerService;->isUserVisible(I)Z+]Lcom/android/server/pm/UserManagerInternal;Lcom/android/server/pm/UserManagerService$LocalService; +HSPLcom/android/server/wm/WindowManagerService;->relayoutWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;Landroid/view/WindowManager$LayoutParams;IIIIIILandroid/view/WindowRelayoutResult;)I+]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;]Landroid/view/InsetsFrameProvider$InsetsSizeOverride;Landroid/view/InsetsFrameProvider$InsetsSizeOverride;]Landroid/view/InsetsFrameProvider;Landroid/view/InsetsFrameProvider;]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/DisplayWindowPolicyControllerHelper;Lcom/android/server/wm/DisplayWindowPolicyControllerHelper;]Lcom/android/server/wm/UnknownAppVisibilityController;Lcom/android/server/wm/UnknownAppVisibilityController;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; HSPLcom/android/server/wm/WindowManagerService;->resetPriorityAfterLockedSection()V+]Lcom/android/server/wm/WindowManagerThreadPriorityBooster;Lcom/android/server/wm/WindowManagerThreadPriorityBooster; HSPLcom/android/server/wm/WindowManagerService;->scheduleAnimationLocked()V+]Lcom/android/server/wm/WindowAnimator;Lcom/android/server/wm/WindowAnimator; HSPLcom/android/server/wm/WindowManagerService;->setInsetsWindow(Lcom/android/server/wm/Session;Landroid/view/IWindow;ILandroid/graphics/Rect;Landroid/graphics/Rect;Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;+]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder;]Ljava/util/HashMap;Ljava/util/HashMap; +HSPLcom/android/server/wm/WindowManagerService;->windowForClientLocked(Lcom/android/server/wm/Session;Landroid/os/IBinder;Z)Lcom/android/server/wm/WindowState;+]Ljava/util/HashMap;Ljava/util/HashMap; HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->boost()V HSPLcom/android/server/wm/WindowManagerThreadPriorityBooster;->reset()V -HSPLcom/android/server/wm/WindowProcessController;->(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;IILjava/lang/Object;Lcom/android/server/wm/WindowProcessListener;)V+]Lcom/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal;Lcom/android/server/grammaticalinflection/GrammaticalInflectionService$GrammaticalInflectionManagerInternalImpl;]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/PackageConfigPersister;Lcom/android/server/wm/PackageConfigPersister;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/WindowProcessController;->(Lcom/android/server/wm/ActivityTaskManagerService;Landroid/content/pm/ApplicationInfo;Ljava/lang/String;IILjava/lang/Object;Lcom/android/server/wm/WindowProcessListener;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService; HSPLcom/android/server/wm/WindowProcessController;->addBoundClientUid(ILjava/lang/String;J)V+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController; -HPLcom/android/server/wm/WindowProcessController;->areBackgroundActivityStartsAllowed(IZ)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HSPLcom/android/server/wm/WindowProcessController;->computeProcessActivityState()V+]Landroid/util/ArrayMap;Landroid/util/ArrayMap;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/wm/WindowProcessController;->areBackgroundActivityStartsAllowed(ILcom/android/server/wm/BackgroundLaunchProcessController$BalCheckConfiguration;)Lcom/android/server/wm/BackgroundActivityStartController$BalVerdict;+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/WindowProcessController;->computeProcessActivityState()V+]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowProcessController;->dispatchConfiguration(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; HSPLcom/android/server/wm/WindowProcessController;->handleAppDied()Z+]Lcom/android/server/wm/ActivityTaskSupervisor;Lcom/android/server/wm/ActivityTaskSupervisor;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowProcessController;->hasActivities()Z @@ -3834,83 +4022,84 @@ HSPLcom/android/server/wm/WindowProcessController;->hasVisibleActivities()Z HSPLcom/android/server/wm/WindowProcessController;->isHeavyWeightProcess()Z HSPLcom/android/server/wm/WindowProcessController;->isHomeProcess()Z HSPLcom/android/server/wm/WindowProcessController;->isPreviousProcess()Z -HSPLcom/android/server/wm/WindowProcessController;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/grammaticalinflection/GrammaticalInflectionManagerInternal;Lcom/android/server/grammaticalinflection/GrammaticalInflectionService$GrammaticalInflectionManagerInternalImpl;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/wm/WindowProcessController;->onServiceStarted(Landroid/content/pm/ServiceInfo;)V+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/lang/Object;Ljava/lang/String; +HSPLcom/android/server/wm/WindowProcessController;->onConfigurationChanged(Landroid/content/res/Configuration;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/WindowProcessController;->onServiceStarted(Landroid/content/pm/ServiceInfo;)V HSPLcom/android/server/wm/WindowProcessController;->registeredForDisplayAreaConfigChanges()Z HSPLcom/android/server/wm/WindowProcessController;->removeBackgroundStartPrivileges(Landroid/os/Binder;)V+]Lcom/android/server/wm/BackgroundLaunchProcessController;Lcom/android/server/wm/BackgroundLaunchProcessController; -HSPLcom/android/server/wm/WindowProcessController;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController; +HSPLcom/android/server/wm/WindowProcessController;->resolveOverrideConfiguration(Landroid/content/res/Configuration;)V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService; +HSPLcom/android/server/wm/WindowProcessController;->scheduleClientTransactionItem(Landroid/app/IApplicationThread;Landroid/app/servertransaction/ClientTransactionItem;)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/Session;Lcom/android/server/wm/Session; HSPLcom/android/server/wm/WindowProcessController;->setCurrentAdj(I)V HSPLcom/android/server/wm/WindowProcessController;->setCurrentProcState(I)V HSPLcom/android/server/wm/WindowProcessController;->setCurrentSchedulingGroup(I)V HSPLcom/android/server/wm/WindowProcessController;->setFgInteractionTime(J)V HSPLcom/android/server/wm/WindowProcessController;->setInteractionEventTime(J)V HSPLcom/android/server/wm/WindowProcessController;->setPerceptible(Z)V -HSPLcom/android/server/wm/WindowProcessController;->setReportedProcState(I)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; +HSPLcom/android/server/wm/WindowProcessController;->setReportedProcState(I)V+]Lcom/android/server/wm/ActivityTaskManagerService;Lcom/android/server/wm/ActivityTaskManagerService;]Lcom/android/server/wm/ClientLifecycleManager;Lcom/android/server/wm/ClientLifecycleManager; HSPLcom/android/server/wm/WindowProcessController;->setThread(Landroid/app/IApplicationThread;)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/VisibleActivityProcessTracker;Lcom/android/server/wm/VisibleActivityProcessTracker;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController; -HPLcom/android/server/wm/WindowProcessController;->setWhenUnimportant(J)V HSPLcom/android/server/wm/WindowProcessControllerMap;->put(ILcom/android/server/wm/WindowProcessController;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Ljava/util/Map;Ljava/util/HashMap; -HSPLcom/android/server/wm/WindowState;->(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;ILandroid/view/WindowManager$LayoutParams;IIIZ)V+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda24; -HSPLcom/android/server/wm/WindowState;->applyDims()V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/LegacyDimmer;,Lcom/android/server/wm/SmoothDimmer;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; +HSPLcom/android/server/wm/WindowState;->(Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/Session;Landroid/view/IWindow;Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/WindowState;ILandroid/view/WindowManager$LayoutParams;IIIZ)V+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/function/Supplier;Lcom/android/server/wm/WindowManagerService$$ExternalSyntheticLambda25; +HSPLcom/android/server/wm/WindowState;->applyDims()V+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/Dimmer;Lcom/android/server/wm/Dimmer;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; HSPLcom/android/server/wm/WindowState;->applyImeWindowsIfNeeded(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/internal/util/ToBooleanFunction;megamorphic_types]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->applyInOrderWithImeWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/internal/util/ToBooleanFunction;megamorphic_types HSPLcom/android/server/wm/WindowState;->areAppWindowBoundsLetterboxed()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->assignLayer(Landroid/view/SurfaceControl$Transaction;I)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->canAddInternalSystemWindow()Z -HSPLcom/android/server/wm/WindowState;->canAffectSystemUiFlags()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; +HSPLcom/android/server/wm/WindowState;->canAffectSystemUiFlags()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; HSPLcom/android/server/wm/WindowState;->canBeHiddenByKeyguard()Z+]Lcom/android/server/policy/WindowManagerPolicy;Lcom/android/server/policy/PhoneWindowManager; -HPLcom/android/server/wm/WindowState;->canBeImeTarget()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HPLcom/android/server/wm/WindowState;->canBeImeTarget()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->canReceiveKeys()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->canReceiveKeys(Z)Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->canReceiveTouchInput()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/WindowState;->computeDragResizing()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->canReceiveKeys(Z)Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->canReceiveTouchInput()Z+]Lcom/android/server/wm/BackNavigationController;Lcom/android/server/wm/BackNavigationController;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController; +HSPLcom/android/server/wm/WindowState;->computeDragResizing()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->cropRegionToRootTaskBoundsIfNeeded(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/Task;Lcom/android/server/wm/Task;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->fillClientWindowFramesAndConfiguration(Landroid/window/ClientWindowFrames;Landroid/util/MergedConfiguration;Landroid/window/ActivityWindowInfo;ZZ)V+]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Landroid/window/ClientWindowFrames;Landroid/window/ClientWindowFrames;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->fillInsetsSourceControls(Landroid/view/InsetsSourceControl$Array;Z)V+]Landroid/view/InsetsSourceControl$Array;Landroid/view/InsetsSourceControl$Array;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; +HSPLcom/android/server/wm/WindowState;->fillInsetsState(Landroid/view/InsetsState;Z)V+]Landroid/view/InsetsState;Landroid/view/InsetsState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->fillsDisplay()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowState;->forAllWindows(Lcom/android/internal/util/ToBooleanFunction;Z)Z+]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowState;->getAttrs()Landroid/view/WindowManager$LayoutParams; HSPLcom/android/server/wm/WindowState;->getBaseType()I+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; -HSPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration;+]Landroid/content/res/Configuration;Landroid/content/res/Configuration;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getBounds()Landroid/graphics/Rect;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; +HSPLcom/android/server/wm/WindowState;->getConfiguration()Landroid/content/res/Configuration; HSPLcom/android/server/wm/WindowState;->getDisplayFrames(Lcom/android/server/wm/DisplayFrames;)Lcom/android/server/wm/DisplayFrames;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; HSPLcom/android/server/wm/WindowState;->getEffectiveTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->getFrame()Landroid/graphics/Rect; HSPLcom/android/server/wm/WindowState;->getInputDispatchingTimeoutMillis()J HSPLcom/android/server/wm/WindowState;->getInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getInsetsState(Z)Landroid/view/InsetsState;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; +HSPLcom/android/server/wm/WindowState;->getInsetsState(Z)Landroid/view/InsetsState;+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsPolicy;Lcom/android/server/wm/InsetsPolicy;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; HSPLcom/android/server/wm/WindowState;->getKeepClearAreas(Ljava/util/Collection;Ljava/util/Collection;Landroid/graphics/Matrix;[F)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/Collection;Landroid/util/ArraySet; -HSPLcom/android/server/wm/WindowState;->getKeyInterceptionInfo()Lcom/android/internal/policy/KeyInterceptionInfo;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/CharSequence;Ljava/lang/String; -HSPLcom/android/server/wm/WindowState;->getMergedInsetsState()Landroid/view/InsetsState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getName()Ljava/lang/String;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/StringBuilder;Ljava/lang/StringBuilder; -HSPLcom/android/server/wm/WindowState;->getOrientationChanging()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getKeyInterceptionInfo()Lcom/android/internal/policy/KeyInterceptionInfo;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/lang/CharSequence;Landroid/text/SpannableString;,Ljava/lang/String; +HSPLcom/android/server/wm/WindowState;->getMergedInsetsState()Landroid/view/InsetsState;+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsStateController;Lcom/android/server/wm/InsetsStateController; +HSPLcom/android/server/wm/WindowState;->getName()Ljava/lang/String;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getOrientationChanging()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController; HSPLcom/android/server/wm/WindowState;->getOwningPackage()Ljava/lang/String; +HSPLcom/android/server/wm/WindowState;->getOwningUid()I HSPLcom/android/server/wm/WindowState;->getParentWindow()Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->getRectsInScreenSpace(Ljava/util/List;Landroid/graphics/Matrix;[F)Ljava/util/List;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/Iterator;Ljava/util/ArrayList$Itr;]Ljava/util/List;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WindowState;->getSurfaceTouchableRegion(Landroid/graphics/Region;Landroid/view/WindowManager$LayoutParams;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task;+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/WindowState;->getTopParentWindow()Lcom/android/server/wm/WindowState;+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getSurfaceTouchableRegion(Landroid/graphics/Region;Landroid/view/WindowManager$LayoutParams;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getTask()Lcom/android/server/wm/Task; HSPLcom/android/server/wm/WindowState;->getTouchOcclusionMode()I+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getTransformationMatrix([FLandroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->getWindowTag()Ljava/lang/CharSequence;+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Ljava/lang/CharSequence;Ljava/lang/String; +HSPLcom/android/server/wm/WindowState;->getTouchableRegion(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region; +HSPLcom/android/server/wm/WindowState;->getTransformationMatrix([FLandroid/graphics/Matrix;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->getWindowTag()Ljava/lang/CharSequence;+]Ljava/lang/CharSequence;Landroid/text/SpannableString;,Ljava/lang/String; HSPLcom/android/server/wm/WindowState;->getWindowType()I HSPLcom/android/server/wm/WindowState;->handleCompleteDeferredRemoval()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->handleWindowMovedIfNeeded()V+]Landroid/view/IWindow;Landroid/view/IWindow$Stub$Proxy;,Landroid/view/ViewRootImpl$W;]Lcom/android/server/wm/AccessibilityController;Lcom/android/server/wm/AccessibilityController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->hasMoved()Z+]Lcom/android/server/wm/TransitionController;Lcom/android/server/wm/TransitionController;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->hasWallpaper()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isAnimationRunningSelfOrParent()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isChildWindow()Z -HSPLcom/android/server/wm/WindowState;->isDisplayed()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isDragResizeChanged()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isDisplayed()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isDragResizeChanged()Z HSPLcom/android/server/wm/WindowState;->isDrawn()Z HSPLcom/android/server/wm/WindowState;->isDreamWindow()Z -HSPLcom/android/server/wm/WindowState;->isFocused()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isFocused()Z HSPLcom/android/server/wm/WindowState;->isFullyTransparent()Z -HSPLcom/android/server/wm/WindowState;->isGoneForLayout()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isImeLayeringTarget()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isGoneForLayout()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isImeLayeringTarget()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent; HSPLcom/android/server/wm/WindowState;->isImplicitlyExcludingAllSystemGestures()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isLetterboxedForDisplayCutout()Z+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isLetterboxedForDisplayCutout()Z+]Landroid/view/WindowManager$LayoutParams;Landroid/view/WindowManager$LayoutParams;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames; HSPLcom/android/server/wm/WindowState;->isObscuringDisplay()Z+]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isOnScreen()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isOpaqueDrawn()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isOnScreen()Z+]Lcom/android/server/wm/WallpaperWindowToken;Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->isOpaqueDrawn()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isParentWindowGoneForLayout()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isParentWindowHidden()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isRequestedVisible(I)Z @@ -3919,129 +4108,1745 @@ HSPLcom/android/server/wm/WindowState;->isVisible()Z+]Lcom/android/server/wm/Win HSPLcom/android/server/wm/WindowState;->isVisibleByPolicy()Z HSPLcom/android/server/wm/WindowState;->isVisibleByPolicyOrInsets()Z+]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->isVisibleRequested()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->isVisibleRequestedOrAdding()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->needsRelativeLayeringToIme()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/DisplayContent$ImeContainer;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->needsZBoost()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->performShowLocked()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; +HSPLcom/android/server/wm/WindowState;->isVisibleRequestedOrAdding()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HPLcom/android/server/wm/WindowState;->matchesDisplayAreaBounds()Z+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/TaskDisplayArea;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord; +HSPLcom/android/server/wm/WindowState;->needsZBoost()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/InsetsControlTarget;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->performShowLocked()Z+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Ljava/util/ArrayList;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowState;->prepareSurfaces()V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; HSPLcom/android/server/wm/WindowState;->registeredForDisplayAreaConfigChanges()Z+]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->relayoutVisibleWindow(I)I+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; HPLcom/android/server/wm/WindowState;->reportResized()V+]Landroid/app/WindowConfiguration;Landroid/app/WindowConfiguration;]Landroid/util/MergedConfiguration;Landroid/util/MergedConfiguration;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowProcessController;Lcom/android/server/wm/WindowProcessController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->resetContentChanged()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames; -HSPLcom/android/server/wm/WindowState;->setFrames(Landroid/window/ClientWindowFrames;II)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowState;->setFrames(Landroid/window/ClientWindowFrames;II)V+]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HPLcom/android/server/wm/WindowState;->setLastExclusionHeights(III)V HSPLcom/android/server/wm/WindowState;->setReportResizeHints()Z+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames; HSPLcom/android/server/wm/WindowState;->shouldCheckTokenVisibleRequested()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; -HSPLcom/android/server/wm/WindowState;->shouldDrawBlurBehind()Z HSPLcom/android/server/wm/WindowState;->subtractTouchExcludeRegionIfNeeded(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region; -HSPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->transformFrameToSurfacePosition(IILandroid/graphics/Point;)V+]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/ConfigurationContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/Task;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->transformSurfaceInsetsPosition(Landroid/graphics/Point;Landroid/graphics/Rect;)V HSPLcom/android/server/wm/WindowState;->updateFrameRateSelectionPriorityIfNeeded()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/RefreshRatePolicy;Lcom/android/server/wm/RefreshRatePolicy;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->updateRegionForModalActivityWindow(Landroid/graphics/Region;)V+]Landroid/graphics/Rect;Landroid/graphics/Rect;]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord; -HSPLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Lcom/android/server/wm/WindowList; -HSPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowState;->updateRegionForModalActivityWindow(Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Lcom/android/server/wm/TaskFragment;Lcom/android/server/wm/Task;,Lcom/android/server/wm/TaskFragment;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowState;->updateReportedVisibility(Lcom/android/server/wm/WindowState$UpdateReportedVisibilityResults;)V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/WindowState;->updateResizingWindowIfNeeded()V+]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Ljava/util/ArrayList;Ljava/util/ArrayList;]Ljava/util/List;Ljava/util/ArrayList; HSPLcom/android/server/wm/WindowState;->updateScaleIfNeeded()V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->updateSourceFrame(Landroid/graphics/Rect;)V+]Landroid/util/SparseArray;Landroid/util/SparseArray;]Lcom/android/server/wm/InsetsSourceProvider;Lcom/android/server/wm/ImeInsetsSourceProvider;,Lcom/android/server/wm/InsetsSourceProvider;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/Point;Landroid/graphics/Point;]Landroid/graphics/Rect;Landroid/graphics/Rect;]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/LetterboxUiController;Lcom/android/server/wm/LetterboxUiController;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/function/Consumer;Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda1;,Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda3; +HSPLcom/android/server/wm/WindowState;->updateSurfacePosition(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/graphics/Matrix;Landroid/graphics/Matrix;]Landroid/graphics/Point;Landroid/graphics/Point;]Lcom/android/server/wm/AppCompatController;Lcom/android/server/wm/AppCompatController;]Lcom/android/server/wm/AppCompatOrientationOverrides;Lcom/android/server/wm/AppCompatOrientationOverrides;]Lcom/android/server/wm/AsyncRotationController;Lcom/android/server/wm/AsyncRotationController;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/SurfaceAnimator;Lcom/android/server/wm/SurfaceAnimator;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowFrames;Lcom/android/server/wm/WindowFrames;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/function/Consumer;Lcom/android/server/wm/WindowState$$ExternalSyntheticLambda1; HSPLcom/android/server/wm/WindowState;->wouldBeVisibleIfPolicyIgnored()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowState;->wouldBeVisibleRequestedIfPolicyIgnored()Z+]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowStateAnimator;->applyAnimationLocked(IZ)Z+]Lcom/android/server/wm/AppTransition;Lcom/android/server/wm/AppTransition;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/DisplayPolicy;Lcom/android/server/wm/DisplayPolicy;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowState;,Lcom/android/server/wm/WindowToken;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; -HSPLcom/android/server/wm/WindowStateAnimator;->commitFinishDrawingLocked()Z+]Lcom/android/server/wm/ActivityRecord;Lcom/android/server/wm/ActivityRecord;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; +HSPLcom/android/server/wm/WindowStateAnimator;->commitFinishDrawingLocked()Z+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; HSPLcom/android/server/wm/WindowStateAnimator;->computeShownFrameLocked()V+]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState; -HSPLcom/android/server/wm/WindowStateAnimator;->getShown()Z+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController; -HSPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z+]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController; -HSPLcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Landroid/view/SurfaceControl$Transaction;)V+]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowContainer;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator;]Lcom/android/server/wm/WindowSurfaceController;Lcom/android/server/wm/WindowSurfaceController; -HSPLcom/android/server/wm/WindowSurfaceController;->hasSurface()Z -HSPLcom/android/server/wm/WindowSurfacePlacer$Traverser;->run()V+]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; +HSPLcom/android/server/wm/WindowStateAnimator;->getShown()Z +HSPLcom/android/server/wm/WindowStateAnimator;->hasSurface()Z +HSPLcom/android/server/wm/WindowStateAnimator;->prepareSurfaceLocked(Landroid/view/SurfaceControl$Transaction;)V+]Landroid/view/SurfaceControl$Transaction;Landroid/view/SurfaceControl$Transaction;]Lcom/android/server/wm/DisplayContent;Lcom/android/server/wm/DisplayContent;]Lcom/android/server/wm/WallpaperController;Lcom/android/server/wm/WallpaperController;]Lcom/android/server/wm/WindowState;Lcom/android/server/wm/WindowState;]Lcom/android/server/wm/WindowStateAnimator;Lcom/android/server/wm/WindowStateAnimator; +HSPLcom/android/server/wm/WindowSurfacePlacer$Traverser;->run()V HSPLcom/android/server/wm/WindowSurfacePlacer;->isLayoutDeferred()Z -HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V+]Landroid/os/Handler;Landroid/os/Handler;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer; +HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacement(Z)V HSPLcom/android/server/wm/WindowSurfacePlacer;->performSurfacePlacementLoop()V+]Lcom/android/server/wm/RootWindowContainer;Lcom/android/server/wm/RootWindowContainer;]Lcom/android/server/wm/WindowManagerService;Lcom/android/server/wm/WindowManagerService;]Lcom/android/server/wm/WindowSurfacePlacer;Lcom/android/server/wm/WindowSurfacePlacer;]Ljava/util/ArrayList;Ljava/util/ArrayList; -HSPLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V+]Landroid/os/Handler;Landroid/os/Handler; +HSPLcom/android/server/wm/WindowSurfacePlacer;->requestTraversal()V HSPLcom/android/server/wm/WindowToken;->getFixedRotationTransformInsetsState()Landroid/view/InsetsState;+]Lcom/android/server/wm/WindowToken;Lcom/android/server/wm/ActivityRecord;,Lcom/android/server/wm/WallpaperWindowToken;,Lcom/android/server/wm/WindowToken; HSPLcom/android/server/wm/WindowToken;->isClientVisible()Z HSPLcom/android/server/wm/WindowToken;->isFixedRotationTransforming()Z +HSPLcom/android/server/wm/utils/DimenPxIntSupplier;->getAsInt()I+]Landroid/content/Context;Landroid/app/ContextImpl;]Landroid/content/res/Resources;Landroid/content/res/Resources; HSPLcom/android/server/wm/utils/DisplayInfoOverrides;->lambda$static$0(Landroid/view/DisplayInfo;Landroid/view/DisplayInfo;)V -HSPLcom/android/server/wm/utils/OptPropFactory$OptProp;->isFalse()Z+]Lcom/android/server/wm/utils/OptPropFactory$OptProp;Lcom/android/server/wm/utils/OptPropFactory$OptProp;]Ljava/util/function/BooleanSupplier;Lcom/android/server/wm/LetterboxUiController$$ExternalSyntheticLambda6;,Lcom/android/server/wm/LetterboxUiController$$ExternalSyntheticLambda7;,Lcom/android/server/wm/utils/OptPropFactory$OptProp$$ExternalSyntheticLambda0; -HPLcom/android/server/wm/utils/RegionUtils;->forEachRectReverse(Landroid/graphics/Region;Ljava/util/function/Consumer;)V+]Landroid/graphics/RegionIterator;Landroid/graphics/RegionIterator;]Ljava/util/ArrayList;Ljava/util/ArrayList; +HSPLcom/android/server/wm/utils/OptPropFactory$OptProp;->getValue()I+]Lcom/android/server/wm/utils/OptPropFactory$ThrowableBooleanSupplier;Lcom/android/server/wm/utils/OptPropFactory$$ExternalSyntheticLambda0;,Lcom/android/server/wm/utils/OptPropFactory$$ExternalSyntheticLambda1; +HSPLcom/android/server/wm/utils/OptPropFactory$OptProp;->isFalse()Z+]Ljava/util/function/BooleanSupplier;Lcom/android/server/wm/AppCompatAspectRatioOverrides$$ExternalSyntheticLambda0;,Lcom/android/server/wm/AppCompatAspectRatioOverrides$$ExternalSyntheticLambda1;,Lcom/android/server/wm/utils/OptPropFactory$OptProp$$ExternalSyntheticLambda0; +HSPLcom/android/server/wm/utils/OptPropFactory$OptProp;->shouldEnableWithOptInOverrideAndOptOutProperty(Z)Z+]Ljava/util/function/BooleanSupplier;Lcom/android/server/wm/AppCompatOrientationOverrides$$ExternalSyntheticLambda2;,Lcom/android/server/wm/AppCompatUtils$1;,Lcom/android/server/wm/utils/OptPropFactory$OptProp$$ExternalSyntheticLambda0; +HPLcom/android/server/wm/utils/RegionUtils;->forEachRectReverse(Landroid/graphics/Region;Ljava/util/function/Consumer;)V HSPLcom/android/server/wm/utils/RegionUtils;->rectListToRegion(Ljava/util/List;Landroid/graphics/Region;)V+]Landroid/graphics/Region;Landroid/graphics/Region;]Ljava/util/List;Ljava/util/ArrayList; -Landroid/os/IInstalld$Stub$Proxy; +Landroid/content/pm/PackageManagerInternal$ExternalSourcesPolicy; +Landroid/content/pm/PackageManagerInternal; +Landroid/content/pm/TestUtilityService; +Landroid/hardware/light/HwLight$1; +Landroid/hardware/light/HwLight; +Landroid/hardware/light/ILights; +Landroid/hardware/power/stats/Channel; +Landroid/hardware/power/stats/EnergyConsumer; +Landroid/hardware/power/stats/IPowerStats$Stub$Proxy; +Landroid/hardware/power/stats/IPowerStats$Stub; +Landroid/hardware/power/stats/IPowerStats; +Landroid/net/ConnectivityModuleConnector$Dependencies; +Landroid/net/ConnectivityModuleConnector$DependenciesImpl; +Landroid/net/ConnectivityModuleConnector; +Landroid/os/BatteryStatsInternal; +Landroid/power/PowerStatsInternal; +Landroid/sysprop/SurfaceFlingerProperties; +Lcom/android/modules/utils/build/SdkLevel; +Lcom/android/modules/utils/build/UnboundedSdkLevel; +Lcom/android/server/AnimationThread; +Lcom/android/server/AppFuseMountException; Lcom/android/server/BatteryService$LocalService; Lcom/android/server/BinaryTransparencyService$BinaryTransparencyServiceImpl$$ExternalSyntheticLambda0; +Lcom/android/server/BundleUtils; +Lcom/android/server/ConsumerIrService; Lcom/android/server/DeviceIdleController$LocalService; +Lcom/android/server/DisplayThread; +Lcom/android/server/EventLogTags; +Lcom/android/server/ExplicitHealthCheckController; +Lcom/android/server/FgThread; +Lcom/android/server/HardwarePropertiesManagerService; +Lcom/android/server/IntentResolver$1; +Lcom/android/server/IntentResolver; +Lcom/android/server/IoThread; +Lcom/android/server/LocalManagerRegistry$ManagerNotFoundException; +Lcom/android/server/LocalManagerRegistry; +Lcom/android/server/LockGuard$LockInfo; +Lcom/android/server/LockGuard; +Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda0; +Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda1; +Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda2; +Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda3; +Lcom/android/server/PackageWatchdog$$ExternalSyntheticLambda4; +Lcom/android/server/PackageWatchdog$BootThreshold; +Lcom/android/server/PackageWatchdog$ObserverInternal; +Lcom/android/server/PackageWatchdog$PackageHealthObserver; +Lcom/android/server/PackageWatchdog$SystemClock; +Lcom/android/server/PackageWatchdog; +Lcom/android/server/RescueParty$RescuePartyObserver; +Lcom/android/server/RescueParty; +Lcom/android/server/SerialService; +Lcom/android/server/ServiceThread; +Lcom/android/server/SystemClockTime; +Lcom/android/server/SystemConfig$PermissionEntry; +Lcom/android/server/SystemConfig$SharedLibraryEntry; +Lcom/android/server/SystemConfig; +Lcom/android/server/SystemServer$$ExternalSyntheticLambda0; +Lcom/android/server/SystemServer$$ExternalSyntheticLambda1; +Lcom/android/server/SystemServer$$ExternalSyntheticLambda2; +Lcom/android/server/SystemServer$SystemServerDumper; +Lcom/android/server/SystemServer; +Lcom/android/server/SystemServerInitThreadPool$$ExternalSyntheticLambda1; +Lcom/android/server/SystemServerInitThreadPool; +Lcom/android/server/SystemService; +Lcom/android/server/SystemServiceManager; +Lcom/android/server/SystemTimeZone; +Lcom/android/server/ThreadPriorityBooster$1; +Lcom/android/server/ThreadPriorityBooster$PriorityState; +Lcom/android/server/ThreadPriorityBooster; +Lcom/android/server/UiThread; +Lcom/android/server/Watchdog$$ExternalSyntheticLambda0; +Lcom/android/server/Watchdog$1; +Lcom/android/server/Watchdog$BinderThreadMonitor; +Lcom/android/server/Watchdog$HandlerChecker; +Lcom/android/server/Watchdog$HandlerCheckerAndTimeout; +Lcom/android/server/Watchdog$Monitor; +Lcom/android/server/Watchdog$RebootRequestReceiver; +Lcom/android/server/Watchdog$SettingsObserver; +Lcom/android/server/Watchdog; +Lcom/android/server/accessibility/AccessibilityManagerService$$ExternalSyntheticLambda36; +Lcom/android/server/accessibility/BrailleDisplayConnection; +Lcom/android/server/adb/AdbDebuggingManager$PairingThread; Lcom/android/server/alarm/AlarmManagerService$LocalService; +Lcom/android/server/am/ActiveServices$1; +Lcom/android/server/am/ActiveServices$5; +Lcom/android/server/am/ActiveServices$MediaProjectionFgsTypeCustomPermission; Lcom/android/server/am/ActiveServices$ProcessAnrTimer; Lcom/android/server/am/ActiveServices$ServiceAnrTimer; +Lcom/android/server/am/ActiveServices$ServiceMap; +Lcom/android/server/am/ActiveServices$ServiceRestarter; +Lcom/android/server/am/ActiveServices$SystemExemptedFgsTypePermission; +Lcom/android/server/am/ActiveServices; +Lcom/android/server/am/ActiveUids; +Lcom/android/server/am/ActivityManagerConstants$1; +Lcom/android/server/am/ActivityManagerConstants$2; +Lcom/android/server/am/ActivityManagerConstants; +Lcom/android/server/am/ActivityManagerGlobalLock; +Lcom/android/server/am/ActivityManagerLocal; +Lcom/android/server/am/ActivityManagerProcLock; +Lcom/android/server/am/ActivityManagerService$$ExternalSyntheticLambda19; +Lcom/android/server/am/ActivityManagerService$11; +Lcom/android/server/am/ActivityManagerService$12; +Lcom/android/server/am/ActivityManagerService$14; +Lcom/android/server/am/ActivityManagerService$1; Lcom/android/server/am/ActivityManagerService$2; +Lcom/android/server/am/ActivityManagerService$5; +Lcom/android/server/am/ActivityManagerService$7; +Lcom/android/server/am/ActivityManagerService$FgsTempAllowListItem; +Lcom/android/server/am/ActivityManagerService$GetBackgroundStartPrivilegesFunctor; +Lcom/android/server/am/ActivityManagerService$HiddenApiSettings; +Lcom/android/server/am/ActivityManagerService$Injector; +Lcom/android/server/am/ActivityManagerService$IntentFirewallInterface; +Lcom/android/server/am/ActivityManagerService$Lifecycle; Lcom/android/server/am/ActivityManagerService$LocalService; +Lcom/android/server/am/ActivityManagerService$MainHandler$1; Lcom/android/server/am/ActivityManagerService$MainHandler; +Lcom/android/server/am/ActivityManagerService$PidMap; +Lcom/android/server/am/ActivityManagerService$ProcessChangeItem; +Lcom/android/server/am/ActivityManagerService$UiHandler; +Lcom/android/server/am/ActivityManagerService; +Lcom/android/server/am/ActivityManagerShellCommand; +Lcom/android/server/am/AnrHelper$$ExternalSyntheticLambda0; +Lcom/android/server/am/AnrHelper$$ExternalSyntheticLambda1; +Lcom/android/server/am/AnrHelper$AnrConsumerThread; +Lcom/android/server/am/AnrHelper; +Lcom/android/server/am/AppBatteryExemptionTracker$AppBatteryExemptionPolicy; +Lcom/android/server/am/AppBatteryExemptionTracker$UidBatteryStates; +Lcom/android/server/am/AppBatteryExemptionTracker; +Lcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda0; +Lcom/android/server/am/AppBatteryTracker$$ExternalSyntheticLambda1; +Lcom/android/server/am/AppBatteryTracker$AppBatteryPolicy; +Lcom/android/server/am/AppBatteryTracker$BatteryUsage; +Lcom/android/server/am/AppBatteryTracker$ImmutableBatteryUsage; +Lcom/android/server/am/AppBatteryTracker; +Lcom/android/server/am/AppBindServiceEventsTracker$AppBindServiceEventsPolicy; +Lcom/android/server/am/AppBindServiceEventsTracker; +Lcom/android/server/am/AppBroadcastEventsTracker$AppBroadcastEventsPolicy; +Lcom/android/server/am/AppBroadcastEventsTracker; +Lcom/android/server/am/AppErrors; +Lcom/android/server/am/AppExitInfoTracker$1; +Lcom/android/server/am/AppExitInfoTracker$2; +Lcom/android/server/am/AppExitInfoTracker$AppExitInfoExternalSource; +Lcom/android/server/am/AppExitInfoTracker$AppTraceRetriever; +Lcom/android/server/am/AppExitInfoTracker$IsolatedUidRecords; +Lcom/android/server/am/AppExitInfoTracker$KillHandler; +Lcom/android/server/am/AppExitInfoTracker; +Lcom/android/server/am/AppFGSTracker$1; +Lcom/android/server/am/AppFGSTracker$AppFGSPolicy; +Lcom/android/server/am/AppFGSTracker$MyHandler; +Lcom/android/server/am/AppFGSTracker$NotificationListener; +Lcom/android/server/am/AppFGSTracker$PackageDurations; +Lcom/android/server/am/AppFGSTracker; +Lcom/android/server/am/AppMediaSessionTracker$$ExternalSyntheticLambda0; +Lcom/android/server/am/AppMediaSessionTracker$AppMediaSessionPolicy; +Lcom/android/server/am/AppMediaSessionTracker; +Lcom/android/server/am/AppPermissionTracker$AppPermissionPolicy; +Lcom/android/server/am/AppPermissionTracker$MyHandler; +Lcom/android/server/am/AppPermissionTracker; +Lcom/android/server/am/AppProfiler$$ExternalSyntheticLambda0; +Lcom/android/server/am/AppProfiler$1; +Lcom/android/server/am/AppProfiler$BgHandler; +Lcom/android/server/am/AppProfiler$CachedAppsWatermarkData; +Lcom/android/server/am/AppProfiler$ProcessCpuThread; +Lcom/android/server/am/AppProfiler$ProfileData; +Lcom/android/server/am/AppProfiler; +Lcom/android/server/am/AppRestrictionController$$ExternalSyntheticLambda1; +Lcom/android/server/am/AppRestrictionController$1; +Lcom/android/server/am/AppRestrictionController$2; +Lcom/android/server/am/AppRestrictionController$3; +Lcom/android/server/am/AppRestrictionController$4; +Lcom/android/server/am/AppRestrictionController$5; +Lcom/android/server/am/AppRestrictionController$BgHandler; +Lcom/android/server/am/AppRestrictionController$ConstantsObserver; +Lcom/android/server/am/AppRestrictionController$Injector; +Lcom/android/server/am/AppRestrictionController$NotificationHelper$1; +Lcom/android/server/am/AppRestrictionController$NotificationHelper; +Lcom/android/server/am/AppRestrictionController$RestrictionSettings; +Lcom/android/server/am/AppRestrictionController$TrackerInfo; +Lcom/android/server/am/AppRestrictionController$UidBatteryUsageProvider; +Lcom/android/server/am/AppRestrictionController; +Lcom/android/server/am/AppStartInfoTracker$1; +Lcom/android/server/am/AppStartInfoTracker$2; +Lcom/android/server/am/AppStartInfoTracker; +Lcom/android/server/am/ApplicationThreadDeferred; +Lcom/android/server/am/BaseAppStateDurations; +Lcom/android/server/am/BaseAppStateDurationsTracker$SimplePackageDurations; +Lcom/android/server/am/BaseAppStateDurationsTracker$UidStateDurations; +Lcom/android/server/am/BaseAppStateDurationsTracker; +Lcom/android/server/am/BaseAppStateEvents$Factory; +Lcom/android/server/am/BaseAppStateEvents$MaxTrackingDurationConfig; +Lcom/android/server/am/BaseAppStateEvents; +Lcom/android/server/am/BaseAppStateEventsTracker$BaseAppStateEventsPolicy; +Lcom/android/server/am/BaseAppStateEventsTracker; +Lcom/android/server/am/BaseAppStatePolicy; +Lcom/android/server/am/BaseAppStateTimeEvents; +Lcom/android/server/am/BaseAppStateTimeSlotEvents; +Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$BaseAppStateTimeSlotEventsPolicy; +Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$H; +Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker$SimpleAppStateTimeslotEvents; +Lcom/android/server/am/BaseAppStateTimeSlotEventsTracker; +Lcom/android/server/am/BaseAppStateTracker$Injector; +Lcom/android/server/am/BaseAppStateTracker$StateListener; +Lcom/android/server/am/BaseAppStateTracker; +Lcom/android/server/am/BaseErrorDialog; +Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda14; +Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda15; +Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda16; +Lcom/android/server/am/BatteryStatsService$$ExternalSyntheticLambda33; +Lcom/android/server/am/BatteryStatsService$1; +Lcom/android/server/am/BatteryStatsService$2; Lcom/android/server/am/BatteryStatsService$3; Lcom/android/server/am/BatteryStatsService$LocalService; +Lcom/android/server/am/BatteryStatsService$WakeupReasonThread; +Lcom/android/server/am/BatteryStatsService; +Lcom/android/server/am/BroadcastConstants$SettingsObserver; +Lcom/android/server/am/BroadcastConstants; +Lcom/android/server/am/BroadcastController$1; +Lcom/android/server/am/BroadcastController; +Lcom/android/server/am/BroadcastDeliveryFailedException; +Lcom/android/server/am/BroadcastFilter; +Lcom/android/server/am/BroadcastHistory; +Lcom/android/server/am/BroadcastProcessQueue$BroadcastConsumer; +Lcom/android/server/am/BroadcastProcessQueue$BroadcastPredicate; +Lcom/android/server/am/BroadcastProcessQueue$BroadcastRecordConsumer; +Lcom/android/server/am/BroadcastProcessQueue; +Lcom/android/server/am/BroadcastQueue; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda12; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda13; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda14; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda15; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda16; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda17; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda18; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda6; +Lcom/android/server/am/BroadcastQueueModernImpl$$ExternalSyntheticLambda7; Lcom/android/server/am/BroadcastQueueModernImpl$BroadcastAnrTimer; +Lcom/android/server/am/BroadcastQueueModernImpl; +Lcom/android/server/am/BroadcastRecord; +Lcom/android/server/am/BroadcastRetryException; +Lcom/android/server/am/BroadcastSkipPolicy; +Lcom/android/server/am/CacheOomRanker$1; +Lcom/android/server/am/CacheOomRanker$CacheUseComparator; +Lcom/android/server/am/CacheOomRanker$LastActivityTimeComparator; +Lcom/android/server/am/CacheOomRanker$LastRssComparator; +Lcom/android/server/am/CacheOomRanker$ProcessDependencies; +Lcom/android/server/am/CacheOomRanker$ProcessDependenciesImpl; +Lcom/android/server/am/CacheOomRanker$RssComparator; +Lcom/android/server/am/CacheOomRanker$ScoreComparator; +Lcom/android/server/am/CacheOomRanker; +Lcom/android/server/am/CachedAppOptimizer$1; +Lcom/android/server/am/CachedAppOptimizer$2; +Lcom/android/server/am/CachedAppOptimizer$3; +Lcom/android/server/am/CachedAppOptimizer$4; +Lcom/android/server/am/CachedAppOptimizer$AggregatedCompactionStats; +Lcom/android/server/am/CachedAppOptimizer$AggregatedProcessCompactionStats; +Lcom/android/server/am/CachedAppOptimizer$AggregatedSourceCompactionStats; +Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason; +Lcom/android/server/am/CachedAppOptimizer$CompactProfile; +Lcom/android/server/am/CachedAppOptimizer$CompactSource; +Lcom/android/server/am/CachedAppOptimizer$DefaultProcessDependencies; +Lcom/android/server/am/CachedAppOptimizer$FreezeHandler; +Lcom/android/server/am/CachedAppOptimizer$MemCompactionHandler; +Lcom/android/server/am/CachedAppOptimizer$ProcessDependencies; +Lcom/android/server/am/CachedAppOptimizer$PropertyChangedCallbackForTest; +Lcom/android/server/am/CachedAppOptimizer$SettingsContentObserver; +Lcom/android/server/am/CachedAppOptimizer; +Lcom/android/server/am/ComponentAliasResolver$1; +Lcom/android/server/am/ComponentAliasResolver; +Lcom/android/server/am/ContentProviderConnection; +Lcom/android/server/am/ContentProviderHelper; +Lcom/android/server/am/DropboxRateLimiter$Clock; +Lcom/android/server/am/DropboxRateLimiter$DefaultClock; +Lcom/android/server/am/DropboxRateLimiter; +Lcom/android/server/am/FgsTempAllowList; +Lcom/android/server/am/ForegroundServiceTypeLoggerModule; +Lcom/android/server/am/Freezer; +Lcom/android/server/am/HostingRecord; +Lcom/android/server/am/InstrumentationReporter$MyThread; +Lcom/android/server/am/InstrumentationReporter; +Lcom/android/server/am/LmkdConnection$LmkdConnectionListener; +Lcom/android/server/am/LmkdConnection; +Lcom/android/server/am/LowMemDetector$LowMemThread; +Lcom/android/server/am/LowMemDetector; +Lcom/android/server/am/NativeCrashListener; +Lcom/android/server/am/OomAdjuster$$ExternalSyntheticLambda0; +Lcom/android/server/am/OomAdjuster$1; Lcom/android/server/am/OomAdjuster$ComputeOomAdjWindowCallback; +Lcom/android/server/am/OomAdjuster$Injector; +Lcom/android/server/am/OomAdjuster; +Lcom/android/server/am/OomAdjusterDebugLogger; +Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionIgnoringReachableClientsConsumer; +Lcom/android/server/am/OomAdjusterModernImpl$ComputeConnectionsConsumer; +Lcom/android/server/am/OomAdjusterModernImpl$ComputeHostConsumer; +Lcom/android/server/am/OomAdjusterModernImpl$Connection; +Lcom/android/server/am/OomAdjusterModernImpl$OomAdjusterArgs; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda0; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda1; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda2; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$$ExternalSyntheticLambda3; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList; +Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes; +Lcom/android/server/am/OomAdjusterModernImpl$ReachableCollectingConsumer; +Lcom/android/server/am/OomAdjusterModernImpl; +Lcom/android/server/am/OomConnection$OomConnectionListener; +Lcom/android/server/am/OomConnection$OomConnectionThread; +Lcom/android/server/am/OomConnection; +Lcom/android/server/am/PendingIntentController; +Lcom/android/server/am/PendingIntentRecord; +Lcom/android/server/am/PendingStartActivityUids; +Lcom/android/server/am/PendingTempAllowlists; +Lcom/android/server/am/PhantomProcessList$Injector; +Lcom/android/server/am/PhantomProcessList; +Lcom/android/server/am/PreBootBroadcaster; +Lcom/android/server/am/ProcessList$$ExternalSyntheticLambda4; +Lcom/android/server/am/ProcessList$1; +Lcom/android/server/am/ProcessList$2; +Lcom/android/server/am/ProcessList$ImperceptibleKillRunner$H; +Lcom/android/server/am/ProcessList$ImperceptibleKillRunner$IdlenessReceiver; +Lcom/android/server/am/ProcessList$ImperceptibleKillRunner; +Lcom/android/server/am/ProcessList$IsolatedUidRange; +Lcom/android/server/am/ProcessList$IsolatedUidRangeAllocator; +Lcom/android/server/am/ProcessList$KillHandler; +Lcom/android/server/am/ProcessList$MyProcessMap; +Lcom/android/server/am/ProcessList$ProcStartHandler; +Lcom/android/server/am/ProcessList; Lcom/android/server/am/ProcessRecord; +Lcom/android/server/am/ProcessStatsService$1; +Lcom/android/server/am/ProcessStatsService$3; +Lcom/android/server/am/ProcessStatsService$4; +Lcom/android/server/am/ProcessStatsService$LocalService; +Lcom/android/server/am/ProcessStatsService; +Lcom/android/server/am/ProviderMap; +Lcom/android/server/am/ReceiverList; +Lcom/android/server/am/ServiceRecord; +Lcom/android/server/am/TraceErrorLogger; +Lcom/android/server/am/UidObserverController$$ExternalSyntheticLambda0; +Lcom/android/server/am/UidObserverController$ChangeRecord; +Lcom/android/server/am/UidObserverController; +Lcom/android/server/am/UidProcessMap; +Lcom/android/server/am/UserController$1; +Lcom/android/server/am/UserController$Injector$1; +Lcom/android/server/am/UserController$Injector; +Lcom/android/server/am/UserController$UserProgressListener; +Lcom/android/server/am/UserController; +Lcom/android/server/am/UserState; +Lcom/android/server/app/GameManagerService$LocalService; +Lcom/android/server/app/GameManagerService; Lcom/android/server/app/GameServiceProviderInstanceImpl$4; Lcom/android/server/apphibernation/AppHibernationService$$ExternalSyntheticLambda0; Lcom/android/server/apphibernation/AppHibernationService$LocalService; +Lcom/android/server/appop/AppOpMigrationHelper; +Lcom/android/server/appop/AppOpMigrationHelperImpl; +Lcom/android/server/appop/AppOpsCheckingServiceImpl; +Lcom/android/server/appop/AppOpsCheckingServiceInterface$AppOpsModeChangedListener; +Lcom/android/server/appop/AppOpsCheckingServiceInterface; +Lcom/android/server/appop/AppOpsCheckingServiceTracingDecorator; +Lcom/android/server/appop/AppOpsManagerLocal; +Lcom/android/server/appop/AppOpsRecentAccessPersistence; +Lcom/android/server/appop/AppOpsRestrictions$AppOpsRestrictionRemovedListener; +Lcom/android/server/appop/AppOpsRestrictions; +Lcom/android/server/appop/AppOpsRestrictionsImpl; +Lcom/android/server/appop/AppOpsService$$ExternalSyntheticLambda6; +Lcom/android/server/appop/AppOpsService$1$1; +Lcom/android/server/appop/AppOpsService$1; Lcom/android/server/appop/AppOpsService$2; +Lcom/android/server/appop/AppOpsService$3; +Lcom/android/server/appop/AppOpsService$4; +Lcom/android/server/appop/AppOpsService$8; Lcom/android/server/appop/AppOpsService$AppOpsManagerInternalImpl; +Lcom/android/server/appop/AppOpsService$AppOpsManagerLocalImpl; Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda11; Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda1; Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda7; Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher$$ExternalSyntheticLambda9; +Lcom/android/server/appop/AppOpsService$CheckOpsDelegateDispatcher; +Lcom/android/server/appop/AppOpsService$Constants; +Lcom/android/server/appop/AppOpsService$ModeCallback; +Lcom/android/server/appop/AppOpsService$Op; +Lcom/android/server/appop/AppOpsService$Ops; +Lcom/android/server/appop/AppOpsService$Shell; +Lcom/android/server/appop/AppOpsService$UidState; +Lcom/android/server/appop/AppOpsService; +Lcom/android/server/appop/AppOpsUidStateTracker; +Lcom/android/server/appop/AppOpsUidStateTrackerImpl; +Lcom/android/server/appop/AttributedOp$InProgressStartOpEventPool; +Lcom/android/server/appop/AttributedOp$OpEventProxyInfoPool; +Lcom/android/server/appop/AttributedOp; +Lcom/android/server/appop/AudioRestrictionManager; +Lcom/android/server/appop/DiscreteRegistry$DiscreteOps; +Lcom/android/server/appop/DiscreteRegistry; +Lcom/android/server/appop/HistoricalRegistry$1; +Lcom/android/server/appop/HistoricalRegistry; +Lcom/android/server/appop/OnOpModeChangedListener; +Lcom/android/server/biometrics/sensors/face/FaceService; Lcom/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider$BiometricTaskStackListener; -Lcom/android/server/connectivity/MultipathPolicyTracker$2; +Lcom/android/server/broadcastradio/hal1/BroadcastRadioService; +Lcom/android/server/broadcastradio/hal1/Convert; +Lcom/android/server/broadcastradio/hal1/Tuner; +Lcom/android/server/broadcastradio/hal1/TunerCallback; +Lcom/android/server/companion/virtual/GenericWindowPolicyController$RunningAppsChangedListener; +Lcom/android/server/companion/virtual/InputController; +Lcom/android/server/companion/virtual/VirtualDeviceImpl; +Lcom/android/server/companion/virtual/VirtualDeviceManagerInternal; +Lcom/android/server/compat/CompatChange$ChangeListener; +Lcom/android/server/compat/CompatChange; +Lcom/android/server/compat/CompatConfig; +Lcom/android/server/compat/OverrideValidatorImpl$SettingsObserver; +Lcom/android/server/compat/OverrideValidatorImpl; +Lcom/android/server/compat/PlatformCompat$1; +Lcom/android/server/compat/PlatformCompat; +Lcom/android/server/compat/PlatformCompatNative; +Lcom/android/server/compat/config/Change; +Lcom/android/server/compat/config/Config; +Lcom/android/server/compat/config/XmlParser; +Lcom/android/server/connectivity/Vpn; +Lcom/android/server/coverage/CoverageService; +Lcom/android/server/crashrecovery/CrashRecoveryHelper; +Lcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda0; +Lcom/android/server/criticalevents/CriticalEventLog$$ExternalSyntheticLambda1; +Lcom/android/server/criticalevents/CriticalEventLog$ILogLoader; +Lcom/android/server/criticalevents/CriticalEventLog$LogLoader; +Lcom/android/server/criticalevents/CriticalEventLog$ThreadSafeRingBuffer; +Lcom/android/server/criticalevents/CriticalEventLog; +Lcom/android/server/devicepolicy/CryptoTestHelper; Lcom/android/server/display/AutomaticBrightnessController$TaskStackListenerImpl; +Lcom/android/server/display/DeviceStateToLayoutMap; +Lcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda0; +Lcom/android/server/display/DisplayAdapter$$ExternalSyntheticLambda1; +Lcom/android/server/display/DisplayAdapter$Listener; +Lcom/android/server/display/DisplayAdapter; +Lcom/android/server/display/DisplayBlanker; +Lcom/android/server/display/DisplayControl; +Lcom/android/server/display/DisplayDevice; +Lcom/android/server/display/DisplayDeviceConfig$$ExternalSyntheticLambda0; +Lcom/android/server/display/DisplayDeviceConfig$1; +Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData$ThrottlingLevel; +Lcom/android/server/display/DisplayDeviceConfig$ThermalBrightnessThrottlingData; +Lcom/android/server/display/DisplayDeviceConfig; +Lcom/android/server/display/DisplayDeviceInfo; +Lcom/android/server/display/DisplayDeviceRepository$Listener; +Lcom/android/server/display/DisplayDeviceRepository; +Lcom/android/server/display/DisplayGroup; +Lcom/android/server/display/DisplayInfoProxy; +Lcom/android/server/display/DisplayManagerService$$ExternalSyntheticLambda4; +Lcom/android/server/display/DisplayManagerService$1; +Lcom/android/server/display/DisplayManagerService$2; +Lcom/android/server/display/DisplayManagerService$3; +Lcom/android/server/display/DisplayManagerService$BinderService; +Lcom/android/server/display/DisplayManagerService$BrightnessPair; +Lcom/android/server/display/DisplayManagerService$DisplayManagerHandler; +Lcom/android/server/display/DisplayManagerService$ExternalDisplayPolicyInjector; +Lcom/android/server/display/DisplayManagerService$Injector; Lcom/android/server/display/DisplayManagerService$LocalService; +Lcom/android/server/display/DisplayManagerService$LogicalDisplayListener; +Lcom/android/server/display/DisplayManagerService$SyncRoot; +Lcom/android/server/display/DisplayManagerService$UidImportanceListener; +Lcom/android/server/display/DisplayManagerService; +Lcom/android/server/display/DisplayManagerShellCommand; +Lcom/android/server/display/ExternalDisplayPolicy$Injector; +Lcom/android/server/display/ExternalDisplayPolicy$SkinThermalStatusObserver; +Lcom/android/server/display/ExternalDisplayPolicy; +Lcom/android/server/display/ExternalDisplayStatsService$1$$ExternalSyntheticLambda0; +Lcom/android/server/display/ExternalDisplayStatsService$1$$ExternalSyntheticLambda1; +Lcom/android/server/display/ExternalDisplayStatsService$1; +Lcom/android/server/display/ExternalDisplayStatsService$2; +Lcom/android/server/display/ExternalDisplayStatsService$Injector; +Lcom/android/server/display/ExternalDisplayStatsService; +Lcom/android/server/display/HighBrightnessModeMetadataMapper; +Lcom/android/server/display/LocalDisplayAdapter$BacklightAdapter; +Lcom/android/server/display/LocalDisplayAdapter$DisplayEventListener; +Lcom/android/server/display/LocalDisplayAdapter$DisplayModeRecord; +Lcom/android/server/display/LocalDisplayAdapter$Injector; +Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayDevice; +Lcom/android/server/display/LocalDisplayAdapter$LocalDisplayEventListener; +Lcom/android/server/display/LocalDisplayAdapter$ProxyDisplayEventReceiver; +Lcom/android/server/display/LocalDisplayAdapter$SurfaceControlProxy; +Lcom/android/server/display/LocalDisplayAdapter; +Lcom/android/server/display/LogicalDisplay; +Lcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda2; +Lcom/android/server/display/LogicalDisplayMapper$$ExternalSyntheticLambda3; +Lcom/android/server/display/LogicalDisplayMapper$Listener; +Lcom/android/server/display/LogicalDisplayMapper$LogicalDisplayMapperHandler; +Lcom/android/server/display/LogicalDisplayMapper; +Lcom/android/server/display/OverlayDisplayAdapter; +Lcom/android/server/display/PersistentDataStore$BrightnessConfigurations; +Lcom/android/server/display/PersistentDataStore$DisplayState; +Lcom/android/server/display/PersistentDataStore$Injector; +Lcom/android/server/display/PersistentDataStore$StableDeviceValues; +Lcom/android/server/display/PersistentDataStore; +Lcom/android/server/display/SmallAreaDetectionController; +Lcom/android/server/display/VirtualDisplayAdapter$1; +Lcom/android/server/display/VirtualDisplayAdapter$SurfaceControlDisplayFactory; +Lcom/android/server/display/VirtualDisplayAdapter$VirtualDisplayDevice; +Lcom/android/server/display/VirtualDisplayAdapter; +Lcom/android/server/display/WifiDisplayAdapter; +Lcom/android/server/display/config/AutoBrightnessModeName; +Lcom/android/server/display/config/AutoBrightnessSettingName; +Lcom/android/server/display/config/BrightnessThresholds; +Lcom/android/server/display/config/BrightnessThrottlingMap; +Lcom/android/server/display/config/BrightnessThrottlingPoint; +Lcom/android/server/display/config/DisplayBrightnessMappingConfig; +Lcom/android/server/display/config/DisplayConfiguration; +Lcom/android/server/display/config/HbmTiming; +Lcom/android/server/display/config/HdrBrightnessData; +Lcom/android/server/display/config/HighBrightnessMode; +Lcom/android/server/display/config/HighBrightnessModeData; +Lcom/android/server/display/config/HysteresisLevels; +Lcom/android/server/display/config/IntegerArray; +Lcom/android/server/display/config/NitsMap; +Lcom/android/server/display/config/Point; +Lcom/android/server/display/config/PredefinedBrightnessLimitNames; +Lcom/android/server/display/config/RefreshRateData; +Lcom/android/server/display/config/SensorData; +Lcom/android/server/display/config/SensorDetails; +Lcom/android/server/display/config/SupportedModeData; +Lcom/android/server/display/config/ThermalStatus; +Lcom/android/server/display/config/ThermalThrottling; +Lcom/android/server/display/config/Thresholds; +Lcom/android/server/display/config/XmlParser; +Lcom/android/server/display/feature/DeviceConfigParameterProvider; +Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda0; +Lcom/android/server/display/feature/DisplayManagerFlags$$ExternalSyntheticLambda1; +Lcom/android/server/display/feature/DisplayManagerFlags$FlagState; +Lcom/android/server/display/feature/DisplayManagerFlags; +Lcom/android/server/display/layout/DisplayIdProducer; +Lcom/android/server/display/layout/Layout$Display; +Lcom/android/server/display/layout/Layout; +Lcom/android/server/display/mode/DisplayModeDirector$$ExternalSyntheticLambda0; +Lcom/android/server/display/mode/DisplayModeDirector$AppRequestObserver; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda10; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda11; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda12; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda13; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda2; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda5; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda6; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda7; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda8; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$$ExternalSyntheticLambda9; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$1; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener$1; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver$LightSensorEventListener; +Lcom/android/server/display/mode/DisplayModeDirector$BrightnessObserver; +Lcom/android/server/display/mode/DisplayModeDirector$DesiredDisplayModeSpecs; +Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda0; +Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda1; +Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda2; +Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings$$ExternalSyntheticLambda3; +Lcom/android/server/display/mode/DisplayModeDirector$DeviceConfigDisplaySettings; +Lcom/android/server/display/mode/DisplayModeDirector$DisplayDeviceConfigProvider; +Lcom/android/server/display/mode/DisplayModeDirector$DisplayModeDirectorHandler; +Lcom/android/server/display/mode/DisplayModeDirector$DisplayObserver; +Lcom/android/server/display/mode/DisplayModeDirector$HbmObserver; +Lcom/android/server/display/mode/DisplayModeDirector$Injector; +Lcom/android/server/display/mode/DisplayModeDirector$RealInjector; +Lcom/android/server/display/mode/DisplayModeDirector$SettingsObserver$1; +Lcom/android/server/display/mode/DisplayModeDirector$SettingsObserver; +Lcom/android/server/display/mode/DisplayModeDirector$UdfpsObserver; +Lcom/android/server/display/mode/DisplayModeDirector; +Lcom/android/server/display/mode/ProximitySensorObserver; +Lcom/android/server/display/mode/RefreshRateVote$PhysicalVote; +Lcom/android/server/display/mode/RefreshRateVote$RenderVote; +Lcom/android/server/display/mode/RefreshRateVote; +Lcom/android/server/display/mode/SkinThermalStatusObserver; +Lcom/android/server/display/mode/SupportedRefreshRatesVote; +Lcom/android/server/display/mode/SyntheticModeManager; +Lcom/android/server/display/mode/SystemRequestObserver$1; +Lcom/android/server/display/mode/SystemRequestObserver; +Lcom/android/server/display/mode/Vote; +Lcom/android/server/display/mode/VotesStatsReporter; +Lcom/android/server/display/mode/VotesStorage$Listener; +Lcom/android/server/display/mode/VotesStorage; +Lcom/android/server/display/notifications/ConnectedDisplayUsbErrorsDetector$Listener; +Lcom/android/server/display/notifications/DisplayNotificationManager$1; +Lcom/android/server/display/notifications/DisplayNotificationManager$Injector; +Lcom/android/server/display/notifications/DisplayNotificationManager; +Lcom/android/server/display/utils/DebugUtils; +Lcom/android/server/display/utils/DeviceConfigParsingUtils; Lcom/android/server/dreams/DreamManagerService$LocalService; +Lcom/android/server/firewall/AndFilter$1; +Lcom/android/server/firewall/AndFilter; +Lcom/android/server/firewall/CategoryFilter$1; +Lcom/android/server/firewall/CategoryFilter; +Lcom/android/server/firewall/Filter; +Lcom/android/server/firewall/FilterFactory; +Lcom/android/server/firewall/FilterList; +Lcom/android/server/firewall/IntentFirewall$AMSInterface; +Lcom/android/server/firewall/IntentFirewall$FirewallHandler; +Lcom/android/server/firewall/IntentFirewall$FirewallIntentFilter; +Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver; +Lcom/android/server/firewall/IntentFirewall$Rule; +Lcom/android/server/firewall/IntentFirewall$RuleObserver; +Lcom/android/server/firewall/IntentFirewall; +Lcom/android/server/firewall/NotFilter$1; +Lcom/android/server/firewall/NotFilter; +Lcom/android/server/firewall/OrFilter$1; +Lcom/android/server/firewall/OrFilter; +Lcom/android/server/firewall/PortFilter$1; +Lcom/android/server/firewall/PortFilter; +Lcom/android/server/firewall/SenderFilter$1; +Lcom/android/server/firewall/SenderFilter$2; +Lcom/android/server/firewall/SenderFilter$3; +Lcom/android/server/firewall/SenderFilter$4; +Lcom/android/server/firewall/SenderFilter$5; +Lcom/android/server/firewall/SenderFilter; +Lcom/android/server/firewall/SenderPackageFilter$1; +Lcom/android/server/firewall/SenderPackageFilter; +Lcom/android/server/firewall/SenderPermissionFilter$1; +Lcom/android/server/firewall/SenderPermissionFilter; +Lcom/android/server/firewall/StringFilter$10; +Lcom/android/server/firewall/StringFilter$1; +Lcom/android/server/firewall/StringFilter$2; +Lcom/android/server/firewall/StringFilter$3; +Lcom/android/server/firewall/StringFilter$4; +Lcom/android/server/firewall/StringFilter$5; +Lcom/android/server/firewall/StringFilter$6; +Lcom/android/server/firewall/StringFilter$7; +Lcom/android/server/firewall/StringFilter$8; +Lcom/android/server/firewall/StringFilter$9; +Lcom/android/server/firewall/StringFilter$ContainsFilter; +Lcom/android/server/firewall/StringFilter$EqualsFilter; +Lcom/android/server/firewall/StringFilter$IsNullFilter; +Lcom/android/server/firewall/StringFilter$PatternStringFilter; +Lcom/android/server/firewall/StringFilter$RegexFilter; +Lcom/android/server/firewall/StringFilter$StartsWithFilter; +Lcom/android/server/firewall/StringFilter$ValueProvider; +Lcom/android/server/firewall/StringFilter; +Lcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda0; +Lcom/android/server/flags/DynamicFlagBinderDelegate$$ExternalSyntheticLambda1; +Lcom/android/server/flags/DynamicFlagBinderDelegate$1; +Lcom/android/server/flags/DynamicFlagBinderDelegate$BinderGriever; +Lcom/android/server/flags/DynamicFlagBinderDelegate; +Lcom/android/server/flags/FeatureFlagsBinder; +Lcom/android/server/flags/FeatureFlagsService$PermissionsChecker; +Lcom/android/server/flags/FeatureFlagsService; +Lcom/android/server/flags/FlagCache$$ExternalSyntheticLambda0; +Lcom/android/server/flags/FlagCache; +Lcom/android/server/flags/FlagOverrideStore$FlagChangeCallback; +Lcom/android/server/flags/FlagOverrideStore; +Lcom/android/server/flags/FlagsShellCommand; +Lcom/android/server/flags/GlobalSettingsProxy; +Lcom/android/server/flags/SettingsProxy; +Lcom/android/server/gpu/GpuService; +Lcom/android/server/graphics/fonts/FontManagerService$Lifecycle; +Lcom/android/server/input/InputManagerInternal; +Lcom/android/server/input/InputManagerService$2; +Lcom/android/server/input/InputManagerService$AdditionalDisplayInputProperties; +Lcom/android/server/input/InputManagerService$InputFilterHost; +Lcom/android/server/input/InputManagerService$InputManagerHandler; Lcom/android/server/input/InputManagerService$LocalService; +Lcom/android/server/input/InputManagerService; +Lcom/android/server/input/InputShellCommand; +Lcom/android/server/input/NativeInputManagerService$NativeImpl; +Lcom/android/server/input/NativeInputManagerService; +Lcom/android/server/input/TouchpadFingerState; +Lcom/android/server/input/TouchpadHardwareProperties; +Lcom/android/server/input/TouchpadHardwareState; +Lcom/android/server/input/debug/FocusEventDebugView; Lcom/android/server/inputmethod/InputMethodManagerService$LocalServiceImpl; Lcom/android/server/job/JobSchedulerService$4; Lcom/android/server/job/controllers/BackgroundJobsController$2; Lcom/android/server/job/controllers/QuotaController$TempAllowlistTracker; +Lcom/android/server/lights/LightsManager; +Lcom/android/server/lights/LightsService$1; Lcom/android/server/lights/LightsService$LightImpl; -Lcom/android/server/location/provider/StationaryThrottlingLocationProvider; +Lcom/android/server/lights/LightsService$LightsManagerBinderService; +Lcom/android/server/lights/LightsService$VintfHalCache; +Lcom/android/server/lights/LightsService; +Lcom/android/server/lights/LogicalLight; +Lcom/android/server/location/gnss/GnssConfiguration; +Lcom/android/server/location/gnss/GnssNetworkConnectivityHandler; +Lcom/android/server/location/gnss/GnssVisibilityControl; +Lcom/android/server/location/gnss/hal/GnssNative; +Lcom/android/server/locksettings/SyntheticPasswordManager; Lcom/android/server/media/projection/MediaProjectionManagerService$1; Lcom/android/server/net/NetworkManagementService$LocalService; Lcom/android/server/net/NetworkManagementService$NetdUnsolicitedEventListener; Lcom/android/server/net/NetworkPolicyManagerService$NetworkPolicyManagerInternalImpl; Lcom/android/server/net/watchlist/NetworkWatchlistService$1; Lcom/android/server/notification/NotificationManagerService$13; +Lcom/android/server/om/OverlayActorEnforcer$ActorState; +Lcom/android/server/om/OverlayActorEnforcer; +Lcom/android/server/om/OverlayManagerService; +Lcom/android/server/om/OverlayReferenceMapper$1; +Lcom/android/server/om/OverlayReferenceMapper$Provider; +Lcom/android/server/om/OverlayReferenceMapper; +Lcom/android/server/os/DeviceIdentifiersPolicyService$DeviceIdentifiersPolicy; +Lcom/android/server/os/DeviceIdentifiersPolicyService; +Lcom/android/server/pdb/PersistentDataBlockService; +Lcom/android/server/permission/PermissionManagerLocal; +Lcom/android/server/permission/access/AccessCheckingService; +Lcom/android/server/permission/access/AccessPersistence$Companion; +Lcom/android/server/permission/access/AccessPersistence$WriteHandler; +Lcom/android/server/permission/access/AccessPersistence; +Lcom/android/server/permission/access/AccessPolicy$Companion; +Lcom/android/server/permission/access/AccessPolicy; +Lcom/android/server/permission/access/AccessState; +Lcom/android/server/permission/access/ExternalState; +Lcom/android/server/permission/access/GetStateScope; +Lcom/android/server/permission/access/MutableAccessState; +Lcom/android/server/permission/access/MutableExternalState; +Lcom/android/server/permission/access/MutableSystemState; +Lcom/android/server/permission/access/MutableUserState; +Lcom/android/server/permission/access/MutateStateScope; +Lcom/android/server/permission/access/SchemePolicy; +Lcom/android/server/permission/access/SystemState; +Lcom/android/server/permission/access/UserState; +Lcom/android/server/permission/access/WritableState; +Lcom/android/server/permission/access/appop/AppIdAppOpMigration$Companion; +Lcom/android/server/permission/access/appop/AppIdAppOpMigration; +Lcom/android/server/permission/access/appop/AppIdAppOpPersistence$Companion; +Lcom/android/server/permission/access/appop/AppIdAppOpPersistence; +Lcom/android/server/permission/access/appop/AppIdAppOpPolicy$Companion; +Lcom/android/server/permission/access/appop/AppIdAppOpPolicy$OnAppOpModeChangedListener; +Lcom/android/server/permission/access/appop/AppIdAppOpPolicy; +Lcom/android/server/permission/access/appop/AppIdAppOpUpgrade; +Lcom/android/server/permission/access/appop/AppOpService$Companion; +Lcom/android/server/permission/access/appop/AppOpService$OnAppIdAppOpModeChangedListener; +Lcom/android/server/permission/access/appop/AppOpService$OnPackageAppOpModeChangedListener; Lcom/android/server/permission/access/appop/AppOpService; +Lcom/android/server/permission/access/appop/BaseAppOpPersistence$Companion; +Lcom/android/server/permission/access/appop/BaseAppOpPersistence; +Lcom/android/server/permission/access/appop/BaseAppOpPolicy; +Lcom/android/server/permission/access/appop/PackageAppOpMigration$Companion; +Lcom/android/server/permission/access/appop/PackageAppOpMigration; +Lcom/android/server/permission/access/appop/PackageAppOpPersistence$Companion; +Lcom/android/server/permission/access/appop/PackageAppOpPersistence; +Lcom/android/server/permission/access/appop/PackageAppOpPolicy$Companion; +Lcom/android/server/permission/access/appop/PackageAppOpPolicy$OnAppOpModeChangedListener; +Lcom/android/server/permission/access/appop/PackageAppOpPolicy; +Lcom/android/server/permission/access/appop/PackageAppOpUpgrade; +Lcom/android/server/permission/access/collection/ArraySetExtensionsKt; +Lcom/android/server/permission/access/immutable/Immutable; +Lcom/android/server/permission/access/immutable/IndexedList; +Lcom/android/server/permission/access/immutable/IndexedListSet; +Lcom/android/server/permission/access/immutable/IndexedListSetExtensionsKt; +Lcom/android/server/permission/access/immutable/IndexedMap; +Lcom/android/server/permission/access/immutable/IndexedReferenceMap; +Lcom/android/server/permission/access/immutable/IndexedSet; +Lcom/android/server/permission/access/immutable/IndexedSetExtensionsKt; +Lcom/android/server/permission/access/immutable/IntMap; +Lcom/android/server/permission/access/immutable/IntMapExtensionsKt; +Lcom/android/server/permission/access/immutable/IntMapKt; +Lcom/android/server/permission/access/immutable/IntReferenceMap; +Lcom/android/server/permission/access/immutable/IntReferenceMapExtensionsKt; +Lcom/android/server/permission/access/immutable/IntSet; +Lcom/android/server/permission/access/immutable/IntSetExtensionsKt; +Lcom/android/server/permission/access/immutable/MutableIndexedList; +Lcom/android/server/permission/access/immutable/MutableIndexedListSet; +Lcom/android/server/permission/access/immutable/MutableIndexedMap; +Lcom/android/server/permission/access/immutable/MutableIndexedReferenceMap; +Lcom/android/server/permission/access/immutable/MutableIndexedSet; +Lcom/android/server/permission/access/immutable/MutableIntMap; +Lcom/android/server/permission/access/immutable/MutableIntReferenceMap; +Lcom/android/server/permission/access/immutable/MutableIntSet; +Lcom/android/server/permission/access/immutable/MutableReference; +Lcom/android/server/permission/access/permission/AppIdPermissionMigration$Companion; +Lcom/android/server/permission/access/permission/AppIdPermissionMigration; +Lcom/android/server/permission/access/permission/AppIdPermissionPersistence$Companion; +Lcom/android/server/permission/access/permission/AppIdPermissionPersistence; +Lcom/android/server/permission/access/permission/AppIdPermissionPolicy$Companion; +Lcom/android/server/permission/access/permission/AppIdPermissionPolicy$OnPermissionFlagsChangedListener; +Lcom/android/server/permission/access/permission/AppIdPermissionPolicy; +Lcom/android/server/permission/access/permission/AppIdPermissionUpgrade$Companion; +Lcom/android/server/permission/access/permission/AppIdPermissionUpgrade; +Lcom/android/server/permission/access/permission/DevicePermissionPersistence$Companion; +Lcom/android/server/permission/access/permission/DevicePermissionPersistence; +Lcom/android/server/permission/access/permission/DevicePermissionPolicy$Companion; +Lcom/android/server/permission/access/permission/DevicePermissionPolicy$OnDevicePermissionFlagsChangedListener; +Lcom/android/server/permission/access/permission/DevicePermissionPolicy; +Lcom/android/server/permission/access/permission/Permission$Companion; +Lcom/android/server/permission/access/permission/Permission; +Lcom/android/server/permission/access/permission/PermissionManagerLocalImpl; +Lcom/android/server/permission/access/permission/PermissionService$Companion; +Lcom/android/server/permission/access/permission/PermissionService$OnPermissionFlagsChangedListener; +Lcom/android/server/permission/access/permission/PermissionService$OnPermissionsChangeListeners$Companion; +Lcom/android/server/permission/access/permission/PermissionService$OnPermissionsChangeListeners; +Lcom/android/server/permission/access/permission/PermissionService; +Lcom/android/server/permission/access/util/PermissionApex; +Lcom/android/server/permission/jarjar/kotlin/Pair; +Lcom/android/server/permission/jarjar/kotlin/TuplesKt; +Lcom/android/server/permission/jarjar/kotlin/UninitializedPropertyAccessException; +Lcom/android/server/permission/jarjar/kotlin/Unit; +Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt__ArraysJVMKt; +Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt__ArraysKt; +Lcom/android/server/permission/jarjar/kotlin/collections/ArraysKt___ArraysJvmKt; +Lcom/android/server/permission/jarjar/kotlin/collections/ArraysUtilJVM; +Lcom/android/server/permission/jarjar/kotlin/collections/EmptyMap; +Lcom/android/server/permission/jarjar/kotlin/collections/MapsKt__MapWithDefaultKt; +Lcom/android/server/permission/jarjar/kotlin/collections/MapsKt__MapsJVMKt; +Lcom/android/server/permission/jarjar/kotlin/collections/MapsKt__MapsKt; +Lcom/android/server/permission/jarjar/kotlin/io/CloseableKt; +Lcom/android/server/permission/jarjar/kotlin/jdk7/AutoCloseableKt; +Lcom/android/server/permission/jarjar/kotlin/jvm/internal/Intrinsics; +Lcom/android/server/pm/AbstractStatsBase$1; +Lcom/android/server/pm/AbstractStatsBase; +Lcom/android/server/pm/ApexManager$1; +Lcom/android/server/pm/ApexManager$ActiveApexInfo; +Lcom/android/server/pm/ApexManager$ApexManagerImpl; +Lcom/android/server/pm/ApexManager$ScanResult; +Lcom/android/server/pm/ApexManager; +Lcom/android/server/pm/ApexSystemServiceInfo; +Lcom/android/server/pm/AppDataHelper; +Lcom/android/server/pm/AppIdSettingMap; +Lcom/android/server/pm/AppsFilterBase; +Lcom/android/server/pm/AppsFilterImpl$$ExternalSyntheticLambda0; +Lcom/android/server/pm/AppsFilterImpl$1; +Lcom/android/server/pm/AppsFilterImpl$FeatureConfigImpl; +Lcom/android/server/pm/AppsFilterImpl; +Lcom/android/server/pm/AppsFilterLocked; +Lcom/android/server/pm/AppsFilterSnapshot; +Lcom/android/server/pm/AppsFilterSnapshotImpl; +Lcom/android/server/pm/AppsFilterUtils; +Lcom/android/server/pm/BroadcastHelper; +Lcom/android/server/pm/ChangedPackagesTracker; +Lcom/android/server/pm/CompilerStats; +Lcom/android/server/pm/Computer; +Lcom/android/server/pm/ComputerEngine$$ExternalSyntheticLambda1; +Lcom/android/server/pm/ComputerEngine$Settings; +Lcom/android/server/pm/ComputerEngine; +Lcom/android/server/pm/ComputerLocked; +Lcom/android/server/pm/CrossProfileIntentFilter; Lcom/android/server/pm/CrossProfileIntentResolver; +Lcom/android/server/pm/CrossProfileIntentResolverEngine; +Lcom/android/server/pm/CrossProfileResolver; +Lcom/android/server/pm/DataLoaderManagerService$DataLoaderManagerBinderService; +Lcom/android/server/pm/DataLoaderManagerService; +Lcom/android/server/pm/DefaultAppProvider; +Lcom/android/server/pm/DefaultCrossProfileIntentFilter$Builder; +Lcom/android/server/pm/DefaultCrossProfileIntentFilter; +Lcom/android/server/pm/DefaultCrossProfileIntentFiltersUtils; +Lcom/android/server/pm/DefaultCrossProfileResolver; +Lcom/android/server/pm/DeletePackageAction; +Lcom/android/server/pm/DeletePackageHelper; +Lcom/android/server/pm/DexOptHelper$1; +Lcom/android/server/pm/DexOptHelper$DexoptDoneHandler; +Lcom/android/server/pm/DexOptHelper; +Lcom/android/server/pm/DistractingPackageHelper; +Lcom/android/server/pm/DomainVerificationConnection; +Lcom/android/server/pm/FeatureConfig; +Lcom/android/server/pm/FreeStorageHelper; +Lcom/android/server/pm/IncrementalProgressListener; +Lcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda1; +Lcom/android/server/pm/InitAppsHelper$$ExternalSyntheticLambda2; +Lcom/android/server/pm/InitAppsHelper; +Lcom/android/server/pm/InstallArgs; +Lcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda3; +Lcom/android/server/pm/InstallPackageHelper$$ExternalSyntheticLambda4; +Lcom/android/server/pm/InstallPackageHelper; +Lcom/android/server/pm/InstallRequest; +Lcom/android/server/pm/InstallSource; +Lcom/android/server/pm/Installer$$ExternalSyntheticLambda0; +Lcom/android/server/pm/Installer$InstallerException; +Lcom/android/server/pm/Installer$LegacyDexoptDisabledException; +Lcom/android/server/pm/Installer; +Lcom/android/server/pm/InstantAppRegistry$1; +Lcom/android/server/pm/InstantAppRegistry$2; +Lcom/android/server/pm/InstantAppRegistry$CookiePersistence; +Lcom/android/server/pm/InstantAppRegistry; +Lcom/android/server/pm/InstantAppResolverConnection; +Lcom/android/server/pm/InstructionSets; +Lcom/android/server/pm/KeySetHandle; +Lcom/android/server/pm/KeySetManagerService$PublicKeyHandle; +Lcom/android/server/pm/KeySetManagerService; +Lcom/android/server/pm/KnownPackages; +Lcom/android/server/pm/ModuleInfoProvider; +Lcom/android/server/pm/MovePackageHelper$MoveCallbacks; +Lcom/android/server/pm/NoFilteringResolver; +Lcom/android/server/pm/PackageAbiHelper$Abis; +Lcom/android/server/pm/PackageAbiHelper$NativeLibraryPaths; +Lcom/android/server/pm/PackageAbiHelper; +Lcom/android/server/pm/PackageAbiHelperImpl; +Lcom/android/server/pm/PackageArchiver$FixedSizeBitmapDrawable; +Lcom/android/server/pm/PackageArchiver; +Lcom/android/server/pm/PackageDexOptimizer$1; +Lcom/android/server/pm/PackageDexOptimizer$Injector; +Lcom/android/server/pm/PackageDexOptimizer; +Lcom/android/server/pm/PackageFreezer; Lcom/android/server/pm/PackageHandler; +Lcom/android/server/pm/PackageInstallerService$1; +Lcom/android/server/pm/PackageInstallerService$Lifecycle; +Lcom/android/server/pm/PackageInstallerService$PackageDeleteObserverAdapter; +Lcom/android/server/pm/PackageInstallerService; +Lcom/android/server/pm/PackageInstallerSession$1; +Lcom/android/server/pm/PackageInstallerSession$2; +Lcom/android/server/pm/PackageInstallerSession$3; +Lcom/android/server/pm/PackageInstallerSession; +Lcom/android/server/pm/PackageKeySetData; +Lcom/android/server/pm/PackageManagerException; +Lcom/android/server/pm/PackageManagerInternalBase; +Lcom/android/server/pm/PackageManagerLocal$UnfilteredSnapshot; +Lcom/android/server/pm/PackageManagerLocal; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda10; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda11; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda12; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda13; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda14; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda15; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda16; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda17; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda18; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda19; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda1; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda20; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda21; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda22; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda23; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda24; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda25; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda26; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda27; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda28; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda29; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda2; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda31; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda32; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda33; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda34; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda35; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda36; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda37; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda38; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda39; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda3; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda48; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda49; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda6; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda7; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda8; +Lcom/android/server/pm/PackageManagerService$$ExternalSyntheticLambda9; +Lcom/android/server/pm/PackageManagerService$1; +Lcom/android/server/pm/PackageManagerService$2; +Lcom/android/server/pm/PackageManagerService$3; +Lcom/android/server/pm/PackageManagerService$4; +Lcom/android/server/pm/PackageManagerService$5; +Lcom/android/server/pm/PackageManagerService$6; +Lcom/android/server/pm/PackageManagerService$DefaultSystemWrapper; Lcom/android/server/pm/PackageManagerService$IPackageManagerImpl; Lcom/android/server/pm/PackageManagerService$PackageManagerInternalImpl; +Lcom/android/server/pm/PackageManagerService$Snapshot; +Lcom/android/server/pm/PackageManagerService; +Lcom/android/server/pm/PackageManagerServiceCompilerMapping; +Lcom/android/server/pm/PackageManagerServiceInjector$Producer; +Lcom/android/server/pm/PackageManagerServiceInjector$ProducerWithArgument; +Lcom/android/server/pm/PackageManagerServiceInjector$ServiceProducer; +Lcom/android/server/pm/PackageManagerServiceInjector$Singleton; +Lcom/android/server/pm/PackageManagerServiceInjector$SystemWrapper; +Lcom/android/server/pm/PackageManagerServiceInjector; +Lcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda0; +Lcom/android/server/pm/PackageManagerServiceUtils$$ExternalSyntheticLambda1; +Lcom/android/server/pm/PackageManagerServiceUtils$1; +Lcom/android/server/pm/PackageManagerServiceUtils; +Lcom/android/server/pm/PackageManagerShellCommandDataLoader; +Lcom/android/server/pm/PackageManagerTracedLock$RawLock; +Lcom/android/server/pm/PackageManagerTracedLock; +Lcom/android/server/pm/PackageMetrics; +Lcom/android/server/pm/PackageMonitorCallbackHelper; +Lcom/android/server/pm/PackageObserverHelper; +Lcom/android/server/pm/PackageProperty; +Lcom/android/server/pm/PackageRemovedInfo; +Lcom/android/server/pm/PackageSender; +Lcom/android/server/pm/PackageSessionProvider; +Lcom/android/server/pm/PackageSetting$1; +Lcom/android/server/pm/PackageSignatures; +Lcom/android/server/pm/PackageUsage; +Lcom/android/server/pm/ParallelPackageParser$$ExternalSyntheticLambda0; +Lcom/android/server/pm/ParallelPackageParser$ParseResult; +Lcom/android/server/pm/ParallelPackageParser; +Lcom/android/server/pm/PendingPackageBroadcasts; +Lcom/android/server/pm/PersistentPreferredActivity; +Lcom/android/server/pm/PersistentPreferredIntentResolver; +Lcom/android/server/pm/Policy$PolicyBuilder; +Lcom/android/server/pm/Policy; +Lcom/android/server/pm/PolicyComparator; +Lcom/android/server/pm/PreferredActivity$1; +Lcom/android/server/pm/PreferredActivity; +Lcom/android/server/pm/PreferredActivityHelper; +Lcom/android/server/pm/PreferredComponent$Callbacks; +Lcom/android/server/pm/PreferredComponent; +Lcom/android/server/pm/PreferredIntentResolver$1; Lcom/android/server/pm/PreferredIntentResolver; +Lcom/android/server/pm/PrepareFailure; +Lcom/android/server/pm/ProcessLoggingHandler; +Lcom/android/server/pm/ProtectedPackages; +Lcom/android/server/pm/ReconcileFailure; +Lcom/android/server/pm/ReconcilePackageUtils; +Lcom/android/server/pm/ReconciledPackage; +Lcom/android/server/pm/RemovePackageHelper; +Lcom/android/server/pm/ResilientAtomicFile$ReadEventLogger; +Lcom/android/server/pm/ResilientAtomicFile; +Lcom/android/server/pm/ResolveIntentHelper; +Lcom/android/server/pm/RestrictionsSet; +Lcom/android/server/pm/SELinuxMMAC; +Lcom/android/server/pm/ScanPackageUtils; +Lcom/android/server/pm/ScanPartition; +Lcom/android/server/pm/ScanRequest; +Lcom/android/server/pm/ScanResult; +Lcom/android/server/pm/SettingBase; +Lcom/android/server/pm/Settings$$ExternalSyntheticLambda1; +Lcom/android/server/pm/Settings$$ExternalSyntheticLambda2; +Lcom/android/server/pm/Settings$1; +Lcom/android/server/pm/Settings$2; +Lcom/android/server/pm/Settings$3; +Lcom/android/server/pm/Settings$KeySetToValueMap; +Lcom/android/server/pm/Settings$RuntimePermissionPersistence$MyHandler; +Lcom/android/server/pm/Settings$RuntimePermissionPersistence$PersistenceHandler; +Lcom/android/server/pm/Settings$RuntimePermissionPersistence; +Lcom/android/server/pm/Settings$VersionInfo; +Lcom/android/server/pm/Settings; +Lcom/android/server/pm/SettingsXml$ChildSection; +Lcom/android/server/pm/SettingsXml$ReadSection; +Lcom/android/server/pm/SettingsXml$ReadSectionImpl; +Lcom/android/server/pm/SettingsXml; +Lcom/android/server/pm/SharedLibrariesImpl$$ExternalSyntheticLambda0; +Lcom/android/server/pm/SharedLibrariesImpl$1; +Lcom/android/server/pm/SharedLibrariesImpl$2; +Lcom/android/server/pm/SharedLibrariesImpl; +Lcom/android/server/pm/SharedLibrariesRead; +Lcom/android/server/pm/SharedLibraryUtils; +Lcom/android/server/pm/SharedUidMigration; +Lcom/android/server/pm/SharedUserSetting$1; +Lcom/android/server/pm/SharedUserSetting$2; +Lcom/android/server/pm/SharedUserSetting; +Lcom/android/server/pm/SnapshotStatistics$1; +Lcom/android/server/pm/SnapshotStatistics$BinMap; +Lcom/android/server/pm/SnapshotStatistics$Stats; +Lcom/android/server/pm/SnapshotStatistics; +Lcom/android/server/pm/StorageEventHelper; +Lcom/android/server/pm/SuspendPackageHelper; +Lcom/android/server/pm/SystemDeleteException; +Lcom/android/server/pm/UpdateOwnershipHelper; +Lcom/android/server/pm/UserDataPreparer; +Lcom/android/server/pm/UserJourneyLogger; +Lcom/android/server/pm/UserManagerInternal$UserLifecycleListener; +Lcom/android/server/pm/UserManagerInternal; +Lcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda1; +Lcom/android/server/pm/UserManagerService$$ExternalSyntheticLambda3; +Lcom/android/server/pm/UserManagerService$1; +Lcom/android/server/pm/UserManagerService$2; +Lcom/android/server/pm/UserManagerService$3; Lcom/android/server/pm/UserManagerService$LocalService; +Lcom/android/server/pm/UserManagerService$MainHandler; +Lcom/android/server/pm/UserManagerService$SettingsObserver; +Lcom/android/server/pm/UserManagerService$UserData; +Lcom/android/server/pm/UserManagerService$WatchedUserStates; +Lcom/android/server/pm/UserManagerService; +Lcom/android/server/pm/UserManagerServiceShellCommand; +Lcom/android/server/pm/UserNeedsBadgingCache; +Lcom/android/server/pm/UserRestrictionsUtils; +Lcom/android/server/pm/UserSystemPackageInstaller; +Lcom/android/server/pm/UserTypeDetails$Builder; +Lcom/android/server/pm/UserTypeDetails; +Lcom/android/server/pm/UserTypeFactory; +Lcom/android/server/pm/UserVisibilityMediator; +Lcom/android/server/pm/WatchedIntentFilter; +Lcom/android/server/pm/WatchedIntentResolver$1; +Lcom/android/server/pm/WatchedIntentResolver$2; +Lcom/android/server/pm/WatchedIntentResolver; +Lcom/android/server/pm/dex/ArtManagerService$ArtManagerInternalImpl; +Lcom/android/server/pm/dex/ArtManagerService; +Lcom/android/server/pm/dex/ArtStatsLogUtils$ArtStatsLogger; +Lcom/android/server/pm/dex/DexManager; +Lcom/android/server/pm/dex/DynamicCodeLogger; +Lcom/android/server/pm/dex/PackageDexUsage; +Lcom/android/server/pm/dex/PackageDynamicCodeLoading; +Lcom/android/server/pm/local/PackageManagerLocalImpl$BaseSnapshotImpl; Lcom/android/server/pm/local/PackageManagerLocalImpl$UnfilteredSnapshotImpl; Lcom/android/server/pm/local/PackageManagerLocalImpl; +Lcom/android/server/pm/parsing/PackageCacher; +Lcom/android/server/pm/parsing/PackageInfoUtils; +Lcom/android/server/pm/parsing/library/AndroidHidlUpdater; +Lcom/android/server/pm/parsing/library/AndroidNetIpSecIkeUpdater; +Lcom/android/server/pm/parsing/library/AndroidTestBaseUpdater; +Lcom/android/server/pm/parsing/library/ApexSharedLibraryUpdater; +Lcom/android/server/pm/parsing/library/ComGoogleAndroidMapsUpdater; +Lcom/android/server/pm/parsing/library/OrgApacheHttpLegacyUpdater; +Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility$AndroidTestRunnerSplitUpdater; +Lcom/android/server/pm/parsing/library/PackageBackwardCompatibility; +Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater; +Lcom/android/server/pm/parsing/pkg/AndroidPackageUtils; +Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$1; +Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$2; +Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$DelayingPackageManagerCache; +Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy$PackageManagerWrapper; +Lcom/android/server/pm/permission/DefaultPermissionGrantPolicy; +Lcom/android/server/pm/permission/LegacyPermission; +Lcom/android/server/pm/permission/LegacyPermissionDataProvider; +Lcom/android/server/pm/permission/LegacyPermissionManagerInternal; +Lcom/android/server/pm/permission/LegacyPermissionManagerService$Injector; +Lcom/android/server/pm/permission/LegacyPermissionManagerService$Internal; +Lcom/android/server/pm/permission/LegacyPermissionManagerService; +Lcom/android/server/pm/permission/LegacyPermissionSettings; +Lcom/android/server/pm/permission/LegacyPermissionState$UserState; +Lcom/android/server/pm/permission/LegacyPermissionState; +Lcom/android/server/pm/permission/PermissionAllowlist; +Lcom/android/server/pm/permission/PermissionManagerService$AttributionSourceRegistry; +Lcom/android/server/pm/permission/PermissionManagerService$PermissionCheckerService; +Lcom/android/server/pm/permission/PermissionManagerService$PermissionManagerServiceInternalImpl; +Lcom/android/server/pm/permission/PermissionManagerService; +Lcom/android/server/pm/permission/PermissionManagerServiceInterface; +Lcom/android/server/pm/permission/PermissionManagerServiceInternal; +Lcom/android/server/pm/permission/PermissionMigrationHelper; +Lcom/android/server/pm/permission/PermissionMigrationHelperImpl; +Lcom/android/server/pm/pkg/ArchiveState; +Lcom/android/server/pm/pkg/PackageState; +Lcom/android/server/pm/pkg/PackageStateInternal; +Lcom/android/server/pm/pkg/PackageStateUnserialized; +Lcom/android/server/pm/pkg/PackageStateUtils; +Lcom/android/server/pm/pkg/PackageUserState; +Lcom/android/server/pm/pkg/PackageUserStateDefault; +Lcom/android/server/pm/pkg/PackageUserStateImpl$1; +Lcom/android/server/pm/pkg/PackageUserStateImpl; +Lcom/android/server/pm/pkg/PackageUserStateInternal; +Lcom/android/server/pm/pkg/PackageUserStateUtils; +Lcom/android/server/pm/pkg/SELinuxUtil; +Lcom/android/server/pm/pkg/SharedLibrary; +Lcom/android/server/pm/pkg/SharedUserApi; +Lcom/android/server/pm/pkg/SuspendParams; +Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper$UserStateWriteWrapper; +Lcom/android/server/pm/pkg/mutate/PackageStateMutator$StateWriteWrapper; +Lcom/android/server/pm/pkg/mutate/PackageStateMutator; +Lcom/android/server/pm/pkg/mutate/PackageStateWrite; +Lcom/android/server/pm/pkg/mutate/PackageUserStateWrite; +Lcom/android/server/pm/resolution/ComponentResolver$$ExternalSyntheticLambda0; +Lcom/android/server/pm/resolution/ComponentResolver$1; Lcom/android/server/pm/resolution/ComponentResolver$ActivityIntentResolver; +Lcom/android/server/pm/resolution/ComponentResolver$MimeGroupsAwareIntentResolver; Lcom/android/server/pm/resolution/ComponentResolver$ProviderIntentResolver; Lcom/android/server/pm/resolution/ComponentResolver$ReceiverIntentResolver; Lcom/android/server/pm/resolution/ComponentResolver$ServiceIntentResolver; +Lcom/android/server/pm/resolution/ComponentResolver; +Lcom/android/server/pm/resolution/ComponentResolverApi; +Lcom/android/server/pm/resolution/ComponentResolverBase; +Lcom/android/server/pm/resolution/ComponentResolverLocked; +Lcom/android/server/pm/resolution/ComponentResolverSnapshot; +Lcom/android/server/pm/snapshot/PackageDataSnapshot; +Lcom/android/server/pm/verify/domain/DomainVerificationCollector$$ExternalSyntheticLambda0; +Lcom/android/server/pm/verify/domain/DomainVerificationCollector; +Lcom/android/server/pm/verify/domain/DomainVerificationDebug; +Lcom/android/server/pm/verify/domain/DomainVerificationEnforcer$Callback; +Lcom/android/server/pm/verify/domain/DomainVerificationEnforcer; +Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings$LegacyState; +Lcom/android/server/pm/verify/domain/DomainVerificationLegacySettings; +Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal$Connection; +Lcom/android/server/pm/verify/domain/DomainVerificationManagerInternal; +Lcom/android/server/pm/verify/domain/DomainVerificationManagerStub; +Lcom/android/server/pm/verify/domain/DomainVerificationPersistence$ReadResult; +Lcom/android/server/pm/verify/domain/DomainVerificationPersistence; +Lcom/android/server/pm/verify/domain/DomainVerificationService; +Lcom/android/server/pm/verify/domain/DomainVerificationSettings; +Lcom/android/server/pm/verify/domain/DomainVerificationShell$Callback; +Lcom/android/server/pm/verify/domain/DomainVerificationShell; +Lcom/android/server/pm/verify/domain/DomainVerificationUtils$$ExternalSyntheticLambda0; +Lcom/android/server/pm/verify/domain/DomainVerificationUtils; +Lcom/android/server/pm/verify/domain/models/DomainVerificationInternalUserState; +Lcom/android/server/pm/verify/domain/models/DomainVerificationPkgState; +Lcom/android/server/pm/verify/domain/models/DomainVerificationStateMap; +Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxy$BaseConnection; +Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxy; +Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyUnavailable; +Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyV1$Connection; +Lcom/android/server/pm/verify/domain/proxy/DomainVerificationProxyV2$Connection; +Lcom/android/server/policy/PermissionPolicyService$2; Lcom/android/server/policy/PermissionPolicyService$Internal; +Lcom/android/server/policy/PhoneWindowManager$5; Lcom/android/server/policy/PhoneWindowManager; +Lcom/android/server/policy/WindowManagerPolicy$DisplayContentInfo; +Lcom/android/server/policy/WindowManagerPolicy$WindowManagerFuncs; +Lcom/android/server/policy/WindowManagerPolicy$WindowState; +Lcom/android/server/power/AmbientDisplaySuppressionController$AmbientDisplaySuppressionChangedCallback; +Lcom/android/server/power/AmbientDisplaySuppressionController; +Lcom/android/server/power/AttentionDetector$1; +Lcom/android/server/power/AttentionDetector$AttentionCallbackInternalImpl; +Lcom/android/server/power/AttentionDetector; +Lcom/android/server/power/FaceDownDetector$$ExternalSyntheticLambda1; +Lcom/android/server/power/FaceDownDetector$ExponentialMovingAverage; +Lcom/android/server/power/FaceDownDetector$ScreenStateReceiver; +Lcom/android/server/power/FaceDownDetector; +Lcom/android/server/power/InattentiveSleepWarningController; +Lcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda1; +Lcom/android/server/power/LowPowerStandbyController$$ExternalSyntheticLambda2; +Lcom/android/server/power/LowPowerStandbyController$1; +Lcom/android/server/power/LowPowerStandbyController$2; +Lcom/android/server/power/LowPowerStandbyController$3; +Lcom/android/server/power/LowPowerStandbyController$Clock; +Lcom/android/server/power/LowPowerStandbyController$DeviceConfigWrapper; +Lcom/android/server/power/LowPowerStandbyController$LocalService; +Lcom/android/server/power/LowPowerStandbyController$LowPowerStandbyHandler; +Lcom/android/server/power/LowPowerStandbyController$PhoneCallServiceTracker; +Lcom/android/server/power/LowPowerStandbyController$RealClock; +Lcom/android/server/power/LowPowerStandbyController$SettingsObserver; +Lcom/android/server/power/LowPowerStandbyController$TempAllowlistChangeListener; +Lcom/android/server/power/LowPowerStandbyController; +Lcom/android/server/power/LowPowerStandbyControllerInternal; +Lcom/android/server/power/PowerGroup$PowerGroupListener; +Lcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda0; +Lcom/android/server/power/PowerManagerService$$ExternalSyntheticLambda1; Lcom/android/server/power/PowerManagerService$1; +Lcom/android/server/power/PowerManagerService$3; +Lcom/android/server/power/PowerManagerService$4; +Lcom/android/server/power/PowerManagerService$BatteryReceiver; +Lcom/android/server/power/PowerManagerService$BinderService; +Lcom/android/server/power/PowerManagerService$Clock; +Lcom/android/server/power/PowerManagerService$Constants; +Lcom/android/server/power/PowerManagerService$DockReceiver; +Lcom/android/server/power/PowerManagerService$DreamReceiver; +Lcom/android/server/power/PowerManagerService$Injector$$ExternalSyntheticLambda0; +Lcom/android/server/power/PowerManagerService$Injector$1; +Lcom/android/server/power/PowerManagerService$Injector$2; +Lcom/android/server/power/PowerManagerService$Injector$3; +Lcom/android/server/power/PowerManagerService$Injector; Lcom/android/server/power/PowerManagerService$LocalService; +Lcom/android/server/power/PowerManagerService$NativeWrapper; +Lcom/android/server/power/PowerManagerService$PermissionCheckerWrapper; +Lcom/android/server/power/PowerManagerService$PowerGroupWakefulnessChangeListener; +Lcom/android/server/power/PowerManagerService$PowerManagerHandlerCallback; +Lcom/android/server/power/PowerManagerService$PowerPropertiesWrapper; +Lcom/android/server/power/PowerManagerService$SettingsObserver; +Lcom/android/server/power/PowerManagerService$SuspendBlockerImpl; +Lcom/android/server/power/PowerManagerService$UserSwitchedReceiver; +Lcom/android/server/power/PowerManagerService; +Lcom/android/server/power/PowerManagerShellCommand; +Lcom/android/server/power/ScreenUndimDetector$InternalClock; +Lcom/android/server/power/ScreenUndimDetector; +Lcom/android/server/power/SuspendBlocker; +Lcom/android/server/power/SystemPropertiesWrapper; +Lcom/android/server/power/ThermalManagerService$1; +Lcom/android/server/power/ThermalManagerService$TemperatureWatcher; +Lcom/android/server/power/ThermalManagerService$ThermalHal10Wrapper; +Lcom/android/server/power/ThermalManagerService$ThermalHal11Wrapper; +Lcom/android/server/power/ThermalManagerService$ThermalHal20Wrapper; +Lcom/android/server/power/ThermalManagerService$ThermalHalAidlWrapper; +Lcom/android/server/power/ThermalManagerService$ThermalHalWrapper; +Lcom/android/server/power/ThermalManagerService$ThermalShellCommand; +Lcom/android/server/power/ThermalManagerService; +Lcom/android/server/power/batterysaver/BatterySaverController$1; +Lcom/android/server/power/batterysaver/BatterySaverController$MyHandler; +Lcom/android/server/power/batterysaver/BatterySaverController; +Lcom/android/server/power/batterysaver/BatterySaverPolicy$$ExternalSyntheticLambda1; +Lcom/android/server/power/batterysaver/BatterySaverPolicy$BatterySaverPolicyListener; +Lcom/android/server/power/batterysaver/BatterySaverPolicy$Policy; +Lcom/android/server/power/batterysaver/BatterySaverPolicy$PolicyBoolean; +Lcom/android/server/power/batterysaver/BatterySaverPolicy; +Lcom/android/server/power/batterysaver/BatterySaverStateMachine$$ExternalSyntheticLambda2; +Lcom/android/server/power/batterysaver/BatterySaverStateMachine$1; +Lcom/android/server/power/batterysaver/BatterySaverStateMachine; +Lcom/android/server/power/batterysaver/BatterySavingStats; +Lcom/android/server/power/feature/PowerManagerFlags$FlagState; +Lcom/android/server/power/feature/PowerManagerFlags; +Lcom/android/server/power/hint/HintManagerService$NativeWrapper; +Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda0; +Lcom/android/server/power/stats/BatteryExternalStatsWorker$$ExternalSyntheticLambda5; +Lcom/android/server/power/stats/BatteryExternalStatsWorker$1; +Lcom/android/server/power/stats/BatteryExternalStatsWorker$2; +Lcom/android/server/power/stats/BatteryExternalStatsWorker$Injector; +Lcom/android/server/power/stats/BatteryExternalStatsWorker; +Lcom/android/server/power/stats/BatteryStatsDumpHelperImpl; +Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda2; +Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda3; +Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda4; +Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda5; +Lcom/android/server/power/stats/BatteryStatsImpl$$ExternalSyntheticLambda6; Lcom/android/server/power/stats/BatteryStatsImpl$1; +Lcom/android/server/power/stats/BatteryStatsImpl$2; +Lcom/android/server/power/stats/BatteryStatsImpl$3; +Lcom/android/server/power/stats/BatteryStatsImpl$4; +Lcom/android/server/power/stats/BatteryStatsImpl$5; +Lcom/android/server/power/stats/BatteryStatsImpl$6; Lcom/android/server/power/stats/BatteryStatsImpl$BatchTimer; +Lcom/android/server/power/stats/BatteryStatsImpl$BatteryCallback; +Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig$Builder; +Lcom/android/server/power/stats/BatteryStatsImpl$BatteryStatsConfig; +Lcom/android/server/power/stats/BatteryStatsImpl$BinderCallStats; +Lcom/android/server/power/stats/BatteryStatsImpl$BluetoothActivityInfoCache; +Lcom/android/server/power/stats/BatteryStatsImpl$Constants; Lcom/android/server/power/stats/BatteryStatsImpl$ControllerActivityCounterImpl; Lcom/android/server/power/stats/BatteryStatsImpl$Counter; +Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats; Lcom/android/server/power/stats/BatteryStatsImpl$DualTimer; +Lcom/android/server/power/stats/BatteryStatsImpl$DurationTimer; +Lcom/android/server/power/stats/BatteryStatsImpl$EnergyStatsRetriever; +Lcom/android/server/power/stats/BatteryStatsImpl$ExternalStatsSync; +Lcom/android/server/power/stats/BatteryStatsImpl$FrameworkStatsLogger; +Lcom/android/server/power/stats/BatteryStatsImpl$HistoryStepDetailsCalculatorImpl; Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter; +Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounterArray; +Lcom/android/server/power/stats/BatteryStatsImpl$MyHandler; +Lcom/android/server/power/stats/BatteryStatsImpl$OverflowArrayMap; +Lcom/android/server/power/stats/BatteryStatsImpl$PlatformIdleStateCallback; +Lcom/android/server/power/stats/BatteryStatsImpl$PowerStatsCollectorInjector; +Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats; +Lcom/android/server/power/stats/BatteryStatsImpl$SamplingTimer; Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; +Lcom/android/server/power/stats/BatteryStatsImpl$TimeBase; +Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs; +Lcom/android/server/power/stats/BatteryStatsImpl$TimeInFreqMultiStateCounter; Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter; +Lcom/android/server/power/stats/BatteryStatsImpl$Timer; +Lcom/android/server/power/stats/BatteryStatsImpl$Uid$1; +Lcom/android/server/power/stats/BatteryStatsImpl$Uid$2; +Lcom/android/server/power/stats/BatteryStatsImpl$Uid$3; +Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg$Serv; Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Pkg; +Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Proc; Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Sensor; Lcom/android/server/power/stats/BatteryStatsImpl$Uid$Wakelock; Lcom/android/server/power/stats/BatteryStatsImpl$Uid; +Lcom/android/server/power/stats/BatteryStatsImpl$UserInfoProvider; +Lcom/android/server/power/stats/BatteryStatsImpl; +Lcom/android/server/power/stats/BatteryUsageStatsProvider; +Lcom/android/server/power/stats/BatteryUsageStatsSection$Reader; +Lcom/android/server/power/stats/BatteryUsageStatsSection; +Lcom/android/server/power/stats/BluetoothPowerCalculator; +Lcom/android/server/power/stats/BluetoothPowerStatsCollector$Injector; +Lcom/android/server/power/stats/BluetoothPowerStatsCollector; +Lcom/android/server/power/stats/CameraPowerStatsCollector; +Lcom/android/server/power/stats/CpuPowerCalculator; +Lcom/android/server/power/stats/CpuPowerStatsCollector$Injector; +Lcom/android/server/power/stats/CpuPowerStatsCollector$KernelCpuStatsReader; +Lcom/android/server/power/stats/CpuPowerStatsCollector; +Lcom/android/server/power/stats/CustomEnergyConsumerPowerStatsCollector; +Lcom/android/server/power/stats/EnergyConsumerPowerStatsCollector$Injector; +Lcom/android/server/power/stats/EnergyConsumerPowerStatsCollector; +Lcom/android/server/power/stats/EnergyConsumerSnapshot; +Lcom/android/server/power/stats/GnssPowerStatsCollector; +Lcom/android/server/power/stats/KernelWakelockReader; +Lcom/android/server/power/stats/KernelWakelockStats$Entry; +Lcom/android/server/power/stats/KernelWakelockStats; +Lcom/android/server/power/stats/MobileRadioPowerCalculator; +Lcom/android/server/power/stats/MobileRadioPowerStatsCollector$Injector; +Lcom/android/server/power/stats/MobileRadioPowerStatsCollector$Observer; +Lcom/android/server/power/stats/MobileRadioPowerStatsCollector; +Lcom/android/server/power/stats/PowerAttributor; +Lcom/android/server/power/stats/PowerCalculator; +Lcom/android/server/power/stats/PowerStatsCollector$$ExternalSyntheticLambda0; +Lcom/android/server/power/stats/PowerStatsCollector$1; +Lcom/android/server/power/stats/PowerStatsCollector; +Lcom/android/server/power/stats/PowerStatsScheduler$AlarmScheduler; +Lcom/android/server/power/stats/PowerStatsScheduler; +Lcom/android/server/power/stats/PowerStatsSpan$Section; +Lcom/android/server/power/stats/PowerStatsSpan$SectionReader; +Lcom/android/server/power/stats/PowerStatsStore$$ExternalSyntheticLambda0; +Lcom/android/server/power/stats/PowerStatsStore; +Lcom/android/server/power/stats/PowerStatsUidResolver$Listener; +Lcom/android/server/power/stats/PowerStatsUidResolver; +Lcom/android/server/power/stats/ScreenPowerStatsCollector$Injector; +Lcom/android/server/power/stats/ScreenPowerStatsCollector$ScreenUsageTimeRetriever; +Lcom/android/server/power/stats/ScreenPowerStatsCollector; +Lcom/android/server/power/stats/WifiPowerCalculator; +Lcom/android/server/power/stats/WifiPowerStatsCollector$Injector; +Lcom/android/server/power/stats/WifiPowerStatsCollector$Observer; +Lcom/android/server/power/stats/WifiPowerStatsCollector$WifiScanTimes; +Lcom/android/server/power/stats/WifiPowerStatsCollector$WifiStatsRetriever; +Lcom/android/server/power/stats/WifiPowerStatsCollector; +Lcom/android/server/power/stats/format/BinaryStatePowerStatsLayout; +Lcom/android/server/power/stats/format/BluetoothPowerStatsLayout; +Lcom/android/server/power/stats/format/CpuPowerStatsLayout; +Lcom/android/server/power/stats/format/EnergyConsumerPowerStatsLayout; +Lcom/android/server/power/stats/format/GnssPowerStatsLayout; +Lcom/android/server/power/stats/format/MobileRadioPowerStatsLayout; +Lcom/android/server/power/stats/format/PowerStatsLayout; +Lcom/android/server/power/stats/format/ScreenPowerStatsLayout; +Lcom/android/server/power/stats/format/WifiPowerStatsLayout; +Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$1; +Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig$PowerComponent; +Lcom/android/server/power/stats/processor/AggregatedPowerStatsConfig; +Lcom/android/server/power/stats/processor/AggregatedPowerStatsSection$Reader; +Lcom/android/server/power/stats/processor/AggregatedPowerStatsSection; +Lcom/android/server/power/stats/processor/AudioPowerStatsProcessor; +Lcom/android/server/power/stats/processor/BinaryStatePowerStatsProcessor; +Lcom/android/server/power/stats/processor/BluetoothPowerStatsProcessor; +Lcom/android/server/power/stats/processor/CameraPowerStatsProcessor; +Lcom/android/server/power/stats/processor/CpuPowerStatsProcessor; +Lcom/android/server/power/stats/processor/FlashlightPowerStatsProcessor; +Lcom/android/server/power/stats/processor/GnssPowerStatsProcessor; +Lcom/android/server/power/stats/processor/MobileRadioPowerStatsProcessor; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda0; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda10; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda11; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda12; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda13; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda1; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda2; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda3; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda4; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda5; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda6; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda7; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda8; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor$$ExternalSyntheticLambda9; +Lcom/android/server/power/stats/processor/MultiStatePowerAttributor; +Lcom/android/server/power/stats/processor/PowerStatsAggregator; +Lcom/android/server/power/stats/processor/PowerStatsExporter; +Lcom/android/server/power/stats/processor/PowerStatsProcessor; +Lcom/android/server/power/stats/processor/ScreenPowerStatsProcessor; +Lcom/android/server/power/stats/processor/SensorPowerStatsProcessor; +Lcom/android/server/power/stats/processor/VideoPowerStatsProcessor; +Lcom/android/server/power/stats/processor/WifiPowerStatsProcessor; +Lcom/android/server/power/stats/wakeups/CpuWakeupStats$$ExternalSyntheticLambda0; +Lcom/android/server/power/stats/wakeups/CpuWakeupStats$Config; +Lcom/android/server/power/stats/wakeups/CpuWakeupStats$WakingActivityHistory; +Lcom/android/server/power/stats/wakeups/CpuWakeupStats; +Lcom/android/server/power/stats/wakeups/IrqDeviceMap; +Lcom/android/server/powerstats/PowerStatsHALWrapper$IPowerStatsHALWrapper; +Lcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL10WrapperImpl; +Lcom/android/server/powerstats/PowerStatsHALWrapper$PowerStatsHAL20WrapperImpl; +Lcom/android/server/powerstats/PowerStatsHALWrapper$VintfHalCache; +Lcom/android/server/powerstats/PowerStatsHALWrapper; +Lcom/android/server/powerstats/PowerStatsService$1; +Lcom/android/server/powerstats/PowerStatsService$DeviceConfigListener; +Lcom/android/server/powerstats/PowerStatsService$Injector; Lcom/android/server/powerstats/PowerStatsService$LocalService; +Lcom/android/server/powerstats/PowerStatsService; +Lcom/android/server/recoverysystem/RecoverySystemService$Injector; +Lcom/android/server/recoverysystem/RecoverySystemService$Lifecycle; +Lcom/android/server/recoverysystem/RecoverySystemService$PreferencesManager; +Lcom/android/server/recoverysystem/RecoverySystemService; +Lcom/android/server/recoverysystem/RecoverySystemShellCommand; +Lcom/android/server/resources/ResourcesManagerService; +Lcom/android/server/security/FileIntegrityService$BinderService; +Lcom/android/server/security/FileIntegrityService$FileIntegrityServiceShellCommand; +Lcom/android/server/security/FileIntegrityService; +Lcom/android/server/sensorprivacy/SensorPrivacyService; +Lcom/android/server/sensors/SensorManagerInternal$ProximityActiveListener; +Lcom/android/server/sensors/SensorManagerInternal$RuntimeSensorCallback; +Lcom/android/server/sensors/SensorService; +Lcom/android/server/soundtrigger_middleware/AudioSessionProviderImpl; +Lcom/android/server/soundtrigger_middleware/ExternalCaptureStateTracker; +Lcom/android/server/soundtrigger_middleware/ICaptureStateNotifier; +Lcom/android/server/soundtrigger_middleware/SoundTriggerMiddlewareImpl$AudioSessionProvider; Lcom/android/server/stats/pull/StatsPullAtomService$StatsPullAtomServiceInternalImpl; +Lcom/android/server/stats/pull/StatsPullAtomService; Lcom/android/server/statusbar/StatusBarManagerService$1; +Lcom/android/server/storage/AppFuseBridge; +Lcom/android/server/tv/TvInputHal; +Lcom/android/server/tv/UinputBridge; +Lcom/android/server/uri/UriGrantsManagerInternal; +Lcom/android/server/uri/UriGrantsManagerService$1; +Lcom/android/server/uri/UriGrantsManagerService$H; +Lcom/android/server/uri/UriGrantsManagerService$Lifecycle; Lcom/android/server/uri/UriGrantsManagerService$LocalService; +Lcom/android/server/uri/UriGrantsManagerService; +Lcom/android/server/uri/UriMetricsHelper$PersistentUriGrantsProvider; +Lcom/android/server/uri/UriMetricsHelper; Lcom/android/server/usage/AppStandbyController; Lcom/android/server/usage/UsageStatsService$LocalService; +Lcom/android/server/usb/UsbAlsaJackDetector; +Lcom/android/server/usb/UsbAlsaMidiDevice$2; +Lcom/android/server/usb/UsbAlsaMidiDevice$3; +Lcom/android/server/usb/UsbAlsaMidiDevice$InputReceiverProxy; +Lcom/android/server/usb/UsbAlsaMidiDevice; +Lcom/android/server/usb/UsbDeviceManager$1; +Lcom/android/server/usb/UsbDeviceManager$2; +Lcom/android/server/usb/UsbDeviceManager$3; +Lcom/android/server/usb/UsbDeviceManager$4; +Lcom/android/server/usb/UsbDeviceManager$UsbHandler; +Lcom/android/server/usb/UsbDeviceManager$UsbHandlerHal; +Lcom/android/server/usb/UsbDeviceManager$UsbHandlerLegacy; +Lcom/android/server/usb/UsbDeviceManager$UsbUEventObserver; Lcom/android/server/usb/UsbDeviceManager; +Lcom/android/server/usb/UsbHostManager; +Lcom/android/server/usb/descriptors/UsbDescriptor; +Lcom/android/server/usb/descriptors/UsbInterfaceDescriptor; +Lcom/android/server/utils/AnrTimer$1; +Lcom/android/server/utils/AnrTimer$Args; +Lcom/android/server/utils/AnrTimer$Error; +Lcom/android/server/utils/AnrTimer$FeatureDisabled; +Lcom/android/server/utils/AnrTimer$FeatureEnabled; +Lcom/android/server/utils/AnrTimer$FeatureSwitch; +Lcom/android/server/utils/AnrTimer$Injector; +Lcom/android/server/utils/AnrTimer; +Lcom/android/server/utils/FoldSettingProvider; +Lcom/android/server/utils/PriorityDump$PriorityDumper; +Lcom/android/server/utils/Slogf; +Lcom/android/server/utils/Snappable; +Lcom/android/server/utils/SnapshotCache$Auto; +Lcom/android/server/utils/SnapshotCache$Sealed; +Lcom/android/server/utils/SnapshotCache$Statistics; +Lcom/android/server/utils/SnapshotCache; +Lcom/android/server/utils/Snapshots; +Lcom/android/server/utils/TimingsTraceAndSlog; +Lcom/android/server/utils/UserSettingDeviceConfigMediator$SettingsOverridesIndividualMediator; +Lcom/android/server/utils/UserSettingDeviceConfigMediator; +Lcom/android/server/utils/Watchable; +Lcom/android/server/utils/WatchableImpl; +Lcom/android/server/utils/Watched; +Lcom/android/server/utils/WatchedArrayList$1; +Lcom/android/server/utils/WatchedArrayList; +Lcom/android/server/utils/WatchedArrayMap$1; +Lcom/android/server/utils/WatchedArrayMap; +Lcom/android/server/utils/WatchedArraySet$1; +Lcom/android/server/utils/WatchedArraySet; +Lcom/android/server/utils/WatchedLongSparseArray$1; +Lcom/android/server/utils/WatchedLongSparseArray; +Lcom/android/server/utils/WatchedSparseArray$1; +Lcom/android/server/utils/WatchedSparseArray; +Lcom/android/server/utils/WatchedSparseBooleanArray; +Lcom/android/server/utils/WatchedSparseBooleanMatrix; +Lcom/android/server/utils/WatchedSparseIntArray; +Lcom/android/server/utils/WatchedSparseSetArray; +Lcom/android/server/utils/Watcher; +Lcom/android/server/vibrator/VibratorController$NativeWrapper; +Lcom/android/server/vibrator/VibratorController$OnVibrationCompleteListener; +Lcom/android/server/vibrator/VibratorManagerService$OnSyncedVibrationCompleteListener; +Lcom/android/server/vibrator/VibratorManagerService; +Lcom/android/server/vr/EnabledComponentsObserver$EnabledComponentChangeListener; +Lcom/android/server/vr/VrManagerService; +Lcom/android/server/wallpaper/WallpaperManagerService$$ExternalSyntheticLambda5; +Lcom/android/server/wm/AbsAppSnapshotController; +Lcom/android/server/wm/ActionChain$Tracker; +Lcom/android/server/wm/ActivityClientController; +Lcom/android/server/wm/ActivityMetricsLaunchObserver; +Lcom/android/server/wm/ActivityMetricsLaunchObserverRegistry; +Lcom/android/server/wm/ActivityMetricsLogger; +Lcom/android/server/wm/ActivityRecord; +Lcom/android/server/wm/ActivityStartController; +Lcom/android/server/wm/ActivityStartInterceptor; +Lcom/android/server/wm/ActivityStarter$DefaultFactory; +Lcom/android/server/wm/ActivityStarter$Factory; +Lcom/android/server/wm/ActivityTaskManagerInternal$ScreenObserver; +Lcom/android/server/wm/ActivityTaskManagerInternal; +Lcom/android/server/wm/ActivityTaskManagerService$1; +Lcom/android/server/wm/ActivityTaskManagerService$H; +Lcom/android/server/wm/ActivityTaskManagerService$Lifecycle; Lcom/android/server/wm/ActivityTaskManagerService$LocalService; +Lcom/android/server/wm/ActivityTaskManagerService$SleepTokenAcquirer; +Lcom/android/server/wm/ActivityTaskManagerService$UiHandler; +Lcom/android/server/wm/ActivityTaskManagerService$UpdateConfigurationResult; +Lcom/android/server/wm/ActivityTaskManagerService; +Lcom/android/server/wm/ActivityTaskSupervisor$ActivityTaskSupervisorHandler; +Lcom/android/server/wm/ActivityTaskSupervisor$OpaqueActivityHelper; +Lcom/android/server/wm/ActivityTaskSupervisor$TaskInfoHelper; +Lcom/android/server/wm/ActivityTaskSupervisor; +Lcom/android/server/wm/AppTaskImpl; +Lcom/android/server/wm/AppWarnings$BaseDialog; +Lcom/android/server/wm/AppWarnings$UiHandler; +Lcom/android/server/wm/AppWarnings$WriteConfigTask; +Lcom/android/server/wm/AppWarnings; +Lcom/android/server/wm/BLASTSyncEngine$TransactionReadyListener; +Lcom/android/server/wm/BackNavigationController$NavigationMonitor; +Lcom/android/server/wm/BackNavigationController; +Lcom/android/server/wm/BackgroundActivityStartController$FinishedActivityEntry; +Lcom/android/server/wm/BackgroundActivityStartController; +Lcom/android/server/wm/BackgroundLaunchProcessController$BalCheckConfiguration; +Lcom/android/server/wm/ClientLifecycleManager; +Lcom/android/server/wm/CompatModePackages$CompatHandler; +Lcom/android/server/wm/CompatModePackages; +Lcom/android/server/wm/ConfigurationContainer; +Lcom/android/server/wm/ConfigurationContainerListener; +Lcom/android/server/wm/DeprecatedAbiDialog; +Lcom/android/server/wm/DeprecatedTargetSdkVersionDialog; +Lcom/android/server/wm/DesktopModeLaunchParamsModifier; +Lcom/android/server/wm/DisplayArea$Dimmable; +Lcom/android/server/wm/DisplayArea$Tokens; +Lcom/android/server/wm/DisplayArea; +Lcom/android/server/wm/DisplayAreaOrganizerController; +Lcom/android/server/wm/DisplayContent; +Lcom/android/server/wm/FactoryErrorDialog; +Lcom/android/server/wm/InputTarget; +Lcom/android/server/wm/InsetsControlTarget; +Lcom/android/server/wm/InsetsTarget; +Lcom/android/server/wm/KeyguardController$$ExternalSyntheticLambda0; +Lcom/android/server/wm/KeyguardController$$ExternalSyntheticLambda1; +Lcom/android/server/wm/KeyguardController; +Lcom/android/server/wm/LaunchObserverRegistryImpl; +Lcom/android/server/wm/LaunchParamsController$LaunchParams; +Lcom/android/server/wm/LaunchParamsController$LaunchParamsModifier; +Lcom/android/server/wm/LaunchParamsController; +Lcom/android/server/wm/LaunchParamsPersister$$ExternalSyntheticLambda3; +Lcom/android/server/wm/LaunchParamsPersister; +Lcom/android/server/wm/LockTaskController$LockTaskToken; +Lcom/android/server/wm/LockTaskController; +Lcom/android/server/wm/MirrorActiveUids; +Lcom/android/server/wm/PackageConfigPersister; +Lcom/android/server/wm/PendingRemoteAnimationRegistry; +Lcom/android/server/wm/PersisterQueue$$ExternalSyntheticLambda0; +Lcom/android/server/wm/PersisterQueue$LazyTaskWriterThread; +Lcom/android/server/wm/PersisterQueue$Listener; +Lcom/android/server/wm/PersisterQueue$WriteQueueItem; +Lcom/android/server/wm/PersisterQueue; +Lcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda0; +Lcom/android/server/wm/RecentTasks$$ExternalSyntheticLambda1; +Lcom/android/server/wm/RecentTasks$1; +Lcom/android/server/wm/RecentTasks$Callbacks; +Lcom/android/server/wm/RecentTasks; +Lcom/android/server/wm/RootDisplayArea; +Lcom/android/server/wm/RootWindowContainer; +Lcom/android/server/wm/RunningTasks; +Lcom/android/server/wm/SurfaceAnimationThread; +Lcom/android/server/wm/SurfaceAnimator$Animatable; +Lcom/android/server/wm/SurfaceFreezer$Freezable; +Lcom/android/server/wm/Task; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda0; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda10; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda11; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda12; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda13; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda14; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda15; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda16; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda17; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda18; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda19; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda1; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda20; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda21; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda22; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda23; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda24; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda25; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda2; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda3; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda4; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda5; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda6; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda7; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda8; +Lcom/android/server/wm/TaskChangeNotificationController$$ExternalSyntheticLambda9; +Lcom/android/server/wm/TaskChangeNotificationController$MainHandler; +Lcom/android/server/wm/TaskChangeNotificationController$TaskStackConsumer; +Lcom/android/server/wm/TaskChangeNotificationController; +Lcom/android/server/wm/TaskDisplayArea; +Lcom/android/server/wm/TaskFpsCallbackController; +Lcom/android/server/wm/TaskFragment; +Lcom/android/server/wm/TaskFragmentOrganizerController; +Lcom/android/server/wm/TaskLaunchParamsModifier; +Lcom/android/server/wm/TaskOrganizerController; +Lcom/android/server/wm/TaskPersister; +Lcom/android/server/wm/TaskSnapshotController; +Lcom/android/server/wm/Transition$ReadyCondition; +Lcom/android/server/wm/Transition; +Lcom/android/server/wm/TransitionController$Lock; +Lcom/android/server/wm/TransitionController$RemotePlayer; +Lcom/android/server/wm/TransitionController$TransitionMetricsReporter; +Lcom/android/server/wm/TransitionController; +Lcom/android/server/wm/UnsupportedCompileSdkDialog; +Lcom/android/server/wm/UnsupportedDisplaySizeDialog; +Lcom/android/server/wm/VisibleActivityProcessTracker; +Lcom/android/server/wm/VrController$1; +Lcom/android/server/wm/VrController; +Lcom/android/server/wm/WallpaperWindowToken; +Lcom/android/server/wm/WindowContainer; +Lcom/android/server/wm/WindowManagerGlobalLock; +Lcom/android/server/wm/WindowManagerInternal$AppTransitionListener; +Lcom/android/server/wm/WindowManagerService$2; +Lcom/android/server/wm/WindowManagerService$4; +Lcom/android/server/wm/WindowManagerService$8; +Lcom/android/server/wm/WindowManagerService$AppFreezeListener; +Lcom/android/server/wm/WindowManagerService$H; Lcom/android/server/wm/WindowManagerService$LocalService; Lcom/android/server/wm/WindowManagerService; +Lcom/android/server/wm/WindowManagerShellCommand; +Lcom/android/server/wm/WindowManagerThreadPriorityBooster; +Lcom/android/server/wm/WindowOrganizerController; +Lcom/android/server/wm/WindowProcessController; +Lcom/android/server/wm/WindowProcessControllerMap; +Lcom/android/server/wm/WindowProcessListener; Lcom/android/server/wm/WindowState; +Lcom/android/server/wm/WindowToken; +Lcom/android/server/wm/utils/DisplayInfoOverrides$$ExternalSyntheticLambda0; +Lcom/android/server/wm/utils/DisplayInfoOverrides$DisplayInfoFieldsUpdater; +Lcom/android/server/wm/utils/DisplayInfoOverrides; +[Landroid/hardware/power/stats/Channel; +[Landroid/hardware/power/stats/EnergyConsumer; +[Lcom/android/server/am/ActivityManagerService$ProcessChangeItem; +[Lcom/android/server/am/BroadcastProcessQueue; +[Lcom/android/server/am/BroadcastRecord; +[Lcom/android/server/am/CachedAppOptimizer$CancelCompactReason; +[Lcom/android/server/am/CachedAppOptimizer$CompactSource; +[Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNode; +[Lcom/android/server/am/OomAdjusterModernImpl$ProcessRecordNodes$LinkedProcessRecordList; +[Lcom/android/server/am/UidObserverController$ChangeRecord; +[Lcom/android/server/display/config/AutoBrightnessModeName; +[Lcom/android/server/display/config/AutoBrightnessSettingName; +[Lcom/android/server/display/config/PredefinedBrightnessLimitNames; +[Lcom/android/server/display/config/ThermalStatus; +[Lcom/android/server/firewall/FilterFactory; +[Lcom/android/server/firewall/IntentFirewall$FirewallIntentResolver; +[Lcom/android/server/input/TouchpadFingerState; +[Lcom/android/server/lights/LightsService$LightImpl; +[Lcom/android/server/om/OverlayActorEnforcer$ActorState; +[Lcom/android/server/pm/DefaultCrossProfileIntentFilter; +[Lcom/android/server/pm/PreferredActivity; +[Lcom/android/server/pm/SnapshotStatistics$Stats; +[Lcom/android/server/pm/parsing/library/PackageSharedLibraryUpdater; +[Lcom/android/server/power/stats/BatteryStatsImpl$Counter; +[Lcom/android/server/power/stats/BatteryStatsImpl$DisplayBatteryStats; +[Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter; +[Lcom/android/server/power/stats/BatteryStatsImpl$RadioAccessTechnologyBatteryStats; +[Lcom/android/server/power/stats/BatteryStatsImpl$StopwatchTimer; +[Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs; +[Lcom/android/server/power/stats/BatteryStatsImpl$TimeMultiStateCounter; +[Lcom/android/server/utils/AnrTimer$Error; +[Lcom/android/server/wm/ActivityRecord; +[[Lcom/android/server/power/stats/BatteryStatsImpl$LongSamplingCounter; +[[Lcom/android/server/power/stats/BatteryStatsImpl$TimeBaseObs; -- GitLab From 359075db1568990e3a22ea7265317bb1f4395333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Yavero=C4=9Flu?= Date: Thu, 17 Oct 2024 09:48:49 +0000 Subject: [PATCH 108/459] Remove the updateRuleSet actions to stop writing the rules into AOSP component when the method is called. Change-Id: Icf8b79b2f5b9265b66531f8eec7c91ec8b4181b5 --- .../AppIntegrityManagerServiceImpl.java | 61 +++--------- .../AppIntegrityManagerServiceImplTest.java | 92 ------------------- 2 files changed, 11 insertions(+), 142 deletions(-) diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index d1576c5cca4f..509fa3e1c9ba 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -127,42 +127,18 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { @BinderThread public void updateRuleSet( String version, ParceledListSlice rules, IntentSender statusReceiver) { - String ruleProvider = getCallerPackageNameOrThrow(Binder.getCallingUid()); - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i(TAG, String.format("Calling rule provider name is: %s.", ruleProvider)); + Intent intent = new Intent(); + intent.putExtra(EXTRA_STATUS, STATUS_SUCCESS); + try { + statusReceiver.sendIntent( + mContext, + /* code= */ 0, + intent, + /* onFinished= */ null, + /* handler= */ null); + } catch (Exception e) { + Slog.e(TAG, "Error sending status feedback.", e); } - - mHandler.post( - () -> { - boolean success = true; - try { - mIntegrityFileManager.writeRules(version, ruleProvider, rules.getList()); - } catch (Exception e) { - Slog.e(TAG, "Error writing rules.", e); - success = false; - } - - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i( - TAG, - String.format( - "Successfully pushed rule set to version '%s' from '%s'", - version, ruleProvider)); - } - - Intent intent = new Intent(); - intent.putExtra(EXTRA_STATUS, success ? STATUS_SUCCESS : STATUS_FAILURE); - try { - statusReceiver.sendIntent( - mContext, - /* code= */ 0, - intent, - /* onFinished= */ null, - /* handler= */ null); - } catch (Exception e) { - Slog.e(TAG, "Error sending status feedback.", e); - } - }); } @Override @@ -209,21 +185,6 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { verificationId, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW); } - /** We will use the SHA256 digest of a package name if it is more than 32 bytes long. */ - private String getPackageNameNormalized(String packageName) { - if (packageName.length() <= 32) { - return packageName; - } - - try { - MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); - byte[] hashBytes = messageDigest.digest(packageName.getBytes(StandardCharsets.UTF_8)); - return getHexDigest(hashBytes); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("SHA-256 algorithm not found", e); - } - } - private String getCallerPackageNameOrThrow(int callingUid) { String callerPackageName = getCallingRulePusherPackageName(callingUid); if (callerPackageName == null) { diff --git a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java index 9c6412b81b34..a2e6d4c7bfed 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java @@ -190,98 +190,6 @@ public class AppIntegrityManagerServiceImplTest { mTestApkSourceStamp.delete(); } - @Test - public void updateRuleSet_notAuthorized() throws Exception { - makeUsSystemApp(); - Rule rule = - new Rule( - new AtomicFormula.BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true), - Rule.DENY); - TestUtils.assertExpectException( - SecurityException.class, - "Only system packages specified in config_integrityRuleProviderPackages are" - + " allowed to call this method.", - () -> - mService.updateRuleSet( - VERSION, - new ParceledListSlice<>(Arrays.asList(rule)), - /* statusReceiver= */ null)); - } - - @Test - public void updateRuleSet_notSystemApp() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(false); - Rule rule = - new Rule( - new AtomicFormula.BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true), - Rule.DENY); - TestUtils.assertExpectException( - SecurityException.class, - "Only system packages specified in config_integrityRuleProviderPackages are" - + " allowed to call this method.", - () -> - mService.updateRuleSet( - VERSION, - new ParceledListSlice<>(Arrays.asList(rule)), - /* statusReceiver= */ null)); - } - - @Test - public void updateRuleSet_authorized() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - Rule rule = - new Rule( - new AtomicFormula.BooleanAtomicFormula(AtomicFormula.PRE_INSTALLED, true), - Rule.DENY); - - // no SecurityException - mService.updateRuleSet( - VERSION, new ParceledListSlice<>(Arrays.asList(rule)), mock(IntentSender.class)); - } - - @Test - public void updateRuleSet_correctMethodCall() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - IntentSender mockReceiver = mock(IntentSender.class); - List rules = - Arrays.asList( - new Rule( - IntegrityFormula.Application.packageNameEquals(PACKAGE_NAME), - Rule.DENY)); - - mService.updateRuleSet(VERSION, new ParceledListSlice<>(rules), mockReceiver); - runJobInHandler(); - - verify(mIntegrityFileManager).writeRules(VERSION, TEST_FRAMEWORK_PACKAGE, rules); - ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mockReceiver).sendIntent(any(), anyInt(), intentCaptor.capture(), any(), any()); - assertEquals(STATUS_SUCCESS, intentCaptor.getValue().getIntExtra(EXTRA_STATUS, -1)); - } - - @Test - public void updateRuleSet_fail() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - doThrow(new IOException()).when(mIntegrityFileManager).writeRules(any(), any(), any()); - IntentSender mockReceiver = mock(IntentSender.class); - List rules = - Arrays.asList( - new Rule( - IntegrityFormula.Application.packageNameEquals(PACKAGE_NAME), - Rule.DENY)); - - mService.updateRuleSet(VERSION, new ParceledListSlice<>(rules), mockReceiver); - runJobInHandler(); - - verify(mIntegrityFileManager).writeRules(VERSION, TEST_FRAMEWORK_PACKAGE, rules); - ArgumentCaptor intentCaptor = ArgumentCaptor.forClass(Intent.class); - verify(mockReceiver).sendIntent(any(), anyInt(), intentCaptor.capture(), any(), any()); - assertEquals(STATUS_FAILURE, intentCaptor.getValue().getIntExtra(EXTRA_STATUS, -1)); - } - @Test public void broadcastReceiverRegistration() throws Exception { allowlistUsAsRuleProvider(); -- GitLab From 4a8f23df5574a594796f01f2f8ac0d50735a1aec Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Fri, 18 Oct 2024 16:51:05 +0800 Subject: [PATCH 109/459] Fix unit tests if universal_resizable_by_default is enabled Currently WmTests declares target sdk 28. So if the test ActivityRecord is assigned with the real WmTests package name, it can adopt the legacy behavior by default. For the tests that need to use mocked package names, mock its application info directly. Bug: 357141415 Flag: com.android.window.flags.universal_resizable_by_default Test: DisplayRotationCompatPolicyTests ActivityRecordTests#testSetOrientation_restrictedByTargetSdk TransparentPolicyTest# \ testTranslucentActivitiesDontGoInSizeCompatMode Change-Id: Ic7a644f8739899f8a0578fca9878bf40940438ec --- .../server/wm/ActivityRecordTests.java | 15 +++++++----- .../server/wm/AppCompatActivityRobot.java | 2 ++ .../server/wm/DisplayContentTests.java | 3 ++- .../wm/DisplayRotationCompatPolicyTests.java | 6 +++++ .../android/server/wm/SizeCompatTests.java | 7 +----- .../android/server/wm/WindowTestsBase.java | 23 +++++++++++++++---- 6 files changed, 39 insertions(+), 17 deletions(-) diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java index 577b02a4ff7a..084e2f464069 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRecordTests.java @@ -139,7 +139,6 @@ import android.os.PersistableBundle; import android.os.Process; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; -import android.platform.test.annotations.RequiresFlagsEnabled; import android.provider.DeviceConfig; import android.util.MutableBoolean; import android.view.DisplayInfo; @@ -2662,8 +2661,11 @@ public class ActivityRecordTests extends WindowTestsBase { } @Test - @RequiresFlagsEnabled(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT) public void testSetOrientation_restrictedByTargetSdk() { + mSetFlagsRule.enableFlags(Flags.FLAG_UNIVERSAL_RESIZABLE_BY_DEFAULT); + mDisplayContent.setIgnoreOrientationRequest(true); + makeDisplayLargeScreen(mDisplayContent); + assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_SOCIAL, false); assertSetOrientation(Build.VERSION_CODES.CUR_DEVELOPMENT, CATEGORY_GAME, true); @@ -2673,12 +2675,13 @@ public class ActivityRecordTests extends WindowTestsBase { } private void assertSetOrientation(int targetSdk, int category, boolean expectRotate) { - final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); - activity.mTargetSdk = targetSdk; + final String packageName = targetSdk <= Build.VERSION_CODES.VANILLA_ICE_CREAM + ? mContext.getPackageName() // WmTests uses legacy sdk. + : null; // Simulate CUR_DEVELOPMENT by invalid package (see PlatformCompat). + final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true) + .setComponent(getUniqueComponentName(packageName)).build(); activity.info.applicationInfo.category = category; - activity.setVisible(true); - // Assert orientation is unspecified to start. assertEquals(SCREEN_ORIENTATION_UNSPECIFIED, activity.getOrientation()); diff --git a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java index c8a35598479f..08963f1c7647 100644 --- a/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java +++ b/services/tests/wmtests/src/com/android/server/wm/AppCompatActivityRobot.java @@ -307,6 +307,8 @@ class AppCompatActivityRobot { void createNewTaskWithBaseActivity() { final Task newTask = new WindowTestsBase.TaskBuilder(mSupervisor) .setCreateActivity(true) + // Respect "@ChangeId" according to test package's target sdk. + .setPackage(mAtm.mContext.getPackageName()) .setDisplay(mDisplayContent).build(); mTaskStack.push(newTask); pushActivity(newTask.getTopNonFinishingActivity()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java index 5c0d424f4f42..2bebcc30c872 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayContentTests.java @@ -1081,7 +1081,8 @@ public class DisplayContentTests extends WindowTestsBase { final DisplayRotation dr = dc.getDisplayRotation(); spyOn(dr); doReturn(false).when(dr).useDefaultSettingsProvider(); - final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true).build(); + final ActivityRecord app = new ActivityBuilder(mAtm).setCreateTask(true) + .setComponent(getUniqueComponentName(mContext.getPackageName())).build(); app.setOrientation(SCREEN_ORIENTATION_LANDSCAPE, app); assertFalse(dc.getRotationReversionController().isAnyOverrideActive()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java index 35c9e3fb3aaf..f4fa12ea361d 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java @@ -51,6 +51,7 @@ import static org.mockito.Mockito.times; import android.app.servertransaction.RefreshCallbackItem; import android.app.servertransaction.ResumeActivityItem; import android.content.ComponentName; +import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.ScreenOrientation; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; @@ -592,6 +593,11 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase { .setTask(mTask) .build(); + spyOn(mActivity.info.applicationInfo); + // Disable for camera compat. + doReturn(false).when(mActivity.info.applicationInfo).isChangeEnabled( + ActivityInfo.UNIVERSAL_RESIZABLE_BY_DEFAULT); + spyOn(mActivity.mAtmService.getLifecycleManager()); spyOn(mActivity.mAppCompatController.getAppCompatCameraOverrides()); diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index c30f70ee2903..f503ef7127c0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -4827,12 +4827,7 @@ public class SizeCompatTests extends WindowTestsBase { assertFalse(mActivity.isUniversalResizeable()); mDisplayContent.setIgnoreOrientationRequest(true); - final int swDp = mDisplayContent.getConfiguration().smallestScreenWidthDp; - if (swDp < WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP) { - final int height = 100 + (int) (mDisplayContent.getDisplayMetrics().density - * WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP); - resizeDisplay(mDisplayContent, 100 + height, height); - } + makeDisplayLargeScreen(mDisplayContent); assertTrue(mActivity.isUniversalResizeable()); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java index a215c0a80b46..757c358f51d0 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowTestsBase.java @@ -1123,6 +1123,15 @@ public class WindowTestsBase extends SystemServiceTestsBase { displayContent.onRequestedOverrideConfigurationChanged(c); } + static void makeDisplayLargeScreen(DisplayContent displayContent) { + final int swDp = displayContent.getConfiguration().smallestScreenWidthDp; + if (swDp < WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP) { + final int height = 100 + (int) (displayContent.getDisplayMetrics().density + * WindowManager.LARGE_SCREEN_SMALLEST_SCREEN_WIDTH_DP); + resizeDisplay(displayContent, 100 + height, height); + } + } + /** Used for the tests that assume the display is portrait by default. */ static void makeDisplayPortrait(DisplayContent displayContent) { if (displayContent.mBaseDisplayHeight <= displayContent.mBaseDisplayWidth) { @@ -1223,7 +1232,14 @@ public class WindowTestsBase extends SystemServiceTestsBase { } static ComponentName getUniqueComponentName() { - return ComponentName.createRelative(DEFAULT_COMPONENT_PACKAGE_NAME, + return getUniqueComponentName(DEFAULT_COMPONENT_PACKAGE_NAME); + } + + static ComponentName getUniqueComponentName(String packageName) { + if (packageName == null) { + packageName = DEFAULT_COMPONENT_PACKAGE_NAME; + } + return ComponentName.createRelative(packageName, DEFAULT_COMPONENT_CLASS_NAME + sCurrentActivityId++); } @@ -1298,8 +1314,7 @@ public class WindowTestsBase extends SystemServiceTestsBase { ActivityBuilder setActivityTheme(int theme) { mActivityTheme = theme; // Use the real package of test so it can get a valid context for theme. - mComponent = ComponentName.createRelative(mService.mContext.getPackageName(), - DEFAULT_COMPONENT_CLASS_NAME + sCurrentActivityId++); + mComponent = getUniqueComponentName(mService.mContext.getPackageName()); return this; } @@ -1743,7 +1758,7 @@ public class WindowTestsBase extends SystemServiceTestsBase { if (mIntent == null) { mIntent = new Intent(); if (mComponent == null) { - mComponent = getUniqueComponentName(); + mComponent = getUniqueComponentName(mPackage); } mIntent.setComponent(mComponent); mIntent.setFlags(mFlags); -- GitLab From 4d0dc576c0cefc8a6021c7a37b568df7f175241a Mon Sep 17 00:00:00 2001 From: Felix Stern Date: Mon, 21 Oct 2024 09:47:59 +0000 Subject: [PATCH 110/459] Fix test: Do not assert that currentInputStarted flag is set after hiding the IME The test method verifyInputViewStatusInternal always expected IMS#getCurrentInputStarted() to return true, after the IME was requested to be hidden. This is no longer valid as hiding the IME resets that flag (IMS#doFinishInput). Test: InputMethodServiceTest#testShowHideKeyboard_byUserAction Fix: 374069996 Flag: android.view.inputmethod.refactor_insets_controller Change-Id: Ie01f568e6625d3df0ea08dfe68152f6aa864bc10 --- .../inputmethodservice/InputMethodServiceTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java index 2c785049412a..2bc8af1b913e 100644 --- a/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java +++ b/services/tests/InputMethodSystemServerTests/src/com/android/inputmethodservice/InputMethodServiceTest.java @@ -159,15 +159,16 @@ public class InputMethodServiceTest { // Press home key to hide soft keyboard. Log.i(TAG, "Press home"); - verifyInputViewStatus( - () -> assertThat(mUiDevice.pressHome()).isTrue(), - true /* expected */, - false /* inputViewStarted */); if (Flags.refactorInsetsController()) { + assertThat(mUiDevice.pressHome()).isTrue(); // The IME visibility is only sent at the end of the animation. Therefore, we have to // wait until the visibility was sent to the server and the IME window hidden. eventually(() -> assertThat(mInputMethodService.isInputViewShown()).isFalse()); } else { + verifyInputViewStatus( + () -> assertThat(mUiDevice.pressHome()).isTrue(), + true /* expected */, + false /* inputViewStarted */); assertThat(mInputMethodService.isInputViewShown()).isFalse(); } } -- GitLab From a67c924de154782bb7f0ec5e283411caac4385e8 Mon Sep 17 00:00:00 2001 From: chelseahao Date: Sat, 12 Oct 2024 17:50:52 +0800 Subject: [PATCH 111/459] Use `audioSharingInteractor.audioSharingAvailable` instead of calling BluetoothUtils. Also fix a minor bug: previously the dialog only listen to `onAclConnectionStateChanged` when a device is disconnecting as we assume that `onProfileConnectionStateChanged` must be triggered right after if the device is connecting, however this is not true for BLE devices as they don't have profiles. We should remove that restriction. Test: atest Bug: b/360759048 b/358276696 Flag: com.android.settingslib.flags.enable_le_audio_sharing Change-Id: Ibc6c9f3801722daa1be5556ded18061c64d0ddfb --- ...ioSharingDeviceItemActionInteractorImpl.kt | 4 ++ .../qsdialog/DeviceItemActionInteractor.kt | 4 +- .../bluetooth/qsdialog/DeviceItemFactory.kt | 23 ++++++++-- .../qsdialog/DeviceItemInteractor.kt | 32 ++++++++------ ...ioSharingDeviceItemActionInteractorTest.kt | 23 ++++++++++ .../qsdialog/DeviceItemFactoryTest.kt | 21 ++------- .../qsdialog/DeviceItemInteractorTest.kt | 44 ++++++++++++------- 7 files changed, 98 insertions(+), 53 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorImpl.kt index 692a78be075f..13c72097c06e 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorImpl.kt @@ -63,6 +63,10 @@ constructor( logger.logDeviceClickInAudioSharingWhenEnabled(inAudioSharing) when { + deviceItem.type == DeviceItemType.AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE -> { + // Do nothing if the device is in audio sharing session + uiEventLogger.log(BluetoothTileDialogUiEvent.AUDIO_SHARING_DEVICE_CLICKED) + } deviceItem.type == DeviceItemType.AVAILABLE_AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE -> { if (audioSharingQsDialogImprovement()) { diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractor.kt index cf0f19f1d361..2b55e1c51f5f 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractor.kt @@ -44,9 +44,6 @@ constructor( disconnect() uiEventLogger.log(BluetoothTileDialogUiEvent.ACTIVE_DEVICE_DISCONNECT) } - DeviceItemType.AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE -> { - uiEventLogger.log(BluetoothTileDialogUiEvent.AUDIO_SHARING_DEVICE_CLICKED) - } DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE -> { setActive() uiEventLogger.log(BluetoothTileDialogUiEvent.CONNECTED_DEVICE_SET_ACTIVE) @@ -61,6 +58,7 @@ constructor( connect() uiEventLogger.log(BluetoothTileDialogUiEvent.SAVED_DEVICE_CONNECT) } + DeviceItemType.AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE, DeviceItemType.AVAILABLE_AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE -> { // Do nothing. Should already be handled in // AudioSharingDeviceItemActionInteractor. diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt index 7ed56296e865..292137377f55 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactory.kt @@ -42,8 +42,16 @@ abstract class DeviceItemFactory { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean + // Overloaded that defaults audioSharingAvailable to false + fun isFilterMatched( + context: Context, + cachedDevice: CachedBluetoothDevice, + audioManager: AudioManager, + ): Boolean = isFilterMatched(context, cachedDevice, audioManager, false) + abstract fun create(context: Context, cachedDevice: CachedBluetoothDevice): DeviceItem companion object { @@ -80,6 +88,7 @@ internal open class ActiveMediaDeviceItemFactory : DeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return BluetoothUtils.isActiveMediaDevice(cachedDevice) && BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager) @@ -105,8 +114,9 @@ internal class AudioSharingMediaDeviceItemFactory( context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { - return BluetoothUtils.isAudioSharingEnabled() && + return audioSharingAvailable && BluetoothUtils.hasConnectedBroadcastSource(cachedDevice, localBluetoothManager) } @@ -131,9 +141,10 @@ internal class AvailableAudioSharingMediaDeviceItemFactory( context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { - return BluetoothUtils.isAudioSharingEnabled() && - super.isFilterMatched(context, cachedDevice, audioManager) && + return audioSharingAvailable && + super.isFilterMatched(context, cachedDevice, audioManager, true) && BluetoothUtils.isAvailableAudioSharingMediaBluetoothDevice( cachedDevice, localBluetoothManager, @@ -160,6 +171,7 @@ internal class ActiveHearingDeviceItemFactory : ActiveMediaDeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return BluetoothUtils.isActiveMediaDevice(cachedDevice) && BluetoothUtils.isAvailableHearingDevice(cachedDevice) @@ -171,6 +183,7 @@ open class AvailableMediaDeviceItemFactory : DeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return !BluetoothUtils.isActiveMediaDevice(cachedDevice) && BluetoothUtils.isAvailableMediaBluetoothDevice(cachedDevice, audioManager) @@ -195,6 +208,7 @@ internal class AvailableHearingDeviceItemFactory : AvailableMediaDeviceItemFacto context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return !BluetoothUtils.isActiveMediaDevice(cachedDevice) && BluetoothUtils.isAvailableHearingDevice(cachedDevice) @@ -206,6 +220,7 @@ internal class ConnectedDeviceItemFactory : DeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) { !BluetoothUtils.isExclusivelyManagedBluetoothDevice(context, cachedDevice.device) && @@ -234,6 +249,7 @@ internal open class SavedDeviceItemFactory : DeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) { !BluetoothUtils.isExclusivelyManagedBluetoothDevice(context, cachedDevice.device) && @@ -263,6 +279,7 @@ internal class SavedHearingDeviceItemFactory : SavedDeviceItemFactory() { context: Context, cachedDevice: CachedBluetoothDevice, audioManager: AudioManager, + audioSharingAvailable: Boolean, ): Boolean { return if (Flags.enableHideExclusivelyManagedBluetoothDevice()) { !BluetoothUtils.isExclusivelyManagedBluetoothDevice( diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt index 01b84dac1065..1e0ba8e75714 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractor.kt @@ -50,6 +50,7 @@ class DeviceItemInteractor @Inject constructor( private val bluetoothTileDialogRepository: BluetoothTileDialogRepository, + private val audioSharingInteractor: AudioSharingInteractor, private val audioManager: AudioManager, private val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter(), private val localBluetoothManager: LocalBluetoothManager?, @@ -76,7 +77,7 @@ constructor( object : BluetoothCallback { override fun onActiveDeviceChanged( activeDevice: CachedBluetoothDevice?, - bluetoothProfile: Int + bluetoothProfile: Int, ) { super.onActiveDeviceChanged(activeDevice, bluetoothProfile) logger.logActiveDeviceChanged(activeDevice?.address, bluetoothProfile) @@ -86,30 +87,27 @@ constructor( override fun onProfileConnectionStateChanged( cachedDevice: CachedBluetoothDevice, state: Int, - bluetoothProfile: Int + bluetoothProfile: Int, ) { super.onProfileConnectionStateChanged( cachedDevice, state, - bluetoothProfile + bluetoothProfile, ) logger.logProfileConnectionStateChanged( cachedDevice.address, state.toString(), - bluetoothProfile + bluetoothProfile, ) trySendWithFailureLogging(Unit, TAG, "onProfileConnectionStateChanged") } override fun onAclConnectionStateChanged( cachedDevice: CachedBluetoothDevice, - state: Int + state: Int, ) { super.onAclConnectionStateChanged(cachedDevice, state) - // Listen only when a device is disconnecting - if (state == 0) { - trySendWithFailureLogging(Unit, TAG, "onAclConnectionStateChanged") - } + trySendWithFailureLogging(Unit, TAG, "onAclConnectionStateChanged") } } localBluetoothManager?.eventManager?.registerCallback(listener) @@ -121,11 +119,19 @@ constructor( internal suspend fun updateDeviceItems(context: Context, trigger: DeviceFetchTrigger) { withContext(backgroundDispatcher) { val start = systemClock.elapsedRealtime() + val audioSharingAvailable = audioSharingInteractor.audioSharingAvailable() val deviceItems = bluetoothTileDialogRepository.cachedDevices .mapNotNull { cachedDevice -> deviceItemFactoryList - .firstOrNull { it.isFilterMatched(context, cachedDevice, audioManager) } + .firstOrNull { + it.isFilterMatched( + context, + cachedDevice, + audioManager, + audioSharingAvailable, + ) + } ?.create(context, cachedDevice) } .sort(deviceItemDisplayPriority, bluetoothAdapter?.mostRecentlyConnectedDevices) @@ -136,13 +142,13 @@ constructor( logger.logDeviceFetch( JobStatus.FINISHED, trigger, - systemClock.elapsedRealtime() - start + systemClock.elapsedRealtime() - start, ) } else { logger.logDeviceFetch( JobStatus.CANCELLED, trigger, - systemClock.elapsedRealtime() - start + systemClock.elapsedRealtime() - start, ) } } @@ -150,7 +156,7 @@ constructor( private fun List.sort( displayPriority: List, - mostRecentlyConnectedDevices: List? + mostRecentlyConnectedDevices: List?, ): List { return this.sortedWith( compareBy { displayPriority.indexOf(it.type) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorTest.kt index ce37eee24e2a..4d138b488645 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDeviceItemActionInteractorTest.kt @@ -63,6 +63,7 @@ class AudioSharingDeviceItemActionInteractorTest : SysuiTestCase() { private lateinit var mockitoSession: StaticMockitoSession private lateinit var connectedAudioSharingMediaDeviceItem: DeviceItem private lateinit var connectedMediaDeviceItem: DeviceItem + private lateinit var inAudioSharingMediaDeviceItem: DeviceItem @Mock private lateinit var dialog: SystemUIDialog @Mock private lateinit var leAudioProfile: LeAudioProfile @Mock private lateinit var bluetoothDevice: BluetoothDevice @@ -80,6 +81,15 @@ class AudioSharingDeviceItemActionInteractorTest : SysuiTestCase() { iconWithDescription = null, background = null, ) + inAudioSharingMediaDeviceItem = + DeviceItem( + type = DeviceItemType.AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE, + cachedBluetoothDevice = kosmos.cachedBluetoothDevice, + deviceName = DEVICE_NAME, + connectionSummary = DEVICE_CONNECTION_SUMMARY, + iconWithDescription = null, + background = null, + ) connectedAudioSharingMediaDeviceItem = DeviceItem( type = DeviceItemType.AVAILABLE_AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE, @@ -130,6 +140,19 @@ class AudioSharingDeviceItemActionInteractorTest : SysuiTestCase() { } } + @Test + fun testOnClick_inAudioSharingMediaDevice_doNothing() { + with(kosmos) { + testScope.runTest { + bluetoothTileDialogAudioSharingRepository.setAudioSharingAvailable(true) + actionInteractorImpl.onClick(inAudioSharingMediaDeviceItem, dialog) + + verify(dialogTransitionAnimator, never()) + .showFromDialog(any(), any(), eq(null), anyBoolean()) + } + } + } + @Test fun testOnClick_inAudioSharing_clickedDeviceHasSource_shouldNotLaunchSettings() { with(kosmos) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt index 10c3457066cb..2ff8cbcf34ae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt @@ -133,36 +133,26 @@ class DeviceItemFactoryTest : SysuiTestCase() { @Test fun testAvailableAudioSharingMediaDeviceItemFactory_isFilterMatched_flagOff_returnsFalse() { - // Flags.FLAG_ENABLE_LE_AUDIO_SHARING off or the device doesn't support broadcast - // source or assistant. - `when`(BluetoothUtils.isAudioSharingEnabled()).thenReturn(false) - assertThat( AvailableAudioSharingMediaDeviceItemFactory(localBluetoothManager) - .isFilterMatched(context, cachedDevice, audioManager) + .isFilterMatched(context, cachedDevice, audioManager, false) ) .isFalse() } @Test fun testAvailableAudioSharingMediaDeviceItemFactory_isFilterMatched_isActiveDevice_false() { - // Flags.FLAG_ENABLE_LE_AUDIO_SHARING on and the device support broadcast source and - // assistant. - `when`(BluetoothUtils.isAudioSharingEnabled()).thenReturn(true) `when`(BluetoothUtils.isActiveMediaDevice(any())).thenReturn(true) assertThat( AvailableAudioSharingMediaDeviceItemFactory(localBluetoothManager) - .isFilterMatched(context, cachedDevice, audioManager) + .isFilterMatched(context, cachedDevice, audioManager, true) ) .isFalse() } @Test fun testAvailableAudioSharingMediaDeviceItemFactory_isFilterMatched_isNotAvailable_false() { - // Flags.FLAG_ENABLE_LE_AUDIO_SHARING on and the device support broadcast source and - // assistant. - `when`(BluetoothUtils.isAudioSharingEnabled()).thenReturn(true) `when`(BluetoothUtils.isActiveMediaDevice(any())).thenReturn(false) `when`(BluetoothUtils.isAvailableMediaBluetoothDevice(any(), any())).thenReturn(true) `when`(BluetoothUtils.isAvailableAudioSharingMediaBluetoothDevice(any(), any())) @@ -170,16 +160,13 @@ class DeviceItemFactoryTest : SysuiTestCase() { assertThat( AvailableAudioSharingMediaDeviceItemFactory(localBluetoothManager) - .isFilterMatched(context, cachedDevice, audioManager) + .isFilterMatched(context, cachedDevice, audioManager, true) ) .isFalse() } @Test fun testAvailableAudioSharingMediaDeviceItemFactory_isFilterMatched_returnsTrue() { - // Flags.FLAG_ENABLE_LE_AUDIO_SHARING on and the device support broadcast source and - // assistant. - `when`(BluetoothUtils.isAudioSharingEnabled()).thenReturn(true) `when`(BluetoothUtils.isActiveMediaDevice(any())).thenReturn(false) `when`(BluetoothUtils.isAvailableMediaBluetoothDevice(any(), any())).thenReturn(true) `when`(BluetoothUtils.isAvailableAudioSharingMediaBluetoothDevice(any(), any())) @@ -187,7 +174,7 @@ class DeviceItemFactoryTest : SysuiTestCase() { assertThat( AvailableAudioSharingMediaDeviceItemFactory(localBluetoothManager) - .isFilterMatched(context, cachedDevice, audioManager) + .isFilterMatched(context, cachedDevice, audioManager, true) ) .isTrue() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt index c39b9a606cfe..42dc50d77d05 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt @@ -27,6 +27,7 @@ import com.android.settingslib.bluetooth.CachedBluetoothDevice import com.android.settingslib.bluetooth.LocalBluetoothManager import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.testKosmos import com.android.systemui.util.time.FakeSystemClock import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.CoroutineDispatcher @@ -48,6 +49,7 @@ import org.mockito.junit.MockitoRule class DeviceItemInteractorTest : SysuiTestCase() { @get:Rule val mockitoRule: MockitoRule = MockitoJUnit.rule() + private val kosmos = testKosmos() @Mock private lateinit var bluetoothTileDialogRepository: BluetoothTileDialogRepository @@ -99,6 +101,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -107,7 +110,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf(createFactory({ true }, deviceItem1)), emptyList(), testScope.backgroundScope, - dispatcher + dispatcher, ) val latest by collectLastValue(interactor.deviceItemUpdate) @@ -126,6 +129,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -134,7 +138,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf(createFactory({ false }, deviceItem1)), emptyList(), testScope.backgroundScope, - dispatcher + dispatcher, ) val latest by collectLastValue(interactor.deviceItemUpdate) @@ -153,6 +157,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -161,7 +166,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf(createFactory({ true }, deviceItem1)), emptyList(), testScope.backgroundScope, - dispatcher + dispatcher, ) val latest by collectLastValue(interactor.deviceItemUpdate) @@ -180,6 +185,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -187,11 +193,11 @@ class DeviceItemInteractorTest : SysuiTestCase() { logger, listOf( createFactory({ false }, deviceItem1), - createFactory({ true }, deviceItem2) + createFactory({ true }, deviceItem2), ), emptyList(), testScope.backgroundScope, - dispatcher + dispatcher, ) val latest by collectLastValue(interactor.deviceItemUpdate) @@ -210,6 +216,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -218,19 +225,19 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf( createFactory( { cachedDevice -> cachedDevice.device == device1 }, - deviceItem1 + deviceItem1, ), createFactory( { cachedDevice -> cachedDevice.device == device2 }, - deviceItem2 - ) + deviceItem2, + ), ), listOf( DeviceItemType.SAVED_BLUETOOTH_DEVICE, - DeviceItemType.CONNECTED_BLUETOOTH_DEVICE + DeviceItemType.CONNECTED_BLUETOOTH_DEVICE, ), testScope.backgroundScope, - dispatcher + dispatcher, ) `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE) `when`(deviceItem2.type).thenReturn(DeviceItemType.SAVED_BLUETOOTH_DEVICE) @@ -251,6 +258,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -259,16 +267,16 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf( createFactory( { cachedDevice -> cachedDevice.device == device1 }, - deviceItem1 + deviceItem1, ), createFactory( { cachedDevice -> cachedDevice.device == device2 }, - deviceItem2 - ) + deviceItem2, + ), ), listOf(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE), testScope.backgroundScope, - dispatcher + dispatcher, ) `when`(deviceItem1.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE) `when`(deviceItem2.type).thenReturn(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE) @@ -291,6 +299,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { interactor = DeviceItemInteractor( bluetoothTileDialogRepository, + kosmos.audioSharingInteractor, audioManager, adapter, localBluetoothManager, @@ -299,7 +308,7 @@ class DeviceItemInteractorTest : SysuiTestCase() { listOf(createFactory({ true }, deviceItem2)), emptyList(), testScope.backgroundScope, - dispatcher + dispatcher, ) val latest by collectLastValue(interactor.deviceItemUpdate) val latestShowSeeAll by collectLastValue(interactor.showSeeAllUpdate) @@ -312,13 +321,14 @@ class DeviceItemInteractorTest : SysuiTestCase() { private fun createFactory( isFilterMatchFunc: (CachedBluetoothDevice) -> Boolean, - deviceItem: DeviceItem + deviceItem: DeviceItem, ): DeviceItemFactory { return object : DeviceItemFactory() { override fun isFilterMatched( context: Context, cachedDevice: CachedBluetoothDevice, - audioManager: AudioManager + audioManager: AudioManager, + audioSharingAvailable: Boolean, ) = isFilterMatchFunc(cachedDevice) override fun create(context: Context, cachedDevice: CachedBluetoothDevice) = deviceItem -- GitLab From 8e1c638b0c80690874f9d3c3af9b257776b1469d Mon Sep 17 00:00:00 2001 From: Lais Andrade Date: Tue, 15 Oct 2024 11:53:26 +0100 Subject: [PATCH 112/459] Unify current session in vibrator service Update vibrator manager service to have a single current session that can be either an external vibration or a vibration effect, in preparation to add support for ongoing vendor vibration sessions. The update preserves the existing behaviour, so some of the listeners for settings updates and system broadcasts are explictly ignoring ongoing external vibrations. New bugs were open to investigate and update that behaviour. Bug: 345414356 Flag: EXEMPT refactor Test: FrameworksVibratorServicesTests Change-Id: I08ebe4049e79b8148539f4fb8af943a5c65e6e48 --- .../vibrator/vibratormanagerservice.proto | 2 +- .../vibrator/ExternalVibrationSession.java | 56 +-- .../vibrator/SingleVibrationSession.java | 27 +- .../server/vibrator/VibrationSession.java | 11 +- .../vibrator/VibratorManagerService.java | 376 ++++++++++-------- .../vibrator/VibratorManagerServiceTest.java | 6 +- 6 files changed, 255 insertions(+), 223 deletions(-) diff --git a/core/proto/android/server/vibrator/vibratormanagerservice.proto b/core/proto/android/server/vibrator/vibratormanagerservice.proto index 258832e3e7ff..8a9f5f35759c 100644 --- a/core/proto/android/server/vibrator/vibratormanagerservice.proto +++ b/core/proto/android/server/vibrator/vibratormanagerservice.proto @@ -158,7 +158,6 @@ message VibratorManagerServiceDumpProto { repeated int32 vibrator_ids = 1; optional VibrationProto current_vibration = 2; optional int32 is_vibrator_controller_registered = 27; - optional VibrationProto current_external_vibration = 4; optional bool low_power_mode = 6; optional bool vibrate_on = 24; reserved 25; // prev keyboard_vibration_on @@ -183,4 +182,5 @@ message VibratorManagerServiceDumpProto { reserved 17; // prev previous_external_vibrations reserved 3; // prev is_vibrating, check current_vibration instead reserved 5; // prev vibrator_under_external_control, check current_external_vibration instead + reserved 4; // prev current_external_vibration, check current_vibration instead } \ No newline at end of file diff --git a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java index e650c52b68b4..df44e50d2839 100644 --- a/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java +++ b/services/core/java/com/android/server/vibrator/ExternalVibrationSession.java @@ -24,8 +24,8 @@ import android.os.ExternalVibrationScale; import android.os.IBinder; import android.os.VibrationAttributes; import android.os.vibrator.Flags; +import android.util.Slog; -import com.android.internal.annotations.GuardedBy; import com.android.internal.util.FrameworkStatsLog; /** @@ -33,22 +33,31 @@ import com.android.internal.util.FrameworkStatsLog; */ final class ExternalVibrationSession extends Vibration implements VibrationSession, IBinder.DeathRecipient { + private static final String TAG = "ExternalVibrationSession"; + + /** Calls into VibratorManager functionality needed for playing an {@link ExternalVibration}. */ + interface VibratorManagerHooks { + + /** + * Tells the manager that the external vibration is finished and the vibrators can now be + * used for another vibration. + */ + void onExternalVibrationReleased(long vibrationId); + } - private final Object mLock = new Object(); private final ExternalVibration mExternalVibration; private final ExternalVibrationScale mScale = new ExternalVibrationScale(); + private final VibratorManagerHooks mManagerHooks; - @GuardedBy("mLock") - @Nullable - private Runnable mBinderDeathCallback; - - ExternalVibrationSession(ExternalVibration externalVibration) { + ExternalVibrationSession(ExternalVibration externalVibration, + VibratorManagerHooks managerHooks) { super(new CallerInfo( externalVibration.getVibrationAttributes(), externalVibration.getUid(), // TODO(b/249785241): Find a way to link ExternalVibration to a VirtualDevice // instead of using DEVICE_ID_INVALID here and relying on the UID checks. Context.DEVICE_ID_INVALID, externalVibration.getPackage(), null)); mExternalVibration = externalVibration; + mManagerHooks = managerHooks; } public ExternalVibrationScale getScale() { @@ -94,10 +103,7 @@ final class ExternalVibrationSession extends Vibration } @Override - public boolean linkToDeath(Runnable callback) { - synchronized (mLock) { - mBinderDeathCallback = callback; - } + public boolean linkToDeath() { mExternalVibration.linkToDeath(this); return true; } @@ -105,39 +111,33 @@ final class ExternalVibrationSession extends Vibration @Override public void unlinkToDeath() { mExternalVibration.unlinkToDeath(this); - synchronized (mLock) { - mBinderDeathCallback = null; - } } @Override public void binderDied() { - Runnable callback; - synchronized (mLock) { - callback = mBinderDeathCallback; - } - if (callback != null) { - callback.run(); - } + Slog.d(TAG, "Binder died, cancelling external vibration..."); + requestEnd(Status.CANCELLED_BINDER_DIED); } @Override void end(EndInfo endInfo) { super.end(endInfo); if (stats.hasStarted()) { + // Notify external client that this vibration should stop sending data to the vibrator. + mExternalVibration.mute(); // External vibration doesn't have feedback from total time the vibrator was playing // with non-zero amplitude, so we use the duration between start and end times of // the vibration as the time the vibrator was ON, since the haptic channels are // open for this duration and can receive vibration waveform data. stats.reportVibratorOn(stats.getEndUptimeMillis() - stats.getStartUptimeMillis()); + // Notify the manager that external client has released the vibrator control. + mManagerHooks.onExternalVibrationReleased(id); } } @Override public void requestEnd(@NonNull Status status, @Nullable CallerInfo endedBy, boolean immediate) { - // Notify external client that this vibration should stop sending data to the vibrator. - mExternalVibration.mute(); end(new EndInfo(status, endedBy)); } @@ -170,4 +170,14 @@ final class ExternalVibrationSession extends Vibration mScale.adaptiveHapticsScale = scaler.getAdaptiveHapticsScale(usage); stats.reportAdaptiveScale(mScale.adaptiveHapticsScale); } + + @Override + public String toString() { + return "ExternalVibrationSession{" + + "id=" + id + + ", callerInfo=" + callerInfo + + ", externalVibration=" + mExternalVibration + + ", scale=" + mScale + + '}'; + } } diff --git a/services/core/java/com/android/server/vibrator/SingleVibrationSession.java b/services/core/java/com/android/server/vibrator/SingleVibrationSession.java index f80407d03e5c..67ba25f6b0b9 100644 --- a/services/core/java/com/android/server/vibrator/SingleVibrationSession.java +++ b/services/core/java/com/android/server/vibrator/SingleVibrationSession.java @@ -41,10 +41,6 @@ final class SingleVibrationSession implements VibrationSession, IBinder.DeathRec @GuardedBy("mLock") private VibrationStepConductor mConductor; - @GuardedBy("mLock") - @Nullable - private Runnable mBinderDeathCallback; - SingleVibrationSession(@NonNull IBinder callerToken, @NonNull CallerInfo callerInfo, @NonNull CombinedVibration vibration) { mCallerToken = callerToken; @@ -100,20 +96,10 @@ final class SingleVibrationSession implements VibrationSession, IBinder.DeathRec public void binderDied() { Slog.d(TAG, "Binder died, cancelling vibration..."); requestEnd(Status.CANCELLED_BINDER_DIED, /* endedBy= */ null, /* immediate= */ false); - Runnable callback; - synchronized (mLock) { - callback = mBinderDeathCallback; - } - if (callback != null) { - callback.run(); - } } @Override - public boolean linkToDeath(@Nullable Runnable callback) { - synchronized (mLock) { - mBinderDeathCallback = callback; - } + public boolean linkToDeath() { try { mCallerToken.linkToDeath(this, 0); } catch (RemoteException e) { @@ -130,9 +116,6 @@ final class SingleVibrationSession implements VibrationSession, IBinder.DeathRec } catch (NoSuchElementException e) { Slog.wtf(TAG, "Failed to unlink vibration to token death", e); } - synchronized (mLock) { - mBinderDeathCallback = null; - } } @Override @@ -170,4 +153,12 @@ final class SingleVibrationSession implements VibrationSession, IBinder.DeathRec } } } + + @Override + public String toString() { + return "SingleVibrationSession{" + + "callerToken= " + mCallerToken + + ", vibration=" + mVibration + + '}'; + } } diff --git a/services/core/java/com/android/server/vibrator/VibrationSession.java b/services/core/java/com/android/server/vibrator/VibrationSession.java index 4de8f78f7836..b511ba8be405 100644 --- a/services/core/java/com/android/server/vibrator/VibrationSession.java +++ b/services/core/java/com/android/server/vibrator/VibrationSession.java @@ -54,15 +54,8 @@ interface VibrationSession { /** Returns debug data for logging and metric reports. */ DebugInfo getDebugInfo(); - /** - * Links this session to the app process death with given callback to handle it. - * - *

This can be used by the service to end the vibration session when the app process dies. - * - * @param callback The service callback to be triggered when the binder dies - * @return true if the link was successful, false otherwise - */ - boolean linkToDeath(@Nullable Runnable callback); + /** Links this session to the app process death, returning false if link failed. */ + boolean linkToDeath(); /** Removes link to the app process death. */ void unlinkToDeath(); diff --git a/services/core/java/com/android/server/vibrator/VibratorManagerService.java b/services/core/java/com/android/server/vibrator/VibratorManagerService.java index 7d5d34dbf7ab..ff3491182a5f 100644 --- a/services/core/java/com/android/server/vibrator/VibratorManagerService.java +++ b/services/core/java/com/android/server/vibrator/VibratorManagerService.java @@ -51,6 +51,7 @@ import android.os.ResultReceiver; import android.os.ServiceManager; import android.os.ShellCallback; import android.os.ShellCommand; +import android.os.SystemClock; import android.os.Trace; import android.os.VibrationAttributes; import android.os.VibrationEffect; @@ -94,6 +95,7 @@ import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.function.Function; +import java.util.function.Predicate; /** System implementation of {@link IVibratorManagerService}. */ public class VibratorManagerService extends IVibratorManagerService.Stub { @@ -155,14 +157,14 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { private final SparseArray mVibrators; private final VibrationThreadCallbacks mVibrationThreadCallbacks = new VibrationThreadCallbacks(); + private final ExternalVibrationCallbacks mExternalVibrationCallbacks = + new ExternalVibrationCallbacks(); @GuardedBy("mLock") private final SparseArray mAlwaysOnEffects = new SparseArray<>(); @GuardedBy("mLock") - private SingleVibrationSession mCurrentVibration; + private VibrationSession mCurrentVibration; @GuardedBy("mLock") - private SingleVibrationSession mNextVibration; - @GuardedBy("mLock") - private ExternalVibrationSession mCurrentExternalVibration; + private VibrationSession mNextVibration; @GuardedBy("mLock") private boolean mServiceReady; @@ -186,25 +188,19 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_SCREEN_OFF)) { + // When the system is entering a non-interactive state, we want to cancel + // vibrations in case a misbehaving app has abandoned them. synchronized (mLock) { - // When the system is entering a non-interactive state, we want to cancel - // vibrations in case a misbehaving app has abandoned them. - if (shouldCancelOnScreenOffLocked(mNextVibration)) { - clearNextVibrationLocked(Status.CANCELLED_BY_SCREEN_OFF); - } - if (shouldCancelOnScreenOffLocked(mCurrentVibration)) { - mCurrentVibration.requestEnd(Status.CANCELLED_BY_SCREEN_OFF); - } + maybeClearCurrentAndNextVibrationsLocked( + VibratorManagerService.this::shouldCancelOnScreenOffLocked, + Status.CANCELLED_BY_SCREEN_OFF); } } else if (android.multiuser.Flags.addUiForSoundsFromBackgroundUsers() && intent.getAction().equals(BackgroundUserSoundNotifier.ACTION_MUTE_SOUND)) { synchronized (mLock) { - if (shouldCancelOnFgUserRequest(mNextVibration)) { - clearNextVibrationLocked(Status.CANCELLED_BY_FOREGROUND_USER); - } - if (shouldCancelOnFgUserRequest(mCurrentVibration)) { - mCurrentVibration.requestEnd(Status.CANCELLED_BY_FOREGROUND_USER); - } + maybeClearCurrentAndNextVibrationsLocked( + VibratorManagerService.this::shouldCancelOnFgUserRequest, + Status.CANCELLED_BY_FOREGROUND_USER); } } } @@ -219,12 +215,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return; } synchronized (mLock) { - if (shouldCancelAppOpModeChangedLocked(mNextVibration)) { - clearNextVibrationLocked(Status.CANCELLED_BY_APP_OPS); - } - if (shouldCancelAppOpModeChangedLocked(mCurrentVibration)) { - mCurrentVibration.requestEnd(Status.CANCELLED_BY_APP_OPS); - } + maybeClearCurrentAndNextVibrationsLocked( + VibratorManagerService.this::shouldCancelAppOpModeChangedLocked, + Status.CANCELLED_BY_APP_OPS); } } }; @@ -641,14 +634,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { if (ignoreStatus == null) { final long ident = Binder.clearCallingIdentity(); try { - if (mCurrentExternalVibration != null) { - vib.stats.reportInterruptedAnotherVibration( - mCurrentExternalVibration.getCallerInfo()); - endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED, callerInfo, - /* continueExternalControl= */ false); - } else if (mCurrentVibration != null) { - if (mCurrentVibration.getVibration().canPipelineWith(vib, mVibratorInfos, - mVibrationConfig.getVibrationPipelineMaxDurationMs())) { + if (mCurrentVibration != null) { + if (shouldPipelineVibrationLocked(mCurrentVibration, vib)) { // Don't cancel the current vibration if it's pipeline-able. // Note that if there is a pending next vibration that can't be // pipelined, it will have already cancelled the current one, so we @@ -658,11 +645,12 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } } else { vib.stats.reportInterruptedAnotherVibration( - mCurrentVibration.getVibration().callerInfo); + mCurrentVibration.getCallerInfo()); mCurrentVibration.requestEnd(Status.CANCELLED_SUPERSEDED, callerInfo, /* immediate= */ false); } } + clearNextVibrationLocked(Status.CANCELLED_SUPERSEDED, callerInfo); ignoreStatus = startVibrationLocked(session); } finally { Binder.restoreCallingIdentity(ident); @@ -691,17 +679,17 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } final long ident = Binder.clearCallingIdentity(); try { - if (shouldCancelVibration(mNextVibration, usageFilter, token)) { + // TODO(b/370948466): investigate why token not checked on external vibrations. + IBinder cancelToken = + (mNextVibration instanceof ExternalVibrationSession) ? null : token; + if (shouldCancelVibration(mNextVibration, usageFilter, cancelToken)) { clearNextVibrationLocked(Status.CANCELLED_BY_USER); } - if (shouldCancelVibration(mCurrentVibration, usageFilter, token)) { + cancelToken = + (mCurrentVibration instanceof ExternalVibrationSession) ? null : token; + if (shouldCancelVibration(mCurrentVibration, usageFilter, cancelToken)) { mCurrentVibration.requestEnd(Status.CANCELLED_BY_USER); } - // TODO(b/370948466): investigate why token is not checked here and fix it. - if (shouldCancelVibration(mCurrentExternalVibration, usageFilter, null)) { - endExternalVibrateLocked(Status.CANCELLED_BY_USER, - /* endedBy= */ null, /* continueExternalControl= */ false); - } } finally { Binder.restoreCallingIdentity(ident); } @@ -760,7 +748,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { pw.println("CurrentVibration:"); pw.increaseIndent(); if (mCurrentVibration != null) { - mCurrentVibration.getVibration().getDebugInfo().dump(pw); + mCurrentVibration.getDebugInfo().dump(pw); } else { pw.println("null"); } @@ -770,17 +758,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { pw.println("NextVibration:"); pw.increaseIndent(); if (mNextVibration != null) { - mNextVibration.getVibration().getDebugInfo().dump(pw); - } else { - pw.println("null"); - } - pw.decreaseIndent(); - pw.println(); - - pw.println("CurrentExternalVibration:"); - pw.increaseIndent(); - if (mCurrentExternalVibration != null) { - mCurrentExternalVibration.getDebugInfo().dump(pw); + mNextVibration.getDebugInfo().dump(pw); } else { pw.println("null"); } @@ -805,13 +783,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { mVibrationSettings.dump(proto); mVibrationScaler.dump(proto); if (mCurrentVibration != null) { - mCurrentVibration.getVibration().getDebugInfo().dump(proto, + mCurrentVibration.getDebugInfo().dump(proto, VibratorManagerServiceDumpProto.CURRENT_VIBRATION); } - if (mCurrentExternalVibration != null) { - mCurrentExternalVibration.getDebugInfo().dump(proto, - VibratorManagerServiceDumpProto.CURRENT_EXTERNAL_VIBRATION); - } for (int i = 0; i < mVibrators.size(); i++) { proto.write(VibratorManagerServiceDumpProto.VIBRATOR_IDS, mVibrators.keyAt(i)); } @@ -841,7 +815,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { updateAlwaysOnLocked(mAlwaysOnEffects.valueAt(i)); } - if (mCurrentVibration == null) { + // TODO(b/372241975): investigate why external vibrations were not handled here before + if (mCurrentVibration == null + || (mCurrentVibration instanceof ExternalVibrationSession)) { return; } @@ -916,14 +892,14 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { Trace.asyncTraceBegin(TRACE_TAG_VIBRATOR, "vibration", 0); // Make sure mCurrentVibration is set while triggering the VibrationThread. mCurrentVibration = session; - if (!mCurrentVibration.linkToDeath(null)) { - // Shouldn't happen. The method call already logs a wtf. + if (!mCurrentVibration.linkToDeath()) { + // Shouldn't happen. The method call already logs. mCurrentVibration = null; // Aborted. return Status.IGNORED_ERROR_TOKEN; } if (!mVibrationThread.runVibrationOnVibrationThread(conductor)) { - // Shouldn't happen. The method call already logs a wtf. - mCurrentVibration.setVibrationConductor(null); + // Shouldn't happen. The method call already logs. + session.setVibrationConductor(null); // Rejected by thread, clear it in session. mCurrentVibration = null; // Aborted. return Status.IGNORED_ERROR_SCHEDULING; } @@ -937,6 +913,17 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } } + @GuardedBy("mLock") + private void maybeStartNextSingleVibrationLocked() { + if (mNextVibration instanceof SingleVibrationSession session) { + mNextVibration = null; + Status errorStatus = startVibrationOnThreadLocked(session); + if (errorStatus != null) { + endVibrationLocked(session, errorStatus); + } + } + } + @GuardedBy("mLock") private void endVibrationLocked(VibrationSession session, Status status) { endVibrationLocked(session, status, /* endedBy= */ null); @@ -1070,10 +1057,6 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { @GuardedBy("mLock") @Nullable private Vibration.EndInfo shouldIgnoreVibrationForOngoingLocked(VibrationSession session) { - if (mCurrentExternalVibration != null) { - return shouldIgnoreVibrationForOngoing(session, mCurrentExternalVibration); - } - if (mNextVibration != null) { Vibration.EndInfo vibrationEndInfo = shouldIgnoreVibrationForOngoing(session, mNextVibration); @@ -1168,6 +1151,18 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } } + /** Returns true if ongoing session should pipeline with the next vibration requested. */ + @GuardedBy("mLock") + private boolean shouldPipelineVibrationLocked(VibrationSession currentSession, + HalVibration nextVibration) { + if (!(currentSession instanceof SingleVibrationSession currentVibration)) { + // Only single vibration session can be pipelined. + return false; + } + return currentVibration.getVibration().canPipelineWith(nextVibration, mVibratorInfos, + mVibrationConfig.getVibrationPipelineMaxDurationMs()); + } + /** * Check if given vibration should be ignored by this service. * @@ -1304,7 +1299,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { try { effect.validate(); } catch (Exception e) { - Slog.wtf(TAG, "Encountered issue when verifying CombinedVibrationEffect.", e); + Slog.wtf(TAG, "Encountered issue when verifying vibration: " + effect, e); return false; } return true; @@ -1423,7 +1418,6 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return checkAppOpModeLocked(session.getCallerInfo()) != AppOpsManager.MODE_ALLOWED; } - @GuardedBy("mLock") private boolean shouldCancelOnFgUserRequest(@Nullable VibrationSession session) { if (session == null) { return false; @@ -1573,40 +1567,70 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { @Override public void onVibrationThreadReleased(long vibrationId) { if (DEBUG) { - Slog.d(TAG, "VibrationThread released after finished vibration"); + Slog.d(TAG, "VibrationThread released vibration " + vibrationId); } Trace.traceBegin(TRACE_TAG_VIBRATOR, "onVibrationThreadReleased"); - try { synchronized (mLock) { - if (DEBUG) { - Slog.d(TAG, "Processing VibrationThread released callback"); + if (!(mCurrentVibration instanceof SingleVibrationSession session)) { + if (Build.IS_DEBUGGABLE) { + Slog.wtf(TAG, "VibrationSession invalid on vibration thread release." + + " currentSession=" + mCurrentVibration); + } + // Only single vibration sessions are ended by thread being released. Abort. + return; } - if (Build.IS_DEBUGGABLE && mCurrentVibration != null - && mCurrentVibration.getVibration().id != vibrationId) { + if (Build.IS_DEBUGGABLE && (session.getVibration().id != vibrationId)) { Slog.wtf(TAG, TextUtils.formatSimple( - "VibrationId mismatch on release. expected=%d, released=%d", - mCurrentVibration.getVibration().id, vibrationId)); + "VibrationId mismatch on vibration thread release." + + " expected=%d, released=%d", + session.getVibration().id, vibrationId)); } - if (mCurrentVibration != null) { - // This is when we consider the current vibration complete, report metrics. - if (DEBUG) { - Slog.d(TAG, "Reporting vibration " + vibrationId + " finished."); + finishAppOpModeLocked(mCurrentVibration.getCallerInfo()); + clearCurrentVibrationLocked(); + Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); + // Start next vibration if it's a single vibration waiting for the thread. + maybeStartNextSingleVibrationLocked(); + } + } finally { + Trace.traceEnd(TRACE_TAG_VIBRATOR); + } + } + } + + /** + * Implementation of {@link ExternalVibrationSession.VibratorManagerHooks} that controls + * external vibrations and reports them when finished. + */ + private final class ExternalVibrationCallbacks + implements ExternalVibrationSession.VibratorManagerHooks { + + @Override + public void onExternalVibrationReleased(long vibrationId) { + if (DEBUG) { + Slog.d(TAG, "External vibration " + vibrationId + " released"); + } + Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationReleased"); + try { + synchronized (mLock) { + if (!(mCurrentVibration instanceof ExternalVibrationSession session)) { + if (Build.IS_DEBUGGABLE) { + Slog.wtf(TAG, "VibrationSession invalid on external vibration release." + + " currentSession=" + mCurrentVibration); } - mCurrentVibration.unlinkToDeath(); - finishAppOpModeLocked(mCurrentVibration.getCallerInfo()); - logAndRecordVibration(mCurrentVibration.getDebugInfo()); - Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0); - mCurrentVibration = null; + // Only external vibration sessions are ended by this callback. Abort. + return; } - if (mNextVibration != null) { - SingleVibrationSession nextVibration = mNextVibration; - mNextVibration = null; - Status startErrorStatus = startVibrationOnThreadLocked(nextVibration); - if (startErrorStatus != null) { - endVibrationLocked(nextVibration, startErrorStatus); - } + if (Build.IS_DEBUGGABLE && (session.id != vibrationId)) { + Slog.wtf(TAG, TextUtils.formatSimple( + "VibrationId mismatch on external vibration release." + + " expected=%d, released=%d", session.id, vibrationId)); } + setExternalControl(false, session.stats); + clearCurrentVibrationLocked(); + // Start next vibration if it's a single vibration waiting for the external + // control to be over. + maybeStartNextSingleVibrationLocked(); } } finally { Trace.traceEnd(TRACE_TAG_VIBRATOR); @@ -1826,6 +1850,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { mInfo.dump(proto, fieldId); } } + /** Clears mNextVibration if set, ending it cleanly */ @GuardedBy("mLock") private void clearNextVibrationLocked(Status status) { @@ -1846,28 +1871,56 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } } + /** Clears mCurrentVibration if set, reporting metrics */ + @GuardedBy("mLock") + private void clearCurrentVibrationLocked() { + if (mCurrentVibration != null) { + mCurrentVibration.unlinkToDeath(); + logAndRecordVibration(mCurrentVibration.getDebugInfo()); + mCurrentVibration = null; + mLock.notify(); // Notify if waiting for current vibration to end. + } + } + + @GuardedBy("mLock") + private void maybeClearCurrentAndNextVibrationsLocked( + Predicate shouldEndSessionPredicate, Status endStatus) { + // TODO(b/372241975): investigate why external vibrations were not handled here before + if (!(mNextVibration instanceof ExternalVibrationSession) + && shouldEndSessionPredicate.test(mNextVibration)) { + clearNextVibrationLocked(endStatus); + } + if (!(mCurrentVibration instanceof ExternalVibrationSession) + && shouldEndSessionPredicate.test(mCurrentVibration)) { + mCurrentVibration.requestEnd(endStatus); + } + } + /** - * Ends the external vibration, and clears related service state. + * Waits until the current vibration finished processing, timing out after the given + * number of milliseconds. * - * @param status the status to end the associated Vibration - * @param endedBy the caller that caused this vibration to end - * @param continueExternalControl indicates whether external control will continue. If not, the - * HAL will have external control turned off. + * @return true if the vibration completed, or false if waiting timed out. */ - @GuardedBy("mLock") - private void endExternalVibrateLocked(Status status, CallerInfo endedBy, - boolean continueExternalControl) { - if (mCurrentExternalVibration == null) { - return; - } - mCurrentExternalVibration.requestEnd(status, endedBy, /* immediate= */ true); - mCurrentExternalVibration.unlinkToDeath(); - if (!continueExternalControl) { - setExternalControl(false, mCurrentExternalVibration.stats); + public boolean waitForCurrentVibrationEnd(long maxWaitMillis) { + long now = SystemClock.elapsedRealtime(); + long deadline = now + maxWaitMillis; + synchronized (mLock) { + while (true) { + if (mCurrentVibration == null) { + return true; // Done + } + if (now >= deadline) { // Note that thread.wait(0) waits indefinitely. + return false; // Timed out. + } + try { + mLock.wait(deadline - now); + } catch (InterruptedException e) { + Slog.w(TAG, "VibratorManagerService interrupted waiting to stop, continuing"); + } + now = SystemClock.elapsedRealtime(); + } } - // The external control was turned off, end it and report metrics right away. - logAndRecordVibration(mCurrentExternalVibration.getDebugInfo()); - mCurrentExternalVibration = null; } private HapticFeedbackVibrationProvider getHapticVibrationProvider() { @@ -1904,10 +1957,10 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { try { // Create Vibration.Stats as close to the received request as possible, for // tracking. - ExternalVibrationSession session = new ExternalVibrationSession(vib); + ExternalVibrationSession session = new ExternalVibrationSession(vib, + mExternalVibrationCallbacks); // Mute the request until we run all the checks and accept the vibration. session.muteScale(); - boolean alreadyUnderExternalControl = false; boolean waitForCompletion = false; synchronized (mLock) { @@ -1933,85 +1986,83 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { return session.getScale(); } - if (mCurrentExternalVibration != null - && mCurrentExternalVibration.isHoldingSameVibration(vib)) { + if ((mCurrentVibration instanceof ExternalVibrationSession evs) + && evs.isHoldingSameVibration(vib)) { // We are already playing this external vibration, so we can return the same // scale calculated in the previous call to this method. - return mCurrentExternalVibration.getScale(); + return evs.getScale(); } // Check if ongoing vibration is more important than this vibration. - Vibration.EndInfo vibrationEndInfo = - shouldIgnoreVibrationForOngoingLocked(session); - if (vibrationEndInfo != null) { - endVibrationLocked(session, vibrationEndInfo.status, - vibrationEndInfo.endedBy); + Vibration.EndInfo ignoreInfo = shouldIgnoreVibrationForOngoingLocked(session); + if (ignoreInfo != null) { + endVibrationLocked(session, ignoreInfo.status, ignoreInfo.endedBy); return session.getScale(); } - if (mCurrentExternalVibration == null) { - // If we're not under external control right now, then cancel any normal - // vibration that may be playing and ready the vibrator for external - // control. - if (mCurrentVibration != null) { - session.stats.reportInterruptedAnotherVibration( - mCurrentVibration.getVibration().callerInfo); - clearNextVibrationLocked(Status.IGNORED_FOR_EXTERNAL, - session.callerInfo); - mCurrentVibration.requestEnd(Status.CANCELLED_SUPERSEDED, - session.callerInfo, /* immediate= */ true); - waitForCompletion = true; - } - } else { - // At this point we have an externally controlled vibration playing already. + // First clear next request, so it won't start when the current one ends. + clearNextVibrationLocked(Status.IGNORED_FOR_EXTERNAL, session.callerInfo); + mNextVibration = session; + + if (mCurrentVibration != null) { + // Cancel any vibration that may be playing and ready the vibrator, even if + // we have an externally controlled vibration playing already. // Since the interface defines that only one externally controlled - // vibration can - // play at a time, we need to first mute the ongoing vibration and then - // return - // a scale from this function for the new one, so we can be assured that the - // ongoing will be muted in favor of the new vibration. + // vibration can play at a time, we need to first mute the ongoing vibration + // and then return a scale from this function for the new one, so we can be + // assured that the ongoing will be muted in favor of the new vibration. // // Note that this doesn't support multiple concurrent external controls, // as we would need to mute the old one still if it came from a different // controller. - alreadyUnderExternalControl = true; session.stats.reportInterruptedAnotherVibration( - mCurrentExternalVibration.getCallerInfo()); - endExternalVibrateLocked(Status.CANCELLED_SUPERSEDED, - session.callerInfo, /* continueExternalControl= */ true); + mCurrentVibration.getCallerInfo()); + mCurrentVibration.requestEnd(Status.CANCELLED_SUPERSEDED, + session.callerInfo, /* immediate= */ true); + waitForCompletion = true; } } // Wait for lock and interact with HAL to set external control outside main lock. if (waitForCompletion) { - if (!mVibrationThread.waitForThreadIdle(VIBRATION_CANCEL_WAIT_MILLIS)) { + if (!waitForCurrentVibrationEnd(VIBRATION_CANCEL_WAIT_MILLIS)) { Slog.e(TAG, "Timed out waiting for vibration to cancel"); synchronized (mLock) { + if (mNextVibration == session) { + mNextVibration = null; + } endVibrationLocked(session, Status.IGNORED_ERROR_CANCELLING); return session.getScale(); } } } - if (!alreadyUnderExternalControl) { + synchronized (mLock) { + if (mNextVibration == session) { + // This is still the next vibration to be played. + mNextVibration = null; + } else { + // A new request took the place of this one, maybe with higher importance. + // Next vibration already cleared with the right status, just return here. + return session.getScale(); + } + if (!session.linkToDeath()) { + endVibrationLocked(session, Status.IGNORED_ERROR_TOKEN); + return session.getScale(); + } if (DEBUG) { Slog.d(TAG, "Vibrator going under external control."); } setExternalControl(true, session.stats); - } - synchronized (mLock) { if (DEBUG) { Slog.d(TAG, "Playing external vibration: " + vib); } VibrationAttributes attrs = fixupVibrationAttributes( - vib.getVibrationAttributes(), - /* effect= */ null); + vib.getVibrationAttributes(), /* effect= */ null); if (attrs.isFlagSet(VibrationAttributes.FLAG_INVALIDATE_SETTINGS_CACHE)) { // Force update of user settings before checking if this vibration effect // should be ignored or scaled. mVibrationSettings.update(); } - - mCurrentExternalVibration = session; - session.linkToDeath(this::onExternalVibrationBinderDied); + mCurrentVibration = session; session.scale(mVibrationScaler, attrs.getUsage()); // Vibrator will start receiving data from external channels after this point. @@ -2029,13 +2080,12 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { Trace.traceBegin(TRACE_TAG_VIBRATOR, "onExternalVibrationStop"); try { synchronized (mLock) { - if (mCurrentExternalVibration != null - && mCurrentExternalVibration.isHoldingSameVibration(vib)) { + if ((mCurrentVibration instanceof ExternalVibrationSession evs) + && evs.isHoldingSameVibration(vib)) { if (DEBUG) { Slog.d(TAG, "Stopping external vibration: " + vib); } - endExternalVibrateLocked(Status.FINISHED, /* endedBy= */ null, - /* continueExternalControl= */ false); + mCurrentVibration.requestEnd(Status.FINISHED); } } } finally { @@ -2051,18 +2101,6 @@ public class VibratorManagerService extends IVibratorManagerService.Stub { } return false; } - - private void onExternalVibrationBinderDied() { - synchronized (mLock) { - if (mCurrentExternalVibration != null) { - if (DEBUG) { - Slog.d(TAG, "External vibration finished because binder died"); - } - endExternalVibrateLocked(Status.CANCELLED_BINDER_DIED, /* endedBy= */ null, - /* continueExternalControl= */ false); - } - } - } } /** Provide limited functionality from {@link VibratorManagerService} as shell commands. */ diff --git a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java index 7f5da41bdf10..dfdd0cde6aba 100644 --- a/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java +++ b/services/tests/vibrator/src/com/android/server/vibrator/VibratorManagerServiceTest.java @@ -2248,13 +2248,13 @@ public class VibratorManagerServiceTest { assertNotEquals(ExternalVibrationScale.ScaleLevel.SCALE_MUTE, secondScale.scaleLevel); verify(firstController).mute(); verify(secondController, never()).mute(); - // Set external control called only once. - assertEquals(Arrays.asList(false, true), + // Set external control called for each vibration independently. + assertEquals(Arrays.asList(false, true, false, true), mVibratorProviders.get(1).getExternalControlStates()); mExternalVibratorService.onExternalVibrationStop(secondVibration); mExternalVibratorService.onExternalVibrationStop(firstVibration); - assertEquals(Arrays.asList(false, true, false), + assertEquals(Arrays.asList(false, true, false, true, false), mVibratorProviders.get(1).getExternalControlStates()); verify(firstToken).linkToDeath(any(), eq(0)); -- GitLab From f1c25ec712bc3530c806f88eb75795076ba29877 Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Wed, 9 Oct 2024 16:08:29 +0000 Subject: [PATCH 113/459] Consolidate full-screen override and cache user aspect ratio Consolidate user and system full-screen override in overrideOrientationIfNeeded. Cache user aspect ratio if successful to reduce binder calls to package manager per activity lifecycle. App will be force stopped if user aspect ratio is changed via Settings so there should be no changes in runtime. Flag: EXEMPT refactor Bug: 371554314 Test: atest SizeCompatTests atest AppCompatAspectRatioOverrideTest atest AppCompatOrientationPolicyTest Change-Id: I65d48399e512ef2cdd161a02e7766a9aa50f0b25 --- .../wm/AppCompatAspectRatioOverrides.java | 54 ++++++++++++------- .../server/wm/AppCompatOrientationPolicy.java | 27 ++-------- .../android/server/wm/SizeCompatTests.java | 53 +++++++++--------- 3 files changed, 64 insertions(+), 70 deletions(-) diff --git a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java index d59046f44129..f1dd41e7d74a 100644 --- a/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java +++ b/services/core/java/com/android/server/wm/AppCompatAspectRatioOverrides.java @@ -39,6 +39,7 @@ import static com.android.server.wm.AppCompatConfiguration.MIN_FIXED_ORIENTATION import static com.android.server.wm.AppCompatUtils.isChangeEnabled; import android.annotation.NonNull; +import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; @@ -126,18 +127,18 @@ class AppCompatAspectRatioOverrides { return false; } - mUserAspectRatioState.mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + final int aspectRatio = getUserMinAspectRatioOverrideCode(); - return mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_UNSET - && mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_APP_DEFAULT - && mUserAspectRatioState.mUserAspectRatio != USER_MIN_ASPECT_RATIO_FULLSCREEN; + return aspectRatio != USER_MIN_ASPECT_RATIO_UNSET + && aspectRatio != USER_MIN_ASPECT_RATIO_APP_DEFAULT + && aspectRatio != USER_MIN_ASPECT_RATIO_FULLSCREEN; } boolean shouldApplyUserFullscreenOverride() { if (isUserFullscreenOverrideEnabled()) { - mUserAspectRatioState.mUserAspectRatio = getUserMinAspectRatioOverrideCode(); + final int aspectRatio = getUserMinAspectRatioOverrideCode(); - return mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN; + return aspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN; } return false; @@ -153,10 +154,12 @@ class AppCompatAspectRatioOverrides { } boolean isSystemOverrideToFullscreenEnabled() { + final int aspectRatio = getUserMinAspectRatioOverrideCode(); + return isChangeEnabled(mActivityRecord, OVERRIDE_ANY_ORIENTATION_TO_USER) && !mAllowOrientationOverrideOptProp.isFalse() - && (mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_UNSET - || mUserAspectRatioState.mUserAspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN); + && (aspectRatio == USER_MIN_ASPECT_RATIO_UNSET + || aspectRatio == USER_MIN_ASPECT_RATIO_FULLSCREEN); } /** @@ -173,12 +176,11 @@ class AppCompatAspectRatioOverrides { } boolean hasFullscreenOverride() { - // `mUserAspectRatio` is always initialized first in `shouldApplyUserFullscreenOverride()`. return shouldApplyUserFullscreenOverride() || isSystemOverrideToFullscreenEnabled(); } float getUserMinAspectRatio() { - switch (mUserAspectRatioState.mUserAspectRatio) { + switch (getUserMinAspectRatioOverrideCode()) { case USER_MIN_ASPECT_RATIO_DISPLAY_SIZE: return getDisplaySizeMinAspectRatio(); case USER_MIN_ASPECT_RATIO_SPLIT_SCREEN: @@ -269,13 +271,7 @@ class AppCompatAspectRatioOverrides { } int getUserMinAspectRatioOverrideCode() { - try { - return mActivityRecord.mAtmService.getPackageManager() - .getUserMinAspectRatio(mActivityRecord.packageName, mActivityRecord.mUserId); - } catch (RemoteException e) { - Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + this, e); - } - return mUserAspectRatioState.mUserAspectRatio; + return mUserAspectRatioState.getUserAspectRatio(mActivityRecord); } private float getDefaultMinAspectRatioForUnresizableApps() { @@ -300,10 +296,30 @@ class AppCompatAspectRatioOverrides { } private static class UserAspectRatioState { - // TODO(b/315140179): Make mUserAspectRatio final - // The min aspect ratio override set by user + // The min aspect ratio override set by the user. @PackageManager.UserMinAspectRatio private int mUserAspectRatio = USER_MIN_ASPECT_RATIO_UNSET; + private boolean mHasBeenSet = false; + + @PackageManager.UserMinAspectRatio + private int getUserAspectRatio(@NonNull ActivityRecord activityRecord) { + // Package manager can be null at construction time, so access should be on demand. + if (!mHasBeenSet) { + try { + final IPackageManager pm = activityRecord.mAtmService.getPackageManager(); + if (pm != null) { + mUserAspectRatio = pm.getUserMinAspectRatio(activityRecord.packageName, + activityRecord.mUserId); + mHasBeenSet = true; + } + } catch (RemoteException e) { + Slog.w(TAG, "Exception thrown retrieving aspect ratio user override " + + this, e); + } + } + + return mUserAspectRatio; + } } private Resources getResources() { diff --git a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java index f5d58eac1113..e3a9d672c17f 100644 --- a/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java +++ b/services/core/java/com/android/server/wm/AppCompatOrientationPolicy.java @@ -56,11 +56,11 @@ class AppCompatOrientationPolicy { final DisplayContent displayContent = mActivityRecord.mDisplayContent; final boolean isIgnoreOrientationRequestEnabled = displayContent != null && displayContent.getIgnoreOrientationRequest(); - final boolean shouldApplyUserFullscreenOverride = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().shouldApplyUserFullscreenOverride(); + final boolean hasFullscreenOverride = mAppCompatOverrides + .getAppCompatAspectRatioOverrides().hasFullscreenOverride(); final boolean shouldCameraCompatControlOrientation = AppCompatCameraPolicy.shouldCameraCompatControlOrientation(mActivityRecord); - if (shouldApplyUserFullscreenOverride && isIgnoreOrientationRequestEnabled + if (hasFullscreenOverride && isIgnoreOrientationRequestEnabled // Do not override orientation to fullscreen for camera activities. // Fixed-orientation activities are rarely tested in other orientations, and it // often results in sideways or stretched previews. As the camera compat treatment @@ -69,8 +69,7 @@ class AppCompatOrientationPolicy { && !shouldCameraCompatControlOrientation) { Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) + " for " + mActivityRecord + " is overridden to " - + screenOrientationToString(SCREEN_ORIENTATION_USER) - + " by user aspect ratio settings."); + + screenOrientationToString(SCREEN_ORIENTATION_USER)); return SCREEN_ORIENTATION_USER; } @@ -101,24 +100,6 @@ class AppCompatOrientationPolicy { return candidate; } - // mUserAspectRatio is always initialized first in shouldApplyUserFullscreenOverride(), - // which will always come first before this check as user override > device - // manufacturer override. - final boolean isSystemOverrideToFullscreenEnabled = mAppCompatOverrides - .getAppCompatAspectRatioOverrides().isSystemOverrideToFullscreenEnabled(); - if (isSystemOverrideToFullscreenEnabled && isIgnoreOrientationRequestEnabled - // Do not override orientation to fullscreen for camera activities. - // Fixed-orientation activities are rarely tested in other orientations, and it - // often results in sideways or stretched previews. As the camera compat treatment - // targets fixed-orientation activities, overriding the orientation disables the - // treatment. - && !shouldCameraCompatControlOrientation) { - Slog.v(TAG, "Requested orientation " + screenOrientationToString(candidate) - + " for " + mActivityRecord + " is overridden to " - + screenOrientationToString(SCREEN_ORIENTATION_USER)); - return SCREEN_ORIENTATION_USER; - } - final AppCompatOrientationOverrides.OrientationOverridesState capabilityState = mAppCompatOverrides.getAppCompatOrientationOverrides() .mOrientationOverridesState; diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index c30f70ee2903..e956e225f811 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -63,9 +63,9 @@ import static com.android.server.wm.ActivityRecord.State.PAUSED; import static com.android.server.wm.ActivityRecord.State.RESTARTING_PROCESS; import static com.android.server.wm.ActivityRecord.State.RESUMED; import static com.android.server.wm.ActivityRecord.State.STOPPED; +import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.AppCompatUtils.computeAspectRatio; import static com.android.server.wm.DisplayContent.IME_TARGET_LAYERING; -import static com.android.server.wm.AppCompatConfiguration.LETTERBOX_POSITION_MULTIPLIER_CENTER; import static com.android.server.wm.WindowContainer.POSITION_TOP; import static com.google.common.truth.Truth.assertThat; @@ -95,13 +95,11 @@ import android.compat.testing.PlatformCompatChangeRule; import android.content.ComponentName; import android.content.pm.ActivityInfo; import android.content.pm.ActivityInfo.ScreenOrientation; -import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.graphics.Insets; import android.graphics.Rect; import android.os.Binder; -import android.os.RemoteException; import android.os.UserHandle; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; @@ -1570,7 +1568,7 @@ public class SizeCompatTests extends WindowTestsBase { new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -1957,7 +1955,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to multi-window which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -1993,7 +1991,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to multi-window which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2126,7 +2124,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(screenWidth, screenHeight); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); mActivity.mWmService.mAppCompatConfiguration - .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); + .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); @@ -2147,7 +2145,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(screenWidth), screenHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2392,13 +2390,11 @@ public class SizeCompatTests extends WindowTestsBase { spyOn(activity.mWmService.mAppCompatConfiguration); doReturn(enabled).when(activity.mWmService.mAppCompatConfiguration) .isUserAppAspectRatioSettingsEnabled(); - // Set user aspect ratio override - final IPackageManager pm = mAtm.getPackageManager(); - try { - doReturn(aspectRatio).when(pm) - .getUserMinAspectRatio(activity.packageName, activity.mUserId); - } catch (RemoteException ignored) { - } + final AppCompatAspectRatioOverrides aspectRatioOverrides = + activity.mAppCompatController.getAppCompatAspectRatioOverrides(); + spyOn(aspectRatioOverrides); + // Set user aspect ratio override. + doReturn(aspectRatio).when(aspectRatioOverrides).getUserMinAspectRatioOverrideCode(); prepareLimitedBounds(activity, screenOrientation, isUnresizable); @@ -2507,7 +2503,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(screenWidth), screenHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -2542,7 +2538,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, activity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, activity.getWindowingMode()); @@ -2663,7 +2659,7 @@ public class SizeCompatTests extends WindowTestsBase { setUpDisplaySizeWithApp(screenWidth, screenHeight); mActivity.mDisplayContent.setIgnoreOrientationRequest(true /* ignoreOrientationRequest */); mActivity.mWmService.mAppCompatConfiguration - .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); + .setIsSplitScreenAspectRatioForUnresizableAppsEnabled(true); mActivity.mWmService.mAppCompatConfiguration.setFixedOrientationLetterboxAspectRatio(1.1f); @@ -2684,7 +2680,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, screenWidth, getExpectedSplitSize(screenHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2712,7 +2708,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, displayWidth, getExpectedSplitSize(displayHeight)); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2748,7 +2744,7 @@ public class SizeCompatTests extends WindowTestsBase { final TestSplitOrganizer organizer = new TestSplitOrganizer(mAtm, mActivity.getDisplayContent()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, getExpectedSplitSize(displayWidth), displayHeight); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -2879,7 +2875,7 @@ public class SizeCompatTests extends WindowTestsBase { // App bounds should be 700x1400 with the ratio as the display. assertEquals(rotatedDisplayBounds.height(), rotatedActivityBounds.height()); assertEquals(rotatedDisplayBounds.height() * rotatedDisplayBounds.height() - / rotatedDisplayBounds.width(), rotatedActivityBounds.width()); + / rotatedDisplayBounds.width(), rotatedActivityBounds.width()); } @Test @@ -3328,7 +3324,7 @@ public class SizeCompatTests extends WindowTestsBase { final Rect originalBounds = new Rect(mActivity.getBounds()); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3444,7 +3440,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 1.1f, SCREEN_ORIENTATION_PORTRAIT); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1400, 1000); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3468,7 +3464,7 @@ public class SizeCompatTests extends WindowTestsBase { prepareUnresizable(mActivity, 1.1f, SCREEN_ORIENTATION_LANDSCAPE); // Move activity to split screen which takes half of the screen. - mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false , "test"); + mTask.reparent(organizer.mPrimary, POSITION_TOP, /* moveParents= */ false, "test"); organizer.mPrimary.setBounds(0, 0, 1000, 1400); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mTask.getWindowingMode()); assertEquals(WINDOWING_MODE_MULTI_WINDOW, mActivity.getWindowingMode()); @@ -3909,7 +3905,7 @@ public class SizeCompatTests extends WindowTestsBase { final DisplayPolicy policy = display.getDisplayPolicy(); DisplayPolicy.DecorInsets.Info decorInfo = policy.getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); - decorInfo.mNonDecorInsets.set(130, 0, 60, 0); + decorInfo.mNonDecorInsets.set(130, 0, 60, 0); spyOn(policy); doReturn(decorInfo).when(policy).getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); @@ -4145,6 +4141,7 @@ public class SizeCompatTests extends WindowTestsBase { // can be aligned inside parentAppBounds assertEquals(activity.getBounds(), new Rect(175, 0, 2275, 1000)); } + @Test @DisableCompatChanges({ActivityInfo.INSETS_DECOUPLED_CONFIGURATION_ENFORCED}) public void testApplyAspectRatio_activityCannotAlignWithParentAppHorizontal() { @@ -4198,7 +4195,7 @@ public class SizeCompatTests extends WindowTestsBase { final DisplayPolicy policy = display.getDisplayPolicy(); DisplayPolicy.DecorInsets.Info decorInfo = policy.getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); - decorInfo.mNonDecorInsets.set(0, 130, 0, 60); + decorInfo.mNonDecorInsets.set(0, 130, 0, 60); spyOn(policy); doReturn(decorInfo).when(policy).getDecorInsetsInfo(ROTATION_90, display.mBaseDisplayHeight, display.mBaseDisplayWidth); @@ -4451,7 +4448,7 @@ public class SizeCompatTests extends WindowTestsBase { mActivity.mResolveConfigHint.mUseOverrideInsetsForConfig = true; // Set task as freeform mTask.setWindowingMode(WindowConfiguration.WINDOWING_MODE_FREEFORM); - prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); + prepareUnresizable(mActivity, SCREEN_ORIENTATION_PORTRAIT); Rect bounds = new Rect(mActivity.getWindowConfiguration().getBounds()); Rect appBounds = new Rect(mActivity.getWindowConfiguration().getAppBounds()); -- GitLab From c9422059e76ef7e6f82791f7d7f512bd2ca6342a Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Mon, 21 Oct 2024 19:09:39 +0800 Subject: [PATCH 114/459] Fix windowless splash won't removed while hovering back gesture. The windowless surface can be add after transition ready in core, so there can defer the check until transaction applied. Flag: EXEMPT bugfix Bug: 372230928 Test: create windowless splash instead of snapshot, verify windowless splash get removed as soon as prepare back transition ready. Change-Id: I306b1d936504c48bd83d2185a54ecbddd0720d3e --- .../server/wm/BackNavigationController.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index ccd59969cec8..49fcb184872f 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -1328,16 +1328,13 @@ class BackNavigationController { if (!allWindowDrawn) { return; } - final SurfaceControl startingSurface = mOpenAnimAdaptor.mStartingSurface; - if (startingSurface != null && startingSurface.isValid()) { - startTransaction.addTransactionCommittedListener(Runnable::run, () -> { - synchronized (mWindowManagerService.mGlobalLock) { - if (mOpenAnimAdaptor != null) { - mOpenAnimAdaptor.cleanUpWindowlessSurface(true); - } + startTransaction.addTransactionCommittedListener(Runnable::run, () -> { + synchronized (mWindowManagerService.mGlobalLock) { + if (mOpenAnimAdaptor != null) { + mOpenAnimAdaptor.cleanUpWindowlessSurface(true); } - }); - } + } + }); } void clearBackAnimateTarget(boolean cancel) { -- GitLab From 34cf647df729b56bb1ae979a501d0a21e5ce4449 Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Tue, 24 Sep 2024 13:25:56 -0400 Subject: [PATCH 115/459] Implement top app bar and reset button for Edit mode Clicking on the reset button opens a confirmation dialog. Additionally this change fixes: - the icon tiles interactor ignoring size updates when using an outdated current tiles list. This happened while resetting due to the simultaneous change to both current tiles and sizes. - the mismatch corner radius for the edit grid container Flag: com.android.systemui.qs_ui_refactor_compose_fragment Bug: 366257479 Test: manually Test: SizedTilesResetInteractorTest Test: DynamicIconTilesInteractorTest Test: TileSpecSettingsRepositoryTest Change-Id: Ibdbc1eecebb0043f094f40574eba01f410d86950 --- .../DynamicIconTilesInteractorTest.kt | 81 ++++++++++ .../interactor/IconTilesInteractorTest.kt | 17 --- .../SizedTilesResetInteractorTest.kt | 82 +++++++++++ .../TileSpecSettingsRepositoryTest.kt | 17 ++- packages/SystemUI/res/values/strings.xml | 8 + .../systemui/qs/panels/dagger/PanelsModule.kt | 5 + .../interactor/DynamicIconTilesInteractor.kt | 47 ++++++ .../interactor/EditTilesResetInteractor.kt | 22 +++ .../domain/interactor/IconTilesInteractor.kt | 28 ++-- .../interactor/SizedTilesResetInteractor.kt | 42 ++++++ .../systemui/qs/panels/ui/compose/EditMode.kt | 6 +- .../qs/panels/ui/compose/GridLayout.kt | 1 + .../ui/compose/infinitegrid/EditTile.kt | 138 ++++++++++++------ .../infinitegrid/InfiniteGridLayout.kt | 32 +++- .../panels/ui/dialog/QSResetDialogDelegate.kt | 105 +++++++++++++ .../ui/viewmodel/DynamicIconTilesViewModel.kt | 41 ++++++ .../panels/ui/viewmodel/EditModeViewModel.kt | 11 +- .../ui/viewmodel/InfiniteGridViewModel.kt | 40 +++++ .../data/repository/TileSpecRepository.kt | 13 +- .../data/repository/UserTileSpecRepository.kt | 31 ++-- .../interactor/CurrentTilesInteractor.kt | 26 ++-- .../qs/panels/ui/compose/DragAndDropTest.kt | 2 + .../qs/panels/ui/compose/ResizingTest.kt | 2 + ...DynamicIconTilesInteractorFactoryKosmos.kt | 29 ++++ .../interactor/InfiniteGridLayoutKosmos.kt | 7 +- .../SizedTilesResetInteractorKosmos.kt | 26 ++++ .../ui/dialog/QSResetDialogDelegateKosmos.kt | 24 +++ .../DynamicIconTilesViewModelKosmosFactory.kt | 32 ++++ .../viewmodel/InfiniteGridViewModelKosmos.kt | 34 +++++ .../data/repository/FakeTileSpecRepository.kt | 6 +- 30 files changed, 816 insertions(+), 139 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorTest.kt create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractor.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/EditTilesResetInteractor.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractor.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegate.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt create mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModel.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorFactoryKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegateKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModelKosmosFactory.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModelKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorTest.kt new file mode 100644 index 000000000000..75d4b91f25a9 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorTest.kt @@ -0,0 +1,81 @@ +/* + * 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.qs.panels.domain.interactor + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.lifecycle.activateIn +import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository +import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository +import com.android.systemui.qs.panels.data.repository.qsPreferencesRepository +import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class DynamicIconTilesInteractorTest : SysuiTestCase() { + private val kosmos = + testKosmos().apply { + defaultLargeTilesRepository = + object : DefaultLargeTilesRepository { + override val defaultLargeTiles: Set = setOf(largeTile) + } + currentTilesInteractor.setTiles(listOf(largeTile, smallTile)) + } + private lateinit var underTest: DynamicIconTilesInteractor + + @Before + fun setUp() { + with(kosmos) { + underTest = dynamicIconTilesInteractorFactory.create() + underTest.activateIn(testScope) + } + } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun removingTile_updatesSharedPreferences() = + with(kosmos) { + testScope.runTest { + val latest by collectLastValue(qsPreferencesRepository.largeTilesSpecs) + runCurrent() + + // Remove the large tile from the current tiles + currentTilesInteractor.removeTiles(listOf(largeTile)) + runCurrent() + + // Assert that it resized to small + assertThat(latest).doesNotContain(largeTile) + } + } + + private companion object { + private val largeTile = TileSpec.create("large") + private val smallTile = TileSpec.create("small") + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorTest.kt index 79a303db079a..ed28dc8304c3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractorTest.kt @@ -96,23 +96,6 @@ class IconTilesInteractorTest : SysuiTestCase() { } } - @OptIn(ExperimentalCoroutinesApi::class) - @Test - fun removingTile_updatesSharedPreferences() = - with(kosmos) { - testScope.runTest { - val latest by collectLastValue(qsPreferencesRepository.largeTilesSpecs) - runCurrent() - - // Remove the large tile from the current tiles - currentTilesInteractor.removeTiles(listOf(largeTile)) - runCurrent() - - // Assert that it resized to small - assertThat(latest).doesNotContain(largeTile) - } - } - @OptIn(ExperimentalCoroutinesApi::class) @Test fun resizingNonCurrentTile_doesNothing() = diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorTest.kt new file mode 100644 index 000000000000..ee7a15eb7fa7 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorTest.kt @@ -0,0 +1,82 @@ +/* + * 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.qs.panels.domain.interactor + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.kosmos.testScope +import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepository +import com.android.systemui.qs.panels.data.repository.defaultLargeTilesRepository +import com.android.systemui.qs.pipeline.data.repository.FakeDefaultTilesRepository +import com.android.systemui.qs.pipeline.data.repository.fakeDefaultTilesRepository +import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor +import com.android.systemui.qs.pipeline.shared.TileSpec +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class SizedTilesResetInteractorTest : SysuiTestCase() { + private val kosmos = + testKosmos().apply { + defaultLargeTilesRepository = + object : DefaultLargeTilesRepository { + override val defaultLargeTiles: Set = setOf(largeTile) + } + fakeDefaultTilesRepository = FakeDefaultTilesRepository(listOf(smallTile, largeTile)) + } + private val underTest = with(kosmos) { sizedTilesResetInteractor } + + @OptIn(ExperimentalCoroutinesApi::class) + @Test + fun changeTiles_resetsCorrectly() { + with(kosmos) { + testScope.runTest { + // Change current tiles and large tiles + currentTilesInteractor.setTiles(listOf(largeTile, newTile)) + iconTilesInteractor.setLargeTiles(setOf(newTile)) + runCurrent() + + // Assert both current tiles and large tiles changed + assertThat(currentTilesInteractor.currentTilesSpecs) + .containsExactly(largeTile, newTile) + assertThat(iconTilesInteractor.largeTilesSpecs.value).containsExactly(newTile) + + // Reset to default + underTest.reset() + runCurrent() + + // Assert both current tiles and large tiles are back to the initial state + assertThat(currentTilesInteractor.currentTilesSpecs) + .containsExactly(largeTile, smallTile) + assertThat(iconTilesInteractor.largeTilesSpecs.value).containsExactly(largeTile) + } + } + } + + private companion object { + private val largeTile = TileSpec.create("large") + private val smallTile = TileSpec.create("small") + private val newTile = TileSpec.create("newTile") + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt index 7ebebd7afa91..23056b2e1eab 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/pipeline/data/repository/TileSpecSettingsRepositoryTest.kt @@ -91,7 +91,7 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() { context.resources, logger, retailModeRepository, - userTileSpecRepositoryFactory + userTileSpecRepositoryFactory, ) } @@ -218,6 +218,21 @@ class TileSpecSettingsRepositoryTest : SysuiTestCase() { assertThat(loadTilesForUser(user)).isEqualTo(startingTiles) } + @Test + fun resetsDefault() = + testScope.runTest { + val tiles by collectLastValue(underTest.tilesSpecs(0)) + + val startingTiles = listOf(TileSpec.create("e"), TileSpec.create("f")) + + underTest.setTiles(0, startingTiles) + runCurrent() + + underTest.resetToDefault(0) + + assertThat(tiles!!).containsExactlyElementsIn(DEFAULT_TILES.toTileSpecs()) + } + private fun TestScope.storeTilesForUser(specs: String, forUser: Int) { secureSettings.putStringForUser(SETTING, specs, forUser) runCurrent() diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 2c5fb5667db7..cdf15ca83dd9 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3895,4 +3895,12 @@ Unknown + + + Reset tiles + + + + Reset tiles to their original order and sizes? + diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt index 31e867efba03..ef30cbfd55e5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt @@ -23,6 +23,8 @@ import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepositor import com.android.systemui.qs.panels.data.repository.DefaultLargeTilesRepositoryImpl import com.android.systemui.qs.panels.data.repository.GridLayoutTypeRepository import com.android.systemui.qs.panels.data.repository.GridLayoutTypeRepositoryImpl +import com.android.systemui.qs.panels.domain.interactor.EditTilesResetInteractor +import com.android.systemui.qs.panels.domain.interactor.SizedTilesResetInteractor import com.android.systemui.qs.panels.shared.model.GridLayoutType import com.android.systemui.qs.panels.shared.model.InfiniteGridLayoutType import com.android.systemui.qs.panels.shared.model.PaginatedGridLayoutType @@ -53,6 +55,9 @@ interface PanelsModule { @Binds fun bindGridLayoutTypeRepository(impl: GridLayoutTypeRepositoryImpl): GridLayoutTypeRepository + @Binds + fun bindEditTilesResetInteractor(impl: SizedTilesResetInteractor): EditTilesResetInteractor + @Binds fun bindIconTilesViewModel(impl: IconTilesViewModelImpl): IconTilesViewModel @Binds fun bindQSColumnsViewModel(impl: QSColumnsSizeViewModelImpl): QSColumnsViewModel diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractor.kt new file mode 100644 index 000000000000..ee38dfb4f4f9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractor.kt @@ -0,0 +1,47 @@ +/* + * 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.qs.panels.domain.interactor + +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +/** Interactor to resize QS tiles down to icons when removed from the current tiles. */ +class DynamicIconTilesInteractor +@AssistedInject +constructor( + private val iconTilesInteractor: IconTilesInteractor, + private val currentTilesInteractor: CurrentTilesInteractor, +) : ExclusiveActivatable() { + + override suspend fun onActivated(): Nothing { + currentTilesInteractor.currentTiles.collect { currentTiles -> + // Only current tiles can be resized, so observe the current tiles and find the + // intersection between them and the large tiles. + val newLargeTiles = + iconTilesInteractor.largeTilesSpecs.value intersect + currentTiles.map { it.spec }.toSet() + iconTilesInteractor.setLargeTiles(newLargeTiles) + } + } + + @AssistedFactory + interface Factory { + fun create(): DynamicIconTilesInteractor + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/EditTilesResetInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/EditTilesResetInteractor.kt new file mode 100644 index 000000000000..b523897ed46c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/EditTilesResetInteractor.kt @@ -0,0 +1,22 @@ +/* + * 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.qs.panels.domain.interactor + +/** Interactor for resetting QS tiles to the default state. */ +interface EditTilesResetInteractor { + fun reset() +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt index fc59a50e88ad..ec61a0d5769e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconTilesInteractor.kt @@ -27,7 +27,6 @@ import com.android.systemui.qs.pipeline.shared.TileSpec import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn @@ -36,34 +35,27 @@ import kotlinx.coroutines.flow.stateIn class IconTilesInteractor @Inject constructor( - repo: DefaultLargeTilesRepository, + private val repo: DefaultLargeTilesRepository, private val currentTilesInteractor: CurrentTilesInteractor, private val preferencesInteractor: QSPreferencesInteractor, @PanelsLog private val logBuffer: LogBuffer, @Application private val applicationScope: CoroutineScope, ) { - val largeTilesSpecs = - combine(preferencesInteractor.largeTilesSpecs, currentTilesInteractor.currentTiles) { - largeTiles, - currentTiles -> - if (currentTiles.isEmpty()) { - largeTiles - } else { - // Only current tiles can be resized, so observe the current tiles and find the - // intersection between them and the large tiles. - val newLargeTiles = largeTiles intersect currentTiles.map { it.spec }.toSet() - if (newLargeTiles != largeTiles) { - preferencesInteractor.setLargeTilesSpecs(newLargeTiles) - } - newLargeTiles - } - } + preferencesInteractor.largeTilesSpecs .onEach { logChange(it) } .stateIn(applicationScope, SharingStarted.Eagerly, repo.defaultLargeTiles) fun isIconTile(spec: TileSpec): Boolean = !largeTilesSpecs.value.contains(spec) + fun setLargeTiles(specs: Set) { + preferencesInteractor.setLargeTilesSpecs(specs) + } + + fun resetToDefault() { + preferencesInteractor.setLargeTilesSpecs(repo.defaultLargeTiles) + } + fun resize(spec: TileSpec, toIcon: Boolean) { if (!isCurrent(spec)) { return diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractor.kt new file mode 100644 index 000000000000..a40258709028 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractor.kt @@ -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 com.android.systemui.qs.panels.domain.interactor + +import com.android.internal.logging.UiEventLogger +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.qs.QSEditEvent +import com.android.systemui.qs.pipeline.domain.interactor.CurrentTilesInteractor +import javax.inject.Inject + +/** + * This implementation of [EditTilesResetInteractor] resets both the current tiles and the sizes to + * the default state. + */ +@SysUISingleton +class SizedTilesResetInteractor +@Inject +constructor( + private val currentTilesInteractor: CurrentTilesInteractor, + private val iconTilesInteractor: IconTilesInteractor, + private val uiEventLogger: UiEventLogger, +) : EditTilesResetInteractor { + override fun reset() { + uiEventLogger.log(QSEditEvent.QS_EDIT_RESET) + currentTilesInteractor.resetTiles() + iconTilesInteractor.resetToDefault() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditMode.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditMode.kt index 1674865bcce6..e990d9d110d5 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditMode.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/EditMode.kt @@ -26,10 +26,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.systemui.qs.panels.ui.viewmodel.EditModeViewModel @Composable -fun EditMode( - viewModel: EditModeViewModel, - modifier: Modifier = Modifier, -) { +fun EditMode(viewModel: EditModeViewModel, modifier: Modifier = Modifier) { val gridLayout by viewModel.gridLayout.collectAsStateWithLifecycle() val tiles by viewModel.tiles.collectAsStateWithLifecycle(emptyList()) @@ -44,6 +41,7 @@ fun EditMode( viewModel::addTile, viewModel::removeTile, viewModel::setTiles, + viewModel::stopEditing, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/GridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/GridLayout.kt index 0c02b400646c..0d375817b705 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/GridLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/GridLayout.kt @@ -41,6 +41,7 @@ interface GridLayout { onAddTile: (TileSpec, Int) -> Unit, onRemoveTile: (TileSpec) -> Unit, onSetTiles: (List) -> Unit, + onStopEditing: () -> Unit, ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index 5c2a2bd2b78c..d2ec958c17b7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -53,11 +53,19 @@ import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowBack +import androidx.compose.material.icons.filled.ArrowBack import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.material3.TopAppBar +import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect @@ -133,6 +141,31 @@ import kotlinx.coroutines.launch object TileType +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun EditModeTopBar(onStopEditing: () -> Unit, onReset: (() -> Unit)?) { + TopAppBar( + colors = TopAppBarDefaults.topAppBarColors(containerColor = Color.Black), + title = { Text(text = stringResource(id = R.string.qs_edit)) }, + navigationIcon = { + IconButton(onClick = onStopEditing) { + Icon( + Icons.AutoMirrored.Filled.ArrowBack, + contentDescription = + stringResource(id = com.android.internal.R.string.action_bar_up_description), + ) + } + }, + actions = { + if (onReset != null) { + TextButton(onClick = onReset) { + Text(stringResource(id = com.android.internal.R.string.reset)) + } + } + }, + ) +} + @Composable fun DefaultEditTileGrid( listState: EditTileListState, @@ -142,6 +175,8 @@ fun DefaultEditTileGrid( onRemoveTile: (TileSpec) -> Unit, onSetTiles: (List) -> Unit, onResize: (TileSpec, toIcon: Boolean) -> Unit, + onStopEditing: () -> Unit, + onReset: (() -> Unit)?, ) { val currentListState by rememberUpdatedState(listState) val selectionState = @@ -152,53 +187,71 @@ fun DefaultEditTileGrid( currentListState.isIcon(spec)?.let { onResize(spec, it) } }, ) + val reset: (() -> Unit)? = + if (onReset != null) { + { + selectionState.unSelect() + onReset() + } + } else { + null + } - CompositionLocalProvider(LocalOverscrollConfiguration provides null) { - Column( - verticalArrangement = - spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), - modifier = modifier.fillMaxSize().verticalScroll(rememberScrollState()), - ) { - AnimatedContent( - targetState = listState.dragInProgress, - modifier = Modifier.wrapContentSize(), - label = "", - ) { dragIsInProgress -> - EditGridHeader(Modifier.dragAndDropRemoveZone(listState, onRemoveTile)) { - if (dragIsInProgress) { - RemoveTileTarget() - } else { - Text(text = "Hold and drag to rearrange tiles.") + Scaffold( + containerColor = Color.Transparent, + topBar = { EditModeTopBar(onStopEditing = onStopEditing, onReset = reset) }, + ) { innerPadding -> + CompositionLocalProvider(LocalOverscrollConfiguration provides null) { + Column( + verticalArrangement = + spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), + modifier = + modifier + .fillMaxSize() + .verticalScroll(rememberScrollState()) + .padding(innerPadding), + ) { + AnimatedContent( + targetState = listState.dragInProgress, + modifier = Modifier.wrapContentSize(), + label = "", + ) { dragIsInProgress -> + EditGridHeader(Modifier.dragAndDropRemoveZone(listState, onRemoveTile)) { + if (dragIsInProgress) { + RemoveTileTarget() + } else { + Text(text = "Hold and drag to rearrange tiles.") + } } } - } - CurrentTilesGrid(listState, selectionState, columns, onResize, onSetTiles) + CurrentTilesGrid(listState, selectionState, columns, onResize, onSetTiles) - // Hide available tiles when dragging - AnimatedVisibility( - visible = !listState.dragInProgress, - enter = fadeIn(), - exit = fadeOut(), - ) { - Column( - verticalArrangement = - spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), - modifier = modifier.fillMaxSize(), + // Hide available tiles when dragging + AnimatedVisibility( + visible = !listState.dragInProgress, + enter = fadeIn(), + exit = fadeOut(), ) { - EditGridHeader { Text(text = "Hold and drag to add tiles.") } - - AvailableTileGrid(otherTiles, selectionState, columns, listState) + Column( + verticalArrangement = + spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), + modifier = modifier.fillMaxSize(), + ) { + EditGridHeader { Text(text = "Hold and drag to add tiles.") } + + AvailableTileGrid(otherTiles, selectionState, columns, listState) + } } - } - // Drop zone to remove tiles dragged out of the tile grid - Spacer( - modifier = - Modifier.fillMaxWidth() - .weight(1f) - .dragAndDropRemoveZone(listState, onRemoveTile) - ) + // Drop zone to remove tiles dragged out of the tile grid + Spacer( + modifier = + Modifier.fillMaxWidth() + .weight(1f) + .dragAndDropRemoveZone(listState, onRemoveTile) + ) + } } } } @@ -269,7 +322,7 @@ private fun CurrentTilesGrid( .border( width = 1.dp, color = MaterialTheme.colorScheme.onBackground.copy(alpha = .5f), - shape = RoundedCornerShape(48.dp), + shape = RoundedCornerShape((TileHeight / 2) + CurrentTilesGridPadding), ) .dragAndDropTileList(gridState, { gridContentOffset }, listState) { spec -> onSetTiles(currentListState.tileSpecs()) @@ -313,10 +366,7 @@ private fun AvailableTileGrid( text = category.label.load() ?: "", fontSize = 20.sp, color = labelColors.label, - modifier = - Modifier.fillMaxWidth() - .background(Color.Black) - .padding(start = 16.dp, bottom = 8.dp, top = 8.dp), + modifier = Modifier.fillMaxWidth().padding(start = 16.dp, bottom = 8.dp, top = 8.dp), ) tiles.chunked(columns).forEach { row -> Row( diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt index e5c213519415..366bc9a7a29a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt @@ -28,6 +28,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.systemui.dagger.SysUISingleton import com.android.systemui.grid.ui.compose.VerticalSpannedGrid +import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.qs.panels.shared.model.SizedTileImpl import com.android.systemui.qs.panels.ui.compose.PaginatableGridLayout import com.android.systemui.qs.panels.ui.compose.bounceableInfo @@ -35,8 +36,7 @@ import com.android.systemui.qs.panels.ui.compose.rememberEditListState import com.android.systemui.qs.panels.ui.viewmodel.BounceableTileViewModel import com.android.systemui.qs.panels.ui.viewmodel.EditTileViewModel import com.android.systemui.qs.panels.ui.viewmodel.IconTilesViewModel -import com.android.systemui.qs.panels.ui.viewmodel.QSColumnsViewModel -import com.android.systemui.qs.panels.ui.viewmodel.TileSquishinessViewModel +import com.android.systemui.qs.panels.ui.viewmodel.InfiniteGridViewModel import com.android.systemui.qs.panels.ui.viewmodel.TileViewModel import com.android.systemui.qs.pipeline.shared.TileSpec import com.android.systemui.qs.shared.ui.ElementKeys.toElementKey @@ -48,8 +48,7 @@ class InfiniteGridLayout @Inject constructor( private val iconTilesViewModel: IconTilesViewModel, - private val gridSizeViewModel: QSColumnsViewModel, - private val squishinessViewModel: TileSquishinessViewModel, + private val viewModelFactory: InfiniteGridViewModel.Factory, ) : PaginatableGridLayout { @Composable @@ -63,11 +62,19 @@ constructor( tiles.forEach { it.startListening(token) } onDispose { tiles.forEach { it.stopListening(token) } } } - val columns by gridSizeViewModel.columns.collectAsStateWithLifecycle() + val viewModel = + rememberViewModel(traceName = "InfiniteGridLayout.TileGrid") { + viewModelFactory.create() + } + val iconTilesViewModel = + rememberViewModel(traceName = "InfiniteGridLayout.TileGrid") { + viewModel.dynamicIconTilesViewModelFactory.create() + } + val columns by viewModel.gridSizeViewModel.columns.collectAsStateWithLifecycle() val sizedTiles = tiles.map { SizedTileImpl(it, it.spec.width()) } val bounceables = remember(sizedTiles) { List(sizedTiles.size) { BounceableTileViewModel() } } - val squishiness by squishinessViewModel.squishiness.collectAsStateWithLifecycle() + val squishiness by viewModel.squishinessViewModel.squishiness.collectAsStateWithLifecycle() val scope = rememberCoroutineScope() var cellIndex = 0 @@ -98,8 +105,17 @@ constructor( onAddTile: (TileSpec, Int) -> Unit, onRemoveTile: (TileSpec) -> Unit, onSetTiles: (List) -> Unit, + onStopEditing: () -> Unit, ) { - val columns by gridSizeViewModel.columns.collectAsStateWithLifecycle() + val viewModel = + rememberViewModel(traceName = "InfiniteGridLayout.EditTileGrid") { + viewModelFactory.create() + } + val iconTilesViewModel = + rememberViewModel(traceName = "InfiniteGridLayout.EditTileGrid") { + viewModel.dynamicIconTilesViewModelFactory.create() + } + val columns by viewModel.gridSizeViewModel.columns.collectAsStateWithLifecycle() val largeTiles by iconTilesViewModel.largeTiles.collectAsStateWithLifecycle() // Non-current tiles should always be displayed as icon tiles. @@ -123,6 +139,8 @@ constructor( onRemoveTile = onRemoveTile, onSetTiles = onSetTiles, onResize = iconTilesViewModel::resize, + onStopEditing = onStopEditing, + onReset = viewModel::showResetDialog, ) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegate.kt new file mode 100644 index 000000000000..03fc425a4f9a --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegate.kt @@ -0,0 +1,105 @@ +/* + * 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.qs.panels.ui.dialog + +import android.util.Log +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.stringResource +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.LifecycleOwner +import com.android.compose.PlatformButton +import com.android.compose.PlatformOutlinedButton +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dialog.ui.composable.AlertDialogContent +import com.android.systemui.qs.panels.domain.interactor.EditTilesResetInteractor +import com.android.systemui.res.R +import com.android.systemui.statusbar.phone.ComponentSystemUIDialog +import com.android.systemui.statusbar.phone.SystemUIDialog +import com.android.systemui.statusbar.phone.SystemUIDialogFactory +import com.android.systemui.statusbar.phone.create +import com.android.systemui.util.Assert +import javax.inject.Inject + +@SysUISingleton +class QSResetDialogDelegate +@Inject +constructor( + private val sysuiDialogFactory: SystemUIDialogFactory, + private val resetInteractor: EditTilesResetInteractor, +) : SystemUIDialog.Delegate { + private var currentDialog: ComponentSystemUIDialog? = null + + override fun createDialog(): SystemUIDialog { + Assert.isMainThread() + if (currentDialog != null) { + Log.d(TAG, "Dialog is already open, dismissing it and creating a new one.") + currentDialog?.dismiss() + } + + currentDialog = + sysuiDialogFactory + .create { ResetConfirmationDialog(it) } + .also { + it.lifecycle.addObserver( + object : DefaultLifecycleObserver { + override fun onStop(owner: LifecycleOwner) { + Assert.isMainThread() + currentDialog = null + } + } + ) + } + return currentDialog!! + } + + @Composable + private fun ResetConfirmationDialog(dialog: SystemUIDialog) { + AlertDialogContent( + title = { Text(text = stringResource(id = R.string.qs_edit_mode_reset_dialog_title)) }, + content = { + Text(text = stringResource(id = R.string.qs_edit_mode_reset_dialog_content)) + }, + positiveButton = { + PlatformButton( + onClick = { + dialog.dismiss() + resetInteractor.reset() + } + ) { + Text(stringResource(id = android.R.string.ok)) + } + }, + neutralButton = { + PlatformOutlinedButton(onClick = { dialog.dismiss() }) { + Text(stringResource(id = android.R.string.cancel)) + } + }, + ) + } + + fun showDialog() { + if (currentDialog == null) { + createDialog() + } + currentDialog?.show() + } + + companion object { + private const val TAG = "ResetDialogDelegate" + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt new file mode 100644 index 000000000000..9feaab83cc1f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModel.kt @@ -0,0 +1,41 @@ +/* + * 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.qs.panels.ui.viewmodel + +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.qs.panels.domain.interactor.DynamicIconTilesInteractor +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +/** View model to resize QS tiles down to icons when removed from the current tiles. */ +class DynamicIconTilesViewModel +@AssistedInject +constructor( + interactorFactory: DynamicIconTilesInteractor.Factory, + iconTilesViewModel: IconTilesViewModel, +) : IconTilesViewModel by iconTilesViewModel, ExclusiveActivatable() { + private val interactor = interactorFactory.create() + + override suspend fun onActivated(): Nothing { + interactor.activate() + } + + @AssistedFactory + interface Factory { + fun create(): DynamicIconTilesViewModel + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt index 4a8aa83e7d4e..7fe856b871bd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/EditModeViewModel.kt @@ -73,11 +73,7 @@ constructor( val gridLayout: StateFlow = gridLayoutTypeInteractor.layout .map { gridLayoutMap[it] ?: defaultGridLayout } - .stateIn( - applicationScope, - SharingStarted.WhileSubscribed(), - defaultGridLayout, - ) + .stateIn(applicationScope, SharingStarted.WhileSubscribed(), defaultGridLayout) /** * Flow of view models for each tile that should be visible in edit mode (or empty flow when not @@ -196,9 +192,4 @@ constructor( fun setTiles(tileSpecs: List) { currentTilesInteractor.setTiles(tileSpecs) } - - /** Immediately resets the current tiles to the default list. */ - fun resetCurrentTilesToDefault() { - throw NotImplementedError("This is not supported yet") - } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModel.kt new file mode 100644 index 000000000000..0d1206768db1 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModel.kt @@ -0,0 +1,40 @@ +/* + * 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.qs.panels.ui.viewmodel + +import com.android.systemui.qs.panels.ui.dialog.QSResetDialogDelegate +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +class InfiniteGridViewModel +@AssistedInject +constructor( + val dynamicIconTilesViewModelFactory: DynamicIconTilesViewModel.Factory, + val gridSizeViewModel: QSColumnsViewModel, + val squishinessViewModel: TileSquishinessViewModel, + private val resetDialogDelegate: QSResetDialogDelegate, +) { + + fun showResetDialog() { + resetDialogDelegate.showDialog() + } + + @AssistedFactory + interface Factory { + fun create(): InfiniteGridViewModel + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt index 24b80b8b069a..d94e7cfab5f1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/TileSpecRepository.kt @@ -71,6 +71,9 @@ interface TileSpecRepository { /** Prepend the default list of tiles to the current set of tiles */ suspend fun prependDefault(@UserIdInt userId: Int) + /** Reset the current set of tiles to the default list of tiles */ + suspend fun resetToDefault(userId: Int) + companion object { /** Position to indicate the end of the list */ const val POSITION_AT_END = -1 @@ -148,22 +151,24 @@ constructor( override suspend fun reconcileRestore( restoreData: RestoreData, - currentAutoAdded: Set + currentAutoAdded: Set, ) { userTileRepositories .get(restoreData.userId) ?.reconcileRestore(restoreData, currentAutoAdded) } - override suspend fun prependDefault( - userId: Int, - ) { + override suspend fun prependDefault(userId: Int) { if (retailModeRepository.inRetailMode) { return } userTileRepositories.get(userId)?.prependDefault() } + override suspend fun resetToDefault(userId: Int) { + userTileRepositories.get(userId)?.resetToDefault() + } + companion object { private const val DELIMITER = TilesSettingConverter.DELIMITER } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt index 1f9570a5722e..b0ae1e1abf21 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt @@ -119,14 +119,7 @@ constructor( .filter { it !is TileSpec.Invalid } .joinToString(DELIMITER, transform = TileSpec::spec) withContext(backgroundDispatcher) { - secureSettings.putStringForUser( - SETTING, - toStore, - null, - false, - forUser, - true, - ) + secureSettings.putStringForUser(SETTING, toStore, null, false, forUser, true) } } @@ -172,13 +165,17 @@ constructor( changeEvents.emit(PrependDefault(defaultTiles)) } + suspend fun resetToDefault() { + changeEvents.emit(ResetToDefault(defaultTiles)) + } + sealed interface ChangeAction { fun apply(currentTiles: List): List } private data class AddTile( val tileSpec: TileSpec, - val position: Int = TileSpecRepository.POSITION_AT_END + val position: Int = TileSpecRepository.POSITION_AT_END, ) : ChangeAction { override fun apply(currentTiles: List): List { val tilesList = currentTiles.toMutableList() @@ -199,9 +196,7 @@ constructor( } } - private data class ChangeTiles( - val newTiles: List, - ) : ChangeAction { + private data class ChangeTiles(val newTiles: List) : ChangeAction { override fun apply(currentTiles: List): List { val new = newTiles.filter { it !is TileSpec.Invalid } return if (new.isNotEmpty()) new else currentTiles @@ -214,6 +209,12 @@ constructor( } } + private data class ResetToDefault(val defaultTiles: List) : ChangeAction { + override fun apply(currentTiles: List): List { + return defaultTiles + } + } + private data class RestoreTiles( val restoreData: RestoreData, val currentAutoAdded: Set, @@ -236,7 +237,7 @@ constructor( fun reconcileTiles( currentTiles: List, currentAutoAdded: Set, - restoreData: RestoreData + restoreData: RestoreData, ): List { val toRestore = restoreData.restoredTiles.toMutableList() val freshlyAutoAdded = @@ -260,8 +261,6 @@ constructor( @AssistedFactory interface Factory { - fun create( - userId: Int, - ): UserTileSpecRepository + fun create(userId: Int): UserTileSpecRepository } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt index 4a96710f083c..10097d6eef7e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt @@ -116,6 +116,9 @@ interface CurrentTilesInteractor : ProtoDumpable { */ fun setTiles(specs: List) + /** Requests that the list of tiles for the current user is changed to the default list. */ + fun resetTiles() + fun createTileSync(spec: TileSpec): QSTile? companion object { @@ -222,7 +225,7 @@ constructor( .TILE_NOT_PRESENT_IN_NEW_USER } else { QSPipelineLogger.TileDestroyedReason.TILE_REMOVED - } + }, ) (entry.value as TileOrNotInstalled.Tile).tile.destroy() } @@ -245,7 +248,7 @@ constructor( tileSpec, specsToTiles.getValue(tileSpec), userChanged, - newUser + newUser, ) ?: createTile(tileSpec) } else { createTile(tileSpec) @@ -268,7 +271,7 @@ constructor( _currentSpecsAndTiles.value = newResolvedTiles logger.logTilesNotInstalled( newTileMap.filter { it.value is TileOrNotInstalled.NotInstalled }.keys, - newUser + newUser, ) if (newResolvedTiles.size < minTiles) { // We ended up with not enough tiles (some may be not installed). @@ -317,6 +320,10 @@ constructor( } } + override fun resetTiles() { + scope.launch { tileSpecRepository.resetToDefault(currentUser.value) } + } + override fun dump(pw: PrintWriter, args: Array) { pw.println("CurrentTileInteractorImpl:") pw.println("User: ${userId.value}") @@ -384,7 +391,7 @@ constructor( !qsTile.isAvailable -> { logger.logTileDestroyed( tileSpec, - QSPipelineLogger.TileDestroyedReason.EXISTING_TILE_NOT_AVAILABLE + QSPipelineLogger.TileDestroyedReason.EXISTING_TILE_NOT_AVAILABLE, ) qsTile.destroy() null @@ -409,7 +416,7 @@ constructor( qsTile.destroy() logger.logTileDestroyed( tileSpec, - QSPipelineLogger.TileDestroyedReason.CUSTOM_TILE_USER_CHANGED + QSPipelineLogger.TileDestroyedReason.CUSTOM_TILE_USER_CHANGED, ) null } @@ -428,7 +435,7 @@ constructor( private data class UserTilesAndComponents( val userId: Int, val tiles: List, - val installedComponents: Set + val installedComponents: Set, ) private data class DataWithUserChange( @@ -439,9 +446,4 @@ private data class DataWithUserChange( ) private fun DataWithUserChange(data: UserTilesAndComponents, userChange: Boolean) = - DataWithUserChange( - data.userId, - data.tiles, - data.installedComponents, - userChange, - ) + DataWithUserChange(data.userId, data.tiles, data.installedComponents, userChange) diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt index 8d060e936cd9..8a6df1cbb4de 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/DragAndDropTest.kt @@ -67,6 +67,8 @@ class DragAndDropTest : SysuiTestCase() { onRemoveTile = {}, onSetTiles = onSetTiles, onResize = { _, _ -> }, + onStopEditing = {}, + onReset = null, ) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt index ee1c0e99d6ac..d9c1d998798c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/qs/panels/ui/compose/ResizingTest.kt @@ -66,6 +66,8 @@ class ResizingTest : SysuiTestCase() { onRemoveTile = {}, onSetTiles = {}, onResize = onResize, + onStopEditing = {}, + onReset = null, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorFactoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorFactoryKosmos.kt new file mode 100644 index 000000000000..a5fe8cfba37d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/DynamicIconTilesInteractorFactoryKosmos.kt @@ -0,0 +1,29 @@ +/* + * 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.qs.panels.domain.interactor + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor + +val Kosmos.dynamicIconTilesInteractorFactory by + Kosmos.Fixture { + object : DynamicIconTilesInteractor.Factory { + override fun create(): DynamicIconTilesInteractor { + return DynamicIconTilesInteractor(iconTilesInteractor, currentTilesInteractor) + } + } + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt index b4317ad71efd..b6b0a4168c5d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt @@ -19,10 +19,7 @@ package com.android.systemui.qs.panels.domain.interactor import com.android.systemui.kosmos.Kosmos import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel -import com.android.systemui.qs.panels.ui.viewmodel.qsColumnsViewModel -import com.android.systemui.qs.panels.ui.viewmodel.tileSquishinessViewModel +import com.android.systemui.qs.panels.ui.viewmodel.infiniteGridViewModelFactory val Kosmos.infiniteGridLayout by - Kosmos.Fixture { - InfiniteGridLayout(iconTilesViewModel, qsColumnsViewModel, tileSquishinessViewModel) - } + Kosmos.Fixture { InfiniteGridLayout(iconTilesViewModel, infiniteGridViewModelFactory) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorKosmos.kt new file mode 100644 index 000000000000..70bf9bb9ee26 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/SizedTilesResetInteractorKosmos.kt @@ -0,0 +1,26 @@ +/* + * 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.qs.panels.domain.interactor + +import com.android.internal.logging.uiEventLogger +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.pipeline.domain.interactor.currentTilesInteractor + +val Kosmos.sizedTilesResetInteractor by + Kosmos.Fixture { + SizedTilesResetInteractor(currentTilesInteractor, iconTilesInteractor, uiEventLogger) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegateKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegateKosmos.kt new file mode 100644 index 000000000000..c58d55edd9e6 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/dialog/QSResetDialogDelegateKosmos.kt @@ -0,0 +1,24 @@ +/* + * 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.qs.panels.ui.dialog + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.panels.domain.interactor.sizedTilesResetInteractor +import com.android.systemui.statusbar.phone.systemUIDialogFactory + +val Kosmos.qsResetDialogDelegateKosmos by + Kosmos.Fixture { QSResetDialogDelegate(systemUIDialogFactory, sizedTilesResetInteractor) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModelKosmosFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModelKosmosFactory.kt new file mode 100644 index 000000000000..d18528766414 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/DynamicIconTilesViewModelKosmosFactory.kt @@ -0,0 +1,32 @@ +/* + * 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.qs.panels.ui.viewmodel + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.panels.domain.interactor.dynamicIconTilesInteractorFactory + +val Kosmos.dynamicIconTilesViewModelFactory by + Kosmos.Fixture { + object : DynamicIconTilesViewModel.Factory { + override fun create(): DynamicIconTilesViewModel { + return DynamicIconTilesViewModel( + dynamicIconTilesInteractorFactory, + iconTilesViewModel, + ) + } + } + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModelKosmos.kt new file mode 100644 index 000000000000..7613ea31c622 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/InfiniteGridViewModelKosmos.kt @@ -0,0 +1,34 @@ +/* + * 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.qs.panels.ui.viewmodel + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.panels.ui.dialog.qsResetDialogDelegateKosmos + +val Kosmos.infiniteGridViewModelFactory by + Kosmos.Fixture { + object : InfiniteGridViewModel.Factory { + override fun create(): InfiniteGridViewModel { + return InfiniteGridViewModel( + dynamicIconTilesViewModelFactory, + qsColumnsViewModel, + tileSquishinessViewModel, + qsResetDialogDelegateKosmos, + ) + } + } + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt index a9cce6912f15..1c69eab9602e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/pipeline/data/repository/FakeTileSpecRepository.kt @@ -63,7 +63,7 @@ class FakeTileSpecRepository( override suspend fun reconcileRestore( restoreData: RestoreData, - currentAutoAdded: Set + currentAutoAdded: Set, ) { with(getFlow(restoreData.userId)) { value = UserTileSpecRepository.reconcileTiles(value, currentAutoAdded, restoreData) @@ -73,4 +73,8 @@ class FakeTileSpecRepository( override suspend fun prependDefault(userId: Int) { with(getFlow(userId)) { value = defaultTilesRepository.defaultTiles + value } } + + override suspend fun resetToDefault(userId: Int) { + with(getFlow(userId)) { value = defaultTilesRepository.defaultTiles } + } } -- GitLab From 47f6e9098792045be9f663aed9fd23e1b6418b13 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Mon, 21 Oct 2024 14:09:19 +0200 Subject: [PATCH 116/459] Revert "PriorityNestedScrollConnection: make onStop suspendable and add onCancel" This reverts commit 5a8343368f5af8c42fb49417514f59210adb6484. Reason for revert: causes a crash [1] [1] https://paste.googleplex.com/6223827163152384 Change-Id: I61376765490df4de205d9861c4ae7b89fc1edbbb --- ...NotificationScrimNestedScrollConnection.kt | 10 ++----- ...NotificationStackNestedScrollConnection.kt | 3 +- .../animation/scene/DraggableHandler.kt | 19 ++++-------- .../compose/animation/scene/SwipeAnimation.kt | 1 + .../LargeTopAppBarNestedScrollConnection.kt | 3 +- .../PriorityNestedScrollConnection.kt | 29 ++++--------------- .../animation/scene/DraggableHandlerTest.kt | 1 + .../scene/MultiPointerDraggableTest.kt | 1 + .../PriorityNestedScrollConnectionTest.kt | 14 ++++----- 9 files changed, 24 insertions(+), 57 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt index e4c60e166fd5..779934d8d211 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt @@ -73,19 +73,13 @@ fun NotificationScrimNestedScrollConnection( snapScrimOffset(currentHeight + amountConsumed) amountConsumed }, + // Don't consume the velocity on pre/post fling onStop = { velocityAvailable -> onStop(velocityAvailable) if (scrimOffset() < minScrimOffset()) { animateScrimOffset(minScrimOffset()) } - // Don't consume the velocity on pre/post fling - 0f - }, - onCancel = { - onStop(0f) - if (scrimOffset() < minScrimOffset()) { - animateScrimOffset(minScrimOffset()) - } + { 0f } }, ) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt index edb05ebd77d1..42dd1be51d44 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt @@ -104,8 +104,7 @@ fun NotificationStackNestedScrollConnection( }, onStop = { velocityAvailable -> onStop(velocityAvailable) - velocityAvailable + suspend { velocityAvailable } }, - onCancel = { onStop(0f) }, ) } 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 9f99c372e2a8..03fa971f332d 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 @@ -27,10 +27,9 @@ import com.android.compose.animation.scene.content.Content import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified import com.android.compose.nestedscroll.PriorityNestedScrollConnection +import com.android.compose.nestedscroll.SuspendedValue import kotlin.math.absoluteValue -internal typealias SuspendedValue = suspend () -> T - internal interface DraggableHandler { /** * Start a drag in the given [startedPosition], with the given [overSlop] and number of @@ -735,18 +734,10 @@ internal class NestedScrollHandlerImpl( }, onStop = { velocityAvailable -> val controller = dragController ?: error("Should be called after onStart") - try { - controller - .onStop(velocity = velocityAvailable, canChangeContent = canChangeScene) - .invoke() - } finally { - dragController = null - } - }, - onCancel = { - val controller = dragController ?: error("Should be called after onStart") - controller.onStop(velocity = 0f, canChangeContent = canChangeScene) - dragController = null + + controller + .onStop(velocity = velocityAvailable, canChangeContent = canChangeScene) + .also { dragController = null } }, ) } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt index f0043e1e89b0..205267da151a 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt @@ -27,6 +27,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.unit.IntSize import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified +import com.android.compose.nestedscroll.SuspendedValue import kotlin.math.absoluteValue import kotlinx.coroutines.CompletableDeferred diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt index ecf64b771d1f..b05f02224327 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt @@ -70,7 +70,6 @@ fun LargeTopAppBarNestedScrollConnection( amountConsumed }, // Don't consume the velocity on pre/post fling - onStop = { 0f }, - onCancel = { /* do nothing */ }, + onStop = { { 0f } }, ) } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt index 636c55799ff2..e3cddc1a8f1d 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt @@ -16,21 +16,15 @@ package com.android.compose.nestedscroll -import androidx.compose.animation.core.AnimationState -import androidx.compose.animation.core.DecayAnimationSpec -import androidx.compose.animation.core.animateDecay import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import com.android.compose.ui.util.SpaceVectorConverter -import kotlin.math.abs import kotlin.math.sign -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.async -import kotlinx.coroutines.coroutineScope + +internal typealias SuspendedValue = suspend () -> T /** * A [NestedScrollConnection] that intercepts scroll events in priority mode. @@ -53,7 +47,6 @@ import kotlinx.coroutines.coroutineScope * consumed amount. * @param onStop lambda that is called when the connection stops consuming scroll events and returns * the consumed velocity. - * @param onCancel lambda that is called when the connection is cancelled. * @sample LargeTopAppBarNestedScrollConnection * @sample com.android.compose.animation.scene.NestedScrollHandlerImpl.nestedScrollConnection */ @@ -67,8 +60,7 @@ class PriorityNestedScrollConnection( private val canStopOnPreFling: () -> Boolean, private val onStart: (offsetAvailable: Float) -> Unit, private val onScroll: (offsetAvailable: Float, source: NestedScrollSource) -> Float, - private val onStop: suspend (velocityAvailable: Float) -> Float, - private val onCancel: () -> Unit, + private val onStop: (velocityAvailable: Float) -> SuspendedValue, ) : NestedScrollConnection, SpaceVectorConverter by SpaceVectorConverter(orientation) { /** In priority mode [onPreScroll] events are first consumed by the parent, via [onScroll]. */ @@ -76,9 +68,6 @@ class PriorityNestedScrollConnection( private var offsetScrolledBeforePriorityMode = 0f - /** This job allows us to interrupt the onStop animation */ - private var onStopJob: Deferred = CompletableDeferred(0f) - override fun onPostScroll( consumed: Offset, available: Offset, @@ -159,7 +148,7 @@ class PriorityNestedScrollConnection( */ fun reset() { if (isPriorityMode) { - // Step 3c: To ensure that an onStop (or onCancel) is always called for every onStart. + // Step 3c: To ensure that an onStop is always called for every onStart. cancel() } else { resetOffsetTracker() @@ -183,8 +172,6 @@ class PriorityNestedScrollConnection( // available offset following a scroll event. isPriorityMode = true - onStopJob.cancel() - // Note: onStop will be called if we cannot continue to scroll (step 3a), or the finger is // lifted (step 3b), or this object has been destroyed (step 3c). onStart(availableOffset) @@ -217,17 +204,13 @@ class PriorityNestedScrollConnection( check(isPriorityMode) { "This should never happen, stop() was called before start()" } isPriorityMode = false resetOffsetTracker() - - return coroutineScope { - onStopJob = async { onStop(velocityAvailable) } - onStopJob.await() - } + return onStop(velocityAvailable).invoke() } private fun cancel() { check(isPriorityMode) { "This should never happen, cancel() was called before start()" } isPriorityMode = false resetOffsetTracker() - onCancel() + onStop(0f) } } 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 339445e3483a..fd0214823eaf 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 @@ -39,6 +39,7 @@ import com.android.compose.animation.scene.TestScenes.SceneC import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.Transition import com.android.compose.animation.scene.subjects.assertThat +import com.android.compose.nestedscroll.SuspendedValue import com.android.compose.test.MonotonicClockTestScope import com.android.compose.test.runMonotonicClockTest import com.android.compose.test.transition diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt index 3df608717414..c8f6e6d99933 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt @@ -46,6 +46,7 @@ import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Velocity import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.compose.modifiers.thenIf +import com.android.compose.nestedscroll.SuspendedValue import com.google.common.truth.Truth.assertThat import kotlin.properties.Delegates import kotlinx.coroutines.coroutineScope diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt index 1a3b86b936df..9363ecbf63dc 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt @@ -39,7 +39,6 @@ class PriorityNestedScrollConnectionTest { private var lastScroll: Float? = null private var consumeScroll = true private var lastStop: Float? = null - private var isCancelled: Boolean = false private var consumeStop = true private val scrollConnection = @@ -56,9 +55,8 @@ class PriorityNestedScrollConnectionTest { }, onStop = { lastStop = it - if (consumeStop) it else 0f + { if (consumeStop) it else 0f } }, - onCancel = { isCancelled = true }, ) @Test @@ -149,13 +147,13 @@ class PriorityNestedScrollConnectionTest { } @Test - fun step3a_onPriorityMode_shouldCancelIfCannotContinue() { + fun step3a_onPriorityMode_shouldStopIfCannotContinue() { startPriorityModePostScroll() consumeScroll = false - scrollConnection.onPreScroll(available = Offset(0f, 1f), source = UserInput) + scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput) - assertThat(isCancelled).isTrue() + assertThat(lastStop).isNotNull() } @Test @@ -180,12 +178,12 @@ class PriorityNestedScrollConnectionTest { } @Test - fun step3c_onPriorityMode_shouldCancelOnReset() { + fun step3c_onPriorityMode_shouldStopOnReset() { startPriorityModePostScroll() scrollConnection.reset() - assertThat(isCancelled).isTrue() + assertThat(lastStop).isNotNull() } @Test -- GitLab From 7f60633a61a30bf859f63e8c7e9eac26ddc67d70 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Mon, 21 Oct 2024 14:09:24 +0200 Subject: [PATCH 117/459] Revert "Simplify PriorityNestedScrollConnection" This reverts commit 40c5c2310e87c5b998d0263967cc89e230be7074. Reason for revert: Causes weird gesture issues; single swipes could now trigger multiple vertical + horizontal transitions. Change-Id: I16f37ace7b436fb2502f476ea83c1421933d5860 --- ...NotificationScrimNestedScrollConnection.kt | 18 ++- ...NotificationStackNestedScrollConnection.kt | 18 +-- .../animation/scene/DraggableHandler.kt | 9 +- .../LargeTopAppBarNestedScrollConnection.kt | 18 ++- .../PriorityNestedScrollConnection.kt | 150 +++++++----------- .../PriorityNestedScrollConnectionTest.kt | 53 +++---- ...ficationScrimNestedScrollConnectionTest.kt | 11 +- 7 files changed, 112 insertions(+), 165 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt index 779934d8d211..8b9e9274b448 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt @@ -18,8 +18,6 @@ package com.android.systemui.notifications.ui.composable import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.util.fastCoerceAtLeast -import androidx.compose.ui.util.fastCoerceAtMost import com.android.compose.nestedscroll.PriorityNestedScrollConnection /** @@ -46,7 +44,7 @@ fun NotificationScrimNestedScrollConnection( orientation = Orientation.Vertical, // scrolling up and inner content is taller than the scrim, so scrim needs to // expand; content can scroll once scrim is at the minScrimOffset. - canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart -> offsetAvailable < 0 && offsetBeforeStart == 0f && contentHeight() > minVisibleScrimHeight() && @@ -54,21 +52,25 @@ fun NotificationScrimNestedScrollConnection( }, // scrolling down and content is done scrolling to top. After that, the scrim // needs to collapse; collapse the scrim until it is at the maxScrimOffset. - canStartPostScroll = { offsetAvailable, _, _ -> + canStartPostScroll = { offsetAvailable, _ -> offsetAvailable > 0 && (scrimOffset() < maxScrimOffset || isCurrentGestureOverscroll()) }, canStartPostFling = { false }, - canStopOnPreFling = { false }, + canContinueScroll = { + val currentHeight = scrimOffset() + minScrimOffset() < currentHeight && currentHeight < maxScrimOffset + }, + canScrollOnFling = true, onStart = { offsetAvailable -> onStart(offsetAvailable) }, - onScroll = { offsetAvailable, _ -> + onScroll = { offsetAvailable -> val currentHeight = scrimOffset() val amountConsumed = if (offsetAvailable > 0) { val amountLeft = maxScrimOffset - currentHeight - offsetAvailable.fastCoerceAtMost(amountLeft) + offsetAvailable.coerceAtMost(amountLeft) } else { val amountLeft = minScrimOffset() - currentHeight - offsetAvailable.fastCoerceAtLeast(amountLeft) + offsetAvailable.coerceAtLeast(amountLeft) } snapScrimOffset(currentHeight + amountConsumed) amountConsumed diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt index 42dd1be51d44..a706585deebc 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt @@ -28,7 +28,6 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp -import androidx.compose.ui.util.fastCoerceAtLeast import com.android.compose.nestedscroll.PriorityNestedScrollConnection import kotlin.math.max import kotlin.math.roundToInt @@ -87,20 +86,17 @@ fun NotificationStackNestedScrollConnection( ): PriorityNestedScrollConnection { return PriorityNestedScrollConnection( orientation = Orientation.Vertical, - canStartPreScroll = { _, _, _ -> false }, - canStartPostScroll = { offsetAvailable, offsetBeforeStart, _ -> + canStartPreScroll = { _, _ -> false }, + canStartPostScroll = { offsetAvailable, offsetBeforeStart -> offsetAvailable < 0f && offsetBeforeStart < 0f && !canScrollForward() }, canStartPostFling = { velocityAvailable -> velocityAvailable < 0f && !canScrollForward() }, - canStopOnPreFling = { false }, + canContinueScroll = { stackOffset() > 0f }, + canScrollOnFling = true, onStart = { offsetAvailable -> onStart(offsetAvailable) }, - onScroll = { offsetAvailable, _ -> - val minOffset = 0f - val consumed = offsetAvailable.fastCoerceAtLeast(minOffset - stackOffset()) - if (consumed != 0f) { - onScroll(consumed) - } - consumed + onScroll = { offsetAvailable -> + onScroll(offsetAvailable) + offsetAvailable }, onStop = { velocityAvailable -> onStop(velocityAvailable) 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 03fa971f332d..e5ef79b37b88 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 @@ -612,7 +612,7 @@ internal class NestedScrollHandlerImpl( return PriorityNestedScrollConnection( orientation = orientation, - canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart -> canChangeScene = if (isExternalOverscrollGesture()) false else offsetBeforeStart == 0f @@ -644,7 +644,7 @@ internal class NestedScrollHandlerImpl( isIntercepting = true true }, - canStartPostScroll = { offsetAvailable, offsetBeforeStart, _ -> + canStartPostScroll = { offsetAvailable, offsetBeforeStart -> val behavior: NestedScrollBehavior = when { offsetAvailable > 0f -> topOrLeftBehavior @@ -709,7 +709,8 @@ internal class NestedScrollHandlerImpl( canStart }, - canStopOnPreFling = { true }, + canContinueScroll = { true }, + canScrollOnFling = false, onStart = { offsetAvailable -> val pointersInfo = pointersInfo() dragController = @@ -719,7 +720,7 @@ internal class NestedScrollHandlerImpl( overSlop = if (isIntercepting) 0f else offsetAvailable, ) }, - onScroll = { offsetAvailable, _ -> + onScroll = { offsetAvailable -> val controller = dragController ?: error("Should be called after onStart") val pointersInfo = pointersInfoOwner.pointersInfo() diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt index b05f02224327..4ae323517b26 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt @@ -18,8 +18,6 @@ package com.android.compose.nestedscroll import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.input.nestedscroll.NestedScrollConnection -import androidx.compose.ui.util.fastCoerceAtLeast -import androidx.compose.ui.util.fastCoerceAtMost /** * A [NestedScrollConnection] that listens for all vertical scroll events and responds in the @@ -45,26 +43,30 @@ fun LargeTopAppBarNestedScrollConnection( orientation = Orientation.Vertical, // When swiping up, the LargeTopAppBar will shrink (to [minHeight]) and the content will // expand. Then, you can then scroll down the content. - canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart -> offsetAvailable < 0 && offsetBeforeStart == 0f && height() > minHeight() }, // When swiping down, the content will scroll up until it reaches the top. Then, the // LargeTopAppBar will expand until it reaches its [maxHeight]. - canStartPostScroll = { offsetAvailable, _, _ -> + canStartPostScroll = { offsetAvailable, _ -> offsetAvailable > 0 && height() < maxHeight() }, canStartPostFling = { false }, - canStopOnPreFling = { false }, + canContinueScroll = { + val currentHeight = height() + minHeight() < currentHeight && currentHeight < maxHeight() + }, + canScrollOnFling = true, onStart = { /* do nothing */ }, - onScroll = { offsetAvailable, _ -> + onScroll = { offsetAvailable -> val currentHeight = height() val amountConsumed = if (offsetAvailable > 0) { val amountLeft = maxHeight() - currentHeight - offsetAvailable.fastCoerceAtMost(amountLeft) + offsetAvailable.coerceAtMost(amountLeft) } else { val amountLeft = minHeight() - currentHeight - offsetAvailable.fastCoerceAtLeast(amountLeft) + offsetAvailable.coerceAtLeast(amountLeft) } onHeightChanged(currentHeight + amountConsumed) amountConsumed diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt index e3cddc1a8f1d..a3641e6635e7 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt @@ -27,39 +27,25 @@ import kotlin.math.sign internal typealias SuspendedValue = suspend () -> T /** - * A [NestedScrollConnection] that intercepts scroll events in priority mode. + * This [NestedScrollConnection] waits for a child to scroll ([onPreScroll] or [onPostScroll]), and + * then decides (via [canStartPreScroll] or [canStartPostScroll]) if it should take over scrolling. + * If it does, it will scroll before its children, until [canContinueScroll] allows it. * - * Priority mode allows this connection to take control over scroll events within a nested scroll - * hierarchy. When in priority mode, this connection consumes scroll events before its children, - * enabling custom scrolling behaviors like sticky headers. + * Note: Call [reset] before destroying this object to make sure you always get a call to [onStop] + * after [onStart]. * - * @param orientation The orientation of the scroll. - * @param canStartPreScroll lambda that returns true if the connection can start consuming scroll - * events in pre-scroll mode. - * @param canStartPostScroll lambda that returns true if the connection can start consuming scroll - * events in post-scroll mode. - * @param canStartPostFling lambda that returns true if the connection can start consuming scroll - * events in post-fling mode. - * @param canStopOnPreFling lambda that returns true if the connection can stop consuming scroll - * events in pre-fling (i.e. as soon as the user lifts their fingers). - * @param onStart lambda that is called when the connection starts consuming scroll events. - * @param onScroll lambda that is called when the connection consumes a scroll event and returns the - * consumed amount. - * @param onStop lambda that is called when the connection stops consuming scroll events and returns - * the consumed velocity. * @sample LargeTopAppBarNestedScrollConnection * @sample com.android.compose.animation.scene.NestedScrollHandlerImpl.nestedScrollConnection */ class PriorityNestedScrollConnection( orientation: Orientation, - private val canStartPreScroll: - (offsetAvailable: Float, offsetBeforeStart: Float, source: NestedScrollSource) -> Boolean, - private val canStartPostScroll: - (offsetAvailable: Float, offsetBeforeStart: Float, source: NestedScrollSource) -> Boolean, + private val canStartPreScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean, + private val canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean, private val canStartPostFling: (velocityAvailable: Float) -> Boolean, - private val canStopOnPreFling: () -> Boolean, + private val canContinueScroll: (source: NestedScrollSource) -> Boolean, + private val canScrollOnFling: Boolean, private val onStart: (offsetAvailable: Float) -> Unit, - private val onScroll: (offsetAvailable: Float, source: NestedScrollSource) -> Float, + private val onScroll: (offsetAvailable: Float) -> Float, private val onStop: (velocityAvailable: Float) -> SuspendedValue, ) : NestedScrollConnection, SpaceVectorConverter by SpaceVectorConverter(orientation) { @@ -78,48 +64,62 @@ class PriorityNestedScrollConnection( // the beginning or from the last fling gesture. val offsetBeforeStart = offsetScrolledBeforePriorityMode - availableFloat - if (isPriorityMode || !canStartPostScroll(availableFloat, offsetBeforeStart, source)) { + if ( + isPriorityMode || + (source == NestedScrollSource.SideEffect && !canScrollOnFling) || + !canStartPostScroll(availableFloat, offsetBeforeStart) + ) { // The priority mode cannot start so we won't consume the available offset. return Offset.Zero } - return start(availableFloat, source).toOffset() + return onPriorityStart(availableFloat).toOffset() } override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { if (!isPriorityMode) { - val availableFloat = available.toFloat() - if (canStartPreScroll(availableFloat, offsetScrolledBeforePriorityMode, source)) { - return start(availableFloat, source).toOffset() + if (source == NestedScrollSource.UserInput || canScrollOnFling) { + val availableFloat = available.toFloat() + if (canStartPreScroll(availableFloat, offsetScrolledBeforePriorityMode)) { + return onPriorityStart(availableFloat).toOffset() + } + // We want to track the amount of offset consumed before entering priority mode + offsetScrolledBeforePriorityMode += availableFloat } + + return Offset.Zero + } + + val availableFloat = available.toFloat() + if (!canContinueScroll(source)) { + // Step 3a: We have lost priority and we no longer need to intercept scroll events. + onPriorityStop(velocity = 0f) + + // We've just reset offsetScrolledBeforePriorityMode to 0f // We want to track the amount of offset consumed before entering priority mode offsetScrolledBeforePriorityMode += availableFloat + return Offset.Zero } - return scroll(available.toFloat(), source).toOffset() + // Step 2: We have the priority and can consume the scroll events. + return onScroll(availableFloat).toOffset() } override suspend fun onPreFling(available: Velocity): Velocity { - if (!isPriorityMode) { - resetOffsetTracker() + if (isPriorityMode && canScrollOnFling) { + // We don't want to consume the velocity, we prefer to continue receiving scroll events. return Velocity.Zero } - - if (canStopOnPreFling()) { - // Step 3b: The finger is lifted, we can stop intercepting scroll events and use the - // velocity of the fling gesture. - return stop(velocityAvailable = available.toFloat()).toVelocity() - } - - // We don't want to consume the velocity, we prefer to continue receiving scroll events. - return Velocity.Zero + // Step 3b: The finger is lifted, we can stop intercepting scroll events and use the speed + // of the fling gesture. + return onPriorityStop(velocity = available.toFloat()).invoke().toVelocity() } override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { val availableFloat = available.toFloat() if (isPriorityMode) { - return stop(velocityAvailable = availableFloat).toVelocity() + return onPriorityStop(velocity = availableFloat).invoke().toVelocity() } if (!canStartPostFling(availableFloat)) { @@ -131,14 +131,10 @@ class PriorityNestedScrollConnection( // TODO(b/291053278): Remove canStartPostFling() and instead make it possible to define the // overscroll behavior on the Scene level. val smallOffset = availableFloat.sign - start( - availableOffset = smallOffset, - source = NestedScrollSource.SideEffect, - skipScroll = true, - ) + onPriorityStart(availableOffset = smallOffset) // This is the last event of a scroll gesture. - return stop(availableFloat).toVelocity() + return onPriorityStop(availableFloat).invoke().toVelocity() } /** @@ -147,25 +143,13 @@ class PriorityNestedScrollConnection( * TODO(b/303224944) This method should be removed. */ fun reset() { - if (isPriorityMode) { - // Step 3c: To ensure that an onStop is always called for every onStart. - cancel() - } else { - resetOffsetTracker() - } - } - - private fun shouldStop(consumed: Float): Boolean { - return consumed == 0f + // Step 3c: To ensure that an onStop is always called for every onStart. + onPriorityStop(velocity = 0f) } - private fun start( - availableOffset: Float, - source: NestedScrollSource, - skipScroll: Boolean = false, - ): Float { - check(!isPriorityMode) { - "This should never happen, start() was called when isPriorityMode" + private fun onPriorityStart(availableOffset: Float): Float { + if (isPriorityMode) { + error("This should never happen, onPriorityStart() was called when isPriorityMode") } // Step 1: It's our turn! We start capturing scroll events when one of our children has an @@ -176,41 +160,19 @@ class PriorityNestedScrollConnection( // lifted (step 3b), or this object has been destroyed (step 3c). onStart(availableOffset) - return if (skipScroll) 0f else scroll(availableOffset, source) + return onScroll(availableOffset) } - private fun scroll(offsetAvailable: Float, source: NestedScrollSource): Float { - // Step 2: We have the priority and can consume the scroll events. - val consumedByScroll = onScroll(offsetAvailable, source) - - if (shouldStop(consumedByScroll)) { - // Step 3a: We have lost priority and we no longer need to intercept scroll events. - cancel() + private fun onPriorityStop(velocity: Float): SuspendedValue { + // We can restart tracking the consumed offsets from scratch. + offsetScrolledBeforePriorityMode = 0f - // We've just reset offsetScrolledBeforePriorityMode to 0f - // We want to track the amount of offset consumed before entering priority mode - offsetScrolledBeforePriorityMode += offsetAvailable - consumedByScroll + if (!isPriorityMode) { + return { 0f } } - return consumedByScroll - } - - /** Reset the tracking of consumed offsets before entering in priority mode. */ - private fun resetOffsetTracker() { - offsetScrolledBeforePriorityMode = 0f - } - - private suspend fun stop(velocityAvailable: Float): Float { - check(isPriorityMode) { "This should never happen, stop() was called before start()" } isPriorityMode = false - resetOffsetTracker() - return onStop(velocityAvailable).invoke() - } - private fun cancel() { - check(isPriorityMode) { "This should never happen, cancel() was called before start()" } - isPriorityMode = false - resetOffsetTracker() - onStop(0f) + return onStop(velocity) } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt index 9363ecbf63dc..badc43bd3e0f 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt @@ -34,28 +34,29 @@ class PriorityNestedScrollConnectionTest { private var canStartPreScroll = false private var canStartPostScroll = false private var canStartPostFling = false - private var canStopOnPreFling = true + private var canContinueScroll = false private var isStarted = false private var lastScroll: Float? = null - private var consumeScroll = true + private var returnOnScroll = 0f private var lastStop: Float? = null - private var consumeStop = true + private var returnOnStop = 0f private val scrollConnection = PriorityNestedScrollConnection( orientation = Orientation.Vertical, - canStartPreScroll = { _, _, _ -> canStartPreScroll }, - canStartPostScroll = { _, _, _ -> canStartPostScroll }, + canStartPreScroll = { _, _ -> canStartPreScroll }, + canStartPostScroll = { _, _ -> canStartPostScroll }, canStartPostFling = { canStartPostFling }, - canStopOnPreFling = { canStopOnPreFling }, + canContinueScroll = { canContinueScroll }, + canScrollOnFling = false, onStart = { isStarted = true }, - onScroll = { offsetAvailable, _ -> - lastScroll = offsetAvailable - if (consumeScroll) offsetAvailable else 0f + onScroll = { + lastScroll = it + returnOnScroll }, onStop = { lastStop = it - { if (consumeStop) it else 0f } + { returnOnStop } }, ) @@ -84,7 +85,7 @@ class PriorityNestedScrollConnectionTest { canStartPostScroll = true scrollConnection.onPostScroll( consumed = Offset.Zero, - available = Offset(1f, 1f), + available = Offset.Zero, source = UserInput, ) } @@ -135,21 +136,21 @@ class PriorityNestedScrollConnectionTest { @Test fun step2_onPriorityMode_shouldContinueIfAllowed() { startPriorityModePostScroll() + canContinueScroll = true - val scroll1 = scrollConnection.onPreScroll(available = Offset(0f, 1f), source = UserInput) + scrollConnection.onPreScroll(available = Offset(1f, 1f), source = UserInput) assertThat(lastScroll).isEqualTo(1f) - assertThat(scroll1.y).isEqualTo(1f) - consumeScroll = false - val scroll2 = scrollConnection.onPreScroll(available = Offset(0f, 2f), source = UserInput) - assertThat(lastScroll).isEqualTo(2f) - assertThat(scroll2.y).isEqualTo(0f) + canContinueScroll = false + scrollConnection.onPreScroll(available = Offset(2f, 2f), source = UserInput) + assertThat(lastScroll).isNotEqualTo(2f) + assertThat(lastScroll).isEqualTo(1f) } @Test fun step3a_onPriorityMode_shouldStopIfCannotContinue() { startPriorityModePostScroll() - consumeScroll = false + canContinueScroll = false scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput) @@ -159,27 +160,17 @@ class PriorityNestedScrollConnectionTest { @Test fun step3b_onPriorityMode_shouldStopOnFling() = runTest { startPriorityModePostScroll() + canContinueScroll = true scrollConnection.onPreFling(available = Velocity.Zero) - assertThat(lastStop).isEqualTo(0f) - } - - @Test - fun ifCannotStopOnPreFling_shouldStopOnPostFling() = runTest { - startPriorityModePostScroll() - canStopOnPreFling = false - - scrollConnection.onPreFling(available = Velocity.Zero) - assertThat(lastStop).isNull() - - scrollConnection.onPostFling(consumed = Velocity.Zero, available = Velocity.Zero) - assertThat(lastStop).isEqualTo(0f) + assertThat(lastStop).isNotNull() } @Test fun step3c_onPriorityMode_shouldStopOnReset() { startPriorityModePostScroll() + canContinueScroll = true scrollConnection.reset() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt index 75479ad35725..1f1680e0c273 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt @@ -31,7 +31,6 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { private var isStarted = false - private var wasStarted = false private var scrimOffset = 0f private var contentHeight = 0f private var isCurrentGestureOverscroll = false @@ -47,10 +46,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { minVisibleScrimHeight = { MIN_VISIBLE_SCRIM_HEIGHT }, isCurrentGestureOverscroll = { isCurrentGestureOverscroll }, onStart = { isStarted = true }, - onStop = { - wasStarted = true - isStarted = false - }, + onStop = { isStarted = false }, ) @Test @@ -169,7 +165,6 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) - assertThat(wasStarted).isEqualTo(false) assertThat(isStarted).isEqualTo(false) } @@ -186,9 +181,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) - // Returning 0 offset will immediately stop the connection - assertThat(wasStarted).isEqualTo(true) - assertThat(isStarted).isEqualTo(false) + assertThat(isStarted).isEqualTo(true) } @Test -- GitLab From 11beddbf96d879ae68920fb6b582e84849cf8d70 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Tue, 15 Oct 2024 17:07:58 +0200 Subject: [PATCH 118/459] Add Transition.progressTo(ContentKey) This CL adds convenience method Transition.progressTo(), which I found can be useful when used together with isTransitioningFromOrTo() or isTransitioningBetween(). Bug: 373799480 Test: atest SceneTransitionLayoutStateTest Flag: com.android.systemui.scene_container Change-Id: I797fb1c69808d03ffb4b97fbfe2687819ede68bb --- .../scene/content/state/TransitionState.kt | 16 ++++++++++++++++ .../scene/SceneTransitionLayoutStateTest.kt | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt index 3bd59df16f12..7d29a68e3a8d 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/state/TransitionState.kt @@ -311,6 +311,22 @@ sealed interface TransitionState { return fromContent == content || toContent == content } + /** + * Return [progress] if [content] is equal to [toContent], `1f - progress` if [content] is + * equal to [fromContent], and throw otherwise. + */ + fun progressTo(content: ContentKey): Float { + return when (content) { + toContent -> progress + fromContent -> 1f - progress + else -> + throw IllegalArgumentException( + "content ($content) should be either toContent ($toContent) or " + + "fromContent ($fromContent)" + ) + } + } + /** Run this transition and return once it is finished. */ abstract suspend fun run() diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt index f5bb5ba032c2..a2b263b9f9ed 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/SceneTransitionLayoutStateTest.kt @@ -43,6 +43,7 @@ import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.consumeAsFlow import kotlinx.coroutines.launch import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertThrows import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -768,4 +769,12 @@ class SceneTransitionLayoutStateTest { assertThat(state.transitionState).isIdle() assertThat(state.transitionState).hasCurrentScene(SceneC) } + + @Test + fun transition_progressTo() { + val transition = transition(from = SceneA, to = SceneB, progress = { 0.2f }) + assertThat(transition.progressTo(SceneB)).isEqualTo(0.2f) + assertThat(transition.progressTo(SceneA)).isEqualTo(1f - 0.2f) + assertThrows(IllegalArgumentException::class.java) { transition.progressTo(SceneC) } + } } -- GitLab From 669d20abf9da3ea7ecb5977f08ae860d05126f72 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Tue, 15 Oct 2024 17:35:21 +0200 Subject: [PATCH 119/459] Use Transition.ReplaceOverlay.currentScene when getting placeholder size This CL fixes the logic for the placeholder size of movable elements during a ReplaceOverlay transition: we now use the size of the current scene if the other scene never contained that element. Bug: 373799480 Test: atest MovableElementTest Flag: com.android.systemui.scene_container Change-Id: Idc7501e80b8aa0f3cf6e7b6df424d2825cd5b737 --- .../compose/animation/scene/MovableElement.kt | 10 +- .../animation/scene/MovableElementTest.kt | 63 ++++++++++ .../test/TestReplaceOverlayTransition.kt | 109 ++++++++++++++++++ 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 packages/SystemUI/compose/scene/tests/src/com/android/compose/test/TestReplaceOverlayTransition.kt diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt index 6a5b7e103dbb..c790ff03aef1 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/MovableElement.kt @@ -241,6 +241,10 @@ private fun placeholderContentSize( return targetValueInScene } + fun TransitionState.Transition.otherContent(): ContentKey { + return if (fromContent == content) toContent else fromContent + } + // If the element content was already composed in the other overlay/scene, we use that // target size assuming it doesn't change between scenes. // TODO(b/317026105): Provide a way to give a hint size/content for cases where this is @@ -249,8 +253,10 @@ private fun placeholderContentSize( when (val state = movableElementState(elementKey, transitionStates)) { null -> return IntSize.Zero is TransitionState.Idle -> movableElementContentWhenIdle(layoutImpl, elementKey, state) - is TransitionState.Transition -> - if (state.fromContent == content) state.toContent else state.fromContent + is TransitionState.Transition.ReplaceOverlay -> { + state.otherContent().takeIf { it in element.stateByContent } ?: state.currentScene + } + is TransitionState.Transition -> state.otherContent() } val targetValueInOtherContent = element.stateByContent[otherContent]?.targetSize diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt index e57702c045c6..09b59394724d 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MovableElementTest.kt @@ -43,12 +43,17 @@ import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.compose.ui.unit.dp import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.android.compose.animation.scene.TestOverlays.OverlayA +import com.android.compose.animation.scene.TestOverlays.OverlayB import com.android.compose.animation.scene.TestScenes.SceneA import com.android.compose.animation.scene.TestScenes.SceneB import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.subjects.assertThat import com.android.compose.test.assertSizeIsEqualTo +import com.android.compose.test.setContentAndCreateMainScope +import com.android.compose.test.transition import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.launch import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith @@ -341,4 +346,62 @@ class MovableElementTest { rule.onNodeWithTag("bottomEnd").assertPositionInRootIsEqualTo(200.dp, 200.dp) rule.onNodeWithTag("matchParentSize").assertSizeIsEqualTo(200.dp, 200.dp) } + + @Test + fun useCurrentSceneSizeForPlaceholderWhenReplacingOverlay() { + val foo = + MovableElementKey( + "foo", + + // Always compose foo in SceneA. + contentPicker = + object : StaticElementContentPicker { + override val contents: Set = setOf(SceneA, OverlayB) + + override fun contentDuringTransition( + element: ElementKey, + transition: TransitionState.Transition, + fromContentZIndex: Float, + toContentZIndex: Float, + ): ContentKey { + return SceneA + } + }, + ) + val fooSize = 50.dp + val fooParentInOverlayTag = "fooParentTagInOverlay" + + @Composable + fun SceneScope.Foo(modifier: Modifier = Modifier) { + // Foo wraps its content, so there is no way for STL to know its size in advance. + MovableElement(foo, modifier) { content { Box(Modifier.size(fooSize)) } } + } + + val state = + rule.runOnUiThread { + MutableSceneTransitionLayoutState( + initialScene = SceneA, + initialOverlays = setOf(OverlayA), + ) + } + + val scope = + rule.setContentAndCreateMainScope { + SceneTransitionLayout(state) { + scene(SceneA) { Box(Modifier.fillMaxSize()) { Foo() } } + overlay(OverlayA) { /* empty */ } + overlay(OverlayB) { Box(Modifier.testTag(fooParentInOverlayTag)) { Foo() } } + } + } + + // Start an overlay replace transition. + scope.launch { + state.startTransition(transition(from = OverlayA, to = OverlayB, progress = { 0.5f })) + } + + // The parent of foo should have a correct size in OverlayB even if Foo was never composed + // there by using the size information from SceneA. + rule.waitForIdle() + rule.onNodeWithTag(fooParentInOverlayTag).assertSizeIsEqualTo(fooSize) + } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/TestReplaceOverlayTransition.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/TestReplaceOverlayTransition.kt new file mode 100644 index 000000000000..c342f488212a --- /dev/null +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/test/TestReplaceOverlayTransition.kt @@ -0,0 +1,109 @@ +/* + * 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.compose.test + +import androidx.compose.foundation.gestures.Orientation +import com.android.compose.animation.scene.ContentKey +import com.android.compose.animation.scene.OverlayKey +import com.android.compose.animation.scene.SceneTransitionLayoutImpl +import com.android.compose.animation.scene.content.state.TransitionState +import com.android.compose.animation.scene.content.state.TransitionState.Transition +import kotlinx.coroutines.CompletableDeferred + +/** A [Transition.ShowOrHideOverlay] for tests that will be finished once [finish] is called. */ +abstract class TestReplaceOverlayTransition( + fromOverlay: OverlayKey, + toOverlay: OverlayKey, + replacedTransition: Transition?, +) : + Transition.ReplaceOverlay( + fromOverlay = fromOverlay, + toOverlay = toOverlay, + replacedTransition = replacedTransition, + ) { + private val finishCompletable = CompletableDeferred() + + override suspend fun run() { + finishCompletable.await() + } + + /** Finish this transition. */ + fun finish() { + finishCompletable.complete(Unit) + } +} + +/** A utility to easily create a [TestReplaceOverlayTransition] in tests. */ +fun transition( + from: OverlayKey, + to: OverlayKey, + effectivelyShownOverlay: () -> OverlayKey = { to }, + progress: () -> Float = { 0f }, + progressVelocity: () -> Float = { 0f }, + previewProgress: () -> Float = { 0f }, + previewProgressVelocity: () -> Float = { 0f }, + isInPreviewStage: () -> Boolean = { false }, + interruptionProgress: () -> Float = { 0f }, + isInitiatedByUserInput: Boolean = false, + isUserInputOngoing: Boolean = false, + isUpOrLeft: Boolean = false, + bouncingContent: ContentKey? = null, + orientation: Orientation = Orientation.Horizontal, + onFreezeAndAnimate: ((TestReplaceOverlayTransition) -> Unit)? = null, + replacedTransition: Transition? = null, +): TestReplaceOverlayTransition { + return object : + TestReplaceOverlayTransition(from, to, replacedTransition), + TransitionState.HasOverscrollProperties { + override val effectivelyShownOverlay: OverlayKey + get() = effectivelyShownOverlay() + + override val progress: Float + get() = progress() + + override val progressVelocity: Float + get() = progressVelocity() + + override val previewProgress: Float + get() = previewProgress() + + override val previewProgressVelocity: Float + get() = previewProgressVelocity() + + override val isInPreviewStage: Boolean + get() = isInPreviewStage() + + override val isInitiatedByUserInput: Boolean = isInitiatedByUserInput + override val isUserInputOngoing: Boolean = isUserInputOngoing + override val isUpOrLeft: Boolean = isUpOrLeft + override val bouncingContent: ContentKey? = bouncingContent + override val orientation: Orientation = orientation + override val absoluteDistance = 0f + + override fun freezeAndAnimateToCurrentState() { + if (onFreezeAndAnimate != null) { + onFreezeAndAnimate(this) + } else { + finish() + } + } + + override fun interruptionProgress(layoutImpl: SceneTransitionLayoutImpl): Float { + return interruptionProgress() + } + } +} -- GitLab From 52f9a2882d2fb58702978c5dd22ad00bd7f8bc7a Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 18 Oct 2024 18:46:44 +0000 Subject: [PATCH 120/459] Animation tweaks for ambient aod Fix OCCLUDED->GONE, and add a gentler alpha animation in. Bug: 373844670 Test: manual - verify OCCLUDED->GONE smoothness Flag: com.android.systemui.shared.ambient_aod Change-Id: Id17d567c27afe673518b464cf6dd00a775d6b8e7 --- .../interactor/LightRevealScrimInteractor.kt | 20 +++++++++------ .../ui/binder/LightRevealScrimViewBinder.kt | 25 +++++++++++++------ .../ui/viewmodel/LightRevealScrimViewModel.kt | 12 ++++++++- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt index cf747c81769a..6ad4bc54be2b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt @@ -29,6 +29,7 @@ import com.android.systemui.power.shared.model.ScreenPowerState import com.android.systemui.power.shared.model.WakeSleepReason import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.statusbar.LightRevealEffect +import com.android.systemui.util.kotlin.BooleanFlowOperators.anyOf import com.android.systemui.util.kotlin.sample import dagger.Lazy import javax.inject.Inject @@ -96,16 +97,19 @@ constructor( /** Limit the max alpha for the scrim to allow for some transparency */ val maxAlpha: Flow = - transitionInteractor - .isInTransition( - edge = Edge.create(Scenes.Gone, KeyguardState.AOD), - edgeWithoutSceneContainer = Edge.create(KeyguardState.GONE, KeyguardState.AOD), + anyOf( + transitionInteractor.isInTransition( + edge = Edge.create(Scenes.Gone, KeyguardState.AOD), + edgeWithoutSceneContainer = Edge.create(KeyguardState.GONE, KeyguardState.AOD), + ), + transitionInteractor.isInTransition( + Edge.create(KeyguardState.OCCLUDED, KeyguardState.AOD) + ), ) .flatMapLatest { isInTransition -> - // During GONE->AOD transitions, the home screen and wallpaper are still visible - // until - // WM is told to hide them, which occurs at the end of the animation. Use an opaque - // scrim until this transition is complete + // During transitions like GONE->AOD, surfaces like the launcher may be visible + // until WM is told to hide them, which occurs at the end of the animation. Use an + // opaque scrim until this transition is complete. if (isInTransition) { flowOf(1f) } else { 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 32757ce82c69..741cc02ffb6b 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 @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.ui.binder import android.animation.ValueAnimator import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle +import com.android.app.animation.Interpolators.ALPHA_IN import com.android.app.tracing.coroutines.launchTraced as launch import com.android.systemui.keyguard.ui.viewmodel.LightRevealScrimViewModel import com.android.systemui.lifecycle.repeatWhenAttached @@ -43,14 +44,24 @@ object LightRevealScrimViewBinder { } } launch("$TAG#viewModel.maxAlpha") { - viewModel.maxAlpha.collect { alpha -> + var animator: ValueAnimator? = null + viewModel.maxAlpha.collect { (alpha, animate) -> if (alpha != revealScrim.alpha) { - ValueAnimator.ofFloat(revealScrim.alpha, alpha).apply { - duration = 400 - addUpdateListener { animation -> - revealScrim.alpha = animation.getAnimatedValue() as Float - } - start() + animator?.cancel() + if (!animate) { + revealScrim.alpha = alpha + } else { + animator = + ValueAnimator.ofFloat(revealScrim.alpha, alpha).apply { + startDelay = 333 + duration = 733 + interpolator = ALPHA_IN + addUpdateListener { animation -> + revealScrim.alpha = + animation.getAnimatedValue() as Float + } + start() + } } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LightRevealScrimViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LightRevealScrimViewModel.kt index af6cd166479a..6d1aefe813c3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LightRevealScrimViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LightRevealScrimViewModel.kt @@ -21,6 +21,7 @@ import com.android.systemui.statusbar.LightRevealEffect import javax.inject.Inject import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map /** * Models UI state for the light reveal scrim, which is used during screen on and off animations to @@ -32,7 +33,16 @@ class LightRevealScrimViewModel constructor(private val interactor: LightRevealScrimInteractor) { val lightRevealEffect: Flow = interactor.lightRevealEffect val revealAmount: Flow = interactor.revealAmount - val maxAlpha: Flow = interactor.maxAlpha + + /** Max alpha for the scrim + whether to animate the change */ + val maxAlpha: Flow> = + interactor.maxAlpha.map { alpha -> + Pair( + alpha, + // Darken immediately if going to be fully opaque + if (alpha == 1f) false else true, + ) + } fun setWallpaperSupportsAmbientMode(supportsAmbientMode: Boolean) { interactor.setWallpaperSupportsAmbientMode(supportsAmbientMode) -- GitLab From defbb74c38364c2f61ced9408fd26e27ff1303cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20M=C3=BCtschard?= Date: Wed, 28 Aug 2024 13:41:31 +0200 Subject: [PATCH 121/459] Simplify the exposed jank types. This is in preparation of making the jank API public. See go/jank-api. Bug: b/293949943 Flag: EXEMPT refactor Test: FrameworksCoreTests manual Change-Id: Ibde381cc3d3acac71c95efecdfd8c1b1b9ba79e3 --- core/java/android/view/SurfaceControl.java | 49 +++++++------------ .../android/internal/jank/FrameTracker.java | 36 +++----------- core/jni/android_view_SurfaceControl.cpp | 24 ++++++++- .../internal/jank/FrameTrackerTest.java | 40 +++++++-------- 4 files changed, 69 insertions(+), 80 deletions(-) diff --git a/core/java/android/view/SurfaceControl.java b/core/java/android/view/SurfaceControl.java index e6de478e3d3d..94f415b8680f 100644 --- a/core/java/android/view/SurfaceControl.java +++ b/core/java/android/view/SurfaceControl.java @@ -412,41 +412,28 @@ public final class SurfaceControl implements Parcelable { */ public static class JankData { - /** @hide */ - @IntDef(flag = true, value = {JANK_NONE, - DISPLAY_HAL, - JANK_SURFACEFLINGER_DEADLINE_MISSED, - JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED, - JANK_APP_DEADLINE_MISSED, - PREDICTION_ERROR, - SURFACE_FLINGER_SCHEDULING}) + /** + * Needs to be kept in sync with android_view_SurfaceControl.cpp's + * JankDataListenerWrapper::onJankDataAvailable. + * @hide + */ + @IntDef(flag = true, value = { + JANK_NONE, + JANK_COMPOSER, + JANK_APPLICATION, + JANK_OTHER, + }) @Retention(RetentionPolicy.SOURCE) public @interface JankType {} - // Needs to be kept in sync with frameworks/native/libs/gui/include/gui/JankInfo.h - // No Jank - public static final int JANK_NONE = 0x0; - - // Jank not related to SurfaceFlinger or the App - public static final int DISPLAY_HAL = 0x1; - // SF took too long on the CPU - public static final int JANK_SURFACEFLINGER_DEADLINE_MISSED = 0x2; - // SF took too long on the GPU - public static final int JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED = 0x4; - // Either App or GPU took too long on the frame - public static final int JANK_APP_DEADLINE_MISSED = 0x8; - // Vsync predictions have drifted beyond the threshold from the actual HWVsync - public static final int PREDICTION_ERROR = 0x10; - // Latching a buffer early might cause an early present of the frame - public static final int SURFACE_FLINGER_SCHEDULING = 0x20; - // A buffer is said to be stuffed if it was expected to be presented on a vsync but was - // presented later because the previous buffer was presented in its expected vsync. This - // usually happens if there is an unexpectedly long frame causing the rest of the buffers - // to enter a stuffed state. - public static final int BUFFER_STUFFING = 0x40; - // Jank due to unknown reasons. - public static final int UNKNOWN = 0x80; + public static final int JANK_NONE = 0; + // Jank caused by the composer missing a deadline + public static final int JANK_COMPOSER = 1 << 0; + // Jank caused by the application missing the composer's deadline + public static final int JANK_APPLICATION = 1 << 1; + // Jank due to other unknown reasons + public static final int JANK_OTHER = 1 << 2; public JankData(long frameVsyncId, @JankType int jankType, long frameIntervalNs, long scheduledAppFrameTimeNs, long actualAppFrameTimeNs) { diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 6448f10f01b9..741714ccb091 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -16,13 +16,9 @@ package com.android.internal.jank; -import static android.view.SurfaceControl.JankData.DISPLAY_HAL; -import static android.view.SurfaceControl.JankData.JANK_APP_DEADLINE_MISSED; +import static android.view.SurfaceControl.JankData.JANK_APPLICATION; +import static android.view.SurfaceControl.JankData.JANK_COMPOSER; import static android.view.SurfaceControl.JankData.JANK_NONE; -import static android.view.SurfaceControl.JankData.JANK_SURFACEFLINGER_DEADLINE_MISSED; -import static android.view.SurfaceControl.JankData.JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED; -import static android.view.SurfaceControl.JankData.PREDICTION_ERROR; -import static android.view.SurfaceControl.JankData.SURFACE_FLINGER_SCHEDULING; import static com.android.internal.jank.DisplayRefreshRate.UNKNOWN_REFRESH_RATE; import static com.android.internal.jank.DisplayRefreshRate.VARIABLE_REFRESH_RATE; @@ -181,23 +177,11 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai case JANK_NONE: str.append("JANK_NONE"); break; - case JANK_APP_DEADLINE_MISSED: - str.append("JANK_APP_DEADLINE_MISSED"); + case JANK_APPLICATION: + str.append("JANK_APPLICATION"); break; - case JANK_SURFACEFLINGER_DEADLINE_MISSED: - str.append("JANK_SURFACEFLINGER_DEADLINE_MISSED"); - break; - case JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED: - str.append("JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED"); - break; - case DISPLAY_HAL: - str.append("DISPLAY_HAL"); - break; - case PREDICTION_ERROR: - str.append("PREDICTION_ERROR"); - break; - case SURFACE_FLINGER_SCHEDULING: - str.append("SURFACE_FLINGER_SCHEDULING"); + case JANK_COMPOSER: + str.append("JANK_COMPOSER"); break; default: str.append("UNKNOWN: ").append(jankType); @@ -608,16 +592,12 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai if (info.surfaceControlCallbackFired) { totalFramesCount++; boolean missedFrame = false; - if ((info.jankType & JANK_APP_DEADLINE_MISSED) != 0) { + if ((info.jankType & JANK_APPLICATION) != 0) { Log.w(TAG, "Missed App frame:" + info + ", CUJ=" + name); missedAppFramesCount++; missedFrame = true; } - if ((info.jankType & DISPLAY_HAL) != 0 - || (info.jankType & JANK_SURFACEFLINGER_DEADLINE_MISSED) != 0 - || (info.jankType & JANK_SURFACEFLINGER_GPU_DEADLINE_MISSED) != 0 - || (info.jankType & SURFACE_FLINGER_SCHEDULING) != 0 - || (info.jankType & PREDICTION_ERROR) != 0) { + if ((info.jankType & JANK_COMPOSER) != 0) { Log.w(TAG, "Missed SF frame:" + info + ", CUJ=" + name); missedSfFramesCount++; missedFrame = true; diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 755704a5ad91..f162b7410b10 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -2161,9 +2162,30 @@ public: jobjectArray jJankDataArray = env->NewObjectArray(jankData.size(), gJankDataClassInfo.clazz, nullptr); for (size_t i = 0; i < jankData.size(); i++) { + // The exposed constants in SurfaceControl are simplified, so we need to translate the + // jank type we get from SF to what is exposed in Java. + int sfJankType = jankData[i].jankType; + int javaJankType = 0x0; // SurfaceControl.JankData.JANK_NONE + if (sfJankType & + (JankType::DisplayHAL | JankType::SurfaceFlingerCpuDeadlineMissed | + JankType::SurfaceFlingerGpuDeadlineMissed | JankType::PredictionError | + JankType::SurfaceFlingerScheduling)) { + javaJankType |= 0x1; // SurfaceControl.JankData.JANK_COMPOSER + } + if (sfJankType & JankType::AppDeadlineMissed) { + javaJankType |= 0x2; // SurfaceControl.JankData.JANK_APPLICATION + } + if (sfJankType & + ~(JankType::DisplayHAL | JankType::SurfaceFlingerCpuDeadlineMissed | + JankType::SurfaceFlingerGpuDeadlineMissed | JankType::AppDeadlineMissed | + JankType::PredictionError | JankType::SurfaceFlingerScheduling | + JankType::BufferStuffing | JankType::SurfaceFlingerStuffing)) { + javaJankType |= 0x4; // SurfaceControl.JankData.JANK_OTHER + } + jobject jJankData = env->NewObject(gJankDataClassInfo.clazz, gJankDataClassInfo.ctor, - jankData[i].frameVsyncId, jankData[i].jankType, + jankData[i].frameVsyncId, javaJankType, jankData[i].frameIntervalNs, jankData[i].scheduledAppFrameTimeNs, jankData[i].actualAppFrameTimeNs); env->SetObjectArrayElement(jJankDataArray, i, jJankData); diff --git a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java index 1cbc7d6d3f98..60b5a422ea80 100644 --- a/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java +++ b/core/tests/coretests/src/com/android/internal/jank/FrameTrackerTest.java @@ -16,9 +16,9 @@ package com.android.internal.jank; -import static android.view.SurfaceControl.JankData.JANK_APP_DEADLINE_MISSED; +import static android.view.SurfaceControl.JankData.JANK_APPLICATION; +import static android.view.SurfaceControl.JankData.JANK_COMPOSER; import static android.view.SurfaceControl.JankData.JANK_NONE; -import static android.view.SurfaceControl.JankData.JANK_SURFACEFLINGER_DEADLINE_MISSED; import static com.android.internal.jank.FrameTracker.SurfaceControlWrapper; import static com.android.internal.jank.FrameTracker.ViewRootWrapper; @@ -164,7 +164,7 @@ public class FrameTrackerTest { verify(mRenderer, only()).addObserver(any()); // send first frame with a long duration - should not be taken into account - sendFirstWindowFrame(tracker, 100, JANK_APP_DEADLINE_MISSED, 100L); + sendFirstWindowFrame(tracker, 100, JANK_APPLICATION, 100L); // send another frame with a short duration - should not be considered janky sendFrame(tracker, 5, JANK_NONE, 101L); @@ -173,7 +173,7 @@ public class FrameTrackerTest { when(mChoreographer.getVsyncId()).thenReturn(102L); tracker.end(FrameTracker.REASON_END_NORMAL); sendFrame(tracker, 5, JANK_NONE, 102L); - sendFrame(tracker, 500, JANK_APP_DEADLINE_MISSED, 103L); + sendFrame(tracker, 500, JANK_APPLICATION, 103L); verify(tracker).removeObservers(); verify(mTrackerListener, never()).triggerPerfetto(any()); @@ -202,7 +202,7 @@ public class FrameTrackerTest { sendFrame(tracker, 4, JANK_NONE, 100L); // send another frame - should be considered janky - sendFrame(tracker, 40, JANK_SURFACEFLINGER_DEADLINE_MISSED, 101L); + sendFrame(tracker, 40, JANK_COMPOSER, 101L); // end the trace session when(mChoreographer.getVsyncId()).thenReturn(102L); @@ -236,7 +236,7 @@ public class FrameTrackerTest { verify(mRenderer, only()).addObserver(any()); // send first frame - janky - sendFrame(tracker, 40, JANK_APP_DEADLINE_MISSED, 100L); + sendFrame(tracker, 40, JANK_APPLICATION, 100L); // send another frame - not jank sendFrame(tracker, 4, JANK_NONE, 101L); @@ -275,7 +275,7 @@ public class FrameTrackerTest { sendFrame(tracker, 4, JANK_NONE, 100L); // send another frame - should be considered janky - sendFrame(tracker, 40, JANK_APP_DEADLINE_MISSED, 101L); + sendFrame(tracker, 40, JANK_APPLICATION, 101L); // end the trace session when(mChoreographer.getVsyncId()).thenReturn(102L); @@ -317,7 +317,7 @@ public class FrameTrackerTest { // end the trace session, simulate one more valid callback came after the end call. when(mChoreographer.getVsyncId()).thenReturn(102L); tracker.end(FrameTracker.REASON_END_NORMAL); - sendFrame(tracker, 50, JANK_APP_DEADLINE_MISSED, 102L); + sendFrame(tracker, 50, JANK_APPLICATION, 102L); // One more callback with VSYNC after the end() vsync id. sendFrame(tracker, 4, JANK_NONE, 103L); @@ -365,7 +365,7 @@ public class FrameTrackerTest { sendSfFrame(tracker, 4, 102L, JANK_NONE); // Send janky but complete callbck fo 103L - sendFrame(tracker, 50, JANK_APP_DEADLINE_MISSED, 103L); + sendFrame(tracker, 50, JANK_APPLICATION, 103L); verify(tracker).removeObservers(); verify(mTrackerListener, never()).triggerPerfetto(any()); @@ -397,7 +397,7 @@ public class FrameTrackerTest { sendFrame(tracker, 4, JANK_NONE, 101L); // a janky frame - sendFrame(tracker, 50, JANK_APP_DEADLINE_MISSED, 102L); + sendFrame(tracker, 50, JANK_APPLICATION, 102L); tracker.cancel(FrameTracker.REASON_CANCEL_NORMAL); verify(tracker).removeObservers(); @@ -481,7 +481,7 @@ public class FrameTrackerTest { // normal frame - not janky sendFrame(tracker, JANK_NONE, 101L); // a janky frame - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 102L); + sendFrame(tracker, JANK_APPLICATION, 102L); when(mChoreographer.getVsyncId()).thenReturn(102L); tracker.end(FrameTracker.REASON_CANCEL_NORMAL); @@ -514,7 +514,7 @@ public class FrameTrackerTest { verify(mSurfaceControlWrapper).addJankStatsListener(any(), any()); // First frame - janky - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 100L); + sendFrame(tracker, JANK_APPLICATION, 100L); // normal frame - not janky sendFrame(tracker, JANK_NONE, 101L); // normal frame - not janky @@ -561,7 +561,7 @@ public class FrameTrackerTest { tracker.end(FrameTracker.REASON_CANCEL_NORMAL); // janky frame, should be ignored, trigger finish - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 103L); + sendFrame(tracker, JANK_APPLICATION, 103L); verify(mJankStatsRegistration).removeAfter(anyLong()); verify(mTrackerListener, never()).triggerPerfetto(any()); @@ -623,16 +623,16 @@ public class FrameTrackerTest { tracker.begin(); mRunnableArgumentCaptor.getValue().run(); verify(mSurfaceControlWrapper).addJankStatsListener(any(), any()); - sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 100L); - sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 101L); - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 102L); + sendFrame(tracker, JANK_COMPOSER, 100L); + sendFrame(tracker, JANK_COMPOSER, 101L); + sendFrame(tracker, JANK_APPLICATION, 102L); sendFrame(tracker, JANK_NONE, 103L); - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 104L); - sendFrame(tracker, JANK_APP_DEADLINE_MISSED, 105L); + sendFrame(tracker, JANK_APPLICATION, 104L); + sendFrame(tracker, JANK_APPLICATION, 105L); when(mChoreographer.getVsyncId()).thenReturn(106L); tracker.end(FrameTracker.REASON_END_NORMAL); - sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 106L); - sendFrame(tracker, JANK_SURFACEFLINGER_DEADLINE_MISSED, 107L); + sendFrame(tracker, JANK_COMPOSER, 106L); + sendFrame(tracker, JANK_COMPOSER, 107L); verify(mJankStatsRegistration).removeAfter(anyLong()); verify(mTrackerListener).triggerPerfetto(any()); verify(mStatsLog).write(eq(UI_INTERACTION_FRAME_INFO_REPORTED), -- GitLab From 30d9a92e3b1330132c577dae7d8bf16759d30795 Mon Sep 17 00:00:00 2001 From: Azhara Assanova Date: Mon, 21 Oct 2024 11:49:41 +0000 Subject: [PATCH 122/459] Baseline global lint errors We're trying to update AndroidGlobalLintChecker to the latest version in Change-Id I2918f6f94bf1e6b5c153ac743c14082ac7d13600 in AOSP, however, a few lint errors fail presubmit, hence this change updates the baseline file to make presubmit pass for now. Bug: 366207898 Test: treehugger Test: m framework-minus-apex-lint Test: m services.core.unboosted-lint Flag: EXEMPT lint baseline Change-Id: If6fe8d6eb4e83582f55d9bbde7673dd23c745ba6 --- lint-baseline.xml | 13 +- services/core/lint-baseline.xml | 673 +++++++++++++++++++++++++++++++- 2 files changed, 684 insertions(+), 2 deletions(-) diff --git a/lint-baseline.xml b/lint-baseline.xml index 0320aabd7199..8253c1f8f0b3 100644 --- a/lint-baseline.xml +++ b/lint-baseline.xml @@ -11265,4 +11265,15 @@ column="24"/> - \ No newline at end of file + + + + + diff --git a/services/core/lint-baseline.xml b/services/core/lint-baseline.xml index 3b81f0a6191e..4c1ac39a5da0 100644 --- a/services/core/lint-baseline.xml +++ b/services/core/lint-baseline.xml @@ -178,4 +178,675 @@ column="51"/> - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- GitLab From 2ccb7efe6403e18303106b1aee028b037a3bd19b Mon Sep 17 00:00:00 2001 From: Edgar Wang Date: Mon, 21 Oct 2024 12:55:57 +0000 Subject: [PATCH 123/459] [Expressive Design] Update MainSwitchBar padding - only Expressive design enable to apply new layout Bug: 366336385 Test: visual Flag: EXEMPT resource only update Change-Id: Id13f5e8373ec038afc61a07f1d97d2417d953ce2 --- .../settingslib_main_switch_bar.xml | 2 ++ .../settingslib_main_switch_bar.xml | 2 ++ ...tingslib_expressive_main_switch_layout.xml | 33 +++++++++++++++++++ .../layout/settingslib_main_switch_bar.xml | 6 +++- .../layout/settingslib_main_switch_layout.xml | 4 --- .../widget/MainSwitchPreference.java | 6 +++- 6 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml index 2e3ee32e2efb..e3f8fbb88a65 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v31/settingslib_main_switch_bar.xml @@ -20,6 +20,8 @@ android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingTop="@dimen/settingslib_switchbar_margin" android:paddingBottom="@dimen/settingslib_switchbar_margin" android:orientation="vertical"> diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml index 3e0e18488f36..255b2c92e709 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v33/settingslib_main_switch_bar.xml @@ -20,6 +20,8 @@ android:layout_height="wrap_content" android:layout_width="match_parent" android:minHeight="?android:attr/listPreferredItemHeight" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" android:paddingTop="@dimen/settingslib_switchbar_margin" android:paddingBottom="@dimen/settingslib_switchbar_margin" android:orientation="vertical"> diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml b/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml new file mode 100644 index 000000000000..94c6924a02f2 --- /dev/null +++ b/packages/SettingsLib/MainSwitchPreference/res/layout-v35/settingslib_expressive_main_switch_layout.xml @@ -0,0 +1,33 @@ + + + + + + + + + + diff --git a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml index 7c0eaeaca3de..bf34db93298b 100644 --- a/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml +++ b/packages/SettingsLib/MainSwitchPreference/res/layout/settingslib_main_switch_bar.xml @@ -18,7 +18,11 @@ + android:layout_width="match_parent" + android:paddingLeft="?android:attr/listPreferredItemPaddingLeft" + android:paddingStart="?android:attr/listPreferredItemPaddingStart" + android:paddingRight="?android:attr/listPreferredItemPaddingRight" + android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"> Date: Mon, 21 Oct 2024 11:56:22 +0000 Subject: [PATCH 124/459] [ENR] Ensure ENR views visibilities This CL ensures public and private layouts of enr are not visible at the same time. Bug: 361552380 Test: Presubmit Flag: com.android.systemui.ensure_enr_views_visibility Change-Id: Ic4dafffbc8933d717dbbf9884dc420523ba2c8e2 --- packages/SystemUI/aconfig/systemui.aconfig | 10 +++ .../row/EnsureEnrViewsVisibility.kt | 61 +++++++++++++++++++ .../row/ExpandableNotificationRow.java | 12 +++- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/notification/row/EnsureEnrViewsVisibility.kt diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 426b24dfe070..0b1811079155 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1557,3 +1557,13 @@ flag { description: "Enables the tile detailed view UI." bug: "374173773" } + +flag { + name: "ensure_enr_views_visibility" + namespace: "systemui" + description: "Ensures public and private visibilities" + bug: "361552380" + metadata { + purpose: PURPOSE_BUGFIX + } +} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/EnsureEnrViewsVisibility.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/EnsureEnrViewsVisibility.kt new file mode 100644 index 000000000000..aa63f4ddbd45 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/EnsureEnrViewsVisibility.kt @@ -0,0 +1,61 @@ +/* + * 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.statusbar.notification.row + +import com.android.systemui.Flags +import com.android.systemui.flags.FlagToken +import com.android.systemui.flags.RefactorFlagUtils + +/** Helper for reading or using the ensure enr views visibility flag state. */ +@Suppress("NOTHING_TO_INLINE") +object EnsureEnrViewsVisibility { + /** The aconfig flag name */ + const val FLAG_NAME = Flags.FLAG_ENSURE_ENR_VIEWS_VISIBILITY + + /** A token used for dependency declaration */ + val token: FlagToken + get() = FlagToken(FLAG_NAME, isEnabled) + + /** Is the refactor enabled */ + @JvmStatic + inline val isEnabled + get() = Flags.ensureEnrViewsVisibility() + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is not enabled to ensure that the refactor author catches issues in testing. + * Caution!! Using this check incorrectly will cause crashes in nextfood builds! + */ + @JvmStatic + inline fun assertInNewMode() = RefactorFlagUtils.assertInNewMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) +} 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 933f79341b27..a4c43a1b65c2 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 @@ -2507,6 +2507,10 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } private void updateChildrenVisibility() { + if (EnsureEnrViewsVisibility.isEnabled()) { + mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE); + } + boolean hideContentWhileLaunching = mExpandAnimationRunning && mGuts != null && mGuts.isExposed(); mPrivateLayout.setVisibility(!mShowingPublic && !mIsSummaryWithChildren @@ -3073,7 +3077,13 @@ public class ExpandableNotificationRow extends ActivatableNotificationView } else { mLogger.logSkipResetAllContentAlphas(getEntry()); } - mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE); + + if (!EnsureEnrViewsVisibility.isEnabled()) { + // mPublicLayout.setVisibility moved to updateChildrenVisibility when the flag is on + // in order to ensure public and private views are not visible + // together at the same time. + mPublicLayout.setVisibility(mShowingPublic ? View.VISIBLE : View.INVISIBLE); + } updateChildrenVisibility(); } else { animateShowingPublic(delay, duration, mShowingPublic); -- GitLab From 3d454fb1b3371a4677442cb931d8df1cae74513e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Go=CC=88llner?= Date: Mon, 21 Oct 2024 14:25:57 +0100 Subject: [PATCH 125/459] Prepare PrivacyDotViewController for multiple displays - Split interface and impl - Turn it into an @AssistedInject class Test: Build Test: N/A No behavior changes Flag: EXEMPT no behavior changes Bug: 362720432 Change-Id: Icb3c493b92e172253d79e8b568b46a73938722fe --- .../events/PrivacyDotViewControllerTest.kt | 6 +- .../events/PrivacyDotViewController.kt | 118 ++++++++++++------ .../phone/ConfigurationControllerImpl.kt | 5 +- .../phone/dagger/StatusBarPhoneModule.kt | 3 +- .../FakeStatusBarWindowControllerFactory.kt | 2 +- 5 files changed, 91 insertions(+), 43 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt index 663c3418b144..16da3d22f4f7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/events/PrivacyDotViewControllerTest.kt @@ -70,14 +70,14 @@ class PrivacyDotViewControllerTest : SysuiTestCase() { } private fun createController() = - PrivacyDotViewController( + PrivacyDotViewControllerImpl( executor, testScope.backgroundScope, statusBarStateController, configurationController, contentInsetsProvider, animationScheduler = mock(), - shadeInteractor = null + shadeInteractor = null, ) .also { it.setUiExecutor(executor) } @@ -307,7 +307,7 @@ class PrivacyDotViewControllerTest : SysuiTestCase() { newTopLeftView, newTopRightView, newBottomLeftView, - newBottomRightView + newBottomRightView, ) assertThat((newBottomRightView.layoutParams as FrameLayout.LayoutParams).gravity) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 2930de2fd9ee..0eef8d63c2d1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -44,8 +44,12 @@ import com.android.systemui.util.leak.RotationUtils.ROTATION_NONE import com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN import com.android.systemui.util.leak.RotationUtils.Rotation +import dagger.Module +import dagger.Provides +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import java.util.concurrent.Executor -import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -63,26 +67,57 @@ import kotlinx.coroutines.launch * NOTE: any operation that modifies views directly must run on the provided executor, because these * views are owned by ScreenDecorations and it runs in its own thread */ -@SysUISingleton -open class PrivacyDotViewController -@Inject +interface PrivacyDotViewController { + + // Only can be modified on @UiThread + var currentViewState: ViewState + + var showingListener: ShowingListener? + + fun setUiExecutor(e: DelayableExecutor) + + fun getUiExecutor(): DelayableExecutor? + + @UiThread fun setNewRotation(rot: Int) + + @UiThread fun hideDotView(dot: View, animate: Boolean) + + @UiThread fun showDotView(dot: View, animate: Boolean) + + // Update the gravity and margins of the privacy views + @UiThread fun updateRotations(rotation: Int, paddingTop: Int) + + @UiThread fun setCornerSizes(state: ViewState) + + fun initialize(topLeft: View, topRight: View, bottomLeft: View, bottomRight: View) + + @UiThread fun updateDotView(state: ViewState) + + interface ShowingListener { + fun onPrivacyDotShown(v: View?) + + fun onPrivacyDotHidden(v: View?) + } +} + +open class PrivacyDotViewControllerImpl +@AssistedInject constructor( @Main private val mainExecutor: Executor, - @Application scope: CoroutineScope, + @Assisted scope: CoroutineScope, private val stateController: StatusBarStateController, - private val configurationController: ConfigurationController, - private val contentInsetsProvider: StatusBarContentInsetsProvider, + @Assisted private val configurationController: ConfigurationController, + @Assisted private val contentInsetsProvider: StatusBarContentInsetsProvider, private val animationScheduler: SystemStatusAnimationScheduler, - shadeInteractor: ShadeInteractor? -) { + shadeInteractor: ShadeInteractor?, +) : PrivacyDotViewController { private lateinit var tl: View private lateinit var tr: View private lateinit var bl: View private lateinit var br: View // Only can be modified on @UiThread - var currentViewState: ViewState = ViewState() - get() = field + override var currentViewState: ViewState = ViewState() @GuardedBy("lock") private var nextViewState: ViewState = currentViewState.copy() @@ -100,11 +135,7 @@ constructor( private val views: Sequence get() = if (!this::tl.isInitialized) sequenceOf() else sequenceOf(tl, tr, br, bl) - var showingListener: ShowingListener? = null - set(value) { - field = value - } - get() = field + override var showingListener: PrivacyDotViewController.ShowingListener? = null init { contentInsetsProvider.addCallback( @@ -153,16 +184,16 @@ constructor( } } - fun setUiExecutor(e: DelayableExecutor) { + override fun setUiExecutor(e: DelayableExecutor) { uiExecutor = e } - fun getUiExecutor(): DelayableExecutor? { + override fun getUiExecutor(): DelayableExecutor? { return uiExecutor } @UiThread - fun setNewRotation(rot: Int) { + override fun setNewRotation(rot: Int) { dlog("updateRotation: $rot") val isRtl: Boolean @@ -187,13 +218,13 @@ constructor( rotation = rot, paddingTop = paddingTop, designatedCorner = newCorner, - cornerIndex = index + cornerIndex = index, ) } } @UiThread - fun hideDotView(dot: View, animate: Boolean) { + override fun hideDotView(dot: View, animate: Boolean) { dot.clearAnimation() if (animate) { dot.animate() @@ -212,7 +243,7 @@ constructor( } @UiThread - fun showDotView(dot: View, animate: Boolean) { + override fun showDotView(dot: View, animate: Boolean) { dot.clearAnimation() if (animate) { dot.visibility = View.VISIBLE @@ -229,9 +260,8 @@ constructor( showingListener?.onPrivacyDotShown(dot) } - // Update the gravity and margins of the privacy views @UiThread - open fun updateRotations(rotation: Int, paddingTop: Int) { + override fun updateRotations(rotation: Int, paddingTop: Int) { // To keep a view in the corner, its gravity is always the description of its current corner // Therefore, just figure out which view is in which corner. This turns out to be something // like (myCorner - rot) mod 4, where topLeft = 0, topRight = 1, etc. and portrait = 0, and @@ -262,7 +292,7 @@ constructor( } @UiThread - open fun setCornerSizes(state: ViewState) { + override fun setCornerSizes(state: ViewState) { // StatusBarContentInsetsProvider can tell us the location of the privacy indicator dot // in every rotation. The only thing we need to check is rtl val rtl = state.layoutRtl @@ -415,7 +445,7 @@ constructor( } } - fun initialize(topLeft: View, topRight: View, bottomLeft: View, bottomRight: View) { + override fun initialize(topLeft: View, topRight: View, bottomLeft: View, bottomRight: View) { if ( this::tl.isInitialized && this::tr.isInitialized && @@ -457,7 +487,7 @@ constructor( landscapeRect = right, upsideDownRect = bottom, paddingTop = paddingTop, - layoutRtl = rtl + layoutRtl = rtl, ) } } @@ -533,7 +563,7 @@ constructor( } @UiThread - open fun updateDotView(state: ViewState) { + override fun updateDotView(state: ViewState) { val shouldShow = state.shouldShowDot() if (shouldShow != currentViewState.shouldShowDot()) { if (shouldShow && state.designatedCorner != null) { @@ -553,7 +583,7 @@ constructor( nextViewState = nextViewState.copy( systemPrivacyEventIsActive = true, - contentDescription = contentDescr + contentDescription = contentDescr, ) } @@ -595,15 +625,18 @@ constructor( seascapeRect = rects[0], portraitRect = rects[1], landscapeRect = rects[2], - upsideDownRect = rects[3] + upsideDownRect = rects[3], ) } } - interface ShowingListener { - fun onPrivacyDotShown(v: View?) - - fun onPrivacyDotHidden(v: View?) + @AssistedFactory + interface Factory { + fun create( + scope: CoroutineScope, + configurationController: ConfigurationController, + contentInsetsProvider: StatusBarContentInsetsProvider, + ): PrivacyDotViewControllerImpl } } @@ -662,7 +695,7 @@ data class ViewState( val paddingTop: Int = 0, val cornerIndex: Int = -1, val designatedCorner: View? = null, - val contentDescription: String? = null + val contentDescription: String? = null, ) { fun shouldShowDot(): Boolean { return systemPrivacyEventIsActive && !shadeExpanded && !qsExpanded @@ -687,3 +720,18 @@ data class ViewState( } } } + +@Module +object PrivacyDotViewControllerModule { + + @Provides + @SysUISingleton + fun controller( + factory: PrivacyDotViewControllerImpl.Factory, + @Application scope: CoroutineScope, + configurationController: ConfigurationController, + contentInsetsProvider: StatusBarContentInsetsProvider, + ): PrivacyDotViewController { + return factory.create(scope, configurationController, contentInsetsProvider) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.kt index a8c823c35213..858cac111525 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationControllerImpl.kt @@ -29,9 +29,8 @@ import dagger.assisted.AssistedInject class ConfigurationControllerImpl @AssistedInject -constructor( - @Assisted private val context: Context, -) : ConfigurationController, StatusBarConfigurationController { +constructor(@Assisted private val context: Context) : + ConfigurationController, StatusBarConfigurationController { private val listeners: MutableList = ArrayList() private val lastConfig = Configuration() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt index 09e191dd1911..92d0ebecf8d8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarPhoneModule.kt @@ -32,6 +32,7 @@ import com.android.systemui.statusbar.core.StatusBarInitializerStore import com.android.systemui.statusbar.core.StatusBarOrchestrator import com.android.systemui.statusbar.core.StatusBarSimpleFragment import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryStore +import com.android.systemui.statusbar.events.PrivacyDotViewControllerModule import com.android.systemui.statusbar.phone.CentralSurfacesCommandQueueCallbacks import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.statusbar.window.data.repository.StatusBarWindowStateRepositoryStore @@ -45,7 +46,7 @@ import dagger.multibindings.IntoMap import kotlinx.coroutines.CoroutineScope /** Similar in purpose to [StatusBarModule], but scoped only to phones */ -@Module +@Module(includes = [PrivacyDotViewControllerModule::class]) interface StatusBarPhoneModule { @Binds diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt index bca13c6f502d..65247a55348d 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt @@ -24,6 +24,6 @@ class FakeStatusBarWindowControllerFactory : StatusBarWindowController.Factory { override fun create( context: Context, viewCaptureAwareWindowManager: ViewCaptureAwareWindowManager, - statusBarConfigurationController: StatusBarConfigurationController + statusBarConfigurationController: StatusBarConfigurationController, ) = FakeStatusBarWindowController() } -- GitLab From 2eb0812f6cb18ab01d8b066b70a265b4b1af6348 Mon Sep 17 00:00:00 2001 From: Anna Bauza Date: Mon, 21 Oct 2024 14:11:14 +0000 Subject: [PATCH 126/459] Revert^2 "Add condition to bypass caching when process uid differs from caller uid." This reverts commit 4e53a549f390bada4ccb70d79f512892c9fbbf27. Reason for revert: This is not fixing the bug just covering up possible issue in Android OS. Please fix the tests, or actual issue. Change-Id: I3db74d1aadfc7652f068483478589a343e60d89b --- core/java/android/app/PropertyInvalidatedCache.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java index e4d3baa2f05a..acedef0c7788 100644 --- a/core/java/android/app/PropertyInvalidatedCache.java +++ b/core/java/android/app/PropertyInvalidatedCache.java @@ -21,11 +21,13 @@ import static android.text.TextUtils.formatSimple; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.TestApi; +import android.os.Binder; import android.os.Build; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.os.ParcelFileDescriptor; +import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; import android.text.TextUtils; @@ -78,10 +80,15 @@ public class PropertyInvalidatedCache { public abstract @Nullable R apply(@NonNull Q query); /** - * Return true if a query should not use the cache. The default implementation - * always uses the cache. + * Return true if a query should not use the cache. The default implementation returns true + * if the process UID differs from the calling UID. This is to prevent a binder caller from + * reading a cached value created due to a different binder caller, when processes are + * caching on behalf of other processes. */ public boolean shouldBypassCache(@NonNull Q query) { + if(android.multiuser.Flags.propertyInvalidatedCacheBypassMismatchedUids()) { + return Binder.getCallingUid() != Process.myUid(); + } return false; } }; -- GitLab From a07f97b74a1707c71ea1956e46dcede0749cc3b2 Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Sun, 20 Oct 2024 03:10:46 +0000 Subject: [PATCH 127/459] Activate hot plugged device Activate hot plugged audio input device, to match the output device behavior. Change-Id: I57ced3f32cf2d60b98043a256ea9d3c10b25280d Bug: b/355684672, b/374174565 Test: InputRouteManagerTest Flag: com.android.media.flags.enable_audio_input_device_routing_and_volume_control --- .../settingslib/media/InputRouteManager.java | 18 +++++- .../media/InputRouteManagerTest.java | 57 ++++++++++++++++--- 2 files changed, 65 insertions(+), 10 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java index 4f315a2a2486..63661f698f4e 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java @@ -74,7 +74,23 @@ public final class InputRouteManager { new AudioDeviceCallback() { @Override public void onAudioDevicesAdded(@NonNull AudioDeviceInfo[] addedDevices) { - applyDefaultSelectedTypeToAllPresets(); + // Activate the last hot plugged valid input device, to match the output device + // behavior. + @AudioDeviceType int deviceTypeToActivate = mSelectedInputDeviceType; + for (AudioDeviceInfo info : addedDevices) { + if (InputMediaDevice.isSupportedInputDevice(info.getType())) { + deviceTypeToActivate = info.getType(); + } + } + + // Only activate if we find a different valid input device. e.g. if none of the + // addedDevices is supported input device, we don't need to activate anything. + if (mSelectedInputDeviceType != deviceTypeToActivate) { + mSelectedInputDeviceType = deviceTypeToActivate; + AudioDeviceAttributes deviceAttributes = + createInputDeviceAttributes(mSelectedInputDeviceType); + setPreferredDeviceForAllPresets(deviceAttributes); + } } @Override diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java index 782cee23fb42..d808a25ebc04 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java @@ -24,6 +24,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -138,6 +139,18 @@ public class InputRouteManagerTest { /* address= */ ""); } + private AudioDeviceAttributes getUsbHeadsetDeviceAttributes() { + return new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_INPUT, + AudioDeviceInfo.TYPE_USB_HEADSET, + /* address= */ ""); + } + + private AudioDeviceAttributes getHdmiDeviceAttributes() { + return new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_INPUT, AudioDeviceInfo.TYPE_HDMI, /* address= */ ""); + } + private void onPreferredDevicesForCapturePresetChanged(InputRouteManager inputRouteManager) { final List audioDeviceAttributesList = new ArrayList(); @@ -303,21 +316,47 @@ public class InputRouteManagerTest { } @Test - public void onAudioDevicesAdded_shouldApplyDefaultSelectedDeviceToAllPresets() { + public void onAudioDevicesAdded_shouldActivateAddedDevice() { final AudioManager audioManager = mock(AudioManager.class); - AudioDeviceAttributes wiredHeadsetDeviceAttributes = getWiredHeadsetDeviceAttributes(); - when(audioManager.getDevicesForAttributes(INPUT_ATTRIBUTES)) - .thenReturn(Collections.singletonList(wiredHeadsetDeviceAttributes)); - InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); AudioDeviceInfo[] devices = {mockWiredHeadsetInfo()}; inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); - // Called twice, one after initiation, the other after onAudioDevicesAdded call. - verify(audioManager, atLeast(2)).getDevicesForAttributes(INPUT_ATTRIBUTES); + // The only added wired headset will be activated. for (@MediaRecorder.Source int preset : PRESETS) { - verify(audioManager, atLeast(2)) - .setPreferredDeviceForCapturePreset(preset, wiredHeadsetDeviceAttributes); + verify(audioManager, atLeast(1)) + .setPreferredDeviceForCapturePreset(preset, getWiredHeadsetDeviceAttributes()); + } + } + + @Test + public void onAudioDevicesAdded_shouldActivateLastAddedDevice() { + final AudioManager audioManager = mock(AudioManager.class); + InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); + AudioDeviceInfo[] devices = {mockWiredHeadsetInfo(), mockUsbHeadsetInfo()}; + inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); + + // When adding multiple valid input devices, the last added device (usb headset in this + // case) will be activated. + for (@MediaRecorder.Source int preset : PRESETS) { + verify(audioManager, never()) + .setPreferredDeviceForCapturePreset(preset, getWiredHeadsetDeviceAttributes()); + verify(audioManager, atLeast(1)) + .setPreferredDeviceForCapturePreset(preset, getUsbHeadsetDeviceAttributes()); + } + } + + @Test + public void onAudioDevicesAdded_doNotActivateInvalidAddedDevice() { + final AudioManager audioManager = mock(AudioManager.class); + InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); + AudioDeviceInfo[] devices = {mockHdmiInfo()}; + inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); + + // Do not activate since HDMI is not a valid input device. + for (@MediaRecorder.Source int preset : PRESETS) { + verify(audioManager, never()) + .setPreferredDeviceForCapturePreset(preset, getHdmiDeviceAttributes()); } } -- GitLab From b1f38863a067b887aa2ab14f1fd0d9f08bae7f65 Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Mon, 14 Oct 2024 18:53:46 +0000 Subject: [PATCH 128/459] Add data layer for volume dialog ringer Flag: com.android.systemui.volume_redesign Bug: 369993851 Test: Build, passes presubmits Change-Id: I98485dfbc7b809a8883d46de1fff774a1f459314 --- .../data/VolumeDialogRingerRepository.kt | 37 +++++++++++++++++++ .../shared/model/VolumeDialogRingerModel.kt | 34 +++++++++++++++++ .../VolumeDialogRingerRepositoryKosmos.kt | 21 +++++++++++ 3 files changed, 92 insertions(+) create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/shared/model/VolumeDialogRingerModel.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt new file mode 100644 index 000000000000..73b97f642ec9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt @@ -0,0 +1,37 @@ +/* + * 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.volume.dialog.ringer.data + +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel +import javax.inject.Inject +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.update + +/** Stores the state of volume dialog ringer model */ +@SysUISingleton +class VolumeDialogRingerRepository @Inject constructor() { + + private val mutableRingerModel = MutableStateFlow(null) + val ringerModel: Flow = mutableRingerModel.filterNotNull() + + fun updateRingerModel(update: (current: VolumeDialogRingerModel?) -> VolumeDialogRingerModel) { + mutableRingerModel.update(update) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/shared/model/VolumeDialogRingerModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/shared/model/VolumeDialogRingerModel.kt new file mode 100644 index 000000000000..cf23f1a985f7 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/shared/model/VolumeDialogRingerModel.kt @@ -0,0 +1,34 @@ +/* + * 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.volume.dialog.ringer.shared.model + +import com.android.settingslib.volume.shared.model.RingerMode + +/** Models the state of the volume dialog ringer. */ +data class VolumeDialogRingerModel( + val availableModes: List, + /** Current ringer mode internal */ + val currentRingerMode: RingerMode, + /** whether the ringer is allowed given the current ZenMode */ + val isEnabled: Boolean, + /** Whether the current ring stream level is zero or the controller state is muted */ + val isMuted: Boolean, + /** Ring stream level */ + val level: Int, + /** Ring stream maximum level */ + val levelMax: Int, +) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt new file mode 100644 index 000000000000..2c518863cf3c --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt @@ -0,0 +1,21 @@ +/* + * 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.volume.dialog.ringer.data + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.volumeDialogRingerRepository by Kosmos.Fixture { VolumeDialogRingerRepository() } -- GitLab From be4c6cddc8a2b1b6d92e79032ea27c035bee49c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pascal=20M=C3=BCtschard?= Date: Mon, 21 Oct 2024 17:02:45 +0200 Subject: [PATCH 129/459] Stop using HWUI callbacks for jank. Removes skipping of frames tagged as "first frame" by HWUI for jank and stops registering the HardwareRendererObserver if the HWUI callback is not needed for anything. Bug: b/354763298 Test: FrameworksCoreTests manual Flag: com.android.internal.jank.ignore_hwui_is_first_frame Change-Id: I83c6bbaba5e21cadff5b34f87fa51ede42b31800 --- .../com/android/internal/jank/FrameTracker.java | 16 ++++++++++------ .../java/com/android/internal/jank/flags.aconfig | 7 +++++++ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java index 6448f10f01b9..ca86605179b6 100644 --- a/core/java/com/android/internal/jank/FrameTracker.java +++ b/core/java/com/android/internal/jank/FrameTracker.java @@ -230,7 +230,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai mRendererWrapper = mSurfaceOnly ? null : renderer; mMetricsWrapper = mSurfaceOnly ? null : metrics; mViewRoot = mSurfaceOnly ? null : viewRootWrapper; - mObserver = mSurfaceOnly + mObserver = mSurfaceOnly || (Flags.useSfFrameDuration() && Flags.ignoreHwuiIsFirstFrame()) ? null : new HardwareRendererObserver(this, mMetricsWrapper.getTiming(), mHandler, /* waitForPresentTime= */ false); @@ -568,7 +568,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai } private boolean callbacksReceived(JankInfo info) { - return mSurfaceOnly + return mObserver == null ? info.surfaceControlCallbackFired : info.hwuiCallbackFired && info.surfaceControlCallbackFired; } @@ -599,7 +599,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai for (int i = 0; i < mJankInfos.size(); i++) { JankInfo info = mJankInfos.valueAt(i); final boolean isFirstDrawn = !mSurfaceOnly && info.isFirstFrame; - if (isFirstDrawn) { + if (isFirstDrawn && !Flags.ignoreHwuiIsFirstFrame()) { continue; } if (info.frameVsyncId > mEndVsyncId) { @@ -636,7 +636,7 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai } // TODO (b/174755489): Early latch currently gets fired way too often, so we have // to ignore it for now. - if (!mSurfaceOnly && !info.hwuiCallbackFired) { + if (mObserver != null && !info.hwuiCallbackFired) { markEvent("FT#MissedHWUICallback", info.frameVsyncId); Log.w(TAG, "Missing HWUI jank callback for vsyncId: " + info.frameVsyncId + ", CUJ=" + name); @@ -762,7 +762,9 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai * @param observer observer */ public void addObserver(HardwareRendererObserver observer) { - mRenderer.addObserver(observer); + if (observer != null) { + mRenderer.addObserver(observer); + } } /** @@ -770,7 +772,9 @@ public class FrameTracker implements HardwareRendererObserver.OnFrameMetricsAvai * @param observer observer */ public void removeObserver(HardwareRendererObserver observer) { - mRenderer.removeObserver(observer); + if (observer != null) { + mRenderer.removeObserver(observer); + } } } diff --git a/core/java/com/android/internal/jank/flags.aconfig b/core/java/com/android/internal/jank/flags.aconfig index 82f50ae848b3..287ad1856258 100644 --- a/core/java/com/android/internal/jank/flags.aconfig +++ b/core/java/com/android/internal/jank/flags.aconfig @@ -8,3 +8,10 @@ flag { bug: "354763298" is_fixed_read_only: true } +flag { + name: "ignore_hwui_is_first_frame" + namespace: "window_surfaces" + description: "Whether to remove the usage of the HWUI 'is first frame' flag to ignore jank" + bug: "354763298" + is_fixed_read_only: true +} -- GitLab From c165fabfa6ebe64b47d382cae7bcd8596c41a847 Mon Sep 17 00:00:00 2001 From: Josh Date: Wed, 16 Oct 2024 20:12:39 +0000 Subject: [PATCH 130/459] Fixed crashes due to HSUM issues + moved model conversion logic from UI layer to Domain layer + replaced default context (system) with current user context Fix: 369425977 Test: Manual - open shortcut helper from Chrome on HSUM enabled device, ensure device doesn't crash Flag: com.android.systemui.keyboard_shortcut_helper_rewrite Change-Id: Ifb9f0b6a193953190fa77a0b7865f6131f74a38d --- .../shortcut/ui/composable/ShortcutHelper.kt | 86 ++++--------------- .../shortcut/ui/model/ShortcutCategoryUi.kt | 34 ++++++++ .../shortcut/ui/model/ShortcutsUiState.kt | 3 +- .../ui/viewmodel/ShortcutHelperViewModel.kt | 86 ++++++++++++++++++- .../systemui/settings/UserContextProvider.kt | 12 ++- .../viewmodel/ShortcutHelperViewModelTest.kt | 36 ++++++-- .../shortcut/KeyboardShortcutHelperKosmos.kt | 4 +- 7 files changed, 169 insertions(+), 92 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutCategoryUi.kt diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt index 3c8bb09ddc09..901eafa29418 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt @@ -16,10 +16,7 @@ package com.android.systemui.keyboard.shortcut.ui.composable -import android.content.Context -import android.content.pm.PackageManager.NameNotFoundException import android.graphics.drawable.Icon -import android.util.Log import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Image @@ -55,12 +52,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.OpenInNew -import androidx.compose.material.icons.filled.Apps import androidx.compose.material.icons.filled.ExpandMore -import androidx.compose.material.icons.filled.Keyboard import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.Tv -import androidx.compose.material.icons.filled.VerticalSplit import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.HorizontalDivider @@ -111,16 +104,15 @@ import androidx.compose.ui.util.fastForEachIndexed import com.android.compose.modifiers.thenIf import com.android.compose.ui.graphics.painter.rememberDrawablePainter import com.android.systemui.keyboard.shortcut.shared.model.Shortcut as ShortcutModel -import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCommand import com.android.systemui.keyboard.shortcut.shared.model.ShortcutIcon import com.android.systemui.keyboard.shortcut.shared.model.ShortcutKey import com.android.systemui.keyboard.shortcut.shared.model.ShortcutSubCategory import com.android.systemui.keyboard.shortcut.ui.model.IconSource +import com.android.systemui.keyboard.shortcut.ui.model.ShortcutCategoryUi import com.android.systemui.keyboard.shortcut.ui.model.ShortcutsUiState import com.android.systemui.res.R -import com.android.systemui.statusbar.phone.CentralSurfaces @Composable fun ShortcutHelper( @@ -187,7 +179,7 @@ private fun ActiveShortcutHelper( private fun ShortcutHelperSinglePane( searchQuery: String, onSearchQueryChanged: (String) -> Unit, - categories: List, + categories: List, selectedCategoryType: ShortcutCategoryType?, onCategorySelected: (ShortcutCategoryType?) -> Unit, onKeyboardSettingsClicked: () -> Unit, @@ -228,7 +220,7 @@ private fun ShortcutHelperSinglePane( @Composable private fun CategoriesPanelSinglePane( searchQuery: String, - categories: List, + categories: List, selectedCategoryType: ShortcutCategoryType?, onCategorySelected: (ShortcutCategoryType?) -> Unit, ) { @@ -267,7 +259,7 @@ private fun CategoriesPanelSinglePane( @Composable private fun CategoryItemSinglePane( searchQuery: String, - category: ShortcutCategory, + category: ShortcutCategoryUi, isExpanded: Boolean, onClick: () -> Unit, shape: Shape, @@ -278,9 +270,9 @@ private fun CategoryItemSinglePane( verticalAlignment = Alignment.CenterVertically, modifier = Modifier.fillMaxWidth().heightIn(min = 88.dp).padding(horizontal = 16.dp), ) { - ShortcutCategoryIcon(modifier = Modifier.size(24.dp), source = category.icon) + ShortcutCategoryIcon(modifier = Modifier.size(24.dp), source = category.iconSource) Spacer(modifier = Modifier.width(16.dp)) - Text(category.label(LocalContext.current)) + Text(category.label) Spacer(modifier = Modifier.weight(1f)) RotatingExpandCollapseIcon(isExpanded) } @@ -291,23 +283,6 @@ private fun CategoryItemSinglePane( } } -private val ShortcutCategory.icon: IconSource - @Composable - get() = - when (type) { - ShortcutCategoryType.System -> IconSource(imageVector = Icons.Default.Tv) - ShortcutCategoryType.MultiTasking -> - IconSource(imageVector = Icons.Default.VerticalSplit) - ShortcutCategoryType.InputMethodEditor -> - IconSource(imageVector = Icons.Default.Keyboard) - ShortcutCategoryType.AppCategories -> IconSource(imageVector = Icons.Default.Apps) - is ShortcutCategoryType.CurrentApp -> { - val context = LocalContext.current - val iconDrawable = context.packageManager.getApplicationIcon(type.packageName) - IconSource(painter = rememberDrawablePainter(drawable = iconDrawable)) - } - } - @Composable fun ShortcutCategoryIcon( source: IconSource, @@ -322,37 +297,6 @@ fun ShortcutCategoryIcon( } } -private fun ShortcutCategory.label(context: Context): String = - when (type) { - ShortcutCategoryType.System -> context.getString(R.string.shortcut_helper_category_system) - ShortcutCategoryType.MultiTasking -> - context.getString(R.string.shortcut_helper_category_multitasking) - ShortcutCategoryType.InputMethodEditor -> - context.getString(R.string.shortcut_helper_category_input) - ShortcutCategoryType.AppCategories -> - context.getString(R.string.shortcut_helper_category_app_shortcuts) - is ShortcutCategoryType.CurrentApp -> getApplicationLabelForCurrentApp(type, context) - } - -private fun getApplicationLabelForCurrentApp( - type: ShortcutCategoryType.CurrentApp, - context: Context, -): String { - val packageManagerForUser = CentralSurfaces.getPackageManagerForUser(context, context.userId) - return try { - val currentAppInfo = - packageManagerForUser.getApplicationInfoAsUser( - type.packageName, - /* flags = */ 0, - context.userId, - ) - packageManagerForUser.getApplicationLabel(currentAppInfo).toString() - } catch (e: NameNotFoundException) { - Log.wtf(ShortcutHelper.TAG, "Couldn't find app info by package name ${type.packageName}") - context.getString(R.string.shortcut_helper_category_current_app_shortcuts) - } -} - @Composable private fun RotatingExpandCollapseIcon(isExpanded: Boolean) { val expandIconRotationDegrees by @@ -384,7 +328,7 @@ private fun RotatingExpandCollapseIcon(isExpanded: Boolean) { } @Composable -private fun ShortcutCategoryDetailsSinglePane(searchQuery: String, category: ShortcutCategory) { +private fun ShortcutCategoryDetailsSinglePane(searchQuery: String, category: ShortcutCategoryUi) { Column(Modifier.padding(horizontal = 16.dp)) { category.subCategories.fastForEach { subCategory -> ShortcutSubCategorySinglePane(searchQuery, subCategory) @@ -409,7 +353,7 @@ private fun ShortcutHelperTwoPane( searchQuery: String, onSearchQueryChanged: (String) -> Unit, modifier: Modifier = Modifier, - categories: List, + categories: List, selectedCategoryType: ShortcutCategoryType?, onCategorySelected: (ShortcutCategoryType?) -> Unit, onKeyboardSettingsClicked: () -> Unit, @@ -434,7 +378,7 @@ private fun ShortcutHelperTwoPane( } @Composable -private fun EndSidePanel(searchQuery: String, modifier: Modifier, category: ShortcutCategory?) { +private fun EndSidePanel(searchQuery: String, modifier: Modifier, category: ShortcutCategoryUi?) { val listState = rememberLazyListState() LaunchedEffect(key1 = category) { if (category != null) listState.animateScrollToItem(0) } if (category == null) { @@ -670,10 +614,10 @@ private fun textWithHighlightedSearchQuery(text: String, searchValue: String) = private fun StartSidePanel( onSearchQueryChanged: (String) -> Unit, modifier: Modifier, - categories: List, + categories: List, onKeyboardSettingsClicked: () -> Unit, selectedCategory: ShortcutCategoryType?, - onCategoryClicked: (ShortcutCategory) -> Unit, + onCategoryClicked: (ShortcutCategoryUi) -> Unit, ) { Column(modifier) { ShortcutsSearchBar(onSearchQueryChanged) @@ -690,15 +634,15 @@ private fun StartSidePanel( @Composable private fun CategoriesPanelTwoPane( - categories: List, + categories: List, selectedCategory: ShortcutCategoryType?, - onCategoryClicked: (ShortcutCategory) -> Unit, + onCategoryClicked: (ShortcutCategoryUi) -> Unit, ) { Column { categories.fastForEach { CategoryItemTwoPane( - label = it.label(LocalContext.current), - iconSource = it.icon, + label = it.label, + iconSource = it.iconSource, selected = selectedCategory == it.type, onClick = { onCategoryClicked(it) }, ) diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutCategoryUi.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutCategoryUi.kt new file mode 100644 index 000000000000..f5d478b5855d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutCategoryUi.kt @@ -0,0 +1,34 @@ +/* + * 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.keyboard.shortcut.ui.model + +import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory +import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType +import com.android.systemui.keyboard.shortcut.shared.model.ShortcutSubCategory + +data class ShortcutCategoryUi( + val label: String, + val iconSource: IconSource, + val type: ShortcutCategoryType, + val subCategories: List, +) { + constructor( + label: String, + iconSource: IconSource, + shortcutCategory: ShortcutCategory, + ) : this(label, iconSource, shortcutCategory.type, shortcutCategory.subCategories) +} diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutsUiState.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutsUiState.kt index d2122b3f173a..8f23261c3ef4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutsUiState.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/model/ShortcutsUiState.kt @@ -16,14 +16,13 @@ package com.android.systemui.keyboard.shortcut.ui.model -import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType sealed interface ShortcutsUiState { data class Active( val searchQuery: String, - val shortcutCategories: List, + val shortcutCategories: List, val defaultSelectedCategory: ShortcutCategoryType?, ) : ShortcutsUiState diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt index 04aa04d1f2af..20d09ede39e3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModel.kt @@ -17,6 +17,15 @@ package com.android.systemui.keyboard.shortcut.ui.viewmodel import android.app.role.RoleManager +import android.content.pm.PackageManager.NameNotFoundException +import android.util.Log +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Android +import androidx.compose.material.icons.filled.Apps +import androidx.compose.material.icons.filled.Keyboard +import androidx.compose.material.icons.filled.Tv +import androidx.compose.material.icons.filled.VerticalSplit +import com.android.compose.ui.graphics.painter.DrawablePainter import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.keyboard.shortcut.domain.interactor.ShortcutHelperCategoriesInteractor import com.android.systemui.keyboard.shortcut.domain.interactor.ShortcutHelperStateInteractor @@ -25,7 +34,10 @@ import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategory import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType import com.android.systemui.keyboard.shortcut.shared.model.ShortcutCategoryType.CurrentApp import com.android.systemui.keyboard.shortcut.shared.model.ShortcutSubCategory +import com.android.systemui.keyboard.shortcut.ui.model.IconSource +import com.android.systemui.keyboard.shortcut.ui.model.ShortcutCategoryUi import com.android.systemui.keyboard.shortcut.ui.model.ShortcutsUiState +import com.android.systemui.res.R import com.android.systemui.settings.UserTracker import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher @@ -51,6 +63,7 @@ constructor( ) { private val searchQuery = MutableStateFlow("") + private val userContext = userTracker.createCurrentUserContext(userTracker.userContext) val shouldShow = categoriesInteractor.shortcutCategories @@ -68,9 +81,10 @@ constructor( val categoriesWithLauncherExcluded = excludeLauncherApp(categories) val filteredCategories = filterCategoriesBySearchQuery(query, categoriesWithLauncherExcluded) + val shortcutCategoriesUi = convertCategoriesModelToUiModel(filteredCategories) ShortcutsUiState.Active( searchQuery = query, - shortcutCategories = filteredCategories, + shortcutCategories = shortcutCategoriesUi, defaultSelectedCategory = getDefaultSelectedCategory(filteredCategories), ) } @@ -78,9 +92,73 @@ constructor( .stateIn( scope = backgroundScope, started = SharingStarted.Lazily, - initialValue = ShortcutsUiState.Inactive + initialValue = ShortcutsUiState.Inactive, ) + private fun convertCategoriesModelToUiModel( + categories: List + ): List { + return categories.map { category -> + ShortcutCategoryUi( + label = getShortcutCategoryLabel(category.type), + iconSource = getShortcutCategoryIcon(category.type), + shortcutCategory = category, + ) + } + } + + private fun getShortcutCategoryIcon(type: ShortcutCategoryType): IconSource { + return when (type) { + ShortcutCategoryType.System -> IconSource(imageVector = Icons.Default.Tv) + ShortcutCategoryType.MultiTasking -> + IconSource(imageVector = Icons.Default.VerticalSplit) + ShortcutCategoryType.InputMethodEditor -> + IconSource(imageVector = Icons.Default.Keyboard) + ShortcutCategoryType.AppCategories -> IconSource(imageVector = Icons.Default.Apps) + is CurrentApp -> { + try { + val iconDrawable = + userContext.packageManager.getApplicationIcon(type.packageName) + IconSource(painter = DrawablePainter(drawable = iconDrawable)) + } catch (e: NameNotFoundException) { + Log.wtf( + "ShortcutHelperViewModel", + "Package not found when retrieving icon for ${type.packageName}", + ) + IconSource(imageVector = Icons.Default.Android) + } + } + } + } + + private fun getShortcutCategoryLabel(type: ShortcutCategoryType): String = + when (type) { + ShortcutCategoryType.System -> + userContext.getString(R.string.shortcut_helper_category_system) + ShortcutCategoryType.MultiTasking -> + userContext.getString(R.string.shortcut_helper_category_multitasking) + ShortcutCategoryType.InputMethodEditor -> + userContext.getString(R.string.shortcut_helper_category_input) + ShortcutCategoryType.AppCategories -> + userContext.getString(R.string.shortcut_helper_category_app_shortcuts) + is CurrentApp -> getApplicationLabelForCurrentApp(type) + } + + private fun getApplicationLabelForCurrentApp(type: CurrentApp): String { + try { + val packageManagerForUser = userContext.packageManager + val currentAppInfo = + packageManagerForUser.getApplicationInfo(type.packageName, /* flags= */ 0) + return packageManagerForUser.getApplicationLabel(currentAppInfo).toString() + } catch (e: NameNotFoundException) { + Log.wtf( + "ShortcutHelperViewModel", + "Package Not found when retrieving Label for ${type.packageName}", + ) + return "Current App" + } + } + private suspend fun excludeLauncherApp( categories: List ): List { @@ -111,7 +189,7 @@ constructor( private fun filterCategoriesBySearchQuery( query: String, - categories: List + categories: List, ): List { val lowerCaseTrimmedQuery = query.trim().lowercase() if (lowerCaseTrimmedQuery.isEmpty()) { @@ -132,7 +210,7 @@ constructor( private fun filterSubCategoriesBySearchQuery( subCategories: List, - query: String + query: String, ) = subCategories .map { subCategory -> diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt b/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt index dae851252271..258befe61bfe 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserContextProvider.kt @@ -18,15 +18,19 @@ package com.android.systemui.settings import android.content.Context -/** - * Implemented by [UserTrackerImpl]. - */ +/** Implemented by [UserTrackerImpl]. */ interface UserContextProvider { + /** + * provides system context, not current user context. + * + * To get current user context use [createCurrentUserContext] passing [userContext] as context + */ val userContext: Context /** * Creates the {@code context} with the current user. + * * @see Context#createContextAsUser(UserHandle, int) */ fun createCurrentUserContext(context: Context): Context -} \ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModelTest.kt index 6b607400edfd..7383faf2fd78 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModelTest.kt @@ -21,6 +21,9 @@ import android.app.role.mockRoleManager import android.view.KeyEvent import android.view.KeyboardShortcutGroup import android.view.KeyboardShortcutInfo +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Tv +import androidx.compose.material.icons.filled.VerticalSplit import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -41,13 +44,17 @@ import com.android.systemui.keyboard.shortcut.shortcutHelperMultiTaskingShortcut import com.android.systemui.keyboard.shortcut.shortcutHelperSystemShortcutsSource import com.android.systemui.keyboard.shortcut.shortcutHelperTestHelper import com.android.systemui.keyboard.shortcut.shortcutHelperViewModel +import com.android.systemui.keyboard.shortcut.ui.model.IconSource +import com.android.systemui.keyboard.shortcut.ui.model.ShortcutCategoryUi import com.android.systemui.keyboard.shortcut.ui.model.ShortcutsUiState import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.testCase import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.model.sysUiState +import com.android.systemui.settings.FakeUserTracker import com.android.systemui.settings.fakeUserTracker +import com.android.systemui.settings.userTracker import com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SHORTCUT_HELPER_SHOWING import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat @@ -76,6 +83,7 @@ class ShortcutHelperViewModelTest : SysuiTestCase() { it.shortcutHelperAppCategoriesShortcutsSource = FakeKeyboardShortcutGroupsSource() it.shortcutHelperInputShortcutsSource = FakeKeyboardShortcutGroupsSource() it.shortcutHelperCurrentAppShortcutsSource = fakeCurrentAppsSource + it.userTracker = FakeUserTracker(onCreateCurrentUserContext = { context }) } private val testScope = kosmos.testScope @@ -253,7 +261,7 @@ class ShortcutHelperViewModelTest : SysuiTestCase() { whenever( mockRoleManager.getRoleHoldersAsUser( RoleManager.ROLE_HOME, - fakeUserTracker.userHandle + fakeUserTracker.userHandle, ) ) .thenReturn(listOf(TestShortcuts.currentAppPackageName)) @@ -283,15 +291,25 @@ class ShortcutHelperViewModelTest : SysuiTestCase() { val activeUiState = uiState as ShortcutsUiState.Active assertThat(activeUiState.shortcutCategories) .containsExactly( - ShortcutCategory( - System, - subCategoryWithShortcutLabels("first Foo shortcut1"), - subCategoryWithShortcutLabels("second foO shortcut2") + ShortcutCategoryUi( + label = "System", + iconSource = IconSource(imageVector = Icons.Default.Tv), + shortcutCategory = + ShortcutCategory( + System, + subCategoryWithShortcutLabels("first Foo shortcut1"), + subCategoryWithShortcutLabels("second foO shortcut2"), + ), + ), + ShortcutCategoryUi( + label = "Multitasking", + iconSource = IconSource(imageVector = Icons.Default.VerticalSplit), + shortcutCategory = + ShortcutCategory( + MultiTasking, + subCategoryWithShortcutLabels("third FoO shortcut1"), + ), ), - ShortcutCategory( - MultiTasking, - subCategoryWithShortcutLabels("third FoO shortcut1") - ) ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt index fbfaba60ebf0..c41493eaa9c7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyboard/shortcut/KeyboardShortcutHelperKosmos.kt @@ -41,7 +41,7 @@ import com.android.systemui.kosmos.testDispatcher import com.android.systemui.kosmos.testScope import com.android.systemui.model.sysUiState import com.android.systemui.settings.displayTracker -import com.android.systemui.settings.fakeUserTracker +import com.android.systemui.settings.userTracker var Kosmos.shortcutHelperAppCategoriesShortcutsSource: KeyboardShortcutGroupsSource by Kosmos.Fixture { AppCategoriesShortcutsSource(windowManager, testDispatcher) } @@ -114,7 +114,7 @@ val Kosmos.shortcutHelperViewModel by Kosmos.Fixture { ShortcutHelperViewModel( mockRoleManager, - fakeUserTracker, + userTracker, applicationCoroutineScope, testDispatcher, shortcutHelperStateInteractor, -- GitLab From 89feacb0697025286bf60be6766ba96aa8c24a0f Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Thu, 10 Oct 2024 09:15:17 +0000 Subject: [PATCH 131/459] [API change] Add EDGE_NONE option for BackEvent#swipeEdge The EDGE_NONE option indicates that the back event was not triggered by an edge swipe back gesture. This applies to cases like using the back button in 3-button navigation or pressing a hardware back button. Bug: 362938401 Flag: com.android.window.flags.predictive_back_swipe_edge_none_api Test: OnBackInvokedCallbackGestureTest Change-Id: Ib10c0cffb087a9a9a3a43cf27456d5319572f8bc --- core/api/current.txt | 1 + core/java/android/view/ViewRootImpl.java | 10 ++++++++-- core/java/android/window/BackEvent.java | 9 +++++++++ .../android/window/flags/windowing_frontend.aconfig | 8 ++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index db302f43dfe0..281f16f744e2 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -61694,6 +61694,7 @@ package android.window { method public float getTouchX(); method public float getTouchY(); field public static final int EDGE_LEFT = 0; // 0x0 + field @FlaggedApi("com.android.window.flags.predictive_back_swipe_edge_none_api") public static final int EDGE_NONE = 2; // 0x2 field public static final int EDGE_RIGHT = 1; // 0x1 } diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b921213cc26c..b3d86254a3e6 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -130,6 +130,7 @@ import static android.window.DesktopModeFlags.ENABLE_CAPTION_COMPAT_INSET_FORCE_ import static com.android.internal.annotations.VisibleForTesting.Visibility.PACKAGE; import static com.android.text.flags.Flags.disableHandwritingInitiatorForIme; import static com.android.window.flags.Flags.enableBufferTransformHintFromDisplay; +import static com.android.window.flags.Flags.predictiveBackSwipeEdgeNoneApi; import static com.android.window.flags.Flags.setScPropertiesInClient; import static com.android.window.flags.Flags.systemUiImmersiveConfirmationDialog; @@ -7531,8 +7532,13 @@ public final class ViewRootImpl implements ViewParent, // - 0 means the button was pressed. // - 1 means the button continues to be pressed (long press). if (keyEvent.getRepeatCount() == 0) { - animationCallback.onBackStarted( - new BackEvent(0, 0, 0f, BackEvent.EDGE_LEFT)); + BackEvent backEvent; + if (predictiveBackSwipeEdgeNoneApi()) { + backEvent = new BackEvent(0, 0, 0f, BackEvent.EDGE_NONE); + } else { + backEvent = new BackEvent(0, 0, 0f, BackEvent.EDGE_LEFT); + } + animationCallback.onBackStarted(backEvent); } break; case KeyEvent.ACTION_UP: diff --git a/core/java/android/window/BackEvent.java b/core/java/android/window/BackEvent.java index 1c3f201c1471..dfed4b3068b6 100644 --- a/core/java/android/window/BackEvent.java +++ b/core/java/android/window/BackEvent.java @@ -16,6 +16,7 @@ package android.window; +import static com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_SWIPE_EDGE_NONE_API; import static com.android.window.flags.Flags.FLAG_PREDICTIVE_BACK_TIMESTAMP_API; import static com.android.window.flags.Flags.predictiveBackTimestampApi; @@ -37,11 +38,19 @@ public final class BackEvent { public static final int EDGE_LEFT = 0; /** Indicates that the edge swipe starts from the right edge of the screen */ public static final int EDGE_RIGHT = 1; + /** + * Indicates that the back event was not triggered by an edge swipe back gesture. This applies + * to cases like using the back button in 3-button navigation or pressing a hardware back + * button. + */ + @FlaggedApi(FLAG_PREDICTIVE_BACK_SWIPE_EDGE_NONE_API) + public static final int EDGE_NONE = 2; /** @hide */ @IntDef({ EDGE_LEFT, EDGE_RIGHT, + EDGE_NONE, }) @Retention(RetentionPolicy.SOURCE) public @interface SwipeEdge{} diff --git a/core/java/android/window/flags/windowing_frontend.aconfig b/core/java/android/window/flags/windowing_frontend.aconfig index 460469c13a3e..8d70e9f9cbab 100644 --- a/core/java/android/window/flags/windowing_frontend.aconfig +++ b/core/java/android/window/flags/windowing_frontend.aconfig @@ -333,3 +333,11 @@ flag { is_fixed_read_only: true bug: "362938401" } + +flag { + name: "predictive_back_swipe_edge_none_api" + namespace: "systemui" + description: "EDGE_NONE swipeEdge option in BackEvent" + is_fixed_read_only: true + bug: "362938401" +} -- GitLab From 1c4bfb047aba1c6ecc226376af058e7609553697 Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Thu, 17 Oct 2024 13:16:08 -0400 Subject: [PATCH 132/459] Auto scroll to the top when dragging a tile in Edit mode Also fixes scrolling for Edit mode Test: Manually Flag: com.android.systemui.qs_ui_refactor_compose_fragment Fixes: 346990572 Change-Id: Ibe78013cdec8ba25c6d3d16c7a0aadca266a6ec9 --- .../qs/composefragment/QSFragmentCompose.kt | 2 +- .../qs/panels/ui/compose/infinitegrid/EditTile.kt | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) 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 6db91ac073ba..4071b135dfaf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -221,7 +221,7 @@ constructor( { 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.isQsFullyExpanded }, + { (scrollState.canScrollForward && viewModel.isQsFullyExpanded) || isCustomizing }, ) frame.addView( composeView, diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index d2ec958c17b7..b581c8bf953f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -202,14 +202,17 @@ fun DefaultEditTileGrid( topBar = { EditModeTopBar(onStopEditing = onStopEditing, onReset = reset) }, ) { innerPadding -> CompositionLocalProvider(LocalOverscrollConfiguration provides null) { + val scrollState = rememberScrollState() + LaunchedEffect(listState.dragInProgress) { + if (listState.dragInProgress) { + scrollState.animateScrollTo(0) + } + } + Column( verticalArrangement = spacedBy(dimensionResource(id = R.dimen.qs_label_container_margin)), - modifier = - modifier - .fillMaxSize() - .verticalScroll(rememberScrollState()) - .padding(innerPadding), + modifier = modifier.fillMaxSize().verticalScroll(scrollState).padding(innerPadding), ) { AnimatedContent( targetState = listState.dragInProgress, -- GitLab From 4556c167cc2d0b0541b0dd95bca37ceb41d97c59 Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Thu, 17 Oct 2024 11:28:55 -0400 Subject: [PATCH 133/459] Check the tile's state before handling long clicks Some tiles do not handle long clicks Test: manually Flag: com.android.systemui.qs_ui_refactor_compose_fragment Fixes: 374089977 Change-Id: I422b05b4301d106025e672b371aea809889c4e05 --- .../qs/panels/ui/compose/infinitegrid/CommonTile.kt | 11 +++++------ .../qs/panels/ui/compose/infinitegrid/Tile.kt | 13 ++++++------- .../systemui/qs/panels/ui/viewmodel/TileUiState.kt | 2 ++ 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt index 71fa0ac30fb7..7b2593952599 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt @@ -77,25 +77,24 @@ fun LargeTileContent( colors: TileColors, squishiness: () -> Float, accessibilityUiState: AccessibilityUiState? = null, - toggleClickSupported: Boolean = false, iconShape: Shape = RoundedCornerShape(CommonTileDefaults.InactiveCornerRadius), - onClick: () -> Unit = {}, - onLongClick: () -> Unit = {}, + toggleClick: (() -> Unit)? = null, + onLongClick: (() -> Unit)? = null, ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = tileHorizontalArrangement(), ) { // Icon - val longPressLabel = longPressLabel() + val longPressLabel = longPressLabel().takeIf { onLongClick != null } Box( modifier = - Modifier.size(CommonTileDefaults.ToggleTargetSize).thenIf(toggleClickSupported) { + Modifier.size(CommonTileDefaults.ToggleTargetSize).thenIf(toggleClick != null) { Modifier.clip(iconShape) .verticalSquish(squishiness) .background(colors.iconBackground, { 1f }) .combinedClickable( - onClick = onClick, + onClick = toggleClick!!, onLongClick = onLongClick, onLongClickLabel = longPressLabel, ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt index 52d526123430..5f28fe427707 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt @@ -160,19 +160,18 @@ fun Tile( ) } else { val iconShape = TileDefaults.animateIconShape(uiState.state) + val secondaryClick: (() -> Unit)? = + { tile.onSecondaryClick() }.takeIf { uiState.handlesSecondaryClick } + val longClick: (() -> Unit)? = + { tile.onLongClick(expandable) }.takeIf { uiState.handlesLongClick } LargeTileContent( label = uiState.label, secondaryLabel = uiState.secondaryLabel, icon = icon, colors = colors, iconShape = iconShape, - toggleClickSupported = state.handlesSecondaryClick, - onClick = { - if (state.handlesSecondaryClick) { - tile.onSecondaryClick() - } - }, - onLongClick = { tile.onLongClick(expandable) }, + toggleClick = secondaryClick, + onLongClick = longClick, accessibilityUiState = uiState.accessibilityUiState, squishiness = squishiness, ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiState.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiState.kt index aa420800be7b..56675e49d4e6 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiState.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/TileUiState.kt @@ -33,6 +33,7 @@ data class TileUiState( val label: String, val secondaryLabel: String, val state: Int, + val handlesLongClick: Boolean, val handlesSecondaryClick: Boolean, val icon: Supplier, val accessibilityUiState: AccessibilityUiState, @@ -86,6 +87,7 @@ fun QSTile.State.toUiState(resources: Resources): TileUiState { label = label?.toString() ?: "", secondaryLabel = secondaryLabel?.toString() ?: "", state = if (disabledByPolicy) Tile.STATE_UNAVAILABLE else state, + handlesLongClick = handlesLongClick, handlesSecondaryClick = handlesSecondaryClick, icon = icon?.let { Supplier { icon } } ?: iconSupplier ?: Supplier { null }, AccessibilityUiState( -- GitLab From 38f03c23f313bbd2984bc6cf7e33b2b61a191741 Mon Sep 17 00:00:00 2001 From: Charles Chen Date: Mon, 23 Sep 2024 11:30:11 +0800 Subject: [PATCH 134/459] Report non-match parent window bounds in TaskInfo Test: presubmit Bug: 356277166 Flag: com.android.window.flags.better_support_non_match_parent_activity Change-Id: Ib5da0c4761227b611dac20d98e3eb311f3ee081b --- core/java/android/app/TaskInfo.java | 15 +++++++++- .../core/java/com/android/server/wm/Task.java | 30 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/TaskInfo.java b/core/java/android/app/TaskInfo.java index e882bb564db9..081ce31e0886 100644 --- a/core/java/android/app/TaskInfo.java +++ b/core/java/android/app/TaskInfo.java @@ -345,6 +345,15 @@ public class TaskInfo { */ public AppCompatTaskInfo appCompatTaskInfo = AppCompatTaskInfo.create(); + /** + * The top activity's main window frame if it doesn't match the top activity bounds. + * {@code null}, otherwise. + * + * @hide + */ + @Nullable + public Rect topActivityMainWindowFrame; + TaskInfo() { // Do nothing } @@ -477,7 +486,8 @@ public class TaskInfo { && Objects.equals(capturedLink, that.capturedLink) && capturedLinkTimestamp == that.capturedLinkTimestamp && requestedVisibleTypes == that.requestedVisibleTypes - && appCompatTaskInfo.equalsForTaskOrganizer(that.appCompatTaskInfo); + && appCompatTaskInfo.equalsForTaskOrganizer(that.appCompatTaskInfo) + && Objects.equals(topActivityMainWindowFrame, that.topActivityMainWindowFrame); } /** @@ -553,6 +563,7 @@ public class TaskInfo { capturedLinkTimestamp = source.readLong(); requestedVisibleTypes = source.readInt(); appCompatTaskInfo = source.readTypedObject(AppCompatTaskInfo.CREATOR); + topActivityMainWindowFrame = source.readTypedObject(Rect.CREATOR); } /** @@ -606,6 +617,7 @@ public class TaskInfo { dest.writeLong(capturedLinkTimestamp); dest.writeInt(requestedVisibleTypes); dest.writeTypedObject(appCompatTaskInfo, flags); + dest.writeTypedObject(topActivityMainWindowFrame, flags); } @Override @@ -649,6 +661,7 @@ public class TaskInfo { + " capturedLinkTimestamp=" + capturedLinkTimestamp + " requestedVisibleTypes=" + requestedVisibleTypes + " appCompatTaskInfo=" + appCompatTaskInfo + + " topActivityMainWindowFrame=" + topActivityMainWindowFrame + "}"; } } diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java index 4861341f830a..e930e9753c13 100644 --- a/services/core/java/com/android/server/wm/Task.java +++ b/services/core/java/com/android/server/wm/Task.java @@ -3410,6 +3410,36 @@ class Task extends TaskFragment { info.requestedVisibleTypes = (windowState != null && Flags.enableFullyImmersiveInDesktop()) ? windowState.getRequestedVisibleTypes() : WindowInsets.Type.defaultVisible(); AppCompatUtils.fillAppCompatTaskInfo(this, info, top); + info.topActivityMainWindowFrame = calculateTopActivityMainWindowFrameForTaskInfo(top); + } + + /** + * Returns the top activity's main window frame if it doesn't match + * {@link ActivityRecord#getBounds() the top activity bounds}, or {@code null}, otherwise. + * + * @param top The top running activity of the task + */ + @Nullable + private static Rect calculateTopActivityMainWindowFrameForTaskInfo( + @Nullable ActivityRecord top) { + if (!Flags.betterSupportNonMatchParentActivity()) { + return null; + } + if (top == null) { + return null; + } + final WindowState mainWindow = top.findMainWindow(); + if (mainWindow == null) { + return null; + } + if (!mainWindow.mHaveFrame) { + return null; + } + final Rect windowFrame = mainWindow.getFrame(); + if (top.getBounds().equals(windowFrame)) { + return null; + } + return windowFrame; } /** -- GitLab From 90bef8a82e033b2ab3cdc9b80c14f2956e39983d Mon Sep 17 00:00:00 2001 From: Omar Miatello Date: Mon, 21 Oct 2024 15:50:54 +0000 Subject: [PATCH 135/459] Revert^2 "Simplify PriorityNestedScrollConnection" This reverts commit 7f60633a61a30bf859f63e8c7e9eac26ddc67d70. Reason for revert: A fix will be applied on top of this revert Change-Id: I405ad66f57d65bfeec98cc2ab4f98896c2f616da --- ...NotificationScrimNestedScrollConnection.kt | 18 +-- ...NotificationStackNestedScrollConnection.kt | 18 ++- .../animation/scene/DraggableHandler.kt | 9 +- .../LargeTopAppBarNestedScrollConnection.kt | 18 +-- .../PriorityNestedScrollConnection.kt | 150 +++++++++++------- .../PriorityNestedScrollConnectionTest.kt | 53 ++++--- ...ficationScrimNestedScrollConnectionTest.kt | 11 +- 7 files changed, 165 insertions(+), 112 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt index 8b9e9274b448..779934d8d211 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt @@ -18,6 +18,8 @@ package com.android.systemui.notifications.ui.composable import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.util.fastCoerceAtLeast +import androidx.compose.ui.util.fastCoerceAtMost import com.android.compose.nestedscroll.PriorityNestedScrollConnection /** @@ -44,7 +46,7 @@ fun NotificationScrimNestedScrollConnection( orientation = Orientation.Vertical, // scrolling up and inner content is taller than the scrim, so scrim needs to // expand; content can scroll once scrim is at the minScrimOffset. - canStartPreScroll = { offsetAvailable, offsetBeforeStart -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> offsetAvailable < 0 && offsetBeforeStart == 0f && contentHeight() > minVisibleScrimHeight() && @@ -52,25 +54,21 @@ fun NotificationScrimNestedScrollConnection( }, // scrolling down and content is done scrolling to top. After that, the scrim // needs to collapse; collapse the scrim until it is at the maxScrimOffset. - canStartPostScroll = { offsetAvailable, _ -> + canStartPostScroll = { offsetAvailable, _, _ -> offsetAvailable > 0 && (scrimOffset() < maxScrimOffset || isCurrentGestureOverscroll()) }, canStartPostFling = { false }, - canContinueScroll = { - val currentHeight = scrimOffset() - minScrimOffset() < currentHeight && currentHeight < maxScrimOffset - }, - canScrollOnFling = true, + canStopOnPreFling = { false }, onStart = { offsetAvailable -> onStart(offsetAvailable) }, - onScroll = { offsetAvailable -> + onScroll = { offsetAvailable, _ -> val currentHeight = scrimOffset() val amountConsumed = if (offsetAvailable > 0) { val amountLeft = maxScrimOffset - currentHeight - offsetAvailable.coerceAtMost(amountLeft) + offsetAvailable.fastCoerceAtMost(amountLeft) } else { val amountLeft = minScrimOffset() - currentHeight - offsetAvailable.coerceAtLeast(amountLeft) + offsetAvailable.fastCoerceAtLeast(amountLeft) } snapScrimOffset(currentHeight + amountConsumed) amountConsumed diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt index a706585deebc..42dd1be51d44 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt @@ -28,6 +28,7 @@ import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastCoerceAtLeast import com.android.compose.nestedscroll.PriorityNestedScrollConnection import kotlin.math.max import kotlin.math.roundToInt @@ -86,17 +87,20 @@ fun NotificationStackNestedScrollConnection( ): PriorityNestedScrollConnection { return PriorityNestedScrollConnection( orientation = Orientation.Vertical, - canStartPreScroll = { _, _ -> false }, - canStartPostScroll = { offsetAvailable, offsetBeforeStart -> + canStartPreScroll = { _, _, _ -> false }, + canStartPostScroll = { offsetAvailable, offsetBeforeStart, _ -> offsetAvailable < 0f && offsetBeforeStart < 0f && !canScrollForward() }, canStartPostFling = { velocityAvailable -> velocityAvailable < 0f && !canScrollForward() }, - canContinueScroll = { stackOffset() > 0f }, - canScrollOnFling = true, + canStopOnPreFling = { false }, onStart = { offsetAvailable -> onStart(offsetAvailable) }, - onScroll = { offsetAvailable -> - onScroll(offsetAvailable) - offsetAvailable + onScroll = { offsetAvailable, _ -> + val minOffset = 0f + val consumed = offsetAvailable.fastCoerceAtLeast(minOffset - stackOffset()) + if (consumed != 0f) { + onScroll(consumed) + } + consumed }, onStop = { velocityAvailable -> onStop(velocityAvailable) 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 e5ef79b37b88..03fa971f332d 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 @@ -612,7 +612,7 @@ internal class NestedScrollHandlerImpl( return PriorityNestedScrollConnection( orientation = orientation, - canStartPreScroll = { offsetAvailable, offsetBeforeStart -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> canChangeScene = if (isExternalOverscrollGesture()) false else offsetBeforeStart == 0f @@ -644,7 +644,7 @@ internal class NestedScrollHandlerImpl( isIntercepting = true true }, - canStartPostScroll = { offsetAvailable, offsetBeforeStart -> + canStartPostScroll = { offsetAvailable, offsetBeforeStart, _ -> val behavior: NestedScrollBehavior = when { offsetAvailable > 0f -> topOrLeftBehavior @@ -709,8 +709,7 @@ internal class NestedScrollHandlerImpl( canStart }, - canContinueScroll = { true }, - canScrollOnFling = false, + canStopOnPreFling = { true }, onStart = { offsetAvailable -> val pointersInfo = pointersInfo() dragController = @@ -720,7 +719,7 @@ internal class NestedScrollHandlerImpl( overSlop = if (isIntercepting) 0f else offsetAvailable, ) }, - onScroll = { offsetAvailable -> + onScroll = { offsetAvailable, _ -> val controller = dragController ?: error("Should be called after onStart") val pointersInfo = pointersInfoOwner.pointersInfo() diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt index 4ae323517b26..b05f02224327 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt @@ -18,6 +18,8 @@ package com.android.compose.nestedscroll import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.input.nestedscroll.NestedScrollConnection +import androidx.compose.ui.util.fastCoerceAtLeast +import androidx.compose.ui.util.fastCoerceAtMost /** * A [NestedScrollConnection] that listens for all vertical scroll events and responds in the @@ -43,30 +45,26 @@ fun LargeTopAppBarNestedScrollConnection( orientation = Orientation.Vertical, // When swiping up, the LargeTopAppBar will shrink (to [minHeight]) and the content will // expand. Then, you can then scroll down the content. - canStartPreScroll = { offsetAvailable, offsetBeforeStart -> + canStartPreScroll = { offsetAvailable, offsetBeforeStart, _ -> offsetAvailable < 0 && offsetBeforeStart == 0f && height() > minHeight() }, // When swiping down, the content will scroll up until it reaches the top. Then, the // LargeTopAppBar will expand until it reaches its [maxHeight]. - canStartPostScroll = { offsetAvailable, _ -> + canStartPostScroll = { offsetAvailable, _, _ -> offsetAvailable > 0 && height() < maxHeight() }, canStartPostFling = { false }, - canContinueScroll = { - val currentHeight = height() - minHeight() < currentHeight && currentHeight < maxHeight() - }, - canScrollOnFling = true, + canStopOnPreFling = { false }, onStart = { /* do nothing */ }, - onScroll = { offsetAvailable -> + onScroll = { offsetAvailable, _ -> val currentHeight = height() val amountConsumed = if (offsetAvailable > 0) { val amountLeft = maxHeight() - currentHeight - offsetAvailable.coerceAtMost(amountLeft) + offsetAvailable.fastCoerceAtMost(amountLeft) } else { val amountLeft = minHeight() - currentHeight - offsetAvailable.coerceAtLeast(amountLeft) + offsetAvailable.fastCoerceAtLeast(amountLeft) } onHeightChanged(currentHeight + amountConsumed) amountConsumed diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt index a3641e6635e7..e3cddc1a8f1d 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt @@ -27,25 +27,39 @@ import kotlin.math.sign internal typealias SuspendedValue = suspend () -> T /** - * This [NestedScrollConnection] waits for a child to scroll ([onPreScroll] or [onPostScroll]), and - * then decides (via [canStartPreScroll] or [canStartPostScroll]) if it should take over scrolling. - * If it does, it will scroll before its children, until [canContinueScroll] allows it. + * A [NestedScrollConnection] that intercepts scroll events in priority mode. * - * Note: Call [reset] before destroying this object to make sure you always get a call to [onStop] - * after [onStart]. + * Priority mode allows this connection to take control over scroll events within a nested scroll + * hierarchy. When in priority mode, this connection consumes scroll events before its children, + * enabling custom scrolling behaviors like sticky headers. * + * @param orientation The orientation of the scroll. + * @param canStartPreScroll lambda that returns true if the connection can start consuming scroll + * events in pre-scroll mode. + * @param canStartPostScroll lambda that returns true if the connection can start consuming scroll + * events in post-scroll mode. + * @param canStartPostFling lambda that returns true if the connection can start consuming scroll + * events in post-fling mode. + * @param canStopOnPreFling lambda that returns true if the connection can stop consuming scroll + * events in pre-fling (i.e. as soon as the user lifts their fingers). + * @param onStart lambda that is called when the connection starts consuming scroll events. + * @param onScroll lambda that is called when the connection consumes a scroll event and returns the + * consumed amount. + * @param onStop lambda that is called when the connection stops consuming scroll events and returns + * the consumed velocity. * @sample LargeTopAppBarNestedScrollConnection * @sample com.android.compose.animation.scene.NestedScrollHandlerImpl.nestedScrollConnection */ class PriorityNestedScrollConnection( orientation: Orientation, - private val canStartPreScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean, - private val canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float) -> Boolean, + private val canStartPreScroll: + (offsetAvailable: Float, offsetBeforeStart: Float, source: NestedScrollSource) -> Boolean, + private val canStartPostScroll: + (offsetAvailable: Float, offsetBeforeStart: Float, source: NestedScrollSource) -> Boolean, private val canStartPostFling: (velocityAvailable: Float) -> Boolean, - private val canContinueScroll: (source: NestedScrollSource) -> Boolean, - private val canScrollOnFling: Boolean, + private val canStopOnPreFling: () -> Boolean, private val onStart: (offsetAvailable: Float) -> Unit, - private val onScroll: (offsetAvailable: Float) -> Float, + private val onScroll: (offsetAvailable: Float, source: NestedScrollSource) -> Float, private val onStop: (velocityAvailable: Float) -> SuspendedValue, ) : NestedScrollConnection, SpaceVectorConverter by SpaceVectorConverter(orientation) { @@ -64,62 +78,48 @@ class PriorityNestedScrollConnection( // the beginning or from the last fling gesture. val offsetBeforeStart = offsetScrolledBeforePriorityMode - availableFloat - if ( - isPriorityMode || - (source == NestedScrollSource.SideEffect && !canScrollOnFling) || - !canStartPostScroll(availableFloat, offsetBeforeStart) - ) { + if (isPriorityMode || !canStartPostScroll(availableFloat, offsetBeforeStart, source)) { // The priority mode cannot start so we won't consume the available offset. return Offset.Zero } - return onPriorityStart(availableFloat).toOffset() + return start(availableFloat, source).toOffset() } override fun onPreScroll(available: Offset, source: NestedScrollSource): Offset { if (!isPriorityMode) { - if (source == NestedScrollSource.UserInput || canScrollOnFling) { - val availableFloat = available.toFloat() - if (canStartPreScroll(availableFloat, offsetScrolledBeforePriorityMode)) { - return onPriorityStart(availableFloat).toOffset() - } - // We want to track the amount of offset consumed before entering priority mode - offsetScrolledBeforePriorityMode += availableFloat + val availableFloat = available.toFloat() + if (canStartPreScroll(availableFloat, offsetScrolledBeforePriorityMode, source)) { + return start(availableFloat, source).toOffset() } - - return Offset.Zero - } - - val availableFloat = available.toFloat() - if (!canContinueScroll(source)) { - // Step 3a: We have lost priority and we no longer need to intercept scroll events. - onPriorityStop(velocity = 0f) - - // We've just reset offsetScrolledBeforePriorityMode to 0f // We want to track the amount of offset consumed before entering priority mode offsetScrolledBeforePriorityMode += availableFloat - return Offset.Zero } - // Step 2: We have the priority and can consume the scroll events. - return onScroll(availableFloat).toOffset() + return scroll(available.toFloat(), source).toOffset() } override suspend fun onPreFling(available: Velocity): Velocity { - if (isPriorityMode && canScrollOnFling) { - // We don't want to consume the velocity, we prefer to continue receiving scroll events. + if (!isPriorityMode) { + resetOffsetTracker() return Velocity.Zero } - // Step 3b: The finger is lifted, we can stop intercepting scroll events and use the speed - // of the fling gesture. - return onPriorityStop(velocity = available.toFloat()).invoke().toVelocity() + + if (canStopOnPreFling()) { + // Step 3b: The finger is lifted, we can stop intercepting scroll events and use the + // velocity of the fling gesture. + return stop(velocityAvailable = available.toFloat()).toVelocity() + } + + // We don't want to consume the velocity, we prefer to continue receiving scroll events. + return Velocity.Zero } override suspend fun onPostFling(consumed: Velocity, available: Velocity): Velocity { val availableFloat = available.toFloat() if (isPriorityMode) { - return onPriorityStop(velocity = availableFloat).invoke().toVelocity() + return stop(velocityAvailable = availableFloat).toVelocity() } if (!canStartPostFling(availableFloat)) { @@ -131,10 +131,14 @@ class PriorityNestedScrollConnection( // TODO(b/291053278): Remove canStartPostFling() and instead make it possible to define the // overscroll behavior on the Scene level. val smallOffset = availableFloat.sign - onPriorityStart(availableOffset = smallOffset) + start( + availableOffset = smallOffset, + source = NestedScrollSource.SideEffect, + skipScroll = true, + ) // This is the last event of a scroll gesture. - return onPriorityStop(availableFloat).invoke().toVelocity() + return stop(availableFloat).toVelocity() } /** @@ -143,13 +147,25 @@ class PriorityNestedScrollConnection( * TODO(b/303224944) This method should be removed. */ fun reset() { - // Step 3c: To ensure that an onStop is always called for every onStart. - onPriorityStop(velocity = 0f) + if (isPriorityMode) { + // Step 3c: To ensure that an onStop is always called for every onStart. + cancel() + } else { + resetOffsetTracker() + } } - private fun onPriorityStart(availableOffset: Float): Float { - if (isPriorityMode) { - error("This should never happen, onPriorityStart() was called when isPriorityMode") + private fun shouldStop(consumed: Float): Boolean { + return consumed == 0f + } + + private fun start( + availableOffset: Float, + source: NestedScrollSource, + skipScroll: Boolean = false, + ): Float { + check(!isPriorityMode) { + "This should never happen, start() was called when isPriorityMode" } // Step 1: It's our turn! We start capturing scroll events when one of our children has an @@ -160,19 +176,41 @@ class PriorityNestedScrollConnection( // lifted (step 3b), or this object has been destroyed (step 3c). onStart(availableOffset) - return onScroll(availableOffset) + return if (skipScroll) 0f else scroll(availableOffset, source) } - private fun onPriorityStop(velocity: Float): SuspendedValue { - // We can restart tracking the consumed offsets from scratch. - offsetScrolledBeforePriorityMode = 0f + private fun scroll(offsetAvailable: Float, source: NestedScrollSource): Float { + // Step 2: We have the priority and can consume the scroll events. + val consumedByScroll = onScroll(offsetAvailable, source) - if (!isPriorityMode) { - return { 0f } + if (shouldStop(consumedByScroll)) { + // Step 3a: We have lost priority and we no longer need to intercept scroll events. + cancel() + + // We've just reset offsetScrolledBeforePriorityMode to 0f + // We want to track the amount of offset consumed before entering priority mode + offsetScrolledBeforePriorityMode += offsetAvailable - consumedByScroll } + return consumedByScroll + } + + /** Reset the tracking of consumed offsets before entering in priority mode. */ + private fun resetOffsetTracker() { + offsetScrolledBeforePriorityMode = 0f + } + + private suspend fun stop(velocityAvailable: Float): Float { + check(isPriorityMode) { "This should never happen, stop() was called before start()" } isPriorityMode = false + resetOffsetTracker() + return onStop(velocityAvailable).invoke() + } - return onStop(velocity) + private fun cancel() { + check(isPriorityMode) { "This should never happen, cancel() was called before start()" } + isPriorityMode = false + resetOffsetTracker() + onStop(0f) } } diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt index badc43bd3e0f..9363ecbf63dc 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt @@ -34,29 +34,28 @@ class PriorityNestedScrollConnectionTest { private var canStartPreScroll = false private var canStartPostScroll = false private var canStartPostFling = false - private var canContinueScroll = false + private var canStopOnPreFling = true private var isStarted = false private var lastScroll: Float? = null - private var returnOnScroll = 0f + private var consumeScroll = true private var lastStop: Float? = null - private var returnOnStop = 0f + private var consumeStop = true private val scrollConnection = PriorityNestedScrollConnection( orientation = Orientation.Vertical, - canStartPreScroll = { _, _ -> canStartPreScroll }, - canStartPostScroll = { _, _ -> canStartPostScroll }, + canStartPreScroll = { _, _, _ -> canStartPreScroll }, + canStartPostScroll = { _, _, _ -> canStartPostScroll }, canStartPostFling = { canStartPostFling }, - canContinueScroll = { canContinueScroll }, - canScrollOnFling = false, + canStopOnPreFling = { canStopOnPreFling }, onStart = { isStarted = true }, - onScroll = { - lastScroll = it - returnOnScroll + onScroll = { offsetAvailable, _ -> + lastScroll = offsetAvailable + if (consumeScroll) offsetAvailable else 0f }, onStop = { lastStop = it - { returnOnStop } + { if (consumeStop) it else 0f } }, ) @@ -85,7 +84,7 @@ class PriorityNestedScrollConnectionTest { canStartPostScroll = true scrollConnection.onPostScroll( consumed = Offset.Zero, - available = Offset.Zero, + available = Offset(1f, 1f), source = UserInput, ) } @@ -136,21 +135,21 @@ class PriorityNestedScrollConnectionTest { @Test fun step2_onPriorityMode_shouldContinueIfAllowed() { startPriorityModePostScroll() - canContinueScroll = true - scrollConnection.onPreScroll(available = Offset(1f, 1f), source = UserInput) + val scroll1 = scrollConnection.onPreScroll(available = Offset(0f, 1f), source = UserInput) assertThat(lastScroll).isEqualTo(1f) + assertThat(scroll1.y).isEqualTo(1f) - canContinueScroll = false - scrollConnection.onPreScroll(available = Offset(2f, 2f), source = UserInput) - assertThat(lastScroll).isNotEqualTo(2f) - assertThat(lastScroll).isEqualTo(1f) + consumeScroll = false + val scroll2 = scrollConnection.onPreScroll(available = Offset(0f, 2f), source = UserInput) + assertThat(lastScroll).isEqualTo(2f) + assertThat(scroll2.y).isEqualTo(0f) } @Test fun step3a_onPriorityMode_shouldStopIfCannotContinue() { startPriorityModePostScroll() - canContinueScroll = false + consumeScroll = false scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput) @@ -160,17 +159,27 @@ class PriorityNestedScrollConnectionTest { @Test fun step3b_onPriorityMode_shouldStopOnFling() = runTest { startPriorityModePostScroll() - canContinueScroll = true scrollConnection.onPreFling(available = Velocity.Zero) - assertThat(lastStop).isNotNull() + assertThat(lastStop).isEqualTo(0f) + } + + @Test + fun ifCannotStopOnPreFling_shouldStopOnPostFling() = runTest { + startPriorityModePostScroll() + canStopOnPreFling = false + + scrollConnection.onPreFling(available = Velocity.Zero) + assertThat(lastStop).isNull() + + scrollConnection.onPostFling(consumed = Velocity.Zero, available = Velocity.Zero) + assertThat(lastStop).isEqualTo(0f) } @Test fun step3c_onPriorityMode_shouldStopOnReset() { startPriorityModePostScroll() - canContinueScroll = true scrollConnection.reset() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt index 1f1680e0c273..75479ad35725 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/NotificationScrimNestedScrollConnectionTest.kt @@ -31,6 +31,7 @@ import org.junit.runner.RunWith @RunWith(AndroidJUnit4::class) class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { private var isStarted = false + private var wasStarted = false private var scrimOffset = 0f private var contentHeight = 0f private var isCurrentGestureOverscroll = false @@ -46,7 +47,10 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { minVisibleScrimHeight = { MIN_VISIBLE_SCRIM_HEIGHT }, isCurrentGestureOverscroll = { isCurrentGestureOverscroll }, onStart = { isStarted = true }, - onStop = { isStarted = false }, + onStop = { + wasStarted = true + isStarted = false + }, ) @Test @@ -165,6 +169,7 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) + assertThat(wasStarted).isEqualTo(false) assertThat(isStarted).isEqualTo(false) } @@ -181,7 +186,9 @@ class NotificationScrimNestedScrollConnectionTest : SysuiTestCase() { ) assertThat(offsetConsumed).isEqualTo(Offset.Zero) - assertThat(isStarted).isEqualTo(true) + // Returning 0 offset will immediately stop the connection + assertThat(wasStarted).isEqualTo(true) + assertThat(isStarted).isEqualTo(false) } @Test -- GitLab From 13c0ec43fdb2ea9d741edd08ce91b4d20913c008 Mon Sep 17 00:00:00 2001 From: omarmt Date: Mon, 21 Oct 2024 15:43:46 +0000 Subject: [PATCH 136/459] STL nested scroll keeps priority even if it cannot scroll Fixes a bug introduced with ag/29700348. In an attempt to simplify PriorityNestedScrollConnection declaration, a new behavior has been introduced: the NestedScrollConnection could lose priority when it could no longer scroll. This caused unexpected behavior (see ag/29996647) and for this reason it has been reverted. It is now possible to specify when the PriorityNestedScrollConnection can lose priority during the scroll gesture. Test: atest DraggableHandlerTest Test: atest SwipeToSceneTest Bug: 370949877 Flag: com.android.systemui.scene_container Change-Id: Id8c295458bb4a82a128fe2370bccd5883d0f4889 --- .../animation/scene/DraggableHandler.kt | 3 + .../PriorityNestedScrollConnection.kt | 11 ++-- .../animation/scene/DraggableHandlerTest.kt | 20 ++++++ .../animation/scene/SwipeToSceneTest.kt | 65 +++++++++++++++++++ 4 files changed, 94 insertions(+), 5 deletions(-) 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 03fa971f332d..638a71965063 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 @@ -709,6 +709,9 @@ internal class NestedScrollHandlerImpl( canStart }, + // We need to maintain scroll priority even if the scene transition can no longer + // consume the scroll gesture to allow us to return to the previous scene. + canStopOnScroll = { _, _ -> false }, canStopOnPreFling = { true }, onStart = { offsetAvailable -> val pointersInfo = pointersInfo() diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt index e3cddc1a8f1d..f5f566f703dc 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt @@ -40,6 +40,8 @@ internal typealias SuspendedValue = suspend () -> T * events in post-scroll mode. * @param canStartPostFling lambda that returns true if the connection can start consuming scroll * events in post-fling mode. + * @param canStopOnScroll lambda that returns true if the connection can stop consuming scroll + * events in scroll mode. * @param canStopOnPreFling lambda that returns true if the connection can stop consuming scroll * events in pre-fling (i.e. as soon as the user lifts their fingers). * @param onStart lambda that is called when the connection starts consuming scroll events. @@ -57,6 +59,9 @@ class PriorityNestedScrollConnection( private val canStartPostScroll: (offsetAvailable: Float, offsetBeforeStart: Float, source: NestedScrollSource) -> Boolean, private val canStartPostFling: (velocityAvailable: Float) -> Boolean, + private val canStopOnScroll: (available: Float, consumed: Float) -> Boolean = { _, consumed -> + consumed == 0f + }, private val canStopOnPreFling: () -> Boolean, private val onStart: (offsetAvailable: Float) -> Unit, private val onScroll: (offsetAvailable: Float, source: NestedScrollSource) -> Float, @@ -155,10 +160,6 @@ class PriorityNestedScrollConnection( } } - private fun shouldStop(consumed: Float): Boolean { - return consumed == 0f - } - private fun start( availableOffset: Float, source: NestedScrollSource, @@ -183,7 +184,7 @@ class PriorityNestedScrollConnection( // Step 2: We have the priority and can consume the scroll events. val consumedByScroll = onScroll(offsetAvailable, source) - if (shouldStop(consumedByScroll)) { + if (canStopOnScroll(offsetAvailable, consumedByScroll)) { // Step 3a: We have lost priority and we no longer need to intercept scroll events. cancel() 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 fd0214823eaf..bfb7736397ca 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 @@ -1295,6 +1295,26 @@ class DraggableHandlerTest { ) } + @Test + fun scrollKeepPriorityEvenIfWeCanNoLongerScrollOnThatDirection() = runGestureTest { + // Overscrolling on scene B does nothing. + layoutState.transitions = transitions { overscrollDisabled(SceneB, Orientation.Vertical) } + val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeAlways) + + // Overscroll is disabled, it will scroll up to 100% + nestedScroll.scroll(available = upOffset(fractionOfScreen = 2f)) + assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1f) + + // We need to maintain scroll priority even if the scene transition can no longer consume + // the scroll gesture. + nestedScroll.scroll(available = upOffset(fractionOfScreen = 0.1f)) + assertTransition(fromScene = SceneA, toScene = SceneB, progress = 1f) + + // A scroll gesture in the opposite direction allows us to return to the previous scene. + nestedScroll.scroll(available = downOffset(fractionOfScreen = 0.5f)) + assertTransition(fromScene = SceneA, toScene = SceneB, progress = 0.5f) + } + @Test fun overscroll_releaseBetween0And100Percent_up() = runGestureTest { // Make scene B overscrollable. 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 3001505d0e02..2bc9b3826548 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 @@ -937,6 +937,71 @@ class SwipeToSceneTest { assertThat(availableOnPostScroll).isEqualTo(ovescrollPx) } + @Test + fun scrollKeepPriorityEvenIfWeCanNoLongerScrollOnThatDirection() { + val swipeDistance = 100.dp + val state = + rule.runOnUiThread { + MutableSceneTransitionLayoutState( + SceneA, + transitions { + from(SceneA, to = SceneB) { distance = FixedDistance(swipeDistance) } + from(SceneB, to = SceneC) { distance = FixedDistance(swipeDistance) } + overscrollDisabled(SceneB, Orientation.Vertical) + }, + ) + } + val layoutSize = 200.dp + var touchSlop = 0f + rule.setContent { + touchSlop = LocalViewConfiguration.current.touchSlop + SceneTransitionLayout(state, Modifier.size(layoutSize)) { + scene(SceneA, userActions = mapOf(Swipe.Down to SceneB, Swipe.Right to SceneC)) { + Box( + Modifier.fillMaxSize() + // A scrollable that does not consume the scroll gesture + .scrollable(rememberScrollableState { 0f }, Orientation.Vertical) + ) + } + scene(SceneB, userActions = mapOf(Swipe.Right to SceneC)) { + Box(Modifier.element(TestElements.Foo).fillMaxSize()) + } + scene(SceneC) { Box(Modifier.fillMaxSize()) } + } + } + + fun assertTransition(from: SceneKey, to: SceneKey, progress: Float) { + val transition = assertThat(state.transitionState).isSceneTransition() + assertThat(transition).hasFromScene(from) + assertThat(transition).hasToScene(to) + assertThat(transition.progress).isEqualTo(progress) + } + + // Vertical scroll 100% + rule.onRoot().performTouchInput { + val middle = (layoutSize / 2).toPx() + down(Offset(middle, middle)) + moveBy(Offset(0f, y = touchSlop + swipeDistance.toPx()), delayMillis = 1_000) + } + assertTransition(from = SceneA, to = SceneB, progress = 1f) + + // Continue vertical scroll, should be ignored (overscrollDisabled) + rule.onRoot().performTouchInput { moveBy(Offset(0f, y = touchSlop), delayMillis = 1_000) } + assertTransition(from = SceneA, to = SceneB, progress = 1f) + + // Horizontal scroll, should be ignored + rule.onRoot().performTouchInput { + moveBy(Offset(x = touchSlop + swipeDistance.toPx(), 0f), delayMillis = 1_000) + } + assertTransition(from = SceneA, to = SceneB, progress = 1f) + + // Vertical scroll, in the opposite direction + rule.onRoot().performTouchInput { + moveBy(Offset(0f, -swipeDistance.toPx()), delayMillis = 1_000) + } + assertTransition(from = SceneA, to = SceneB, progress = 0f) + } + @Test fun sceneWithoutSwipesDoesNotConsumeGestures() { val buttonTag = "button" -- GitLab From 0dc3f705c574ba1b524b48f11a9f378cc24cf31e Mon Sep 17 00:00:00 2001 From: Omar Miatello Date: Mon, 21 Oct 2024 16:07:55 +0000 Subject: [PATCH 137/459] Revert^2 "PriorityNestedScrollConnection: make onStop suspendable and add onCancel" This reverts commit 47f6e9098792045be9f663aed9fd23e1b6418b13. Reason for revert: A fix will be applied on top of this revert Change-Id: Ia313f5f30193ea5ac3c147302488ed45c68131f2 --- ...NotificationScrimNestedScrollConnection.kt | 10 +++++-- ...NotificationStackNestedScrollConnection.kt | 3 +- .../animation/scene/DraggableHandler.kt | 19 ++++++++---- .../compose/animation/scene/SwipeAnimation.kt | 1 - .../LargeTopAppBarNestedScrollConnection.kt | 3 +- .../PriorityNestedScrollConnection.kt | 29 +++++++++++++++---- .../animation/scene/DraggableHandlerTest.kt | 1 - .../scene/MultiPointerDraggableTest.kt | 1 - .../PriorityNestedScrollConnectionTest.kt | 14 +++++---- 9 files changed, 57 insertions(+), 24 deletions(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt index 779934d8d211..e4c60e166fd5 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationScrimNestedScrollConnection.kt @@ -73,13 +73,19 @@ fun NotificationScrimNestedScrollConnection( snapScrimOffset(currentHeight + amountConsumed) amountConsumed }, - // Don't consume the velocity on pre/post fling onStop = { velocityAvailable -> onStop(velocityAvailable) if (scrimOffset() < minScrimOffset()) { animateScrimOffset(minScrimOffset()) } - { 0f } + // Don't consume the velocity on pre/post fling + 0f + }, + onCancel = { + onStop(0f) + if (scrimOffset() < minScrimOffset()) { + animateScrimOffset(minScrimOffset()) + } }, ) } diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt index 42dd1be51d44..edb05ebd77d1 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/notifications/ui/composable/NotificationStackNestedScrollConnection.kt @@ -104,7 +104,8 @@ fun NotificationStackNestedScrollConnection( }, onStop = { velocityAvailable -> onStop(velocityAvailable) - suspend { velocityAvailable } + velocityAvailable }, + onCancel = { onStop(0f) }, ) } 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 638a71965063..f0742df4411d 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 @@ -27,9 +27,10 @@ import com.android.compose.animation.scene.content.Content import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified import com.android.compose.nestedscroll.PriorityNestedScrollConnection -import com.android.compose.nestedscroll.SuspendedValue import kotlin.math.absoluteValue +internal typealias SuspendedValue = suspend () -> T + internal interface DraggableHandler { /** * Start a drag in the given [startedPosition], with the given [overSlop] and number of @@ -737,10 +738,18 @@ internal class NestedScrollHandlerImpl( }, onStop = { velocityAvailable -> val controller = dragController ?: error("Should be called after onStart") - - controller - .onStop(velocity = velocityAvailable, canChangeContent = canChangeScene) - .also { dragController = null } + try { + controller + .onStop(velocity = velocityAvailable, canChangeContent = canChangeScene) + .invoke() + } finally { + dragController = null + } + }, + onCancel = { + val controller = dragController ?: error("Should be called after onStart") + controller.onStop(velocity = 0f, canChangeContent = canChangeScene) + dragController = null }, ) } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt index 205267da151a..f0043e1e89b0 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SwipeAnimation.kt @@ -27,7 +27,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.unit.IntSize import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.HasOverscrollProperties.Companion.DistanceUnspecified -import com.android.compose.nestedscroll.SuspendedValue import kotlin.math.absoluteValue import kotlinx.coroutines.CompletableDeferred diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt index b05f02224327..ecf64b771d1f 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/LargeTopAppBarNestedScrollConnection.kt @@ -70,6 +70,7 @@ fun LargeTopAppBarNestedScrollConnection( amountConsumed }, // Don't consume the velocity on pre/post fling - onStop = { { 0f } }, + onStop = { 0f }, + onCancel = { /* do nothing */ }, ) } diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt index f5f566f703dc..57d236be40ce 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/nestedscroll/PriorityNestedScrollConnection.kt @@ -16,15 +16,21 @@ package com.android.compose.nestedscroll +import androidx.compose.animation.core.AnimationState +import androidx.compose.animation.core.DecayAnimationSpec +import androidx.compose.animation.core.animateDecay import androidx.compose.foundation.gestures.Orientation import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection import androidx.compose.ui.input.nestedscroll.NestedScrollSource import androidx.compose.ui.unit.Velocity import com.android.compose.ui.util.SpaceVectorConverter +import kotlin.math.abs import kotlin.math.sign - -internal typealias SuspendedValue = suspend () -> T +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.Deferred +import kotlinx.coroutines.async +import kotlinx.coroutines.coroutineScope /** * A [NestedScrollConnection] that intercepts scroll events in priority mode. @@ -49,6 +55,7 @@ internal typealias SuspendedValue = suspend () -> T * consumed amount. * @param onStop lambda that is called when the connection stops consuming scroll events and returns * the consumed velocity. + * @param onCancel lambda that is called when the connection is cancelled. * @sample LargeTopAppBarNestedScrollConnection * @sample com.android.compose.animation.scene.NestedScrollHandlerImpl.nestedScrollConnection */ @@ -65,7 +72,8 @@ class PriorityNestedScrollConnection( private val canStopOnPreFling: () -> Boolean, private val onStart: (offsetAvailable: Float) -> Unit, private val onScroll: (offsetAvailable: Float, source: NestedScrollSource) -> Float, - private val onStop: (velocityAvailable: Float) -> SuspendedValue, + private val onStop: suspend (velocityAvailable: Float) -> Float, + private val onCancel: () -> Unit, ) : NestedScrollConnection, SpaceVectorConverter by SpaceVectorConverter(orientation) { /** In priority mode [onPreScroll] events are first consumed by the parent, via [onScroll]. */ @@ -73,6 +81,9 @@ class PriorityNestedScrollConnection( private var offsetScrolledBeforePriorityMode = 0f + /** This job allows us to interrupt the onStop animation */ + private var onStopJob: Deferred = CompletableDeferred(0f) + override fun onPostScroll( consumed: Offset, available: Offset, @@ -153,7 +164,7 @@ class PriorityNestedScrollConnection( */ fun reset() { if (isPriorityMode) { - // Step 3c: To ensure that an onStop is always called for every onStart. + // Step 3c: To ensure that an onStop (or onCancel) is always called for every onStart. cancel() } else { resetOffsetTracker() @@ -173,6 +184,8 @@ class PriorityNestedScrollConnection( // available offset following a scroll event. isPriorityMode = true + onStopJob.cancel() + // Note: onStop will be called if we cannot continue to scroll (step 3a), or the finger is // lifted (step 3b), or this object has been destroyed (step 3c). onStart(availableOffset) @@ -205,13 +218,17 @@ class PriorityNestedScrollConnection( check(isPriorityMode) { "This should never happen, stop() was called before start()" } isPriorityMode = false resetOffsetTracker() - return onStop(velocityAvailable).invoke() + + return coroutineScope { + onStopJob = async { onStop(velocityAvailable) } + onStopJob.await() + } } private fun cancel() { check(isPriorityMode) { "This should never happen, cancel() was called before start()" } isPriorityMode = false resetOffsetTracker() - onStop(0f) + onCancel() } } 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 bfb7736397ca..72a71ddddfca 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 @@ -39,7 +39,6 @@ import com.android.compose.animation.scene.TestScenes.SceneC import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.content.state.TransitionState.Transition import com.android.compose.animation.scene.subjects.assertThat -import com.android.compose.nestedscroll.SuspendedValue import com.android.compose.test.MonotonicClockTestScope import com.android.compose.test.runMonotonicClockTest import com.android.compose.test.transition diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt index c8f6e6d99933..3df608717414 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/animation/scene/MultiPointerDraggableTest.kt @@ -46,7 +46,6 @@ import androidx.compose.ui.unit.Density import androidx.compose.ui.unit.Velocity import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.compose.modifiers.thenIf -import com.android.compose.nestedscroll.SuspendedValue import com.google.common.truth.Truth.assertThat import kotlin.properties.Delegates import kotlinx.coroutines.coroutineScope diff --git a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt index 9363ecbf63dc..1a3b86b936df 100644 --- a/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt +++ b/packages/SystemUI/compose/scene/tests/src/com/android/compose/nestedscroll/PriorityNestedScrollConnectionTest.kt @@ -39,6 +39,7 @@ class PriorityNestedScrollConnectionTest { private var lastScroll: Float? = null private var consumeScroll = true private var lastStop: Float? = null + private var isCancelled: Boolean = false private var consumeStop = true private val scrollConnection = @@ -55,8 +56,9 @@ class PriorityNestedScrollConnectionTest { }, onStop = { lastStop = it - { if (consumeStop) it else 0f } + if (consumeStop) it else 0f }, + onCancel = { isCancelled = true }, ) @Test @@ -147,13 +149,13 @@ class PriorityNestedScrollConnectionTest { } @Test - fun step3a_onPriorityMode_shouldStopIfCannotContinue() { + fun step3a_onPriorityMode_shouldCancelIfCannotContinue() { startPriorityModePostScroll() consumeScroll = false - scrollConnection.onPreScroll(available = Offset.Zero, source = UserInput) + scrollConnection.onPreScroll(available = Offset(0f, 1f), source = UserInput) - assertThat(lastStop).isNotNull() + assertThat(isCancelled).isTrue() } @Test @@ -178,12 +180,12 @@ class PriorityNestedScrollConnectionTest { } @Test - fun step3c_onPriorityMode_shouldStopOnReset() { + fun step3c_onPriorityMode_shouldCancelOnReset() { startPriorityModePostScroll() scrollConnection.reset() - assertThat(lastStop).isNotNull() + assertThat(isCancelled).isTrue() } @Test -- GitLab From f813c18e40c638a76201561201152fe858501be9 Mon Sep 17 00:00:00 2001 From: Matt Sziklay Date: Mon, 21 Oct 2024 16:42:24 +0000 Subject: [PATCH 138/459] Revert "Prevent pip launch during drag to desktop." This reverts commit 92eb4fa3573e6f4cd6c22df2963a9e36e5bffa5c. Reason for revert: Several regressions: b/374307100 Change-Id: Idf894ece7824d698056b20eee64802673029ef9b --- .../shell/desktopmode/DesktopTasksController.kt | 2 +- .../desktopmode/DragToDesktopTransitionHandler.kt | 15 ++++++--------- .../DragToDesktopTransitionHandlerTest.kt | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index d5a5fa264997..125805c14321 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -407,7 +407,7 @@ class DesktopTasksController( interactionJankMonitor.begin(taskSurface, context, handler, CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD) dragToDesktopTransitionHandler.startDragToDesktopTransition( - taskInfo, + taskInfo.taskId, dragToDesktopValueAnimator ) } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt index 8e264b2410f7..2bc01b2f310e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandler.kt @@ -109,8 +109,8 @@ sealed class DragToDesktopTransitionHandler( * after one of the "end" or "cancel" transitions is merged into this transition. */ fun startDragToDesktopTransition( - taskInfo: RunningTaskInfo, - dragToDesktopAnimator: MoveToDesktopAnimator + taskId: Int, + dragToDesktopAnimator: MoveToDesktopAnimator, ) { if (inProgress) { ProtoLog.v( @@ -137,26 +137,23 @@ sealed class DragToDesktopTransitionHandler( ) val wct = WindowContainerTransaction() wct.sendPendingIntent(pendingIntent, launchHomeIntent, Bundle()) - // The home launch done above will result in an attempt to move the task to pip if - // applicable, resulting in a broken state. Prevent that here. - wct.setDoNotPip(taskInfo.token) val startTransitionToken = transitions.startTransition(TRANSIT_DESKTOP_MODE_START_DRAG_TO_DESKTOP, wct, this) transitionState = - if (isSplitTask(taskInfo.taskId)) { + if (isSplitTask(taskId)) { val otherTask = - getOtherSplitTask(taskInfo.taskId) + getOtherSplitTask(taskId) ?: throw IllegalStateException("Expected split task to have a counterpart.") TransitionState.FromSplit( - draggedTaskId = taskInfo.taskId, + draggedTaskId = taskId, dragAnimator = dragToDesktopAnimator, startTransitionToken = startTransitionToken, otherSplitTask = otherTask ) } else { TransitionState.FromFullscreen( - draggedTaskId = taskInfo.taskId, + draggedTaskId = taskId, dragAnimator = dragToDesktopAnimator, startTransitionToken = startTransitionToken ) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt index 230f7e6912ee..d9387d2f08dd 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DragToDesktopTransitionHandlerTest.kt @@ -581,7 +581,7 @@ class DragToDesktopTransitionHandlerTest : ShellTestCase() { ) ) .thenReturn(token) - handler.startDragToDesktopTransition(task, dragAnimator) + handler.startDragToDesktopTransition(task.taskId, dragAnimator) return token } -- GitLab From 3cfc4eccc4cde27a8c510cd9833b015af1605968 Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Wed, 16 Oct 2024 17:24:38 +0000 Subject: [PATCH 139/459] Add domain layer for volume dialog ringer Flag: com.android.systemui.volume_redesign Bug: 369993851 Test: atest SystemUiRoboTests:VolumeDialogRingerInteractorTest Change-Id: I8f984494603751df64230f8b11d437b0a41f95fa --- .../VolumeDialogRingerInteractorTest.kt | 99 +++++++++++++++++++ .../domain/VolumeDialogRingerInteractor.kt | 88 +++++++++++++++++ .../VolumeDialogRingerInteractorKosmos.kt | 33 +++++++ 3 files changed, 220 insertions(+) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorTest.kt new file mode 100644 index 000000000000..7d5559933cd8 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorTest.kt @@ -0,0 +1,99 @@ +/* + * 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.volume.dialog.ringer.domain + +import android.media.AudioManager.RINGER_MODE_NORMAL +import android.media.AudioManager.RINGER_MODE_SILENT +import android.media.AudioManager.RINGER_MODE_VIBRATE +import android.media.AudioManager.STREAM_RING +import android.testing.TestableLooper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.settingslib.volume.shared.model.RingerMode +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.fakeVolumeDialogController +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +@TestableLooper.RunWithLooper +class VolumeDialogRingerInteractorTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val controller = kosmos.fakeVolumeDialogController + + private lateinit var underTest: VolumeDialogRingerInteractor + + @Before + fun setUp() { + underTest = kosmos.volumeDialogRingerInteractor + controller.setStreamVolume(STREAM_RING, 50) + } + + @Test + fun setRingerMode_normal() = + testScope.runTest { + runCurrent() + val ringerModel by collectLastValue(underTest.ringerModel) + + underTest.setRingerMode(RingerMode(RINGER_MODE_NORMAL)) + controller.getState() + runCurrent() + + assertThat(ringerModel).isNotNull() + assertThat(ringerModel?.currentRingerMode).isEqualTo(RingerMode(RINGER_MODE_NORMAL)) + } + + @Test + fun setRingerMode_silent() = + testScope.runTest { + runCurrent() + val ringerModel by collectLastValue(underTest.ringerModel) + + underTest.setRingerMode(RingerMode(RINGER_MODE_SILENT)) + controller.getState() + runCurrent() + + assertThat(ringerModel).isNotNull() + assertThat(ringerModel?.currentRingerMode).isEqualTo(RingerMode(RINGER_MODE_SILENT)) + } + + @Test + fun setRingerMode_vibrate() = + testScope.runTest { + runCurrent() + val ringerModel by collectLastValue(underTest.ringerModel) + + underTest.setRingerMode(RingerMode(RINGER_MODE_VIBRATE)) + controller.getState() + runCurrent() + + assertThat(ringerModel).isNotNull() + assertThat(ringerModel?.currentRingerMode).isEqualTo(RingerMode(RINGER_MODE_VIBRATE)) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt new file mode 100644 index 000000000000..5562ea98c073 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt @@ -0,0 +1,88 @@ +/* + * 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.volume.dialog.ringer.domain + +import android.media.AudioManager +import android.media.AudioManager.RINGER_MODE_NORMAL +import android.media.AudioManager.RINGER_MODE_SILENT +import android.media.AudioManager.RINGER_MODE_VIBRATE +import android.provider.Settings +import com.android.settingslib.volume.shared.model.RingerMode +import com.android.systemui.plugins.VolumeDialogController +import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog +import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogStateInteractor +import com.android.systemui.volume.dialog.ringer.data.VolumeDialogRingerRepository +import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel +import com.android.systemui.volume.dialog.shared.model.VolumeDialogStateModel +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.mapNotNull +import kotlinx.coroutines.flow.onEach + +/** Exposes [VolumeDialogRingerModel]. */ +@VolumeDialog +class VolumeDialogRingerInteractor +@Inject +constructor( + @VolumeDialog private val coroutineScope: CoroutineScope, + volumeDialogStateInteractor: VolumeDialogStateInteractor, + private val controller: VolumeDialogController, + private val repository: VolumeDialogRingerRepository, +) { + + val ringerModel: Flow = repository.ringerModel + + init { + volumeDialogStateInteractor.volumeDialogState + .mapNotNull { state -> toRingerModel(state) } + .onEach { ringerModel -> repository.updateRingerModel { ringerModel } } + .launchIn(coroutineScope) + } + + private fun toRingerModel(state: VolumeDialogStateModel): VolumeDialogRingerModel? { + return state.streamModels[AudioManager.STREAM_RING]?.let { + VolumeDialogRingerModel( + availableModes = + mutableListOf(RingerMode(RINGER_MODE_NORMAL), RingerMode(RINGER_MODE_SILENT)) + .also { list -> + if (controller.hasVibrator()) { + list.add(RingerMode(RINGER_MODE_VIBRATE)) + } + }, + currentRingerMode = RingerMode(state.ringerModeInternal), + isEnabled = + !(state.zenMode == Settings.Global.ZEN_MODE_ALARMS || + state.zenMode == Settings.Global.ZEN_MODE_NO_INTERRUPTIONS || + (state.zenMode == Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS && + state.disallowRinger)), + isMuted = it.level == 0 || it.muted, + level = it.level, + levelMax = it.levelMax, + ) + } + } + + fun setRingerMode(ringerMode: RingerMode) { + controller.setRingerMode(ringerMode.value, false) + } + + fun scheduleTouchFeedback() { + controller.scheduleTouchFeedback() + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt new file mode 100644 index 000000000000..b2216926db22 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt @@ -0,0 +1,33 @@ +/* + * 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.volume.dialog.ringer.domain + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.plugins.volumeDialogController +import com.android.systemui.volume.dialog.domain.interactor.volumeDialogStateInteractor +import com.android.systemui.volume.dialog.ringer.data.volumeDialogRingerRepository + +val Kosmos.volumeDialogRingerInteractor by + Kosmos.Fixture { + VolumeDialogRingerInteractor( + coroutineScope = applicationCoroutineScope, + volumeDialogStateInteractor = volumeDialogStateInteractor, + controller = volumeDialogController, + repository = volumeDialogRingerRepository, + ) + } -- GitLab From 753133d0c16330da1ace026e52ae2e2181f3a583 Mon Sep 17 00:00:00 2001 From: Seth Moore Date: Mon, 21 Oct 2024 16:47:54 +0000 Subject: [PATCH 140/459] Clean up keystore owners Eran is leaving the team, time for book-keeping. Change-Id: I0c52ddd85d2a7e091fbec2adb7ea773b313acfb3 --- keystore/java/android/security/OWNERS | 2 +- keystore/tests/OWNERS | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/keystore/java/android/security/OWNERS b/keystore/java/android/security/OWNERS index 32759b2402a9..43052866b938 100644 --- a/keystore/java/android/security/OWNERS +++ b/keystore/java/android/security/OWNERS @@ -1,2 +1,2 @@ -per-file *.java,*.aidl = eranm@google.com,pgrafov@google.com,rubinxu@google.com +per-file *.java,*.aidl = drysdale@google.com,jbires@google.com,pgrafov@google.com,rubinxu@google.com per-file KeyStoreManager.java = mpgroover@google.com diff --git a/keystore/tests/OWNERS b/keystore/tests/OWNERS index 86c31f403da0..0f94ddcee47f 100644 --- a/keystore/tests/OWNERS +++ b/keystore/tests/OWNERS @@ -1,4 +1,7 @@ +# Android HW Trust team +drysdale@google.com +jbires@google.com + # Android Enterprise security team -eranm@google.com pgrafov@google.com rubinxu@google.com -- GitLab From 172f2a03d8d8c8f6961de3014012e895d76b024e Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Fri, 18 Oct 2024 11:03:02 -0700 Subject: [PATCH 141/459] Prepare for compat-framework support - Create a Context for the system server - Add the target SDK level to RavenwoodConfig - Allow PropertyInvalidatedCache sysprops - Copy StatsD classes, until we get a proper support - Copy Compatibility and some annotations from libcore - Keep FrameworkStatsLog Flag: EXEMPT host test change only Bug: 292141694 Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh Change-Id: Ib572d1b25c47c693b4969d12490e593dc5f48eb1 --- ravenwood/Android.bp | 4 + .../test/ravenwood/RavenwoodConfigState.java | 4 + ...RavenwoodRuntimeEnvironmentController.java | 12 + .../test/ravenwood/RavenwoodSystemServer.java | 5 +- .../test/ravenwood/RavenwoodConfig.java | 9 + .../ravenwood/RavenwoodSystemProperties.java | 6 + .../framework/android/util/StatsEvent.java | 1035 +++++++++++++++++ .../framework/android/util/StatsLog.java | 478 ++++++++ .../android/compat/Compatibility.java | 359 ++++++ .../libcore/api/CorePlatformApi.java | 69 ++ .../libcore-fake/libcore/api/Hide.java | 47 + .../libcore/api/IntraCoreApi.java | 45 + .../libcore-fake/libcore/util/NonNull.java | 48 + .../libcore-fake/libcore/util/Nullable.java | 48 + .../texts/ravenwood-framework-policies.txt | 4 + 15 files changed, 2172 insertions(+), 1 deletion(-) create mode 100644 ravenwood/runtime-helper-src/framework/android/util/StatsEvent.java create mode 100644 ravenwood/runtime-helper-src/framework/android/util/StatsLog.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/android/compat/Compatibility.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/api/CorePlatformApi.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/api/Hide.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/api/IntraCoreApi.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/util/NonNull.java create mode 100644 ravenwood/runtime-helper-src/libcore-fake/libcore/util/Nullable.java diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp index d9182010c1cb..ff2abd275f83 100644 --- a/ravenwood/Android.bp +++ b/ravenwood/Android.bp @@ -100,6 +100,9 @@ java_library_host { srcs: [ "runtime-helper-src/libcore-fake/**/*.java", ], + libs: [ + "app-compat-annotations", + ], static_libs: [ "ravenwood-runtime-common", ], @@ -121,6 +124,7 @@ java_library { ], static_libs: [ "ravenwood-runtime-common", + "androidx.annotation_annotation", ], libs: [ "framework-minus-apex.ravenwood", diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodConfigState.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodConfigState.java index 3535cb2b1b79..870a10a1f57e 100644 --- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodConfigState.java +++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodConfigState.java @@ -42,6 +42,10 @@ public class RavenwoodConfigState { private final RavenwoodConfig mConfig; + // TODO: Move the other contexts from RavenwoodConfig to here too? They're used by + // RavenwoodRule too, but RavenwoodRule can probably use InstrumentationRegistry? + RavenwoodContext mSystemServerContext; + public RavenwoodConfigState(RavenwoodConfig config) { mConfig = config; } diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java index 9a145cb93811..c2806daf99a1 100644 --- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java +++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodRuntimeEnvironmentController.java @@ -16,6 +16,8 @@ package android.platform.test.ravenwood; +import static android.platform.test.ravenwood.RavenwoodSystemServer.ANDROID_PACKAGE_NAME; + import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_INST_RESOURCE_APK; import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_RESOURCE_APK; import static com.android.ravenwood.common.RavenwoodCommonUtils.RAVENWOOD_VERBOSE_LOGGING; @@ -267,6 +269,13 @@ public class RavenwoodRuntimeEnvironmentController { config.mInstContext = instContext; config.mTargetContext = targetContext; + final Supplier systemResourcesLoader = () -> { + return config.mState.loadResources(null); + }; + + config.mState.mSystemServerContext = + new RavenwoodContext(ANDROID_PACKAGE_NAME, main, systemResourcesLoader); + // Prepare other fields. config.mInstrumentation = new Instrumentation(); config.mInstrumentation.basicInit(instContext, targetContext, createMockUiAutomation()); @@ -314,6 +323,9 @@ public class RavenwoodRuntimeEnvironmentController { ((RavenwoodContext) config.mTargetContext).cleanUp(); config.mTargetContext = null; } + if (config.mState.mSystemServerContext != null) { + config.mState.mSystemServerContext.cleanUp(); + } Looper.getMainLooper().quit(); Looper.clearMainLooperForTest(); diff --git a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodSystemServer.java b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodSystemServer.java index 3946dd8471b0..f198a08a50e3 100644 --- a/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodSystemServer.java +++ b/ravenwood/junit-impl-src/android/platform/test/ravenwood/RavenwoodSystemServer.java @@ -33,6 +33,9 @@ import java.util.List; import java.util.Set; public class RavenwoodSystemServer { + + static final String ANDROID_PACKAGE_NAME = "android"; + /** * Set of services that we know how to provide under Ravenwood. We keep this set distinct * from {@code com.android.server.SystemServer} to give us the ability to choose either @@ -67,7 +70,7 @@ public class RavenwoodSystemServer { sStartedServices = new ArraySet<>(); sTimings = new TimingsTraceAndSlog(); - sServiceManager = new SystemServiceManager(config.mInstContext); + sServiceManager = new SystemServiceManager(config.mState.mSystemServerContext); sServiceManager.setStartInfo(false, SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodConfig.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodConfig.java index 1f6e11dd5cf2..37b0abcceede 100644 --- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodConfig.java +++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodConfig.java @@ -67,6 +67,7 @@ public final class RavenwoodConfig { String mTargetPackageName; int mMinSdkLevel; + int mTargetSdkLevel; boolean mProvideMainThread = false; @@ -149,6 +150,14 @@ public final class RavenwoodConfig { return this; } + /** + * Configure the target SDK level of the test. + */ + public Builder setTargetSdkLevel(int sdkLevel) { + mConfig.mTargetSdkLevel = sdkLevel; + return this; + } + /** * Configure a "main" thread to be available for the duration of the test, as defined * by {@code Looper.getMainLooper()}. Has no effect on non-Ravenwood environments. diff --git a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java index ced151927fdc..9bc45bee1775 100644 --- a/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java +++ b/ravenwood/junit-src/android/platform/test/ravenwood/RavenwoodSystemProperties.java @@ -146,6 +146,9 @@ public class RavenwoodSystemProperties { if (root.startsWith("soc.")) return true; if (root.startsWith("system.")) return true; + // For PropertyInvalidatedCache + if (root.startsWith("cache_key.")) return true; + switch (key) { case "gsm.version.baseband": case "no.such.thing": @@ -170,6 +173,9 @@ public class RavenwoodSystemProperties { if (root.startsWith("debug.")) return true; + // For PropertyInvalidatedCache + if (root.startsWith("cache_key.")) return true; + return mKeyWritable.contains(key); } diff --git a/ravenwood/runtime-helper-src/framework/android/util/StatsEvent.java b/ravenwood/runtime-helper-src/framework/android/util/StatsEvent.java new file mode 100644 index 000000000000..1e3b3fcd733f --- /dev/null +++ b/ravenwood/runtime-helper-src/framework/android/util/StatsEvent.java @@ -0,0 +1,1035 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.util; + +// [ravenwood] This is an exact copy from StatsD, until we make StatsD available on Ravenwood. + +import static java.nio.charset.StandardCharsets.UTF_8; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SystemApi; +import android.os.Build; +import android.os.SystemClock; + +import androidx.annotation.RequiresApi; + +import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; + +import java.nio.ByteBuffer; +import java.util.Arrays; + +/** + * StatsEvent builds and stores the buffer sent over the statsd socket. + * This class defines and encapsulates the socket protocol. + * + *

Usage:

+ *
+ *      // Pushed event
+ *      StatsEvent statsEvent = StatsEvent.newBuilder()
+ *          .setAtomId(atomId)
+ *          .writeBoolean(false)
+ *          .writeString("annotated String field")
+ *          .addBooleanAnnotation(annotationId, true)
+ *          .usePooledBuffer()
+ *          .build();
+ *      StatsLog.write(statsEvent);
+ *
+ *      // Pulled event
+ *      StatsEvent statsEvent = StatsEvent.newBuilder()
+ *          .setAtomId(atomId)
+ *          .writeBoolean(false)
+ *          .writeString("annotated String field")
+ *          .addBooleanAnnotation(annotationId, true)
+ *          .build();
+ * 
+ * @hide + **/ +@SystemApi +public final class StatsEvent { + // Type Ids. + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_INT = 0x00; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_LONG = 0x01; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_STRING = 0x02; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_LIST = 0x03; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_FLOAT = 0x04; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_BOOLEAN = 0x05; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_BYTE_ARRAY = 0x06; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_OBJECT = 0x07; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_KEY_VALUE_PAIRS = 0x08; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_ATTRIBUTION_CHAIN = 0x09; + + /** + * @hide + **/ + @VisibleForTesting + public static final byte TYPE_ERRORS = 0x0F; + + // Error flags. + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_NO_TIMESTAMP = 0x1; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_NO_ATOM_ID = 0x2; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_OVERFLOW = 0x4; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_ATTRIBUTION_CHAIN_TOO_LONG = 0x8; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_TOO_MANY_KEY_VALUE_PAIRS = 0x10; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD = 0x20; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_INVALID_ANNOTATION_ID = 0x40; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_ANNOTATION_ID_TOO_LARGE = 0x80; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_TOO_MANY_ANNOTATIONS = 0x100; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_TOO_MANY_FIELDS = 0x200; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_ATTRIBUTION_UIDS_TAGS_SIZES_NOT_EQUAL = 0x1000; + + /** + * @hide + **/ + @VisibleForTesting + public static final int ERROR_ATOM_ID_INVALID_POSITION = 0x2000; + + /** + * @hide + **/ + @VisibleForTesting public static final int ERROR_LIST_TOO_LONG = 0x4000; + + // Size limits. + + /** + * @hide + **/ + @VisibleForTesting + public static final int MAX_ANNOTATION_COUNT = 15; + + /** + * @hide + **/ + @VisibleForTesting + public static final int MAX_ATTRIBUTION_NODES = 127; + + /** + * @hide + **/ + @VisibleForTesting + public static final int MAX_NUM_ELEMENTS = 127; + + /** + * @hide + **/ + @VisibleForTesting + public static final int MAX_KEY_VALUE_PAIRS = 127; + + private static final int LOGGER_ENTRY_MAX_PAYLOAD = 4068; + + // Max payload size is 4 bytes less as 4 bytes are reserved for statsEventTag. + // See android_util_StatsLog.cpp. + private static final int MAX_PUSH_PAYLOAD_SIZE = LOGGER_ENTRY_MAX_PAYLOAD - 4; + + private static final int MAX_PULL_PAYLOAD_SIZE = 50 * 1024; // 50 KB + + private final int mAtomId; + private final byte[] mPayload; + private Buffer mBuffer; + private final int mNumBytes; + + private StatsEvent(final int atomId, @Nullable final Buffer buffer, + @NonNull final byte[] payload, final int numBytes) { + mAtomId = atomId; + mBuffer = buffer; + mPayload = payload; + mNumBytes = numBytes; + } + + /** + * Returns a new StatsEvent.Builder for building StatsEvent object. + **/ + @NonNull + public static Builder newBuilder() { + return new Builder(Buffer.obtain()); + } + + /** + * Get the atom Id of the atom encoded in this StatsEvent object. + * + * @hide + **/ + public int getAtomId() { + return mAtomId; + } + + /** + * Get the byte array that contains the encoded payload that can be sent to statsd. + * + * @hide + **/ + @NonNull + public byte[] getBytes() { + return mPayload; + } + + /** + * Get the number of bytes used to encode the StatsEvent payload. + * + * @hide + **/ + public int getNumBytes() { + return mNumBytes; + } + + /** + * Recycle resources used by this StatsEvent object. + * No actions should be taken on this StatsEvent after release() is called. + * + * @hide + **/ + public void release() { + if (mBuffer != null) { + mBuffer.release(); + mBuffer = null; + } + } + + /** + * Builder for constructing a StatsEvent object. + * + *

This class defines and encapsulates the socket encoding for the + *buffer. The write methods must be called in the same order as the order of + *fields in the atom definition.

+ * + *

setAtomId() must be called immediately after + *StatsEvent.newBuilder().

+ * + *

Example:

+ *
+     *     // Atom definition.
+     *     message MyAtom {
+     *         optional int32 field1 = 1;
+     *         optional int64 field2 = 2;
+     *         optional string field3 = 3 [(annotation1) = true];
+     *         optional repeated int32 field4 = 4;
+     *     }
+     *
+     *     // StatsEvent construction for pushed event.
+     *     StatsEvent.newBuilder()
+     *     StatsEvent statsEvent = StatsEvent.newBuilder()
+     *         .setAtomId(atomId)
+     *         .writeInt(3) // field1
+     *         .writeLong(8L) // field2
+     *         .writeString("foo") // field 3
+     *         .addBooleanAnnotation(annotation1Id, true)
+     *         .writeIntArray({ 1, 2, 3 });
+     *         .usePooledBuffer()
+     *         .build();
+     *
+     *     // StatsEvent construction for pulled event.
+     *     StatsEvent.newBuilder()
+     *     StatsEvent statsEvent = StatsEvent.newBuilder()
+     *         .setAtomId(atomId)
+     *         .writeInt(3) // field1
+     *         .writeLong(8L) // field2
+     *         .writeString("foo") // field 3
+     *         .addBooleanAnnotation(annotation1Id, true)
+     *         .writeIntArray({ 1, 2, 3 });
+     *         .build();
+     * 
+ **/ + public static final class Builder { + // Fixed positions. + private static final int POS_NUM_ELEMENTS = 1; + private static final int POS_TIMESTAMP_NS = POS_NUM_ELEMENTS + Byte.BYTES; + private static final int POS_ATOM_ID = POS_TIMESTAMP_NS + Byte.BYTES + Long.BYTES; + + private final Buffer mBuffer; + private long mTimestampNs; + private int mAtomId; + private byte mCurrentAnnotationCount; + private int mPos; + private int mPosLastField; + private byte mLastType; + private int mNumElements; + private int mErrorMask; + private boolean mUsePooledBuffer = false; + + private Builder(final Buffer buffer) { + mBuffer = buffer; + mCurrentAnnotationCount = 0; + mAtomId = 0; + mTimestampNs = SystemClock.elapsedRealtimeNanos(); + mNumElements = 0; + + // Set mPos to 0 for writing TYPE_OBJECT at 0th position. + mPos = 0; + writeTypeId(TYPE_OBJECT); + + // Write timestamp. + mPos = POS_TIMESTAMP_NS; + writeLong(mTimestampNs); + } + + /** + * Sets the atom id for this StatsEvent. + * + * This should be called immediately after StatsEvent.newBuilder() + * and should only be called once. + * Not calling setAtomId will result in ERROR_NO_ATOM_ID. + * Calling setAtomId out of order will result in ERROR_ATOM_ID_INVALID_POSITION. + **/ + @NonNull + public Builder setAtomId(final int atomId) { + if (0 == mAtomId) { + mAtomId = atomId; + + if (1 == mNumElements) { // Only timestamp is written so far. + writeInt(atomId); + } else { + // setAtomId called out of order. + mErrorMask |= ERROR_ATOM_ID_INVALID_POSITION; + } + } + + return this; + } + + /** + * Write a boolean field to this StatsEvent. + **/ + @NonNull + public Builder writeBoolean(final boolean value) { + // Write boolean typeId byte followed by boolean byte representation. + writeTypeId(TYPE_BOOLEAN); + mPos += mBuffer.putBoolean(mPos, value); + mNumElements++; + return this; + } + + /** + * Write an integer field to this StatsEvent. + **/ + @NonNull + public Builder writeInt(final int value) { + // Write integer typeId byte followed by 4-byte representation of value. + writeTypeId(TYPE_INT); + mPos += mBuffer.putInt(mPos, value); + mNumElements++; + return this; + } + + /** + * Write a long field to this StatsEvent. + **/ + @NonNull + public Builder writeLong(final long value) { + // Write long typeId byte followed by 8-byte representation of value. + writeTypeId(TYPE_LONG); + mPos += mBuffer.putLong(mPos, value); + mNumElements++; + return this; + } + + /** + * Write a float field to this StatsEvent. + **/ + @NonNull + public Builder writeFloat(final float value) { + // Write float typeId byte followed by 4-byte representation of value. + writeTypeId(TYPE_FLOAT); + mPos += mBuffer.putFloat(mPos, value); + mNumElements++; + return this; + } + + /** + * Write a String field to this StatsEvent. + **/ + @NonNull + public Builder writeString(@NonNull final String value) { + // Write String typeId byte, followed by 4-byte representation of number of bytes + // in the UTF-8 encoding, followed by the actual UTF-8 byte encoding of value. + final byte[] valueBytes = stringToBytes(value); + writeByteArray(valueBytes, TYPE_STRING); + return this; + } + + /** + * Write a byte array field to this StatsEvent. + **/ + @NonNull + public Builder writeByteArray(@NonNull final byte[] value) { + // Write byte array typeId byte, followed by 4-byte representation of number of bytes + // in value, followed by the actual byte array. + writeByteArray(value, TYPE_BYTE_ARRAY); + return this; + } + + private void writeByteArray(@NonNull final byte[] value, final byte typeId) { + writeTypeId(typeId); + final int numBytes = value.length; + mPos += mBuffer.putInt(mPos, numBytes); + mPos += mBuffer.putByteArray(mPos, value); + mNumElements++; + } + + /** + * Write an attribution chain field to this StatsEvent. + * + * The sizes of uids and tags must be equal. The AttributionNode at position i is + * made up of uids[i] and tags[i]. + * + * @param uids array of uids in the attribution nodes. + * @param tags array of tags in the attribution nodes. + **/ + @NonNull + public Builder writeAttributionChain( + @NonNull final int[] uids, @NonNull final String[] tags) { + final byte numUids = (byte) uids.length; + final byte numTags = (byte) tags.length; + + if (numUids != numTags) { + mErrorMask |= ERROR_ATTRIBUTION_UIDS_TAGS_SIZES_NOT_EQUAL; + } else if (numUids > MAX_ATTRIBUTION_NODES) { + mErrorMask |= ERROR_ATTRIBUTION_CHAIN_TOO_LONG; + } else { + // Write attribution chain typeId byte, followed by 1-byte representation of + // number of attribution nodes, followed by encoding of each attribution node. + writeTypeId(TYPE_ATTRIBUTION_CHAIN); + mPos += mBuffer.putByte(mPos, numUids); + for (int i = 0; i < numUids; i++) { + // Each uid is encoded as 4-byte representation of its int value. + mPos += mBuffer.putInt(mPos, uids[i]); + + // Each tag is encoded as 4-byte representation of number of bytes in its + // UTF-8 encoding, followed by the actual UTF-8 bytes. + final byte[] tagBytes = stringToBytes(tags[i]); + mPos += mBuffer.putInt(mPos, tagBytes.length); + mPos += mBuffer.putByteArray(mPos, tagBytes); + } + mNumElements++; + } + return this; + } + + /** + * Write KeyValuePairsAtom entries to this StatsEvent. + * + * @param intMap Integer key-value pairs. + * @param longMap Long key-value pairs. + * @param stringMap String key-value pairs. + * @param floatMap Float key-value pairs. + **/ + @NonNull + public Builder writeKeyValuePairs( + @Nullable final SparseIntArray intMap, + @Nullable final SparseLongArray longMap, + @Nullable final SparseArray stringMap, + @Nullable final SparseArray floatMap) { + final int intMapSize = null == intMap ? 0 : intMap.size(); + final int longMapSize = null == longMap ? 0 : longMap.size(); + final int stringMapSize = null == stringMap ? 0 : stringMap.size(); + final int floatMapSize = null == floatMap ? 0 : floatMap.size(); + final int totalCount = intMapSize + longMapSize + stringMapSize + floatMapSize; + + if (totalCount > MAX_KEY_VALUE_PAIRS) { + mErrorMask |= ERROR_TOO_MANY_KEY_VALUE_PAIRS; + } else { + writeTypeId(TYPE_KEY_VALUE_PAIRS); + mPos += mBuffer.putByte(mPos, (byte) totalCount); + + for (int i = 0; i < intMapSize; i++) { + final int key = intMap.keyAt(i); + final int value = intMap.valueAt(i); + mPos += mBuffer.putInt(mPos, key); + writeTypeId(TYPE_INT); + mPos += mBuffer.putInt(mPos, value); + } + + for (int i = 0; i < longMapSize; i++) { + final int key = longMap.keyAt(i); + final long value = longMap.valueAt(i); + mPos += mBuffer.putInt(mPos, key); + writeTypeId(TYPE_LONG); + mPos += mBuffer.putLong(mPos, value); + } + + for (int i = 0; i < stringMapSize; i++) { + final int key = stringMap.keyAt(i); + final String value = stringMap.valueAt(i); + mPos += mBuffer.putInt(mPos, key); + writeTypeId(TYPE_STRING); + final byte[] valueBytes = stringToBytes(value); + mPos += mBuffer.putInt(mPos, valueBytes.length); + mPos += mBuffer.putByteArray(mPos, valueBytes); + } + + for (int i = 0; i < floatMapSize; i++) { + final int key = floatMap.keyAt(i); + final float value = floatMap.valueAt(i); + mPos += mBuffer.putInt(mPos, key); + writeTypeId(TYPE_FLOAT); + mPos += mBuffer.putFloat(mPos, value); + } + + mNumElements++; + } + + return this; + } + + /** + * Write a repeated boolean field to this StatsEvent. + * + * The list size must not exceed 127. Otherwise, the array isn't written + * to the StatsEvent and ERROR_LIST_TOO_LONG is appended to the + * StatsEvent errors field. + * + * @param elements array of booleans. + **/ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @NonNull + public Builder writeBooleanArray(@NonNull final boolean[] elements) { + final byte numElements = (byte)elements.length; + + if (writeArrayInfo(numElements, TYPE_BOOLEAN)) { + // Write encoding of each element. + for (int i = 0; i < numElements; i++) { + mPos += mBuffer.putBoolean(mPos, elements[i]); + } + mNumElements++; + } + return this; + } + + /** + * Write a repeated int field to this StatsEvent. + * + * The list size must not exceed 127. Otherwise, the array isn't written + * to the StatsEvent and ERROR_LIST_TOO_LONG is appended to the + * StatsEvent errors field. + * + * @param elements array of ints. + **/ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @NonNull + public Builder writeIntArray(@NonNull final int[] elements) { + final byte numElements = (byte)elements.length; + + if (writeArrayInfo(numElements, TYPE_INT)) { + // Write encoding of each element. + for (int i = 0; i < numElements; i++) { + mPos += mBuffer.putInt(mPos, elements[i]); + } + mNumElements++; + } + return this; + } + + /** + * Write a repeated long field to this StatsEvent. + * + * The list size must not exceed 127. Otherwise, the array isn't written + * to the StatsEvent and ERROR_LIST_TOO_LONG is appended to the + * StatsEvent errors field. + * + * @param elements array of longs. + **/ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @NonNull + public Builder writeLongArray(@NonNull final long[] elements) { + final byte numElements = (byte)elements.length; + + if (writeArrayInfo(numElements, TYPE_LONG)) { + // Write encoding of each element. + for (int i = 0; i < numElements; i++) { + mPos += mBuffer.putLong(mPos, elements[i]); + } + mNumElements++; + } + return this; + } + + /** + * Write a repeated float field to this StatsEvent. + * + * The list size must not exceed 127. Otherwise, the array isn't written + * to the StatsEvent and ERROR_LIST_TOO_LONG is appended to the + * StatsEvent errors field. + * + * @param elements array of floats. + **/ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @NonNull + public Builder writeFloatArray(@NonNull final float[] elements) { + final byte numElements = (byte)elements.length; + + if (writeArrayInfo(numElements, TYPE_FLOAT)) { + // Write encoding of each element. + for (int i = 0; i < numElements; i++) { + mPos += mBuffer.putFloat(mPos, elements[i]); + } + mNumElements++; + } + return this; + } + + /** + * Write a repeated string field to this StatsEvent. + * + * The list size must not exceed 127. Otherwise, the array isn't written + * to the StatsEvent and ERROR_LIST_TOO_LONG is appended to the + * StatsEvent errors field. + * + * @param elements array of strings. + **/ + @RequiresApi(Build.VERSION_CODES.TIRAMISU) + @NonNull + public Builder writeStringArray(@NonNull final String[] elements) { + final byte numElements = (byte)elements.length; + + if (writeArrayInfo(numElements, TYPE_STRING)) { + // Write encoding of each element. + for (int i = 0; i < numElements; i++) { + final byte[] elementBytes = stringToBytes(elements[i]); + mPos += mBuffer.putInt(mPos, elementBytes.length); + mPos += mBuffer.putByteArray(mPos, elementBytes); + } + mNumElements++; + } + return this; + } + + /** + * Write a boolean annotation for the last field written. + **/ + @NonNull + public Builder addBooleanAnnotation( + final byte annotationId, final boolean value) { + // Ensure there's a field written to annotate. + if (mNumElements < 2) { + mErrorMask |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + } else if (mCurrentAnnotationCount >= MAX_ANNOTATION_COUNT) { + mErrorMask |= ERROR_TOO_MANY_ANNOTATIONS; + } else { + mPos += mBuffer.putByte(mPos, annotationId); + mPos += mBuffer.putByte(mPos, TYPE_BOOLEAN); + mPos += mBuffer.putBoolean(mPos, value); + mCurrentAnnotationCount++; + writeAnnotationCount(); + } + + return this; + } + + /** + * Write an integer annotation for the last field written. + **/ + @NonNull + public Builder addIntAnnotation(final byte annotationId, final int value) { + if (mNumElements < 2) { + mErrorMask |= ERROR_ANNOTATION_DOES_NOT_FOLLOW_FIELD; + } else if (mCurrentAnnotationCount >= MAX_ANNOTATION_COUNT) { + mErrorMask |= ERROR_TOO_MANY_ANNOTATIONS; + } else { + mPos += mBuffer.putByte(mPos, annotationId); + mPos += mBuffer.putByte(mPos, TYPE_INT); + mPos += mBuffer.putInt(mPos, value); + mCurrentAnnotationCount++; + writeAnnotationCount(); + } + + return this; + } + + /** + * Indicates to reuse Buffer's byte array as the underlying payload in StatsEvent. + * This should be called for pushed events to reduce memory allocations and garbage + * collections. + **/ + @NonNull + public Builder usePooledBuffer() { + mUsePooledBuffer = true; + mBuffer.setMaxSize(MAX_PUSH_PAYLOAD_SIZE, mPos); + return this; + } + + /** + * Builds a StatsEvent object with values entered in this Builder. + **/ + @NonNull + public StatsEvent build() { + if (0L == mTimestampNs) { + mErrorMask |= ERROR_NO_TIMESTAMP; + } + if (0 == mAtomId) { + mErrorMask |= ERROR_NO_ATOM_ID; + } + if (mBuffer.hasOverflowed()) { + mErrorMask |= ERROR_OVERFLOW; + } + if (mNumElements > MAX_NUM_ELEMENTS) { + mErrorMask |= ERROR_TOO_MANY_FIELDS; + } + + if (0 == mErrorMask) { + mBuffer.putByte(POS_NUM_ELEMENTS, (byte) mNumElements); + } else { + // Write atom id and error mask. Overwrite any annotations for atom Id. + mPos = POS_ATOM_ID; + mPos += mBuffer.putByte(mPos, TYPE_INT); + mPos += mBuffer.putInt(mPos, mAtomId); + mPos += mBuffer.putByte(mPos, TYPE_ERRORS); + mPos += mBuffer.putInt(mPos, mErrorMask); + mBuffer.putByte(POS_NUM_ELEMENTS, (byte) 3); + } + + final int size = mPos; + + if (mUsePooledBuffer) { + return new StatsEvent(mAtomId, mBuffer, mBuffer.getBytes(), size); + } else { + // Create a copy of the buffer with the required number of bytes. + final byte[] payload = new byte[size]; + System.arraycopy(mBuffer.getBytes(), 0, payload, 0, size); + + // Return Buffer instance to the pool. + mBuffer.release(); + + return new StatsEvent(mAtomId, null, payload, size); + } + } + + private void writeTypeId(final byte typeId) { + mPosLastField = mPos; + mLastType = typeId; + mCurrentAnnotationCount = 0; + final byte encodedId = (byte) (typeId & 0x0F); + mPos += mBuffer.putByte(mPos, encodedId); + } + + private void writeAnnotationCount() { + // Use first 4 bits for annotation count and last 4 bits for typeId. + final byte encodedId = (byte) ((mCurrentAnnotationCount << 4) | (mLastType & 0x0F)); + mBuffer.putByte(mPosLastField, encodedId); + } + + @NonNull + private static byte[] stringToBytes(@Nullable final String value) { + return (null == value ? "" : value).getBytes(UTF_8); + } + + private boolean writeArrayInfo(final byte numElements, + final byte elementTypeId) { + if (numElements > MAX_NUM_ELEMENTS) { + mErrorMask |= ERROR_LIST_TOO_LONG; + return false; + } + // Write list typeId byte, 1-byte representation of number of + // elements, and element typeId byte. + writeTypeId(TYPE_LIST); + mPos += mBuffer.putByte(mPos, numElements); + // Write element typeId byte without setting mPosLastField and mLastType (i.e. don't use + // #writeTypeId) + final byte encodedId = (byte) (elementTypeId & 0x0F); + mPos += mBuffer.putByte(mPos, encodedId); + return true; + } + } + + private static final class Buffer { + private static Object sLock = new Object(); + + @GuardedBy("sLock") + private static Buffer sPool; + + private byte[] mBytes; + private boolean mOverflow = false; + private int mMaxSize = MAX_PULL_PAYLOAD_SIZE; + + @NonNull + private static Buffer obtain() { + final Buffer buffer; + synchronized (sLock) { + buffer = null == sPool ? new Buffer() : sPool; + sPool = null; + } + buffer.reset(); + return buffer; + } + + private Buffer() { + final ByteBuffer tempBuffer = ByteBuffer.allocateDirect(MAX_PUSH_PAYLOAD_SIZE); + mBytes = tempBuffer.hasArray() ? tempBuffer.array() : new byte [MAX_PUSH_PAYLOAD_SIZE]; + } + + @NonNull + private byte[] getBytes() { + return mBytes; + } + + private void release() { + // Recycle this Buffer if its size is MAX_PUSH_PAYLOAD_SIZE or under. + if (mMaxSize <= MAX_PUSH_PAYLOAD_SIZE) { + synchronized (sLock) { + if (null == sPool) { + sPool = this; + } + } + } + } + + private void reset() { + mOverflow = false; + mMaxSize = MAX_PULL_PAYLOAD_SIZE; + } + + private void setMaxSize(final int maxSize, final int numBytesWritten) { + mMaxSize = maxSize; + if (numBytesWritten > maxSize) { + mOverflow = true; + } + } + + private boolean hasOverflowed() { + return mOverflow; + } + + /** + * Checks for available space in the byte array. + * + * @param index starting position in the buffer to start the check. + * @param numBytes number of bytes to check from index. + * @return true if space is available, false otherwise. + **/ + private boolean hasEnoughSpace(final int index, final int numBytes) { + final int totalBytesNeeded = index + numBytes; + + if (totalBytesNeeded > mMaxSize) { + mOverflow = true; + return false; + } + + // Expand buffer if needed. + if (mBytes.length < mMaxSize && totalBytesNeeded > mBytes.length) { + int newSize = mBytes.length; + do { + newSize *= 2; + } while (newSize <= totalBytesNeeded); + + if (newSize > mMaxSize) { + newSize = mMaxSize; + } + + mBytes = Arrays.copyOf(mBytes, newSize); + } + + return true; + } + + /** + * Writes a byte into the buffer. + * + * @param index position in the buffer where the byte is written. + * @param value the byte to write. + * @return number of bytes written to buffer from this write operation. + **/ + private int putByte(final int index, final byte value) { + if (hasEnoughSpace(index, Byte.BYTES)) { + mBytes[index] = (byte) (value); + return Byte.BYTES; + } + return 0; + } + + /** + * Writes a boolean into the buffer. + * + * @param index position in the buffer where the boolean is written. + * @param value the boolean to write. + * @return number of bytes written to buffer from this write operation. + **/ + private int putBoolean(final int index, final boolean value) { + return putByte(index, (byte) (value ? 1 : 0)); + } + + /** + * Writes an integer into the buffer. + * + * @param index position in the buffer where the integer is written. + * @param value the integer to write. + * @return number of bytes written to buffer from this write operation. + **/ + private int putInt(final int index, final int value) { + if (hasEnoughSpace(index, Integer.BYTES)) { + // Use little endian byte order. + mBytes[index] = (byte) (value); + mBytes[index + 1] = (byte) (value >> 8); + mBytes[index + 2] = (byte) (value >> 16); + mBytes[index + 3] = (byte) (value >> 24); + return Integer.BYTES; + } + return 0; + } + + /** + * Writes a long into the buffer. + * + * @param index position in the buffer where the long is written. + * @param value the long to write. + * @return number of bytes written to buffer from this write operation. + **/ + private int putLong(final int index, final long value) { + if (hasEnoughSpace(index, Long.BYTES)) { + // Use little endian byte order. + mBytes[index] = (byte) (value); + mBytes[index + 1] = (byte) (value >> 8); + mBytes[index + 2] = (byte) (value >> 16); + mBytes[index + 3] = (byte) (value >> 24); + mBytes[index + 4] = (byte) (value >> 32); + mBytes[index + 5] = (byte) (value >> 40); + mBytes[index + 6] = (byte) (value >> 48); + mBytes[index + 7] = (byte) (value >> 56); + return Long.BYTES; + } + return 0; + } + + /** + * Writes a float into the buffer. + * + * @param index position in the buffer where the float is written. + * @param value the float to write. + * @return number of bytes written to buffer from this write operation. + **/ + private int putFloat(final int index, final float value) { + return putInt(index, Float.floatToIntBits(value)); + } + + /** + * Copies a byte array into the buffer. + * + * @param index position in the buffer where the byte array is copied. + * @param value the byte array to copy. + * @return number of bytes written to buffer from this write operation. + **/ + private int putByteArray(final int index, @NonNull final byte[] value) { + final int numBytes = value.length; + if (hasEnoughSpace(index, numBytes)) { + System.arraycopy(value, 0, mBytes, index, numBytes); + return numBytes; + } + return 0; + } + } +} diff --git a/ravenwood/runtime-helper-src/framework/android/util/StatsLog.java b/ravenwood/runtime-helper-src/framework/android/util/StatsLog.java new file mode 100644 index 000000000000..c1c20cfac9dd --- /dev/null +++ b/ravenwood/runtime-helper-src/framework/android/util/StatsLog.java @@ -0,0 +1,478 @@ +/* + * Copyright (C) 2017 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.util; + +/* + * [Ravenwood] This is copied from StatsD, with the following changes: + * - The static {} is commented out. + * - All references to IStatsD and StatsdStatsLog are commented out. + * - The native method is no-oped. + */ + +import static android.Manifest.permission.DUMP; +import static android.Manifest.permission.PACKAGE_USAGE_STATS; + +import android.annotation.IntDef; +import android.annotation.NonNull; +import android.annotation.RequiresPermission; +import android.annotation.SuppressLint; +import android.annotation.SystemApi; +import android.os.Build; +//import android.os.IStatsd; +import android.os.Process; +import android.util.proto.ProtoOutputStream; + +import androidx.annotation.RequiresApi; + +//import com.android.internal.statsd.StatsdStatsLog; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * StatsLog provides an API for developers to send events to statsd. The events can be used to + * define custom metrics in side statsd. + */ +public final class StatsLog { + +// // Load JNI library +// static { +// System.loadLibrary("stats_jni"); +// } + private static final String TAG = "StatsLog"; + private static final boolean DEBUG = false; + private static final int EXPERIMENT_IDS_FIELD_ID = 1; + + /** + * Annotation ID constant for logging UID field. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_IS_UID = 1; + + /** + * Annotation ID constant to indicate logged atom event's timestamp should be truncated. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_TRUNCATE_TIMESTAMP = 2; + + /** + * Annotation ID constant for a state atom's primary field. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_PRIMARY_FIELD = 3; + + /** + * Annotation ID constant for state atom's state field. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_EXCLUSIVE_STATE = 4; + + /** + * Annotation ID constant to indicate the first UID in the attribution chain + * is a primary field. + * Should only be used for attribution chain fields. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID = 5; + + /** + * Annotation ID constant to indicate which state is default for the state atom. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_DEFAULT_STATE = 6; + + /** + * Annotation ID constant to signal all states should be reset to the default state. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_TRIGGER_STATE_RESET = 7; + + /** + * Annotation ID constant to indicate state changes need to account for nesting. + * This should only be used with binary state atoms. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + public static final byte ANNOTATION_ID_STATE_NESTED = 8; + + /** + * Annotation ID constant to indicate the restriction category of an atom. + * This annotation must only be attached to the atom id. This is an int annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_RESTRICTION_CATEGORY = 9; + + /** + * Annotation ID to indicate that a field of an atom contains peripheral device info. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_PERIPHERAL_DEVICE_INFO = 10; + + /** + * Annotation ID to indicate that a field of an atom contains app usage information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_APP_USAGE = 11; + + /** + * Annotation ID to indicate that a field of an atom contains app activity information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_APP_ACTIVITY = 12; + + /** + * Annotation ID to indicate that a field of an atom contains health connect information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_HEALTH_CONNECT = 13; + + /** + * Annotation ID to indicate that a field of an atom contains accessibility information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_ACCESSIBILITY = 14; + + /** + * Annotation ID to indicate that a field of an atom contains system search information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_SYSTEM_SEARCH = 15; + + /** + * Annotation ID to indicate that a field of an atom contains user engagement information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_USER_ENGAGEMENT = 16; + + /** + * Annotation ID to indicate that a field of an atom contains ambient sensing information. + * This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_AMBIENT_SENSING = 17; + + /** + * Annotation ID to indicate that a field of an atom contains demographic classification + * information. This is a bool annotation. + * + * The ID is a byte since StatsEvent.addBooleanAnnotation() and StatsEvent.addIntAnnotation() + * accept byte as the type for annotation ids to save space. + * + * @hide + */ + @SuppressLint("NoByteOrShort") + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final byte ANNOTATION_ID_FIELD_RESTRICTION_DEMOGRAPHIC_CLASSIFICATION = 18; + + + /** @hide */ + @IntDef(prefix = { "RESTRICTION_CATEGORY_" }, value = { + RESTRICTION_CATEGORY_DIAGNOSTIC, + RESTRICTION_CATEGORY_SYSTEM_INTELLIGENCE, + RESTRICTION_CATEGORY_AUTHENTICATION, + RESTRICTION_CATEGORY_FRAUD_AND_ABUSE}) + @Retention(RetentionPolicy.SOURCE) + public @interface RestrictionCategory {} + + /** + * Restriction category for atoms about diagnostics. + * + * @hide + */ + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final int RESTRICTION_CATEGORY_DIAGNOSTIC = 1; + + /** + * Restriction category for atoms about system intelligence. + * + * @hide + */ + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final int RESTRICTION_CATEGORY_SYSTEM_INTELLIGENCE = 2; + + /** + * Restriction category for atoms about authentication. + * + * @hide + */ + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final int RESTRICTION_CATEGORY_AUTHENTICATION = 3; + + /** + * Restriction category for atoms about fraud and abuse. + * + * @hide + */ + @SystemApi + @RequiresApi(Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final int RESTRICTION_CATEGORY_FRAUD_AND_ABUSE = 4; + + private StatsLog() { + } + + /** + * Logs a start event. + * + * @param label developer-chosen label. + * @return True if the log request was sent to statsd. + */ + public static boolean logStart(int label) { + int callingUid = Process.myUid(); +// StatsdStatsLog.write( +// StatsdStatsLog.APP_BREADCRUMB_REPORTED, +// callingUid, +// label, +// StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__START); + return true; + } + + /** + * Logs a stop event. + * + * @param label developer-chosen label. + * @return True if the log request was sent to statsd. + */ + public static boolean logStop(int label) { + int callingUid = Process.myUid(); +// StatsdStatsLog.write( +// StatsdStatsLog.APP_BREADCRUMB_REPORTED, +// callingUid, +// label, +// StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__STOP); + return true; + } + + /** + * Logs an event that does not represent a start or stop boundary. + * + * @param label developer-chosen label. + * @return True if the log request was sent to statsd. + */ + public static boolean logEvent(int label) { + int callingUid = Process.myUid(); +// StatsdStatsLog.write( +// StatsdStatsLog.APP_BREADCRUMB_REPORTED, +// callingUid, +// label, +// StatsdStatsLog.APP_BREADCRUMB_REPORTED__STATE__UNSPECIFIED); + return true; + } + + /** + * Logs an event for binary push for module updates. + * + * @param trainName name of install train. + * @param trainVersionCode version code of the train. + * @param options optional flags about this install. + * The last 3 bits indicate options: + * 0x01: FLAG_REQUIRE_STAGING + * 0x02: FLAG_ROLLBACK_ENABLED + * 0x04: FLAG_REQUIRE_LOW_LATENCY_MONITOR + * @param state current install state. Defined as State enums in + * BinaryPushStateChanged atom in + * frameworks/proto_logging/stats/atoms.proto + * @param experimentIds experiment ids. + * @return True if the log request was sent to statsd. + */ + @RequiresPermission(allOf = {DUMP, PACKAGE_USAGE_STATS}) + public static boolean logBinaryPushStateChanged(@NonNull String trainName, + long trainVersionCode, int options, int state, + @NonNull long[] experimentIds) { + ProtoOutputStream proto = new ProtoOutputStream(); + for (long id : experimentIds) { + proto.write( + ProtoOutputStream.FIELD_TYPE_INT64 + | ProtoOutputStream.FIELD_COUNT_REPEATED + | EXPERIMENT_IDS_FIELD_ID, + id); + } +// StatsdStatsLog.write(StatsdStatsLog.BINARY_PUSH_STATE_CHANGED, +// trainName, +// trainVersionCode, +// (options & IStatsd.FLAG_REQUIRE_STAGING) > 0, +// (options & IStatsd.FLAG_ROLLBACK_ENABLED) > 0, +// (options & IStatsd.FLAG_REQUIRE_LOW_LATENCY_MONITOR) > 0, +// state, +// proto.getBytes(), +// 0, +// 0, +// false); + return true; + } + + /** + * Write an event to stats log using the raw format. + * + * @param buffer The encoded buffer of data to write. + * @param size The number of bytes from the buffer to write. + * @hide + * @deprecated Use {@link write(final StatsEvent statsEvent)} instead. + * + */ + @Deprecated + @SystemApi + public static void writeRaw(@NonNull byte[] buffer, int size) { + writeImpl(buffer, size, 0); + } + + /** + * Write an event to stats log using the raw format. + * + * @param buffer The encoded buffer of data to write. + * @param size The number of bytes from the buffer to write. + * @param atomId The id of the atom to which the event belongs. + */ +// private static native void writeImpl(@NonNull byte[] buffer, int size, int atomId); + private static void writeImpl(@NonNull byte[] buffer, int size, int atomId) { + // no-op for now + } + + /** + * Write an event to stats log using the raw format encapsulated in StatsEvent. + * After writing to stats log, release() is called on the StatsEvent object. + * No further action should be taken on the StatsEvent object following this call. + * + * @param statsEvent The StatsEvent object containing the encoded buffer of data to write. + * @hide + */ + @SystemApi + public static void write(@NonNull final StatsEvent statsEvent) { + writeImpl(statsEvent.getBytes(), statsEvent.getNumBytes(), statsEvent.getAtomId()); + statsEvent.release(); + } +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/android/compat/Compatibility.java b/ravenwood/runtime-helper-src/libcore-fake/android/compat/Compatibility.java new file mode 100644 index 000000000000..c7376842d8f3 --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/android/compat/Compatibility.java @@ -0,0 +1,359 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.compat; + +// [Ravenwood] Copied from libcore, with "RAVENWOOD-CHANGE" + +import static android.annotation.SystemApi.Client.MODULE_LIBRARIES; + +import android.annotation.SystemApi; +import android.compat.annotation.ChangeId; + +import libcore.api.IntraCoreApi; +import libcore.util.NonNull; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +/** + * Internal APIs for logging and gating compatibility changes. + * + * @see ChangeId + * + * @hide + */ +@SystemApi(client = MODULE_LIBRARIES) +@IntraCoreApi +public final class Compatibility { + + private Compatibility() {} + + /** + * Reports that a compatibility change is affecting the current process now. + * + *

Calls to this method from a non-app process are ignored. This allows code implementing + * APIs that are used by apps and by other code (e.g. the system server) to report changes + * regardless of the process it's running in. When called in a non-app process, this method is + * a no-op. + * + *

Note: for changes that are gated using {@link #isChangeEnabled(long)}, you do not need to + * call this API directly. The change will be reported for you in the case that + * {@link #isChangeEnabled(long)} returns {@code true}. + * + * @param changeId The ID of the compatibility change taking effect. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public static void reportUnconditionalChange(@ChangeId long changeId) { + sCallbacks.onChangeReported(changeId); + } + + /** + * Query if a given compatibility change is enabled for the current process. This method should + * only be called by code running inside a process of the affected app. + * + *

If this method returns {@code true}, the calling code should implement the compatibility + * change, resulting in differing behaviour compared to earlier releases. If this method returns + * {@code false}, the calling code should behave as it did in earlier releases. + * + *

When this method returns {@code true}, it will also report the change as + * {@link #reportUnconditionalChange(long)} would, so there is no need to call that method + * directly. + * + * @param changeId The ID of the compatibility change in question. + * @return {@code true} if the change is enabled for the current app. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public static boolean isChangeEnabled(@ChangeId long changeId) { + return sCallbacks.isChangeEnabled(changeId); + } + + private static final BehaviorChangeDelegate DEFAULT_CALLBACKS = new BehaviorChangeDelegate(){}; + + private volatile static BehaviorChangeDelegate sCallbacks = DEFAULT_CALLBACKS; + + /** + * Sets the behavior change delegate. + * + * All changes reported via the {@link Compatibility} class will be forwarded to this class. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static void setBehaviorChangeDelegate(BehaviorChangeDelegate callbacks) { + sCallbacks = Objects.requireNonNull(callbacks); + } + + /** + * Removes a behavior change delegate previously set via {@link #setBehaviorChangeDelegate}. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static void clearBehaviorChangeDelegate() { + sCallbacks = DEFAULT_CALLBACKS; + } + + /** + * Return the behavior change delegate + * + * @hide + */ + // VisibleForTesting + @NonNull + public static BehaviorChangeDelegate getBehaviorChangeDelegate() { + return sCallbacks; + } + + /** + * For use by tests only. Causes values from {@code overrides} to be returned instead of the + * real value. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static void setOverrides(ChangeConfig overrides) { + // Setting overrides twice in a row does not need to be supported because + // this method is only for enabling/disabling changes for the duration of + // a single test. + // In production, the app is restarted when changes get enabled or disabled, + // and the ChangeConfig is then set exactly once on that app process. + if (sCallbacks instanceof OverrideCallbacks) { + throw new IllegalStateException("setOverrides has already been called!"); + } + sCallbacks = new OverrideCallbacks(sCallbacks, overrides); + } + + /** + * For use by tests only. Removes overrides set by {@link #setOverrides}. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public static void clearOverrides() { + if (!(sCallbacks instanceof OverrideCallbacks)) { + throw new IllegalStateException("No overrides set"); + } + sCallbacks = ((OverrideCallbacks) sCallbacks).delegate; + } + + /** + * Base class for compatibility API implementations. The default implementation logs a warning + * to logcat. + * + * This is provided as a class rather than an interface to allow new methods to be added without + * breaking @SystemApi binary compatibility. + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + public interface BehaviorChangeDelegate { + /** + * Called when a change is reported via {@link Compatibility#reportUnconditionalChange} + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + default void onChangeReported(long changeId) { + // Do not use String.format here (b/160912695) + + // RAVENWOOD-CHANGE + System.out.println("No Compatibility callbacks set! Reporting change " + changeId); + } + + /** + * Called when a change is queried via {@link Compatibility#isChangeEnabled} + * + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + default boolean isChangeEnabled(long changeId) { + // Do not use String.format here (b/160912695) + // TODO(b/289900411): Rate limit this log if it's necessary in the release build. + // System.logW("No Compatibility callbacks set! Querying change " + changeId); + return true; + } + } + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public static final class ChangeConfig { + private final Set enabled; + private final Set disabled; + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public ChangeConfig(@NonNull Set<@NonNull Long> enabled, @NonNull Set<@NonNull Long> disabled) { + this.enabled = Objects.requireNonNull(enabled); + this.disabled = Objects.requireNonNull(disabled); + if (enabled.contains(null)) { + throw new NullPointerException(); + } + if (disabled.contains(null)) { + throw new NullPointerException(); + } + Set intersection = new HashSet<>(enabled); + intersection.retainAll(disabled); + if (!intersection.isEmpty()) { + throw new IllegalArgumentException("Cannot have changes " + intersection + + " enabled and disabled!"); + } + } + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public boolean isEmpty() { + return enabled.isEmpty() && disabled.isEmpty(); + } + + private static long[] toLongArray(Set values) { + long[] result = new long[values.size()]; + int idx = 0; + for (Long value: values) { + result[idx++] = value; + } + return result; + } + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public @NonNull long[] getEnabledChangesArray() { + return toLongArray(enabled); + } + + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public @NonNull long[] getDisabledChangesArray() { + return toLongArray(disabled); + } + + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public @NonNull Set<@NonNull Long> getEnabledSet() { + return Collections.unmodifiableSet(enabled); + } + + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public @NonNull Set<@NonNull Long> getDisabledSet() { + return Collections.unmodifiableSet(disabled); + } + + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public boolean isForceEnabled(long changeId) { + return enabled.contains(changeId); + } + + + /** + * @hide + */ + @SystemApi(client = MODULE_LIBRARIES) + @IntraCoreApi + public boolean isForceDisabled(long changeId) { + return disabled.contains(changeId); + } + + + /** + * @hide + */ + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof ChangeConfig)) { + return false; + } + ChangeConfig that = (ChangeConfig) o; + return enabled.equals(that.enabled) && + disabled.equals(that.disabled); + } + + /** + * @hide + */ + @Override + public int hashCode() { + return Objects.hash(enabled, disabled); + } + + + /** + * @hide + */ + @Override + public String toString() { + return "ChangeConfig{enabled=" + enabled + ", disabled=" + disabled + '}'; + } + } + + private static class OverrideCallbacks implements BehaviorChangeDelegate { + private final BehaviorChangeDelegate delegate; + private final ChangeConfig changeConfig; + + private OverrideCallbacks(BehaviorChangeDelegate delegate, ChangeConfig changeConfig) { + this.delegate = Objects.requireNonNull(delegate); + this.changeConfig = Objects.requireNonNull(changeConfig); + } + @Override + public boolean isChangeEnabled(long changeId) { + if (changeConfig.isForceEnabled(changeId)) { + return true; + } + if (changeConfig.isForceDisabled(changeId)) { + return false; + } + return delegate.isChangeEnabled(changeId); + } + } +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/api/CorePlatformApi.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/CorePlatformApi.java new file mode 100644 index 000000000000..00730efc64b3 --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/CorePlatformApi.java @@ -0,0 +1,69 @@ + +/* + * Copyright (C) 2018 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 libcore.api; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Indicates an API is part of a contract provided by the "core" set of + * libraries to select parts of the Android software stack. + * + *

This annotation should only appear on either (a) classes that are hidden by

@hide
+ * javadoc tags or equivalent annotations, or (b) members of such classes. It is for use with + * metalava's {@code --show-single-annotation} option and so must be applied at the class level and + * applied again each member that is to be made part of the API. Members that are not part of the + * API do not have to be explicitly hidden. + * + * @hide + */ +@IntraCoreApi +@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE}) +@Retention(RetentionPolicy.SOURCE) +public @interface CorePlatformApi { + + /** Enumeration of the possible statuses of the API in the core/platform API surface. */ + @IntraCoreApi + enum Status { + + /** + * This API is considered stable, and so present in both the stable and legacy version of + * the API surface. + */ + @IntraCoreApi + STABLE, + + /** + * This API is not (yet) considered stable, and so only present in the legacy version of + * the API surface. + */ + @IntraCoreApi + LEGACY_ONLY + } + + /** The status of the API in the core/platform API surface. */ + @IntraCoreApi + Status status() default Status.LEGACY_ONLY; +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/api/Hide.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/Hide.java new file mode 100644 index 000000000000..f87ff11df0ab --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/Hide.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2018 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 libcore.api; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Indicates that an API is hidden by default, in a similar fashion to the + *
@hide
javadoc tag. + * + *

Note that, in order for this to work, metalava has to be invoked with + * the flag {@code --hide-annotation libcore.api.Hide}. + * + *

This annotation should be used in {@code .annotated.java} stub files which + * contain API inclusion information about {@code libcore/ojluni} classes, to + * avoid patching the source files with

@hide
javadoc tags. All + * build targets which consume these stub files should also apply the above + * metalava flag. + * + * @hide + */ +@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE}) +@Retention(RetentionPolicy.SOURCE) +public @interface Hide { +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/api/IntraCoreApi.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/IntraCoreApi.java new file mode 100644 index 000000000000..87cfcff2474b --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/api/IntraCoreApi.java @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2018 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 libcore.api; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.TYPE; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Indicates an API is part of a contract within the "core" set of libraries, some of which may + * be mmodules. + * + *

This annotation should only appear on either (a) classes that are hidden by

@hide
+ * javadoc tags or equivalent annotations, or (b) members of such classes. It is for use with + * metalava's {@code --show-single-annotation} option and so must be applied at the class level and + * applied again each member that is to be made part of the API. Members that are not part of the + * API do not have to be explicitly hidden. + * + * @hide + */ +@IntraCoreApi // @IntraCoreApi is itself part of the intra-core API +@Target({TYPE, FIELD, METHOD, CONSTRUCTOR, ANNOTATION_TYPE}) +@Retention(RetentionPolicy.SOURCE) +public @interface IntraCoreApi { +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NonNull.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NonNull.java new file mode 100644 index 000000000000..db3cd8ed712f --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/NonNull.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2017 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 libcore.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Denotes that a type use can never be null. + *

+ * This is a marker annotation and it has no specific attributes. + * @hide + */ +@Documented +@Retention(SOURCE) +@Target({FIELD, METHOD, PARAMETER, TYPE_USE}) +@libcore.api.IntraCoreApi +public @interface NonNull { + /** + * Min Android API level (inclusive) to which this annotation is applied. + */ + int from() default Integer.MIN_VALUE; + + /** + * Max Android API level to which this annotation is applied. + */ + int to() default Integer.MAX_VALUE; +} diff --git a/ravenwood/runtime-helper-src/libcore-fake/libcore/util/Nullable.java b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/Nullable.java new file mode 100644 index 000000000000..3371978b0568 --- /dev/null +++ b/ravenwood/runtime-helper-src/libcore-fake/libcore/util/Nullable.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2017 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 libcore.util; + +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.SOURCE; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +/** + * Denotes that a type use can be a null. + *

+ * This is a marker annotation and it has no specific attributes. + * @hide + */ +@Documented +@Retention(SOURCE) +@Target({FIELD, METHOD, PARAMETER, TYPE_USE}) +@libcore.api.IntraCoreApi +public @interface Nullable { + /** + * Min Android API level (inclusive) to which this annotation is applied. + */ + int from() default Integer.MIN_VALUE; + + /** + * Max Android API level to which this annotation is applied. + */ + int to() default Integer.MAX_VALUE; +} diff --git a/ravenwood/texts/ravenwood-framework-policies.txt b/ravenwood/texts/ravenwood-framework-policies.txt index 3649f0e78f09..b64944ee39ed 100644 --- a/ravenwood/texts/ravenwood-framework-policies.txt +++ b/ravenwood/texts/ravenwood-framework-policies.txt @@ -5,6 +5,10 @@ rename com/.*/nano/ devicenano/ rename android/.*/nano/ devicenano/ + +# StatsD autogenerated classes. Maybe add a heuristic? +class com.android.internal.util.FrameworkStatsLog keepclass + # Exported to Mainline modules; cannot use annotations class com.android.internal.util.FastXmlSerializer keepclass class com.android.internal.util.FileRotator keepclass -- GitLab From b935668b83f0389199dec230a763658f929df62a Mon Sep 17 00:00:00 2001 From: "Liana Kazanova (xWF)" Date: Mon, 21 Oct 2024 17:01:11 +0000 Subject: [PATCH 142/459] Revert "Add com.android.healthfitness to apex_available for andr..." Revert submission 28112536-enable_hc_on_wear Reason for revert: DroidMonitor: Potential culprit for http://b/374745549 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted. Reverted changes: /q/submissionid:28112536-enable_hc_on_wear Change-Id: Ic3f9c43a5d9fd731ff2244c23753a5077cd900b3 --- AconfigFlags.bp | 1 - 1 file changed, 1 deletion(-) diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 67ccb991c98d..c6ce799f0a24 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -767,7 +767,6 @@ java_aconfig_library { min_sdk_version: "30", apex_available: [ "//apex_available:platform", - "com.android.healthfitness", "com.android.permission", "com.android.nfcservices", ], -- GitLab From 90dd959720dda2ec6ca7a033b43844f4e1fa95ee Mon Sep 17 00:00:00 2001 From: helencheuk Date: Fri, 18 Oct 2024 19:08:58 +0100 Subject: [PATCH 143/459] [Contextual Edu] Log metrics when education is triggered Log metrics when education is triggered Bug: 372428207 Test: KeyboardTouchpadEduInteractorTest Test: statsd_testdrive Flag: com.android.systemui.keyboard_touchpad_contextual_education Change-Id: I5c94181b471fc3fa99b99e4f82729753cee5f49d --- .../KeyboardTouchpadEduInteractorTest.kt | 25 +++++++++- .../ContextualEducationMetricsLogger.kt | 49 +++++++++++++++++++ .../KeyboardTouchpadEduInteractor.kt | 6 ++- .../KeyboardTouchpadEduInteractorKosmos.kt | 7 ++- 4 files changed, 83 insertions(+), 4 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt index e7d2ef10b4ee..21679f960198 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorTest.kt @@ -187,7 +187,7 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : signalCount = 1, usageSessionStartTime = secondSignalReceivedTime, userId = 0, - gestureType = gestureType + gestureType = gestureType, ) ) } @@ -402,6 +402,29 @@ class KeyboardTouchpadEduInteractorTest(private val gestureType: GestureType) : eduClock.offset(initialDelayElapsedDuration) } + fun logMetricsForToastEducation() = + testScope.runTest { + triggerMaxEducationSignals(gestureType) + runCurrent() + + verify(kosmos.mockEduMetricsLogger) + .logContextualEducationTriggered(gestureType, EducationUiType.Toast) + } + + @Test + fun logMetricsForNotificationEducation() = + testScope.runTest { + triggerMaxEducationSignals(gestureType) + runCurrent() + + eduClock.offset(minDurationForNextEdu) + triggerMaxEducationSignals(gestureType) + runCurrent() + + verify(kosmos.mockEduMetricsLogger) + .logContextualEducationTriggered(gestureType, EducationUiType.Notification) + } + @After fun clear() { testScope.launch { tutorialSchedulerRepository.clearDataStore() } diff --git a/packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt b/packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt new file mode 100644 index 000000000000..9af259a9b642 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/education/ContextualEducationMetricsLogger.kt @@ -0,0 +1,49 @@ +/* + * 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.education + +import com.android.systemui.contextualeducation.GestureType +import com.android.systemui.education.shared.model.EducationUiType +import com.android.systemui.shared.system.SysUiStatsLog +import javax.inject.Inject + +class ContextualEducationMetricsLogger @Inject constructor() { + fun logContextualEducationTriggered(gestureType: GestureType, uiType: EducationUiType) { + val statsGestureType = + when (gestureType) { + GestureType.BACK -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__BACK + GestureType.HOME -> SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__HOME + GestureType.OVERVIEW -> + SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__OVERVIEW + GestureType.ALL_APPS -> + SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__GESTURE_TYPE__ALL_APPS + } + + val statsEducationType = + when (uiType) { + EducationUiType.Toast -> + SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__TOAST + EducationUiType.Notification -> + SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED__EDUCATION_TYPE__NOTIFICATION + } + SysUiStatsLog.write( + SysUiStatsLog.CONTEXTUAL_EDUCATION_TRIGGERED, + statsGestureType, + statsEducationType, + ) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt index c17f3fb6dfe4..00da5b1e01ce 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt @@ -23,6 +23,7 @@ import com.android.systemui.contextualeducation.GestureType import com.android.systemui.contextualeducation.GestureType.ALL_APPS import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.dagger.ContextualEducationModule.EduClock import com.android.systemui.education.data.model.GestureEduModel import com.android.systemui.education.shared.model.EducationInfo @@ -62,6 +63,7 @@ constructor( private val userInputDeviceRepository: UserInputDeviceRepository, private val tutorialRepository: TutorialSchedulerRepository, private val overviewProxyService: OverviewProxyService, + private val metricsLogger: ContextualEducationMetricsLogger, @EduClock private val clock: Clock, ) : CoreStartable { @@ -129,9 +131,11 @@ constructor( if (isUsageSessionExpired(it)) { contextualEducationInteractor.startNewUsageSession(it.gestureType) } else if (isEducationNeeded(it)) { + val educationType = getEduType(it) _educationTriggered.value = - EducationInfo(it.gestureType, getEduType(it), it.userId) + EducationInfo(it.gestureType, educationType, it.userId) contextualEducationInteractor.updateOnEduTriggered(it.gestureType) + metricsLogger.logContextualEducationTriggered(it.gestureType, educationType) } } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt index 3fd2503096b5..93e7f2e588b0 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractorKosmos.kt @@ -17,6 +17,7 @@ package com.android.systemui.education.domain.interactor import android.hardware.input.InputManager +import com.android.systemui.education.ContextualEducationMetricsLogger import com.android.systemui.education.data.repository.fakeEduClock import com.android.systemui.inputdevice.data.repository.UserInputDeviceRepository import com.android.systemui.inputdevice.tutorial.tutorialSchedulerRepository @@ -41,11 +42,13 @@ var Kosmos.keyboardTouchpadEduInteractor by touchpadRepository, userRepository, ), - tutorialSchedulerRepository, - mockOverviewProxyService, + tutorialRepository = tutorialSchedulerRepository, + overviewProxyService = mockOverviewProxyService, + metricsLogger = mockEduMetricsLogger, clock = fakeEduClock, ) } +var Kosmos.mockEduMetricsLogger by Kosmos.Fixture { mock() } var Kosmos.mockOverviewProxyService by Kosmos.Fixture { mock() } var Kosmos.mockEduInputManager by Kosmos.Fixture { mock() } -- GitLab From 97e88ab643cc4add4297230793584c6706ce24ca Mon Sep 17 00:00:00 2001 From: Bill Strathearn Date: Fri, 20 Sep 2024 19:15:07 +0000 Subject: [PATCH 144/459] Update the bug component for blobstore Change-Id: I7c51d570c96a6a0a15f307475435203e9b53dd4e Flag: EXEMPT only changing OWNERS Bug: 360381361 Bug: 374300055 --- apex/blobstore/OWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apex/blobstore/OWNERS b/apex/blobstore/OWNERS index 676cbc7eb2a3..f8208830d83e 100644 --- a/apex/blobstore/OWNERS +++ b/apex/blobstore/OWNERS @@ -1,4 +1,4 @@ -# Bug component: 25692 +# Bug component: 1628187 set noparent sudheersai@google.com -- GitLab From 7e1354f38d7d947632ea0c60394caffbbc46de4e Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Mon, 14 Oct 2024 16:50:30 -0700 Subject: [PATCH 145/459] Remove onStageHasChildrenChanged() from StageCoordinator * sendStatusChanged() was only being called from onTaskAppeared() for when the root task appears for a given stage. * sendStatusChanged() had two callbacks, one if the children in a stage changed and one if the visibility of a stage's root task changed. The former is not affected by onTaskAppeared(), so we can directly call the visibility callback instead of going through sendStatusChanged() * This means that the other callback for children changes is no longer being used, so we remove that one altogether Bug: 349828130 Flag: EXEMPT refactor Test: Split works as expected Change-Id: Ie7cc642bdc761b7e916e53354ac21552e77a5de8 --- .../shell/splitscreen/StageCoordinator.java | 54 ------------------- .../shell/splitscreen/StageTaskListener.java | 23 ++------ .../splitscreen/StageTaskListenerTests.java | 1 - 3 files changed, 4 insertions(+), 74 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 3e76403de51b..9239fb7c171f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1908,60 +1908,6 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } } - /** Callback when split roots have child or haven't under it. - * NOTICE: This only be called on legacy transition. */ - @Override - public void onStageHasChildrenChanged(StageTaskListener stageListener) { - ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onStageHasChildrenChanged: isMainStage=%b", - stageListener == mMainStage); - final boolean hasChildren = stageListener.mHasChildren; - final boolean isSideStage = stageListener == mSideStage; - if (!hasChildren && !mIsExiting && isSplitActive()) { - if (isSideStage && mMainStage.mVisible) { - // Exit to main stage if side stage no longer has children. - mSplitLayout.flingDividerToDismiss( - mSideStagePosition == SPLIT_POSITION_BOTTOM_OR_RIGHT, - EXIT_REASON_APP_FINISHED); - } else if (!isSideStage && mSideStage.mVisible) { - // Exit to side stage if main stage no longer has children. - mSplitLayout.flingDividerToDismiss( - mSideStagePosition != SPLIT_POSITION_BOTTOM_OR_RIGHT, - EXIT_REASON_APP_FINISHED); - } else if (!isSplitScreenVisible() && mSplitRequest == null) { - // Dismiss split screen in the background once any sides of the split become empty. - exitSplitScreen(null /* childrenToTop */, EXIT_REASON_APP_FINISHED); - } - } else if (isSideStage && hasChildren && !isSplitActive()) { - final WindowContainerTransaction wct = new WindowContainerTransaction(); - prepareEnterSplitScreen(wct); - - mSyncQueue.queue(wct); - mSyncQueue.runInSync(t -> { - if (mIsDropEntering) { - updateSurfaceBounds(mSplitLayout, t, false /* applyResizingOffset */); - mIsDropEntering = false; - mSkipEvictingMainStageChildren = false; - } else { - mShowDecorImmediately = true; - mSplitLayout.flingDividerToCenter(/*finishCallback*/ null); - } - }); - } - if (mMainStage.mHasChildren && mSideStage.mHasChildren) { - mShouldUpdateRecents = true; - clearRequestIfPresented(); - updateRecentTasksSplitPair(); - - if (!mLogger.hasStartedSession() && !mLogger.hasValidEnterSessionId()) { - mLogger.enterRequested(null /*enterSessionId*/, ENTER_REASON_MULTI_INSTANCE); - } - mLogger.logEnter(mSplitLayout.getDividerPositionAsFraction(), - getMainStagePosition(), mMainStage.getTopChildTaskUid(), - getSideStagePosition(), mSideStage.getTopChildTaskUid(), - mSplitLayout.isLeftRightSplit()); - } - } - @Override public void onNoLongerSupportMultiWindow(StageTaskListener stageTaskListener, ActivityManager.RunningTaskInfo taskInfo) { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java index ae4bd1615ae1..0fa3204eca63 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageTaskListener.java @@ -75,8 +75,6 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { public interface StageListenerCallbacks { void onRootTaskAppeared(); - void onStageHasChildrenChanged(StageTaskListener stageTaskListener); - void onStageVisibilityChanged(StageTaskListener stageTaskListener); void onChildTaskStatusChanged(StageTaskListener stage, int taskId, boolean present, @@ -207,7 +205,10 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { mIconProvider); mHasRootTask = true; mCallbacks.onRootTaskAppeared(); - sendStatusChanged(); + if (mVisible != mRootTaskInfo.isVisible) { + mVisible = mRootTaskInfo.isVisible; + mCallbacks.onStageVisibilityChanged(this); + } mSyncQueue.runInSync(t -> mDimLayer = SurfaceUtils.makeDimLayer(t, mRootLeash, "Dim layer")); } else if (taskInfo.parentTaskId == mRootTaskInfo.taskId) { @@ -497,22 +498,6 @@ public class StageTaskListener implements ShellTaskOrganizer.TaskListener { return true; } - private void sendStatusChanged() { - boolean hasChildren = mChildrenTaskInfo.size() > 0; - boolean visible = mRootTaskInfo.isVisible; - if (!mHasRootTask) return; - - if (mHasChildren != hasChildren) { - mHasChildren = hasChildren; - mCallbacks.onStageHasChildrenChanged(this); - } - - if (mVisible != visible) { - mVisible = visible; - mCallbacks.onStageVisibilityChanged(this); - } - } - @Override @CallSuper public void dump(@NonNull PrintWriter pw, String prefix) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java index 189684dc391a..7144a1e038f9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageTaskListenerTests.java @@ -114,7 +114,6 @@ public final class StageTaskListenerTests extends ShellTestCase { public void testRootTaskAppeared() { assertThat(mStageTaskListener.mRootTaskInfo.taskId).isEqualTo(mRootTask.taskId); verify(mCallbacks).onRootTaskAppeared(); - verify(mCallbacks, never()).onStageHasChildrenChanged(mStageTaskListener); verify(mCallbacks, never()).onStageVisibilityChanged(mStageTaskListener); } -- GitLab From f2f2d2ae66cf198d5013ebce2720ab7c9d3ee679 Mon Sep 17 00:00:00 2001 From: Mark Renouf Date: Tue, 15 Oct 2024 11:24:27 -0400 Subject: [PATCH 146/459] Dead code: the original screenshot policy code This has been replaced by the new code in the 'policy' sub-package (Last usage of this code was deleted in ag/29070486) Flag: NONE dead code removal Test: None Change-Id: Id70d7dfb4e6769acaee448d5cef3459479986eb2 --- .../screenshot/FakeScreenshotPolicy.kt | 40 ---- .../systemui/screenshot/ScreenshotPolicy.kt | 51 ----- .../screenshot/ScreenshotPolicyImpl.kt | 189 ----------------- .../screenshot/dagger/ScreenshotModule.java | 5 - .../screenshot/ScreenshotPolicyImplTest.kt | 200 ------------------ 5 files changed, 485 deletions(-) delete mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/FakeScreenshotPolicy.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicy.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt delete mode 100644 packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/FakeScreenshotPolicy.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/FakeScreenshotPolicy.kt deleted file mode 100644 index 28d53c72640f..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/FakeScreenshotPolicy.kt +++ /dev/null @@ -1,40 +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.screenshot - -import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo - -internal class FakeScreenshotPolicy : ScreenshotPolicy { - - private val userTypes = mutableMapOf() - private val contentInfo = mutableMapOf() - - fun setManagedProfile(userId: Int, managedUser: Boolean) { - userTypes[userId] = managedUser - } - override suspend fun isManagedProfile(userId: Int): Boolean { - return userTypes[userId] ?: error("No managedProfile value set for userId $userId") - } - - fun setDisplayContentInfo(userId: Int, contentInfo: DisplayContentInfo) { - this.contentInfo[userId] = contentInfo - } - - override suspend fun findPrimaryContent(displayId: Int): DisplayContentInfo { - return contentInfo[displayId] ?: error("No DisplayContentInfo set for displayId $displayId") - } -} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicy.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicy.kt deleted file mode 100644 index f73d2041af95..000000000000 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicy.kt +++ /dev/null @@ -1,51 +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.screenshot - -import android.annotation.UserIdInt -import android.content.ComponentName -import android.graphics.Rect -import android.os.UserHandle -import android.view.Display - -/** - * Provides policy decision-making information to screenshot request handling. - */ -interface ScreenshotPolicy { - - /** @return true if the user is a managed profile (a.k.a. work profile) */ - suspend fun isManagedProfile(@UserIdInt userId: Int): Boolean - - /** - * Requests information about the owner of display content which occupies a majority of the - * screenshot and/or has most recently been interacted with at the time the screenshot was - * requested. - * - * @param displayId the id of the display to inspect - * @return content info for the primary content on the display - */ - suspend fun findPrimaryContent(displayId: Int): DisplayContentInfo - - data class DisplayContentInfo( - val component: ComponentName, - val bounds: Rect, - val user: UserHandle, - val taskId: Int, - ) - - fun getDefaultDisplayId(): Int = Display.DEFAULT_DISPLAY -} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt deleted file mode 100644 index 21a73100da06..000000000000 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotPolicyImpl.kt +++ /dev/null @@ -1,189 +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.screenshot - -import android.annotation.UserIdInt -import android.app.ActivityTaskManager -import android.app.ActivityTaskManager.RootTaskInfo -import android.app.IActivityTaskManager -import android.app.WindowConfiguration -import android.app.WindowConfiguration.activityTypeToString -import android.app.WindowConfiguration.windowingModeToString -import android.content.ComponentName -import android.content.Context -import android.content.Intent -import android.graphics.Rect -import android.os.Process -import android.os.RemoteException -import android.os.UserHandle -import android.os.UserManager -import android.util.Log -import com.android.internal.annotations.VisibleForTesting -import com.android.internal.infra.ServiceConnector -import com.android.systemui.SystemUIService -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.settings.DisplayTracker -import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo -import java.util.Arrays -import javax.inject.Inject -import kotlin.coroutines.resume -import kotlin.coroutines.suspendCoroutine -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.withContext - -@SysUISingleton -internal open class ScreenshotPolicyImpl @Inject constructor( - context: Context, - private val userMgr: UserManager, - private val atmService: IActivityTaskManager, - @Background val bgDispatcher: CoroutineDispatcher, - private val displayTracker: DisplayTracker -) : ScreenshotPolicy { - - private val proxyConnector: ServiceConnector = - ServiceConnector.Impl( - context, - Intent(context, ScreenshotProxyService::class.java), - Context.BIND_AUTO_CREATE or Context.BIND_WAIVE_PRIORITY or Context.BIND_NOT_VISIBLE, - context.userId, - IScreenshotProxy.Stub::asInterface - ) - - override fun getDefaultDisplayId(): Int { - return displayTracker.defaultDisplayId - } - - override suspend fun isManagedProfile(@UserIdInt userId: Int): Boolean { - val managed = withContext(bgDispatcher) { userMgr.isManagedProfile(userId) } - Log.d(TAG, "isManagedProfile: $managed") - return managed - } - - private fun nonPipVisibleTask(info: RootTaskInfo): Boolean { - if (DEBUG) { - debugLogRootTaskInfo(info) - } - return info.windowingMode != WindowConfiguration.WINDOWING_MODE_PINNED && - info.isVisible && - info.isRunning && - info.numActivities > 0 && - info.topActivity != null && - info.childTaskIds.isNotEmpty() - } - - /** - * Uses RootTaskInfo from ActivityTaskManager to guess at the primary focused task within a - * display. If no task is visible or the top task is covered by a system window, the info - * reported will reference a SystemUI component instead. - */ - override suspend fun findPrimaryContent(displayId: Int): DisplayContentInfo { - // Determine if the notification shade is expanded. If so, task windows are not - // visible behind it, so the screenshot should instead be associated with SystemUI. - if (isNotificationShadeExpanded()) { - return systemUiContent - } - - val taskInfoList = getAllRootTaskInfosOnDisplay(displayId) - - // If no visible task is located, then report SystemUI as the foreground content - val target = taskInfoList.firstOrNull(::nonPipVisibleTask) ?: return systemUiContent - return target.toDisplayContentInfo() - } - - private fun debugLogRootTaskInfo(info: RootTaskInfo) { - Log.d(TAG, "RootTaskInfo={" + - "taskId=${info.taskId} " + - "parentTaskId=${info.parentTaskId} " + - "position=${info.position} " + - "positionInParent=${info.positionInParent} " + - "isVisible=${info.isVisible()} " + - "visible=${info.visible} " + - "isFocused=${info.isFocused} " + - "isSleeping=${info.isSleeping} " + - "isRunning=${info.isRunning} " + - "windowMode=${windowingModeToString(info.windowingMode)} " + - "activityType=${activityTypeToString(info.activityType)} " + - "topActivity=${info.topActivity} " + - "topActivityInfo=${info.topActivityInfo} " + - "numActivities=${info.numActivities} " + - "childTaskIds=${Arrays.toString(info.childTaskIds)} " + - "childUserIds=${Arrays.toString(info.childTaskUserIds)} " + - "childTaskBounds=${Arrays.toString(info.childTaskBounds)} " + - "childTaskNames=${Arrays.toString(info.childTaskNames)}" + - "}" - ) - - for (j in 0 until info.childTaskIds.size) { - Log.d(TAG, " *** [$j] ******") - Log.d(TAG, " *** childTaskIds[$j]: ${info.childTaskIds[j]}") - Log.d(TAG, " *** childTaskUserIds[$j]: ${info.childTaskUserIds[j]}") - Log.d(TAG, " *** childTaskBounds[$j]: ${info.childTaskBounds[j]}") - Log.d(TAG, " *** childTaskNames[$j]: ${info.childTaskNames[j]}") - } - } - - @VisibleForTesting - open suspend fun getAllRootTaskInfosOnDisplay(displayId: Int): List = - withContext(bgDispatcher) { - try { - atmService.getAllRootTaskInfosOnDisplay(displayId) - } catch (e: RemoteException) { - Log.e(TAG, "getAllRootTaskInfosOnDisplay", e) - listOf() - } - } - - @VisibleForTesting - open suspend fun isNotificationShadeExpanded(): Boolean = suspendCoroutine { k -> - proxyConnector - .postForResult { it.isNotificationShadeExpanded } - .whenComplete { expanded, error -> - if (error != null) { - Log.e(TAG, "isNotificationShadeExpanded", error) - } - k.resume(expanded ?: false) - } - } - - @VisibleForTesting - internal val systemUiContent = - DisplayContentInfo( - ComponentName(context, SystemUIService::class.java), - Rect(), - Process.myUserHandle(), - ActivityTaskManager.INVALID_TASK_ID - ) -} - -private const val TAG: String = "ScreenshotPolicyImpl" -private const val DEBUG: Boolean = false - -@VisibleForTesting -internal fun RootTaskInfo.toDisplayContentInfo(): DisplayContentInfo { - val topActivity: ComponentName = topActivity ?: error("should not be null") - val topChildTask = childTaskIds.size - 1 - val childTaskId = childTaskIds[topChildTask] - val childTaskUserId = childTaskUserIds[topChildTask] - val childTaskBounds = childTaskBounds[topChildTask] - - return DisplayContentInfo( - topActivity, - childTaskBounds, - UserHandle.of(childTaskUserId), - childTaskId) -} diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java index 254dde45148c..90695fa00ceb 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java +++ b/packages/SystemUI/src/com/android/systemui/screenshot/dagger/ScreenshotModule.java @@ -27,8 +27,6 @@ import com.android.systemui.screenshot.ImageCaptureImpl; import com.android.systemui.screenshot.InteractiveScreenshotHandler; import com.android.systemui.screenshot.LegacyScreenshotController; import com.android.systemui.screenshot.ScreenshotController; -import com.android.systemui.screenshot.ScreenshotPolicy; -import com.android.systemui.screenshot.ScreenshotPolicyImpl; import com.android.systemui.screenshot.ScreenshotSoundController; import com.android.systemui.screenshot.ScreenshotSoundControllerImpl; import com.android.systemui.screenshot.ScreenshotSoundProvider; @@ -65,9 +63,6 @@ public abstract class ScreenshotModule { abstract TakeScreenshotExecutor bindTakeScreenshotExecutor( TakeScreenshotExecutorImpl impl); - @Binds - abstract ScreenshotPolicy bindScreenshotPolicyImpl(ScreenshotPolicyImpl impl); - @Binds abstract ImageCapture bindImageCaptureImpl(ImageCaptureImpl capture); diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt deleted file mode 100644 index 3756ec14503c..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/screenshot/ScreenshotPolicyImplTest.kt +++ /dev/null @@ -1,200 +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.screenshot - -import android.app.ActivityTaskManager.RootTaskInfo -import android.app.IActivityTaskManager -import android.content.ComponentName -import android.content.Context -import android.graphics.Rect -import android.os.UserHandle -import android.os.UserManager -import android.testing.AndroidTestingRunner -import com.android.systemui.SysuiTestCase -import com.android.systemui.screenshot.ScreenshotPolicy.DisplayContentInfo -import com.android.systemui.screenshot.policy.ActivityType.Home -import com.android.systemui.screenshot.policy.ActivityType.Undefined -import com.android.systemui.screenshot.policy.WindowingMode.FullScreen -import com.android.systemui.screenshot.policy.WindowingMode.PictureInPicture -import com.android.systemui.screenshot.policy.newChildTask -import com.android.systemui.screenshot.policy.newRootTaskInfo -import com.android.systemui.settings.FakeDisplayTracker -import com.android.systemui.util.mockito.mock -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.runBlocking -import org.junit.Test -import org.junit.runner.RunWith - -// The following values are chosen to be distinct from commonly seen real values -private const val DISPLAY_ID = 100 -private const val PRIMARY_USER = 2000 -private const val MANAGED_PROFILE_USER = 3000 - -@RunWith(AndroidTestingRunner::class) -class ScreenshotPolicyImplTest : SysuiTestCase() { - - @Test - fun testToDisplayContentInfo() { - assertThat(fullScreenWorkProfileTask.toDisplayContentInfo()) - .isEqualTo( - DisplayContentInfo( - ComponentName( - "com.google.android.apps.nbu.files", - "com.google.android.apps.nbu.files.home.HomeActivity" - ), - Rect(0, 0, 1080, 2400), - UserHandle.of(MANAGED_PROFILE_USER), - 65 - ) - ) - } - - @Test - fun findPrimaryContent_ignoresPipTask() = runBlocking { - val policy = - fakeTasksPolicyImpl( - mContext, - shadeExpanded = false, - tasks = listOf(pipTask, fullScreenWorkProfileTask, launcherTask, emptyTask) - ) - - val info = policy.findPrimaryContent(DISPLAY_ID) - assertThat(info).isEqualTo(fullScreenWorkProfileTask.toDisplayContentInfo()) - } - - @Test - fun findPrimaryContent_shadeExpanded_ignoresTopTask() = runBlocking { - val policy = - fakeTasksPolicyImpl( - mContext, - shadeExpanded = true, - tasks = listOf(fullScreenWorkProfileTask, launcherTask, emptyTask) - ) - - val info = policy.findPrimaryContent(DISPLAY_ID) - assertThat(info).isEqualTo(policy.systemUiContent) - } - - @Test - fun findPrimaryContent_emptyTaskList() = runBlocking { - val policy = fakeTasksPolicyImpl(mContext, shadeExpanded = false, tasks = listOf()) - - val info = policy.findPrimaryContent(DISPLAY_ID) - assertThat(info).isEqualTo(policy.systemUiContent) - } - - @Test - fun findPrimaryContent_workProfileNotOnTop() = runBlocking { - val policy = - fakeTasksPolicyImpl( - mContext, - shadeExpanded = false, - tasks = listOf(launcherTask, fullScreenWorkProfileTask, emptyTask) - ) - - val info = policy.findPrimaryContent(DISPLAY_ID) - assertThat(info).isEqualTo(launcherTask.toDisplayContentInfo()) - } - - private fun fakeTasksPolicyImpl( - context: Context, - shadeExpanded: Boolean, - tasks: List - ): ScreenshotPolicyImpl { - val userManager = mock() - val atmService = mock() - val dispatcher = Dispatchers.Unconfined - val displayTracker = FakeDisplayTracker(context) - - return object : - ScreenshotPolicyImpl(context, userManager, atmService, dispatcher, displayTracker) { - override suspend fun isManagedProfile(userId: Int) = (userId == MANAGED_PROFILE_USER) - override suspend fun getAllRootTaskInfosOnDisplay(displayId: Int) = tasks - override suspend fun isNotificationShadeExpanded() = shadeExpanded - } - } - - private val pipTask = - newRootTaskInfo( - taskId = 66, - userId = PRIMARY_USER, - displayId = DISPLAY_ID, - bounds = Rect(628, 1885, 1038, 2295), - windowingMode = PictureInPicture, - topActivity = ComponentName.unflattenFromString(YOUTUBE_PIP_ACTIVITY), - ) { - listOf(newChildTask(taskId = 66, userId = 0, name = YOUTUBE_HOME_ACTIVITY)) - } - - private val fullScreenWorkProfileTask = - newRootTaskInfo( - taskId = 65, - userId = MANAGED_PROFILE_USER, - displayId = DISPLAY_ID, - bounds = Rect(0, 0, 1080, 2400), - windowingMode = FullScreen, - topActivity = ComponentName.unflattenFromString(FILES_HOME_ACTIVITY), - ) { - listOf( - newChildTask(taskId = 65, userId = MANAGED_PROFILE_USER, name = FILES_HOME_ACTIVITY) - ) - } - private val launcherTask = - newRootTaskInfo( - taskId = 1, - userId = PRIMARY_USER, - displayId = DISPLAY_ID, - activityType = Home, - windowingMode = FullScreen, - bounds = Rect(0, 0, 1080, 2400), - topActivity = ComponentName.unflattenFromString(LAUNCHER_ACTIVITY), - ) { - listOf(newChildTask(taskId = 1, userId = 0, name = LAUNCHER_ACTIVITY)) - } - - private val emptyTask = - newRootTaskInfo( - taskId = 2, - userId = PRIMARY_USER, - displayId = DISPLAY_ID, - visible = false, - running = false, - numActivities = 0, - activityType = Undefined, - bounds = Rect(0, 0, 1080, 2400), - ) { - listOf( - newChildTask(taskId = 3, name = ""), - newChildTask(taskId = 4, name = ""), - ) - } -} - -private const val YOUTUBE_HOME_ACTIVITY = - "com.google.android.youtube/" + "com.google.android.youtube.app.honeycomb.Shell\$HomeActivity" - -private const val FILES_HOME_ACTIVITY = - "com.google.android.apps.nbu.files/" + "com.google.android.apps.nbu.files.home.HomeActivity" - -private const val YOUTUBE_PIP_ACTIVITY = - "com.google.android.youtube/" + - "com.google.android.apps.youtube.app.watchwhile.WatchWhileActivity" - -private const val LAUNCHER_ACTIVITY = - "com.google.android.apps.nexuslauncher/" + - "com.google.android.apps.nexuslauncher.NexusLauncherActivity" -- GitLab From efbd51b13090b04ea02db6f7ba1745ef8f3af3d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Ad=C3=A1mek?= Date: Wed, 21 Aug 2024 13:09:17 +0000 Subject: [PATCH 147/459] Add more info to search_all_entrypoints_enabled comment Flag: DOCS_ONLY Change-Id: I29699b14a62979d58cfb4081d7b7237a4568afed --- core/java/android/provider/Settings.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 85d23259ffbb..5042a09add32 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -11254,7 +11254,8 @@ public final class Settings { "assist_long_press_home_enabled"; /** - * Whether all entrypoints can trigger search. Replaces individual settings. + * Whether all entrypoints (e.g. long-press home, long-press nav handle) + * can trigger contextual search. * * @hide */ -- GitLab From c044abcbbd39b50c2d69cc300b0c37d6e5751826 Mon Sep 17 00:00:00 2001 From: Jerome Gaillard Date: Mon, 21 Oct 2024 19:32:25 +0100 Subject: [PATCH 148/459] Do not use AIDL Dataspace in Color.cpp Instead this uses the "HAL_DATASPACE" version of DISPLAY_BT2020 which is available on all platforms and avoids the need to add custom code for host builds. Flag: com.android.graphics.flags.display_bt2020_colorspace Bug: 74062470 Test: m libhwui on host Change-Id: I664992395ab1d9985b4fbe0867f1535503868e4c --- libs/hwui/utils/Color.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/libs/hwui/utils/Color.cpp b/libs/hwui/utils/Color.cpp index 23097f634464..c7a7ed2a885e 100644 --- a/libs/hwui/utils/Color.cpp +++ b/libs/hwui/utils/Color.cpp @@ -17,7 +17,6 @@ #include "Color.h" #include -#include #include #include #include @@ -222,8 +221,7 @@ android_dataspace ColorSpaceToADataSpace(SkColorSpace* colorSpace, SkColorType c if (nearlyEqual(fn, SkNamedTransferFn::kRec2020)) { return HAL_DATASPACE_BT2020; } else if (nearlyEqual(fn, SkNamedTransferFn::kSRGB)) { - return static_cast( - ::aidl::android::hardware::graphics::common::Dataspace::DISPLAY_BT2020); + return static_cast(HAL_DATASPACE_DISPLAY_BT2020); } } -- GitLab From 607c11ae6994967458a36b6732569d89fb045a38 Mon Sep 17 00:00:00 2001 From: Alexander Roederer Date: Mon, 21 Oct 2024 19:00:11 +0000 Subject: [PATCH 149/459] Adds flag for UI changes in bundles/classification Currently the notification bundles/classification flag is guarding new API that needs to be rolled out in advance of UI changes, so we create a new flag to guard the UI changes separately. Bug: 374791469 Test: EXEMPT new flag def Flag: android.app.notification_classification_ui Change-Id: Ic34121ac33560521312d73853eda6220fa9d05e9 --- core/java/android/app/notification.aconfig | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/notification.aconfig b/core/java/android/app/notification.aconfig index 37fa9a26b91c..1d4c18f6a62c 100644 --- a/core/java/android/app/notification.aconfig +++ b/core/java/android/app/notification.aconfig @@ -286,4 +286,11 @@ flag { namespace: "systemui" description: "Adds logging for notification/modes backup and restore events" bug: "289524803" -} \ No newline at end of file +} + +flag { + name: "notification_classification_ui" + namespace: "systemui" + description: "Adds UI for NAS classification of notifications" + bug: "367996732" +} -- GitLab From 81e9af8e58af85dc0cbfd86c2e992f8c6dcb0581 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Mon, 21 Oct 2024 18:52:37 +0000 Subject: [PATCH 150/459] Fix first battery message on boot The default battery level was being set to 100 and then displayed to the user. The correct battery level is received as a broadcast, so initialize to an invalid value and wait for the first broadcast to come. Fixes: 353636704 Test: atest KeyguardIndicationControllerTest Flag: EXEMPT bugfix Change-Id: I3c8e85d8d02652253a3895edda28ec4f198e532e --- .../keyguard/KeyguardUpdateMonitor.java | 2 +- .../KeyguardIndicationController.java | 8 ++++++-- .../KeyguardIndicationControllerTest.java | 20 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 83ab5245bc31..b3ea75d00917 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -2368,7 +2368,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener, Dumpab } // Take a guess at initial SIM state, battery status and PLMN until we get an update - mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, /* level= */ 100, /* plugged= */ + mBatteryStatus = new BatteryStatus(BATTERY_STATUS_UNKNOWN, /* level= */ -1, /* plugged= */ 0, CHARGING_POLICY_DEFAULT, /* maxChargingWattage= */0, /* present= */true); // Watch for interesting updates diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java index f99d8f140670..520cbf9d80d9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/KeyguardIndicationController.java @@ -214,7 +214,7 @@ public class KeyguardIndicationController { private boolean mEnableBatteryDefender; private boolean mIncompatibleCharger; private int mChargingWattage; - private int mBatteryLevel; + private int mBatteryLevel = -1; private boolean mBatteryPresent = true; protected long mChargingTimeRemaining; private Pair mBiometricErrorMessageToShowOnScreenOn; @@ -1032,12 +1032,16 @@ public class KeyguardIndicationController { } else if (!TextUtils.isEmpty(mTransientIndication)) { newIndication = mTransientIndication; } else if (!mBatteryPresent) { - // If there is no battery detected, hide the indication and bail + // If there is no battery detected, hide the indication area and bail mIndicationArea.setVisibility(GONE); return; } else if (!TextUtils.isEmpty(mAlignmentIndication)) { useMisalignmentColor = true; newIndication = mAlignmentIndication; + } else if (mBatteryLevel == -1) { + // If the battery level is not initialized, hide the indication area + mIndicationArea.setVisibility(GONE); + return; } else if (mPowerPluggedIn || mEnableBatteryDefender) { newIndication = computePowerIndication(); } else { diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java index a75d7b23a92c..da0029ff6746 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerTest.java @@ -21,6 +21,8 @@ import static android.content.pm.UserInfo.FLAG_MANAGED_PROFILE; import static android.hardware.biometrics.BiometricFaceConstants.FACE_ACQUIRED_TOO_DARK; import static android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_LOCKOUT_PERMANENT; import static android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_TIMEOUT; +import static android.view.View.GONE; +import static android.view.View.VISIBLE; import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_AVAILABLE; import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED; @@ -776,6 +778,24 @@ public class KeyguardIndicationControllerTest extends KeyguardIndicationControll mContext.getString(R.string.keyguard_suggest_fingerprint)); } + @Test + public void indicationAreaHidden_untilBatteryInfoArrives() { + createController(); + // level of -1 indicates missing info + BatteryStatus status = new BatteryStatus(BatteryManager.BATTERY_STATUS_UNKNOWN, + -1 /* level */, BatteryManager.BATTERY_PLUGGED_WIRELESS, 100 /* health */, + 0 /* maxChargingWattage */, true /* present */); + + mController.setVisible(true); + mStatusBarStateListener.onDozingChanged(true); + reset(mIndicationArea); + + mController.getKeyguardCallback().onRefreshBatteryInfo(status); + // VISIBLE is always called first + verify(mIndicationArea).setVisibility(VISIBLE); + verify(mIndicationArea).setVisibility(GONE); + } + @Test public void onRefreshBatteryInfo_computesChargingTime() throws RemoteException { createController(); -- GitLab From 87f8c6c6423451a0cb17911fbd523e8b0528720a Mon Sep 17 00:00:00 2001 From: Kenneth Ford Date: Wed, 16 Oct 2024 18:20:33 +0000 Subject: [PATCH 151/459] Update WindowAreaComponentImpl to use updated DeviceStateManager API Flag: android.hardware.devicestate.feature.flags.device_state_property_migration Bug: 336640888 Test: ExtensionRearDisplayTest Test: ExtensionRearDisplayPresentationTest Change-Id: I6af59af96efd194d7480a159bb46a14282c0b9fb --- .../area/WindowAreaComponentImpl.java | 99 ++++++++++++------- 1 file changed, 66 insertions(+), 33 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/area/WindowAreaComponentImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/area/WindowAreaComponentImpl.java index a3d2d7f4dcdf..438532725686 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/area/WindowAreaComponentImpl.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/area/WindowAreaComponentImpl.java @@ -16,6 +16,10 @@ package androidx.window.extensions.area; +import static android.hardware.devicestate.DeviceState.PROPERTY_FEATURE_DUAL_DISPLAY_INTERNAL_DEFAULT; +import static android.hardware.devicestate.DeviceState.PROPERTY_FEATURE_REAR_DISPLAY; +import static android.hardware.devicestate.DeviceState.PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY; +import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE; import static android.hardware.devicestate.DeviceStateManager.INVALID_DEVICE_STATE_IDENTIFIER; import android.app.Activity; @@ -23,6 +27,7 @@ import android.content.Context; import android.hardware.devicestate.DeviceState; import android.hardware.devicestate.DeviceStateManager; import android.hardware.devicestate.DeviceStateRequest; +import android.hardware.devicestate.feature.flags.Flags; import android.hardware.display.DisplayManager; import android.util.ArraySet; import android.util.DisplayMetrics; @@ -72,18 +77,18 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, @GuardedBy("mLock") private final ArraySet> mRearDisplayPresentationStatusListeners = new ArraySet<>(); - private final int mRearDisplayState; + private int mRearDisplayState = INVALID_DEVICE_STATE_IDENTIFIER; private final int mConcurrentDisplayState; @NonNull - private final int[] mFoldedDeviceStates; + private int[] mFoldedDeviceStates = new int[0]; private long mRearDisplayAddress = INVALID_DISPLAY_ADDRESS; @WindowAreaSessionState private int mRearDisplaySessionStatus = WindowAreaComponent.SESSION_STATE_INACTIVE; @GuardedBy("mLock") - private int mCurrentDeviceState = INVALID_DEVICE_STATE_IDENTIFIER; + private DeviceState mCurrentDeviceState = INVALID_DEVICE_STATE; @GuardedBy("mLock") - private int[] mCurrentSupportedDeviceStates; + private List mCurrentSupportedDeviceStates; @GuardedBy("mLock") private DeviceStateRequest mRearDisplayStateRequest; @@ -103,16 +108,25 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, mDisplayManager = context.getSystemService(DisplayManager.class); mExecutor = context.getMainExecutor(); - // TODO(b/329436166): Update the usage of device state manager API's - mCurrentSupportedDeviceStates = getSupportedStateIdentifiers( - mDeviceStateManager.getSupportedDeviceStates()); - mFoldedDeviceStates = context.getResources().getIntArray( - R.array.config_foldedDeviceStates); + mCurrentSupportedDeviceStates = mDeviceStateManager.getSupportedDeviceStates(); - // TODO(b/236022708) Move rear display state to device state config file - mRearDisplayState = context.getResources().getInteger( - R.integer.config_deviceStateRearDisplay); + if (Flags.deviceStatePropertyMigration()) { + for (int i = 0; i < mCurrentSupportedDeviceStates.size(); i++) { + DeviceState state = mCurrentSupportedDeviceStates.get(i); + if (state.hasProperty(PROPERTY_FEATURE_REAR_DISPLAY)) { + mRearDisplayState = state.getIdentifier(); + break; + } + } + } else { + mFoldedDeviceStates = context.getResources().getIntArray( + R.array.config_foldedDeviceStates); + // TODO(b/236022708) Move rear display state to device state config file + mRearDisplayState = context.getResources().getInteger( + R.integer.config_deviceStateRearDisplay); + } + // TODO(b/374351956) Use DeviceState API when the dual display state is always returned mConcurrentDisplayState = context.getResources().getInteger( R.integer.config_deviceStateConcurrentRearDisplay); @@ -147,7 +161,7 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, mRearDisplayStatusListeners.add(consumer); // If current device state is still invalid, the initial value has not been provided. - if (mCurrentDeviceState == INVALID_DEVICE_STATE_IDENTIFIER) { + if (mCurrentDeviceState.getIdentifier() == INVALID_DEVICE_STATE_IDENTIFIER) { return; } consumer.accept(getCurrentRearDisplayModeStatus()); @@ -312,7 +326,7 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, mRearDisplayPresentationStatusListeners.add(consumer); // If current device state is still invalid, the initial value has not been provided - if (mCurrentDeviceState == INVALID_DEVICE_STATE_IDENTIFIER) { + if (mCurrentDeviceState.getIdentifier() == INVALID_DEVICE_STATE_IDENTIFIER) { return; } @WindowAreaStatus int currentStatus = getCurrentRearDisplayPresentationModeStatus(); @@ -452,8 +466,7 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, @Override public void onSupportedStatesChanged(@NonNull List supportedStates) { synchronized (mLock) { - // TODO(b/329436166): Update the usage of device state manager API's - mCurrentSupportedDeviceStates = getSupportedStateIdentifiers(supportedStates); + mCurrentSupportedDeviceStates = supportedStates; updateRearDisplayStatusListeners(getCurrentRearDisplayModeStatus()); updateRearDisplayPresentationStatusListeners( getCurrentRearDisplayPresentationModeStatus()); @@ -463,8 +476,7 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, @Override public void onDeviceStateChanged(@NonNull DeviceState state) { synchronized (mLock) { - // TODO(b/329436166): Update the usage of device state manager API's - mCurrentDeviceState = state.getIdentifier(); + mCurrentDeviceState = state; updateRearDisplayStatusListeners(getCurrentRearDisplayModeStatus()); updateRearDisplayPresentationStatusListeners( getCurrentRearDisplayPresentationModeStatus()); @@ -477,7 +489,8 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, return WindowAreaComponent.STATUS_UNSUPPORTED; } - if (!ArrayUtils.contains(mCurrentSupportedDeviceStates, mRearDisplayState)) { + if (!deviceStateListContainsIdentifier(mCurrentSupportedDeviceStates, + mRearDisplayState)) { return WindowAreaComponent.STATUS_UNAVAILABLE; } @@ -488,15 +501,6 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, return WindowAreaComponent.STATUS_AVAILABLE; } - // TODO(b/329436166): Remove and update the usage of device state manager API's - private int[] getSupportedStateIdentifiers(@NonNull List states) { - int[] identifiers = new int[states.size()]; - for (int i = 0; i < states.size(); i++) { - identifiers[i] = states.get(i).getIdentifier(); - } - return identifiers; - } - /** * Helper method to determine if a rear display session is currently active by checking * if the current device state is that which corresponds to {@code mRearDisplayState}. @@ -505,7 +509,31 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, */ @GuardedBy("mLock") private boolean isRearDisplayActive() { - return mCurrentDeviceState == mRearDisplayState; + if (Flags.deviceStatePropertyApi()) { + return mCurrentDeviceState.hasProperty(PROPERTY_FEATURE_REAR_DISPLAY); + } else { + return mCurrentDeviceState.getIdentifier() == mRearDisplayState; + } + } + + @GuardedBy("mLock") + private boolean isRearDisplayPresentationModeActive() { + if (Flags.deviceStatePropertyApi()) { + return mCurrentDeviceState.hasProperty(PROPERTY_FEATURE_DUAL_DISPLAY_INTERNAL_DEFAULT); + } else { + return mCurrentDeviceState.getIdentifier() == mConcurrentDisplayState; + } + } + + @GuardedBy("mLock") + private boolean deviceStateListContainsIdentifier(List deviceStates, + int identifier) { + for (int i = 0; i < deviceStates.size(); i++) { + if (deviceStates.get(i).getIdentifier() == identifier) { + return true; + } + } + return false; } @GuardedBy("mLock") @@ -526,12 +554,12 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, return WindowAreaComponent.STATUS_UNSUPPORTED; } - if (mCurrentDeviceState == mConcurrentDisplayState) { + if (isRearDisplayPresentationModeActive()) { return WindowAreaComponent.STATUS_ACTIVE; } - if (!ArrayUtils.contains(mCurrentSupportedDeviceStates, mConcurrentDisplayState) - || isDeviceFolded()) { + if (!deviceStateListContainsIdentifier(mCurrentSupportedDeviceStates, + mConcurrentDisplayState) || isDeviceFolded()) { return WindowAreaComponent.STATUS_UNAVAILABLE; } return WindowAreaComponent.STATUS_AVAILABLE; @@ -539,7 +567,12 @@ public class WindowAreaComponentImpl implements WindowAreaComponent, @GuardedBy("mLock") private boolean isDeviceFolded() { - return ArrayUtils.contains(mFoldedDeviceStates, mCurrentDeviceState); + if (Flags.deviceStatePropertyApi()) { + return mCurrentDeviceState.hasProperty( + PROPERTY_FOLDABLE_DISPLAY_CONFIGURATION_OUTER_PRIMARY); + } else { + return ArrayUtils.contains(mFoldedDeviceStates, mCurrentDeviceState.getIdentifier()); + } } @GuardedBy("mLock") -- GitLab From 9de2b9d7f6ad450712e41a2d9c30688bc3cc3f2f Mon Sep 17 00:00:00 2001 From: David Saff Date: Mon, 21 Oct 2024 15:44:19 -0400 Subject: [PATCH 152/459] Skip ScrollCaptureControllerTest on robolectric Bug: 373930957 Test: run locally Flag: TEST_ONLY Change-Id: I0ad1e4b565ddaae5566602ae0d60159511dc228c --- .../screenshot/scroll/ScrollCaptureControllerTest.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/scroll/ScrollCaptureControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/scroll/ScrollCaptureControllerTest.java index f8de714c6021..a831e6344a66 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/scroll/ScrollCaptureControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/scroll/ScrollCaptureControllerTest.java @@ -38,6 +38,8 @@ import com.android.internal.logging.testing.UiEventLoggerFake; import com.android.systemui.SysuiTestCase; import com.android.systemui.screenshot.scroll.ScrollCaptureClient.Session; +import org.junit.Assume; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -49,6 +51,12 @@ import org.junit.runner.RunWith; @RunWith(AndroidJUnit4.class) public class ScrollCaptureControllerTest extends SysuiTestCase { + @Before + public void assumeOnDevice() { + // TODO(b/373930957) this class hangs under robolectric + Assume.assumeFalse(isRobolectricTest()); + } + private static final ScrollCaptureResponse EMPTY_RESPONSE = new ScrollCaptureResponse.Builder().build(); -- GitLab From bd34b1b50af63f364c65d118a06acecb035e9f62 Mon Sep 17 00:00:00 2001 From: Jeremy Sim Date: Fri, 18 Oct 2024 15:42:47 -0700 Subject: [PATCH 153/459] Fix bug where splitscreen causes unlaunchable camera This CL changes the way split is dismissed when folding and locking. Camera launch was broken in two ways: 1) Previously, we checked for occluding apps in onKeyguardStateChanged to determine if we had a SHOW_ABOVE_LOCKED case or not. However, this signal was not exact, and was catching a case where the camera is launched using the power button double-tap feature. Since Camera has the SHOW_ABOVE_LOCKED flag, this was erroneously triggering the "break split" case, breaking split, and preventing the camera from launching (even when Camera had nothing to do with the split pair). Now, we perform the check instead of StageCoordinator.startAnimation, where we can see more clearly which split apps are being sent TO_BACK or not. If not all the split apps are being sent to back in the same transition, we assume we are in a SHOW_ABOVE_LOCKED case, and break split there. 2) Previously, on device fold, we would check for a wake signal and use it to break split (due to UX-specified behavior that split should break on fold + lock + wake). This was being done in onFinishedWakingUp(), which inadvertently clobbered the Camera launch when the Camera was the wake trigger. Now we perform the same behavior, but onStartedWakingUp() instead, which happens slightly earlier and does not clobber the Camera. Fixes: 373477295 Test: Repro steps do not repro anymore Flag: EXEMPT bugfix Change-Id: I49b3b104c10cc844caf217e4879eddd3332d1972 --- .../wm/shell/splitscreen/SplitScreen.java | 6 +-- .../splitscreen/SplitScreenController.java | 16 +++--- .../shell/splitscreen/StageCoordinator.java | 53 +++++++++++++------ .../splitscreen/StageCoordinatorTests.java | 2 +- .../com/android/systemui/wmshell/WMShell.java | 8 +-- 5 files changed, 54 insertions(+), 31 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java index b36b1f84d21f..3e6d36ce0ca3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreen.java @@ -110,12 +110,12 @@ public interface SplitScreen { void registerSplitAnimationListener(@NonNull SplitInvocationListener listener, @NonNull Executor executor); - /** Called when device waking up finished. */ - void onFinishedWakingUp(); - /** Called when device starts going to sleep (screen off). */ void onStartedGoingToSleep(); + /** Called when device wakes up. */ + void onStartedWakingUp(); + /** Called when requested to go to fullscreen from the current active split app. */ void goToFullscreenFromSplit(); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java index 9e39f440915c..fd6537b33f91 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/SplitScreenController.java @@ -471,14 +471,14 @@ public class SplitScreenController implements SplitDragPolicy.Starter, mStageCoordinator.onKeyguardStateChanged(visible, occluded); } - public void onFinishedWakingUp() { - mStageCoordinator.onFinishedWakingUp(); - } - public void onStartedGoingToSleep() { mStageCoordinator.onStartedGoingToSleep(); } + public void onStartedWakingUp() { + mStageCoordinator.onStartedWakingUp(); + } + public void exitSplitScreenOnHide(boolean exitSplitScreenOnHide) { mStageCoordinator.exitSplitScreenOnHide(exitSplitScreenOnHide); } @@ -1073,13 +1073,13 @@ public class SplitScreenController implements SplitDragPolicy.Starter, } @Override - public void onFinishedWakingUp() { - mMainExecutor.execute(SplitScreenController.this::onFinishedWakingUp); + public void onStartedGoingToSleep() { + mMainExecutor.execute(SplitScreenController.this::onStartedGoingToSleep); } @Override - public void onStartedGoingToSleep() { - mMainExecutor.execute(SplitScreenController.this::onStartedGoingToSleep); + public void onStartedWakingUp() { + mMainExecutor.execute(SplitScreenController.this::onStartedWakingUp); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java index 3e76403de51b..687ed3a006fd 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/splitscreen/StageCoordinator.java @@ -1138,14 +1138,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, "onKeyguardVisibilityChanged: active=%b occludingTaskRunning=%b", active, occludingTaskRunning); setDividerVisibility(!mKeyguardActive, null); - - if (active && occludingTaskRunning) { - dismissSplitKeepingLastActiveStage(EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); - } } - void onFinishedWakingUp() { - ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onFinishedWakingUp"); + void onStartedWakingUp() { + ProtoLog.d(WM_SHELL_SPLIT_SCREEN, "onStartedWakingUp"); if (mBreakOnNextWake) { dismissSplitKeepingLastActiveStage(EXIT_REASON_DEVICE_FOLDED); } @@ -2485,6 +2481,10 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, final int transitType = info.getType(); TransitionInfo.Change pipChange = null; int closingSplitTaskId = -1; + // This array tracks if we are sending stages TO_BACK in this transition. + // TODO (b/349828130): Update for n apps + boolean[] stagesSentToBack = new boolean[2]; + for (int iC = 0; iC < info.getChanges().size(); ++iC) { final TransitionInfo.Change change = info.getChanges().get(iC); if (change.getMode() == TRANSIT_CHANGE @@ -2552,23 +2552,31 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, } continue; } + final int taskId = taskInfo.taskId; if (isOpeningType(change.getMode())) { - if (!stage.containsTask(taskInfo.taskId)) { + if (!stage.containsTask(taskId)) { Log.w(TAG, "Expected onTaskAppeared on " + stage + " to have been called" - + " with " + taskInfo.taskId + " before startAnimation()."); - record.addRecord(stage, true, taskInfo.taskId); + + " with " + taskId + " before startAnimation()."); + record.addRecord(stage, true, taskId); } } else if (change.getMode() == TRANSIT_CLOSE) { - if (stage.containsTask(taskInfo.taskId)) { - record.addRecord(stage, false, taskInfo.taskId); + if (stage.containsTask(taskId)) { + record.addRecord(stage, false, taskId); Log.w(TAG, "Expected onTaskVanished on " + stage + " to have been called" - + " with " + taskInfo.taskId + " before startAnimation()."); + + " with " + taskId + " before startAnimation()."); } } if (isClosingType(change.getMode()) && - getStageOfTask(change.getTaskInfo().taskId) != STAGE_TYPE_UNDEFINED) { - // If either one of the 2 stages is closing we're assuming we'll break split - closingSplitTaskId = change.getTaskInfo().taskId; + getStageOfTask(taskId) != STAGE_TYPE_UNDEFINED) { + + // Record which stages are getting sent to back + if (change.getMode() == TRANSIT_TO_BACK) { + stagesSentToBack[getStageOfTask(taskId)] = true; + } + + // (For PiP transitions) If either one of the 2 stages is closing we're assuming + // we'll break split + closingSplitTaskId = taskId; } } @@ -2594,6 +2602,21 @@ public class StageCoordinator implements SplitLayout.SplitLayoutHandler, return true; } + // If keyguard is active, check to see if we have our TO_BACK transitions in order. + // This array should either be all false (no split stages sent to back) or all true + // (all stages sent to back). In any other case (which can happen with SHOW_ABOVE_LOCKED + // apps) we should break split. + if (mKeyguardActive) { + boolean isFirstStageSentToBack = stagesSentToBack[0]; + for (boolean b : stagesSentToBack) { + // Compare each boolean to the first one. If any are different, break split. + if (b != isFirstStageSentToBack) { + dismissSplitKeepingLastActiveStage(EXIT_REASON_SCREEN_LOCKED_SHOW_ON_TOP); + break; + } + } + } + final ArraySet dismissStages = record.getShouldDismissedStage(); if (mMainStage.getChildCount() == 0 || mSideStage.getChildCount() == 0 || dismissStages.size() == 1) { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java index a6e33e5e7c29..a252a9db7095 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/splitscreen/StageCoordinatorTests.java @@ -320,7 +320,7 @@ public class StageCoordinatorTests extends ShellTestCase { assertEquals(mStageCoordinator.mLastActiveStage, STAGE_TYPE_MAIN); - mStageCoordinator.onFinishedWakingUp(); + mStageCoordinator.onStartedWakingUp(); verify(mTaskOrganizer).startNewTransition(eq(TRANSIT_SPLIT_DISMISS), notNull()); } diff --git a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java index 02d0b577feb1..8039e00159f0 100644 --- a/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java +++ b/packages/SystemUI/src/com/android/systemui/wmshell/WMShell.java @@ -281,13 +281,13 @@ public final class WMShell implements void initSplitScreen(SplitScreen splitScreen) { mWakefulnessLifecycle.addObserver(new WakefulnessLifecycle.Observer() { @Override - public void onFinishedWakingUp() { - splitScreen.onFinishedWakingUp(); + public void onStartedGoingToSleep() { + splitScreen.onStartedGoingToSleep(); } @Override - public void onStartedGoingToSleep() { - splitScreen.onStartedGoingToSleep(); + public void onStartedWakingUp() { + splitScreen.onStartedWakingUp(); } }); mCommandQueue.addCallback(new CommandQueue.Callbacks() { -- GitLab From 3b282f6af86be24700fbdd72d97ef4e16dac18bf Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Fri, 18 Oct 2024 16:33:47 +0100 Subject: [PATCH 154/459] Introducing GestureUiState with extra animation info We need more info in GestureState that is UI-specific so instead of adding it there, let's add extra layer between ActionState (state for touchpad + keyboard tutorial) and GestureState (formerly state for touchpad tutorial). Because we need to do do different mapping for each touchpad gesture, introduced GestureFlowAdapter that wraps callback code into flow - this makes it less repetitive (and error prone) and we can subscribe it to it easily from Compose code. Using conflatedCallbackFlow enforces using awaitClose() so also added new method to clear callback - it shouldn't be needed because we subscribe only when creating new GestureRecognizer but just to make it more explicit there's no memory leak. Bug: 369817369 Test: small refactoring, tests pass Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: I0e9536af9a0fe475807721838383ad5cbe3912a3 --- .../composable/BackGestureTutorialScreen.kt | 15 +++++- .../ui/composable/GestureTutorialScreen.kt | 49 ++++++++++++++----- .../composable/HomeGestureTutorialScreen.kt | 15 +++++- .../RecentAppsGestureTutorialScreen.kt | 15 +++++- .../ui/gesture/BackGestureRecognizer.kt | 4 ++ .../tutorial/ui/gesture/GestureFlowAdapter.kt | 30 ++++++++++++ .../tutorial/ui/gesture/GestureRecognizer.kt | 2 + .../ui/gesture/HomeGestureRecognizer.kt | 4 ++ .../ui/gesture/RecentAppsGestureRecognizer.kt | 4 ++ 9 files changed, 123 insertions(+), 15 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index e89a31f8fad3..618722a79a6f 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -27,7 +27,10 @@ import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenCon import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map @Composable fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { @@ -48,7 +51,17 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni ), ) val recognizer = rememberBackGestureRecognizer(LocalContext.current.resources) - GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack) + val gestureUiState: Flow = + remember(recognizer) { + GestureFlowAdapter(recognizer).gestureStateAsFlow.map { + it.toGestureUiState( + progressStartMark = "", + progressEndMark = "", + successAnimation = R.raw.trackpad_back_success, + ) + } + } + GestureTutorialScreen(screenConfig, recognizer, gestureUiState, onDoneButtonClicked, onBack) } @Composable diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt index 7899f5b42a25..11e1ff49074a 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt @@ -17,6 +17,7 @@ package com.android.systemui.touchpad.tutorial.ui.composable import androidx.activity.compose.BackHandler +import androidx.annotation.RawRes import androidx.compose.animation.core.Animatable import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Box @@ -31,23 +32,49 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.pointerInteropFilter +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.systemui.inputdevice.tutorial.ui.composable.ActionTutorialContent import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialActionState import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig +import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState.Finished +import com.android.systemui.touchpad.tutorial.ui.composable.GestureUiState.NotStarted import com.android.systemui.touchpad.tutorial.ui.gesture.EasterEggGestureMonitor import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress -import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted import com.android.systemui.touchpad.tutorial.ui.gesture.TouchpadGestureHandler +import kotlinx.coroutines.flow.Flow -fun GestureState.toTutorialActionState(): TutorialActionState { +sealed interface GestureUiState { + data object NotStarted : GestureUiState + + data class Finished(@RawRes val successAnimation: Int) : GestureUiState + + data class InProgress( + val progress: Float = 0f, + val progressStartMark: String = "", + val progressEndMark: String = "", + ) : GestureUiState +} + +fun GestureState.toGestureUiState( + progressStartMark: String, + progressEndMark: String, + successAnimation: Int, +): GestureUiState { + return when (this) { + GestureState.NotStarted -> NotStarted + is GestureState.InProgress -> + GestureUiState.InProgress(this.progress, progressStartMark, progressEndMark) + is GestureState.Finished -> GestureUiState.Finished(successAnimation) + } +} + +fun GestureUiState.toTutorialActionState(): TutorialActionState { return when (this) { NotStarted -> TutorialActionState.NotStarted // progress is disabled for now as views are not ready to handle varying progress - is InProgress -> TutorialActionState.InProgress(0f) - Finished -> TutorialActionState.Finished + is GestureUiState.InProgress -> TutorialActionState.InProgress(progress = 0f) + is Finished -> TutorialActionState.Finished } } @@ -55,15 +82,13 @@ fun GestureState.toTutorialActionState(): TutorialActionState { fun GestureTutorialScreen( screenConfig: TutorialScreenConfig, gestureRecognizer: GestureRecognizer, + gestureUiStateFlow: Flow, onDoneButtonClicked: () -> Unit, onBack: () -> Unit, ) { BackHandler(onBack = onBack) - var gestureState: GestureState by remember { mutableStateOf(NotStarted) } var easterEggTriggered by remember { mutableStateOf(false) } - LaunchedEffect(gestureRecognizer) { - gestureRecognizer.addGestureStateCallback { gestureState = it } - } + val gestureState by gestureUiStateFlow.collectAsStateWithLifecycle(NotStarted) val easterEggMonitor = EasterEggGestureMonitor { easterEggTriggered = true } val gestureHandler = remember(gestureRecognizer) { TouchpadGestureHandler(gestureRecognizer, easterEggMonitor) } @@ -84,7 +109,7 @@ fun GestureTutorialScreen( @Composable private fun TouchpadGesturesHandlingBox( gestureHandler: TouchpadGestureHandler, - gestureState: GestureState, + gestureState: GestureUiState, easterEggTriggered: Boolean, resetEasterEggFlag: () -> Unit, modifier: Modifier = Modifier, @@ -110,7 +135,7 @@ private fun TouchpadGesturesHandlingBox( .pointerInteropFilter( onTouchEvent = { event -> // FINISHED is the final state so we don't need to process touches anymore - if (gestureState == Finished) { + if (gestureState is Finished) { false } else { gestureHandler.onMotionEvent(event) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 3ddf760b9704..05871ce91e39 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -25,8 +25,11 @@ import com.android.compose.theme.LocalAndroidColorScheme import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer import com.android.systemui.touchpad.tutorial.ui.gesture.HomeGestureRecognizer +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map @Composable fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { @@ -47,7 +50,17 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni ), ) val recognizer = rememberHomeGestureRecognizer(LocalContext.current.resources) - GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack) + val gestureUiState: Flow = + remember(recognizer) { + GestureFlowAdapter(recognizer).gestureStateAsFlow.map { + it.toGestureUiState( + progressStartMark = "", + progressEndMark = "", + successAnimation = R.raw.trackpad_home_success, + ) + } + } + GestureTutorialScreen(screenConfig, recognizer, gestureUiState, onDoneButtonClicked, onBack) } @Composable diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index 30a21bf3b632..4fd16448e9f2 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -25,8 +25,11 @@ import com.android.compose.theme.LocalAndroidColorScheme import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenConfig import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer import com.android.systemui.touchpad.tutorial.ui.gesture.RecentAppsGestureRecognizer +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map @Composable fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { @@ -47,7 +50,17 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () ), ) val recognizer = rememberRecentAppsGestureRecognizer(LocalContext.current.resources) - GestureTutorialScreen(screenConfig, recognizer, onDoneButtonClicked, onBack) + val gestureUiState: Flow = + remember(recognizer) { + GestureFlowAdapter(recognizer).gestureStateAsFlow.map { + it.toGestureUiState( + progressStartMark = "", + progressEndMark = "", + successAnimation = R.raw.trackpad_recent_apps_success, + ) + } + } + GestureTutorialScreen(screenConfig, recognizer, gestureUiState, onDoneButtonClicked, onBack) } @Composable diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt index 80f800390852..024048cbbb24 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt @@ -33,6 +33,10 @@ class BackGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu gestureStateChangedCallback = callback } + override fun clearGestureStateCallback() { + gestureStateChangedCallback = {} + } + override fun accept(event: MotionEvent) { if (!isThreeFingerTouchpadSwipe(event)) return val gestureState = distanceTracker.processEvent(event) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt new file mode 100644 index 000000000000..23e31b0a9efd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureFlowAdapter.kt @@ -0,0 +1,30 @@ +/* + * 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.touchpad.tutorial.ui.gesture + +import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow +import kotlinx.coroutines.channels.awaitClose +import kotlinx.coroutines.flow.Flow + +class GestureFlowAdapter(gestureRecognizer: GestureRecognizer) { + + val gestureStateAsFlow: Flow = conflatedCallbackFlow { + val callback: (GestureState) -> Unit = { trySend(it) } + gestureRecognizer.addGestureStateCallback(callback) + awaitClose { gestureRecognizer.clearGestureStateCallback() } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureRecognizer.kt index d146268304a6..68a2ef9528eb 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureRecognizer.kt @@ -22,6 +22,8 @@ import java.util.function.Consumer /** Based on passed [MotionEvent]s recognizes different states of gesture and notifies callback. */ interface GestureRecognizer : Consumer { fun addGestureStateCallback(callback: (GestureState) -> Unit) + + fun clearGestureStateCallback() } fun isThreeFingerTouchpadSwipe(event: MotionEvent) = isNFingerTouchpadSwipe(event, fingerCount = 3) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt index 2b84a4c50613..b804b9a0d4c7 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt @@ -29,6 +29,10 @@ class HomeGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu gestureStateChangedCallback = callback } + override fun clearGestureStateCallback() { + gestureStateChangedCallback = {} + } + override fun accept(event: MotionEvent) { if (!isThreeFingerTouchpadSwipe(event)) return val gestureState = distanceTracker.processEvent(event) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt index 69b7c5edd750..7d484ee85b7c 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt @@ -38,6 +38,10 @@ class RecentAppsGestureRecognizer( gestureStateChangedCallback = callback } + override fun clearGestureStateCallback() { + gestureStateChangedCallback = {} + } + override fun accept(event: MotionEvent) { if (!isThreeFingerTouchpadSwipe(event)) return val gestureState = distanceTracker.processEvent(event) -- GitLab From 8a147e419218cd5c1925da09bdef146972541325 Mon Sep 17 00:00:00 2001 From: Brad Hinegardner Date: Mon, 21 Oct 2024 15:25:01 -0400 Subject: [PATCH 155/459] Make FlexClockView default clock use proper font Bug: 374787902 Test: manual Flag: com.android.systemui.clock_reactive_variants Change-Id: Iecb3782a5b076f78b3702405cfee51835c91429e --- .../shared/clocks/DefaultClockProvider.kt | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt index 900971bc3927..2a858238c156 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt @@ -39,7 +39,7 @@ class DefaultClockProvider( val resources: Resources, private val hasStepClockAnimation: Boolean = false, private val migratedClocks: Boolean = false, - private val clockReactiveVariants: Boolean = false, + private val isClockReactiveVariantsEnabled: Boolean = false, ) : ClockProvider { private var messageBuffers: ClockMessageBuffers? = null @@ -54,7 +54,7 @@ class DefaultClockProvider( throw IllegalArgumentException("${settings.clockId} is unsupported by $TAG") } - return if (clockReactiveVariants) { + return if (isClockReactiveVariantsEnabled) { val buffer = messageBuffers?.infraMessageBuffer ?: LogcatOnlyMessageBuffer(LogLevel.INFO) val assets = AssetLoader(ctx, ctx, "clocks/", buffer) @@ -84,7 +84,7 @@ class DefaultClockProvider( // TODO(b/352049256): Update placeholder to actual resource resources.getDrawable(R.drawable.clock_default_thumbnail, null), isReactiveToTone = true, - isReactiveToTouch = clockReactiveVariants, + isReactiveToTouch = isClockReactiveVariantsEnabled, axes = listOf(), // TODO: Ater some picker definition ) } @@ -103,7 +103,6 @@ class DefaultClockProvider( timespec = DigitalTimespec.FIRST_DIGIT, style = FontTextStyle( - fontFamily = "google_sans_flex.ttf", lineHeight = 147.25f, fontVariation = "'wght' 603, 'wdth' 100, 'opsz' 144, 'ROND' 100", @@ -112,7 +111,6 @@ class DefaultClockProvider( FontTextStyle( fontVariation = "'wght' 74, 'wdth' 43, 'opsz' 144, 'ROND' 100", - fontFamily = "google_sans_flex.ttf", fillColorLight = "#FFFFFFFF", outlineColor = "#00000000", renderType = RenderType.CHANGE_WEIGHT, @@ -131,7 +129,6 @@ class DefaultClockProvider( timespec = DigitalTimespec.SECOND_DIGIT, style = FontTextStyle( - fontFamily = "google_sans_flex.ttf", lineHeight = 147.25f, fontVariation = "'wght' 603, 'wdth' 100, 'opsz' 144, 'ROND' 100", @@ -140,7 +137,6 @@ class DefaultClockProvider( FontTextStyle( fontVariation = "'wght' 74, 'wdth' 43, 'opsz' 144, 'ROND' 100", - fontFamily = "google_sans_flex.ttf", fillColorLight = "#FFFFFFFF", outlineColor = "#00000000", renderType = RenderType.CHANGE_WEIGHT, @@ -159,7 +155,6 @@ class DefaultClockProvider( timespec = DigitalTimespec.FIRST_DIGIT, style = FontTextStyle( - fontFamily = "google_sans_flex.ttf", lineHeight = 147.25f, fontVariation = "'wght' 603, 'wdth' 100, 'opsz' 144, 'ROND' 100", @@ -168,7 +163,6 @@ class DefaultClockProvider( FontTextStyle( fontVariation = "'wght' 74, 'wdth' 43, 'opsz' 144, 'ROND' 100", - fontFamily = "google_sans_flex.ttf", fillColorLight = "#FFFFFFFF", outlineColor = "#00000000", renderType = RenderType.CHANGE_WEIGHT, @@ -187,7 +181,6 @@ class DefaultClockProvider( timespec = DigitalTimespec.SECOND_DIGIT, style = FontTextStyle( - fontFamily = "google_sans_flex.ttf", lineHeight = 147.25f, fontVariation = "'wght' 603, 'wdth' 100, 'opsz' 144, 'ROND' 100", @@ -196,7 +189,6 @@ class DefaultClockProvider( FontTextStyle( fontVariation = "'wght' 74, 'wdth' 43, 'opsz' 144, 'ROND' 100", - fontFamily = "google_sans_flex.ttf", fillColorLight = "#FFFFFFFF", outlineColor = "#00000000", renderType = RenderType.CHANGE_WEIGHT, @@ -221,13 +213,11 @@ class DefaultClockProvider( timespec = DigitalTimespec.TIME_FULL_FORMAT, style = FontTextStyle( - fontFamily = "google_sans_flex.ttf", fontVariation = "'wght' 600, 'wdth' 100, 'opsz' 144, 'ROND' 100", fontSizeScale = 0.98f, ), aodStyle = FontTextStyle( - fontFamily = "google_sans_flex.ttf", fontVariation = "'wght' 133, 'wdth' 43, 'opsz' 144, 'ROND' 100", fillColorLight = "#FFFFFFFF", outlineColor = "#00000000", -- GitLab From fd47d4bb6e9bcecdf888551313fd74863fcd862f Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Fri, 18 Oct 2024 12:55:58 -0400 Subject: [PATCH 156/459] [events] move SystemAnimationState to enum, expose flow This change is mostly mechanical; move from the @IntDef to using a bona fide `enum class`. This makes `when` statements nicer when we attach listeners to this newly-exposed flow. The `animationState` flow now is an API that clients can use to track the current animation state. This will enable us to attach view-binder style animations to the state without needing to use the older callback mechanism that collects `AnimatorSet`s to play them together. Test: SystemStatusAnimationSchedulerImplTest Test: AuthContainerViewTest Flag: EXEMPT refactor Bug: 364360986 Change-Id: I478d974f8525f6cc401db7c4390e0fad6b2d5090 --- .../events/SystemStatusAnimationScheduler.kt | 34 +-- .../SystemStatusAnimationSchedulerImpl.kt | 55 ++--- .../SystemStatusAnimationSchedulerLogger.kt | 35 +--- .../shared/model/SystemEventAnimationState.kt | 35 ++++ .../biometrics/AuthContainerViewTest.kt | 33 ++- .../SystemStatusAnimationSchedulerImplTest.kt | 195 +++++++++--------- 6 files changed, 195 insertions(+), 192 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/events/shared/model/SystemEventAnimationState.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt index c6f3d7d21a22..564d52a62cde 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationScheduler.kt @@ -16,17 +16,19 @@ package com.android.systemui.statusbar.events -import android.annotation.IntDef import androidx.core.animation.Animator import androidx.core.animation.AnimatorSet import androidx.core.animation.PathInterpolator import com.android.systemui.Dumpable +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState import com.android.systemui.statusbar.policy.CallbackController +import kotlinx.coroutines.flow.StateFlow interface SystemStatusAnimationScheduler : CallbackController, Dumpable { - @SystemAnimationState fun getAnimationState(): Int + /** StateFlow holding the current [SystemEventAnimationState] at any time. */ + val animationState: StateFlow fun onStatusEvent(event: StatusEvent) @@ -63,34 +65,6 @@ interface SystemStatusAnimationCallback { } } -/** Animation state IntDef */ -@Retention(AnnotationRetention.SOURCE) -@IntDef( - value = - [ - IDLE, - ANIMATION_QUEUED, - ANIMATING_IN, - RUNNING_CHIP_ANIM, - ANIMATING_OUT, - SHOWING_PERSISTENT_DOT, - ] -) -annotation class SystemAnimationState - -/** No animation is in progress */ -@SystemAnimationState const val IDLE = 0 -/** An animation is queued, and awaiting the debounce period */ -const val ANIMATION_QUEUED = 1 -/** System is animating out, and chip is animating in */ -const val ANIMATING_IN = 2 -/** Chip has animated in and is awaiting exit animation, and optionally playing its own animation */ -const val RUNNING_CHIP_ANIM = 3 -/** Chip is animating away and system is animating back */ -const val ANIMATING_OUT = 4 -/** Chip has animated away, and the persistent dot is showing */ -const val SHOWING_PERSISTENT_DOT = 5 - /** Commonly-needed interpolators can go here */ @JvmField val STATUS_BAR_X_MOVE_OUT = PathInterpolator(0.33f, 0f, 0f, 1f) @JvmField val STATUS_BAR_X_MOVE_IN = PathInterpolator(0f, 0f, 0f, 1f) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt index 5f9e4265c004..5ff44233bb41 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt @@ -23,6 +23,12 @@ import androidx.core.animation.AnimatorListenerAdapter import androidx.core.animation.AnimatorSet import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dump.DumpManager +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimatingIn +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimatingOut +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimationQueued +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.RunningChipAnim +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.ShowingPersistentDot import com.android.systemui.statusbar.window.StatusBarWindowControllerStore import com.android.systemui.util.Assert import com.android.systemui.util.time.SystemClock @@ -33,6 +39,7 @@ import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.first @@ -85,8 +92,8 @@ constructor( */ private var currentlyDisplayedEvent: StatusEvent? = null - /** StateFlow holding the current [SystemAnimationState] at any time. */ - private var animationState = MutableStateFlow(IDLE) + private val _animationState = MutableStateFlow(Idle) + override val animationState = _animationState.asStateFlow() /** True if the persistent privacy dot should be active */ var hasPersistentDot = false @@ -109,24 +116,22 @@ constructor( // Wait for animationState to become ANIMATION_QUEUED and scheduledEvent to be non null. // Once this combination is stable for at least DEBOUNCE_DELAY, then start a chip enter // animation - animationState + _animationState .combine(scheduledEvent) { animationState, scheduledEvent -> Pair(animationState, scheduledEvent) } .debounce(DEBOUNCE_DELAY) .collect { (animationState, event) -> - if (animationState == ANIMATION_QUEUED && event != null) { + if (animationState == AnimationQueued && event != null) { startAnimationLifecycle(event) scheduledEvent.value = null } } } - coroutineScope.launch { animationState.collect { logger?.logAnimationStateUpdate(it) } } + coroutineScope.launch { _animationState.collect { logger?.logAnimationStateUpdate(it) } } } - @SystemAnimationState override fun getAnimationState(): Int = animationState.value - override fun onStatusEvent(event: StatusEvent) { Assert.isMainThread() @@ -146,11 +151,11 @@ constructor( logger?.logScheduleEvent(event) scheduleEvent(event) } else if (currentlyDisplayedEvent?.shouldUpdateFromEvent(event) == true) { - logger?.logUpdateEvent(event, animationState.value) + logger?.logUpdateEvent(event, _animationState.value) currentlyDisplayedEvent?.updateFromEvent(event) if (event.forceVisible) hasPersistentDot = true } else if (scheduledEvent.value?.shouldUpdateFromEvent(event) == true) { - logger?.logUpdateEvent(event, animationState.value) + logger?.logUpdateEvent(event, _animationState.value) scheduledEvent.value?.updateFromEvent(event) } else { logger?.logIgnoreEvent(event) @@ -170,15 +175,15 @@ constructor( // the disappear animation will not animate into a dot but remove the chip entirely hasPersistentDot = false - if (animationState.value == SHOWING_PERSISTENT_DOT) { + if (_animationState.value == ShowingPersistentDot) { // if we are currently showing a persistent dot, hide it and update the animationState notifyHidePersistentDot() if (scheduledEvent.value != null) { - animationState.value = ANIMATION_QUEUED + _animationState.value = AnimationQueued } else { - animationState.value = IDLE + _animationState.value = Idle } - } else if (animationState.value == ANIMATING_OUT) { + } else if (_animationState.value == AnimatingOut) { // if we are currently animating out, hide the dot. The animationState will be updated // once the animation has ended in the onAnimationEnd callback notifyHidePersistentDot() @@ -206,9 +211,9 @@ constructor( cancelCurrentlyDisplayedEvent() return } - if (animationState.value == IDLE) { + if (_animationState.value == Idle) { // If we are in IDLE state, set it to ANIMATION_QUEUED now - animationState.value = ANIMATION_QUEUED + _animationState.value = AnimationQueued } } @@ -223,7 +228,7 @@ constructor( withTimeout(APPEAR_ANIMATION_DURATION) { // wait for animationState to become RUNNING_CHIP_ANIM, then cancel the running // animation job and run the disappear animation immediately - animationState.first { it == RUNNING_CHIP_ANIM } + _animationState.first { it == RunningChipAnim } currentlyRunningAnimationJob?.cancel() runChipDisappearAnimation() } @@ -241,7 +246,7 @@ constructor( if (!event.showAnimation && event.forceVisible) { // If animations are turned off, we'll transition directly to the dot - animationState.value = SHOWING_PERSISTENT_DOT + _animationState.value = ShowingPersistentDot notifyTransitionToPersistentDot(event) return } @@ -277,7 +282,7 @@ constructor( if (hasPersistentDot) { statusBarWindowControllerStore.defaultDisplay.setForceStatusBarVisible(true) } - animationState.value = ANIMATING_IN + _animationState.value = AnimatingIn val animSet = collectStartAnimations() if (animSet.totalDuration > 500) { @@ -289,7 +294,7 @@ constructor( animSet.addListener( object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - animationState.value = RUNNING_CHIP_ANIM + _animationState.value = RunningChipAnim } } ) @@ -299,15 +304,15 @@ constructor( private fun runChipDisappearAnimation() { Assert.isMainThread() val animSet2 = collectFinishAnimations() - animationState.value = ANIMATING_OUT + _animationState.value = AnimatingOut animSet2.addListener( object : AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { - animationState.value = + _animationState.value = when { - hasPersistentDot -> SHOWING_PERSISTENT_DOT - scheduledEvent.value != null -> ANIMATION_QUEUED - else -> IDLE + hasPersistentDot -> ShowingPersistentDot + scheduledEvent.value != null -> AnimationQueued + else -> Idle } statusBarWindowControllerStore.defaultDisplay.setForceStatusBarVisible(false) } @@ -401,7 +406,7 @@ constructor( pw.println("Scheduled event: ${scheduledEvent.value}") pw.println("Currently displayed event: $currentlyDisplayedEvent") pw.println("Has persistent privacy dot: $hasPersistentDot") - pw.println("Animation state: ${animationState.value}") + pw.println("Animation state: ${_animationState.value}") pw.println("Listeners:") if (listeners.isEmpty()) { pw.println("(none)") diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt index 22b0b691ad3b..a1f7a9bf64ae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerLogger.kt @@ -3,15 +3,14 @@ package com.android.systemui.statusbar.events import com.android.systemui.dagger.SysUISingleton import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState import javax.inject.Inject /** Logs for the SystemStatusAnimationScheduler. */ @SysUISingleton class SystemStatusAnimationSchedulerLogger @Inject -constructor( - @SystemStatusAnimationSchedulerLog private val logBuffer: LogBuffer, -) { +constructor(@SystemStatusAnimationSchedulerLog private val logBuffer: LogBuffer) { fun logScheduleEvent(event: StatusEvent) { logBuffer.log( @@ -23,11 +22,11 @@ constructor( bool1 = event.forceVisible bool2 = event.showAnimation }, - { "Scheduling event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" } + { "Scheduling event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" }, ) } - fun logUpdateEvent(event: StatusEvent, @SystemAnimationState animationState: Int) { + fun logUpdateEvent(event: StatusEvent, animationState: SystemEventAnimationState) { logBuffer.log( TAG, LogLevel.DEBUG, @@ -36,12 +35,12 @@ constructor( int1 = event.priority bool1 = event.forceVisible bool2 = event.showAnimation - int2 = animationState + str2 = animationState.name }, { "Updating current event from: $str1(forceVisible=$bool1, priority=$int1, " + - "showAnimation=$bool2), animationState=${animationState.name()}" - } + "showAnimation=$bool2), animationState=$str2" + }, ) } @@ -55,7 +54,7 @@ constructor( bool1 = event.forceVisible bool2 = event.showAnimation }, - { "Ignore event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" } + { "Ignore event: $str1(forceVisible=$bool1, priority=$int1, showAnimation=$bool2)" }, ) } @@ -67,26 +66,14 @@ constructor( logBuffer.log(TAG, LogLevel.DEBUG, "Transition to persistent dot callback invoked") } - fun logAnimationStateUpdate(@SystemAnimationState animationState: Int) { + fun logAnimationStateUpdate(animationState: SystemEventAnimationState) { logBuffer.log( TAG, LogLevel.DEBUG, - { int1 = animationState }, - { "AnimationState update: ${int1.name()}" } + { str1 = animationState.name }, + { "AnimationState update: $str1" }, ) - animationState.name() } - - private fun @receiver:SystemAnimationState Int.name() = - when (this) { - IDLE -> "IDLE" - ANIMATION_QUEUED -> "ANIMATION_QUEUED" - ANIMATING_IN -> "ANIMATING_IN" - RUNNING_CHIP_ANIM -> "RUNNING_CHIP_ANIM" - ANIMATING_OUT -> "ANIMATING_OUT" - SHOWING_PERSISTENT_DOT -> "SHOWING_PERSISTENT_DOT" - else -> "UNKNOWN_ANIMATION_STATE" - } } private const val TAG = "SystemStatusAnimationSchedulerLog" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/shared/model/SystemEventAnimationState.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/shared/model/SystemEventAnimationState.kt new file mode 100644 index 000000000000..2446b81e006c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/shared/model/SystemEventAnimationState.kt @@ -0,0 +1,35 @@ +/* + * 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.statusbar.events.shared.model + +/** Direct representation of the system event animation scheduler's current state */ +enum class SystemEventAnimationState { + /** No animation is in progress */ + Idle, + /** An animation is queued, and awaiting the debounce period */ + AnimationQueued, + /** System is animating out, and chip is animating in */ + AnimatingIn, + /** + * Chip has animated in and is awaiting exit animation, and optionally playing its own animation + */ + RunningChipAnim, + /** Chip is animating away and system is animating back */ + AnimatingOut, + /** Chip has animated away, and the persistent dot is showing */ + ShowingPersistentDot, +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt index 7889b3cd6cc3..61eeab3a8c07 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/AuthContainerViewTest.kt @@ -65,7 +65,6 @@ import com.android.systemui.haptics.msdl.msdlPlayer import com.android.systemui.keyguard.WakefulnessLifecycle import com.android.systemui.res.R import com.android.systemui.statusbar.VibratorHelper -import com.android.systemui.statusbar.events.ANIMATING_OUT import com.android.systemui.testKosmos import com.android.systemui.user.domain.interactor.SelectedUserInteractor import com.android.systemui.util.concurrency.FakeExecutor @@ -176,7 +175,7 @@ open class AuthContainerViewTest : SysuiTestCase() { BiometricStatusInteractorImpl( activityTaskManager, biometricStatusRepository, - fingerprintRepository + fingerprintRepository, ) iconProvider = IconProvider(context) // Set up default logo icon @@ -245,7 +244,7 @@ open class AuthContainerViewTest : SysuiTestCase() { @Test fun testIgnoresAnimatedInWhenDialogAnimatingOut() { val container = initializeFingerprintContainer(addToView = false) - container.mContainerState = ANIMATING_OUT + container.mContainerState = 4 // STATE_ANIMATING_OUT container.addToView() waitForIdleSync() @@ -278,7 +277,7 @@ open class AuthContainerViewTest : SysuiTestCase() { .onDismissed( eq(AuthDialogCallback.DISMISSED_BIOMETRIC_AUTHENTICATED), eq(null), /* credentialAttestation */ - eq(authContainer?.requestId ?: 0L) + eq(authContainer?.requestId ?: 0L), ) assertThat(container.parent).isNull() } @@ -292,13 +291,13 @@ open class AuthContainerViewTest : SysuiTestCase() { verify(callback) .onSystemEvent( eq(BiometricConstants.BIOMETRIC_SYSTEM_EVENT_EARLY_USER_CANCEL), - eq(authContainer?.requestId ?: 0L) + eq(authContainer?.requestId ?: 0L), ) verify(callback) .onDismissed( eq(AuthDialogCallback.DISMISSED_USER_CANCELED), eq(null), /* credentialAttestation */ - eq(authContainer?.requestId ?: 0L) + eq(authContainer?.requestId ?: 0L), ) assertThat(container.parent).isNull() } @@ -313,7 +312,7 @@ open class AuthContainerViewTest : SysuiTestCase() { .onDismissed( eq(AuthDialogCallback.DISMISSED_BUTTON_NEGATIVE), eq(null), /* credentialAttestation */ - eq(authContainer?.requestId ?: 0L) + eq(authContainer?.requestId ?: 0L), ) assertThat(container.parent).isNull() } @@ -340,7 +339,7 @@ open class AuthContainerViewTest : SysuiTestCase() { .onDismissed( eq(AuthDialogCallback.DISMISSED_ERROR), eq(null), /* credentialAttestation */ - eq(authContainer?.requestId ?: 0L) + eq(authContainer?.requestId ?: 0L), ) assertThat(authContainer!!.parent).isNull() } @@ -454,7 +453,7 @@ open class AuthContainerViewTest : SysuiTestCase() { val container = initializeFingerprintContainer( authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL, - verticalListContentView = PromptVerticalListContentView.Builder().build() + verticalListContentView = PromptVerticalListContentView.Builder().build(), ) // Two-step credential view should show - // 1. biometric prompt without sensor 2. credential view ui @@ -479,7 +478,7 @@ open class AuthContainerViewTest : SysuiTestCase() { val container = initializeFingerprintContainer( authenticators = BiometricManager.Authenticators.DEVICE_CREDENTIAL, - contentViewWithMoreOptionsButton = contentView + contentViewWithMoreOptionsButton = contentView, ) waitForIdleSync() @@ -565,7 +564,7 @@ open class AuthContainerViewTest : SysuiTestCase() { } private fun initializeCredentialPasswordContainer( - addToView: Boolean = true, + addToView: Boolean = true ): TestAuthContainerView { whenever(userManager.getCredentialOwnerProfile(anyInt())).thenReturn(20) whenever(lockPatternUtils.getKeyguardStoredPasswordQuality(eq(20))) @@ -597,25 +596,25 @@ open class AuthContainerViewTest : SysuiTestCase() { fingerprintProps = fingerprintSensorPropertiesInternal(), verticalListContentView = verticalListContentView, ), - addToView + addToView, ) private fun initializeCoexContainer( authenticators: Int = BiometricManager.Authenticators.BIOMETRIC_WEAK, - addToView: Boolean = true + addToView: Boolean = true, ) = initializeContainer( TestAuthContainerView( authenticators = authenticators, fingerprintProps = fingerprintSensorPropertiesInternal(), - faceProps = faceSensorPropertiesInternal() + faceProps = faceSensorPropertiesInternal(), ), - addToView + addToView, ) private fun initializeContainer( view: TestAuthContainerView, - addToView: Boolean + addToView: Boolean, ): TestAuthContainerView { authContainer = view @@ -668,7 +667,7 @@ open class AuthContainerViewTest : SysuiTestCase() { biometricStatusInteractor, udfpsUtils, iconProvider, - activityTaskManager + activityTaskManager, ), { credentialViewModel }, fakeExecutor, diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt index 5d8a8fd03bc0..9dc0dbb4b632 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt @@ -29,6 +29,13 @@ import com.android.systemui.animation.AnimatorTestRule import com.android.systemui.dump.DumpManager import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.statusbar.BatteryStatusChip +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimatingIn +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimatingOut +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.AnimationQueued +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.RunningChipAnim +import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.ShowingPersistentDot import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore @@ -96,22 +103,18 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // StatusBarContentInsetProvider is mocked. Ensure that it returns some mocked values. whenever(statusBarContentInsetProvider.getStatusBarContentInsetsForCurrentRotation()) - .thenReturn( - Insets.of(/* left = */ 10, /* top = */ 10, /* right = */ 10, /* bottom = */ 0) - ) + .thenReturn(Insets.of(/* left= */ 10, /* top= */ 10, /* right= */ 10, /* bottom= */ 0)) whenever(statusBarContentInsetProvider.getStatusBarContentAreaForCurrentRotation()) - .thenReturn( - Rect(/* left = */ 10, /* top = */ 10, /* right = */ 990, /* bottom = */ 100) - ) + .thenReturn(Rect(/* left= */ 10, /* top= */ 10, /* right= */ 990, /* bottom= */ 100)) // StatusBarWindowController is mocked. The addViewToWindow function needs to be mocked to // ensure that the chip view is added to a parent view whenever(statusBarWindowController.addViewToWindow(any(), any())).then { val statusbarFake = FrameLayout(mContext) - statusbarFake.layout(/* l = */ 0, /* t = */ 0, /* r = */ 1000, /* b = */ 100) + statusbarFake.layout(/* l= */ 0, /* t= */ 0, /* r= */ 1000, /* b= */ 100) statusbarFake.addView( it.arguments[0] as View, - it.arguments[1] as FrameLayout.LayoutParams + it.arguments[1] as FrameLayout.LayoutParams, ) } } @@ -124,12 +127,12 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { val batteryChip = createAndScheduleFakeBatteryEvent() // assert that animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // skip debounce delay advanceTimeBy(DEBOUNCE_DELAY + 1) // status chip starts animating in after debounce delay - assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingIn, systemStatusAnimationScheduler.animationState.value) assertEquals(0f, batteryChip.contentView.alpha) assertEquals(0f, batteryChip.view.alpha) verify(listener, times(1)).onSystemEventAnimationBegin() @@ -138,14 +141,14 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) advanceTimeBy(APPEAR_ANIMATION_DURATION) // assert that status chip is visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, batteryChip.contentView.alpha) assertEquals(1f, batteryChip.view.alpha) // skip status chip display time advanceTimeBy(DISPLAY_LENGTH + 1) - // assert that it is still visible but switched to the ANIMATING_OUT state - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // assert that it is still visible but switched to the AnimatingOut state + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, batteryChip.contentView.alpha) assertEquals(1f, batteryChip.view.alpha) verify(listener, times(1)).onSystemEventAnimationFinish(false) @@ -153,7 +156,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // skip disappear animation animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) // assert that it is not visible anymore - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) assertEquals(0f, batteryChip.contentView.alpha) assertEquals(0f, batteryChip.view.alpha) } @@ -170,7 +173,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { createAndScheduleFakePrivacyEvent() // THEN the privacy event still happens - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) } @Test @@ -181,12 +184,12 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { val privacyChip = createAndScheduleFakePrivacyEvent() // assert that animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // skip debounce delay advanceTimeBy(DEBOUNCE_DELAY + 1) // status chip starts animating in after debounce delay - assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingIn, systemStatusAnimationScheduler.animationState.value) assertEquals(0f, privacyChip.view.alpha) verify(listener, times(1)).onSystemEventAnimationBegin() @@ -194,13 +197,13 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) advanceTimeBy(APPEAR_ANIMATION_DURATION + 1) // assert that status chip is visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) // skip status chip display time advanceTimeBy(DISPLAY_LENGTH + 1) - // assert that it is still visible but switched to the ANIMATING_OUT state - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // assert that it is still visible but switched to the AnimatingOut state + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) verify(listener, times(1)).onSystemEventAnimationFinish(true) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) @@ -209,13 +212,13 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { advanceTimeBy(DISAPPEAR_ANIMATION_DURATION + 1) animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) // assert that it the dot is now visible - assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(ShowingPersistentDot, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) // notify SystemStatusAnimationScheduler to remove persistent dot systemStatusAnimationScheduler.removePersistentDot() - // assert that IDLE state is entered - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + // assert that Idle state is entered + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onHidePersistentDot() } @@ -229,19 +232,19 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { batteryChip.view.alpha = 0f // assert that animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // create and schedule high priority event val privacyChip = createAndScheduleFakePrivacyEvent() // assert that animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // skip debounce delay and appear animation duration - fastForwardAnimationToState(RUNNING_CHIP_ANIM) + fastForwardAnimationToState(RunningChipAnim) // high priority status chip is visible while low priority status chip is not visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) assertEquals(0f, batteryChip.view.alpha) } @@ -254,11 +257,11 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule low priority event val batteryChip = createAndScheduleFakeBatteryEvent() - // fast forward to RUNNING_CHIP_ANIM state - fastForwardAnimationToState(RUNNING_CHIP_ANIM) + // fast forward to RunningChipAnim state + fastForwardAnimationToState(RunningChipAnim) // assert that chip is displayed - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, batteryChip.view.alpha) // create and schedule high priority event @@ -268,20 +271,20 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { testScheduler.runCurrent() // assert that currently displayed chip is immediately animated out - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) // skip disappear animation animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) // assert that high priority privacy chip animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // skip debounce delay and appear animation advanceTimeBy(DEBOUNCE_DELAY + APPEAR_ANIMATION_DURATION + 1) animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) // high priority status chip is visible while low priority status chip is not visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) assertEquals(0f, batteryChip.view.alpha) } @@ -298,7 +301,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { advanceTimeBy(DEBOUNCE_DELAY + 1) // assert that chip is animated in - assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingIn, systemStatusAnimationScheduler.animationState.value) // create and schedule high priority event val privacyChip = createAndScheduleFakePrivacyEvent() @@ -307,7 +310,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { testScheduler.runCurrent() // assert that currently animated chip keeps animating - assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingIn, systemStatusAnimationScheduler.animationState.value) // skip appear animation animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) @@ -315,20 +318,20 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // assert that low priority chip is animated out immediately after finishing the appear // animation - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) // skip disappear animation animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) // assert that high priority privacy chip animation is queued - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // skip debounce delay and appear animation advanceTimeBy(DEBOUNCE_DELAY + APPEAR_ANIMATION_DURATION + 1) animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) // high priority status chip is visible while low priority status chip is not visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) assertEquals(0f, batteryChip.view.alpha) } @@ -350,7 +353,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) // high priority status chip is visible while low priority status chip is not visible - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) assertEquals(1f, privacyChip.view.alpha) assertEquals(0f, batteryChip.view.alpha) } @@ -363,14 +366,14 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule high priority event createAndScheduleFakePrivacyEvent() - // skip chip animation lifecycle and fast forward to SHOWING_PERSISTENT_DOT state - fastForwardAnimationToState(SHOWING_PERSISTENT_DOT) - assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + // skip chip animation lifecycle and fast forward to ShowingPersistentDot state + fastForwardAnimationToState(ShowingPersistentDot) + assertEquals(ShowingPersistentDot, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) - // remove persistent dot and verify that animationState changes to IDLE + // remove persistent dot and verify that animationState changes to Idle systemStatusAnimationScheduler.removePersistentDot() - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onHidePersistentDot() } @@ -386,9 +389,9 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { scheduleFakeEventWithView( accessibilityDesc, mockAnimatableView, - shouldAnnounceAccessibilityEvent = true + shouldAnnounceAccessibilityEvent = true, ) - fastForwardAnimationToState(ANIMATING_OUT) + fastForwardAnimationToState(AnimatingOut) verify(mockView).announceForAccessibility(eq(accessibilityDesc)) } @@ -405,9 +408,9 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { scheduleFakeEventWithView( accessibilityDesc, mockAnimatableView, - shouldAnnounceAccessibilityEvent = true + shouldAnnounceAccessibilityEvent = true, ) - fastForwardAnimationToState(ANIMATING_OUT) + fastForwardAnimationToState(AnimatingOut) verify(mockView, never()).announceForAccessibility(any()) } @@ -424,9 +427,9 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { scheduleFakeEventWithView( accessibilityDesc, mockAnimatableView, - shouldAnnounceAccessibilityEvent = false + shouldAnnounceAccessibilityEvent = false, ) - fastForwardAnimationToState(ANIMATING_OUT) + fastForwardAnimationToState(AnimatingOut) verify(mockView, never()).announceForAccessibility(any()) } @@ -439,21 +442,21 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule high priority event createAndScheduleFakePrivacyEvent() - // skip chip animation lifecycle and fast forward to RUNNING_CHIP_ANIM state - fastForwardAnimationToState(RUNNING_CHIP_ANIM) - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) + // skip chip animation lifecycle and fast forward to RunningChipAnim state + fastForwardAnimationToState(RunningChipAnim) + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) // request removal of persistent dot systemStatusAnimationScheduler.removePersistentDot() // skip display time and verify that disappear animation is run advanceTimeBy(DISPLAY_LENGTH + 1) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) - // skip disappear animation and verify that animationState changes to IDLE instead of - // SHOWING_PERSISTENT_DOT + // skip disappear animation and verify that animationState changes to Idle instead of + // ShowingPersistentDot animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) // verify that the persistent dot callbacks are not invoked verify(listener, never()).onSystemStatusAnimationTransitionToPersistentDot(any()) verify(listener, never()).onHidePersistentDot() @@ -467,9 +470,9 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule high priority event createAndScheduleFakePrivacyEvent() - // fast forward to ANIMATING_OUT state - fastForwardAnimationToState(ANIMATING_OUT) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // fast forward to AnimatingOut state + fastForwardAnimationToState(AnimatingOut) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) // remove persistent dot @@ -482,8 +485,8 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) testScheduler.runCurrent() - // verify that animationState changes to IDLE - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + // verify that animationState changes to Idle + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) } @Test @@ -498,11 +501,11 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule a privacy event again (resets forceVisible to true) createAndScheduleFakePrivacyEvent() - // skip chip animation lifecycle and fast forward to SHOWING_PERSISTENT_DOT state - fastForwardAnimationToState(SHOWING_PERSISTENT_DOT) + // skip chip animation lifecycle and fast forward to ShowingPersistentDot state + fastForwardAnimationToState(ShowingPersistentDot) - // verify that we reach SHOWING_PERSISTENT_DOT and that listener callback is invoked - assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + // verify that we reach ShowingPersistentDot and that listener callback is invoked + assertEquals(ShowingPersistentDot, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) } @@ -515,21 +518,21 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { createAndScheduleFakePrivacyEvent() // request removal of persistent dot (sets forceVisible to false) systemStatusAnimationScheduler.removePersistentDot() - fastForwardAnimationToState(RUNNING_CHIP_ANIM) + fastForwardAnimationToState(RunningChipAnim) // create and schedule a privacy event again (resets forceVisible to true) createAndScheduleFakePrivacyEvent() // skip status chip display time advanceTimeBy(DISPLAY_LENGTH + 1) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemEventAnimationFinish(anyBoolean()) // skip disappear animation animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) - // verify that we reach SHOWING_PERSISTENT_DOT and that listener callback is invoked - assertEquals(SHOWING_PERSISTENT_DOT, systemStatusAnimationScheduler.getAnimationState()) + // verify that we reach ShowingPersistentDot and that listener callback is invoked + assertEquals(ShowingPersistentDot, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) } @@ -541,9 +544,9 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule high priority event createAndScheduleFakePrivacyEvent() - // skip chip animation lifecycle and fast forward to ANIMATING_OUT state - fastForwardAnimationToState(ANIMATING_OUT) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // skip chip animation lifecycle and fast forward to AnimatingOut state + fastForwardAnimationToState(AnimatingOut) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) // request removal of persistent dot @@ -552,13 +555,13 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // schedule another high priority event while the event is animating out createAndScheduleFakePrivacyEvent() - // verify that the state is still ANIMATING_OUT - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // verify that the state is still AnimatingOut + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) - // skip disappear animation duration and verify that new state is ANIMATION_QUEUED + // skip disappear animation duration and verify that new state is AnimationQueued animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) testScheduler.runCurrent() - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) // also verify that onHidePersistentDot callback is called verify(listener, times(1)).onHidePersistentDot() } @@ -571,16 +574,16 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // create and schedule high priority event createAndScheduleFakePrivacyEvent() - // skip chip animation lifecycle and fast forward to ANIMATING_OUT state - fastForwardAnimationToState(ANIMATING_OUT) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // skip chip animation lifecycle and fast forward to AnimatingOut state + fastForwardAnimationToState(AnimatingOut) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemStatusAnimationTransitionToPersistentDot(any()) // request removal of persistent dot systemStatusAnimationScheduler.removePersistentDot() - // verify that the state is still ANIMATING_OUT - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + // verify that the state is still AnimatingOut + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) // skip disappear animation duration testScheduler.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION + 1) @@ -595,33 +598,33 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { // verify that onHidePersistentDot is invoked despite the animator callback being delayed // (it's invoked more than DISAPPEAR_ANIMATION_DURATION after the dot removal was requested) verify(listener, times(1)).onHidePersistentDot() - // verify that animationState is IDLE - assertEquals(IDLE, systemStatusAnimationScheduler.getAnimationState()) + // verify that animationState is Idle + assertEquals(Idle, systemStatusAnimationScheduler.animationState.value) } - private fun TestScope.fastForwardAnimationToState(@SystemAnimationState animationState: Int) { + private fun TestScope.fastForwardAnimationToState(animationState: SystemEventAnimationState) { // this function should only be called directly after posting a status event - assertEquals(ANIMATION_QUEUED, systemStatusAnimationScheduler.getAnimationState()) - if (animationState == IDLE || animationState == ANIMATION_QUEUED) return + assertEquals(AnimationQueued, systemStatusAnimationScheduler.animationState.value) + if (animationState == Idle || animationState == AnimationQueued) return // skip debounce delay advanceTimeBy(DEBOUNCE_DELAY + 1) // status chip starts animating in after debounce delay - assertEquals(ANIMATING_IN, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingIn, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemEventAnimationBegin() - if (animationState == ANIMATING_IN) return + if (animationState == AnimatingIn) return // skip appear animation animatorTestRule.advanceTimeBy(APPEAR_ANIMATION_DURATION) advanceTimeBy(APPEAR_ANIMATION_DURATION) - assertEquals(RUNNING_CHIP_ANIM, systemStatusAnimationScheduler.getAnimationState()) - if (animationState == RUNNING_CHIP_ANIM) return + assertEquals(RunningChipAnim, systemStatusAnimationScheduler.animationState.value) + if (animationState == RunningChipAnim) return // skip status chip display time advanceTimeBy(DISPLAY_LENGTH + 1) - assertEquals(ANIMATING_OUT, systemStatusAnimationScheduler.getAnimationState()) + assertEquals(AnimatingOut, systemStatusAnimationScheduler.animationState.value) verify(listener, times(1)).onSystemEventAnimationFinish(anyBoolean()) - if (animationState == ANIMATING_OUT) return + if (animationState == AnimatingOut) return // skip disappear animation animatorTestRule.advanceTimeBy(DISAPPEAR_ANIMATION_DURATION) @@ -637,13 +640,13 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { private fun scheduleFakeEventWithView( desc: String?, view: BackgroundAnimatableView, - shouldAnnounceAccessibilityEvent: Boolean + shouldAnnounceAccessibilityEvent: Boolean, ) { val fakeEvent = FakeStatusEvent( viewCreator = { view }, contentDescription = desc, - shouldAnnounceAccessibilityEvent = shouldAnnounceAccessibilityEvent + shouldAnnounceAccessibilityEvent = shouldAnnounceAccessibilityEvent, ) systemStatusAnimationScheduler.onStatusEvent(fakeEvent) } @@ -668,7 +671,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { dumpManager, systemClock, CoroutineScope(StandardTestDispatcher(testScope.testScheduler)), - logger + logger, ) // add a mock listener systemStatusAnimationScheduler.addCallback(listener) -- GitLab From 90690102aa6f080e0a1db5846c28e505c519cbab Mon Sep 17 00:00:00 2001 From: Evan Laird Date: Mon, 21 Oct 2024 17:27:46 -0400 Subject: [PATCH 157/459] [sb] fix lint errors in SystemStatusAnimationSchedulerImplTest Bug: 364360986 Flag: EXEMPT lint fix Test: SystemStatusAnimationSchedulerImplTest Change-Id: Ia56f8ea62875a4f28d1f204bd21f6071f67c5bfb --- .../SystemStatusAnimationSchedulerImplTest.kt | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt index 9dc0dbb4b632..658fedf787d5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImplTest.kt @@ -39,18 +39,14 @@ import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationSt import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController import com.android.systemui.statusbar.window.StatusBarWindowControllerStore -import com.android.systemui.util.mockito.any -import com.android.systemui.util.mockito.eq -import com.android.systemui.util.mockito.mock -import com.android.systemui.util.mockito.whenever import com.android.systemui.util.time.FakeSystemClock -import junit.framework.Assert.assertEquals import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestScope import kotlinx.coroutines.test.advanceTimeBy import kotlinx.coroutines.test.runTest +import org.junit.Assert.assertEquals import org.junit.Before import org.junit.Rule import org.junit.Test @@ -61,6 +57,10 @@ import org.mockito.Mockito.never import org.mockito.Mockito.times import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import org.mockito.kotlin.any +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @RunWithLooper(setAsMainLooper = true) @@ -384,7 +384,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { val accessibilityDesc = "Some desc" val mockView = mock() val mockAnimatableView = - mock { whenever(view).thenReturn(mockView) } + mock { whenever(it.view).thenReturn(mockView) } scheduleFakeEventWithView( accessibilityDesc, @@ -403,7 +403,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { val accessibilityDesc = null val mockView = mock() val mockAnimatableView = - mock { whenever(view).thenReturn(mockView) } + mock { whenever(it.view).thenReturn(mockView) } scheduleFakeEventWithView( accessibilityDesc, @@ -422,7 +422,7 @@ class SystemStatusAnimationSchedulerImplTest : SysuiTestCase() { val accessibilityDesc = "something" val mockView = mock() val mockAnimatableView = - mock { whenever(view).thenReturn(mockView) } + mock { whenever(it.view).thenReturn(mockView) } scheduleFakeEventWithView( accessibilityDesc, -- GitLab From e639f5427a9ce8048e9bc5666ab86f3ba2bc5557 Mon Sep 17 00:00:00 2001 From: "Liana Kazanova (xWF)" Date: Mon, 21 Oct 2024 21:33:05 +0000 Subject: [PATCH 158/459] Revert "Fix perf regression VisualStabilityCoordinator" This reverts commit 95d3598ec4d28d5b4899c4109b4cd288d0875a67. Reason for revert: DroidMonitor: Potential culprit for http://b/374806085 - verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted. Change-Id: I14eadece21d48442581d75a7edbb2b383832003d --- .../VisualStabilityCoordinatorTest.java | 22 ++++++++++++------- .../VisualStabilityCoordinator.java | 22 ++++++------------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java index cfac486dd37c..ea5c29ef30aa 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinatorTest.java @@ -24,7 +24,6 @@ import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -66,7 +65,6 @@ import com.android.systemui.statusbar.notification.collection.listbuilder.plugga import com.android.systemui.statusbar.notification.collection.provider.VisualStabilityProvider; import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor; import com.android.systemui.statusbar.policy.HeadsUpManager; -import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.time.FakeSystemClock; @@ -100,7 +98,6 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { @Mock private VisibilityLocationProvider mVisibilityLocationProvider; @Mock private VisualStabilityProvider mVisualStabilityProvider; @Mock private VisualStabilityCoordinatorLogger mLogger; - @Mock private KeyguardStateController mKeyguardStateController; @Captor private ArgumentCaptor mWakefulnessObserverCaptor; @Captor private ArgumentCaptor mSBStateListenerCaptor; @@ -141,7 +138,6 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { mKosmos.getCommunalSceneInteractor(), mKosmos.getShadeInteractor(), mKosmos.getKeyguardTransitionInteractor(), - mKeyguardStateController, mLogger); mCoordinator.attach(mNotifPipeline); mTestScope.getTestScheduler().runCurrent(); @@ -526,13 +522,23 @@ public class VisualStabilityCoordinatorTest extends SysuiTestCase { @EnableFlags(Flags.FLAG_CHECK_LOCKSCREEN_GONE_TRANSITION) public void testNotLockscreenInGoneTransition_invalidationCalled() { // GIVEN visual stability is being maintained b/c animation is playing - doReturn(true).when(mKeyguardStateController).isKeyguardFadingAway(); - mCoordinator.mKeyguardFadeAwayAnimationCallback.onKeyguardFadingAwayChanged(); + mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava( + mTestScope, new TransitionStep( + KeyguardState.LOCKSCREEN, + KeyguardState.GONE, + 1f, + TransitionState.RUNNING), /* validateStep = */ false); + mTestScope.getTestScheduler().runCurrent(); assertFalse(mNotifStabilityManager.isPipelineRunAllowed()); // WHEN the animation has stopped playing - doReturn(false).when(mKeyguardStateController).isKeyguardFadingAway(); - mCoordinator.mKeyguardFadeAwayAnimationCallback.onKeyguardFadingAwayChanged(); + mKosmos.getKeyguardTransitionRepository().sendTransitionStepJava( + mTestScope, new TransitionStep( + KeyguardState.LOCKSCREEN, + KeyguardState.GONE, + 1f, + TransitionState.FINISHED), /* validateStep = */ false); + mTestScope.getTestScheduler().runCurrent(); // invalidate is called, b/c we were previously suppressing the pipeline from running verifyStabilityManagerWasInvalidated(times(1)); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java index 6edffc0b7542..8660cd117493 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/VisualStabilityCoordinator.java @@ -29,9 +29,11 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dump.DumpManager; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; +import com.android.systemui.keyguard.shared.model.Edge; import com.android.systemui.keyguard.shared.model.KeyguardState; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.scene.shared.model.Scenes; import com.android.systemui.shade.domain.interactor.ShadeAnimationInteractor; import com.android.systemui.shade.domain.interactor.ShadeInteractor; import com.android.systemui.statusbar.notification.VisibilityLocationProvider; @@ -44,7 +46,6 @@ import com.android.systemui.statusbar.notification.collection.provider.VisualSta import com.android.systemui.statusbar.notification.domain.interactor.SeenNotificationsInteractor; import com.android.systemui.statusbar.notification.shared.NotificationMinimalism; import com.android.systemui.statusbar.policy.HeadsUpManager; -import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.kotlin.BooleanFlowOperators; import com.android.systemui.util.kotlin.JavaAdapter; @@ -77,7 +78,6 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { private final CommunalSceneInteractor mCommunalSceneInteractor; private final ShadeInteractor mShadeInteractor; private final KeyguardTransitionInteractor mKeyguardTransitionInteractor; - private final KeyguardStateController mKeyguardStateController; private final VisualStabilityCoordinatorLogger mLogger; private boolean mSleepy = true; @@ -120,7 +120,6 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { CommunalSceneInteractor communalSceneInteractor, ShadeInteractor shadeInteractor, KeyguardTransitionInteractor keyguardTransitionInteractor, - KeyguardStateController keyguardStateController, VisualStabilityCoordinatorLogger logger) { mHeadsUpManager = headsUpManager; mShadeAnimationInteractor = shadeAnimationInteractor; @@ -134,7 +133,6 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { mCommunalSceneInteractor = communalSceneInteractor; mShadeInteractor = shadeInteractor; mKeyguardTransitionInteractor = keyguardTransitionInteractor; - mKeyguardStateController = keyguardStateController; mLogger = logger; dumpManager.registerDumpable(this); @@ -164,23 +162,17 @@ public class VisualStabilityCoordinator implements Coordinator, Dumpable { KeyguardState.LOCKSCREEN), this::onLockscreenKeyguardStateTransitionValueChanged); } - if (Flags.checkLockscreenGoneTransition()) { - mKeyguardStateController.addCallback(mKeyguardFadeAwayAnimationCallback); + mJavaAdapter.alwaysCollectFlow(mKeyguardTransitionInteractor.isInTransition( + Edge.create(KeyguardState.LOCKSCREEN, Scenes.Gone), + Edge.create(KeyguardState.LOCKSCREEN, KeyguardState.GONE)), + this::onLockscreenInGoneTransitionChanged); } + pipeline.setVisualStabilityManager(mNotifStabilityManager); } - final KeyguardStateController.Callback mKeyguardFadeAwayAnimationCallback = - new KeyguardStateController.Callback() { - @Override - public void onKeyguardFadingAwayChanged() { - onLockscreenInGoneTransitionChanged( - mKeyguardStateController.isKeyguardFadingAway()); - } - }; - // TODO(b/203826051): Ensure stability manager can allow reordering off-screen // HUNs to the top of the shade private final NotifStabilityManager mNotifStabilityManager = -- GitLab From 3ae88e64aadbc74ff3407e713344e7323a1247e5 Mon Sep 17 00:00:00 2001 From: mattsziklay Date: Thu, 26 Sep 2024 11:38:46 -0700 Subject: [PATCH 159/459] Set up status bar input layers on init. Improves performance by caching two status bar input layer views on init of the view model. This avoids creating and destroying the views every time a task appears or disappears. Instead of doing that, the AppHandleViewHolder sets the input layer's position and touch/hover listeners as needed. Bug: 369465173 Bug: 369534904 Test: ABTD perf metrics Flag: com.android.window.flags.enable_handle_input_fix Change-Id: If9974b363e4787f566167c28f2159495593f87a1 --- .../DesktopModeWindowDecorViewModel.java | 31 ++++- .../DesktopModeWindowDecoration.java | 27 +++- .../DesktopStatusBarInputLayerSupplier.kt | 117 ++++++++++++++++++ .../AdditionalSystemViewContainer.kt | 92 ++++++++------ .../viewholder/AppHandleViewHolder.kt | 109 ++++++++-------- .../DesktopModeWindowDecorViewModelTests.kt | 4 +- .../DesktopModeWindowDecorationTests.java | 10 +- 7 files changed, 272 insertions(+), 118 deletions(-) create mode 100644 libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopStatusBarInputLayerSupplier.kt diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java index a06b4a2e09d4..bfddaaa34132 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModel.java @@ -128,6 +128,7 @@ import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; import com.android.wm.shell.windowdecor.DesktopModeWindowDecoration.ExclusionRegionListener; +import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer; import com.android.wm.shell.windowdecor.extension.InsetsStateKt; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; @@ -178,6 +179,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, private boolean mTransitionDragActive; private SparseArray mEventReceiversByDisplay = new SparseArray<>(); + private DesktopStatusBarInputLayerSupplier mStatusBarInputLayerSupplier; private final ExclusionRegionListener mExclusionRegionListener = new ExclusionRegionListenerImpl(); @@ -411,7 +413,11 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, return Unit.INSTANCE; }); } - mFocusTransitionObserver.setLocalFocusTransitionListener(this, mMainExecutor); + if (Flags.enableHandleInputFix()) { + mStatusBarInputLayerSupplier = + new DesktopStatusBarInputLayerSupplier(mContext, mMainHandler); + mFocusTransitionObserver.setLocalFocusTransitionListener(this, mMainExecutor); + } } @Override @@ -467,6 +473,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, removeTaskFromEventReceiver(oldTaskInfo.displayId); incrementEventReceiverTasks(taskInfo.displayId); } + decoration.setStatusBarInputLayer(getStatusBarInputLayer(taskInfo)); decoration.relayout(taskInfo, decoration.mHasGlobalFocus); mActivityOrientationChangeHandler.ifPresent(handler -> handler.handleActivityOrientationChange(oldTaskInfo, taskInfo)); @@ -505,6 +512,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, if (decoration == null) { createWindowDecoration(taskInfo, taskSurface, startT, finishT); } else { + decoration.setStatusBarInputLayer(getStatusBarInputLayer(taskInfo)); decoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */, mFocusTransitionObserver.hasGlobalFocus(taskInfo)); @@ -644,7 +652,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, decoration.closeHandleMenu(); // When the app enters split-select, the handle will no longer be visible, meaning // we shouldn't receive input for it any longer. - decoration.disposeStatusBarInputLayer(); + decoration.detachStatusBarInputLayer(); mDesktopTasksController.requestSplit(decoration.mTaskInfo, false /* leftOrTop */); } @@ -1280,8 +1288,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // should not be receiving any input. if (resultType == TO_SPLIT_LEFT_INDICATOR || resultType == TO_SPLIT_RIGHT_INDICATOR) { - relevantDecor.disposeStatusBarInputLayer(); - // We should also dispose the other split task's input layer if + relevantDecor.detachStatusBarInputLayer(); + // We should also detach the other split task's input layer if // applicable. final int splitPosition = mSplitScreenController .getSplitPosition(relevantDecor.mTaskInfo.taskId); @@ -1294,7 +1302,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mSplitScreenController.getTaskInfo(oppositePosition); if (oppositeTaskInfo != null) { mWindowDecorByTaskId.get(oppositeTaskInfo.taskId) - .disposeStatusBarInputLayer(); + .detachStatusBarInputLayer(); } } } @@ -1538,6 +1546,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, touchEventListener, touchEventListener, touchEventListener, touchEventListener); windowDecoration.setExclusionRegionListener(mExclusionRegionListener); windowDecoration.setDragPositioningCallback(taskPositioner); + windowDecoration.setStatusBarInputLayer(getStatusBarInputLayer(taskInfo)); windowDecoration.relayout(taskInfo, startT, finishT, false /* applyStartTransactionOnDraw */, false /* shouldSetTaskPositionAndCrop */, mFocusTransitionObserver.hasGlobalFocus(taskInfo)); @@ -1546,6 +1555,18 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, } } + /** Decide which cached status bar input layer should be used for a decoration. */ + private AdditionalSystemViewContainer getStatusBarInputLayer( + RunningTaskInfo taskInfo + ) { + if (mStatusBarInputLayerSupplier == null) return null; + return mStatusBarInputLayerSupplier.getStatusBarInputLayer( + taskInfo, + mSplitScreenController.getSplitPosition(taskInfo.taskId), + mSplitScreenController.isLeftRightSplit() + ); + } + private RunningTaskInfo getOtherSplitTask(int taskId) { @SplitPosition int remainingTaskPosition = mSplitScreenController .getSplitPosition(taskId) == SPLIT_POSITION_BOTTOM_OR_RIGHT diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 6eb20b9e3ae5..2b08ba0d7ab2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -101,6 +101,7 @@ import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.shared.desktopmode.DesktopModeTransitionSource; import com.android.wm.shell.shared.desktopmode.ManageWindowsViewContainer; import com.android.wm.shell.splitscreen.SplitScreenController; +import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer; import com.android.wm.shell.windowdecor.extension.TaskInfoKt; import com.android.wm.shell.windowdecor.viewholder.AppHandleViewHolder; import com.android.wm.shell.windowdecor.viewholder.AppHeaderViewHolder; @@ -197,6 +198,7 @@ public class DesktopModeWindowDecoration extends WindowDecoration = mutableListOf() + + init { + // Post this as creation of the input layer views is a relatively expensive operation. + handler.post { + repeat(TOTAL_INPUT_LAYERS) { + inputLayers.add(createInputLayer()) + } + } + } + + private fun createInputLayer(): AdditionalSystemViewContainer { + val lp = WindowManager.LayoutParams( + WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL, + WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, + PixelFormat.TRANSPARENT + ) + lp.title = "Desktop status bar input layer" + lp.gravity = Gravity.LEFT or Gravity.TOP + lp.setTrustedOverlay() + + // Make this window a spy window to enable it to pilfer pointers from the system-wide + // gesture listener that receives events before window. This is to prevent notification + // shade gesture when we swipe down to enter desktop. + lp.inputFeatures = WindowManager.LayoutParams.INPUT_FEATURE_SPY + lp.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + val view = View(context) + view.visibility = View.INVISIBLE + return AdditionalSystemViewContainer( + WindowManagerWrapper( + context.getSystemService(WindowManager::class.java) + ), + view, + lp + ) + } + + /** + * Decide which cached status bar input layer should be used for a decoration, if any. + * + * [splitPosition] and [isLeftRightSplit] are used to determine which input layer we use. + * The first one is reserved for fullscreen tasks or tasks in top/left split, + * while the second one is exclusively used for tasks in right split stage. Note we care about + * left-right vs top-bottom split as the bottom stage should not use an input layer. + */ + fun getStatusBarInputLayer( + taskInfo: RunningTaskInfo, + @SplitScreenConstants.SplitPosition splitPosition: Int, + isLeftRightSplit: Boolean + ): AdditionalSystemViewContainer? { + if (!taskInfo.isVisibleRequested) return null + // Fullscreen and top/left split tasks will use the first input layer. + if (taskInfo.windowingMode == WindowConfiguration.WINDOWING_MODE_FULLSCREEN + || splitPosition == SplitScreenConstants.SPLIT_POSITION_TOP_OR_LEFT + ) { + return inputLayers[LEFT_TOP_INPUT_LAYER] + } + // Right split tasks will use the second one. + if (isLeftRightSplit && splitPosition == SplitScreenConstants.SPLIT_POSITION_BOTTOM_OR_RIGHT + ) { + return inputLayers[RIGHT_SPLIT_INPUT_LAYER] + } + // Which leaves bottom split and freeform tasks, which do not need an input layer + // as the status bar is not blocking them. + return null + } + + companion object { + private const val TOTAL_INPUT_LAYERS = 2 + // Input layer index for fullscreen tasks and tasks in top-left split + private const val LEFT_TOP_INPUT_LAYER = 0 + // Input layer index for tasks in right split stage. Does not include bottom split as that + // stage is not blocked by status bar. + private const val RIGHT_SPLIT_INPUT_LAYER = 1 + } +} diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt index 8b6aaaf619e0..1451f363ec73 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/additionalviewcontainer/AdditionalSystemViewContainer.kt @@ -23,8 +23,8 @@ import android.view.Gravity import android.view.LayoutInflater import android.view.SurfaceControl import android.view.View -import android.view.WindowInsets import android.view.WindowManager +import android.view.WindowManager.LayoutParams import com.android.wm.shell.windowdecor.WindowManagerWrapper /** @@ -33,27 +33,11 @@ import com.android.wm.shell.windowdecor.WindowManagerWrapper */ class AdditionalSystemViewContainer( private val windowManagerWrapper: WindowManagerWrapper, - taskId: Int, - x: Int, - y: Int, - width: Int, - height: Int, - flags: Int, - @WindowInsets.Type.InsetsType forciblyShownTypes: Int = 0, - override val view: View + override val view: View, + val lp: LayoutParams ) : AdditionalViewContainer() { - val lp: WindowManager.LayoutParams = WindowManager.LayoutParams( - width, height, x, y, - WindowManager.LayoutParams.TYPE_STATUS_BAR_ADDITIONAL, - flags, - PixelFormat.TRANSPARENT - ).apply { - title = "Additional view container of Task=$taskId" - gravity = Gravity.LEFT or Gravity.TOP - setTrustedOverlay() - this.forciblyShownTypes = forciblyShownTypes - } + /** Provide a layout id of a view to inflate for this view container. */ constructor( context: Context, windowManagerWrapper: WindowManagerWrapper, @@ -66,15 +50,30 @@ class AdditionalSystemViewContainer( @LayoutRes layoutId: Int ) : this( windowManagerWrapper = windowManagerWrapper, - taskId = taskId, - x = x, - y = y, - width = width, - height = height, - flags = flags, - view = LayoutInflater.from(context).inflate(layoutId, null /* parent */) + view = LayoutInflater.from(context).inflate(layoutId, null /* parent */), + lp = createLayoutParams(x, y, width, height, flags, taskId) ) + /** Provide a view directly for this view container */ + constructor( + windowManagerWrapper: WindowManagerWrapper, + taskId: Int, + x: Int, + y: Int, + width: Int, + height: Int, + flags: Int, + view: View, + forciblyShownTypes: Int = 0 + ) : this( + windowManagerWrapper = windowManagerWrapper, + view = view, + lp = createLayoutParams(x, y, width, height, flags, taskId).apply { + this.forciblyShownTypes = forciblyShownTypes + } + ) + + /** Do not supply a view at all, instead creating the view container with a basic view. */ constructor( context: Context, windowManagerWrapper: WindowManagerWrapper, @@ -86,12 +85,7 @@ class AdditionalSystemViewContainer( flags: Int ) : this( windowManagerWrapper = windowManagerWrapper, - taskId = taskId, - x = x, - y = y, - width = width, - height = height, - flags = flags, + lp = createLayoutParams(x, y, width, height, flags, taskId), view = View(context) ) @@ -104,7 +98,7 @@ class AdditionalSystemViewContainer( } override fun setPosition(t: SurfaceControl.Transaction, x: Float, y: Float) { - val lp = (view.layoutParams as WindowManager.LayoutParams).apply { + lp.apply { this.x = x.toInt() this.y = y.toInt() } @@ -124,13 +118,29 @@ class AdditionalSystemViewContainer( ): AdditionalSystemViewContainer = AdditionalSystemViewContainer( windowManagerWrapper = windowManagerWrapper, - taskId = taskId, - x = x, - y = y, - width = width, - height = height, - flags = flags, - view = view + view = view, + lp = createLayoutParams(x, y, width, height, flags, taskId) ) } + companion object { + fun createLayoutParams( + x: Int, + y: Int, + width: Int, + height: Int, + flags: Int, + taskId: Int + ): LayoutParams { + return LayoutParams( + width, height, x, y, + LayoutParams.TYPE_STATUS_BAR_ADDITIONAL, + flags, + PixelFormat.TRANSPARENT + ).apply { + title = "Additional view container of Task=$taskId" + gravity = Gravity.LEFT or Gravity.TOP + setTrustedOverlay() + } + } + } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt index b5700ffb046b..b43a9839f042 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/viewholder/AppHandleViewHolder.kt @@ -36,13 +36,10 @@ import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction import android.widget.ImageButton import androidx.core.view.ViewCompat import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat -import com.android.internal.policy.SystemBarUtils -import com.android.window.flags.Flags import com.android.wm.shell.R import com.android.wm.shell.shared.animation.Interpolators import com.android.wm.shell.windowdecor.WindowManagerWrapper import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalSystemViewContainer -import com.android.wm.shell.windowdecor.viewholder.WindowDecorationViewHolder.Data /** * A desktop mode window decoration used when the window is in full "focus" (i.e. fullscreen/split). @@ -69,10 +66,12 @@ internal class AppHandleViewHolder( ) : Data() private lateinit var taskInfo: RunningTaskInfo + private val position: Point = Point() + private var width: Int = 0 + private var height: Int = 0 private val captionView: View = rootView.requireViewById(R.id.desktop_mode_caption) private val captionHandle: ImageButton = rootView.requireViewById(R.id.caption_handle) private val inputManager = context.getSystemService(InputManager::class.java) - private var statusBarInputLayerExists = false // An invisible View that takes up the same coordinates as captionHandle but is layered // above the status bar. The purpose of this View is to receive input intended for @@ -112,21 +111,54 @@ internal class AppHandleViewHolder( ) { captionHandle.imageTintList = ColorStateList.valueOf(getCaptionHandleBarColor(taskInfo)) this.taskInfo = taskInfo - // If handle is not in status bar region(i.e., bottom stage in vertical split), - // do not create an input layer - if (position.y >= SystemBarUtils.getStatusBarHeight(context)) return - if (!isCaptionVisible && statusBarInputLayerExists) { - disposeStatusBarInputLayer() + this.position.set(position) + this.width = width + this.height = height + if (!isCaptionVisible && statusBarInputLayer != null) { + detachStatusBarInputLayer() return } - // Input layer view creation / modification takes a significant amount of time; + } + + fun bindStatusBarInputLayer( + statusBarLayer: AdditionalSystemViewContainer + ) { + // Input layer view modification takes a significant amount of time; // post them so we don't hold up DesktopModeWindowDecoration#relayout. - if (statusBarInputLayerExists) { + if (statusBarLayer == statusBarInputLayer) { handler.post { updateStatusBarInputLayer(position) } - } else { - // Input layer is created on a delay; prevent multiple from being created. - statusBarInputLayerExists = true - handler.post { createStatusBarInputLayer(position, width, height) } + return + } + // Remove the old input layer when changing to a new one. + if (statusBarInputLayer != null) detachStatusBarInputLayer() + if (statusBarLayer.view.visibility == View.INVISIBLE) { + statusBarLayer.view.visibility = View.VISIBLE + } + statusBarInputLayer = statusBarLayer + statusBarInputLayer?.let { + inputLayer -> setupAppHandleA11y(inputLayer.view) + } + handler.post { + val view = statusBarInputLayer?.view + ?: error("Unable to find statusBarInputLayer View") + // Caption handle is located within the status bar region, meaning the + // DisplayPolicy will attempt to transfer this input to status bar if it's + // a swipe down. Pilfer here to keep the gesture in handle alone. + view.setOnTouchListener { v, event -> + if (event.actionMasked == ACTION_DOWN) { + inputManager.pilferPointers(v.viewRootImpl.inputToken) + } + captionHandle.dispatchTouchEvent(event) + return@setOnTouchListener true + } + view.setOnHoverListener { _, event -> + captionHandle.onHoverEvent(event) + } + val lp = statusBarInputLayer?.view?.layoutParams as WindowManager.LayoutParams + lp.x = position.x + lp.y = position.y + lp.width = width + lp.height = height } } @@ -138,40 +170,6 @@ internal class AppHandleViewHolder( animateCaptionHandleAlpha(startValue = 0f, endValue = 1f) } - private fun createStatusBarInputLayer(handlePosition: Point, - handleWidth: Int, - handleHeight: Int) { - if (!Flags.enableHandleInputFix()) return - statusBarInputLayer = AdditionalSystemViewContainer(context, windowManagerWrapper, - taskInfo.taskId, handlePosition.x, handlePosition.y, handleWidth, handleHeight, - WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE - ) - val view = statusBarInputLayer?.view ?: error("Unable to find statusBarInputLayer View") - val lp = statusBarInputLayer?.lp ?: error("Unable to find statusBarInputLayer " + - "LayoutParams") - lp.title = "Handle Input Layer of task " + taskInfo.taskId - lp.setTrustedOverlay() - // Make this window a spy window to enable it to pilfer pointers from the system-wide - // gesture listener that receives events before window. This is to prevent notification - // shade gesture when we swipe down to enter desktop. - lp.inputFeatures = WindowManager.LayoutParams.INPUT_FEATURE_SPY - view.setOnHoverListener { _, event -> - captionHandle.onHoverEvent(event) - } - // Caption handle is located within the status bar region, meaning the - // DisplayPolicy will attempt to transfer this input to status bar if it's - // a swipe down. Pilfer here to keep the gesture in handle alone. - view.setOnTouchListener { v, event -> - if (event.actionMasked == ACTION_DOWN) { - inputManager.pilferPointers(v.viewRootImpl.inputToken) - } - captionHandle.dispatchTouchEvent(event) - return@setOnTouchListener true - } - setupAppHandleA11y(view) - windowManagerWrapper.updateViewLayout(view, lp) - } - private fun setupAppHandleA11y(view: View) { view.accessibilityDelegate = object : View.AccessibilityDelegate() { override fun onInitializeAccessibilityNodeInfo( @@ -224,15 +222,12 @@ internal class AppHandleViewHolder( } /** - * Remove the input layer from [WindowManager]. Should be used when caption handle - * is not visible. + * Remove the input listeners from the input layer and remove it from this view holder. */ - fun disposeStatusBarInputLayer() { - statusBarInputLayerExists = false - handler.post { - statusBarInputLayer?.releaseView() - statusBarInputLayer = null - } + fun detachStatusBarInputLayer() { + statusBarInputLayer?.view?.setOnTouchListener(null) + statusBarInputLayer?.view?.setOnHoverListener(null) + statusBarInputLayer = null } private fun getCaptionHandleBarColor(taskInfo: RunningTaskInfo): Int { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index 175fbd2396e3..470974e80c6b 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -909,7 +909,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { } @Test - fun testDecor_onClickToSplitScreen_disposesStatusBarInputLayer() { + fun testDecor_onClickToSplitScreen_detachesStatusBarInputLayer() { val toSplitScreenListenerCaptor = forClass(Function0::class.java) as ArgumentCaptor> val decor = createOpenTaskDecoration( @@ -919,7 +919,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { toSplitScreenListenerCaptor.value.invoke() - verify(decor).disposeStatusBarInputLayer() + verify(decor).detachStatusBarInputLayer() } @Test diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index 320887212f54..3ec6eaaf0d91 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -49,7 +49,6 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.kotlin.VerificationKt.times; import android.app.ActivityManager; import android.app.assist.AssistContent; @@ -847,8 +846,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { ArgumentCaptor runnableArgument = ArgumentCaptor.forClass(Runnable.class); spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); - // Once for view host, the other for the AppHandle input layer. - verify(mMockHandler, times(2)).post(runnableArgument.capture()); + verify(mMockHandler).post(runnableArgument.capture()); runnableArgument.getValue().run(); verify(mMockSurfaceControlViewHostFactory).create(any(), any(), any()); } @@ -875,8 +873,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); ArgumentCaptor runnableArgument = ArgumentCaptor.forClass(Runnable.class); spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); - // Once for view host, the other for the AppHandle input layer. - verify(mMockHandler, times(2)).post(runnableArgument.capture()); + verify(mMockHandler).post(runnableArgument.capture()); spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); @@ -890,8 +887,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { taskInfo.configuration.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN); ArgumentCaptor runnableArgument = ArgumentCaptor.forClass(Runnable.class); spyWindowDecor.relayout(taskInfo, true /* hasGlobalFocus */); - // Once for view host, the other for the AppHandle input layer. - verify(mMockHandler, times(2)).post(runnableArgument.capture()); + verify(mMockHandler).post(runnableArgument.capture()); spyWindowDecor.close(); -- GitLab From c8b0cb4b80d45e55ec9069498cad3540c5f5eaed Mon Sep 17 00:00:00 2001 From: Ziyang Cheng Date: Fri, 11 Oct 2024 17:48:28 +0000 Subject: [PATCH 160/459] Use byte array api to read from/write to Parcel. Bug: 368042125 Flag: android.media.soundtrigger.manager_api Test: atest android.soundtrigger.cts.SoundTriggerTest. Change-Id: I7c28d3e096779e8e32db621d8bafc40865d51a67 --- core/java/android/hardware/soundtrigger/SoundTrigger.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/java/android/hardware/soundtrigger/SoundTrigger.java b/core/java/android/hardware/soundtrigger/SoundTrigger.java index a1e7567faead..c6fd0ee3c80d 100644 --- a/core/java/android/hardware/soundtrigger/SoundTrigger.java +++ b/core/java/android/hardware/soundtrigger/SoundTrigger.java @@ -1627,7 +1627,7 @@ public class SoundTrigger { boolean allowMultipleTriggers = in.readBoolean(); KeyphraseRecognitionExtra[] keyphrases = in.createTypedArray(KeyphraseRecognitionExtra.CREATOR); - byte[] data = in.readBlob(); + byte[] data = in.createByteArray(); int audioCapabilities = in.readInt(); return new RecognitionConfig(captureRequested, allowMultipleTriggers, keyphrases, data, audioCapabilities); @@ -1638,7 +1638,7 @@ public class SoundTrigger { dest.writeBoolean(mCaptureRequested); dest.writeBoolean(mAllowMultipleTriggers); dest.writeTypedArray(mKeyphrases, flags); - dest.writeBlob(mData); + dest.writeByteArray(mData); dest.writeInt(mAudioCapabilities); } -- GitLab From 6c09687218175eb7da04b2c7bb2c150d4d8eef18 Mon Sep 17 00:00:00 2001 From: Beth Thibodeau Date: Mon, 21 Oct 2024 23:03:20 +0000 Subject: [PATCH 161/459] Add flag for media action button placement update This will flag SysUI's implementation of the proposed Media3 API for action button placement preferences Bug: 360196209 Change-Id: I0c51727cd77a57e4a3d889842612d7c977ae5071 Flag: com.android.systemui.media_controls_button_media3_placement --- packages/SystemUI/aconfig/systemui.aconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 0b1811079155..a984b7d43bb6 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1147,6 +1147,13 @@ flag { bug: "360196209" } +flag { + name: "media_controls_button_media3_placement" + namespace: "systemui" + description: "Use media3 API for action button placement preferences" + bug: "360196209" +} + flag { name: "media_controls_drawables_reuse" namespace: "systemui" -- GitLab From 75007054e924e66e496f79e5b7f752584bf2759e Mon Sep 17 00:00:00 2001 From: mattsziklay Date: Sun, 20 Oct 2024 21:47:48 -0700 Subject: [PATCH 162/459] Crop snapshot icons for Manage Windows menu. Crops the provided task snapshot bitmaps to match the aspect ratio of the icon buttons in the Manage Windows menu to prevent stretching the bitmaps when they are particularly wide or tall. Bug: 337915660 Bug: 372299112 Test: Manual Flag: com.android.window.flags.enable_desktop_windowing_multi_instance_features Change-Id: I15880d31328d547c547411449418d30602a98d6f --- .../desktopmode/ManageWindowsViewContainer.kt | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/ManageWindowsViewContainer.kt b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/ManageWindowsViewContainer.kt index 79becb0a2e20..0e8e90467745 100644 --- a/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/ManageWindowsViewContainer.kt +++ b/libs/WindowManager/Shell/shared/src/com/android/wm/shell/shared/desktopmode/ManageWindowsViewContainer.kt @@ -122,7 +122,8 @@ abstract class ManageWindowsViewContainer( snapshot.hardwareBuffer, snapshot.colorSpace ) - val scaledSnapshotBitmap = snapshotBitmap?.let { + val croppedBitmap = snapshotBitmap?.let { cropBitmap(it) } + val scaledSnapshotBitmap = croppedBitmap?.let { Bitmap.createScaledBitmap( it, instanceIconWidth.toInt(), instanceIconHeight.toInt(), true /* filter */ ) @@ -160,6 +161,35 @@ abstract class ManageWindowsViewContainer( menuHeight += iconMargin.toInt() } + private fun cropBitmap( + bitmapToCrop: Bitmap + ): Bitmap { + val ratioToMatch = ICON_WIDTH_DP / ICON_HEIGHT_DP + val bitmapWidth = bitmapToCrop.width + val bitmapHeight = bitmapToCrop.height + if (bitmapWidth > bitmapHeight * ratioToMatch) { + // Crop based on height + val newWidth = bitmapHeight * ratioToMatch + return Bitmap.createBitmap( + bitmapToCrop, + ((bitmapWidth - newWidth) / 2).toInt(), + 0, + newWidth.toInt(), + bitmapHeight + ) + } else { + // Crop based on width + val newHeight = bitmapWidth / ratioToMatch + return Bitmap.createBitmap( + bitmapToCrop, + 0, + ((bitmapHeight - newHeight) / 2).toInt(), + bitmapWidth, + newHeight.toInt() + ) + } + } + companion object { private const val MENU_RADIUS_DP = 26f private const val ICON_WIDTH_DP = 204f -- GitLab From 0211daf74be1d66363e01ad4c291d013db6c1b76 Mon Sep 17 00:00:00 2001 From: Xiang Wang Date: Mon, 23 Sep 2024 16:29:08 -0700 Subject: [PATCH 163/459] Add support for thermal threshold callback Bug: 360486877 Flag: android.os.allow_thermal_thresholds_callback Test: atest ThermalManagerServiceTest ThermalManagerServiceMockingTest Change-Id: Ic8e0a53b2a306ae74e75b9c3a5dafda723840448 --- Android.bp | 2 +- core/java/android/os/flags.aconfig | 8 + .../server/power/ThermalManagerService.java | 182 ++++++++++-------- services/core/jni/Android.bp | 2 +- .../ThermalManagerServiceMockingTest.java | 89 +++++++-- .../power/ThermalManagerServiceTest.java | 74 ++++--- 6 files changed, 237 insertions(+), 120 deletions(-) diff --git a/Android.bp b/Android.bp index d4776f53cfc4..cd56c858e4db 100644 --- a/Android.bp +++ b/Android.bp @@ -109,7 +109,7 @@ filegroup { ":android.hardware.radio.voice-V3-java-source", ":android.hardware.security.keymint-V3-java-source", ":android.hardware.security.secureclock-V1-java-source", - ":android.hardware.thermal-V2-java-source", + ":android.hardware.thermal-V3-java-source", ":android.hardware.tv.tuner-V3-java-source", ":android.security.apc-java-source", ":android.security.authorization-java-source", diff --git a/core/java/android/os/flags.aconfig b/core/java/android/os/flags.aconfig index c7cc653f4178..9c83bc2c88ec 100644 --- a/core/java/android/os/flags.aconfig +++ b/core/java/android/os/flags.aconfig @@ -90,6 +90,14 @@ flag { bug: "288119641" } +flag { + name: "allow_thermal_thresholds_callback" + is_exported: true + namespace: "game" + description: "Enable thermal threshold callback" + bug: "360486877" +} + flag { name: "android_os_build_vanilla_ice_cream" is_exported: true diff --git a/services/core/java/com/android/server/power/ThermalManagerService.java b/services/core/java/com/android/server/power/ThermalManagerService.java index dc6b1644db4d..78bc06c27130 100644 --- a/services/core/java/com/android/server/power/ThermalManagerService.java +++ b/services/core/java/com/android/server/power/ThermalManagerService.java @@ -31,6 +31,7 @@ import android.content.Context; import android.hardware.thermal.IThermal; import android.hardware.thermal.IThermalChangedCallback; import android.hardware.thermal.TemperatureThreshold; +import android.hardware.thermal.TemperatureType; import android.hardware.thermal.ThrottlingSeverity; import android.hardware.thermal.V1_0.ThermalStatus; import android.hardware.thermal.V1_0.ThermalStatusCode; @@ -134,6 +135,31 @@ public class ThermalManagerService extends SystemService { @VisibleForTesting final TemperatureWatcher mTemperatureWatcher = new TemperatureWatcher(); + private final ThermalHalWrapper.WrapperThermalChangedCallback mWrapperCallback = + new ThermalHalWrapper.WrapperThermalChangedCallback() { + @Override + public void onTemperatureChanged(Temperature temperature) { + final long token = Binder.clearCallingIdentity(); + try { + ThermalManagerService.this.onTemperatureChanged(temperature, true); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void onThresholdChanged(TemperatureThreshold threshold) { + final long token = Binder.clearCallingIdentity(); + try { + synchronized (mTemperatureWatcher.mSamples) { + mTemperatureWatcher.updateTemperatureThresholdLocked(threshold, true); + } + } finally { + Binder.restoreCallingIdentity(token); + } + } + }; + private final Context mContext; public ThermalManagerService(Context context) { @@ -146,7 +172,7 @@ public class ThermalManagerService extends SystemService { mContext = context; mHalWrapper = halWrapper; if (halWrapper != null) { - halWrapper.setCallback(this::onTemperatureChangedCallback); + halWrapper.setCallback(mWrapperCallback); } mStatus = Temperature.THROTTLING_NONE; } @@ -171,19 +197,19 @@ public class ThermalManagerService extends SystemService { // Connect to HAL and post to listeners. boolean halConnected = (mHalWrapper != null); if (!halConnected) { - mHalWrapper = new ThermalHalAidlWrapper(this::onTemperatureChangedCallback); + mHalWrapper = new ThermalHalAidlWrapper(mWrapperCallback); halConnected = mHalWrapper.connectToHal(); } if (!halConnected) { - mHalWrapper = new ThermalHal20Wrapper(this::onTemperatureChangedCallback); + mHalWrapper = new ThermalHal20Wrapper(mWrapperCallback); halConnected = mHalWrapper.connectToHal(); } if (!halConnected) { - mHalWrapper = new ThermalHal11Wrapper(this::onTemperatureChangedCallback); + mHalWrapper = new ThermalHal11Wrapper(mWrapperCallback); halConnected = mHalWrapper.connectToHal(); } if (!halConnected) { - mHalWrapper = new ThermalHal10Wrapper(this::onTemperatureChangedCallback); + mHalWrapper = new ThermalHal10Wrapper(mWrapperCallback); halConnected = mHalWrapper.connectToHal(); } if (!halConnected) { @@ -200,7 +226,7 @@ public class ThermalManagerService extends SystemService { onTemperatureChanged(temperatures.get(i), false); } onTemperatureMapChangedLocked(); - mTemperatureWatcher.updateThresholds(); + mTemperatureWatcher.getAndUpdateThresholds(); mHalReady.set(true); } } @@ -335,16 +361,6 @@ public class ThermalManagerService extends SystemService { } } - /* HwBinder callback **/ - private void onTemperatureChangedCallback(Temperature temperature) { - final long token = Binder.clearCallingIdentity(); - try { - onTemperatureChanged(temperature, true); - } finally { - Binder.restoreCallingIdentity(token); - } - } - private void registerStatsCallbacks() { final StatsManager statsManager = mContext.getSystemService(StatsManager.class); if (statsManager != null) { @@ -924,19 +940,19 @@ public class ThermalManagerService extends SystemService { /** Lock to protect HAL handle. */ protected final Object mHalLock = new Object(); - @FunctionalInterface - interface TemperatureChangedCallback { - void onValues(Temperature temperature); + interface WrapperThermalChangedCallback { + void onTemperatureChanged(Temperature temperature); + void onThresholdChanged(TemperatureThreshold threshold); } /** Temperature callback. */ - protected TemperatureChangedCallback mCallback; + protected WrapperThermalChangedCallback mCallback; /** Cookie for matching the right end point. */ protected static final int THERMAL_HAL_DEATH_COOKIE = 5612; @VisibleForTesting - protected void setCallback(TemperatureChangedCallback cb) { + protected void setCallback(WrapperThermalChangedCallback cb) { mCallback = cb; } @@ -959,7 +975,7 @@ public class ThermalManagerService extends SystemService { List temperatures = getCurrentTemperatures(false, 0); final int count = temperatures.size(); for (int i = 0; i < count; i++) { - mCallback.onValues(temperatures.get(i)); + mCallback.onTemperatureChanged(temperatures.get(i)); } } } @@ -985,31 +1001,42 @@ public class ThermalManagerService extends SystemService { private IThermal mInstance = null; /** Callback for Thermal HAL AIDL. */ - private final IThermalChangedCallback mThermalChangedCallback = + private final IThermalChangedCallback mThermalCallbackAidl = new IThermalChangedCallback.Stub() { - @Override public void notifyThrottling( - android.hardware.thermal.Temperature temperature) - throws RemoteException { + @Override + public void notifyThrottling( + android.hardware.thermal.Temperature temperature) { Temperature svcTemperature = new Temperature(temperature.value, temperature.type, temperature.name, temperature.throttlingStatus); final long token = Binder.clearCallingIdentity(); try { - mCallback.onValues(svcTemperature); + mCallback.onTemperatureChanged(svcTemperature); } finally { Binder.restoreCallingIdentity(token); } } - @Override public int getInterfaceVersion() throws RemoteException { - return this.VERSION; - } + @Override + public void notifyThresholdChanged(TemperatureThreshold threshold) { + if (Flags.allowThermalThresholdsCallback()) { + if (threshold.type == TemperatureType.SKIN) { + mCallback.onThresholdChanged(threshold); + } + } + } - @Override public String getInterfaceHash() throws RemoteException { - return this.HASH; - } - }; + @Override + public int getInterfaceVersion() throws RemoteException { + return this.VERSION; + } - ThermalHalAidlWrapper(TemperatureChangedCallback callback) { + @Override + public String getInterfaceHash() throws RemoteException { + return this.HASH; + } + }; + + ThermalHalAidlWrapper(WrapperThermalChangedCallback callback) { mCallback = callback; } @@ -1153,7 +1180,7 @@ public class ThermalManagerService extends SystemService { @VisibleForTesting void registerThermalChangedCallback() { try { - mInstance.registerThermalChangedCallback(mThermalChangedCallback); + mInstance.registerThermalChangedCallback(mThermalCallbackAidl); } catch (IllegalArgumentException | IllegalStateException e) { Slog.e(TAG, "Couldn't registerThermalChangedCallback due to invalid status", e); @@ -1185,7 +1212,7 @@ public class ThermalManagerService extends SystemService { @GuardedBy("mHalLock") private android.hardware.thermal.V1_0.IThermal mThermalHal10 = null; - ThermalHal10Wrapper(TemperatureChangedCallback callback) { + ThermalHal10Wrapper(WrapperThermalChangedCallback callback) { mCallback = callback; } @@ -1317,14 +1344,14 @@ public class ThermalManagerService extends SystemService { : Temperature.THROTTLING_NONE); final long token = Binder.clearCallingIdentity(); try { - mCallback.onValues(thermalSvcTemp); + mCallback.onTemperatureChanged(thermalSvcTemp); } finally { Binder.restoreCallingIdentity(token); } } }; - ThermalHal11Wrapper(TemperatureChangedCallback callback) { + ThermalHal11Wrapper(WrapperThermalChangedCallback callback) { mCallback = callback; } @@ -1455,14 +1482,14 @@ public class ThermalManagerService extends SystemService { temperature.throttlingStatus); final long token = Binder.clearCallingIdentity(); try { - mCallback.onValues(thermalSvcTemp); + mCallback.onTemperatureChanged(thermalSvcTemp); } finally { Binder.restoreCallingIdentity(token); } } }; - ThermalHal20Wrapper(TemperatureChangedCallback callback) { + ThermalHal20Wrapper(WrapperThermalChangedCallback callback) { mCallback = callback; } @@ -1627,52 +1654,57 @@ public class ThermalManagerService extends SystemService { @VisibleForTesting long mInactivityThresholdMillis = INACTIVITY_THRESHOLD_MILLIS; - void updateThresholds() { + void getAndUpdateThresholds() { List thresholds = mHalWrapper.getTemperatureThresholds(true, Temperature.TYPE_SKIN); synchronized (mSamples) { if (Flags.allowThermalHeadroomThresholds()) { Arrays.fill(mHeadroomThresholds, Float.NaN); } - for (int t = 0; t < thresholds.size(); ++t) { - TemperatureThreshold threshold = thresholds.get(t); - if (threshold.hotThrottlingThresholds.length <= ThrottlingSeverity.SEVERE) { - continue; - } - float severeThreshold = - threshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE]; - if (!Float.isNaN(severeThreshold)) { - mSevereThresholds.put(threshold.name, severeThreshold); - if (Flags.allowThermalHeadroomThresholds()) { - for (int severity = ThrottlingSeverity.LIGHT; - severity <= ThrottlingSeverity.SHUTDOWN; severity++) { - if (threshold.hotThrottlingThresholds.length > severity) { - updateHeadroomThreshold(severity, - threshold.hotThrottlingThresholds[severity], - severeThreshold); - } - } - } - } + for (final TemperatureThreshold threshold : thresholds) { + updateTemperatureThresholdLocked(threshold, false); } } } // For an older device with multiple SKIN sensors, we will set a severity's headroom - // threshold based on the minimum value of all as a workaround. - void updateHeadroomThreshold(int severity, float threshold, float severeThreshold) { - if (!Float.isNaN(threshold)) { - synchronized (mSamples) { - if (severity == ThrottlingSeverity.SEVERE) { - mHeadroomThresholds[severity] = 1.0f; - return; + // threshold based on the minimum value of all as a workaround, unless override. + @GuardedBy("mSamples") + void updateTemperatureThresholdLocked(TemperatureThreshold threshold, boolean override) { + if (threshold.hotThrottlingThresholds.length <= ThrottlingSeverity.SEVERE) { + return; + } + float severeThreshold = + threshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE]; + if (Float.isNaN(severeThreshold)) { + return; + } + mSevereThresholds.put(threshold.name, severeThreshold); + if (!Flags.allowThermalHeadroomThresholds()) { + return; + } + if (override) { + Arrays.fill(mHeadroomThresholds, Float.NaN); + } + for (int severity = ThrottlingSeverity.LIGHT; + severity <= ThrottlingSeverity.SHUTDOWN; severity++) { + if (threshold.hotThrottlingThresholds.length > severity) { + float t = threshold.hotThrottlingThresholds[severity]; + if (Float.isNaN(t)) { + continue; } - float headroom = normalizeTemperature(threshold, severeThreshold); - if (Float.isNaN(mHeadroomThresholds[severity])) { - mHeadroomThresholds[severity] = headroom; - } else { - float lastHeadroom = mHeadroomThresholds[severity]; - mHeadroomThresholds[severity] = Math.min(lastHeadroom, headroom); + synchronized (mSamples) { + if (severity == ThrottlingSeverity.SEVERE) { + mHeadroomThresholds[severity] = 1.0f; + continue; + } + float headroom = normalizeTemperature(t, severeThreshold); + if (Float.isNaN(mHeadroomThresholds[severity])) { + mHeadroomThresholds[severity] = headroom; + } else { + float lastHeadroom = mHeadroomThresholds[severity]; + mHeadroomThresholds[severity] = Math.min(lastHeadroom, headroom); + } } } } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index a5085fc3147c..ea0b02c58974 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -191,7 +191,7 @@ cc_defaults { "android.hardware.power.stats@1.0", "android.hardware.power.stats-V1-ndk", "android.hardware.thermal@1.0", - "android.hardware.thermal-V2-ndk", + "android.hardware.thermal-V3-ndk", "android.hardware.tv.input@1.0", "android.hardware.tv.input-V2-ndk", "android.hardware.vibrator-V3-ndk", diff --git a/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java b/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java index aa9d8c6ea713..f1072da4161f 100644 --- a/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/power/ThermalManagerServiceMockingTest.java @@ -18,6 +18,7 @@ package com.android.server.power; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; @@ -29,10 +30,16 @@ import android.hardware.thermal.TemperatureType; import android.hardware.thermal.ThrottlingSeverity; import android.os.Binder; import android.os.CoolingDevice; +import android.os.Flags; import android.os.RemoteException; import android.os.Temperature; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import org.junit.Before; +import org.junit.ClassRule; +import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Captor; @@ -40,16 +47,36 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.Arrays; import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class ThermalManagerServiceMockingTest { - @Mock private IThermal mAidlHalMock; + @ClassRule + public static final SetFlagsRule.ClassRule mSetFlagsClassRule = new SetFlagsRule.ClassRule(); + @Rule + public final SetFlagsRule mSetFlagsRule = mSetFlagsClassRule.createSetFlagsRule(); + + @Mock + private IThermal mAidlHalMock; private Binder mAidlBinder = new Binder(); private CompletableFuture mTemperatureFuture; - private ThermalManagerService.ThermalHalWrapper.TemperatureChangedCallback mTemperatureCallback; + private CompletableFuture mThresholdFuture; + private ThermalManagerService.ThermalHalWrapper.WrapperThermalChangedCallback + mTemperatureCallback = + new ThermalManagerService.ThermalHalWrapper.WrapperThermalChangedCallback() { + @Override + public void onTemperatureChanged(Temperature temperature) { + mTemperatureFuture.complete(temperature); + } + + @Override + public void onThresholdChanged(TemperatureThreshold threshold) { + mThresholdFuture.complete(threshold); + } + }; private ThermalManagerService.ThermalHalAidlWrapper mAidlWrapper; @Captor ArgumentCaptor mAidlCallbackCaptor; @@ -60,27 +87,63 @@ public class ThermalManagerServiceMockingTest { Mockito.when(mAidlHalMock.asBinder()).thenReturn(mAidlBinder); mAidlBinder.attachInterface(mAidlHalMock, IThermal.class.getName()); mTemperatureFuture = new CompletableFuture<>(); - mTemperatureCallback = temperature -> mTemperatureFuture.complete(temperature); + mThresholdFuture = new CompletableFuture<>(); mAidlWrapper = new ThermalManagerService.ThermalHalAidlWrapper(mTemperatureCallback); mAidlWrapper.initProxyAndRegisterCallback(mAidlBinder); } @Test + @EnableFlags({Flags.FLAG_ALLOW_THERMAL_THRESHOLDS_CALLBACK}) public void setCallback_aidl() throws Exception { Mockito.verify(mAidlHalMock, Mockito.times(1)).registerThermalChangedCallback( mAidlCallbackCaptor.capture()); - android.hardware.thermal.Temperature halT = + android.hardware.thermal.Temperature halTemperature = new android.hardware.thermal.Temperature(); - halT.type = TemperatureType.SOC; - halT.name = "test"; - halT.throttlingStatus = ThrottlingSeverity.SHUTDOWN; - halT.value = 99.0f; - mAidlCallbackCaptor.getValue().notifyThrottling(halT); + halTemperature.type = TemperatureType.SOC; + halTemperature.name = "test"; + halTemperature.throttlingStatus = ThrottlingSeverity.SHUTDOWN; + halTemperature.value = 99.0f; + + android.hardware.thermal.TemperatureThreshold halThreshold = + new android.hardware.thermal.TemperatureThreshold(); + halThreshold.type = TemperatureType.SKIN; + halThreshold.name = "test"; + halThreshold.hotThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1]; + Arrays.fill(halThreshold.hotThrottlingThresholds, Float.NaN); + halThreshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE] = 44.0f; + + mAidlCallbackCaptor.getValue().notifyThrottling(halTemperature); + mAidlCallbackCaptor.getValue().notifyThresholdChanged(halThreshold); + Temperature temperature = mTemperatureFuture.get(100, TimeUnit.MILLISECONDS); - assertEquals(halT.name, temperature.getName()); - assertEquals(halT.type, temperature.getType()); - assertEquals(halT.value, temperature.getValue(), 0.1f); - assertEquals(halT.throttlingStatus, temperature.getStatus()); + assertEquals(halTemperature.name, temperature.getName()); + assertEquals(halTemperature.type, temperature.getType()); + assertEquals(halTemperature.value, temperature.getValue(), 0.1f); + assertEquals(halTemperature.throttlingStatus, temperature.getStatus()); + + TemperatureThreshold threshold = mThresholdFuture.get(100, TimeUnit.MILLISECONDS); + assertEquals(halThreshold.name, threshold.name); + assertEquals(halThreshold.type, threshold.type); + assertArrayEquals(halThreshold.hotThrottlingThresholds, threshold.hotThrottlingThresholds, + 0.01f); + } + + @Test + @DisableFlags({Flags.FLAG_ALLOW_THERMAL_THRESHOLDS_CALLBACK}) + public void setCallback_aidl_allow_thermal_thresholds_callback_false() throws Exception { + Mockito.verify(mAidlHalMock, Mockito.times(1)).registerThermalChangedCallback( + mAidlCallbackCaptor.capture()); + android.hardware.thermal.TemperatureThreshold halThreshold = + new android.hardware.thermal.TemperatureThreshold(); + halThreshold.type = TemperatureType.SOC; + halThreshold.name = "test"; + halThreshold.hotThrottlingThresholds = new float[ThrottlingSeverity.SHUTDOWN + 1]; + Arrays.fill(halThreshold.hotThrottlingThresholds, Float.NaN); + halThreshold.hotThrottlingThresholds[ThrottlingSeverity.SEVERE] = 44.0f; + + mAidlCallbackCaptor.getValue().notifyThresholdChanged(halThreshold); + Thread.sleep(1000); + assertFalse(mThresholdFuture.isDone()); } @Test diff --git a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java index 6d79ae467bf0..cfe3d84140df 100644 --- a/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/power/ThermalManagerServiceTest.java @@ -296,11 +296,11 @@ public class ThermalManagerServiceTest { } @Test - public void testNotify() throws RemoteException { + public void testNotifyThrottling() throws RemoteException { int status = Temperature.THROTTLING_SEVERE; // Should only notify event not status Temperature newBattery = new Temperature(50, Temperature.TYPE_BATTERY, "batt", status); - mFakeHal.mCallback.onValues(newBattery); + mFakeHal.mCallback.onTemperatureChanged(newBattery); verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).notifyThrottling(newBattery); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) @@ -312,7 +312,7 @@ public class ThermalManagerServiceTest { resetListenerMock(); // Notify both event and status Temperature newSkin = new Temperature(50, Temperature.TYPE_SKIN, "skin1", status); - mFakeHal.mCallback.onValues(newSkin); + mFakeHal.mCallback.onTemperatureChanged(newSkin); verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).notifyThrottling(newSkin); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) @@ -325,7 +325,7 @@ public class ThermalManagerServiceTest { // Back to None, should only notify event not status status = Temperature.THROTTLING_NONE; newBattery = new Temperature(50, Temperature.TYPE_BATTERY, "batt", status); - mFakeHal.mCallback.onValues(newBattery); + mFakeHal.mCallback.onTemperatureChanged(newBattery); verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).notifyThrottling(newBattery); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) @@ -337,7 +337,7 @@ public class ThermalManagerServiceTest { resetListenerMock(); // Should also notify status newSkin = new Temperature(50, Temperature.TYPE_SKIN, "skin1", status); - mFakeHal.mCallback.onValues(newSkin); + mFakeHal.mCallback.onTemperatureChanged(newSkin); verify(mEventListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).notifyThrottling(newSkin); verify(mStatusListener1, timeout(CALLBACK_TIMEOUT_MILLI_SEC) @@ -362,7 +362,7 @@ public class ThermalManagerServiceTest { public void testGetCurrentStatus() throws RemoteException { int status = Temperature.THROTTLING_SEVERE; Temperature newSkin = new Temperature(100, Temperature.TYPE_SKIN, "skin1", status); - mFakeHal.mCallback.onValues(newSkin); + mFakeHal.mCallback.onTemperatureChanged(newSkin); assertEquals(status, mService.mService.getCurrentThermalStatus()); int battStatus = Temperature.THROTTLING_EMERGENCY; Temperature newBattery = new Temperature(60, Temperature.TYPE_BATTERY, "batt", battStatus); @@ -373,11 +373,11 @@ public class ThermalManagerServiceTest { public void testThermalShutdown() throws RemoteException { int status = Temperature.THROTTLING_SHUTDOWN; Temperature newSkin = new Temperature(100, Temperature.TYPE_SKIN, "skin1", status); - mFakeHal.mCallback.onValues(newSkin); + mFakeHal.mCallback.onTemperatureChanged(newSkin); verify(mIPowerManagerMock, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).shutdown(false, PowerManager.SHUTDOWN_THERMAL_STATE, false); Temperature newBattery = new Temperature(60, Temperature.TYPE_BATTERY, "batt", status); - mFakeHal.mCallback.onValues(newBattery); + mFakeHal.mCallback.onTemperatureChanged(newBattery); verify(mIPowerManagerMock, timeout(CALLBACK_TIMEOUT_MILLI_SEC) .times(1)).shutdown(false, PowerManager.SHUTDOWN_BATTERY_THERMAL_STATE, false); } @@ -419,15 +419,35 @@ public class ThermalManagerServiceTest { } @Test - public void testTemperatureWatcherUpdateSevereThresholds() throws RemoteException { + public void testTemperatureWatcherUpdateSevereThresholds() { TemperatureWatcher watcher = mService.mTemperatureWatcher; - watcher.mSevereThresholds.erase(); - watcher.updateThresholds(); - assertEquals(1, watcher.mSevereThresholds.size()); - assertEquals("skin1", watcher.mSevereThresholds.keyAt(0)); - Float threshold = watcher.mSevereThresholds.get("skin1"); - assertNotNull(threshold); - assertEquals(40.0f, threshold, 0.0f); + synchronized (watcher.mSamples) { + watcher.mSevereThresholds.erase(); + watcher.getAndUpdateThresholds(); + assertEquals(1, watcher.mSevereThresholds.size()); + assertEquals("skin1", watcher.mSevereThresholds.keyAt(0)); + Float threshold = watcher.mSevereThresholds.get("skin1"); + assertNotNull(threshold); + assertEquals(40.0f, threshold, 0.0f); + assertArrayEquals("Got" + Arrays.toString(watcher.mHeadroomThresholds), + new float[]{Float.NaN, 0.6667f, 0.8333f, 1.0f, 1.166f, 1.3333f, + 1.5f}, + watcher.mHeadroomThresholds, 0.01f); + + TemperatureThreshold newThreshold = new TemperatureThreshold(); + newThreshold.name = "skin1"; + newThreshold.hotThrottlingThresholds = new float[] { + Float.NaN, 44.0f, 47.0f, 50.0f, Float.NaN, Float.NaN, Float.NaN + }; + mFakeHal.mCallback.onThresholdChanged(newThreshold); + threshold = watcher.mSevereThresholds.get("skin1"); + assertNotNull(threshold); + assertEquals(50.0f, threshold, 0.0f); + assertArrayEquals("Got" + Arrays.toString(watcher.mHeadroomThresholds), + new float[]{Float.NaN, 0.8f, 0.9f, 1.0f, Float.NaN, Float.NaN, + Float.NaN}, + watcher.mHeadroomThresholds, 0.01f); + } } @Test @@ -436,25 +456,19 @@ public class ThermalManagerServiceTest { synchronized (watcher.mSamples) { Arrays.fill(watcher.mHeadroomThresholds, Float.NaN); } - watcher.updateHeadroomThreshold(ThrottlingSeverity.LIGHT, 40, 49); - watcher.updateHeadroomThreshold(ThrottlingSeverity.MODERATE, 46, 49); - watcher.updateHeadroomThreshold(ThrottlingSeverity.SEVERE, 49, 49); - watcher.updateHeadroomThreshold(ThrottlingSeverity.CRITICAL, 64, 49); - watcher.updateHeadroomThreshold(ThrottlingSeverity.EMERGENCY, 70, 49); - watcher.updateHeadroomThreshold(ThrottlingSeverity.SHUTDOWN, 79, 49); + TemperatureThreshold threshold = new TemperatureThreshold(); + threshold.hotThrottlingThresholds = new float[]{Float.NaN, 40, 46, 49, 64, 70, 79}; synchronized (watcher.mSamples) { + watcher.updateTemperatureThresholdLocked(threshold, false /*override*/); assertArrayEquals(new float[]{Float.NaN, 0.7f, 0.9f, 1.0f, 1.5f, 1.7f, 2.0f}, watcher.mHeadroomThresholds, 0.01f); } // when another sensor reports different threshold, we expect to see smaller one to be used - watcher.updateHeadroomThreshold(ThrottlingSeverity.LIGHT, 37, 52); - watcher.updateHeadroomThreshold(ThrottlingSeverity.MODERATE, 46, 52); - watcher.updateHeadroomThreshold(ThrottlingSeverity.SEVERE, 52, 52); - watcher.updateHeadroomThreshold(ThrottlingSeverity.CRITICAL, 64, 52); - watcher.updateHeadroomThreshold(ThrottlingSeverity.EMERGENCY, 100, 52); - watcher.updateHeadroomThreshold(ThrottlingSeverity.SHUTDOWN, 200, 52); + threshold = new TemperatureThreshold(); + threshold.hotThrottlingThresholds = new float[]{Float.NaN, 37, 46, 52, 64, 100, 200}; synchronized (watcher.mSamples) { + watcher.updateTemperatureThresholdLocked(threshold, false /*override*/); assertArrayEquals(new float[]{Float.NaN, 0.5f, 0.8f, 1.0f, 1.4f, 1.7f, 2.0f}, watcher.mHeadroomThresholds, 0.01f); } @@ -486,7 +500,7 @@ public class ThermalManagerServiceTest { TemperatureWatcher watcher = mService.mTemperatureWatcher; ArrayList thresholds = new ArrayList<>(); mFakeHal.mTemperatureThresholdList = thresholds; - watcher.updateThresholds(); + watcher.getAndUpdateThresholds(); synchronized (watcher.mSamples) { assertArrayEquals( new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, @@ -501,7 +515,7 @@ public class ThermalManagerServiceTest { Arrays.fill(nanThresholds.hotThrottlingThresholds, Float.NaN); Arrays.fill(nanThresholds.coldThrottlingThresholds, Float.NaN); thresholds.add(nanThresholds); - watcher.updateThresholds(); + watcher.getAndUpdateThresholds(); synchronized (watcher.mSamples) { assertArrayEquals( new float[]{Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, Float.NaN, -- GitLab From c90c65d8b016f5635077584ebf6f5563654fd817 Mon Sep 17 00:00:00 2001 From: Vincent Wang Date: Wed, 31 Jul 2024 07:40:04 +0000 Subject: [PATCH 164/459] Add FP auth feature when screen off(1/2) Bug: 373792870 Flag: android.hardware.biometrics.screen_off_unlock_udfps Test: atest DozeSensorsTest Change-Id: Iae7b9686d2d15dcd768dadc56a6824f8fced309d --- .../android/hardware/biometrics/flags.aconfig | 8 ++++++++ .../display/AmbientDisplayConfiguration.java | 8 +++++++- core/res/res/values/config.xml | 3 +++ core/res/res/values/symbols.xml | 3 +++ .../android/systemui/doze/DozeSensors.java | 5 +++-- .../systemui/doze/DozeTriggersTest.java | 19 +++++++++++++++++++ 6 files changed, 43 insertions(+), 3 deletions(-) diff --git a/core/java/android/hardware/biometrics/flags.aconfig b/core/java/android/hardware/biometrics/flags.aconfig index 047d1fa4f49a..26ffa11823d8 100644 --- a/core/java/android/hardware/biometrics/flags.aconfig +++ b/core/java/android/hardware/biometrics/flags.aconfig @@ -39,3 +39,11 @@ flag { description: "This flag controls whether LSKF fallback is removed from biometric prompt when the phone is outside trusted locations" bug: "322081563" } + +flag { + name: "screen_off_unlock_udfps" + is_exported: true + namespace: "biometrics_integration" + description: "This flag controls Whether to enable fp unlock when screen turns off on udfps devices" + bug: "373792870" +} diff --git a/core/java/android/hardware/display/AmbientDisplayConfiguration.java b/core/java/android/hardware/display/AmbientDisplayConfiguration.java index 47541ca16cda..59a602ca092d 100644 --- a/core/java/android/hardware/display/AmbientDisplayConfiguration.java +++ b/core/java/android/hardware/display/AmbientDisplayConfiguration.java @@ -18,6 +18,7 @@ package android.hardware.display; import android.annotation.TestApi; import android.content.Context; +import android.hardware.biometrics.Flags; import android.os.Build; import android.os.SystemProperties; import android.provider.Settings; @@ -41,6 +42,7 @@ public class AmbientDisplayConfiguration { private final Context mContext; private final boolean mAlwaysOnByDefault; private final boolean mPickupGestureEnabledByDefault; + private final boolean mScreenOffUdfpsEnabledByDefault; /** Copied from android.provider.Settings.Secure since these keys are hidden. */ private static final String[] DOZE_SETTINGS = { @@ -68,6 +70,8 @@ public class AmbientDisplayConfiguration { mAlwaysOnByDefault = mContext.getResources().getBoolean(R.bool.config_dozeAlwaysOnEnabled); mPickupGestureEnabledByDefault = mContext.getResources().getBoolean(R.bool.config_dozePickupGestureEnabled); + mScreenOffUdfpsEnabledByDefault = + mContext.getResources().getBoolean(R.bool.config_screen_off_udfps_enabled); } /** @hide */ @@ -146,7 +150,9 @@ public class AmbientDisplayConfiguration { /** @hide */ public boolean screenOffUdfpsEnabled(int user) { return !TextUtils.isEmpty(udfpsLongPressSensorType()) - && boolSettingDefaultOff("screen_off_udfps_enabled", user); + && ((mScreenOffUdfpsEnabledByDefault && Flags.screenOffUnlockUdfps()) + ? boolSettingDefaultOn("screen_off_udfps_enabled", user) + : boolSettingDefaultOff("screen_off_udfps_enabled", user)); } /** @hide */ diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 42ac90dd8066..9c92e5ca589b 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -7178,4 +7178,7 @@ + + + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index dfee85a3788d..712b99439496 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5639,4 +5639,7 @@ + + + diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java index 21922ff22afe..12718e8bd119 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java @@ -17,6 +17,7 @@ package com.android.systemui.doze; import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT; +import static android.hardware.biometrics.Flags.screenOffUnlockUdfps; import static com.android.systemui.doze.DozeLog.REASON_SENSOR_QUICK_PICKUP; import static com.android.systemui.doze.DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS; @@ -248,8 +249,8 @@ public class DozeSensors { true /* touchscreen */, false /* ignoresSetting */, dozeParameters.longPressUsesProx(), - false /* immediatelyReRegister */, - true /* requiresAod */ + screenOffUnlockUdfps() /* immediatelyReRegister */, + !screenOffUnlockUdfps() /* requiresAod */ ), new PluginSensor( new SensorManagerPlugin.Sensor(TYPE_WAKE_DISPLAY), diff --git a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java index 3d1a0d0cef3c..96f4a60271d2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/doze/DozeTriggersTest.java @@ -481,6 +481,25 @@ public class DozeTriggersTest extends SysuiTestCase { verify(mAuthController).onAodInterrupt(anyInt(), anyInt(), anyFloat(), anyFloat()); } + @Test + @EnableFlags(android.hardware.biometrics.Flags.FLAG_SCREEN_OFF_UNLOCK_UDFPS) + public void udfpsLongPress_triggeredWhenDoze() { + // GIVEN device is DOZE + when(mMachine.getState()).thenReturn(DozeMachine.State.DOZE); + + // WHEN udfps long-press is triggered + mTriggers.onSensor(DozeLog.REASON_SENSOR_UDFPS_LONG_PRESS, 100, 100, + new float[]{0, 1, 2, 3, 4}); + + // THEN the pulse is NOT dropped + verify(mDozeLog, never()).tracePulseDropped(anyString(), any()); + + // WHEN the screen state is OFF + mTriggers.onScreenState(Display.STATE_OFF); + + // THEN aod interrupt never be sent + verify(mAuthController, never()).onAodInterrupt(anyInt(), anyInt(), anyFloat(), anyFloat()); + } @Test public void udfpsLongPress_dozeState_notRegistered() { -- GitLab From f70ddc9beb637cfea73bcdc7f033d703e56bde02 Mon Sep 17 00:00:00 2001 From: Yihan Dong Date: Sat, 12 Oct 2024 08:53:36 +0000 Subject: [PATCH 165/459] Add proposed trendy teams for VTS modules Change-Id: I1e6ab1419fa7f8ad97828e7b756efb70d805e39c Test: build locally Bug: 368362374 --- omapi/aidl/vts/functional/AccessControlApp/Android.bp | 1 + omapi/aidl/vts/functional/omapi/Android.bp | 1 + 2 files changed, 2 insertions(+) diff --git a/omapi/aidl/vts/functional/AccessControlApp/Android.bp b/omapi/aidl/vts/functional/AccessControlApp/Android.bp index f03c3f6eb647..57d75f596485 100644 --- a/omapi/aidl/vts/functional/AccessControlApp/Android.bp +++ b/omapi/aidl/vts/functional/AccessControlApp/Android.bp @@ -15,6 +15,7 @@ // package { + default_team: "trendy_team_fwk_nfc", default_applicable_licenses: ["Android-Apache-2.0"], } diff --git a/omapi/aidl/vts/functional/omapi/Android.bp b/omapi/aidl/vts/functional/omapi/Android.bp index c41479f9e9cf..8ee55ff56bb6 100644 --- a/omapi/aidl/vts/functional/omapi/Android.bp +++ b/omapi/aidl/vts/functional/omapi/Android.bp @@ -15,6 +15,7 @@ // package { + default_team: "trendy_team_fwk_nfc", default_applicable_licenses: ["Android-Apache-2.0"], } -- GitLab From 0b57f3101d0567d0e1cdad78d7e8ba2d2a3e5d89 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Mon, 21 Oct 2024 17:21:54 -0700 Subject: [PATCH 166/459] Prevent crash when history event is written w/o a name Bug: 374412790 Test: presubmit Flag: EXEMPT_bugfix Change-Id: I6841b6ce339592bf4aa472aa11888d126f04f625 --- core/java/com/android/internal/os/BatteryStatsHistory.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/java/com/android/internal/os/BatteryStatsHistory.java b/core/java/com/android/internal/os/BatteryStatsHistory.java index 07aa7206c0e7..b56aadd366d5 100644 --- a/core/java/com/android/internal/os/BatteryStatsHistory.java +++ b/core/java/com/android/internal/os/BatteryStatsHistory.java @@ -1770,6 +1770,10 @@ public class BatteryStatsHistory { @GuardedBy("this") private void writeHistoryItem(long elapsedRealtimeMs, long uptimeMs, HistoryItem cur) { + if (cur.eventCode != HistoryItem.EVENT_NONE && cur.eventTag.string == null) { + Slog.wtfStack(TAG, "Event " + Integer.toHexString(cur.eventCode) + " without a name"); + } + if (mTracer != null && mTracer.tracingEnabled()) { recordTraceEvents(cur.eventCode, cur.eventTag); recordTraceCounters(mTraceLastState, cur.states, STATE1_TRACE_MASK, @@ -2266,6 +2270,7 @@ public class BatteryStatsHistory { private int writeHistoryTag(HistoryTag tag) { if (tag.string == null) { Slog.wtfStack(TAG, "writeHistoryTag called with null name"); + tag.string = ""; } final int stringLength = tag.string.length(); -- GitLab From df792e1d1580f6befa1872e0f4a8619db15fed77 Mon Sep 17 00:00:00 2001 From: Daichi Hirono Date: Wed, 2 Oct 2024 14:45:00 +0900 Subject: [PATCH 167/459] Wire "Action + Ctrl + D" to moveToNextDisplay This CL wires the key combination of Action + Ctrl + D handled in PhoneWindowManager to moveToNextDisplay in DesktopTasksController. Flag: com.android.window.flags.enable_move_to_next_display_shortcut Bug: 364154795 Test: com.android.server.policy.PhoneWindowManagerTests#testMoveToNextDisplayKeyboardShortcut Change-Id: Ie186747db13517ccf28b47e77cce56d59b407006 --- .../hardware/input/KeyGestureEvent.java | 7 ++- libs/WindowManager/Shell/AndroidManifest.xml | 1 + .../wm/shell/dagger/WMShellModule.java | 8 ++- .../desktopmode/DesktopTasksController.kt | 58 ++++++++++++++++++- .../desktopmode/DesktopTasksControllerTest.kt | 57 ++++++++++++++++++ .../server/input/KeyGestureController.java | 13 +++++ .../server/input/KeyGestureControllerTests.kt | 21 +++++++ 7 files changed, 159 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java index 5ee61bcd436a..2df541818e3d 100644 --- a/core/java/android/hardware/input/KeyGestureEvent.java +++ b/core/java/android/hardware/input/KeyGestureEvent.java @@ -99,6 +99,7 @@ public final class KeyGestureEvent { public static final int KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT = 59; public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT = 60; public static final int KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS = 61; + public static final int KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY = 62; public static final int FLAG_CANCELLED = 1; @@ -175,7 +176,7 @@ public final class KeyGestureEvent { KEY_GESTURE_TYPE_TV_TRIGGER_BUG_REPORT, KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT, KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS, - + KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, }) @Retention(RetentionPolicy.SOURCE) public @interface KeyGestureType { @@ -415,6 +416,8 @@ public final class KeyGestureEvent { case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT: case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT: return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__CHANGE_SPLITSCREEN_FOCUS; + case KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY: + return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__MOVE_TO_NEXT_DISPLAY; case KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT: return FrameworkStatsLog.KEYBOARD_SYSTEMS_EVENT_REPORTED__KEYBOARD_SYSTEM_EVENT__TRIGGER_BUG_REPORT; case KEY_GESTURE_TYPE_LOCK_SCREEN: @@ -530,6 +533,8 @@ public final class KeyGestureEvent { return "KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_LEFT"; case KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT: return "KEY_GESTURE_TYPE_CHANGE_SPLITSCREEN_FOCUS_RIGHT"; + case KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY: + return "KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY"; case KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT: return "KEY_GESTURE_TYPE_TRIGGER_BUG_REPORT"; case KEY_GESTURE_TYPE_LOCK_SCREEN: diff --git a/libs/WindowManager/Shell/AndroidManifest.xml b/libs/WindowManager/Shell/AndroidManifest.xml index 1260796810c2..b2ac640a468d 100644 --- a/libs/WindowManager/Shell/AndroidManifest.xml +++ b/libs/WindowManager/Shell/AndroidManifest.xml @@ -25,6 +25,7 @@ + desktopTasksLimiter, Optional recentTasksController, - InteractionJankMonitor interactionJankMonitor) { + InteractionJankMonitor interactionJankMonitor, + InputManager inputManager, + FocusTransitionObserver focusTransitionObserver) { return new DesktopTasksController(context, shellInit, shellCommandHandler, shellController, displayController, shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, dragAndDropController, transitions, keyguardManager, @@ -655,7 +658,8 @@ public abstract class WMShellModule { desktopRepository, desktopModeLoggerTransitionObserver, launchAdjacentController, recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter, - recentTasksController.orElse(null), interactionJankMonitor, mainHandler); + recentTasksController.orElse(null), interactionJankMonitor, mainHandler, + inputManager, focusTransitionObserver); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 1d17cd62c0d2..09a4481bab61 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -35,6 +35,9 @@ import android.graphics.Point import android.graphics.PointF import android.graphics.Rect import android.graphics.Region +import android.hardware.input.InputManager +import android.hardware.input.InputManager.KeyGestureEventHandler +import android.hardware.input.KeyGestureEvent import android.os.Binder import android.os.Handler import android.os.IBinder @@ -42,6 +45,7 @@ import android.os.SystemProperties import android.util.Size import android.view.Display.DEFAULT_DISPLAY import android.view.DragEvent +import android.view.KeyEvent import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE import android.view.WindowManager.TRANSIT_CLOSE @@ -57,6 +61,7 @@ import android.window.TransitionInfo import android.window.TransitionRequestInfo import android.window.WindowContainerTransaction import androidx.annotation.BinderThread +import com.android.hardware.input.Flags.useKeyGestureEventHandler import com.android.internal.annotations.VisibleForTesting import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_HOLD import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_ENTER_APP_HANDLE_DRAG_RELEASE @@ -65,6 +70,7 @@ import com.android.internal.jank.InteractionJankMonitor import com.android.internal.policy.ScreenDecorationsUtils import com.android.internal.protolog.ProtoLog import com.android.window.flags.Flags +import com.android.window.flags.Flags.enableMoveToNextDisplayShortcut import com.android.wm.shell.RootTaskDisplayAreaOrganizer import com.android.wm.shell.ShellTaskOrganizer import com.android.wm.shell.common.DisplayController @@ -78,12 +84,13 @@ import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SingleInstanceRemoteListener import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.compatui.isTopActivityExemptFromDesktopWindowing -import com.android.wm.shell.desktopmode.DesktopRepository.VisibleTasksListener import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.DragStartState import com.android.wm.shell.desktopmode.DesktopModeVisualIndicator.IndicatorType +import com.android.wm.shell.desktopmode.DesktopRepository.VisibleTasksListener import com.android.wm.shell.desktopmode.DragToDesktopTransitionHandler.DragToDesktopStateListener import com.android.wm.shell.desktopmode.minimize.DesktopWindowLimitRemoteHandler import com.android.wm.shell.draganddrop.DragAndDropController +import com.android.wm.shell.freeform.FreeformTaskTransitionStarter import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.recents.RecentTasksController import com.android.wm.shell.recents.RecentsTransitionHandler @@ -92,7 +99,6 @@ import com.android.wm.shell.shared.ShellSharedConstants import com.android.wm.shell.shared.TransitionUtil import com.android.wm.shell.shared.annotations.ExternalThread import com.android.wm.shell.shared.annotations.ShellMainThread -import com.android.wm.shell.freeform.FreeformTaskTransitionStarter import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.DESKTOP_DENSITY_OVERRIDE import com.android.wm.shell.shared.desktopmode.DesktopModeStatus.useDesktopOverrideDensity @@ -105,6 +111,7 @@ import com.android.wm.shell.sysui.ShellCommandHandler import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit import com.android.wm.shell.sysui.UserChangeListener +import com.android.wm.shell.transition.FocusTransitionObserver import com.android.wm.shell.transition.OneShotRemoteHandler import com.android.wm.shell.transition.Transitions import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility @@ -149,11 +156,14 @@ class DesktopTasksController( private val recentTasksController: RecentTasksController?, private val interactionJankMonitor: InteractionJankMonitor, @ShellMainThread private val handler: Handler, + private val inputManager: InputManager, + private val focusTransitionObserver: FocusTransitionObserver, ) : RemoteCallable, Transitions.TransitionHandler, DragAndDropController.DragAndDropListener, - UserChangeListener { + UserChangeListener, + KeyGestureEventHandler { private val desktopMode: DesktopModeImpl private var visualIndicator: DesktopModeVisualIndicator? = null @@ -226,6 +236,9 @@ class DesktopTasksController( } ) dragAndDropController.addListener(this) + if (useKeyGestureEventHandler() && enableMoveToNextDisplayShortcut()) { + inputManager.registerKeyGestureEventHandler(this) + } } @VisibleForTesting @@ -1587,12 +1600,26 @@ class DesktopTasksController( getFocusedFreeformTask(displayId)?.let { requestSplit(it, leftOrTop) } } + /** Move the focused desktop task in given `displayId` to next display. */ + fun moveFocusedTaskToNextDisplay(displayId: Int) { + getFocusedFreeformTask(displayId)?.let { moveToNextDisplay(it.taskId) } + } + private fun getFocusedFreeformTask(displayId: Int): RunningTaskInfo? { return shellTaskOrganizer.getRunningTasks(displayId).find { taskInfo -> taskInfo.isFocused && taskInfo.windowingMode == WINDOWING_MODE_FREEFORM } } + // TODO(b/364154795): wait for the completion of moveToNextDisplay transition, otherwise it will + // pick a wrong task when a user quickly perform other actions with keyboard shortcuts after + // moveToNextDisplay. + private fun getGloballyFocusedFreeformTask(): RunningTaskInfo? = + shellTaskOrganizer.getRunningTasks().find { taskInfo -> + taskInfo.windowingMode == WINDOWING_MODE_FREEFORM && + focusTransitionObserver.hasGlobalFocus(taskInfo) + } + /** * Requests a task be transitioned from desktop to split select. Applies needed windowing * changes if this transition is enabled. @@ -1947,6 +1974,31 @@ class DesktopTasksController( taskRepository.dump(pw, innerPrefix) } + override fun handleKeyGestureEvent( + event: KeyGestureEvent, + focusedToken: IBinder? + ): Boolean { + if (!isKeyGestureSupported(event.keyGestureType)) return false + when (event.keyGestureType) { + KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY -> { + if (event.keycodes.contains(KeyEvent.KEYCODE_D) && + event.hasModifiers(KeyEvent.META_CTRL_ON or KeyEvent.META_META_ON)) { + logV("Key gesture MOVE_TO_NEXT_DISPLAY is handled") + getGloballyFocusedFreeformTask()?.let { moveToNextDisplay(it.taskId) } + return true + } + return false + } + else -> return false + } + } + + override fun isKeyGestureSupported(gestureType: Int): Boolean = when (gestureType) { + KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY + -> enableMoveToNextDisplayShortcut() + else -> false + } + /** The interface for calls from outside the shell, within the host process. */ @ExternalThread private inner class DesktopModeImpl : DesktopMode { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index af51e32b2086..55b44ac935ea 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -39,6 +39,9 @@ import android.content.res.Configuration.ORIENTATION_PORTRAIT import android.graphics.Point import android.graphics.PointF import android.graphics.Rect +import android.hardware.input.InputManager +import android.hardware.input.InputManager.KeyGestureEventHandler +import android.hardware.input.KeyGestureEvent import android.os.Binder import android.os.Bundle import android.os.Handler @@ -50,6 +53,7 @@ import android.testing.AndroidTestingRunner import android.view.Display.DEFAULT_DISPLAY import android.view.DragEvent import android.view.Gravity +import android.view.KeyEvent import android.view.SurfaceControl import android.view.WindowInsets import android.view.WindowManager @@ -70,14 +74,18 @@ import android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_R import android.window.WindowContainerTransaction.HierarchyOp.HIERARCHY_OP_TYPE_REORDER import android.window.WindowContainerTransaction.HierarchyOp.LAUNCH_KEY_TASK_ID import androidx.test.filters.SmallTest +import com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession import com.android.dx.mockito.inline.extended.ExtendedMockito.never import com.android.dx.mockito.inline.extended.StaticMockitoSession +import com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER import com.android.internal.jank.InteractionJankMonitor import com.android.window.flags.Flags import com.android.window.flags.Flags.FLAG_ENABLE_DESKTOP_WINDOWING_MODE +import com.android.window.flags.Flags.FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS import com.android.window.flags.Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP +import com.android.window.flags.Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT import com.android.wm.shell.MockToken import com.android.wm.shell.R import com.android.wm.shell.RootTaskDisplayAreaOrganizer @@ -112,6 +120,7 @@ import com.android.wm.shell.splitscreen.SplitScreenController import com.android.wm.shell.sysui.ShellCommandHandler import com.android.wm.shell.sysui.ShellController import com.android.wm.shell.sysui.ShellInit +import com.android.wm.shell.transition.FocusTransitionObserver import com.android.wm.shell.transition.OneShotRemoteHandler import com.android.wm.shell.transition.TestRemoteTransition import com.android.wm.shell.transition.Transitions @@ -206,6 +215,8 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var freeformTaskTransitionStarter: FreeformTaskTransitionStarter @Mock private lateinit var mockHandler: Handler @Mock lateinit var persistentRepository: DesktopPersistentRepository + @Mock private lateinit var mockInputManager: InputManager + @Mock private lateinit var mockFocusTransitionObserver: FocusTransitionObserver private lateinit var mockitoSession: StaticMockitoSession private lateinit var controller: DesktopTasksController @@ -214,6 +225,7 @@ class DesktopTasksControllerTest : ShellTestCase() { private lateinit var desktopTasksLimiter: DesktopTasksLimiter private lateinit var recentsTransitionStateListener: RecentsTransitionStateListener private lateinit var testScope: CoroutineScope + private lateinit var keyGestureEventHandler: KeyGestureEventHandler private val shellExecutor = TestShellExecutor() @@ -271,6 +283,11 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.setSplitScreenController(splitScreenController) controller.freeformTaskTransitionStarter = freeformTaskTransitionStarter + doAnswer { + keyGestureEventHandler = (it.arguments[0] as KeyGestureEventHandler) + null + }.whenever(mockInputManager).registerKeyGestureEventHandler(any()) + shellInit.init() val captor = ArgumentCaptor.forClass(RecentsTransitionStateListener::class.java) @@ -310,6 +327,8 @@ class DesktopTasksControllerTest : ShellTestCase() { recentTasksController, mockInteractionJankMonitor, mockHandler, + mockInputManager, + mockFocusTransitionObserver, ) } @@ -1466,6 +1485,44 @@ class DesktopTasksControllerTest : ShellTestCase() { } } + @Test + @EnableFlags( + FLAG_ENABLE_DISPLAY_FOCUS_IN_SHELL_TRANSITIONS, + FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT, + FLAG_USE_KEY_GESTURE_EVENT_HANDLER + ) + fun moveToNextDisplay_withKeyGesture() { + // Set up two display ids + whenever(rootTaskDisplayAreaOrganizer.displayIds) + .thenReturn(intArrayOf(DEFAULT_DISPLAY, SECOND_DISPLAY)) + // Create a mock for the target display area: default display + val defaultDisplayArea = DisplayAreaInfo(MockToken().token(), DEFAULT_DISPLAY, 0) + whenever(rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)) + .thenReturn(defaultDisplayArea) + // Setup a focused task on secondary display, which is expected to move to default display + val task = setUpFreeformTask(displayId = SECOND_DISPLAY) + task.isFocused = true + whenever(shellTaskOrganizer.getRunningTasks()).thenReturn(arrayListOf(task)) + whenever(mockFocusTransitionObserver.hasGlobalFocus(eq(task))).thenReturn(true) + + val event = KeyGestureEvent.Builder() + .setKeyGestureType(KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY) + .setDisplayId(SECOND_DISPLAY) + .setKeycodes(intArrayOf(KeyEvent.KEYCODE_D)) + .setModifierState(KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON) + .build() + val result = keyGestureEventHandler.handleKeyGestureEvent(event, null) + + assertThat(result).isTrue() + with(getLatestWct(type = TRANSIT_CHANGE)) { + assertThat(hierarchyOps).hasSize(1) + assertThat(hierarchyOps[0].container).isEqualTo(task.token.asBinder()) + assertThat(hierarchyOps[0].isReparent).isTrue() + assertThat(hierarchyOps[0].newParent).isEqualTo(defaultDisplayArea.token.asBinder()) + assertThat(hierarchyOps[0].toTop).isTrue() + } + } + @Test fun getTaskWindowingMode() { val fullscreenTask = setUpFullscreenTask() diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index b488db533d12..2f5236f51c48 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -23,6 +23,7 @@ import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE; import static com.android.hardware.input.Flags.useKeyGestureEventHandler; import static com.android.hardware.input.Flags.useKeyGestureEventHandlerMultiPressGestures; import static com.android.server.flags.Flags.newBugreportKeyboardShortcut; +import static com.android.window.flags.Flags.enableMoveToNextDisplayShortcut; import android.annotation.BinderThread; import android.annotation.MainThread; @@ -654,6 +655,18 @@ final class KeyGestureController { } } break; + case KeyEvent.KEYCODE_D: + if (enableMoveToNextDisplayShortcut()) { + if (firstDown && event.isMetaPressed() && event.isCtrlPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_CTRL_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, + displayId, + focusedToken, /* flags = */0); + } + } + break; case KeyEvent.KEYCODE_SLASH: if (firstDown && event.isMetaPressed()) { return handleKeyGesture(deviceId, new int[]{keyCode}, KeyEvent.META_META_ON, diff --git a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt index 7526737f60bf..787ae06cd856 100644 --- a/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt +++ b/tests/Input/src/com/android/server/input/KeyGestureControllerTests.kt @@ -798,6 +798,27 @@ class KeyGestureControllerTests { ) } + @Test + @EnableFlags(com.android.window.flags.Flags.FLAG_ENABLE_MOVE_TO_NEXT_DISPLAY_SHORTCUT) + fun testMoveToNextDisplay() { + val keyGestureController = KeyGestureController(context, testLooper.looper) + testKeyGestureInternal( + keyGestureController, + TestData( + "META + CTRL + D -> Move a task to next display", + intArrayOf( + KeyEvent.KEYCODE_META_LEFT, + KeyEvent.KEYCODE_CTRL_LEFT, + KeyEvent.KEYCODE_D + ), + KeyGestureEvent.KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, + intArrayOf(KeyEvent.KEYCODE_D), + KeyEvent.META_META_ON or KeyEvent.META_CTRL_ON, + intArrayOf(KeyGestureEvent.ACTION_GESTURE_COMPLETE) + ) + ) + } + @Test fun testCapsLockPressNotified() { val keyGestureController = KeyGestureController(context, testLooper.looper) -- GitLab From 5e09609eda2919ddd40d1b6175518cbe0a3d3936 Mon Sep 17 00:00:00 2001 From: Rachel Lee Date: Tue, 8 Oct 2024 13:09:44 -0700 Subject: [PATCH 168/459] Add new Surface#setFrameRate API The new overload uses same plumbing and same logic as the other setFrameRate overloads. This plumbing and logic will be upgraded to accommodate new parameters in a future CL (e.g. for desiredMaxRate). Bug: 362798998 Test: atest SetFrameRateTest Flag: com.android.graphics.surfaceflinger.flags.arr_setframerate_api Change-Id: I45b1dab08f28d1891fd8659ee0b0b194efd5b1ff --- core/api/current.txt | 17 +++ core/java/android/view/Surface.java | 207 ++++++++++++++++++++++++++++ 2 files changed, 224 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 53da33835d31..ed067ad1b6a8 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -52380,6 +52380,7 @@ package android.view { method public android.graphics.Canvas lockHardwareCanvas(); method public void readFromParcel(android.os.Parcel); method public void release(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public void setFrameRate(@NonNull android.view.Surface.FrameRateParams); method public void setFrameRate(@FloatRange(from=0.0) float, int, int); method public void setFrameRate(@FloatRange(from=0.0) float, int); method @Deprecated public void unlockCanvas(android.graphics.Canvas); @@ -52396,6 +52397,22 @@ package android.view { field public static final int ROTATION_90 = 1; // 0x1 } + @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public static class Surface.FrameRateParams { + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public int getChangeFrameRateStrategy(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public float getDesiredMaxRate(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public float getDesiredMinRate(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public float getFixedSourceRate(); + field @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public static final android.view.Surface.FrameRateParams IGNORE; + } + + @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") public static final class Surface.FrameRateParams.Builder { + ctor public Surface.FrameRateParams.Builder(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") @NonNull public android.view.Surface.FrameRateParams build(); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") @NonNull public android.view.Surface.FrameRateParams.Builder setChangeFrameRateStrategy(int); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") @NonNull public android.view.Surface.FrameRateParams.Builder setDesiredRateRange(@FloatRange(from=0.0) float, @FloatRange(from=0.0) float); + method @FlaggedApi("com.android.graphics.surfaceflinger.flags.arr_setframerate_api") @NonNull public android.view.Surface.FrameRateParams.Builder setFixedSourceRate(@FloatRange(from=0.0) float); + } + public static class Surface.OutOfResourcesException extends java.lang.RuntimeException { ctor public Surface.OutOfResourcesException(); ctor public Surface.OutOfResourcesException(String); diff --git a/core/java/android/view/Surface.java b/core/java/android/view/Surface.java index 396be7b62b4d..03f9d9814b43 100644 --- a/core/java/android/view/Surface.java +++ b/core/java/android/view/Surface.java @@ -18,9 +18,11 @@ package android.view; import static android.system.OsConstants.EINVAL; +import android.annotation.FlaggedApi; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; +import android.annotation.SuppressLint; import android.compat.annotation.UnsupportedAppUsage; import android.content.pm.ActivityInfo; import android.content.res.CompatibilityInfo.Translator; @@ -1025,6 +1027,211 @@ public class Surface implements Parcelable { return mIsAutoRefreshEnabled; } + /** + * Parameter object for {@link #setFrameRate(FrameRateParams)}, describing the intended frame + * rate for the Surface that setFrameRate is called on. + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public static class FrameRateParams { + private FrameRateParams() {} + + /** + * A static FrameRateParams that can be passed directly into {@link + * #setFrameRate(FrameRateParams)} to indicate the surface has no preference and any frame + * rate is acceptable. + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public static final FrameRateParams IGNORE = + new FrameRateParams.Builder().setDesiredRateRange(0f, Float.MAX_VALUE).build(); + + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public static final class Builder { + private float mDesiredMinRate; + private float mDesiredMaxRate; + private float mFixedSourceRate; + private int mChangeFrameRateStrategy; + + /** + * Sets the desired frame rate range (inclusive) values for the surface, specifying that + * the surface prefers the device render rate to be in the range [desiredMinRate, + * desiredMaxRate]. + + * Set desiredMaxRate to FLOAT.MAX_VALUE to indicate the surface prefers any value + * greater than or equal to desiredMinRate. + * + * Set desiredMinRate = desiredMaxRate to indicate the surface prefers an exact frame + * rate. Note that this is different than specifying the fixed source frame rate with + * {@link FrameRateParams.Builder#setFixedSourceRate}. To reiterate, this call is used + * to specify the surface's frame rate preference to be within the desired range. + * + * desiredMaxRate must be greater than or equal to desiredMinRate. + * The values should be greater than or equal to 0. + * + * If the surface has no preference and any frame rate is acceptable, use the constant + * {@link FrameRateParams.IGNORE} in {@link #setFrameRate(FrameRateParams)} instead of + * building {@link FrameRateParams.Builder}. + * + * @see FrameRateParams#getDesiredMinRate() + * @see FrameRateParams#getDesiredMaxRate() + */ + @SuppressLint("MissingGetterMatchingBuilder") + @NonNull + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public Builder setDesiredRateRange(@FloatRange(from = 0.0) float desiredMinRate, + @FloatRange(from = 0.0) float desiredMaxRate) { + if (desiredMaxRate < desiredMinRate) { + Log.e(TAG, + "Failed to set desired frame rate range. desiredMaxRate should be " + + "greater than or equal to desiredMinRate"); + return this; + } + mDesiredMinRate = desiredMinRate; + mDesiredMaxRate = desiredMaxRate; + return this; + } + + /** + * Sets the fixed frame rate of the surface when its content has a fixed frame rate, + * e.g. a video with a fixed frame rate. + * + * When the frame rate chosen for the surface is the {@code fixedSourceRate} or a + * multiple, the surface can render without frame pulldown, for optimal smoothness. For + * example, a 30 fps video ({@code fixedSourceRate=30}) renders just as well on 30 fps, + * 60 fps, 90 fps, 120 fps, and so on. + * + * This method to set the fixed source rate can also be used together with a desired + * frame rate range via {@link FrameRateParams.Builder#setDesiredRateRange}. This still + * means the surface's content has a fixed frame rate of the provided {@code + * fixedSourceRate}, as well as it preferring to be within the desired frame rate range. + * For example, a 30 fps video {@code fixedSourceRate=30} and desired frame rate range + * [60,90] means the surface ideally prefers 60 fps (which is 30 fps * 2) or 90 fps (30 + * fps * 3). + * + * @see FrameRateParams#getFixedSourceRate() + */ + @NonNull + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public Builder setFixedSourceRate(@FloatRange(from = 0.0) float fixedSourceRate) { + mFixedSourceRate = fixedSourceRate; + return this; + } + + /** + * Whether display refresh rate transitions caused by this surface should be seamless. A + * seamless transition is one that doesn't have any visual interruptions, such as a + * black screen for a second or two. Value is + * Surface.CHANGE_FRAME_RATE_ONLY_IF_SEAMLESS, or Surface.CHANGE_FRAME_RATE_ALWAYS + * + * @see FrameRateParams#getChangeFrameRateStrategy() + */ + @NonNull + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public Builder setChangeFrameRateStrategy( + @ChangeFrameRateStrategy int changeFrameRateStrategy) { + mChangeFrameRateStrategy = changeFrameRateStrategy; + return this; + } + + /** + * Builds the FrameRateParams object. + */ + @NonNull + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public FrameRateParams build() { + FrameRateParams frameRate = new FrameRateParams(); + frameRate.mDesiredMinRate = this.mDesiredMinRate; + frameRate.mDesiredMaxRate = this.mDesiredMaxRate; + frameRate.mFixedSourceRate = this.mFixedSourceRate; + frameRate.mChangeFrameRateStrategy = this.mChangeFrameRateStrategy; + return frameRate; + } + } + + /** + * Gets the minimum desired frame rate. + * @see FrameRateParams.Builder#setDesiredRateRange() + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public float getDesiredMinRate() { + return mDesiredMinRate; + } + + /** + * Gets the maximum desired frame rate. + * @see FrameRateParams.Builder#setDesiredRateRange() + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public float getDesiredMaxRate() { + return mDesiredMaxRate; + } + + /** + * Gets the fixed source frame rate. + * @see FrameRateParams.Builder#setFixedSourceRate() + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public float getFixedSourceRate() { + return mFixedSourceRate; + } + + /** + * Gets the strategy when changing frame rate. + * @see FrameRateParams.Builder#setChangeFrameRateStrategy + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + @ChangeFrameRateStrategy + public int getChangeFrameRateStrategy() { + return mChangeFrameRateStrategy; + } + + float mDesiredMinRate; + float mDesiredMaxRate; + float mFixedSourceRate; + int mChangeFrameRateStrategy; + } + + /** + * Sets the intended frame rate for this surface. + * + *

On devices that are capable of running the display at different frame rates, + * the system may choose a display refresh rate to better match this surface's frame + * rate. Usage of this API won't introduce frame rate throttling, or affect other + * aspects of the application's frame production pipeline. However, because the system + * may change the display refresh rate, calls to this function may result in changes + * to Choreographer callback timings, and changes to the time interval at which the + * system releases buffers back to the application.

+ * + *

Note that this only has an effect for surfaces presented on the display. If this + * surface is consumed by something other than the system compositor, e.g. a media + * codec, this call has no effect.

+ * + * @param frameRateParams The parameters describing the intended frame rate of this surface. + * Refer to {@link FrameRateParams} for details. + * @throws IllegalArgumentException If frameRateParams is invalid. + * @see #clearFrameRate() + */ + @FlaggedApi(com.android.graphics.surfaceflinger.flags.Flags.FLAG_ARR_SETFRAMERATE_API) + public void setFrameRate(@NonNull FrameRateParams frameRateParams) { + synchronized (mLock) { + checkNotReleasedLocked(); + // TODO(b/362798998): Logic currently incomplete: it uses fixed source rate over the + // desired min/max rates. Fix when plumbing is upgraded. + int compatibility = frameRateParams.getFixedSourceRate() == 0 + ? FRAME_RATE_COMPATIBILITY_DEFAULT + : FRAME_RATE_COMPATIBILITY_FIXED_SOURCE; + float frameRate = compatibility == FRAME_RATE_COMPATIBILITY_DEFAULT + ? frameRateParams.getDesiredMinRate() + : frameRateParams.getFixedSourceRate(); + int error = nativeSetFrameRate(mNativeObject, frameRate, compatibility, + frameRateParams.getChangeFrameRateStrategy()); + if (error == -EINVAL) { + throw new IllegalArgumentException("Invalid argument to Surface.setFrameRate()"); + } else if (error != 0) { + Log.e(TAG, "Failed to set frame rate on Surface. Native error: " + error); + } + } + } + /** * Sets the intended frame rate for this surface. * -- GitLab From 76fb5581dee7074c4f07d4c0155ac4c0764bea1f Mon Sep 17 00:00:00 2001 From: Sungcheol Ahn Date: Wed, 9 Oct 2024 20:08:48 +0000 Subject: [PATCH 169/459] [satellite] Added onCarrierRoamingNtnAvailableServicesChanged callback Bug: 372753814 Test: atest TelephonyCallbackTest Flag: com.android.internal.telephony.flags.carrier_roaming_nb_iot_ntn Change-Id: Ib90bb023b3531b0ac377f99e5db368d8cf957893 --- .../android/telephony/PhoneStateListener.java | 5 ++ .../android/telephony/TelephonyCallback.java | 40 ++++++++++++- .../telephony/TelephonyRegistryManager.java | 20 +++++-- .../telephony/IPhoneStateListener.aidl | 1 + .../telephony/ITelephonyRegistry.aidl | 1 + .../com/android/server/TelephonyRegistry.java | 60 +++++++++++++++++++ .../telephony/satellite/SatelliteManager.java | 16 +++++ 7 files changed, 138 insertions(+), 5 deletions(-) diff --git a/core/java/android/telephony/PhoneStateListener.java b/core/java/android/telephony/PhoneStateListener.java index e8ef9d65a2b4..bce51f297aff 100644 --- a/core/java/android/telephony/PhoneStateListener.java +++ b/core/java/android/telephony/PhoneStateListener.java @@ -1701,6 +1701,11 @@ public class PhoneStateListener { public final void onCarrierRoamingNtnEligibleStateChanged(boolean eligible) { // not supported on the deprecated interface - Use TelephonyCallback instead } + + public final void onCarrierRoamingNtnAvailableServicesChanged( + @NetworkRegistrationInfo.ServiceType int[] availableServices) { + // not supported on the deprecated interface - Use TelephonyCallback instead + } } private void log(String s) { diff --git a/core/java/android/telephony/TelephonyCallback.java b/core/java/android/telephony/TelephonyCallback.java index 5295b606dd19..46e27dc60adc 100644 --- a/core/java/android/telephony/TelephonyCallback.java +++ b/core/java/android/telephony/TelephonyCallback.java @@ -680,6 +680,20 @@ public class TelephonyCallback { */ public static final int EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED = 43; + /** + * Event for listening to changes in carrier roaming non-terrestrial network available services + * via callback onCarrierRoamingNtnAvailableServicesChanged(). + * This callback is triggered when the available services provided by the carrier roaming + * satellite changes. The carrier roaming satellite is defined by the following conditions. + *
    + *
  • Subscription supports attaching to satellite which is defined by + * {@link CarrierConfigManager#KEY_SATELLITE_ATTACH_SUPPORTED_BOOL}
  • + *
+ * + * @hide + */ + public static final int EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED = 44; + /** * @hide */ @@ -726,7 +740,8 @@ public class TelephonyCallback { EVENT_EMERGENCY_CALLBACK_MODE_CHANGED, EVENT_SIMULTANEOUS_CELLULAR_CALLING_SUBSCRIPTIONS_CHANGED, EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED, - EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED + EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED, + EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED }) @Retention(RetentionPolicy.SOURCE) public @interface TelephonyEvent { @@ -1784,6 +1799,15 @@ public class TelephonyCallback { * */ default void onCarrierRoamingNtnEligibleStateChanged(boolean eligible) {} + + /** + * Callback invoked when carrier roaming non-terrestrial network available + * service changes. + * + * @param availableServices The list of the supported services. + */ + default void onCarrierRoamingNtnAvailableServicesChanged( + @NetworkRegistrationInfo.ServiceType List availableServices) {} } /** @@ -2235,5 +2259,19 @@ public class TelephonyCallback { Binder.withCleanCallingIdentity(() -> mExecutor.execute( () -> listener.onCarrierRoamingNtnEligibleStateChanged(eligible))); } + + public void onCarrierRoamingNtnAvailableServicesChanged( + @NetworkRegistrationInfo.ServiceType int[] availableServices) { + if (!Flags.carrierRoamingNbIotNtn()) return; + + CarrierRoamingNtnModeListener listener = + (CarrierRoamingNtnModeListener) mTelephonyCallbackWeakRef.get(); + if (listener == null) return; + + List ServiceList = Arrays.stream(availableServices).boxed() + .collect(Collectors.toList()); + Binder.withCleanCallingIdentity(() -> mExecutor.execute( + () -> listener.onCarrierRoamingNtnAvailableServicesChanged(ServiceList))); + } } } diff --git a/core/java/android/telephony/TelephonyRegistryManager.java b/core/java/android/telephony/TelephonyRegistryManager.java index 3c7e924f07df..4d50a450490e 100644 --- a/core/java/android/telephony/TelephonyRegistryManager.java +++ b/core/java/android/telephony/TelephonyRegistryManager.java @@ -1117,6 +1117,21 @@ public class TelephonyRegistryManager { } } + /** + * Notify external listeners that carrier roaming non-terrestrial available services changed. + * @param availableServices The list of the supported services. + * @hide + */ + public void notifyCarrierRoamingNtnAvailableServicesChanged( + int subId, @NetworkRegistrationInfo.ServiceType int[] availableServices) { + try { + sRegistry.notifyCarrierRoamingNtnAvailableServicesChanged(subId, availableServices); + } catch (RemoteException ex) { + // system server crash + throw ex.rethrowFromSystemServer(); + } + } + /** * Processes potential event changes from the provided {@link TelephonyCallback}. * @@ -1272,12 +1287,9 @@ public class TelephonyRegistryManager { if (telephonyCallback instanceof TelephonyCallback.CarrierRoamingNtnModeListener) { eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_MODE_CHANGED); - } - - if (telephonyCallback instanceof TelephonyCallback.CarrierRoamingNtnModeListener) { eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_ELIGIBLE_STATE_CHANGED); + eventList.add(TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED); } - return eventList; } diff --git a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl index 81b885aa626b..b5c87868af12 100644 --- a/core/java/com/android/internal/telephony/IPhoneStateListener.aidl +++ b/core/java/com/android/internal/telephony/IPhoneStateListener.aidl @@ -84,4 +84,5 @@ oneway interface IPhoneStateListener { void onSimultaneousCallingStateChanged(in int[] subIds); void onCarrierRoamingNtnModeChanged(in boolean active); void onCarrierRoamingNtnEligibleStateChanged(in boolean eligible); + void onCarrierRoamingNtnAvailableServicesChanged(in int[] availableServices); } diff --git a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl index f836cf2b9d87..ca75abdedfcc 100644 --- a/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl +++ b/core/java/com/android/internal/telephony/ITelephonyRegistry.aidl @@ -123,4 +123,5 @@ interface ITelephonyRegistry { void notifyCallbackModeStopped(int phoneId, int subId, int type, int reason); void notifyCarrierRoamingNtnModeChanged(int subId, in boolean active); void notifyCarrierRoamingNtnEligibleStateChanged(int subId, in boolean eligible); + void notifyCarrierRoamingNtnAvailableServicesChanged(int subId, in int[] availableServices); } diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java index 39ac5150c7f1..363807d2aa8c 100644 --- a/services/core/java/com/android/server/TelephonyRegistry.java +++ b/services/core/java/com/android/server/TelephonyRegistry.java @@ -68,6 +68,7 @@ import android.telephony.CellSignalStrengthWcdma; import android.telephony.DisconnectCause; import android.telephony.LinkCapacityEstimate; import android.telephony.LocationAccessPolicy; +import android.telephony.NetworkRegistrationInfo; import android.telephony.PhoneCapability; import android.telephony.PhoneStateListener; import android.telephony.PhysicalChannelConfig; @@ -90,6 +91,7 @@ import android.telephony.ims.MediaQualityStatus; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; +import android.util.IntArray; import android.util.LocalLog; import android.util.Pair; import android.util.SparseArray; @@ -429,6 +431,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { private boolean[] mCarrierRoamingNtnMode = null; private boolean[] mCarrierRoamingNtnEligible = null; + private List mCarrierRoamingNtnAvailableServices; + /** * Per-phone map of precise data connection state. The key of the map is the pair of transport * type and APN setting. This is the cache to prevent redundant callbacks to the listeners. @@ -741,6 +745,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { cutListToSize(mCarrierServiceStates, mNumPhones); cutListToSize(mCallStateLists, mNumPhones); cutListToSize(mMediaQualityStatus, mNumPhones); + cutListToSize(mCarrierRoamingNtnAvailableServices, mNumPhones); return; } @@ -789,6 +794,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mSCBMDuration[i] = 0; mCarrierRoamingNtnMode[i] = false; mCarrierRoamingNtnEligible[i] = false; + mCarrierRoamingNtnAvailableServices.add(i, new IntArray()); } } } @@ -864,6 +870,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mSCBMDuration = new long[numPhones]; mCarrierRoamingNtnMode = new boolean[numPhones]; mCarrierRoamingNtnEligible = new boolean[numPhones]; + mCarrierRoamingNtnAvailableServices = new ArrayList<>(); for (int i = 0; i < numPhones; i++) { mCallState[i] = TelephonyManager.CALL_STATE_IDLE; @@ -909,6 +916,7 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { mSCBMDuration[i] = 0; mCarrierRoamingNtnMode[i] = false; mCarrierRoamingNtnEligible[i] = false; + mCarrierRoamingNtnAvailableServices.add(i, new IntArray()); } mAppOps = mContext.getSystemService(AppOpsManager.class); @@ -1533,6 +1541,15 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { remove(r.binder); } } + if (events.contains( + TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED)) { + try { + r.callback.onCarrierRoamingNtnAvailableServicesChanged( + mCarrierRoamingNtnAvailableServices.get(r.phoneId).toArray()); + } catch (RemoteException ex) { + remove(r.binder); + } + } } } } @@ -3642,6 +3659,47 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { } } + /** + * Notify external listeners that carrier roaming non-terrestrial available services changed. + * @param availableServices The list of the supported services. + */ + public void notifyCarrierRoamingNtnAvailableServicesChanged( + int subId, @NetworkRegistrationInfo.ServiceType int[] availableServices) { + if (!checkNotifyPermission("notifyCarrierRoamingNtnEligibleStateChanged")) { + log("notifyCarrierRoamingNtnAvailableServicesChanged: caller does not have required " + + "permissions."); + return; + } + + if (VDBG) { + log("notifyCarrierRoamingNtnAvailableServicesChanged: " + + "availableServices=" + Arrays.toString(availableServices)); + } + + synchronized (mRecords) { + int phoneId = getPhoneIdFromSubId(subId); + if (!validatePhoneId(phoneId)) { + loge("Invalid phone ID " + phoneId + " for " + subId); + return; + } + IntArray availableServicesIntArray = new IntArray(availableServices.length); + availableServicesIntArray.addAll(availableServices); + mCarrierRoamingNtnAvailableServices.set(phoneId, availableServicesIntArray); + for (Record r : mRecords) { + if (r.matchTelephonyCallbackEvent( + TelephonyCallback.EVENT_CARRIER_ROAMING_NTN_AVAILABLE_SERVICES_CHANGED) + && idMatch(r, subId, phoneId)) { + try { + r.callback.onCarrierRoamingNtnAvailableServicesChanged(availableServices); + } catch (RemoteException ex) { + mRemoveList.add(r.binder); + } + } + } + handleRemoveListLocked(); + } + } + @NeverCompile // Avoid size overhead of debugging code. @Override public void dump(FileDescriptor fd, PrintWriter writer, String[] args) { @@ -3706,6 +3764,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub { Pair carrierServiceState = mCarrierServiceStates.get(i); pw.println("mCarrierServiceState="); + pw.println("mCarrierRoamingNtnAvailableServices=" + + mCarrierRoamingNtnAvailableServices.get(i)); pw.decreaseIndent(); } diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java index 44de65a009ff..79b3a7c4de65 100644 --- a/telephony/java/android/telephony/satellite/SatelliteManager.java +++ b/telephony/java/android/telephony/satellite/SatelliteManager.java @@ -581,6 +581,22 @@ public final class SatelliteManager { public static final String ACTION_SATELLITE_SUBSCRIBER_ID_LIST_CHANGED = "android.telephony.action.ACTION_SATELLITE_SUBSCRIBER_ID_LIST_CHANGED"; + /** + * Meta-data represents whether the application supports P2P SMS over carrier roaming satellite + * which needs manual trigger to connect to satellite. The messaging applications that supports + * P2P SMS over carrier roaming satellites should add the following in their AndroidManifest. + * {@code + * + * + * } + * @hide + */ + public static final String METADATA_SATELLITE_MANUAL_CONNECT_P2P_SUPPORT = + "android.telephony.METADATA_SATELLITE_MANUAL_CONNECT_P2P_SUPPORT"; + /** * Request to enable or disable the satellite modem and demo mode. * If satellite modem and cellular modem cannot work concurrently, -- GitLab From 1f88ab50f110814561189e1d0b947f779341fa08 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Mon, 21 Oct 2024 18:05:23 -0700 Subject: [PATCH 170/459] Remove dependency on PowerStatsUidResolver from PowerStatsProcessors Bug: 346371828 Test: atest PowerStatsTests; atest PowerStatsTestsRavenwood Flag: EXEMPT_bugfix Change-Id: Ieaede11e69333a84ffde4f6250a62b5325e6ddee --- .../server/am/BatteryStatsService.java | 3 +-- .../processor/AudioPowerStatsProcessor.java | 6 ++---- .../BinaryStatePowerStatsProcessor.java | 16 +++++--------- .../processor/CameraPowerStatsProcessor.java | 6 ++---- .../FlashlightPowerStatsProcessor.java | 6 ++---- .../processor/GnssPowerStatsProcessor.java | 8 +++---- .../processor/MultiStatePowerAttributor.java | 21 +++++++------------ .../processor/VideoPowerStatsProcessor.java | 5 ++--- .../stats/BatteryUsageStatsProviderTest.java | 4 ++-- .../BinaryStatePowerStatsProcessorTest.java | 11 ++++------ .../stats/processor/CameraPowerStatsTest.java | 2 +- .../stats/processor/GnssPowerStatsTest.java | 6 +++--- .../processor/PowerStatsExporterTest.java | 5 ++--- 13 files changed, 37 insertions(+), 62 deletions(-) diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index c47cad955202..7f999a98ed6b 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -443,8 +443,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub mPowerStatsStore = new PowerStatsStore(systemDir, mHandler); mPowerAttributor = new MultiStatePowerAttributor(mContext, mPowerStatsStore, mPowerProfile, - mCpuScalingPolicies, () -> mStats.getBatteryCapacity(), - mPowerStatsUidResolver); + mCpuScalingPolicies, () -> mStats.getBatteryCapacity()); mPowerStatsScheduler = createPowerStatsScheduler(mContext); int accumulatedBatteryUsageStatsSpanSize = mContext.getResources().getInteger( diff --git a/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java index ad1b4a7cc487..f5d10fdd2dd2 100644 --- a/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/AudioPowerStatsProcessor.java @@ -20,12 +20,10 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; -import com.android.server.power.stats.PowerStatsUidResolver; class AudioPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - AudioPowerStatsProcessor(PowerProfile powerProfile, - PowerStatsUidResolver uidResolver) { - super(BatteryConsumer.POWER_COMPONENT_AUDIO, uidResolver, + AudioPowerStatsProcessor(PowerProfile powerProfile) { + super(BatteryConsumer.POWER_COMPONENT_AUDIO, powerProfile.getAveragePower(PowerProfile.POWER_AUDIO)); } diff --git a/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java index e45a707bdc8d..9fe7f3e7a542 100644 --- a/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessor.java @@ -22,7 +22,6 @@ import android.os.PersistableBundle; import android.os.Process; import com.android.internal.os.PowerStats; -import com.android.server.power.stats.PowerStatsUidResolver; import com.android.server.power.stats.UsageBasedPowerEstimator; import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; @@ -45,7 +44,6 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor { } private final int mPowerComponentId; - private final PowerStatsUidResolver mUidResolver; private final UsageBasedPowerEstimator mUsageBasedPowerEstimator; private boolean mEnergyConsumerSupported; private int mInitiatingUid = Process.INVALID_UID; @@ -60,18 +58,14 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor { private long[] mTmpDeviceStatsArray; private long[] mTmpUidStatsArray; - BinaryStatePowerStatsProcessor(int powerComponentId, - PowerStatsUidResolver uidResolver, double averagePowerMilliAmp) { - this(powerComponentId, uidResolver, averagePowerMilliAmp, - new BinaryStatePowerStatsLayout()); + BinaryStatePowerStatsProcessor(int powerComponentId, double averagePowerMilliAmp) { + this(powerComponentId, averagePowerMilliAmp, new BinaryStatePowerStatsLayout()); } - BinaryStatePowerStatsProcessor(int powerComponentId, - PowerStatsUidResolver uidResolver, double averagePowerMilliAmp, + BinaryStatePowerStatsProcessor(int powerComponentId, double averagePowerMilliAmp, BinaryStatePowerStatsLayout statsLayout) { mPowerComponentId = powerComponentId; mUsageBasedPowerEstimator = new UsageBasedPowerEstimator(averagePowerMilliAmp); - mUidResolver = uidResolver; mStatsLayout = statsLayout; } @@ -115,13 +109,13 @@ abstract class BinaryStatePowerStatsProcessor extends PowerStatsProcessor { if (state == STATE_ON) { if (item.eventCode == (BatteryStats.HistoryItem.EVENT_STATE_CHANGE | BatteryStats.HistoryItem.EVENT_FLAG_START)) { - mInitiatingUid = mUidResolver.mapUid(item.eventTag.uid); + mInitiatingUid = item.eventTag.uid; } } else { if (mInitiatingUid == Process.INVALID_UID) { if (item.eventCode == (BatteryStats.HistoryItem.EVENT_STATE_CHANGE | BatteryStats.HistoryItem.EVENT_FLAG_FINISH)) { - mInitiatingUid = mUidResolver.mapUid(item.eventTag.uid); + mInitiatingUid = item.eventTag.uid; } } recordUsageDuration(mPowerStats, mInitiatingUid, item.time); diff --git a/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java index 830906167ee2..46e060011d92 100644 --- a/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/CameraPowerStatsProcessor.java @@ -20,12 +20,10 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; -import com.android.server.power.stats.PowerStatsUidResolver; class CameraPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - CameraPowerStatsProcessor(PowerProfile powerProfile, - PowerStatsUidResolver uidResolver) { - super(BatteryConsumer.POWER_COMPONENT_CAMERA, uidResolver, + CameraPowerStatsProcessor(PowerProfile powerProfile) { + super(BatteryConsumer.POWER_COMPONENT_CAMERA, powerProfile.getAveragePower(PowerProfile.POWER_CAMERA)); } diff --git a/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java index b0bef69dfc49..e9c1b8253123 100644 --- a/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/FlashlightPowerStatsProcessor.java @@ -20,12 +20,10 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; -import com.android.server.power.stats.PowerStatsUidResolver; class FlashlightPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - FlashlightPowerStatsProcessor(PowerProfile powerProfile, - PowerStatsUidResolver uidResolver) { - super(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, uidResolver, + FlashlightPowerStatsProcessor(PowerProfile powerProfile) { + super(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, powerProfile.getAveragePower(PowerProfile.POWER_FLASHLIGHT)); } diff --git a/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java index f1e3e90e7099..2476432dc504 100644 --- a/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/GnssPowerStatsProcessor.java @@ -23,7 +23,6 @@ import android.os.Process; import com.android.internal.os.PowerProfile; import com.android.internal.os.PowerStats; -import com.android.server.power.stats.PowerStatsUidResolver; import com.android.server.power.stats.UsageBasedPowerEstimator; import com.android.server.power.stats.format.GnssPowerStatsLayout; @@ -40,10 +39,9 @@ class GnssPowerStatsProcessor extends BinaryStatePowerStatsProcessor { private final long[] mGnssSignalDurations = new long[GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS]; - GnssPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { - super(BatteryConsumer.POWER_COMPONENT_GNSS, uidResolver, - powerProfile.getAveragePower(PowerProfile.POWER_GPS_ON), - sStatsLayout); + GnssPowerStatsProcessor(PowerProfile powerProfile) { + super(BatteryConsumer.POWER_COMPONENT_GNSS, + powerProfile.getAveragePower(PowerProfile.POWER_GPS_ON), sStatsLayout); boolean useSignalLevelEstimators = false; for (int level = 0; level < GnssSignalQuality.NUM_GNSS_SIGNAL_QUALITY_LEVELS; level++) { diff --git a/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java index 25d50f7a045b..877a06fb8c4f 100644 --- a/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java +++ b/services/core/java/com/android/server/power/stats/processor/MultiStatePowerAttributor.java @@ -32,7 +32,6 @@ import com.android.internal.os.PowerProfile; import com.android.server.power.stats.PowerAttributor; import com.android.server.power.stats.PowerStatsSpan; import com.android.server.power.stats.PowerStatsStore; -import com.android.server.power.stats.PowerStatsUidResolver; import java.util.List; import java.util.function.DoubleSupplier; @@ -45,15 +44,12 @@ public class MultiStatePowerAttributor implements PowerAttributor { private final PowerStatsAggregator mPowerStatsAggregator; private final SparseBooleanArray mPowerStatsExporterEnabled = new SparseBooleanArray(); - // TODO(b/346371828): remove dependency on PowerStatsUidResolver. At the time of power - // attribution isolates UIDs are supposed to be long forgotten. public MultiStatePowerAttributor(Context context, PowerStatsStore powerStatsStore, @NonNull PowerProfile powerProfile, @NonNull CpuScalingPolicies cpuScalingPolicies, - @NonNull DoubleSupplier batteryCapacitySupplier, - @NonNull PowerStatsUidResolver powerStatsUidResolver) { + @NonNull DoubleSupplier batteryCapacitySupplier) { this(powerStatsStore, new PowerStatsAggregator( createAggregatedPowerStatsConfig(context, powerProfile, cpuScalingPolicies, - batteryCapacitySupplier, powerStatsUidResolver))); + batteryCapacitySupplier))); } @VisibleForTesting @@ -69,7 +65,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { private static AggregatedPowerStatsConfig createAggregatedPowerStatsConfig(Context context, PowerProfile powerProfile, CpuScalingPolicies cpuScalingPolicies, - DoubleSupplier batteryCapacitySupplier, PowerStatsUidResolver powerStatsUidResolver) { + DoubleSupplier batteryCapacitySupplier) { AggregatedPowerStatsConfig config = new AggregatedPowerStatsConfig(); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_BASE) .trackDeviceStates( @@ -157,7 +153,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier( - () -> new AudioPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + () -> new AudioPowerStatsProcessor(powerProfile)); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_VIDEO) .trackDeviceStates( @@ -168,7 +164,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier( - () -> new VideoPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + () -> new VideoPowerStatsProcessor(powerProfile)); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT) .trackDeviceStates( @@ -179,8 +175,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier( - () -> new FlashlightPowerStatsProcessor(powerProfile, - powerStatsUidResolver)); + () -> new FlashlightPowerStatsProcessor(powerProfile)); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_CAMERA) .trackDeviceStates( @@ -191,7 +186,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier( - () -> new CameraPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + () -> new CameraPowerStatsProcessor(powerProfile)); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_GNSS) .trackDeviceStates( @@ -202,7 +197,7 @@ public class MultiStatePowerAttributor implements PowerAttributor { AggregatedPowerStatsConfig.STATE_SCREEN, AggregatedPowerStatsConfig.STATE_PROCESS_STATE) .setProcessorSupplier( - () -> new GnssPowerStatsProcessor(powerProfile, powerStatsUidResolver)); + () -> new GnssPowerStatsProcessor(powerProfile)); config.trackPowerComponent(BatteryConsumer.POWER_COMPONENT_SENSORS) .trackDeviceStates( diff --git a/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java b/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java index a6c380725fa5..5514ca7763f9 100644 --- a/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java +++ b/services/core/java/com/android/server/power/stats/processor/VideoPowerStatsProcessor.java @@ -20,11 +20,10 @@ import android.os.BatteryConsumer; import android.os.BatteryStats; import com.android.internal.os.PowerProfile; -import com.android.server.power.stats.PowerStatsUidResolver; class VideoPowerStatsProcessor extends BinaryStatePowerStatsProcessor { - VideoPowerStatsProcessor(PowerProfile powerProfile, PowerStatsUidResolver uidResolver) { - super(BatteryConsumer.POWER_COMPONENT_VIDEO, uidResolver, + VideoPowerStatsProcessor(PowerProfile powerProfile) { + super(BatteryConsumer.POWER_COMPONENT_VIDEO, powerProfile.getAveragePower(PowerProfile.POWER_VIDEO)); } diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java index e9d95fcbccea..894222bcd5c8 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/BatteryUsageStatsProviderTest.java @@ -260,7 +260,7 @@ public class BatteryUsageStatsProviderTest { MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext, mock(PowerStatsStore.class), mStatsRule.getPowerProfile(), - mStatsRule.getCpuScalingPolicies(), () -> 3500, new PowerStatsUidResolver()); + mStatsRule.getCpuScalingPolicies(), () -> 3500); powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_AUDIO, true); powerAttributor.setPowerComponentSupported(BatteryConsumer.POWER_COMPONENT_FLASHLIGHT, @@ -600,7 +600,7 @@ public class BatteryUsageStatsProviderTest { MultiStatePowerAttributor powerAttributor = new MultiStatePowerAttributor(mContext, powerStatsStore, mStatsRule.getPowerProfile(), mStatsRule.getCpuScalingPolicies(), - () -> 3500, new PowerStatsUidResolver()); + () -> 3500); for (int powerComponentId = 0; powerComponentId < BatteryConsumer.POWER_COMPONENT_COUNT; powerComponentId++) { powerAttributor.setPowerComponentSupported(powerComponentId, true); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java index b412ad6edbca..2ff7dde3255f 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/BinaryStatePowerStatsProcessorTest.java @@ -41,7 +41,6 @@ import androidx.annotation.NonNull; import com.android.internal.os.MonotonicClock; import com.android.internal.os.PowerStats; import com.android.server.power.stats.MockClock; -import com.android.server.power.stats.PowerStatsUidResolver; import com.android.server.power.stats.format.BinaryStatePowerStatsLayout; import org.junit.Rule; @@ -63,12 +62,10 @@ public class BinaryStatePowerStatsProcessorTest { private final MockClock mClock = new MockClock(); private final MonotonicClock mMonotonicClock = new MonotonicClock(0, mClock); - private final PowerStatsUidResolver mUidResolver = new PowerStatsUidResolver(); private static class TestBinaryStatePowerStatsProcessor extends BinaryStatePowerStatsProcessor { - TestBinaryStatePowerStatsProcessor(int powerComponentId, - double averagePowerMilliAmp, PowerStatsUidResolver uidResolver) { - super(powerComponentId, uidResolver, averagePowerMilliAmp); + TestBinaryStatePowerStatsProcessor(int powerComponentId, double averagePowerMilliAmp) { + super(powerComponentId, averagePowerMilliAmp); } @Override @@ -83,7 +80,7 @@ public class BinaryStatePowerStatsProcessorTest { PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( () -> new TestBinaryStatePowerStatsProcessor( - POWER_COMPONENT, /* averagePowerMilliAmp */ 100, mUidResolver)); + POWER_COMPONENT, /* averagePowerMilliAmp */ 100)); stats.noteStateChange(buildHistoryItem(0, true, APP_UID1)); @@ -161,7 +158,7 @@ public class BinaryStatePowerStatsProcessorTest { PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( () -> new TestBinaryStatePowerStatsProcessor( - POWER_COMPONENT, /* averagePowerMilliAmp */ 100, mUidResolver)); + POWER_COMPONENT, /* averagePowerMilliAmp */ 100)); stats.start(0); diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java index 0afcbf15415c..23642de466a1 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/CameraPowerStatsTest.java @@ -125,7 +125,7 @@ public class CameraPowerStatsTest { .thenReturn(new int[]{ENERGY_CONSUMER_ID}); PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( - () -> new CameraPowerStatsProcessor(mStatsRule.getPowerProfile(), mUidResolver)); + () -> new CameraPowerStatsProcessor(mStatsRule.getPowerProfile())); CameraPowerStatsCollector collector = new CameraPowerStatsCollector(mInjector); collector.addConsumer( diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java index e6207d48d8a0..c63267ec6ae7 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/GnssPowerStatsTest.java @@ -130,7 +130,7 @@ public class GnssPowerStatsTest { .thenReturn(new int[0]); PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( - () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile(), mUidResolver)); + () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile())); GnssPowerStatsCollector collector = new GnssPowerStatsCollector(mInjector); collector.addConsumer( @@ -220,7 +220,7 @@ public class GnssPowerStatsTest { .thenReturn(new int[0]); PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( - () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile(), mUidResolver)); + () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile())); stats.noteStateChange(buildHistoryItemInitialStateGpsOn(0)); @@ -299,7 +299,7 @@ public class GnssPowerStatsTest { .thenReturn(new int[]{ENERGY_CONSUMER_ID}); PowerComponentAggregatedPowerStats stats = createAggregatedPowerStats( - () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile(), mUidResolver)); + () -> new GnssPowerStatsProcessor(mStatsRule.getPowerProfile())); GnssPowerStatsCollector collector = new GnssPowerStatsCollector(mInjector); collector.addConsumer( diff --git a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java index 8475d5696252..4643dddb1a33 100644 --- a/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java +++ b/services/tests/powerstatstests/src/com/android/server/power/stats/processor/PowerStatsExporterTest.java @@ -45,7 +45,6 @@ import com.android.internal.os.PowerStats; import com.android.server.power.stats.BatteryUsageStatsRule; import com.android.server.power.stats.MockClock; import com.android.server.power.stats.PowerStatsStore; -import com.android.server.power.stats.PowerStatsUidResolver; import com.android.server.power.stats.format.CpuPowerStatsLayout; import com.android.server.power.stats.format.EnergyConsumerPowerStatsLayout; @@ -132,8 +131,8 @@ public class PowerStatsExporterTest { null, 0, mCpuStatsArrayLayout.getUidStatsArrayLength(), extras); mPowerAttributor = new MultiStatePowerAttributor(mock(Context.class), mPowerStatsStore, - mock(PowerProfile.class), mock(CpuScalingPolicies.class), () -> 3500, - mock(PowerStatsUidResolver.class)); + mock(PowerProfile.class), mock(CpuScalingPolicies.class), () -> 3500 + ); } @Test -- GitLab From 93e76000c43dea214fad61cf36588f51f3992fc9 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 30 Sep 2024 03:32:54 +0000 Subject: [PATCH 171/459] Implements the API to opt-in to auto-save embedding state Bug: 373415282 Bug: 289875940 Test: verified on demo app Flag: com.android.window.flags.ae_back_stack_restore Change-Id: Ie553f1545dc091aee5f32e66aff3da280f054567 --- .../extensions/embedding/BackupHelper.java | 36 ++++++++++++++++--- .../extensions/embedding/SplitController.java | 12 +++++++ .../extensions/embedding/SplitPresenter.java | 4 +++ .../extensions/embedding/TaskContainer.java | 8 +---- 4 files changed, 49 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java index 6ad2f088ce95..220fc6f82a71 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/BackupHelper.java @@ -54,6 +54,7 @@ class BackupHelper { @NonNull private final BackupIdler mBackupIdler = new BackupIdler(); private boolean mBackupIdlerScheduled; + private boolean mSaveEmbeddingState = false; private final List mParcelableTaskContainerDataList = new ArrayList<>(); @@ -71,11 +72,32 @@ class BackupHelper { } } + void setAutoSaveEmbeddingState(boolean saveEmbeddingState) { + if (mSaveEmbeddingState == saveEmbeddingState) { + return; + } + + Log.i(TAG, "Set save embedding state: " + saveEmbeddingState); + mSaveEmbeddingState = saveEmbeddingState; + if (!mSaveEmbeddingState) { + removeSavedState(); + return; + } + + if (!hasPendingStateToRestore() && !mController.getTaskContainers().isEmpty()) { + scheduleBackup(); + } + } /** * Schedules a back-up request. It is no-op if there was a request scheduled and not yet * completed. */ void scheduleBackup() { + if (!mSaveEmbeddingState) { + // TODO(b/289875940): enabled internally for broader testing. + return; + } + if (!mBackupIdlerScheduled) { mBackupIdlerScheduled = true; Looper.getMainLooper().getQueue().addIdleHandler(mBackupIdler); @@ -128,7 +150,6 @@ class BackupHelper { final List infos = savedState.getParcelableArrayList( KEY_RESTORE_TASK_FRAGMENTS_INFO, TaskFragmentInfo.class); for (TaskFragmentInfo info : infos) { - if (DEBUG) Log.d(TAG, "Retrieved: " + info); mTaskFragmentInfos.put(info.getFragmentToken(), info); mPresenter.updateTaskFragmentInfo(info); } @@ -140,6 +161,11 @@ class BackupHelper { if (DEBUG) Log.d(TAG, "Retrieved: " + info); mTaskFragmentParentInfos.put(info.getTaskId(), info); } + + if (DEBUG) { + Log.d(TAG, "Retrieved task-fragment info: " + infos.size() + ", task info: " + + parentInfos.size()); + } } void abortTaskContainerRebuilding(@NonNull WindowContainerTransaction wct) { @@ -148,7 +174,6 @@ class BackupHelper { final TaskFragmentInfo info = mTaskFragmentInfos.valueAt(i); mPresenter.deleteTaskFragment(wct, info.getFragmentToken()); } - removeSavedState(); } @@ -190,6 +215,9 @@ class BackupHelper { final ArrayMap embeddingRuleMap = new ArrayMap<>(); for (EmbeddingRule rule : rules) { embeddingRuleMap.put(rule.getTag(), rule); + if (DEBUG) { + Log.d(TAG, "Tag: " + rule.getTag() + " rule: " + rule); + } } boolean restoredAny = false; @@ -201,7 +229,7 @@ class BackupHelper { // has unknown tag, unable to restore. if (DEBUG) { Log.d(TAG, "Rebuilding TaskContainer abort! Unknown Tag. Task#" - + parcelableTaskContainerData.mTaskId); + + parcelableTaskContainerData.mTaskId + ", tags = " + tags); } continue; } @@ -217,7 +245,7 @@ class BackupHelper { final TaskContainer taskContainer = new TaskContainer(parcelableTaskContainerData, mController, mTaskFragmentInfos); - if (DEBUG) Log.d(TAG, "Created TaskContainer " + taskContainer); + if (DEBUG) Log.d(TAG, "Created TaskContainer " + taskContainer.getTaskId()); mController.addTaskContainer(taskContainer.getTaskId(), taskContainer); for (ParcelableSplitContainerData splitData : diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index 3368e2eab3ad..60e1a506ab73 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -2886,6 +2886,18 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen return getActiveSplitForContainer(container) != null; } + + @Override + public void setAutoSaveEmbeddingState(boolean saveEmbeddingState) { + if (!Flags.aeBackStackRestore()) { + return; + } + + synchronized (mLock) { + mPresenter.setAutoSaveEmbeddingState(saveEmbeddingState); + } + } + void scheduleBackup() { synchronized (mLock) { mPresenter.scheduleBackup(); diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java index b498ee2ff438..9a2f32e9ee99 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitPresenter.java @@ -183,6 +183,10 @@ class SplitPresenter extends JetpackTaskFragmentOrganizer { } } + void setAutoSaveEmbeddingState(boolean saveEmbeddingState) { + mBackupHelper.setAutoSaveEmbeddingState(saveEmbeddingState); + } + void scheduleBackup() { mBackupHelper.scheduleBackup(); } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java index b453f1d4e936..6928409fd819 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/TaskContainer.java @@ -48,8 +48,6 @@ import androidx.window.extensions.embedding.SplitAttributes.SplitType; import androidx.window.extensions.embedding.SplitAttributes.SplitType.ExpandContainersSplitType; import androidx.window.extensions.embedding.SplitAttributes.SplitType.RatioSplitType; -import com.android.window.flags.Flags; - import java.util.ArrayList; import java.util.List; import java.util.Set; @@ -634,11 +632,7 @@ class TaskContainer { // pin container. updateAlwaysOnTopOverlayIfNecessary(); - // TODO(b/289875940): Making backup-restore as an opt-in solution, before the flag goes - // to next-food. - if (Flags.aeBackStackRestore()) { - mSplitController.scheduleBackup(); - } + mSplitController.scheduleBackup(); } private void updateAlwaysOnTopOverlayIfNecessary() { -- GitLab From c32860dcc6c2e97bdbc161013f33e35c70a5e04c Mon Sep 17 00:00:00 2001 From: Shan Huang Date: Fri, 11 Oct 2024 10:20:48 -0700 Subject: [PATCH 172/459] Window blur bench scenes. Bug: 374373768 Test: adb shell /data/benchmarktest/hwuimacro/hwuimacro windowblurkawase -c 1000 Test: adb shell /data/benchmarktest/hwuimacro/hwuimacro windowblurskia -c 1000 Flag: EXEMPT test only Change-Id: Ic539bf1e6775ffcd787c8d9e23e959c8f314f9ca --- .../tests/common/scenes/WindowBlurKawase.cpp | 141 ++++++++++++++++++ .../tests/common/scenes/WindowBlurSkia.cpp | 104 +++++++++++++ 2 files changed, 245 insertions(+) create mode 100644 libs/hwui/tests/common/scenes/WindowBlurKawase.cpp create mode 100644 libs/hwui/tests/common/scenes/WindowBlurSkia.cpp diff --git a/libs/hwui/tests/common/scenes/WindowBlurKawase.cpp b/libs/hwui/tests/common/scenes/WindowBlurKawase.cpp new file mode 100644 index 000000000000..5905b32e7589 --- /dev/null +++ b/libs/hwui/tests/common/scenes/WindowBlurKawase.cpp @@ -0,0 +1,141 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SkImageFilters.h" +#include "TestSceneBase.h" +#include "include/gpu/GpuTypes.h" // from Skia +#include "tests/common/BitmapAllocationTestUtils.h" +#include "utils/Color.h" + +class WindowBlurKawase; + +static TestScene::Registrar _WindowBlurKawase(TestScene::Info{ + "windowblurkawase", "Draws window Kawase blur", + TestScene::simpleCreateScene}); + +/** + * Simulates the multi-pass Kawase blur algorithm in + * frameworks/native/libs/renderengine/skia/filters/WindowBlurKawaseFilter.cpp + */ +class WindowBlurKawase : public TestScene { +private: + // Keep in sync with + // frameworks/native/libs/renderengine/skia/filters/KawaseBlurFilter.h + static constexpr uint32_t kMaxPasses = 4; + // Keep in sync with frameworks/native/libs/renderengine/skia/filters/BlurFilter.h + static constexpr float kInputScale = 0.25f; + + static constexpr uint32_t kLoopLength = 500; + static constexpr uint32_t kMaxBlurRadius = 300; + sk_sp mBlurEffect; + + sp card; + sp contentNode; + +public: + explicit WindowBlurKawase() { + SkString blurString( + "uniform shader child;" + "uniform float in_blurOffset;" + + "half4 main(float2 xy) {" + "half4 c = child.eval(xy);" + "c += child.eval(xy + float2(+in_blurOffset, +in_blurOffset));" + "c += child.eval(xy + float2(+in_blurOffset, -in_blurOffset));" + "c += child.eval(xy + float2(-in_blurOffset, -in_blurOffset));" + "c += child.eval(xy + float2(-in_blurOffset, +in_blurOffset));" + "return half4(c.rgb * 0.2, 1.0);" + "}"); + + auto [blurEffect, error] = SkRuntimeEffect::MakeForShader(blurString); + if (!blurEffect) { + LOG_ALWAYS_FATAL("RuntimeShader error: %s", error.c_str()); + } + mBlurEffect = std::move(blurEffect); + } + + void createContent(int width, int height, Canvas& canvas) override { + contentNode = TestUtils::createNode( + 0, 0, width, height, [width, height](RenderProperties& props, Canvas& canvas) { + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); + Paint paint; + paint.setColor(Color::Red_500); + canvas.drawRect(0, 0, width / 2, height / 2, paint); + paint.setColor(Color::Blue_500); + canvas.drawRect(width / 2, height / 2, width, height, paint); + }); + + card = TestUtils::createNode( + 0, 0, width, height, + [this](RenderProperties& props, Canvas& canvas) { blurFrame(canvas, 0); }); + canvas.drawRenderNode(card.get()); + } + + void doFrame(int frameNr) override { + int curFrame = frameNr % kLoopLength; + float blurRadius = + (sin((float)curFrame / kLoopLength * M_PI * 2) + 1) * 0.5 * kMaxBlurRadius; + TestUtils::recordNode( + *card, [this, blurRadius](Canvas& canvas) { blurFrame(canvas, blurRadius); }); + } + + void blurFrame(Canvas& canvas, float blurRadius) { + if (blurRadius == 0) { + canvas.drawRenderNode(contentNode.get()); + return; + } + + int width = canvas.width(); + int height = canvas.height(); + float tmpRadius = (float)blurRadius / 2.0f; + uint32_t numberOfPasses = std::min(kMaxPasses, (uint32_t)ceil(tmpRadius)); + float radiusByPasses = tmpRadius / (float)numberOfPasses; + + SkRuntimeShaderBuilder blurBuilder(mBlurEffect); + + sp node = contentNode; + for (int i = 0; i < numberOfPasses; i++) { + blurBuilder.uniform("in_blurOffset") = radiusByPasses * kInputScale * (i + 1); + sk_sp blurFilter = + SkImageFilters::RuntimeShader(blurBuilder, radiusByPasses, "child", nullptr); + // Also downsample the image in the first pass. + float canvasScale = i == 0 ? kInputScale : 1; + + // Apply the blur effect as an image filter. + node = TestUtils::createNode( + 0, 0, width * kInputScale, height * kInputScale, + [node, blurFilter, canvasScale](RenderProperties& props, Canvas& canvas) { + props.mutateLayerProperties().setImageFilter(blurFilter.get()); + canvas.scale(canvasScale, canvasScale); + canvas.drawRenderNode(node.get()); + }); + } + + // Finally upsample the image to its original size. + canvas.scale(1 / kInputScale, 1 / kInputScale); + canvas.drawRenderNode(node.get()); + } +}; diff --git a/libs/hwui/tests/common/scenes/WindowBlurSkia.cpp b/libs/hwui/tests/common/scenes/WindowBlurSkia.cpp new file mode 100644 index 000000000000..36e6d8fbb6ed --- /dev/null +++ b/libs/hwui/tests/common/scenes/WindowBlurSkia.cpp @@ -0,0 +1,104 @@ +/* + * 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "SkImageFilters.h" +#include "TestSceneBase.h" +#include "include/gpu/GpuTypes.h" // from Skia +#include "tests/common/BitmapAllocationTestUtils.h" +#include "utils/Color.h" + +class WindowBlurSkia; + +static TestScene::Registrar _WindowBlurSkia(TestScene::Info{ + "windowblurskia", "Draws window Skia blur", TestScene::simpleCreateScene}); + +/** + * Simulates the Skia window blur in + * frameworks/native/libs/renderengine/skia/filters/GaussianBlurFilter.cpp + */ +class WindowBlurSkia : public TestScene { +private: + // Keep in sync with frameworks/native/libs/renderengine/skia/filters/BlurFilter.h + static constexpr float kInputScale = 0.25f; + + static constexpr uint32_t kLoopLength = 500; + static constexpr uint32_t kMaxBlurRadius = 300; + + sp card; + sp contentNode; + +public: + void createContent(int width, int height, Canvas& canvas) override { + contentNode = TestUtils::createNode( + 0, 0, width, height, [width, height](RenderProperties& props, Canvas& canvas) { + canvas.drawColor(Color::White, SkBlendMode::kSrcOver); + Paint paint; + paint.setColor(Color::Red_500); + canvas.drawRect(0, 0, width / 2, height / 2, paint); + paint.setColor(Color::Blue_500); + canvas.drawRect(width / 2, height / 2, width, height, paint); + }); + + card = TestUtils::createNode( + 0, 0, width, height, + [this](RenderProperties& props, Canvas& canvas) { blurFrame(canvas, 0); }); + canvas.drawRenderNode(card.get()); + } + + void doFrame(int frameNr) override { + int curFrame = frameNr % kLoopLength; + float blurRadius = + (sin((float)curFrame / kLoopLength * M_PI * 2) + 1) * 0.5 * kMaxBlurRadius; + TestUtils::recordNode( + *card, [this, blurRadius](Canvas& canvas) { blurFrame(canvas, blurRadius); }); + } + + void blurFrame(Canvas& canvas, float blurRadius) { + if (blurRadius == 0) { + canvas.drawRenderNode(contentNode.get()); + return; + } + + int width = canvas.width(); + int height = canvas.height(); + + // Downsample and blur the image with the Skia blur filter. + sp node = contentNode; + sk_sp blurFilter = + SkImageFilters::Blur(blurRadius, blurRadius, SkTileMode::kClamp, nullptr, nullptr); + node = TestUtils::createNode( + 0, 0, width * kInputScale, height * kInputScale, + [node, blurFilter](RenderProperties& props, Canvas& canvas) { + props.mutateLayerProperties().setImageFilter(blurFilter.get()); + canvas.scale(kInputScale, kInputScale); + canvas.drawRenderNode(node.get()); + }); + + // Upsample the image to its original size. + canvas.scale(1 / kInputScale, 1 / kInputScale); + canvas.drawRenderNode(node.get()); + } +}; -- GitLab From f4c6df542c8c0dca3afdbb9e42a490186cb8a6c6 Mon Sep 17 00:00:00 2001 From: wilsonshih Date: Tue, 22 Oct 2024 02:44:59 +0000 Subject: [PATCH 173/459] Fix NPE crash when start pending predictive back animation. BackNavigation will start pending predictive back animation after previous transition finish. While ensuer the visibility of the windows in previous transition, check whether the surface still exist before prepareSurfaces. Flag: EXEMPT bugfix Bug: 374814683 Test: presubmit Change-Id: I49faff57249f7b0ce255ea7c8b9f29fec1b97a36 --- .../java/com/android/server/wm/BackNavigationController.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/BackNavigationController.java b/services/core/java/com/android/server/wm/BackNavigationController.java index ccd59969cec8..d76708b5f399 100644 --- a/services/core/java/com/android/server/wm/BackNavigationController.java +++ b/services/core/java/com/android/server/wm/BackNavigationController.java @@ -994,7 +994,9 @@ class BackNavigationController { // Ensure the final animation targets which hidden by transition could be visible. for (int i = 0; i < targets.size(); i++) { final WindowContainer wc = targets.get(i).mContainer; - wc.prepareSurfaces(); + if (wc.mSurfaceControl != null) { + wc.prepareSurfaces(); + } } // The pending builder could be cleared due to prepareSurfaces -- GitLab From 076de23a8b81fc0954c3480031b755bc335c1ffb Mon Sep 17 00:00:00 2001 From: Ray Chin Date: Wed, 9 Oct 2024 19:24:18 +0800 Subject: [PATCH 174/459] Support standard extension frontend status API-Coverage-Bug: 372838599 Flag: android.media.tv.flags.tuner_w_apis Bug: 298290594 Test: atest android.media.tv.tuner.cts.TunerTest Change-Id: I2260b1157a6a7202304cb92c11940d06d143daff --- core/api/system-current.txt | 7 ++ .../tv/tuner/frontend/FrontendStatus.java | 35 ++++++++- .../media/tv/tuner/frontend/StandardExt.java | 75 +++++++++++++++++++ media/jni/android_media_tv_Tuner.cpp | 29 +++++++ 4 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 media/java/android/media/tv/tuner/frontend/StandardExt.java diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 8edfc21036ad..ea1a396f0f04 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -9416,6 +9416,7 @@ package android.media.tv.tuner.frontend { method public int getSignalStrength(); method public int getSnr(); method public int getSpectralInversion(); + method @FlaggedApi("android.media.tv.flags.tuner_w_apis") @NonNull public android.media.tv.tuner.frontend.StandardExt getStandardExt(); method @NonNull public int[] getStreamIds(); method public int getSymbolRate(); method @IntRange(from=0, to=65535) public int getSystemId(); @@ -9470,6 +9471,7 @@ package android.media.tv.tuner.frontend { field public static final int FRONTEND_STATUS_TYPE_SIGNAL_STRENGTH = 6; // 0x6 field public static final int FRONTEND_STATUS_TYPE_SNR = 1; // 0x1 field public static final int FRONTEND_STATUS_TYPE_SPECTRAL = 10; // 0xa + field @FlaggedApi("android.media.tv.flags.tuner_w_apis") public static final int FRONTEND_STATUS_TYPE_STANDARD_EXT = 47; // 0x2f field public static final int FRONTEND_STATUS_TYPE_STREAM_IDS = 39; // 0x27 field public static final int FRONTEND_STATUS_TYPE_SYMBOL_RATE = 7; // 0x7 field public static final int FRONTEND_STATUS_TYPE_T2_SYSTEM_ID = 29; // 0x1d @@ -9761,6 +9763,11 @@ package android.media.tv.tuner.frontend { method public default void onUnlocked(); } + @FlaggedApi("android.media.tv.flags.tuner_w_apis") public final class StandardExt { + method public int getDvbsStandardExt(); + method public int getDvbtStandardExt(); + } + } package android.media.voice { diff --git a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java index fd677acf4ee1..898a8bf02edb 100644 --- a/media/java/android/media/tv/tuner/frontend/FrontendStatus.java +++ b/media/java/android/media/tv/tuner/frontend/FrontendStatus.java @@ -16,11 +16,13 @@ package android.media.tv.tuner.frontend; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.IntRange; import android.annotation.NonNull; import android.annotation.SuppressLint; import android.annotation.SystemApi; +import android.media.tv.flags.Flags; import android.media.tv.tuner.Lnb; import android.media.tv.tuner.TunerVersionChecker; @@ -61,7 +63,7 @@ public class FrontendStatus { FRONTEND_STATUS_TYPE_DVBT_CELL_IDS, FRONTEND_STATUS_TYPE_ATSC3_ALL_PLP_INFO, FRONTEND_STATUS_TYPE_IPTV_CONTENT_URL, FRONTEND_STATUS_TYPE_IPTV_PACKETS_LOST, FRONTEND_STATUS_TYPE_IPTV_PACKETS_RECEIVED, FRONTEND_STATUS_TYPE_IPTV_WORST_JITTER_MS, - FRONTEND_STATUS_TYPE_IPTV_AVERAGE_JITTER_MS}) + FRONTEND_STATUS_TYPE_IPTV_AVERAGE_JITTER_MS, FRONTEND_STATUS_TYPE_STANDARD_EXT}) @Retention(RetentionPolicy.SOURCE) public @interface FrontendStatusType {} @@ -311,6 +313,13 @@ public class FrontendStatus { public static final int FRONTEND_STATUS_TYPE_ATSC3_ALL_PLP_INFO = android.hardware.tv.tuner.FrontendStatusType.ATSC3_ALL_PLP_INFO; + /** + * Standard extension. + */ + @FlaggedApi(Flags.FLAG_TUNER_W_APIS) + public static final int FRONTEND_STATUS_TYPE_STANDARD_EXT = + android.hardware.tv.tuner.FrontendStatusType.STANDARD_EXT; + /** @hide */ @IntDef(value = { AtscFrontendSettings.MODULATION_UNDEFINED, @@ -558,6 +567,7 @@ public class FrontendStatus { private Long mIptvPacketsReceived; private Integer mIptvWorstJitterMs; private Integer mIptvAverageJitterMs; + private StandardExt mStandardExt; // Constructed and fields set by JNI code. private FrontendStatus() { @@ -1273,4 +1283,27 @@ public class FrontendStatus { } return mIptvAverageJitterMs; } + /** + * Gets the standard extension. + * + *

The tuner standard DVB-T has the extension DVB-T2, and the standard DVB-S has the + * extensions DVB-S2 and DVB-S2X. This method returns the current standard extension within the + * same standard series. This frontend status is reported when the standard extension + * transitions to another during playback. + * + *

This query is supported only by Tuner HAL 4.0 or higher. Use + * {@link TunerVersionChecker#getTunerVersion()} to check the version. + * + * @return The current standard extension. + */ + @NonNull + @FlaggedApi(Flags.FLAG_TUNER_W_APIS) + public StandardExt getStandardExt() { + TunerVersionChecker.checkHigherOrEqualVersionTo( + TunerVersionChecker.TUNER_VERSION_4_0, "StandardExt status"); + if (mStandardExt == null) { + throw new IllegalStateException("StandardExt status is empty"); + } + return mStandardExt; + } } diff --git a/media/java/android/media/tv/tuner/frontend/StandardExt.java b/media/java/android/media/tv/tuner/frontend/StandardExt.java new file mode 100644 index 000000000000..490727278b46 --- /dev/null +++ b/media/java/android/media/tv/tuner/frontend/StandardExt.java @@ -0,0 +1,75 @@ +/* + * 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.media.tv.tuner.frontend; + +import android.annotation.FlaggedApi; +import android.annotation.SystemApi; +import android.hardware.tv.tuner.FrontendDvbsStandard; +import android.hardware.tv.tuner.FrontendDvbtStandard; +import android.media.tv.flags.Flags; + +/** + * Standard extension for the standard DVB-T and DVB-S series. + * + * @hide + */ +@SystemApi +@FlaggedApi(Flags.FLAG_TUNER_W_APIS) +public final class StandardExt { + private final int mDvbsStandardExt; + private final int mDvbtStandardExt; + + /** + * Private constructor called by JNI only. + */ + private StandardExt(int dvbsStandardExt, int dvbtStandardExt) { + mDvbsStandardExt = dvbsStandardExt; + mDvbtStandardExt = dvbtStandardExt; + } + + /** + * Gets the DVB-S standard extension within the DVB-S standard series. + * + * @return An integer representing the standard, such as + * {@link DvbsFrontendSettings#STANDARD_S}. + * + * @see android.media.tv.tuner.frontend.DvbsFrontendSettings + */ + @DvbsFrontendSettings.Standard + public int getDvbsStandardExt() { + if (mDvbsStandardExt == FrontendDvbsStandard.UNDEFINED) { + throw new IllegalStateException("No DVB-S standard transition"); + } + return mDvbsStandardExt; + } + + /** + * Gets the DVB-T standard extension within the DVB-T standard series. + * + * @return An integer representing the standard, such as + * {@link DvbtFrontendSettings#STANDARD_T}. + * + * @see android.media.tv.tuner.frontend.DvbtFrontendSettings + */ + @DvbtFrontendSettings.Standard + public int getDvbtStandardExt() { + if (mDvbtStandardExt == FrontendDvbtStandard.UNDEFINED) { + throw new IllegalStateException("No DVB-T standard transition"); + } + return mDvbtStandardExt; + } +} diff --git a/media/jni/android_media_tv_Tuner.cpp b/media/jni/android_media_tv_Tuner.cpp index 49e794116011..4e16901d56e9 100644 --- a/media/jni/android_media_tv_Tuner.cpp +++ b/media/jni/android_media_tv_Tuner.cpp @@ -144,6 +144,7 @@ #include #include #include +#include #include #include #include @@ -302,6 +303,7 @@ using ::aidl::android::hardware::tv::tuner::FrontendRollOff; using ::aidl::android::hardware::tv::tuner::FrontendScanAtsc3PlpInfo; using ::aidl::android::hardware::tv::tuner::FrontendScanMessageStandard; using ::aidl::android::hardware::tv::tuner::FrontendSpectralInversion; +using ::aidl::android::hardware::tv::tuner::FrontendStandardExt; using ::aidl::android::hardware::tv::tuner::FrontendStatus; using ::aidl::android::hardware::tv::tuner::FrontendStatusAtsc3PlpInfo; using ::aidl::android::hardware::tv::tuner::FrontendStatusType; @@ -2937,6 +2939,33 @@ jobject JTuner::getFrontendStatus(jintArray types) { env->SetObjectField(statusObj, field, newIntegerObj.get()); break; } + case FrontendStatus::Tag::standardExt: { + jfieldID field = env->GetFieldID(clazz, "mStandardExt", + "Landroid/media/tv/tuner/frontend/StandardExt;"); + ScopedLocalRef standardExtClazz(env, + env->FindClass("android/media/tv/tuner/frontend/StandardExt")); + jmethodID initStandardExt = env->GetMethodID(standardExtClazz.get(), "", + "(II)V"); + + jint dvbsStandardExt = static_cast(FrontendDvbsStandard::UNDEFINED); + jint dvbtStandardExt = static_cast(FrontendDvbtStandard::UNDEFINED); + FrontendStandardExt standardExt = s.get(); + switch (standardExt.getTag()) { + case FrontendStandardExt::Tag::dvbsStandardExt: { + dvbsStandardExt = static_cast(standardExt + .get()); + break; + } + case FrontendStandardExt::Tag::dvbtStandardExt: { + dvbtStandardExt = static_cast(standardExt + .get()); + break; + } + } + ScopedLocalRef standardExtObj(env, env->NewObject(standardExtClazz.get(), + initStandardExt, dvbsStandardExt, dvbtStandardExt)); + env->SetObjectField(statusObj, field, standardExtObj.get()); + } } } return statusObj; -- GitLab From eafbae3715d9d71c1f015b97224486819b77e0a0 Mon Sep 17 00:00:00 2001 From: Fan Wu Date: Tue, 22 Oct 2024 11:03:38 +0800 Subject: [PATCH 175/459] Add MainSwitchPreference support for Catalyst Bug: 374860556 Test: atest Flag: EXEMPT framework update Change-Id: I6b858cf8436b51bae95bd101eabf2c70479e3565 --- .../settingslib/metadata/PreferenceTypes.kt | 8 ++++++ packages/SettingsLib/Preference/Android.bp | 1 + .../preference/PreferenceBindingFactory.kt | 2 ++ .../preference/PreferenceBindings.kt | 26 +++++++++++++++---- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt index ad996c7c8f86..b64f5dc49b4b 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceTypes.kt @@ -38,3 +38,11 @@ constructor( @StringRes override val title: Int = 0, @StringRes override val summary: Int = 0, ) : TwoStatePreference + +/** A preference that provides a two-state toggleable option that can be used as a main switch. */ +open class MainSwitchPreference +@JvmOverloads +constructor( + override val key: String, + @StringRes override val title: Int = 0, +) : TwoStatePreference \ No newline at end of file diff --git a/packages/SettingsLib/Preference/Android.bp b/packages/SettingsLib/Preference/Android.bp index bff95ceb137e..fb06be908733 100644 --- a/packages/SettingsLib/Preference/Android.bp +++ b/packages/SettingsLib/Preference/Android.bp @@ -32,6 +32,7 @@ android_library { static_libs: [ "SettingsLibDataStore", "SettingsLibMetadata", + "SettingsLibMainSwitchPreference", "androidx.annotation_annotation", "androidx.preference_preference", "guava", diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt index 4c2e1ba683f6..43f2cb6e2134 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindingFactory.kt @@ -16,6 +16,7 @@ package com.android.settingslib.preference +import com.android.settingslib.metadata.MainSwitchPreference import com.android.settingslib.metadata.PreferenceGroup import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.SwitchPreference @@ -36,6 +37,7 @@ object DefaultPreferenceBindingFactory : PreferenceBindingFactory { is SwitchPreference -> SwitchPreferenceBinding.INSTANCE is PreferenceGroup -> PreferenceGroupBinding.INSTANCE is PreferenceScreenCreator -> PreferenceScreenBinding.INSTANCE + is MainSwitchPreference -> MainSwitchPreferenceBinding.INSTANCE else -> DefaultPreferenceBinding } } diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt index ede970e42e72..d40a6f6c55f4 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceBindings.kt @@ -21,11 +21,13 @@ import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceScreen import androidx.preference.SwitchPreferenceCompat +import androidx.preference.TwoStatePreference import com.android.settingslib.metadata.EXTRA_BINDING_SCREEN_KEY import com.android.settingslib.metadata.PersistentPreference import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenMetadata import com.android.settingslib.metadata.PreferenceTitleProvider +import com.android.settingslib.widget.MainSwitchPreference /** Binding of preference group associated with [PreferenceCategory]. */ interface PreferenceScreenBinding : PreferenceBinding { @@ -64,23 +66,37 @@ interface PreferenceGroupBinding : PreferenceBinding { } } -/** A boolean value type preference associated with [SwitchPreferenceCompat]. */ -interface SwitchPreferenceBinding : PreferenceBinding { - - override fun createWidget(context: Context): Preference = SwitchPreferenceCompat(context) +/** A boolean value type preference associated with the abstract [TwoStatePreference]. */ +interface TwoStatePreferenceBinding : PreferenceBinding { override fun bind(preference: Preference, metadata: PreferenceMetadata) { super.bind(preference, metadata) (metadata as? PersistentPreference<*>) ?.storage(preference.context) ?.getValue(metadata.key, Boolean::class.javaObjectType) - ?.let { (preference as SwitchPreferenceCompat).isChecked = it } + ?.let { (preference as TwoStatePreference).isChecked = it } } +} + +/** A boolean value type preference associated with [SwitchPreferenceCompat]. */ +interface SwitchPreferenceBinding : TwoStatePreferenceBinding { + + override fun createWidget(context: Context): Preference = SwitchPreferenceCompat(context) companion object { @JvmStatic val INSTANCE = object : SwitchPreferenceBinding {} } } +/** A boolean value type preference associated with [MainSwitchPreference]. */ +interface MainSwitchPreferenceBinding : TwoStatePreferenceBinding { + + override fun createWidget(context: Context): Preference = MainSwitchPreference(context) + + companion object { + @JvmStatic val INSTANCE = object : MainSwitchPreferenceBinding {} + } +} + /** Default [PreferenceBinding] for [Preference]. */ object DefaultPreferenceBinding : PreferenceBinding -- GitLab From 350bed0ac6894c36abede033ef3fd12eb7a7fe23 Mon Sep 17 00:00:00 2001 From: Stefan Andonian Date: Thu, 26 Sep 2024 05:37:29 +0000 Subject: [PATCH 176/459] Replace shared dagger inject with Intent Extras in IssueRecordingService. This is necessary because dagger injects are not shared among different users, and the IssueRecordingService is not started in the system user in headless system user mode. Bug: 364824477 Test: Verified this works on device. Flag: EXEMPT bug fix Change-Id: I98ee14ae7819456d3a0cb42c039a4426dece1006 --- .../IssueRecordingUserActionInteractorTest.kt | 5 +++- .../IssueRecordingServiceSessionTest.kt | 4 +-- .../systemui/qs/tiles/RecordIssueTile.kt | 9 ++++++- .../IssueRecordingUserActionInteractor.kt | 15 ++++++++--- .../recordissue/IssueRecordingService.kt | 25 ++++++++++++++++--- .../IssueRecordingServiceSession.kt | 9 ++++--- 6 files changed, 54 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractorTest.kt index 5bd3645b4cab..99d2da670172 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractorTest.kt @@ -30,9 +30,11 @@ import com.android.systemui.plugins.statusbar.statusBarStateController import com.android.systemui.qs.pipeline.domain.interactor.panelInteractor import com.android.systemui.qs.tiles.base.interactor.QSTileInput import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction +import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.screenrecord.RecordingController import com.android.systemui.settings.UserContextProvider +import com.android.systemui.settings.userFileManager import com.android.systemui.settings.userTracker import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.systemui.statusbar.policy.keyguardStateController @@ -81,10 +83,11 @@ class IssueRecordingUserActionInteractorTest : SysuiTestCase() { underTest = IssueRecordingUserActionInteractor( testDispatcher, + IssueRecordingState(userTracker, userFileManager), KeyguardDismissUtil( keyguardStateController, statusBarStateController, - activityStarter + activityStarter, ), keyguardStateController, dialogTransitionAnimator, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt index a1edfc1dbcd5..a3f81274dfc5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt @@ -107,7 +107,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { @Test fun requestBugreport_afterReceivingShareCommand_withTakeBugreportTrue() { - issueRecordingState.takeBugreport = true + underTest.takeBugReport = true val uri = mock() underTest.share(0, uri) @@ -118,7 +118,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { @Test fun sharesTracesDirectly_afterReceivingShareCommand_withTakeBugreportFalse() { - issueRecordingState.takeBugreport = false + underTest.takeBugReport = false val uri = mock() underTest.share(0, uri) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt index fb406d47d7a6..1792ebd5245d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RecordIssueTile.kt @@ -152,7 +152,14 @@ constructor( recordingController.startCountdown( DELAY_MS, INTERVAL_MS, - pendingServiceIntent(getStartIntent(userContextProvider.userContext)), + pendingServiceIntent( + getStartIntent( + userContextProvider.userContext, + issueRecordingState.traceConfig, + issueRecordingState.recordScreen, + issueRecordingState.takeBugreport, + ) + ), pendingServiceIntent(getStopIntent(userContextProvider.userContext)), ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractor.kt index 0c8a3750f6fe..fceee5a3379e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/irecording/IssueRecordingUserActionInteractor.kt @@ -35,6 +35,7 @@ import com.android.systemui.qs.tiles.base.interactor.QSTileUserActionInteractor import com.android.systemui.qs.tiles.viewmodel.QSTileUserAction import com.android.systemui.recordissue.IssueRecordingService.Companion.getStartIntent import com.android.systemui.recordissue.IssueRecordingService.Companion.getStopIntent +import com.android.systemui.recordissue.IssueRecordingState import com.android.systemui.recordissue.RecordIssueDialogDelegate import com.android.systemui.recordissue.RecordIssueModule.Companion.TILE_SPEC import com.android.systemui.screenrecord.RecordingController @@ -52,6 +53,7 @@ class IssueRecordingUserActionInteractor @Inject constructor( @Main private val mainCoroutineContext: CoroutineContext, + private val state: IssueRecordingState, private val keyguardDismissUtil: KeyguardDismissUtil, private val keyguardStateController: KeyguardStateController, private val dialogTransitionAnimator: DialogTransitionAnimator, @@ -104,8 +106,15 @@ constructor( recordingController.startCountdown( DELAY_MS, INTERVAL_MS, - pendingServiceIntent(getStartIntent(userContextProvider.userContext)), - pendingServiceIntent(getStopIntent(userContextProvider.userContext)) + pendingServiceIntent( + getStartIntent( + userContextProvider.userContext, + state.traceConfig, + state.recordScreen, + state.takeBugreport, + ) + ), + pendingServiceIntent(getStopIntent(userContextProvider.userContext)), ) private fun stopIssueRecordingService() = @@ -117,6 +126,6 @@ constructor( userContextProvider.userContext, RecordingService.REQUEST_CODE, action, - PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE + PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE, ) } diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt index 3f875bcc288b..ad0ede44a58e 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt @@ -38,6 +38,8 @@ import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil +import com.android.traceur.MessageConstants.INTENT_EXTRA_TRACE_TYPE +import com.android.traceur.TraceConfig import java.util.concurrent.Executor import javax.inject.Inject @@ -110,7 +112,13 @@ constructor( when (intent?.action) { ACTION_START -> { session.start() - if (!issueRecordingState.recordScreen) { + with(session) { + traceConfig = + intent.getParcelableExtra(INTENT_EXTRA_TRACE_TYPE, TraceConfig::class.java) + takeBugReport = intent.getBooleanExtra(EXTRA_BUG_REPORT, false) + start() + } + if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action // will circumvent the RecordingService's screen recording start code. return super.onStartCommand(Intent(ACTION_SHOW_START_NOTIF), flags, startId) @@ -136,6 +144,8 @@ constructor( companion object { private const val TAG = "IssueRecordingService" private const val CHANNEL_ID = "issue_record" + const val EXTRA_SCREEN_RECORD = "extra_screenRecord" + const val EXTRA_BUG_REPORT = "extra_bugReport" /** * Get an intent to stop the issue recording service. @@ -153,8 +163,17 @@ constructor( * * @param context Context from the requesting activity */ - fun getStartIntent(context: Context): Intent = - Intent(context, IssueRecordingService::class.java).setAction(ACTION_START) + fun getStartIntent( + context: Context, + traceConfig: TraceConfig, + screenRecord: Boolean, + bugReport: Boolean, + ): Intent = + Intent(context, IssueRecordingService::class.java) + .setAction(ACTION_START) + .putExtra(INTENT_EXTRA_TRACE_TYPE, traceConfig) + .putExtra(EXTRA_SCREEN_RECORD, screenRecord) + .putExtra(EXTRA_BUG_REPORT, bugReport) } } diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt index ad9b4fe164e8..4c01293d1cad 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt @@ -25,6 +25,7 @@ import android.provider.Settings import com.android.systemui.animation.DialogTransitionAnimator import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor import com.android.systemui.settings.UserContextProvider +import com.android.traceur.PresetTraceConfigs import java.util.concurrent.Executor private const val NOTIFY_SESSION_ENDED_SETTING = "should_notify_trace_session_ended" @@ -47,15 +48,17 @@ class IssueRecordingServiceSession( private val notificationManager: NotificationManager, private val userContextProvider: UserContextProvider, ) { + var takeBugReport = false + var traceConfig = PresetTraceConfigs.getDefaultConfig() fun start() { - bgExecutor.execute { traceurConnection.startTracing(issueRecordingState.traceConfig) } + bgExecutor.execute { traceurConnection.startTracing(traceConfig) } issueRecordingState.isRecording = true } fun stop(contentResolver: ContentResolver) { bgExecutor.execute { - if (issueRecordingState.traceConfig.longTrace) { + if (traceConfig.longTrace) { Settings.Global.putInt(contentResolver, NOTIFY_SESSION_ENDED_SETTING, DISABLED) } traceurConnection.stopTracing() @@ -71,7 +74,7 @@ class IssueRecordingServiceSession( UserHandle(userContextProvider.userContext.userId), ) - if (issueRecordingState.takeBugreport) { + if (takeBugReport) { iActivityManager.requestBugReportWithExtraAttachment(screenRecording) } else { traceurConnection.shareTraces(screenRecording) -- GitLab From 7f311903e8bc4e28d5fb6e076d22e989673dad09 Mon Sep 17 00:00:00 2001 From: Tianfan Zhang Date: Tue, 22 Oct 2024 11:21:34 +0800 Subject: [PATCH 177/459] Add trace for handleRequestAssistContextExtras(). Bug: 374868224 Test: Manual Change-Id: Icb484ba26feb871a91fe836e678f14e0ec55c3f3 --- core/java/android/app/ActivityThread.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 0c02ba44fddb..812bf9d028e6 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -2680,7 +2680,10 @@ public final class ActivityThread extends ClientTransactionHandler handleUnstableProviderDied((IBinder)msg.obj, false); break; case REQUEST_ASSIST_CONTEXT_EXTRAS: + Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, + "handleRequestAssistContextExtras"); handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj); + Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER); break; case TRANSLUCENT_CONVERSION_COMPLETE: handleTranslucentConversionComplete((IBinder)msg.obj, msg.arg1 == 1); -- GitLab From 4cd3fa430febd8c5fd4c4066bd8bb437db17eb03 Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Mon, 21 Oct 2024 01:52:32 +0000 Subject: [PATCH 178/459] Exclude opening/move-to-front task from exiting immersive It's possible for a non-top task to be moved to front and enter immersive at the same time, so exclude it in move-to-front or opening WCT from exiting immersive mode, since it doesn't make sense to exit immersive in those cases. Flag: com.android.window.flags.enable_fully_immersive_in_desktop Fix: 374772576 Test: open Candy Crush in desktop, enter immersive, open settings from notification shade, close settings, put candy crash back in immersive and verify the app header can't be dragged or double clicked. Change-Id: I9f614065814dcfbb2bae347ba00c10a53cdae71a --- .../DesktopFullImmersiveTransitionHandler.kt | 7 +++- .../desktopmode/DesktopTasksController.kt | 32 ++++++++++++++----- ...sktopFullImmersiveTransitionHandlerTest.kt | 25 +++++++++++++++ .../desktopmode/DesktopTasksControllerTest.kt | 25 +++++++++------ 4 files changed, 70 insertions(+), 19 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt index 9d4926b47def..19ffd969cfac 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt @@ -137,14 +137,19 @@ class DesktopFullImmersiveTransitionHandler( * * @param wct that will apply these changes * @param displayId of the display that should exit immersive mode + * @param excludeTaskId of the task to ignore (not exit) if it is the immersive one * @return a function to apply once the transition that will apply these changes is started */ fun exitImmersiveIfApplicable( wct: WindowContainerTransaction, - displayId: Int + displayId: Int, + excludeTaskId: Int? = null, ): ((IBinder) -> Unit)? { if (!Flags.enableFullyImmersiveInDesktop()) return null val immersiveTask = desktopRepository.getTaskInFullImmersiveState(displayId) ?: return null + if (immersiveTask == excludeTaskId) { + return null + } val taskInfo = shellTaskOrganizer.getRunningTaskInfo(immersiveTask) ?: return null logV("Appending immersive exit for task: $immersiveTask in display: $displayId") wct.setBounds(taskInfo.token, getExitDestinationBounds(taskInfo)) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 1d17cd62c0d2..28e63f3cfb0d 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -357,8 +357,11 @@ class DesktopTasksController( // TODO(342378842): Instead of using default display, support multiple displays val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( DEFAULT_DISPLAY, wct, taskId) - val runOnTransit = immersiveTransitionHandler - .exitImmersiveIfApplicable(wct, DEFAULT_DISPLAY) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct = wct, + displayId = DEFAULT_DISPLAY, + excludeTaskId = taskId, + ) wct.startTask( taskId, ActivityOptions.makeBasic().apply { @@ -385,7 +388,11 @@ class DesktopTasksController( } logV("moveRunningTaskToDesktop taskId=%d", task.taskId) exitSplitIfApplicable(wct, task) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(wct, task.displayId) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct = wct, + displayId = task.displayId, + excludeTaskId = task.taskId, + ) // Bring other apps to front first val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(task.displayId, wct, task.taskId) @@ -594,8 +601,11 @@ class DesktopTasksController( logV("moveBackgroundTaskToFront taskId=%s", taskId) val wct = WindowContainerTransaction() // TODO: b/342378842 - Instead of using default display, support multiple displays - val runOnTransit = immersiveTransitionHandler - .exitImmersiveIfApplicable(wct, DEFAULT_DISPLAY) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct = wct, + displayId = DEFAULT_DISPLAY, + excludeTaskId = taskId, + ) wct.startTask( taskId, ActivityOptions.makeBasic().apply { @@ -618,7 +628,10 @@ class DesktopTasksController( val wct = WindowContainerTransaction() wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */) val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( - wct, taskInfo.displayId) + wct = wct, + displayId = taskInfo.displayId, + excludeTaskId = taskInfo.taskId, + ) val transition = startLaunchTransition(TRANSIT_TO_FRONT, wct, taskInfo.taskId, remoteTransition) runOnTransit?.invoke(transition) @@ -1218,8 +1231,11 @@ class DesktopTasksController( wct.startTask(requestedTaskId, options.toBundle()) val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( callingTask.displayId, wct, requestedTaskId) - val runOnTransit = immersiveTransitionHandler - .exitImmersiveIfApplicable(wct, callingTask.displayId) + val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + wct = wct, + displayId = callingTask.displayId, + excludeTaskId = requestedTaskId, + ) val transition = transitions.startTransition(TRANSIT_OPEN, wct, null) addPendingMinimizeTransition(transition, taskToMinimize) runOnTransit?.invoke(transition) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt index ef99b000d759..5842dfaef0fe 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt @@ -338,6 +338,31 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { assertThat(wct.hasBoundsChange(task.token)).isFalse() } + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_byDisplay_withExcludeTask_doesNotExit() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + immersiveHandler.exitImmersiveIfApplicable( + wct = wct, + displayId = DEFAULT_DISPLAY, + excludeTaskId = task.taskId + )?.invoke(transition) + + assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) fun exitImmersiveIfApplicable_byTask_inImmersive_changesTaskBounds() { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index af51e32b2086..c50d304a4678 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -3060,12 +3060,13 @@ class DesktopTasksControllerTest : ShellTestCase() { whenever(transitions.startTransition(eq(TRANSIT_OPEN), any(), anyOrNull())) .thenReturn(transition) whenever(mockDesktopFullImmersiveTransitionHandler - .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId))).thenReturn(runOnStartTransit) + .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId), eq(freeformTask.taskId))) + .thenReturn(runOnStartTransit) runOpenInstance(immersiveTask, freeformTask.taskId) verify(mockDesktopFullImmersiveTransitionHandler) - .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId)) + .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId), eq(freeformTask.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3370,12 +3371,13 @@ class DesktopTasksControllerTest : ShellTestCase() { val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() whenever(mockDesktopFullImmersiveTransitionHandler - .exitImmersiveIfApplicable(wct, task.displayId)).thenReturn(runOnStartTransit) + .exitImmersiveIfApplicable(wct, task.displayId, task.taskId)).thenReturn(runOnStartTransit) whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) - verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(wct, task.displayId) + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(wct, task.displayId, task.taskId) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3386,12 +3388,13 @@ class DesktopTasksControllerTest : ShellTestCase() { val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() whenever(mockDesktopFullImmersiveTransitionHandler - .exitImmersiveIfApplicable(wct, task.displayId)).thenReturn(runOnStartTransit) + .exitImmersiveIfApplicable(wct, task.displayId, task.taskId)).thenReturn(runOnStartTransit) whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) - verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(wct, task.displayId) + verify(mockDesktopFullImmersiveTransitionHandler) + .exitImmersiveIfApplicable(wct, task.displayId, task.taskId) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3401,13 +3404,14 @@ class DesktopTasksControllerTest : ShellTestCase() { val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() whenever(mockDesktopFullImmersiveTransitionHandler - .exitImmersiveIfApplicable(any(), eq(task.displayId))).thenReturn(runOnStartTransit) + .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId))) + .thenReturn(runOnStartTransit) whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) controller.moveTaskToFront(task.taskId, remoteTransition = null) verify(mockDesktopFullImmersiveTransitionHandler) - .exitImmersiveIfApplicable(any(), eq(task.displayId)) + .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3417,13 +3421,14 @@ class DesktopTasksControllerTest : ShellTestCase() { val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() whenever(mockDesktopFullImmersiveTransitionHandler - .exitImmersiveIfApplicable(any(), eq(task.displayId))).thenReturn(runOnStartTransit) + .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId))) + .thenReturn(runOnStartTransit) whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) controller.moveTaskToFront(task.taskId, remoteTransition = null) verify(mockDesktopFullImmersiveTransitionHandler) - .exitImmersiveIfApplicable(any(), eq(task.displayId)) + .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } -- GitLab From 65e4fafc6eda5cfcb9e3f2372b30dd5587869648 Mon Sep 17 00:00:00 2001 From: Louis Chang Date: Mon, 21 Oct 2024 05:02:25 +0000 Subject: [PATCH 179/459] Prevents duplicated finishing activities The finishing activities are requested to be finished or destroyed again while removing the parent TaskFragment. Bug: 365724360 Test: ActivityEmbeddingFinishTests Flag: EXEMPT bugfix Change-Id: I64bbe5dd210a67cb6ca0282f345e81370d193d30 --- services/core/java/com/android/server/wm/TaskFragment.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/wm/TaskFragment.java b/services/core/java/com/android/server/wm/TaskFragment.java index 3ffeacfd5006..d6ba3123eb97 100644 --- a/services/core/java/com/android/server/wm/TaskFragment.java +++ b/services/core/java/com/android/server/wm/TaskFragment.java @@ -3027,7 +3027,11 @@ class TaskFragment extends WindowContainer { // The task order may be changed by finishIfPossible() for adjusting focus if there are // nested tasks, so add all activities into a list to avoid missed removals. final ArrayList removingActivities = new ArrayList<>(); - forAllActivities((Consumer) removingActivities::add); + forAllActivities((r) -> { + if (!r.finishing) { + removingActivities.add(r); + } + }); for (int i = removingActivities.size() - 1; i >= 0; --i) { final ActivityRecord r = removingActivities.get(i); if (withTransition && r.isVisible()) { -- GitLab From f9d7de04fd7444c2dfbdcb85d0ce769ed449f36a Mon Sep 17 00:00:00 2001 From: Ivan Chiang Date: Tue, 22 Oct 2024 05:06:05 +0000 Subject: [PATCH 180/459] [PM] Add feature config for changing launcher badging Flag: android.content.pm.change_launcher_badging Test: m Bug: 364760703 Change-Id: I084e98ae589409fa1b09964d1cb7ec17d5a3dd43 --- core/java/android/content/pm/flags.aconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig index 5b38942d468d..5f439b1dcab9 100644 --- a/core/java/android/content/pm/flags.aconfig +++ b/core/java/android/content/pm/flags.aconfig @@ -342,3 +342,11 @@ flag { bug: "292261144" is_fixed_read_only: true } + +flag { + name: "change_launcher_badging" + namespace: "package_manager_service" + description: "Feature flag to introduce a new way to change the launcher badging." + bug: "364760703" + is_fixed_read_only: true +} -- GitLab From 73aec09310839e80e86d52006bace2ebabfc9df1 Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Wed, 16 Oct 2024 10:52:39 +0000 Subject: [PATCH 181/459] Add fling velocity handling to cross task predictive back Bug: 373811048 Test: Manual, i.e. analysing and verifying smoothness of screen recordings of cross task predictive back animation Flag: com.android.window.flags.predictive_back_timestamp_api Change-Id: I246e3d6317d90356cbcf20083c2e9a4bd937a61e --- .../wm/shell/back/CrossTaskBackAnimation.java | 73 ++++++++++++++++++- 1 file changed, 72 insertions(+), 1 deletion(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java index 7a569799ab84..52391d2f5a79 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java @@ -16,12 +16,15 @@ package com.android.wm.shell.back; +import static android.view.MotionEvent.ACTION_MOVE; import static android.view.RemoteAnimationTarget.MODE_CLOSING; import static android.view.RemoteAnimationTarget.MODE_OPENING; import static android.window.BackEvent.EDGE_RIGHT; import static com.android.internal.jank.InteractionJankMonitor.CUJ_PREDICTIVE_BACK_CROSS_TASK; +import static com.android.window.flags.Flags.predictiveBackTimestampApi; import static com.android.wm.shell.back.BackAnimationConstants.UPDATE_SYSUI_FLAGS_THRESHOLD; +import static com.android.wm.shell.back.CrossActivityBackAnimationKt.scaleCentered; import static com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_BACK_PREVIEW; import android.animation.Animator; @@ -36,11 +39,14 @@ import android.graphics.Rect; import android.graphics.RectF; import android.os.Handler; import android.os.RemoteException; +import android.util.TimeUtils; import android.view.Choreographer; import android.view.IRemoteAnimationFinishedCallback; import android.view.IRemoteAnimationRunner; +import android.view.MotionEvent; import android.view.RemoteAnimationTarget; import android.view.SurfaceControl; +import android.view.VelocityTracker; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.window.BackEvent; @@ -48,6 +54,9 @@ import android.window.BackMotionEvent; import android.window.BackProgressAnimator; import android.window.IOnBackInvokedCallback; +import com.android.internal.dynamicanimation.animation.FloatValueHolder; +import com.android.internal.dynamicanimation.animation.SpringAnimation; +import com.android.internal.dynamicanimation.animation.SpringForce; import com.android.internal.policy.ScreenDecorationsUtils; import com.android.internal.policy.SystemBarUtils; import com.android.internal.protolog.ProtoLog; @@ -81,6 +90,11 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { /** Duration of post animation after gesture committed. */ private static final int POST_ANIMATION_DURATION_MS = 500; + private static final float SPRING_SCALE = 100f; + private static final float DEFAULT_FLING_VELOCITY = 320f; + private static final float MAX_FLING_VELOCITY = 1000f; + private static final float FLING_SPRING_STIFFNESS = 320f; + private final Rect mStartTaskRect = new Rect(); private float mCornerRadius; private int mStatusbarHeight; @@ -114,6 +128,14 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { private float mInterWindowMargin; private float mVerticalMargin; + private final FloatValueHolder mPostCommitFlingScale = new FloatValueHolder(SPRING_SCALE); + private final SpringForce mPostCommitFlingSpring = new SpringForce(SPRING_SCALE) + .setStiffness(FLING_SPRING_STIFFNESS) + .setDampingRatio(1f); + private final VelocityTracker mVelocityTracker = VelocityTracker.obtain(); + private float mGestureProgress = 0f; + private long mDownTime = 0L; + @Inject public CrossTaskBackAnimation(Context context, BackAnimationBackground background, @ShellMainThread Handler handler) { @@ -168,6 +190,7 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { if (mEnteringTarget == null || mClosingTarget == null) { return; } + mGestureProgress = progress; float touchY = event.getTouchY(); @@ -229,6 +252,8 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { } mClosingCurrentRect.set(left, top, left + width, top + height); + + applyFlingScale(mClosingCurrentRect); applyTransform(mClosingTarget.leash, mClosingCurrentRect, mCornerRadius); } @@ -239,9 +264,19 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { float height = mapRange(progress, mEnteringStartRect.height(), mStartTaskRect.height()); mEnteringCurrentRect.set(left, top, left + width, top + height); + + applyFlingScale(mEnteringCurrentRect); applyTransform(mEnteringTarget.leash, mEnteringCurrentRect, mCornerRadius); } + private void applyFlingScale(RectF rect) { + // apply a scale to the rect to account for fling velocity + final float flingScale = Math.min(mPostCommitFlingScale.getValue() / SPRING_SCALE, 1f); + if (flingScale >= 1f) return; + scaleCentered(rect, flingScale, /* pivotX */ rect.right, + /* pivotY */ rect.top + rect.height() / 2); + } + /** Transform the target window to match the target rect. */ private void applyTransform(SurfaceControl leash, RectF targetRect, float cornerRadius) { if (leash == null || !leash.isValid()) { @@ -280,6 +315,9 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { mTransformMatrix.reset(); mClosingCurrentRect.setEmpty(); mInitialTouchPos.set(0, 0); + mGestureProgress = 0; + mDownTime = 0; + mVelocityTracker.clear(); if (mFinishCallback != null) { try { @@ -295,10 +333,24 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { private void onGestureProgress(@NonNull BackEvent backEvent) { if (!mBackInProgress) { mBackInProgress = true; + mDownTime = backEvent.getFrameTime(); } float progress = backEvent.getProgress(); mTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY()); - updateGestureBackProgress(getInterpolatedProgress(progress), backEvent); + float interpolatedProgress = getInterpolatedProgress(progress); + if (predictiveBackTimestampApi()) { + mVelocityTracker.addMovement( + MotionEvent.obtain( + /* downTime */ mDownTime, + /* eventTime */ backEvent.getFrameTime(), + /* action */ ACTION_MOVE, + /* x */ interpolatedProgress * SPRING_SCALE, + /* y */ 0f, + /* metaState */ 0 + ) + ); + } + updateGestureBackProgress(interpolatedProgress, backEvent); } private void onGestureCommitted() { @@ -307,6 +359,25 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { return; } + if (predictiveBackTimestampApi()) { + // kick off spring animation with the current velocity from the pre-commit phase, this + // affects the scaling of the closing and/or opening task during post-commit + mVelocityTracker.computeCurrentVelocity(1000); + float startVelocity = mGestureProgress < 0.1f + ? -DEFAULT_FLING_VELOCITY : -mVelocityTracker.getXVelocity(); + SpringAnimation flingAnimation = + new SpringAnimation(mPostCommitFlingScale, SPRING_SCALE) + .setStartVelocity(Math.max(-MAX_FLING_VELOCITY, Math.min(0f, startVelocity))) + .setStartValue(SPRING_SCALE) + .setMinimumVisibleChange(0.1f) + .setSpring(mPostCommitFlingSpring); + flingAnimation.start(); + // do an animation-frame immediately to prevent idle frame + flingAnimation.doAnimationFrame( + Choreographer.getInstance().getLastFrameTimeNanos() / TimeUtils.NANOS_PER_MS + ); + } + // We enter phase 2 of the animation, the starting coordinates for phase 2 are the current // coordinate of the gesture driven phase. mEnteringCurrentRect.round(mEnteringStartRect); -- GitLab From aede021754ca2b9a8b47c1023403e41fd56d878a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurucz?= Date: Mon, 21 Oct 2024 13:43:40 +0000 Subject: [PATCH 182/459] [flexiglass] Update ScrollViewFields#intrinsicStackHeight on the LS Update ScrollViewFields#intrinsicStackHeight to the restricted stack height, when we are on the LockScreen. Stop using NSSL.mIntrinsicContentHeight, when flexiglass is enabled. Bug: 296118689 Test: atest NotificationStackScrollLayoutTest Flag: com.android.systemui.scene_container Change-Id: I7bd162f018e502ceb1d40ce9b48a644666b89fea --- .../stack/NotificationStackScrollLayout.java | 13 ++++++++----- .../stack/NotificationStackScrollLayoutTest.java | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index ec1dc0a77118..b51ec782f183 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -1574,7 +1574,7 @@ public class NotificationStackScrollLayout if (mMaxDisplayedNotifications != -1) { // The stack intrinsic height already contains the correct value when there is a limit // in the max number of notifications (e.g. as in keyguard). - height = mIntrinsicContentHeight; + height = mScrollViewFields.getIntrinsicStackHeight(); } else { height = Math.max(0f, mAmbientState.getStackCutoff() - mAmbientState.getStackTop()); } @@ -2610,7 +2610,7 @@ public class NotificationStackScrollLayout } @VisibleForTesting - void updateStackHeight() { + void updateIntrinsicStackHeight() { if (SceneContainerFlag.isUnexpectedlyInLegacyMode()) return; final int shelfIntrinsicHeight = mShelf != null ? mShelf.getIntrinsicHeight() : 0; @@ -2621,8 +2621,11 @@ public class NotificationStackScrollLayout mMaxDisplayedNotifications, shelfIntrinsicHeight ); - mIntrinsicContentHeight = notificationsHeight; - final int fullStackHeight = notificationsHeight + footerIntrinsicHeight + mBottomPadding; + // When there is a limit in the max number of notifications, we never display the footer. + final int fullStackHeight = mMaxDisplayedNotifications != -1 + ? notificationsHeight + : notificationsHeight + footerIntrinsicHeight + mBottomPadding; + if (mScrollViewFields.getIntrinsicStackHeight() != fullStackHeight) { mScrollViewFields.setIntrinsicStackHeight(fullStackHeight); notifyStackHeightChangedListeners(); @@ -2631,7 +2634,7 @@ public class NotificationStackScrollLayout private void updateContentHeight() { if (SceneContainerFlag.isEnabled()) { - updateStackHeight(); + updateIntrinsicStackHeight(); return; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index 87cda64ed8e5..eea929da83ce 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -244,7 +244,7 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { when(mStackSizeCalculator.computeHeight(eq(mStackScroller), anyInt(), anyFloat())) .thenReturn((float) stackHeight); - mStackScroller.updateStackHeight(); + mStackScroller.updateIntrinsicStackHeight(); assertThat(mStackScroller.getIntrinsicStackHeight()).isEqualTo(stackHeight); } -- GitLab From 80371cf33f4dff11058b07754e6a9151af006f89 Mon Sep 17 00:00:00 2001 From: burakov Date: Tue, 15 Oct 2024 17:39:31 +0000 Subject: [PATCH 183/459] Remove redundant deps on `SharedNotificationContainerInteractor`. Both `KeyguardInteractor` and `ShadeInteractorLegacyImpl` can get the state they need from better-suited sources. This is part of a refactoring that will improve NSSL positioning to support Dual Shade and Connected Displays. Bug: 338033836 Flag: com.android.systemui.scene_container Test: Verified manually by observing that notifications placement is unaffected on lockscreen (both single shade and split shade modes), as well as during the transition from lockscreen to shade. Test: Existing unit tests still pass. Test: Updated unit tests. Change-Id: I931c50f3fee68134fcfbdebfc44ac9e04c698be9 --- ...tificationPanelViewControllerBaseTest.java | 10 ----- .../QuickSettingsControllerImplBaseTest.java | 30 ------------- .../ShadeInteractorLegacyImplTest.kt | 13 +++--- ...haredNotificationContainerViewModelTest.kt | 43 ++++++++++++------- .../domain/interactor/KeyguardInteractor.kt | 13 +++--- .../interactor/ShadeInteractorLegacyImpl.kt | 8 ++-- .../interactor/KeyguardInteractorFactory.kt | 21 --------- .../interactor/KeyguardInteractorKosmos.kt | 2 - .../android/systemui/shade/ShadeTestUtil.kt | 1 + .../interactor/ShadeInteractorKosmos.kt | 2 - 10 files changed, 44 insertions(+), 99 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java index d1d3b9b31a08..89ad6993cd13 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java @@ -85,7 +85,6 @@ import com.android.systemui.biometrics.AuthController; import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.classifier.FalsingManagerFake; -import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; import com.android.systemui.common.ui.view.LongPressHandlingView; import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor; import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor; @@ -434,15 +433,6 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase { new ShadeInteractorLegacyImpl( mTestScope.getBackgroundScope(), mFakeKeyguardRepository, - new SharedNotificationContainerInteractor( - new FakeConfigurationRepository(), - mContext, - () -> splitShadeStateController, - () -> mShadeInteractor, - mKeyguardInteractor, - deviceEntryUdfpsInteractor, - () -> mLargeScreenHeaderHelper - ), mShadeRepository ), mKosmos.getShadeModeInteractor()); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java index a52f1737117a..2e759a363e20 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QuickSettingsControllerImplBaseTest.java @@ -36,16 +36,12 @@ import com.android.internal.logging.UiEventLogger; import com.android.keyguard.KeyguardStatusView; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.SysuiTestCase; -import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository; -import com.android.systemui.common.ui.data.repository.FakeConfigurationRepository; -import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor; import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.fragments.FragmentHostManager; import com.android.systemui.keyguard.data.repository.FakeKeyguardRepository; -import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor; import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.media.controls.domain.pipeline.MediaDataManager; @@ -55,7 +51,6 @@ import com.android.systemui.plugins.qs.QS; import com.android.systemui.power.domain.interactor.PowerInteractor; import com.android.systemui.qs.QSFragmentLegacy; import com.android.systemui.res.R; -import com.android.systemui.scene.domain.interactor.SceneInteractor; import com.android.systemui.screenrecord.RecordingController; import com.android.systemui.shade.data.repository.FakeShadeRepository; import com.android.systemui.shade.domain.interactor.ShadeInteractor; @@ -72,7 +67,6 @@ import com.android.systemui.statusbar.notification.data.repository.ActiveNotific import com.android.systemui.statusbar.notification.domain.interactor.ActiveNotificationsInteractor; import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; -import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBottomAreaView; import com.android.systemui.statusbar.phone.KeyguardBypassController; @@ -179,27 +173,11 @@ public class QuickSettingsControllerImplBaseTest extends SysuiTestCase { mStatusBarStateController = mKosmos.getStatusBarStateController(); mKosmos.getFakeDeviceProvisioningRepository().setDeviceProvisioned(true); - FakeConfigurationRepository configurationRepository = new FakeConfigurationRepository(); PowerInteractor powerInteractor = mKosmos.getPowerInteractor(); - SceneInteractor sceneInteractor = mKosmos.getSceneInteractor(); - KeyguardTransitionInteractor keyguardTransitionInteractor = mKosmos.getKeyguardTransitionInteractor(); - KeyguardInteractor keyguardInteractor = new KeyguardInteractor( - mKeyguardRepository, - powerInteractor, - new FakeKeyguardBouncerRepository(), - new ConfigurationInteractor(configurationRepository), - mShadeRepository, - keyguardTransitionInteractor, - () -> sceneInteractor, - () -> mKosmos.getFromGoneTransitionInteractor(), - () -> mKosmos.getFromLockscreenTransitionInteractor(), - () -> mKosmos.getFromOccludedTransitionInteractor(), - () -> mKosmos.getSharedNotificationContainerInteractor(), - mTestScope); ResourcesSplitShadeStateController splitShadeStateController = new ResourcesSplitShadeStateController(); @@ -222,14 +200,6 @@ public class QuickSettingsControllerImplBaseTest extends SysuiTestCase { new ShadeInteractorLegacyImpl( mTestScope.getBackgroundScope(), mKeyguardRepository, - new SharedNotificationContainerInteractor( - configurationRepository, - mContext, - () -> splitShadeStateController, - () -> mShadeInteractor, - keyguardInteractor, - deviceEntryUdfpsInteractor, - () -> mLargeScreenHeaderHelper), mShadeRepository ), mKosmos.getShadeModeInteractor()); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt index 4592b60e7c2c..238a1c1348b5 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImplTest.kt @@ -26,9 +26,9 @@ import com.android.systemui.keyguard.data.repository.fakeKeyguardRepository import com.android.systemui.keyguard.data.repository.fakeKeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.kosmos.testScope -import com.android.systemui.res.R import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.data.repository.fakeShadeRepository +import com.android.systemui.shade.shadeTestUtil import com.android.systemui.testKosmos import com.android.systemui.user.data.repository.fakeUserRepository import com.google.common.truth.Truth.assertThat @@ -46,6 +46,7 @@ import org.junit.runner.RunWith class ShadeInteractorLegacyImplTest : SysuiTestCase() { val kosmos = testKosmos() val testScope = kosmos.testScope + val shadeTestUtil = kosmos.shadeTestUtil val configurationRepository = kosmos.fakeConfigurationRepository val keyguardRepository = kosmos.fakeKeyguardRepository val keyguardTransitionRepository = kosmos.fakeKeyguardTransitionRepository @@ -87,7 +88,7 @@ class ShadeInteractorLegacyImplTest : SysuiTestCase() { // WHEN split shade is enabled and QS is expanded keyguardRepository.setStatusBarState(StatusBarState.SHADE) - overrideResource(R.bool.config_use_split_notification_shade, true) + shadeTestUtil.setSplitShade(true) configurationRepository.onAnyConfigurationChange() shadeRepository.setQsExpansion(.5f) shadeRepository.setLegacyShadeExpansion(.7f) @@ -104,7 +105,7 @@ class ShadeInteractorLegacyImplTest : SysuiTestCase() { // WHEN split shade is not enabled and QS is expanded keyguardRepository.setStatusBarState(StatusBarState.SHADE) - overrideResource(R.bool.config_use_split_notification_shade, false) + shadeTestUtil.setSplitShade(false) shadeRepository.setQsExpansion(.5f) shadeRepository.setLegacyShadeExpansion(1f) runCurrent() @@ -120,7 +121,7 @@ class ShadeInteractorLegacyImplTest : SysuiTestCase() { // WHEN split shade is not enabled and QS is expanded keyguardRepository.setStatusBarState(StatusBarState.SHADE) - overrideResource(R.bool.config_use_split_notification_shade, false) + shadeTestUtil.setSplitShade(false) shadeRepository.setQsExpansion(1f) shadeRepository.setLegacyShadeExpansion(1f) runCurrent() @@ -136,7 +137,7 @@ class ShadeInteractorLegacyImplTest : SysuiTestCase() { // WHEN split shade is not enabled and QS partly expanded keyguardRepository.setStatusBarState(StatusBarState.SHADE) - overrideResource(R.bool.config_use_split_notification_shade, false) + shadeTestUtil.setSplitShade(false) shadeRepository.setQsExpansion(.4f) shadeRepository.setLegacyShadeExpansion(1f) runCurrent() @@ -152,7 +153,7 @@ class ShadeInteractorLegacyImplTest : SysuiTestCase() { // WHEN split shade is not enabled and QS collapsed keyguardRepository.setStatusBarState(StatusBarState.SHADE) - overrideResource(R.bool.config_use_split_notification_shade, false) + shadeTestUtil.setSplitShade(false) shadeRepository.setQsExpansion(0f) shadeRepository.setLegacyShadeExpansion(.6f) runCurrent() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt index add7ac95e8c4..25670cb0bb0c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt @@ -161,7 +161,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun validateMarginStartInSplitShade() = testScope.runTest { shadeTestUtil.setSplitShade(true) - overrideResource(R.dimen.notification_panel_margin_horizontal, 20) + overrideDimensionPixelSize(R.dimen.notification_panel_margin_horizontal, 20) val dimens by collectLastValue(underTest.configurationBasedDimensions) @@ -174,7 +174,7 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun validateMarginStart() = testScope.runTest { shadeTestUtil.setSplitShade(false) - overrideResource(R.dimen.notification_panel_margin_horizontal, 20) + overrideDimensionPixelSize(R.dimen.notification_panel_margin_horizontal, 20) val dimens by collectLastValue(underTest.configurationBasedDimensions) @@ -189,8 +189,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(5) shadeTestUtil.setSplitShade(true) overrideResource(R.bool.config_use_large_screen_shade_header, true) - overrideResource(R.dimen.large_screen_shade_header_height, 10) - overrideResource(R.dimen.keyguard_split_shade_top_margin, 50) + overrideDimensionPixelSize(R.dimen.large_screen_shade_header_height, 10) + overrideDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin, 50) val paddingTop by collectLastValue(underTest.paddingTopDimen) configurationRepository.onAnyConfigurationChange() @@ -205,8 +205,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(10) shadeTestUtil.setSplitShade(false) overrideResource(R.bool.config_use_large_screen_shade_header, true) - overrideResource(R.dimen.large_screen_shade_header_height, 10) - overrideResource(R.dimen.keyguard_split_shade_top_margin, 50) + overrideDimensionPixelSize(R.dimen.large_screen_shade_header_height, 10) + overrideDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin, 50) val paddingTop by collectLastValue(underTest.paddingTopDimen) @@ -221,8 +221,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(10) shadeTestUtil.setSplitShade(false) overrideResource(R.bool.config_use_large_screen_shade_header, false) - overrideResource(R.dimen.large_screen_shade_header_height, 10) - overrideResource(R.dimen.keyguard_split_shade_top_margin, 50) + overrideDimensionPixelSize(R.dimen.large_screen_shade_header_height, 10) + overrideDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin, 50) val paddingTop by collectLastValue(underTest.paddingTopDimen) @@ -263,8 +263,11 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()) .thenReturn(headerHelperHeight) overrideResource(R.bool.config_use_large_screen_shade_header, true) - overrideResource(R.dimen.large_screen_shade_header_height, headerResourceHeight) - overrideResource(R.dimen.notification_panel_margin_top, 0) + overrideDimensionPixelSize( + R.dimen.large_screen_shade_header_height, + headerResourceHeight, + ) + overrideDimensionPixelSize(R.dimen.notification_panel_margin_top, 0) val dimens by collectLastValue(underTest.configurationBasedDimensions) @@ -282,8 +285,11 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()) .thenReturn(headerHelperHeight) overrideResource(R.bool.config_use_large_screen_shade_header, true) - overrideResource(R.dimen.large_screen_shade_header_height, headerResourceHeight) - overrideResource(R.dimen.notification_panel_margin_top, 0) + overrideDimensionPixelSize( + R.dimen.large_screen_shade_header_height, + headerResourceHeight, + ) + overrideDimensionPixelSize(R.dimen.notification_panel_margin_top, 0) val dimens by collectLastValue(underTest.configurationBasedDimensions) @@ -480,8 +486,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S fun validateMarginTop() = testScope.runTest { overrideResource(R.bool.config_use_large_screen_shade_header, false) - overrideResource(R.dimen.large_screen_shade_header_height, 50) - overrideResource(R.dimen.notification_panel_margin_top, 0) + overrideDimensionPixelSize(R.dimen.large_screen_shade_header_height, 50) + overrideDimensionPixelSize(R.dimen.notification_panel_margin_top, 0) val dimens by collectLastValue(underTest.configurationBasedDimensions) @@ -676,8 +682,8 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S whenever(largeScreenHeaderHelper.getLargeScreenHeaderHeight()).thenReturn(5) shadeTestUtil.setSplitShade(true) overrideResource(R.bool.config_use_large_screen_shade_header, true) - overrideResource(R.dimen.large_screen_shade_header_height, 10) - overrideResource(R.dimen.keyguard_split_shade_top_margin, 50) + overrideDimensionPixelSize(R.dimen.large_screen_shade_header_height, 10) + overrideDimensionPixelSize(R.dimen.keyguard_split_shade_top_margin, 50) configurationRepository.onAnyConfigurationChange() runCurrent() @@ -1310,4 +1316,9 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S communalSceneRepository.setTransitionState(transitionState) runCurrent() } + + private fun overrideDimensionPixelSize(id: Int, pixelSize: Int) { + overrideResource(id, pixelSize) + configurationRepository.setDimensionPixelSize(id, pixelSize) + } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 6ecbc6175e40..fab905bd6e5d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -50,7 +50,6 @@ import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.ShadeRepository -import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine import com.android.systemui.util.kotlin.sample import javax.inject.Inject @@ -93,7 +92,6 @@ constructor( private val fromGoneTransitionInteractor: Provider, private val fromLockscreenTransitionInteractor: Provider, private val fromOccludedTransitionInteractor: Provider, - sharedNotificationContainerInteractor: Provider, @Application applicationScope: CoroutineScope, ) { // TODO(b/296118689): move to a repository @@ -104,15 +102,16 @@ constructor( SceneContainerFlag.assertInLegacyMode() combineTransform( _notificationPlaceholderBounds, - sharedNotificationContainerInteractor.get().configurationBasedDimensions, keyguardTransitionInteractor.isInTransition( edge = Edge.create(from = LOCKSCREEN, to = AOD) ), - ) { bounds, cfg, isTransitioningToAod -> + shadeRepository.isShadeLayoutWide, + configurationInteractor.dimensionPixelSize(R.dimen.keyguard_split_shade_top_margin), + ) { bounds, isTransitioningToAod, useSplitShade, keyguardSplitShadeTopMargin -> if (isTransitioningToAod) { // Keep bounds stable during this transition, to prevent cases like smartspace // popping in and adjusting the bounds. A prime example would be media playing, - // which then updates smartspace on transition to AOD + // which then updates smartspace on transition to AOD. return@combineTransform } @@ -120,8 +119,8 @@ constructor( // legacy placement behavior within notifications for splitshade. emit( if (MigrateClocksToBlueprint.isEnabled) { - if (cfg.useSplitShade) { - bounds.copy(bottom = bounds.bottom - cfg.keyguardSplitShadeTopMargin) + if (useSplitShade) { + bounds.copy(bottom = bounds.bottom - keyguardSplitShadeTopMargin) } else { bounds } diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt index 0902c3936661..a1c36929e77a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeInteractorLegacyImpl.kt @@ -24,7 +24,6 @@ import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.StatusBarState import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.shade.data.repository.ShadeRepository -import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.currentCoroutineContext @@ -45,7 +44,6 @@ class ShadeInteractorLegacyImpl constructor( @Application val scope: CoroutineScope, keyguardRepository: KeyguardRepository, - sharedNotificationContainerInteractor: SharedNotificationContainerInteractor, repository: ShadeRepository, ) : BaseShadeInteractor { init { @@ -62,17 +60,17 @@ constructor( keyguardRepository.statusBarState, repository.legacyShadeExpansion, repository.qsExpansion, - sharedNotificationContainerInteractor.isSplitShadeEnabled, + repository.isShadeLayoutWide, ) { lockscreenShadeExpansion, statusBarState, legacyShadeExpansion, qsExpansion, - splitShadeEnabled -> + isShadeLayoutWide -> when (statusBarState) { // legacyShadeExpansion is 1 instead of 0 when QS is expanded StatusBarState.SHADE -> - if (!splitShadeEnabled && qsExpansion > 0f) 1f - qsExpansion + if (!isShadeLayoutWide && qsExpansion > 0f) 1f - qsExpansion else legacyShadeExpansion StatusBarState.KEYGUARD -> lockscreenShadeExpansion // dragDownAmount, which drives lockscreenShadeExpansion resets to 0f when diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt index 9593dfbbce29..8c4ec4c2cb75 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorFactory.kt @@ -28,8 +28,6 @@ import com.android.systemui.power.domain.interactor.PowerInteractor import com.android.systemui.power.domain.interactor.PowerInteractorFactory import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.shade.data.repository.FakeShadeRepository -import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor -import com.android.systemui.statusbar.notification.stack.domain.interactor.SharedNotificationContainerInteractor.ConfigurationBasedDimensions import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import kotlinx.coroutines.CoroutineScope @@ -56,7 +54,6 @@ object KeyguardInteractorFactory { fromGoneTransitionInteractor: FromGoneTransitionInteractor = mock(), fromLockscreenTransitionInteractor: FromLockscreenTransitionInteractor = mock(), fromOccludedTransitionInteractor: FromOccludedTransitionInteractor = mock(), - sharedNotificationContainerInteractor: SharedNotificationContainerInteractor? = null, powerInteractor: PowerInteractor = PowerInteractorFactory.create().powerInteractor, testScope: CoroutineScope = TestScope(), ): WithDependencies { @@ -69,23 +66,6 @@ object KeyguardInteractorFactory { whenever(it.transitionState).thenReturn(transitionStateFlow) whenever(it.isFinishedIn(any(), any())).thenReturn(MutableStateFlow(false)) } - val configurationDimensionFlow = MutableSharedFlow() - configurationDimensionFlow.tryEmit( - ConfigurationBasedDimensions( - useSplitShade = false, - useLargeScreenHeader = false, - marginHorizontal = 0, - marginBottom = 0, - marginTop = 0, - marginTopLargeScreen = 0, - keyguardSplitShadeTopMargin = 0, - ) - ) - val sncInteractor = - sharedNotificationContainerInteractor - ?: mock().also { - whenever(it.configurationBasedDimensions).thenReturn(configurationDimensionFlow) - } return WithDependencies( repository = repository, featureFlags = featureFlags, @@ -104,7 +84,6 @@ object KeyguardInteractorFactory { fromGoneTransitionInteractor = { fromGoneTransitionInteractor }, fromLockscreenTransitionInteractor = { fromLockscreenTransitionInteractor }, fromOccludedTransitionInteractor = { fromOccludedTransitionInteractor }, - sharedNotificationContainerInteractor = { sncInteractor }, applicationScope = testScope, ), ) diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt index e85114d04825..da261bfb9805 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractorKosmos.kt @@ -24,7 +24,6 @@ import com.android.systemui.kosmos.testScope import com.android.systemui.power.domain.interactor.powerInteractor import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.data.repository.shadeRepository -import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor val Kosmos.keyguardInteractor: KeyguardInteractor by Kosmos.Fixture { @@ -39,7 +38,6 @@ val Kosmos.keyguardInteractor: KeyguardInteractor by fromGoneTransitionInteractor = { fromGoneTransitionInteractor }, fromLockscreenTransitionInteractor = { fromLockscreenTransitionInteractor }, fromOccludedTransitionInteractor = { fromOccludedTransitionInteractor }, - sharedNotificationContainerInteractor = { sharedNotificationContainerInteractor }, applicationScope = testScope.backgroundScope, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt index 60141c60a265..6944e6c14096 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/ShadeTestUtil.kt @@ -187,6 +187,7 @@ class ShadeTestUtilLegacyImpl( context .getOrCreateTestableResources() .addOverride(R.bool.config_use_split_notification_shade, splitShade) + shadeRepository.setShadeLayoutWide(splitShade) testScope.runCurrent() } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeInteractorKosmos.kt index 92075ea75c4a..39f58aea82ef 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/interactor/ShadeInteractorKosmos.kt @@ -26,7 +26,6 @@ import com.android.systemui.scene.domain.interactor.sceneInteractor import com.android.systemui.shade.ShadeModule import com.android.systemui.shade.data.repository.shadeRepository import com.android.systemui.statusbar.disableflags.data.repository.disableFlagsRepository -import com.android.systemui.statusbar.notification.stack.domain.interactor.sharedNotificationContainerInteractor import com.android.systemui.statusbar.phone.dozeParameters import com.android.systemui.statusbar.policy.data.repository.userSetupRepository import com.android.systemui.statusbar.policy.domain.interactor.deviceProvisioningInteractor @@ -52,7 +51,6 @@ val Kosmos.shadeInteractorLegacyImpl by ShadeInteractorLegacyImpl( scope = applicationCoroutineScope, keyguardRepository = keyguardRepository, - sharedNotificationContainerInteractor = sharedNotificationContainerInteractor, repository = shadeRepository, ) } -- GitLab From 14495ce3af3949114899de16462c162e3418b90c Mon Sep 17 00:00:00 2001 From: burakov Date: Tue, 15 Oct 2024 17:47:58 +0000 Subject: [PATCH 184/459] Remove redundant flows from SharedNotificationContainerInteractor There is already an existing flow for configuration changes in `configurationInteractor`, and it's a better practice to depend on this interactor than the underlying repository anyway. The other flow, `isSplitShadeEnabled`, is redundant since its usages have been removed in ag/29864236. This is part of a refactoring that will improve NSSL positioning to support Dual Shade and Connected Displays. Bug: 338033836 Flag: com.android.systemui.scene_container Test: Existing unit tests still pass. Change-Id: I736234dac0692468980ea126c328cbbc479fc099 --- .../SharedNotificationContainerInteractor.kt | 25 ++++++++----------- ...edNotificationContainerInteractorKosmos.kt | 9 ++++--- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt index 5d3747628e7e..6042964281c2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractor.kt @@ -18,7 +18,7 @@ package com.android.systemui.statusbar.notification.stack.domain.interactor import android.content.Context -import com.android.systemui.common.ui.data.repository.ConfigurationRepository +import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor @@ -29,6 +29,8 @@ import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.policy.SplitShadeStateController import dagger.Lazy import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow @@ -36,17 +38,17 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.onStart /** Encapsulates business-logic specifically related to the shared notification stack container. */ +@OptIn(ExperimentalCoroutinesApi::class, FlowPreview::class) @SysUISingleton class SharedNotificationContainerInteractor @Inject constructor( - configurationRepository: ConfigurationRepository, private val context: Context, private val splitShadeStateController: Lazy, private val shadeInteractor: Lazy, + configurationInteractor: ConfigurationInteractor, keyguardInteractor: KeyguardInteractor, deviceEntryUdfpsInteractor: DeviceEntryUdfpsInteractor, largeScreenHeaderHelperLazy: Lazy, @@ -59,9 +61,6 @@ constructor( /** An internal modification was made to notifications */ val notificationStackChanged = _notificationStackChanged.debounce(20L) - private val configurationChangeEvents = - configurationRepository.onAnyConfigurationChange.onStart { emit(Unit) } - /* Warning: Even though the value it emits only contains the split shade status, this flow must * emit a value whenever the configuration *or* the split shade status changes. Adding a * distinctUntilChanged() to this would cause configurationBasedDimensions to miss configuration @@ -69,13 +68,14 @@ constructor( */ private val dimensionsUpdateEventsWithShouldUseSplitShade: Flow = if (SceneContainerFlag.isEnabled) { - combine(configurationChangeEvents, shadeInteractor.get().isShadeLayoutWide) { - _, - isShadeLayoutWide -> + combine( + configurationInteractor.onAnyConfigurationChange, + shadeInteractor.get().isShadeLayoutWide, + ) { _, isShadeLayoutWide -> isShadeLayoutWide } } else { - configurationChangeEvents.map { + configurationInteractor.onAnyConfigurationChange.map { splitShadeStateController.get().shouldUseSplitNotificationShade(context.resources) } } @@ -115,11 +115,6 @@ constructor( isUdfpsSupported || !ambientIndicationVisible } - val isSplitShadeEnabled: Flow = - configurationBasedDimensions - .map { dimens: ConfigurationBasedDimensions -> dimens.useSplitShade } - .distinctUntilChanged() - /** Top position (without translation) of the shared container. */ fun setTopPosition(top: Float) { _topPosition.value = top diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt index 3234e66024a8..83fc3e9f0c58 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/stack/domain/interactor/SharedNotificationContainerInteractorKosmos.kt @@ -14,26 +14,29 @@ * limitations under the License. */ +@file:OptIn(ExperimentalCoroutinesApi::class) + package com.android.systemui.statusbar.notification.stack.domain.interactor import android.content.applicationContext -import com.android.systemui.common.ui.data.repository.configurationRepository +import com.android.systemui.common.ui.domain.interactor.configurationInteractor import com.android.systemui.deviceentry.domain.interactor.deviceEntryUdfpsInteractor import com.android.systemui.keyguard.domain.interactor.keyguardInteractor import com.android.systemui.kosmos.Kosmos import com.android.systemui.shade.domain.interactor.shadeInteractor import com.android.systemui.shade.largeScreenHeaderHelper import com.android.systemui.statusbar.policy.splitShadeStateController +import kotlinx.coroutines.ExperimentalCoroutinesApi val Kosmos.sharedNotificationContainerInteractor by Kosmos.Fixture { SharedNotificationContainerInteractor( - configurationRepository = configurationRepository, context = applicationContext, splitShadeStateController = { splitShadeStateController }, shadeInteractor = { shadeInteractor }, + configurationInteractor = configurationInteractor, keyguardInteractor = keyguardInteractor, deviceEntryUdfpsInteractor = deviceEntryUdfpsInteractor, - largeScreenHeaderHelperLazy = { largeScreenHeaderHelper } + largeScreenHeaderHelperLazy = { largeScreenHeaderHelper }, ) } -- GitLab From c4d81f0905d937856350f048f3931ac7570d412d Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Mon, 21 Oct 2024 08:38:16 +0000 Subject: [PATCH 185/459] Split ConfigurationController and ConfigurationForwarder This will enable to create several ConfigurationForwarder(s) to propagate config changes from different sources (e.g. different windows/displays), and avoid injecting ConfigurationController for cases where we only need to propagate the config to other classes. Bug: 374266535 Test: Compilation - trivial interface split Flag: NONE trivial interface split Change-Id: I30e409bbba3913e24bbf528051527565d24a056c --- .../android/systemui/SystemUIApplication.java | 8 ++--- .../systemui/dagger/SysUIComponent.java | 10 +++++- .../statusbar/phone/ConfigurationForwarder.kt | 31 +++++++++++++++++++ .../policy/ConfigurationController.java | 7 ++--- .../policy/dagger/StatusBarPolicyModule.java | 8 +++++ .../policy/FakeConfigurationController.kt | 4 +-- 6 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationForwarder.kt diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index 8ae11abab473..811b47d57c1d 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -43,7 +43,7 @@ import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dump.DumpManager; import com.android.systemui.process.ProcessWrapper; import com.android.systemui.res.R; -import com.android.systemui.statusbar.policy.ConfigurationController; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; import com.android.systemui.util.NotificationChannels; import java.lang.reflect.InvocationTargetException; @@ -454,13 +454,13 @@ public class SystemUIApplication extends Application implements @Override public void onConfigurationChanged(@NonNull Configuration newConfig) { if (mServicesStarted) { - ConfigurationController configController = mSysUIComponent.getConfigurationController(); + ConfigurationForwarder configForwarder = mSysUIComponent.getConfigurationForwarder(); if (Trace.isEnabled()) { Trace.traceBegin( Trace.TRACE_TAG_APP, - configController.getClass().getSimpleName() + ".onConfigurationChanged()"); + configForwarder.getClass().getSimpleName() + ".onConfigurationChanged()"); } - configController.onConfigurationChanged(newConfig); + configForwarder.onConfigurationChanged(newConfig); Trace.endSection(); } } diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java index 3fe6669de556..17f1961e662c 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SysUIComponent.java @@ -29,6 +29,7 @@ import com.android.systemui.people.PeopleProvider; import com.android.systemui.startable.Dependencies; import com.android.systemui.statusbar.NotificationInsetsModule; import com.android.systemui.statusbar.QsFrameTranslateModule; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.bubbles.Bubbles; @@ -125,12 +126,19 @@ public interface SysUIComponent { BootCompleteCacheImpl provideBootCacheImpl(); /** - * Creates a ContextComponentHelper. + * Creates a ConfigurationController. */ @SysUISingleton @GlobalConfig ConfigurationController getConfigurationController(); + /** + * Creates a ConfigurationForwarder. + */ + @SysUISingleton + @GlobalConfig + ConfigurationForwarder getConfigurationForwarder(); + /** * Creates a ContextComponentHelper. */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationForwarder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationForwarder.kt new file mode 100644 index 000000000000..3fd46fc484a9 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ConfigurationForwarder.kt @@ -0,0 +1,31 @@ +/* + * 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.statusbar.phone + +import android.content.res.Configuration + +/** + * Used to forward a configuration change to other components. + * + * This is commonly used to propagate configs to [ConfigurationController]. Note that there could be + * different configuration forwarder, for example each display, window or group of classes (e.g. + * shade window classes). + */ +interface ConfigurationForwarder { + /** Should be called when a new configuration is received. */ + fun onConfigurationChanged(newConfiguration: Configuration) +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java index cec77c12a40b..1bb4e8c66ef1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ConfigurationController.java @@ -16,16 +16,15 @@ package com.android.systemui.statusbar.policy; import android.content.res.Configuration; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; /** * Common listener for configuration or subsets of configuration changes (like density or * font scaling), providing easy static dependence on these events. */ -public interface ConfigurationController extends CallbackController { - - /** Alert controller of a change in the configuration. */ - void onConfigurationChanged(Configuration newConfiguration); +public interface ConfigurationController extends CallbackController, + ConfigurationForwarder { /** Alert controller of a change in between light and dark themes. */ void notifyThemeChanged(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java index b81af86b0779..c7bd5a1bb9a8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/dagger/StatusBarPolicyModule.java @@ -37,6 +37,7 @@ import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.NetworkControllerImpl; import com.android.systemui.statusbar.connectivity.WifiPickerTrackerFactory; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; import com.android.systemui.statusbar.policy.BatteryControllerLogger; import com.android.systemui.statusbar.policy.BluetoothController; import com.android.systemui.statusbar.policy.BluetoothControllerImpl; @@ -185,6 +186,13 @@ public interface StatusBarPolicyModule { DevicePostureController provideDevicePostureController( DevicePostureControllerImpl devicePostureControllerImpl); + /** */ + @Binds + @SysUISingleton + @GlobalConfig + ConfigurationForwarder provideGlobalConfigurationForwarder( + @GlobalConfig ConfigurationController configurationController); + /** */ @Provides @SysUISingleton diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt index 6be13be407d8..32191277c94a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/policy/FakeConfigurationController.kt @@ -23,7 +23,7 @@ class FakeConfigurationController @Inject constructor() : listeners -= listener } - override fun onConfigurationChanged(newConfiguration: Configuration?) { + override fun onConfigurationChanged(newConfiguration: Configuration) { listeners.forEach { it.onConfigChanged(newConfiguration) } } @@ -36,7 +36,7 @@ class FakeConfigurationController @Inject constructor() : } fun notifyConfigurationChanged() { - onConfigurationChanged(newConfiguration = null) + onConfigurationChanged(newConfiguration = Configuration()) } fun notifyLayoutDirectionChanged(isRtl: Boolean) { -- GitLab From e55f83bce2dc710ca2807fde0742ef777f62f99b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=A4=80=EC=84=9C?= Date: Sat, 19 Oct 2024 08:23:04 +0000 Subject: [PATCH 186/459] Implemented MT SMS polling Added resources for MT SMS polling (Can be removed when Google implement carrier configs for this feature) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 박준서 (cherry picked from https://partner-android-review.googlesource.com/q/commit:2e9d9a618999cf13ee88f771eaacdc2c145ab27c) Flag : EXEMPT bugfix Bug : 374908990 Merged-In: Icae2946c1ac20bddb1d9599a1311519e26f8fc0e Change-Id: Icae2946c1ac20bddb1d9599a1311519e26f8fc0e --- core/res/res/values/config_telephony.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/res/res/values/config_telephony.xml b/core/res/res/values/config_telephony.xml index 9854030ed0d1..b5892f6e1a77 100644 --- a/core/res/res/values/config_telephony.xml +++ b/core/res/res/values/config_telephony.xml @@ -460,4 +460,16 @@ 10 + + true + + + + DU\\\#MMYSM€S2BIG\\\#NORED\\\! + + + + 300000 + + -- GitLab From 8d1d95cdc648d3f4ba54893983b3d571502d198d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wilczy=C5=84ski?= Date: Mon, 21 Oct 2024 14:05:06 +0000 Subject: [PATCH 187/459] Don't save default doze brightness The default doze brightness shouldn't replace the user's chosen manual brightness. Bug: 372465405 Flag: EXEMPT bugfix Test: atest DisplayPowerControllerTest Change-Id: I8f0032ce473c0aad89bb621498ce2daeb3cfcc14 --- .../java/com/android/server/display/DisplayPowerController.java | 2 +- .../com/android/server/display/DisplayPowerControllerTest.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 42a62f098b6a..5b61f006def6 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -1503,7 +1503,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // use the current brightness setting scaled by the doze scale factor rawBrightnessState = getDozeBrightnessForOffload(); brightnessState = clampScreenBrightness(rawBrightnessState); - updateScreenBrightnessSetting = false; mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_MANUAL); mTempBrightnessEvent.setFlags( mTempBrightnessEvent.getFlags() | BrightnessEvent.FLAG_DOZE_SCALE); @@ -1513,6 +1512,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call brightnessState = clampScreenBrightness(rawBrightnessState); mBrightnessReasonTemp.setReason(BrightnessReason.REASON_DOZE_DEFAULT); } + updateScreenBrightnessSetting = false; } if (!mFlags.isRefactorDisplayPowerControllerEnabled()) { diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index fdf6b809fa85..9189c2f20d66 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -2224,6 +2224,8 @@ public final class DisplayPowerControllerTest { verify(mHolder.animator).animateTo(eq(DEFAULT_DOZE_BRIGHTNESS), /* linearSecondTarget= */ anyFloat(), eq(BRIGHTNESS_RAMP_RATE_FAST_INCREASE), eq(false)); + // This brightness shouldn't be stored in the setting + verify(mHolder.brightnessSetting, never()).setBrightness(DEFAULT_DOZE_BRIGHTNESS); // The display device changes and the default doze brightness changes setUpDisplay(DISPLAY_ID, "new_unique_id", mHolder.display, mock(DisplayDevice.class), -- GitLab From d8d806e503b94007ed6e97ffb37e9fd06d648408 Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Mon, 21 Oct 2024 08:56:04 +0000 Subject: [PATCH 188/459] Introduce ShadeDisplayAware annotation This will qualify context, resources, layout inflater, configuration controller and potentially other classes related to the shade window, allowing us to move it between displays and ensuring correct rendering of all its components Bug: 362719719 Test: None Flag: NONE just introducing an annotation used in child cls Change-Id: Iddcac15e8f0655f457e5f81c3e18d709ff562ee9 --- .../systemui/shade/ShadeDisplayAware.kt | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAware.kt diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAware.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAware.kt new file mode 100644 index 000000000000..111d335d0d0f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAware.kt @@ -0,0 +1,33 @@ +/* + * 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.shade + +import javax.inject.Qualifier + +/** + * Qualifies classes that provide display-specific info for shade window components. + * + * The Shade window can be moved between displays with different characteristics (e.g., density, + * size). This annotation ensures that components within the shade window use the correct context + * and resources for the display they are currently on. + * + * Classes annotated with `@ShadeDisplayAware` (e.g., 'Context`, `Resources`, `LayoutInflater`, + * `ConfigurationController`) will be dynamically updated to reflect the current display's + * configuration. This ensures consistent rendering even when the shade window is moved to an + * external display. + */ +@Qualifier @Retention(AnnotationRetention.RUNTIME) annotation class ShadeDisplayAware -- GitLab From a1923cc340f45a2b4276920f7c1b1057b3013726 Mon Sep 17 00:00:00 2001 From: Vania Desmonda Date: Tue, 22 Oct 2024 09:37:47 +0000 Subject: [PATCH 189/459] Add log resize start and end on all resize triggers. Fixes: 373592364 Test: atest DesktopModeEventLoggerTest Flag: com.android.window.flags.enable_resizing_metrics Change-Id: If01e0cf026bdb5d242ed372c5e21c5c5fcb49868 --- .../wm/shell/dagger/WMShellModule.java | 12 +- .../desktopmode/DesktopModeEventLogger.kt | 112 ++++++++++++- .../desktopmode/DesktopTasksController.kt | 62 ++++++- .../windowdecor/CaptionWindowDecoration.java | 1 + .../DesktopModeWindowDecorViewModel.java | 53 ++++-- .../DesktopModeWindowDecoration.java | 21 ++- .../windowdecor/DragResizeInputListener.java | 60 ++++++- .../windowdecor/DragResizeWindowGeometry.java | 2 +- .../shell/windowdecor/WindowDecoration.java | 9 +- .../wm/shell/TestRunningTaskInfoBuilder.java | 17 +- .../desktopmode/DesktopModeEventLoggerTest.kt | 51 ++++-- .../desktopmode/DesktopTasksControllerTest.kt | 154 +++++++++++++++--- .../DesktopModeWindowDecorViewModelTests.kt | 49 ++++-- .../DesktopModeWindowDecorationTests.java | 5 +- .../windowdecor/WindowDecorationTests.java | 10 +- 15 files changed, 522 insertions(+), 96 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 427df1784506..4c2588984500 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -267,7 +267,8 @@ public abstract class WMShellModule { AppHandleEducationController appHandleEducationController, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, Optional desktopActivityOrientationHandler, - FocusTransitionObserver focusTransitionObserver) { + FocusTransitionObserver focusTransitionObserver, + DesktopModeEventLogger desktopModeEventLogger) { if (DesktopModeStatus.canEnterDesktopMode(context)) { return new DesktopModeWindowDecorViewModel( context, @@ -295,7 +296,8 @@ public abstract class WMShellModule { appHandleEducationController, windowDecorCaptionHandleRepository, desktopActivityOrientationHandler, - focusTransitionObserver); + focusTransitionObserver, + desktopModeEventLogger); } return new CaptionWindowDecorViewModel( context, @@ -647,7 +649,8 @@ public abstract class WMShellModule { Optional recentTasksController, InteractionJankMonitor interactionJankMonitor, InputManager inputManager, - FocusTransitionObserver focusTransitionObserver) { + FocusTransitionObserver focusTransitionObserver, + DesktopModeEventLogger desktopModeEventLogger) { return new DesktopTasksController(context, shellInit, shellCommandHandler, shellController, displayController, shellTaskOrganizer, syncQueue, rootTaskDisplayAreaOrganizer, dragAndDropController, transitions, keyguardManager, @@ -659,7 +662,8 @@ public abstract class WMShellModule { desktopModeLoggerTransitionObserver, launchAdjacentController, recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter, recentTasksController.orElse(null), interactionJankMonitor, mainHandler, - inputManager, focusTransitionObserver); + inputManager, focusTransitionObserver, + desktopModeEventLogger); } @WMSingleton diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt index 8ebe503a3816..255ca6e2511f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopModeEventLogger.kt @@ -16,11 +16,20 @@ package com.android.wm.shell.desktopmode +import android.app.ActivityManager.RunningTaskInfo +import android.util.Size +import android.view.InputDevice.SOURCE_MOUSE +import android.view.InputDevice.SOURCE_TOUCHSCREEN +import android.view.MotionEvent +import android.view.MotionEvent.TOOL_TYPE_FINGER +import android.view.MotionEvent.TOOL_TYPE_MOUSE +import android.view.MotionEvent.TOOL_TYPE_STYLUS import com.android.internal.annotations.VisibleForTesting import com.android.internal.protolog.ProtoLog import com.android.internal.util.FrameworkStatsLog import com.android.window.flags.Flags import com.android.wm.shell.EventLogTags +import com.android.wm.shell.common.DisplayController import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import java.security.SecureRandom import java.util.Random @@ -176,7 +185,13 @@ class DesktopModeEventLogger { * Logs that a task resize event is starting with [taskSizeUpdate] within a Desktop mode * session. */ - fun logTaskResizingStarted(taskSizeUpdate: TaskSizeUpdate) { + fun logTaskResizingStarted( + resizeTrigger: ResizeTrigger, + motionEvent: MotionEvent?, + taskInfo: RunningTaskInfo, + displayController: DisplayController? = null, + displayLayoutSize: Size? = null, + ) { if (!Flags.enableResizingMetrics()) return val sessionId = currentSessionId.get() @@ -188,11 +203,19 @@ class DesktopModeEventLogger { return } + val taskSizeUpdate = createTaskSizeUpdate( + resizeTrigger, + motionEvent, + taskInfo, + displayController = displayController, + displayLayoutSize = displayLayoutSize, + ) + ProtoLog.v( WM_SHELL_DESKTOP_MODE, - "DesktopModeLogger: Logging task resize is starting, session: %s taskId: %s", + "DesktopModeLogger: Logging task resize is starting, session: %s, taskSizeUpdate: %s", sessionId, - taskSizeUpdate.instanceId + taskSizeUpdate ) logTaskSizeUpdated( FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE, @@ -203,7 +226,15 @@ class DesktopModeEventLogger { /** * Logs that a task resize event is ending with [taskSizeUpdate] within a Desktop mode session. */ - fun logTaskResizingEnded(taskSizeUpdate: TaskSizeUpdate) { + fun logTaskResizingEnded( + resizeTrigger: ResizeTrigger, + motionEvent: MotionEvent?, + taskInfo: RunningTaskInfo, + taskHeight: Int? = null, + taskWidth: Int? = null, + displayController: DisplayController? = null, + displayLayoutSize: Size? = null, + ) { if (!Flags.enableResizingMetrics()) return val sessionId = currentSessionId.get() @@ -215,18 +246,61 @@ class DesktopModeEventLogger { return } + val taskSizeUpdate = createTaskSizeUpdate( + resizeTrigger, + motionEvent, + taskInfo, + taskHeight, + taskWidth, + displayController, + displayLayoutSize, + ) + ProtoLog.v( WM_SHELL_DESKTOP_MODE, - "DesktopModeLogger: Logging task resize is ending, session: %s taskId: %s", + "DesktopModeLogger: Logging task resize is ending, session: %s, taskSizeUpdate: %s", sessionId, - taskSizeUpdate.instanceId + taskSizeUpdate ) + logTaskSizeUpdated( FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE, sessionId, taskSizeUpdate ) } + private fun createTaskSizeUpdate( + resizeTrigger: ResizeTrigger, + motionEvent: MotionEvent?, + taskInfo: RunningTaskInfo, + taskHeight: Int? = null, + taskWidth: Int? = null, + displayController: DisplayController? = null, + displayLayoutSize: Size? = null, + ): TaskSizeUpdate { + val taskBounds = taskInfo.configuration.windowConfiguration.bounds + + val height = taskHeight ?: taskBounds.height() + val width = taskWidth ?: taskBounds.width() + + val displaySize = when { + displayLayoutSize != null -> displayLayoutSize.height * displayLayoutSize.width + displayController != null -> displayController.getDisplayLayout(taskInfo.displayId) + ?.let { it.height() * it.width() } + else -> null + } + + return TaskSizeUpdate( + resizeTrigger, + getInputMethodFromMotionEvent(motionEvent), + taskInfo.taskId, + taskInfo.effectiveUid, + height, + width, + displaySize, + ) + } + fun logTaskInfoStateInit() { logTaskUpdate( FrameworkStatsLog.DESKTOP_MODE_SESSION_TASK_UPDATE__TASK_EVENT__TASK_INIT_STATSD, @@ -238,7 +312,8 @@ class DesktopModeEventLogger { taskHeight = 0, taskWidth = 0, taskX = 0, - taskY = 0) + taskY = 0 + ) ) } @@ -314,7 +389,7 @@ class DesktopModeEventLogger { /* task_width */ taskSizeUpdate.taskWidth, /* display_area */ - taskSizeUpdate.displayArea + taskSizeUpdate.displayArea ?: -1 ) } @@ -364,9 +439,24 @@ class DesktopModeEventLogger { val uid: Int, val taskHeight: Int, val taskWidth: Int, - val displayArea: Int, + val displayArea: Int?, ) + private fun getInputMethodFromMotionEvent(e: MotionEvent?): InputMethod { + if (e == null) return InputMethod.UNKNOWN_INPUT_METHOD + + val toolType = e.getToolType( + e.findPointerIndex(e.getPointerId(0)) + ) + return when { + toolType == TOOL_TYPE_STYLUS -> InputMethod.STYLUS + toolType == TOOL_TYPE_MOUSE -> InputMethod.MOUSE + toolType == TOOL_TYPE_FINGER && e.source == SOURCE_MOUSE -> InputMethod.TOUCHPAD + toolType == TOOL_TYPE_FINGER && e.source == SOURCE_TOUCHSCREEN -> InputMethod.TOUCH + else -> InputMethod.UNKNOWN_INPUT_METHOD + } + } + // Default value used when the task was not minimized. @VisibleForTesting const val UNSET_MINIMIZE_REASON = @@ -499,6 +589,10 @@ class DesktopModeEventLogger { FrameworkStatsLog .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__SNAP_RIGHT_MENU_RESIZE_TRIGGER ), + MAXIMIZE_MENU( + FrameworkStatsLog + .DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__MAXIMIZE_MENU_RESIZE_TRIGGER + ), } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index b505bee469fe..69776cd4740a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -46,6 +46,7 @@ import android.util.Size import android.view.Display.DEFAULT_DISPLAY import android.view.DragEvent import android.view.KeyEvent +import android.view.MotionEvent import android.view.SurfaceControl import android.view.WindowManager.TRANSIT_CHANGE import android.view.WindowManager.TRANSIT_CLOSE @@ -125,7 +126,7 @@ import java.io.PrintWriter import java.util.Optional import java.util.concurrent.Executor import java.util.function.Consumer - +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger /** Handles moving tasks in and out of desktop */ class DesktopTasksController( private val context: Context, @@ -158,6 +159,7 @@ class DesktopTasksController( @ShellMainThread private val handler: Handler, private val inputManager: InputManager, private val focusTransitionObserver: FocusTransitionObserver, + private val desktopModeEventLogger: DesktopModeEventLogger, ) : RemoteCallable, Transitions.TransitionHandler, @@ -747,7 +749,11 @@ class DesktopTasksController( * bounds) and a free floating state (either the last saved bounds if available or the default * bounds otherwise). */ - fun toggleDesktopTaskSize(taskInfo: RunningTaskInfo) { + fun toggleDesktopTaskSize( + taskInfo: RunningTaskInfo, + resizeTrigger: ResizeTrigger, + motionEvent: MotionEvent?, + ) { val displayLayout = displayController.getDisplayLayout(taskInfo.displayId) ?: return val stableBounds = Rect().apply { displayLayout.getStableBounds(this) } @@ -794,7 +800,10 @@ class DesktopTasksController( taskbarDesktopTaskListener?.onTaskbarCornerRoundingUpdate(doesAnyTaskRequireTaskbarRounding) val wct = WindowContainerTransaction().setBounds(taskInfo.token, destinationBounds) - + desktopModeEventLogger.logTaskResizingEnded( + resizeTrigger, motionEvent, taskInfo, destinationBounds.height(), + destinationBounds.width(), displayController + ) toggleResizeDesktopTaskTransitionHandler.startTransition(wct) } @@ -884,9 +893,19 @@ class DesktopTasksController( taskInfo: RunningTaskInfo, taskSurface: SurfaceControl, currentDragBounds: Rect, - position: SnapPosition + position: SnapPosition, + resizeTrigger: ResizeTrigger, + motionEvent: MotionEvent?, ) { val destinationBounds = getSnapBounds(taskInfo, position) + desktopModeEventLogger.logTaskResizingEnded( + resizeTrigger, + motionEvent, + taskInfo, + destinationBounds.height(), + destinationBounds.width(), + displayController, + ) if (destinationBounds == taskInfo.configuration.windowConfiguration.bounds) { // Handle the case where we attempt to snap resize when already snap resized: the task // position won't need to change but we want to animate the surface going back to the @@ -915,7 +934,8 @@ class DesktopTasksController( position: SnapPosition, taskSurface: SurfaceControl, currentDragBounds: Rect, - dragStartBounds: Rect + dragStartBounds: Rect, + motionEvent: MotionEvent, ) { releaseVisualIndicator() if (!taskInfo.isResizeable && DISABLE_NON_RESIZABLE_APP_SNAP_RESIZE.isTrue()) { @@ -932,10 +952,25 @@ class DesktopTasksController( isResizable = taskInfo.isResizeable, ) } else { + val resizeTrigger = if (position == SnapPosition.LEFT) { + ResizeTrigger.DRAG_LEFT + } else { + ResizeTrigger.DRAG_RIGHT + } + desktopModeEventLogger.logTaskResizingStarted( + resizeTrigger, motionEvent, taskInfo, displayController + ) interactionJankMonitor.begin( taskSurface, context, handler, CUJ_DESKTOP_MODE_SNAP_RESIZE, "drag_resizable" ) - snapToHalfScreen(taskInfo, taskSurface, currentDragBounds, position) + snapToHalfScreen( + taskInfo, + taskSurface, + currentDragBounds, + position, + resizeTrigger, + motionEvent, + ) } } @@ -1735,6 +1770,7 @@ class DesktopTasksController( currentDragBounds: Rect, validDragArea: Rect, dragStartBounds: Rect, + motionEvent: MotionEvent, ) { if (taskInfo.configuration.windowConfiguration.windowingMode != WINDOWING_MODE_FREEFORM) { return @@ -1755,12 +1791,22 @@ class DesktopTasksController( } IndicatorType.TO_SPLIT_LEFT_INDICATOR -> { handleSnapResizingTask( - taskInfo, SnapPosition.LEFT, taskSurface, currentDragBounds, dragStartBounds + taskInfo, + SnapPosition.LEFT, + taskSurface, + currentDragBounds, + dragStartBounds, + motionEvent, ) } IndicatorType.TO_SPLIT_RIGHT_INDICATOR -> { handleSnapResizingTask( - taskInfo, SnapPosition.RIGHT, taskSurface, currentDragBounds, dragStartBounds + taskInfo, + SnapPosition.RIGHT, + taskSurface, + currentDragBounds, + dragStartBounds, + motionEvent, ) } IndicatorType.NO_INDICATOR -> { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java index 509cb85c96cd..fde01eefee17 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/CaptionWindowDecoration.java @@ -274,6 +274,7 @@ public class CaptionWindowDecoration extends WindowDecoration activityOrientationChangeHandler, - FocusTransitionObserver focusTransitionObserver) { + FocusTransitionObserver focusTransitionObserver, + DesktopModeEventLogger desktopModeEventLogger) { this( context, shellExecutor, @@ -281,7 +285,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, windowDecorCaptionHandleRepository, activityOrientationChangeHandler, new TaskPositionerFactory(), - focusTransitionObserver); + focusTransitionObserver, + desktopModeEventLogger); } @VisibleForTesting @@ -317,7 +322,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, WindowDecorCaptionHandleRepository windowDecorCaptionHandleRepository, Optional activityOrientationChangeHandler, TaskPositionerFactory taskPositionerFactory, - FocusTransitionObserver focusTransitionObserver) { + FocusTransitionObserver focusTransitionObserver, + DesktopModeEventLogger desktopModeEventLogger) { mContext = context; mMainExecutor = shellExecutor; mMainHandler = mainHandler; @@ -378,6 +384,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, }; mTaskPositionerFactory = taskPositionerFactory; mFocusTransitionObserver = focusTransitionObserver; + mDesktopModeEventLogger = desktopModeEventLogger; shellInit.addInitCallback(this::onInit, this); } @@ -547,15 +554,20 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, >= MANAGE_WINDOWS_MINIMUM_INSTANCES); } - private void onMaximizeOrRestore(int taskId, String source) { + private void onMaximizeOrRestore(int taskId, String source, ResizeTrigger resizeTrigger, + MotionEvent motionEvent) { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); if (decoration == null) { return; } + mDesktopModeEventLogger.logTaskResizingStarted(resizeTrigger, motionEvent, + decoration.mTaskInfo, + mDisplayController, /* displayLayoutSize= */ null); mInteractionJankMonitor.begin( decoration.mTaskSurface, mContext, mMainHandler, Cuj.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW, source); - mDesktopTasksController.toggleDesktopTaskSize(decoration.mTaskInfo); + mDesktopTasksController.toggleDesktopTaskSize(decoration.mTaskInfo, resizeTrigger, + motionEvent); decoration.closeHandleMenu(); decoration.closeMaximizeMenu(); } @@ -568,7 +580,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mDesktopTasksController.toggleDesktopTaskFullImmersiveState(decoration.mTaskInfo); } - private void onSnapResize(int taskId, boolean left) { + private void onSnapResize(int taskId, boolean left, MotionEvent motionEvent) { final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(taskId); if (decoration == null) { return; @@ -579,13 +591,20 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, Toast.makeText(mContext, R.string.desktop_mode_non_resizable_snap_text, Toast.LENGTH_SHORT).show(); } else { + ResizeTrigger resizeTrigger = + left ? ResizeTrigger.SNAP_LEFT_MENU : ResizeTrigger.SNAP_RIGHT_MENU; + mDesktopModeEventLogger.logTaskResizingStarted(resizeTrigger, motionEvent, + decoration.mTaskInfo, + mDisplayController, /* displayLayoutSize= */ null); mInteractionJankMonitor.begin(decoration.mTaskSurface, mContext, mMainHandler, Cuj.CUJ_DESKTOP_MODE_SNAP_RESIZE, "maximize_menu_resizable"); mDesktopTasksController.snapToHalfScreen( decoration.mTaskInfo, decoration.mTaskSurface, decoration.mTaskInfo.configuration.windowConfiguration.getBounds(), - left ? SnapPosition.LEFT : SnapPosition.RIGHT); + left ? SnapPosition.LEFT : SnapPosition.RIGHT, + resizeTrigger, + motionEvent); } decoration.closeHandleMenu(); @@ -737,6 +756,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, private boolean mTouchscreenInUse; private boolean mHasLongClicked; private int mDragPointerId = -1; + private MotionEvent mMotionEvent; private DesktopModeTouchEventListener( RunningTaskInfo taskInfo, @@ -798,7 +818,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, } else { // Full immersive is disabled or task doesn't request/support it, so just // toggle between maximize/restore states. - onMaximizeOrRestore(decoration.mTaskInfo.taskId, "caption_bar_button"); + onMaximizeOrRestore(decoration.mTaskInfo.taskId, "caption_bar_button", + ResizeTrigger.MAXIMIZE_BUTTON, mMotionEvent); } } else if (id == R.id.minimize_window) { mDesktopTasksController.minimizeTask(decoration.mTaskInfo); @@ -807,6 +828,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, @Override public boolean onTouch(View v, MotionEvent e) { + mMotionEvent = e; final int id = v.getId(); final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(mTaskId); if ((e.getSource() & SOURCE_TOUCHSCREEN) == SOURCE_TOUCHSCREEN) { @@ -897,6 +919,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, */ @Override public boolean onGenericMotion(View v, MotionEvent ev) { + mMotionEvent = ev; final DesktopModeWindowDecoration decoration = mWindowDecorByTaskId.get(mTaskId); final int id = v.getId(); if (ev.getAction() == ACTION_HOVER_ENTER && id == R.id.maximize_window) { @@ -1040,7 +1063,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, taskInfo, decoration.mTaskSurface, position, new PointF(e.getRawX(dragPointerIdx), e.getRawY(dragPointerIdx)), newTaskBounds, decoration.calculateValidDragArea(), - new Rect(mOnDragStartInitialBounds)); + new Rect(mOnDragStartInitialBounds), e); if (touchingButton && !mHasLongClicked) { // We need the input event to not be consumed here to end the ripple // effect on the touched button. We will reset drag state in the ensuing @@ -1087,7 +1110,7 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, // Disallow double-tap to resize when in full immersive. return false; } - onMaximizeOrRestore(mTaskId, "double_tap"); + onMaximizeOrRestore(mTaskId, "double_tap", ResizeTrigger.DOUBLE_TAP_APP_HEADER, e); return true; } } @@ -1484,7 +1507,8 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, mGenericLinksParser, mAssistContentRequester, mMultiInstanceHelper, - mWindowDecorCaptionHandleRepository); + mWindowDecorCaptionHandleRepository, + mDesktopModeEventLogger); mWindowDecorByTaskId.put(taskInfo.taskId, windowDecoration); final TaskPositioner taskPositioner = mTaskPositionerFactory.create( @@ -1501,15 +1525,16 @@ public class DesktopModeWindowDecorViewModel implements WindowDecorViewModel, final DesktopModeTouchEventListener touchEventListener = new DesktopModeTouchEventListener(taskInfo, taskPositioner); windowDecoration.setOnMaximizeOrRestoreClickListener(() -> { - onMaximizeOrRestore(taskInfo.taskId, "maximize_menu"); + onMaximizeOrRestore(taskInfo.taskId, "maximize_menu", ResizeTrigger.MAXIMIZE_MENU, + touchEventListener.mMotionEvent); return Unit.INSTANCE; }); windowDecoration.setOnLeftSnapClickListener(() -> { - onSnapResize(taskInfo.taskId, true /* isLeft */); + onSnapResize(taskInfo.taskId, /* isLeft= */ true, touchEventListener.mMotionEvent); return Unit.INSTANCE; }); windowDecoration.setOnRightSnapClickListener(() -> { - onSnapResize(taskInfo.taskId, false /* isLeft */); + onSnapResize(taskInfo.taskId, /* isLeft= */ false, touchEventListener.mMotionEvent); return Unit.INSTANCE; }); windowDecoration.setOnToDesktopClickListener(desktopModeTransitionSource -> { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java index 6eb20b9e3ae5..d94f3a9a70c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecoration.java @@ -94,6 +94,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.CaptionState; +import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.desktopmode.DesktopRepository; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.annotations.ShellBackgroundThread; @@ -216,7 +217,8 @@ public class DesktopModeWindowDecoration extends WindowDecoration surfaceControlBuilderSupplier, Supplier surfaceControlTransactionSupplier, - DisplayController displayController) { + DisplayController displayController, + DesktopModeEventLogger desktopModeEventLogger) { mContext = context; + mTaskInfo = taskInfo; mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier; mDisplayId = displayId; mDecorationSurface = decorationSurface; mDisplayController = displayController; + mDesktopModeEventLogger = desktopModeEventLogger; mClientToken = new Binder(); final InputTransferToken inputTransferToken = new InputTransferToken(); mInputChannel = new InputChannel(); @@ -125,11 +134,12 @@ class DragResizeInputListener implements AutoCloseable { e.rethrowFromSystemServer(); } - mInputEventReceiver = new TaskResizeInputEventReceiver(context, mInputChannel, callback, + mInputEventReceiver = new TaskResizeInputEventReceiver(context, mTaskInfo, mInputChannel, + callback, handler, choreographer, () -> { final DisplayLayout layout = mDisplayController.getDisplayLayout(mDisplayId); return new Size(layout.width(), layout.height()); - }, this::updateSinkInputChannel); + }, this::updateSinkInputChannel, mDesktopModeEventLogger); mInputEventReceiver.setTouchSlop(ViewConfiguration.get(context).getScaledTouchSlop()); mInputSinkSurface = surfaceControlBuilderSupplier.get() @@ -163,6 +173,22 @@ class DragResizeInputListener implements AutoCloseable { } } + DragResizeInputListener( + Context context, + RunningTaskInfo taskInfo, + Handler handler, + Choreographer choreographer, + int displayId, + SurfaceControl decorationSurface, + DragPositioningCallback callback, + Supplier surfaceControlBuilderSupplier, + Supplier surfaceControlTransactionSupplier, + DisplayController displayController) { + this(context, taskInfo, handler, choreographer, displayId, decorationSurface, callback, + surfaceControlBuilderSupplier, surfaceControlTransactionSupplier, displayController, + new DesktopModeEventLogger()); + } + /** * Updates the geometry (the touch region) of this drag resize handler. * @@ -274,6 +300,7 @@ class DragResizeInputListener implements AutoCloseable { private static class TaskResizeInputEventReceiver extends InputEventReceiver implements DragDetector.MotionEventHandler { @NonNull private final Context mContext; + @NonNull private final RunningTaskInfo mTaskInfo; private final InputManager mInputManager; @NonNull private final InputChannel mInputChannel; @NonNull private final DragPositioningCallback mCallback; @@ -282,6 +309,7 @@ class DragResizeInputListener implements AutoCloseable { @NonNull private final DragDetector mDragDetector; @NonNull private final Supplier mDisplayLayoutSizeSupplier; @NonNull private final Consumer mTouchRegionConsumer; + @NonNull private final DesktopModeEventLogger mDesktopModeEventLogger; private final Rect mTmpRect = new Rect(); private boolean mConsumeBatchEventScheduled; private DragResizeWindowGeometry mDragResizeWindowGeometry; @@ -293,15 +321,24 @@ class DragResizeInputListener implements AutoCloseable { // resize events. For example, if multiple fingers are touching the screen, then each one // has a separate pointer id, but we only accept drag input from one. private int mDragPointerId = -1; + // The type of resizing that is currently being done. Used to track the same resize trigger + // on start and end of the resizing action. + private ResizeTrigger mResizeTrigger = ResizeTrigger.UNKNOWN_RESIZE_TRIGGER; + // The last MotionEvent on ACTION_DOWN, used to track the input tool type and source for + // logging the start and end of the resizing action. + private MotionEvent mLastMotionEventOnDown; private TaskResizeInputEventReceiver(@NonNull Context context, + @NonNull RunningTaskInfo taskInfo, @NonNull InputChannel inputChannel, @NonNull DragPositioningCallback callback, @NonNull Handler handler, @NonNull Choreographer choreographer, @NonNull Supplier displayLayoutSizeSupplier, - @NonNull Consumer touchRegionConsumer) { + @NonNull Consumer touchRegionConsumer, + @NonNull DesktopModeEventLogger desktopModeEventLogger) { super(inputChannel, handler.getLooper()); mContext = context; + mTaskInfo = taskInfo; mInputManager = context.getSystemService(InputManager.class); mInputChannel = inputChannel; mCallback = callback; @@ -322,6 +359,7 @@ class DragResizeInputListener implements AutoCloseable { ViewConfiguration.get(mContext).getScaledTouchSlop()); mDisplayLayoutSizeSupplier = displayLayoutSizeSupplier; mTouchRegionConsumer = touchRegionConsumer; + mDesktopModeEventLogger = desktopModeEventLogger; } /** @@ -395,6 +433,7 @@ class DragResizeInputListener implements AutoCloseable { @Override public boolean handleMotionEvent(View v, MotionEvent e) { boolean result = false; + // Check if this is a touch event vs mouse event. // Touch events are tracked in four corners. Other events are tracked in resize edges. switch (e.getActionMasked()) { @@ -416,6 +455,13 @@ class DragResizeInputListener implements AutoCloseable { "%s: Handling action down, update ctrlType to %d", TAG, ctrlType); mDragStartTaskBounds = mCallback.onDragPositioningStart(ctrlType, rawX, rawY); + mLastMotionEventOnDown = e; + mResizeTrigger = (ctrlType == CTRL_TYPE_BOTTOM || ctrlType == CTRL_TYPE_TOP + || ctrlType == CTRL_TYPE_RIGHT || ctrlType == CTRL_TYPE_LEFT) + ? ResizeTrigger.EDGE : ResizeTrigger.CORNER; + mDesktopModeEventLogger.logTaskResizingStarted(mResizeTrigger, + e, mTaskInfo, /* displayController= */ null, + /* displayLayoutSize= */ mDisplayLayoutSizeSupplier.get()); // Increase the input sink region to cover the whole screen; this is to // prevent input and focus from going to other tasks during a drag resize. updateInputSinkRegionForDrag(mDragStartTaskBounds); @@ -464,6 +510,12 @@ class DragResizeInputListener implements AutoCloseable { if (taskBounds.equals(mDragStartTaskBounds)) { mTouchRegionConsumer.accept(mTouchRegion); } + + mDesktopModeEventLogger.logTaskResizingEnded(mResizeTrigger, + mLastMotionEventOnDown, mTaskInfo, taskBounds.height(), + taskBounds.width(), + /* displayController= */ null, + /* displayLayoutSize= */ mDisplayLayoutSizeSupplier.get()); } mShouldHandleEvents = false; mDragPointerId = -1; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java index 33d1c260cb84..844ceb304bde 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragResizeWindowGeometry.java @@ -181,7 +181,7 @@ final class DragResizeWindowGeometry { } private boolean isInEdgeResizeBounds(float x, float y) { - return calculateEdgeResizeCtrlType(x, y) != 0; + return calculateEdgeResizeCtrlType(x, y) != CTRL_TYPE_UNDEFINED; } /** diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java index 6b3b357f2f7b..34cc0986c83f 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/WindowDecoration.java @@ -58,6 +58,7 @@ import android.window.WindowContainerTransaction; import com.android.internal.annotations.VisibleForTesting; import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.windowdecor.WindowDecoration.RelayoutParams.OccludingCaptionElement; import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewHostViewContainer; @@ -111,6 +112,7 @@ public abstract class WindowDecoration final Context mContext; final @NonNull Context mUserContext; final @NonNull DisplayController mDisplayController; + final @NonNull DesktopModeEventLogger mDesktopModeEventLogger; final ShellTaskOrganizer mTaskOrganizer; final Supplier mSurfaceControlBuilderSupplier; final Supplier mSurfaceControlTransactionSupplier; @@ -163,7 +165,7 @@ public abstract class WindowDecoration this(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, SurfaceControl.Builder::new, SurfaceControl.Transaction::new, WindowContainerTransaction::new, SurfaceControl::new, - new SurfaceControlViewHostFactory() {}); + new SurfaceControlViewHostFactory() {}, new DesktopModeEventLogger()); } WindowDecoration( @@ -177,13 +179,16 @@ public abstract class WindowDecoration Supplier surfaceControlTransactionSupplier, Supplier windowContainerTransactionSupplier, Supplier surfaceControlSupplier, - SurfaceControlViewHostFactory surfaceControlViewHostFactory) { + SurfaceControlViewHostFactory surfaceControlViewHostFactory, + @NonNull DesktopModeEventLogger desktopModeEventLogger + ) { mContext = context; mUserContext = userContext; mDisplayController = displayController; mTaskOrganizer = taskOrganizer; mTaskInfo = taskInfo; mTaskSurface = cloneSurfaceControl(taskSurface, surfaceControlSupplier); + mDesktopModeEventLogger = desktopModeEventLogger; mSurfaceControlBuilderSupplier = surfaceControlBuilderSupplier; mSurfaceControlTransactionSupplier = surfaceControlTransactionSupplier; mWindowContainerTransactionSupplier = windowContainerTransactionSupplier; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java index e6bd05b82be9..f935ac76bbeb 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/TestRunningTaskInfoBuilder.java @@ -40,6 +40,8 @@ public final class TestRunningTaskInfoBuilder { private WindowContainerToken mToken = createMockWCToken(); private int mParentTaskId = INVALID_TASK_ID; + private int mUid = INVALID_TASK_ID; + private int mTaskId = INVALID_TASK_ID; private Intent mBaseIntent = new Intent(); private @WindowConfiguration.ActivityType int mActivityType = ACTIVITY_TYPE_STANDARD; private @WindowConfiguration.WindowingMode int mWindowingMode = WINDOWING_MODE_UNDEFINED; @@ -73,6 +75,18 @@ public final class TestRunningTaskInfoBuilder { return this; } + /** Sets the task info's effective UID. */ + public TestRunningTaskInfoBuilder setUid(int uid) { + mUid = uid; + return this; + } + + /** Sets the task info's UID. */ + public TestRunningTaskInfoBuilder setTaskId(int taskId) { + mTaskId = taskId; + return this; + } + /** * Set {@link ActivityManager.RunningTaskInfo#baseIntent} for the task info, by default * an empty intent is assigned @@ -132,7 +146,8 @@ public final class TestRunningTaskInfoBuilder { public ActivityManager.RunningTaskInfo build() { final ActivityManager.RunningTaskInfo info = new ActivityManager.RunningTaskInfo(); - info.taskId = sNextTaskId++; + info.taskId = (mTaskId == INVALID_TASK_ID) ? sNextTaskId++ : mTaskId; + info.effectiveUid = mUid; info.baseIntent = mBaseIntent; info.parentTaskId = mParentTaskId; info.displayId = mDisplayId; diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt index 0825b6b0d7be..2a82e6e4f7b8 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopModeEventLoggerTest.kt @@ -16,9 +16,12 @@ package com.android.wm.shell.desktopmode +import android.app.ActivityManager.RunningTaskInfo +import android.graphics.Rect import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule import com.android.dx.mockito.inline.extended.ExtendedMockito.clearInvocations +import com.android.dx.mockito.inline.extended.ExtendedMockito.doReturn import com.android.dx.mockito.inline.extended.ExtendedMockito.staticMockMarker import com.android.dx.mockito.inline.extended.ExtendedMockito.verify import com.android.dx.mockito.inline.extended.ExtendedMockito.verifyZeroInteractions @@ -27,6 +30,9 @@ import com.android.modules.utils.testing.ExtendedMockitoRule import com.android.window.flags.Flags import com.android.wm.shell.EventLogTags import com.android.wm.shell.ShellTestCase +import com.android.wm.shell.TestRunningTaskInfoBuilder +import com.android.wm.shell.common.DisplayController +import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.EnterReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ExitReason import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.InputMethod @@ -39,9 +45,13 @@ import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_M import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UNSET_UNMINIMIZE_REASON import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.UnminimizeReason import com.google.common.truth.Truth.assertThat +import org.junit.Before import org.junit.Rule import org.junit.Test +import org.mockito.ArgumentMatchers.anyInt import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever /** * Tests for [DesktopModeEventLogger]. @@ -49,6 +59,8 @@ import org.mockito.kotlin.eq class DesktopModeEventLoggerTest : ShellTestCase() { private val desktopModeEventLogger = DesktopModeEventLogger() + val displayController = mock() + val displayLayout = mock() @JvmField @Rule(order = 0) @@ -60,6 +72,13 @@ class DesktopModeEventLoggerTest : ShellTestCase() { @Rule(order = 1) val setFlagsRule = SetFlagsRule() + @Before + fun setUp() { + doReturn(displayLayout).whenever(displayController).getDisplayLayout(anyInt()) + doReturn(DISPLAY_WIDTH).whenever(displayLayout).width() + doReturn(DISPLAY_HEIGHT).whenever(displayLayout).height() + } + @Test fun logSessionEnter_logsEnterReasonWithNewSessionId() { desktopModeEventLogger.logSessionEnter(EnterReason.KEYBOARD_SHORTCUT_ENTER) @@ -467,7 +486,8 @@ class DesktopModeEventLoggerTest : ShellTestCase() { @Test fun logTaskResizingStarted_noOngoingSession_doesNotLog() { - desktopModeEventLogger.logTaskResizingStarted(TASK_SIZE_UPDATE) + desktopModeEventLogger.logTaskResizingStarted(ResizeTrigger.CORNER, + null, createTaskInfo()) verifyZeroInteractions(staticMockMarker(FrameworkStatsLog::class.java)) verifyZeroInteractions(staticMockMarker(EventLogTags::class.java)) @@ -478,13 +498,14 @@ class DesktopModeEventLoggerTest : ShellTestCase() { fun logTaskResizingStarted_logsTaskSizeUpdatedWithStartResizingStage() { val sessionId = startDesktopModeSession() - desktopModeEventLogger.logTaskResizingStarted(TASK_SIZE_UPDATE) + desktopModeEventLogger.logTaskResizingStarted(ResizeTrigger.CORNER, + null, createTaskInfo(), displayController) verify { FrameworkStatsLog.write( eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), /* resize_trigger */ - eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER), + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER), /* resizing_stage */ eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__START_RESIZING_STAGE), /* input_method */ @@ -500,7 +521,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() { /* task_width */ eq(TASK_SIZE_UPDATE.taskWidth), /* display_area */ - eq(TASK_SIZE_UPDATE.displayArea), + eq(DISPLAY_AREA), ) } verifyZeroInteractions(staticMockMarker(FrameworkStatsLog::class.java)) @@ -508,7 +529,8 @@ class DesktopModeEventLoggerTest : ShellTestCase() { @Test fun logTaskResizingEnded_noOngoingSession_doesNotLog() { - desktopModeEventLogger.logTaskResizingEnded(TASK_SIZE_UPDATE) + desktopModeEventLogger.logTaskResizingEnded(ResizeTrigger.CORNER, + null, createTaskInfo()) verifyZeroInteractions(staticMockMarker(FrameworkStatsLog::class.java)) verifyZeroInteractions(staticMockMarker(EventLogTags::class.java)) @@ -519,13 +541,14 @@ class DesktopModeEventLoggerTest : ShellTestCase() { fun logTaskResizingEnded_logsTaskSizeUpdatedWithEndResizingStage() { val sessionId = startDesktopModeSession() - desktopModeEventLogger.logTaskResizingEnded(TASK_SIZE_UPDATE) + desktopModeEventLogger.logTaskResizingEnded(ResizeTrigger.CORNER, + null, createTaskInfo(), displayController = displayController) verify { FrameworkStatsLog.write( eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED), /* resize_trigger */ - eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__UNKNOWN_RESIZE_TRIGGER), + eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZE_TRIGGER__CORNER_RESIZE_TRIGGER), /* resizing_stage */ eq(FrameworkStatsLog.DESKTOP_MODE_TASK_SIZE_UPDATED__RESIZING_STAGE__END_RESIZING_STAGE), /* input_method */ @@ -541,7 +564,7 @@ class DesktopModeEventLoggerTest : ShellTestCase() { /* task_width */ eq(TASK_SIZE_UPDATE.taskWidth), /* display_area */ - eq(TASK_SIZE_UPDATE.displayArea), + eq(DISPLAY_AREA), ) } verifyZeroInteractions(staticMockMarker(FrameworkStatsLog::class.java)) @@ -585,8 +608,14 @@ class DesktopModeEventLoggerTest : ShellTestCase() { } } + private fun createTaskInfo(): RunningTaskInfo { + return TestRunningTaskInfoBuilder().setTaskId(TASK_ID) + .setUid(TASK_UID) + .setBounds(Rect(TASK_X, TASK_Y, TASK_WIDTH, TASK_HEIGHT)) + .build() + } + private companion object { - private const val sessionId = 1 private const val TASK_ID = 1 private const val TASK_UID = 1 private const val TASK_X = 0 @@ -594,7 +623,9 @@ class DesktopModeEventLoggerTest : ShellTestCase() { private const val TASK_HEIGHT = 100 private const val TASK_WIDTH = 100 private const val TASK_COUNT = 1 - private const val DISPLAY_AREA = 1000 + private const val DISPLAY_WIDTH = 500 + private const val DISPLAY_HEIGHT = 500 + private const val DISPLAY_AREA = DISPLAY_HEIGHT * DISPLAY_WIDTH private val TASK_UPDATE = TaskUpdate( TASK_ID, TASK_UID, TASK_HEIGHT, TASK_WIDTH, TASK_X, TASK_Y, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 55b44ac935ea..61943568e7d4 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -54,6 +54,7 @@ import android.view.Display.DEFAULT_DISPLAY import android.view.DragEvent import android.view.Gravity import android.view.KeyEvent +import android.view.MotionEvent import android.view.SurfaceControl import android.view.WindowInsets import android.view.WindowManager @@ -99,6 +100,7 @@ import com.android.wm.shell.common.LaunchAdjacentController import com.android.wm.shell.common.MultiInstanceHelper import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SyncTransactionQueue +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition import com.android.wm.shell.desktopmode.DesktopTasksController.TaskbarDesktopTaskListener import com.android.wm.shell.desktopmode.DesktopTestHelpers.Companion.createFreeformTask @@ -214,9 +216,11 @@ class DesktopTasksControllerTest : ShellTestCase() { @Mock private lateinit var taskbarDesktopTaskListener: TaskbarDesktopTaskListener @Mock private lateinit var freeformTaskTransitionStarter: FreeformTaskTransitionStarter @Mock private lateinit var mockHandler: Handler + @Mock private lateinit var desktopModeEventLogger: DesktopModeEventLogger @Mock lateinit var persistentRepository: DesktopPersistentRepository @Mock private lateinit var mockInputManager: InputManager @Mock private lateinit var mockFocusTransitionObserver: FocusTransitionObserver + @Mock lateinit var motionEvent: MotionEvent private lateinit var mockitoSession: StaticMockitoSession private lateinit var controller: DesktopTasksController @@ -329,6 +333,7 @@ class DesktopTasksControllerTest : ShellTestCase() { mockHandler, mockInputManager, mockFocusTransitionObserver, + desktopModeEventLogger, ) } @@ -357,9 +362,17 @@ class DesktopTasksControllerTest : ShellTestCase() { val task1 = setUpFreeformTask() val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) - controller.toggleDesktopTaskSize(task1) - verify(taskbarDesktopTaskListener).onTaskbarCornerRoundingUpdate(argumentCaptor.capture()) + controller.toggleDesktopTaskSize(task1, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) + verify(taskbarDesktopTaskListener).onTaskbarCornerRoundingUpdate(argumentCaptor.capture()) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task1, + STABLE_BOUNDS.height(), + STABLE_BOUNDS.width(), + displayController + ) assertThat(argumentCaptor.value).isTrue() } @@ -376,9 +389,17 @@ class DesktopTasksControllerTest : ShellTestCase() { val task1 = setUpFreeformTask(bounds = stableBounds, active = true) val argumentCaptor = ArgumentCaptor.forClass(Boolean::class.java) - controller.toggleDesktopTaskSize(task1) - verify(taskbarDesktopTaskListener).onTaskbarCornerRoundingUpdate(argumentCaptor.capture()) + controller.toggleDesktopTaskSize(task1, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) + verify(taskbarDesktopTaskListener).onTaskbarCornerRoundingUpdate(argumentCaptor.capture()) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task1, + 0, + 0, + displayController + ) assertThat(argumentCaptor.value).isFalse() } @@ -2860,7 +2881,8 @@ class DesktopTasksControllerTest : ShellTestCase() { PointF(200f, -200f), /* inputCoordinate */ Rect(100, -100, 500, 1000), /* currentDragBounds */ Rect(0, 50, 2000, 2000), /* validDragArea */ - Rect() /* dragStartBounds */ ) + Rect() /* dragStartBounds */, + motionEvent) val rectAfterEnd = Rect(100, 50, 500, 1150) verify(transitions) .startTransition( @@ -2895,7 +2917,8 @@ class DesktopTasksControllerTest : ShellTestCase() { PointF(200f, 300f), /* inputCoordinate */ currentDragBounds, /* currentDragBounds */ Rect(0, 50, 2000, 2000) /* validDragArea */, - Rect() /* dragStartBounds */) + Rect() /* dragStartBounds */, + motionEvent) verify(transitions) @@ -3142,10 +3165,19 @@ class DesktopTasksControllerTest : ShellTestCase() { val bounds = Rect(0, 0, 100, 100) val task = setUpFreeformTask(DEFAULT_DISPLAY, bounds) - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) + // Assert bounds set to stable bounds val wct = getLatestToggleResizeDesktopTaskWct() assertThat(findBoundsChange(wct, task)).isEqualTo(STABLE_BOUNDS) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + STABLE_BOUNDS.height(), + STABLE_BOUNDS.width(), + displayController + ) } @Test @@ -3164,10 +3196,18 @@ class DesktopTasksControllerTest : ShellTestCase() { STABLE_BOUNDS.left, STABLE_BOUNDS.top, STABLE_BOUNDS.right / 2, STABLE_BOUNDS.bottom ) - controller.snapToHalfScreen(task, mockSurface, currentDragBounds, SnapPosition.LEFT) + controller.snapToHalfScreen(task, mockSurface, currentDragBounds, SnapPosition.LEFT, ResizeTrigger.SNAP_LEFT_MENU, motionEvent) // Assert bounds set to stable bounds val wct = getLatestToggleResizeDesktopTaskWct(currentDragBounds) assertThat(findBoundsChange(wct, task)).isEqualTo(expectedBounds) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.SNAP_LEFT_MENU, + motionEvent, + task, + expectedBounds.height(), + expectedBounds.width(), + displayController + ) } @Test @@ -3187,7 +3227,7 @@ class DesktopTasksControllerTest : ShellTestCase() { // Attempt to snap left again val currentDragBounds = Rect(bounds).apply { offset(-100, 0) } - controller.snapToHalfScreen(task, mockSurface, currentDragBounds, SnapPosition.LEFT) + controller.snapToHalfScreen(task, mockSurface, currentDragBounds, SnapPosition.LEFT, ResizeTrigger.SNAP_LEFT_MENU, motionEvent) // Assert that task is NOT updated via WCT verify(toggleResizeDesktopTaskTransitionHandler, never()).startTransition(any(), any()) @@ -3200,6 +3240,14 @@ class DesktopTasksControllerTest : ShellTestCase() { eq(bounds), eq(true) ) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.SNAP_LEFT_MENU, + motionEvent, + task, + bounds.height(), + bounds.width(), + displayController + ) } @Test @@ -3210,12 +3258,22 @@ class DesktopTasksControllerTest : ShellTestCase() { } val preDragBounds = Rect(100, 100, 400, 500) val currentDragBounds = Rect(0, 100, 300, 500) + val expectedBounds = + Rect(STABLE_BOUNDS.left, STABLE_BOUNDS.top, STABLE_BOUNDS.right / 2, STABLE_BOUNDS.bottom) controller.handleSnapResizingTask( - task, SnapPosition.LEFT, mockSurface, currentDragBounds, preDragBounds) + task, SnapPosition.LEFT, mockSurface, currentDragBounds, preDragBounds, motionEvent + ) val wct = getLatestToggleResizeDesktopTaskWct(currentDragBounds) assertThat(findBoundsChange(wct, task)).isEqualTo( - Rect(STABLE_BOUNDS.left, STABLE_BOUNDS.top, STABLE_BOUNDS.right / 2, STABLE_BOUNDS.bottom)) + expectedBounds + ) + verify(desktopModeEventLogger, times(1)).logTaskResizingStarted( + ResizeTrigger.DRAG_LEFT, + motionEvent, + task, + displayController + ) } @Test @@ -3228,7 +3286,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val currentDragBounds = Rect(0, 100, 300, 500) controller.handleSnapResizingTask( - task, SnapPosition.LEFT, mockSurface, currentDragBounds, preDragBounds) + task, SnapPosition.LEFT, mockSurface, currentDragBounds, preDragBounds, motionEvent) verify(mReturnToDragStartAnimator).start( eq(task.taskId), eq(mockSurface), @@ -3236,6 +3294,13 @@ class DesktopTasksControllerTest : ShellTestCase() { eq(preDragBounds), eq(false) ) + verify(desktopModeEventLogger, never()).logTaskResizingStarted( + any(), + any(), + any(), + any(), + any() + ) } @Test @@ -3254,10 +3319,19 @@ class DesktopTasksControllerTest : ShellTestCase() { // Bounds should be 1000 x 500, vertically centered in the 1000 x 1000 stable bounds val expectedBounds = Rect(STABLE_BOUNDS.left, 250, STABLE_BOUNDS.right, 750) - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) + // Assert bounds set to stable bounds val wct = getLatestToggleResizeDesktopTaskWct() assertThat(findBoundsChange(wct, task)).isEqualTo(expectedBounds) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + expectedBounds.height(), + expectedBounds.width(), + displayController + ) } @Test @@ -3265,8 +3339,12 @@ class DesktopTasksControllerTest : ShellTestCase() { val bounds = Rect(0, 0, 100, 100) val task = setUpFreeformTask(DEFAULT_DISPLAY, bounds) - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) assertThat(taskRepository.removeBoundsBeforeMaximize(task.taskId)).isEqualTo(bounds) + verify(desktopModeEventLogger, never()).logTaskResizingEnded( + any(), any(), any(), any(), + any(), any(), any() + ) } @Test @@ -3275,15 +3353,23 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFreeformTask(DEFAULT_DISPLAY, boundsBeforeMaximize) // Maximize - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) task.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS) // Restore - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) // Assert bounds set to last bounds before maximize val wct = getLatestToggleResizeDesktopTaskWct() assertThat(findBoundsChange(wct, task)).isEqualTo(boundsBeforeMaximize) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + boundsBeforeMaximize.height(), + boundsBeforeMaximize.width(), + displayController + ) } @Test @@ -3294,16 +3380,24 @@ class DesktopTasksControllerTest : ShellTestCase() { } // Maximize - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) task.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS.left, boundsBeforeMaximize.top, STABLE_BOUNDS.right, boundsBeforeMaximize.bottom) // Restore - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) // Assert bounds set to last bounds before maximize val wct = getLatestToggleResizeDesktopTaskWct() assertThat(findBoundsChange(wct, task)).isEqualTo(boundsBeforeMaximize) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + boundsBeforeMaximize.height(), + boundsBeforeMaximize.width(), + displayController + ) } @Test @@ -3314,16 +3408,24 @@ class DesktopTasksControllerTest : ShellTestCase() { } // Maximize - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) task.configuration.windowConfiguration.bounds.set(boundsBeforeMaximize.left, STABLE_BOUNDS.top, boundsBeforeMaximize.right, STABLE_BOUNDS.bottom) // Restore - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) // Assert bounds set to last bounds before maximize val wct = getLatestToggleResizeDesktopTaskWct() assertThat(findBoundsChange(wct, task)).isEqualTo(boundsBeforeMaximize) + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + boundsBeforeMaximize.height(), + boundsBeforeMaximize.width(), + displayController + ) } @Test @@ -3332,14 +3434,22 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFreeformTask(DEFAULT_DISPLAY, boundsBeforeMaximize) // Maximize - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) task.configuration.windowConfiguration.bounds.set(STABLE_BOUNDS) // Restore - controller.toggleDesktopTaskSize(task) + controller.toggleDesktopTaskSize(task, ResizeTrigger.MAXIMIZE_BUTTON, motionEvent) // Assert last bounds before maximize removed after use assertThat(taskRepository.removeBoundsBeforeMaximize(task.taskId)).isNull() + verify(desktopModeEventLogger, times(1)).logTaskResizingEnded( + ResizeTrigger.MAXIMIZE_BUTTON, + motionEvent, + task, + boundsBeforeMaximize.height(), + boundsBeforeMaximize.width(), + displayController + ) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt index 175fbd2396e3..1839b8a367fe 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorViewModelTests.kt @@ -87,6 +87,8 @@ import com.android.wm.shell.common.MultiInstanceHelper import com.android.wm.shell.common.ShellExecutor import com.android.wm.shell.common.SyncTransactionQueue import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler +import com.android.wm.shell.desktopmode.DesktopModeEventLogger +import com.android.wm.shell.desktopmode.DesktopModeEventLogger.Companion.ResizeTrigger import com.android.wm.shell.desktopmode.DesktopRepository import com.android.wm.shell.desktopmode.DesktopTasksController import com.android.wm.shell.desktopmode.DesktopTasksController.SnapPosition @@ -194,7 +196,11 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { @Mock private lateinit var mockAppHandleEducationController: AppHandleEducationController @Mock private lateinit var mockFocusTransitionObserver: FocusTransitionObserver @Mock private lateinit var mockCaptionHandleRepository: WindowDecorCaptionHandleRepository + @Mock private lateinit var motionEvent: MotionEvent + @Mock lateinit var displayController: DisplayController + @Mock lateinit var displayLayout: DisplayLayout private lateinit var spyContext: TestableContext + private lateinit var desktopModeEventLogger: DesktopModeEventLogger private val transactionFactory = Supplier { SurfaceControl.Transaction() @@ -224,6 +230,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { shellInit = ShellInit(mockShellExecutor) windowDecorByTaskIdSpy.clear() spyContext.addMockSystemService(InputManager::class.java, mockInputManager) + desktopModeEventLogger = mock() desktopModeWindowDecorViewModel = DesktopModeWindowDecorViewModel( spyContext, mockShellExecutor, @@ -256,7 +263,8 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { mockCaptionHandleRepository, Optional.of(mockActivityOrientationChangeHandler), mockTaskPositionerFactory, - mockFocusTransitionObserver + mockFocusTransitionObserver, + desktopModeEventLogger ) desktopModeWindowDecorViewModel.setSplitScreenController(mockSplitScreenController) whenever(mockDisplayController.getDisplayLayout(any())).thenReturn(mockDisplayLayout) @@ -299,6 +307,10 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { argumentCaptor() verify(mockShellController).addKeyguardChangeListener(keyguardChangedCaptor.capture()) desktopModeOnKeyguardChangedListener = keyguardChangedCaptor.firstValue + whenever(displayController.getDisplayLayout(anyInt())).thenReturn(displayLayout) + whenever(displayLayout.getStableBounds(any())).thenAnswer { i -> + (i.arguments.first() as Rect).set(STABLE_BOUNDS) + } } @After @@ -612,7 +624,11 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { maxOrRestoreListenerCaptor.value.invoke() - verify(mockDesktopTasksController).toggleDesktopTaskSize(decor.mTaskInfo) + verify(mockDesktopTasksController).toggleDesktopTaskSize( + decor.mTaskInfo, + ResizeTrigger.MAXIMIZE_MENU, + null + ) } @Test @@ -647,7 +663,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { eq(decor.mTaskInfo), taskSurfaceCaptor.capture(), eq(currentBounds), - eq(SnapPosition.LEFT) + eq(SnapPosition.LEFT), + eq(ResizeTrigger.SNAP_LEFT_MENU), + eq(null) ) assertEquals(taskSurfaceCaptor.firstValue, decor.mTaskSurface) } @@ -685,7 +703,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { eq(decor.mTaskInfo), taskSurfaceCaptor.capture(), eq(currentBounds), - eq(SnapPosition.LEFT) + eq(SnapPosition.LEFT), + eq(ResizeTrigger.SNAP_LEFT_MENU), + eq(null) ) assertEquals(decor.mTaskSurface, taskSurfaceCaptor.firstValue) } @@ -704,7 +724,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { onLeftSnapClickListenerCaptor.value.invoke() verify(mockDesktopTasksController, never()) - .snapToHalfScreen(eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.LEFT)) + .snapToHalfScreen(eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.LEFT), + eq(ResizeTrigger.MAXIMIZE_BUTTON), + eq(null)) verify(mockToast).show() } @@ -725,7 +747,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { eq(decor.mTaskInfo), taskSurfaceCaptor.capture(), eq(currentBounds), - eq(SnapPosition.RIGHT) + eq(SnapPosition.RIGHT), + eq(ResizeTrigger.SNAP_RIGHT_MENU), + eq(null) ) assertEquals(decor.mTaskSurface, taskSurfaceCaptor.firstValue) } @@ -763,7 +787,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { eq(decor.mTaskInfo), taskSurfaceCaptor.capture(), eq(currentBounds), - eq(SnapPosition.RIGHT) + eq(SnapPosition.RIGHT), + eq(ResizeTrigger.SNAP_RIGHT_MENU), + eq(null) ) assertEquals(decor.mTaskSurface, taskSurfaceCaptor.firstValue) } @@ -782,7 +808,9 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { onRightSnapClickListenerCaptor.value.invoke() verify(mockDesktopTasksController, never()) - .snapToHalfScreen(eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.RIGHT)) + .snapToHalfScreen(eq(decor.mTaskInfo), any(), eq(currentBounds), eq(SnapPosition.RIGHT), + eq(ResizeTrigger.MAXIMIZE_BUTTON), + eq(null)) verify(mockToast).show() } @@ -1247,7 +1275,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { onClickListenerCaptor.value.onClick(view) verify(mockDesktopTasksController) - .toggleDesktopTaskSize(decor.mTaskInfo) + .toggleDesktopTaskSize(decor.mTaskInfo, ResizeTrigger.MAXIMIZE_BUTTON, null) } private fun createOpenTaskDecoration( @@ -1337,7 +1365,7 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { whenever( mockDesktopModeWindowDecorFactory.create( any(), any(), any(), any(), any(), any(), eq(task), any(), any(), any(), any(), - any(), any(), any(), any(), any(), any(), any()) + any(), any(), any(), any(), any(), any(), any(), any()) ).thenReturn(decoration) decoration.mTaskInfo = task whenever(decoration.user).thenReturn(mockUserHandle) @@ -1378,5 +1406,6 @@ class DesktopModeWindowDecorViewModelTests : ShellTestCase() { private const val TAG = "DesktopModeWindowDecorViewModelTests" private val STABLE_INSETS = Rect(0, 100, 0, 0) private val INITIAL_BOUNDS = Rect(0, 0, 100, 100) + private val STABLE_BOUNDS = Rect(0, 0, 1000, 1000) } } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java index 320887212f54..0afb6c10b549 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DesktopModeWindowDecorationTests.java @@ -106,6 +106,7 @@ import com.android.wm.shell.common.MultiInstanceHelper; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.SyncTransactionQueue; import com.android.wm.shell.desktopmode.CaptionState; +import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.desktopmode.DesktopRepository; import com.android.wm.shell.desktopmode.WindowDecorCaptionHandleRepository; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; @@ -210,6 +211,8 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { private MultiInstanceHelper mMockMultiInstanceHelper; @Mock private WindowDecorCaptionHandleRepository mMockCaptionHandleRepository; + @Mock + private DesktopModeEventLogger mDesktopModeEventLogger; @Captor private ArgumentCaptor> mOnMaxMenuHoverChangeListener; @Captor @@ -1400,7 +1403,7 @@ public class DesktopModeWindowDecorationTests extends ShellTestCase { mMockTransactionSupplier, WindowContainerTransaction::new, SurfaceControl::new, new WindowManagerWrapper(mMockWindowManager), mMockSurfaceControlViewHostFactory, maximizeMenuFactory, mMockHandleMenuFactory, - mMockMultiInstanceHelper, mMockCaptionHandleRepository); + mMockMultiInstanceHelper, mMockCaptionHandleRepository, mDesktopModeEventLogger); windowDecor.setCaptionListeners(mMockTouchEventListener, mMockTouchEventListener, mMockTouchEventListener, mMockTouchEventListener); windowDecor.setExclusionRegionListener(mMockExclusionRegionListener); diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java index fb17ae93030d..cb7fadee9822 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/WindowDecorationTests.java @@ -83,6 +83,7 @@ import com.android.wm.shell.ShellTaskOrganizer; import com.android.wm.shell.ShellTestCase; import com.android.wm.shell.TestRunningTaskInfoBuilder; import com.android.wm.shell.common.DisplayController; +import com.android.wm.shell.desktopmode.DesktopModeEventLogger; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; import com.android.wm.shell.tests.R; import com.android.wm.shell.windowdecor.additionalviewcontainer.AdditionalViewContainer; @@ -138,6 +139,8 @@ public class WindowDecorationTests extends ShellTestCase { private SurfaceSyncGroup mMockSurfaceSyncGroup; @Mock private SurfaceControl mMockTaskSurface; + @Mock + private DesktopModeEventLogger mDesktopModeEventLogger; private final List mMockSurfaceControlTransactions = new ArrayList<>(); @@ -1014,7 +1017,7 @@ public class WindowDecorationTests extends ShellTestCase { new MockObjectSupplier<>(mMockSurfaceControlTransactions, () -> mock(SurfaceControl.Transaction.class)), () -> mMockWindowContainerTransaction, () -> mMockTaskSurface, - mMockSurfaceControlViewHostFactory); + mMockSurfaceControlViewHostFactory, mDesktopModeEventLogger); } private class MockObjectSupplier implements Supplier { @@ -1054,11 +1057,12 @@ public class WindowDecorationTests extends ShellTestCase { Supplier surfaceControlTransactionSupplier, Supplier windowContainerTransactionSupplier, Supplier surfaceControlSupplier, - SurfaceControlViewHostFactory surfaceControlViewHostFactory) { + SurfaceControlViewHostFactory surfaceControlViewHostFactory, + DesktopModeEventLogger desktopModeEventLogger) { super(context, userContext, displayController, taskOrganizer, taskInfo, taskSurface, surfaceControlBuilderSupplier, surfaceControlTransactionSupplier, windowContainerTransactionSupplier, surfaceControlSupplier, - surfaceControlViewHostFactory); + surfaceControlViewHostFactory, desktopModeEventLogger); } @Override -- GitLab From 6cf9cd82efa0b5ff3a93bb96249188d58a6707f1 Mon Sep 17 00:00:00 2001 From: Haijie Hong Date: Tue, 22 Oct 2024 17:38:07 +0800 Subject: [PATCH 190/459] Use stopTimeoutMillis to avoid unnecessary bind/unbind BUG: 343317785 Test: local tested Flag: com.android.settings.flags.enable_bluetooth_device_details_polish Change-Id: I1f0adb97fc3d4669ad6a730b73c3fd64d102c98e --- .../data/repository/DeviceSettingServiceConnection.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt index a33fcc6747b4..c16366e14560 100644 --- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt +++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/devicesettings/data/repository/DeviceSettingServiceConnection.kt @@ -279,7 +279,7 @@ class DeviceSettingServiceConnection( getService(intent, IDeviceSettingsProviderService.Stub::asInterface) .stateIn( coroutineScope.plus(backgroundCoroutineContext), - SharingStarted.WhileSubscribed(), + SharingStarted.WhileSubscribed(stopTimeoutMillis = SERVICE_CONNECTION_STOP_MILLIS), ServiceConnectionStatus.Connecting, ) }, @@ -370,5 +370,6 @@ class DeviceSettingServiceConnection( const val CONFIG_SERVICE_PACKAGE_NAME = "DEVICE_SETTINGS_CONFIG_PACKAGE_NAME" const val CONFIG_SERVICE_CLASS_NAME = "DEVICE_SETTINGS_CONFIG_CLASS" const val CONFIG_SERVICE_INTENT_ACTION = "DEVICE_SETTINGS_CONFIG_ACTION" + const val SERVICE_CONNECTION_STOP_MILLIS = 1000L } } -- GitLab From a1c2d87b297b0041379fb334af4978171809f9f5 Mon Sep 17 00:00:00 2001 From: Orhan Uysal Date: Thu, 17 Oct 2024 14:38:00 +0000 Subject: [PATCH 191/459] Do not use defaultInstance for persistent repo In following cases we used default instances to populate the repo: - If task details for a taskId is not contained in the persisted repo - If there is a problem reading the persistent repository These might result in populating the in-memory repo with non-existing states that are not removed. Instead use null values so we never add any tasks to repo in case persistent state is not correct. Bug: 371955621 Test: Manual Flag: EXEMPT Bugfix Change-Id: Idbe0663cf143a489ceb596bc0b92690ebb1706ff --- .../wm/shell/desktopmode/DesktopRepository.kt | 14 ++++++-------- .../persistence/DesktopPersistentRepository.kt | 13 ++++++------- .../persistence/DesktopPersistentRepositoryTest.kt | 10 +++++----- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index 7b2a5d343861..4d8eeb4db2e6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -30,7 +30,6 @@ import androidx.core.util.valueIterator import com.android.internal.protolog.ProtoLog import com.android.window.flags.Flags import com.android.wm.shell.desktopmode.persistence.DesktopPersistentRepository -import com.android.wm.shell.desktopmode.persistence.DesktopTask import com.android.wm.shell.desktopmode.persistence.DesktopTaskState import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.annotations.ShellMainThread @@ -113,7 +112,8 @@ class DesktopRepository ( if (!Flags.enableDesktopWindowingPersistence()) return // TODO: b/365962554 - Handle the case that user moves to desktop before it's initialized mainCoroutineScope.launch { - val desktop = persistentRepository.readDesktop() + val desktop = persistentRepository.readDesktop() ?: return@launch + val maxTasks = DesktopModeStatus.getMaxTaskLimit(context).takeIf { it > 0 } ?: desktop.zOrderedTasksCount @@ -121,13 +121,11 @@ class DesktopRepository ( desktop.zOrderedTasksList // Reverse it so we initialize the repo from bottom to top. .reversed() - .map { taskId -> - desktop.tasksByTaskIdMap.getOrDefault( - taskId, - DesktopTask.getDefaultInstance() - ) + .mapNotNull { taskId -> + desktop.tasksByTaskIdMap[taskId]?.takeIf { + it.desktopTaskState == DesktopTaskState.VISIBLE + } } - .filter { task -> task.desktopTaskState == DesktopTaskState.VISIBLE } .take(maxTasks) .forEach { task -> addOrMoveFreeformTaskToTop(desktop.displayId, task.taskId) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt index 3f41d7cf4e86..2d11e02bd3c6 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepository.kt @@ -73,15 +73,14 @@ class DesktopPersistentRepository( */ private suspend fun getDesktopRepositoryState( userId: Int = DEFAULT_USER_ID - ): DesktopRepositoryState = + ): DesktopRepositoryState? = try { dataStoreFlow .first() - .desktopRepoByUserMap - .getOrDefault(userId, DesktopRepositoryState.getDefaultInstance()) + .desktopRepoByUserMap[userId] } catch (e: Exception) { Log.e(TAG, "Unable to read from datastore", e) - DesktopRepositoryState.getDefaultInstance() + null } /** @@ -91,13 +90,13 @@ class DesktopPersistentRepository( suspend fun readDesktop( userId: Int = DEFAULT_USER_ID, desktopId: Int = DEFAULT_DESKTOP_ID, - ): Desktop = + ): Desktop? = try { val repository = getDesktopRepositoryState(userId) - repository.getDesktopOrThrow(desktopId) + repository?.getDesktopOrThrow(desktopId) } catch (e: Exception) { Log.e(TAG, "Unable to get desktop info from persistent repository", e) - Desktop.getDefaultInstance() + null } /** Adds or updates a desktop stored in the datastore */ diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt index 9b9703fdf6dc..8495580f42a5 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/persistence/DesktopPersistentRepositoryTest.kt @@ -115,8 +115,8 @@ class DesktopPersistentRepositoryTest : ShellTestCase() { freeformTasksInZOrder = freeformTasksInZOrder) val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) - assertThat(actualDesktop.tasksByTaskIdMap).hasSize(2) - assertThat(actualDesktop.getZOrderedTasks(0)).isEqualTo(2) + assertThat(actualDesktop?.tasksByTaskIdMap).hasSize(2) + assertThat(actualDesktop?.getZOrderedTasks(0)).isEqualTo(2) } } @@ -138,7 +138,7 @@ class DesktopPersistentRepositoryTest : ShellTestCase() { freeformTasksInZOrder = freeformTasksInZOrder) val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) - assertThat(actualDesktop.tasksByTaskIdMap[task.taskId]?.desktopTaskState) + assertThat(actualDesktop?.tasksByTaskIdMap?.get(task.taskId)?.desktopTaskState) .isEqualTo(DesktopTaskState.MINIMIZED) } } @@ -161,8 +161,8 @@ class DesktopPersistentRepositoryTest : ShellTestCase() { freeformTasksInZOrder = freeformTasksInZOrder) val actualDesktop = datastoreRepository.readDesktop(DEFAULT_USER_ID, DEFAULT_DESKTOP_ID) - assertThat(actualDesktop.tasksByTaskIdMap).isEmpty() - assertThat(actualDesktop.zOrderedTasksList).isEmpty() + assertThat(actualDesktop?.tasksByTaskIdMap).isEmpty() + assertThat(actualDesktop?.zOrderedTasksList).isEmpty() } } -- GitLab From c7cc1450a54cb1a64e5e7273592ec4462f5079da Mon Sep 17 00:00:00 2001 From: dakinola Date: Mon, 21 Oct 2024 17:17:00 +0000 Subject: [PATCH 192/459] Fix Resizing Flicker Tests - Transitions * MaximizeApp flicker tests sometimes has problems finding the associated transition, so changing the scenario extractor to specifically look for the toggle resize transition which occurs which each maximize * SnapResize Right tests sometimes break because dragging all the way to the right edge fails as an action, so instead we drag a few dp shy of the actual edge of the screen Bug: 366201230 Bug: 371986068 Test: atest MaxmizeAppLandscape Test: atest SnapResizeAppWindowRightWithDrag Flag: TEST_ONLY Change-Id: I9f555afd525e796eb23d8f068637e59d3c4b7498 --- .../flicker/DesktopModeFlickerScenarios.kt | 36 ++++++++++++------- .../flicker/helpers/DesktopModeAppHelper.kt | 7 +++- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt index 7640cb1fb616..fea422f7753b 100644 --- a/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt +++ b/libs/WindowManager/Shell/tests/e2e/desktopmode/flicker-service/src/com/android/wm/shell/flicker/DesktopModeFlickerScenarios.kt @@ -297,12 +297,18 @@ class DesktopModeFlickerScenarios { FlickerConfigEntry( scenarioId = ScenarioId("MAXIMIZE_APP"), extractor = - TaggedScenarioExtractorBuilder() - .setTargetTag(CujType.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW) - .setTransitionMatcher( - TaggedCujTransitionMatcher(associatedTransitionRequired = false) - ) - .build(), + ShellTransitionScenarioExtractor( + transitionMatcher = + object : ITransitionMatcher { + override fun findAll( + transitions: Collection + ): Collection { + return transitions.filter { + it.type == TransitionType.DESKTOP_MODE_TOGGLE_RESIZE + } + } + } + ), assertions = AssertionTemplates.DESKTOP_MODE_APP_VISIBILITY_ASSERTIONS + listOf( AppLayerIncreasesInSize(DESKTOP_MODE_APP), @@ -315,12 +321,18 @@ class DesktopModeFlickerScenarios { FlickerConfigEntry( scenarioId = ScenarioId("MAXIMIZE_APP_NON_RESIZABLE"), extractor = - TaggedScenarioExtractorBuilder() - .setTargetTag(CujType.CUJ_DESKTOP_MODE_MAXIMIZE_WINDOW) - .setTransitionMatcher( - TaggedCujTransitionMatcher(associatedTransitionRequired = false) - ) - .build(), + ShellTransitionScenarioExtractor( + transitionMatcher = + object : ITransitionMatcher { + override fun findAll( + transitions: Collection + ): Collection { + return transitions.filter { + it.type == TransitionType.DESKTOP_MODE_TOGGLE_RESIZE + } + } + } + ), assertions = AssertionTemplates.DESKTOP_MODE_APP_VISIBILITY_ASSERTIONS + listOf( diff --git a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt index c77413b6a55a..8c15dc935f0b 100644 --- a/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt +++ b/tests/FlickerTests/test-apps/app-helpers/src/com/android/server/wm/flicker/helpers/DesktopModeAppHelper.kt @@ -280,7 +280,11 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) : val displayRect = getDisplayRect(wmHelper) - val endX = if (isLeft) displayRect.left else displayRect.right + val endX = if (isLeft) { + displayRect.left + SNAP_RESIZE_DRAG_INSET + } else { + displayRect.right - SNAP_RESIZE_DRAG_INSET + } val endY = displayRect.centerY() / 2 // drag the window to snap resize @@ -386,6 +390,7 @@ open class DesktopModeAppHelper(private val innerHelper: IStandardAppHelper) : private companion object { val TIMEOUT: Duration = Duration.ofSeconds(3) + const val SNAP_RESIZE_DRAG_INSET: Int = 5 // inset to avoid dragging to display edge const val CAPTION: String = "desktop_mode_caption" const val MAXIMIZE_BUTTON_VIEW: String = "maximize_button_view" const val MAXIMIZE_MENU: String = "maximize_menu" -- GitLab From 4f2392c67ba6b907dc417fdfdb0d0eecd4ded3ec Mon Sep 17 00:00:00 2001 From: Pablo Gamito Date: Tue, 22 Oct 2024 09:00:34 +0000 Subject: [PATCH 193/459] Fallback to a NoOp ProtoLogImpl when viewer config is missing Bug: 374125888 Flag: EXEMPT bug fix Test: atest BubblePositionerTest Test: atest com.android.internal.protolog.ProtoLogViewerConfigReaderTest#viewerConfigIsOnDevice Change-Id: I4c4a9a3ac059a12591f8a57ecfa277a2b8180a35 --- .../protolog/NoViewerConfigProtoLogImpl.java | 90 +++++++++++++++++++ .../internal/protolog/ProtoLogImpl.java | 18 ++-- .../ProtoLogViewerConfigReaderTest.java | 31 +++++++ 3 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java diff --git a/core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java b/core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java new file mode 100644 index 000000000000..1598766412dd --- /dev/null +++ b/core/java/com/android/internal/protolog/NoViewerConfigProtoLogImpl.java @@ -0,0 +1,90 @@ +/* + * 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.internal.protolog; + +import android.text.TextUtils; +import android.util.Log; + +import com.android.internal.protolog.common.ILogger; +import com.android.internal.protolog.common.IProtoLog; +import com.android.internal.protolog.common.IProtoLogGroup; +import com.android.internal.protolog.common.LogLevel; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Class should only be used as a temporary solution to missing viewer config file on device. + * In particular this class should only be initialized in Robolectric tests, if it's being used + * otherwise please report it. + * + * @deprecated + */ +@Deprecated +public class NoViewerConfigProtoLogImpl implements IProtoLog { + private static final String LOG_TAG = "ProtoLog"; + + @Override + public void log(LogLevel logLevel, IProtoLogGroup group, long messageHash, int paramsMask, + Object[] args) { + Log.w(LOG_TAG, "ProtoLogging is not available due to missing viewer config file..."); + logMessage(logLevel, group.getTag(), "PROTOLOG#" + messageHash + "(" + + Arrays.stream(args).map(Object::toString).collect(Collectors.joining()) + ")"); + } + + @Override + public void log(LogLevel logLevel, IProtoLogGroup group, String messageString, Object... args) { + logMessage(logLevel, group.getTag(), TextUtils.formatSimple(messageString, args)); + } + + @Override + public boolean isProtoEnabled() { + return false; + } + + @Override + public int startLoggingToLogcat(String[] groups, ILogger logger) { + return 0; + } + + @Override + public int stopLoggingToLogcat(String[] groups, ILogger logger) { + return 0; + } + + @Override + public boolean isEnabled(IProtoLogGroup group, LogLevel level) { + return false; + } + + @Override + public List getRegisteredGroups() { + return List.of(); + } + + private void logMessage(LogLevel logLevel, String tag, String message) { + switch (logLevel) { + case VERBOSE -> Log.v(tag, message); + case INFO -> Log.i(tag, message); + case DEBUG -> Log.d(tag, message); + case WARN -> Log.w(tag, message); + case ERROR -> Log.e(tag, message); + case WTF -> Log.wtf(tag, message); + } + } +} diff --git a/core/java/com/android/internal/protolog/ProtoLogImpl.java b/core/java/com/android/internal/protolog/ProtoLogImpl.java index 43fce5d281ec..3378d08e7761 100644 --- a/core/java/com/android/internal/protolog/ProtoLogImpl.java +++ b/core/java/com/android/internal/protolog/ProtoLogImpl.java @@ -106,7 +106,7 @@ public class ProtoLogImpl { final var groups = sLogGroups.values().toArray(new IProtoLogGroup[0]); if (android.tracing.Flags.perfettoProtologTracing()) { - sServiceInstance = createPerfettoProtoLogImpl(groups); + sServiceInstance = createProtoLogImpl(groups); } else { sServiceInstance = createLegacyProtoLogImpl(groups); } @@ -116,18 +116,18 @@ public class ProtoLogImpl { return sServiceInstance; } - private static PerfettoProtoLogImpl createPerfettoProtoLogImpl(IProtoLogGroup[] groups) { + private static IProtoLog createProtoLogImpl(IProtoLogGroup[] groups) { try { File f = new File(sViewerConfigPath); - if (!ProtoLog.REQUIRE_PROTOLOGTOOL && !f.exists()) { + if (!f.exists()) { // TODO(b/353530422): Remove - temporary fix to unblock b/352290057 - // In some tests the viewer config file might not exist in which we don't - // want to provide config path to the user - Log.w(LOG_TAG, "Failed to find viewerConfigFile when setting up " - + ProtoLogImpl.class.getSimpleName() + ". " - + "Setting up without a viewer config instead..."); + // In robolectric tests the viewer config file isn't current available, so we cannot + // use the ProcessedPerfettoProtoLogImpl. + Log.e(LOG_TAG, "Failed to find viewer config file " + sViewerConfigPath + + " when setting up " + ProtoLogImpl.class.getSimpleName() + ". " + + "ProtoLog will not work here!"); - return new UnprocessedPerfettoProtoLogImpl(sCacheUpdater, groups); + return new NoViewerConfigProtoLogImpl(); } else { return new ProcessedPerfettoProtoLogImpl(sViewerConfigPath, sCacheUpdater, groups); } diff --git a/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java b/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java index 3d6be7753c42..9e029a8d5e57 100644 --- a/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java +++ b/tests/Tracing/src/com/android/internal/protolog/ProtoLogViewerConfigReaderTest.java @@ -19,8 +19,12 @@ package com.android.internal.protolog; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; +import android.os.Build; import android.platform.test.annotations.Presubmit; +import com.google.common.truth.Truth; + +import org.junit.Assume; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -28,6 +32,8 @@ import org.junit.runners.JUnit4; import perfetto.protos.ProtologCommon; +import java.io.File; + @Presubmit @RunWith(JUnit4.class) public class ProtoLogViewerConfigReaderTest { @@ -121,6 +127,31 @@ public class ProtoLogViewerConfigReaderTest { assertNull(mConfig.getViewerString(5)); } + @Test + public void viewerConfigIsOnDevice() { + Assume.assumeFalse(Build.FINGERPRINT.contains("robolectric")); + + final String[] viewerConfigPaths; + if (android.tracing.Flags.perfettoProtologTracing()) { + viewerConfigPaths = new String[] { + "/system_ext/etc/wmshell.protolog.pb", + "/system/etc/core.protolog.pb", + }; + } else { + viewerConfigPaths = new String[] { + "/system_ext/etc/wmshell.protolog.json.gz", + "/system/etc/protolog.conf.json.gz", + }; + } + + for (final var viewerConfigPath : viewerConfigPaths) { + File f = new File(viewerConfigPath); + + Truth.assertWithMessage(f.getAbsolutePath() + " exists").that(f.exists()).isTrue(); + } + + } + @Test public void loadUnloadAndReloadViewerConfig() { loadViewerConfig(); -- GitLab From fe7080e363bb276a2153741c56341980a03929d8 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Fri, 18 Oct 2024 18:42:40 +0200 Subject: [PATCH 194/459] Make NotificationActivityStarter params non-nullable I added checks a few weeks ago that would've notified us if there was something wrong, and since no issues popped up it's safe to make this change. NotificationGutsManagerWithScenesTest was failing with this change, so I took the opportunity to clean it up and make it use mockito-kotlin. Fix: 369599778 Test: builds, existing tests pass Flag: EXEMPT trivial change that has been verified to be safe Change-Id: I2640196d4af1e709a54c3f54e21c886736f063a0 --- .../NotificationActivityStarter.kt | 8 +- .../StatusBarNotificationActivityStarter.java | 18 +- .../NotificationGutsManagerWithScenesTest.kt | 356 ++++++++---------- 3 files changed, 157 insertions(+), 225 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt index 231a0b0b21cb..9fe4a5499ceb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationActivityStarter.kt @@ -32,13 +32,13 @@ import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow interface NotificationActivityStarter { /** Called when the user clicks on the notification bubble icon. */ - fun onNotificationBubbleIconClicked(entry: NotificationEntry?) + fun onNotificationBubbleIconClicked(entry: NotificationEntry) /** Called when the user clicks on the surface of a notification. */ - fun onNotificationClicked(entry: NotificationEntry?, row: ExpandableNotificationRow?) + fun onNotificationClicked(entry: NotificationEntry, row: ExpandableNotificationRow) /** Called when the user clicks on a button in the notification guts which fires an intent. */ - fun startNotificationGutsIntent(intent: Intent?, appUid: Int, row: ExpandableNotificationRow?) + fun startNotificationGutsIntent(intent: Intent, appUid: Int, row: ExpandableNotificationRow) /** * Called when the user clicks "Manage" or "History" in the Shade. Prefer using @@ -56,7 +56,7 @@ interface NotificationActivityStarter { fun startSettingsIntent(view: View, intentInfo: SettingsIntent) /** Called when the user succeed to drop notification to proper target view. */ - fun onDragSuccess(entry: NotificationEntry?) + fun onDragSuccess(entry: NotificationEntry) val isCollapsingToShowActivityOverLockscreen: Boolean get() = false diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java index 93db2db918b0..af98311c937f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarter.java @@ -20,7 +20,6 @@ import static android.app.ActivityOptions.MODE_BACKGROUND_ACTIVITY_START_ALLOWED import static android.service.notification.NotificationListenerService.REASON_CLICK; import static com.android.systemui.statusbar.phone.CentralSurfaces.getActivityOptions; -import static com.android.systemui.util.kotlin.NullabilityKt.expectNotNull; import android.app.ActivityManager; import android.app.ActivityOptions; @@ -231,8 +230,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit * @param entry notification that bubble icon was clicked */ @Override - public void onNotificationBubbleIconClicked(NotificationEntry entry) { - expectNotNull(TAG, "entry", entry); + public void onNotificationBubbleIconClicked(@NonNull NotificationEntry entry) { Runnable action = () -> { mBubblesManagerOptional.ifPresent(bubblesManager -> bubblesManager.onUserChangedBubble(entry, !entry.isBubble())); @@ -258,9 +256,8 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit * @param row row for that notification */ @Override - public void onNotificationClicked(NotificationEntry entry, ExpandableNotificationRow row) { - expectNotNull(TAG, "entry", entry); - expectNotNull(TAG, "row", row); + public void onNotificationClicked(@NonNull NotificationEntry entry, + @NonNull ExpandableNotificationRow row) { mLogger.logStartingActivityFromClick(entry, row.isHeadsUpState(), mKeyguardStateController.isVisible(), mNotificationShadeWindowController.getPanelExpanded()); @@ -442,8 +439,7 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit * @param entry notification entry that is dropped. */ @Override - public void onDragSuccess(NotificationEntry entry) { - expectNotNull(TAG, "entry", entry); + public void onDragSuccess(@NonNull NotificationEntry entry) { // this method is not responsible for intent sending. // will focus follow operation only after drag-and-drop that notification. final NotificationVisibility nv = mVisibilityProvider.obtain(entry, true); @@ -534,10 +530,8 @@ public class StatusBarNotificationActivityStarter implements NotificationActivit } @Override - public void startNotificationGutsIntent(final Intent intent, final int appUid, - ExpandableNotificationRow row) { - expectNotNull(TAG, "intent", intent); - expectNotNull(TAG, "row", row); + public void startNotificationGutsIntent(@NonNull final Intent intent, final int appUid, + @NonNull ExpandableNotificationRow row) { boolean animate = mActivityStarter.shouldAnimateLaunch(true /* isActivityIntent */); ActivityStarter.OnDismissAction onDismissAction = new ActivityStarter.OnDismissAction() { @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt index 0b5f8d5e948c..723c0d701305 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationGutsManagerWithScenesTest.kt @@ -74,22 +74,31 @@ import com.android.systemui.testKosmos import com.android.systemui.util.kotlin.JavaAdapter import com.android.systemui.wmshell.BubblesManager import java.util.Optional -import junit.framework.Assert import kotlin.test.assertEquals +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.test.runCurrent +import org.junit.Assert import org.junit.Before import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentCaptor -import org.mockito.ArgumentMatchers import org.mockito.Mock -import org.mockito.Mockito -import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.mockito.invocation.InvocationOnMock +import org.mockito.kotlin.any +import org.mockito.kotlin.anyOrNull +import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.doNothing +import org.mockito.kotlin.eq +import org.mockito.kotlin.mock +import org.mockito.kotlin.never +import org.mockito.kotlin.spy +import org.mockito.kotlin.times +import org.mockito.kotlin.verify +import org.mockito.kotlin.whenever /** Tests for [NotificationGutsManager] with the scene container enabled. */ +@OptIn(ExperimentalCoroutinesApi::class) @SmallTest @RunWith(AndroidJUnit4::class) @RunWithLooper @@ -99,7 +108,7 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { NotificationChannel( TEST_CHANNEL_ID, TEST_CHANNEL_ID, - NotificationManager.IMPORTANCE_DEFAULT + NotificationManager.IMPORTANCE_DEFAULT, ) private val kosmos = testKosmos() @@ -146,7 +155,7 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) allowTestableLooperAsMainThread() helper = NotificationTestHelper(mContext, mDependency) - Mockito.`when`(accessibilityManager.isTouchExplorationEnabled).thenReturn(false) + whenever(accessibilityManager.isTouchExplorationEnabled).thenReturn(false) windowRootViewVisibilityInteractor = WindowRootViewVisibilityInteractor( testScope.backgroundScope, @@ -185,12 +194,12 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { deviceProvisionedController, metricsLogger, headsUpManager, - activityStarter + activityStarter, ) gutsManager.setUpWithPresenter( presenter, notificationListContainer, - onSettingsClickListener + onSettingsClickListener, ) gutsManager.setNotificationActivityStarter(notificationActivityStarter) gutsManager.start() @@ -198,49 +207,31 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { @Test fun testOpenAndCloseGuts() { - val guts = Mockito.spy(NotificationGuts(mContext)) - Mockito.`when`(guts.post(ArgumentMatchers.any())).thenAnswer { invocation: InvocationOnMock - -> + val guts = spy(NotificationGuts(mContext)) + whenever(guts.post(any())).thenAnswer { invocation: InvocationOnMock -> handler.post((invocation.arguments[0] as Runnable)) null } // Test doesn't support animation since the guts view is not attached. - Mockito.doNothing() - .`when`(guts) - .openControls( - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.any(Runnable::class.java) - ) + doNothing() + .whenever(guts) + .openControls(any(), any(), any(), any()) val realRow = createTestNotificationRow() val menuItem = createTestMenuItem(realRow) - val row = Mockito.spy(realRow) - Mockito.`when`(row!!.windowToken).thenReturn(Binder()) - Mockito.`when`(row.guts).thenReturn(guts) + val row = spy(realRow) + whenever(row!!.windowToken).thenReturn(Binder()) + whenever(row.guts).thenReturn(guts) Assert.assertTrue(gutsManager.openGutsInternal(row, 0, 0, menuItem)) assertEquals(View.INVISIBLE.toLong(), guts.visibility.toLong()) executor.runAllReady() - verify(guts) - .openControls( - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.any(Runnable::class.java) - ) + verify(guts).openControls(any(), any(), any(), any()) verify(headsUpManager).setGutsShown(realRow!!.entry, true) assertEquals(View.VISIBLE.toLong(), guts.visibility.toLong()) gutsManager.closeAndSaveGuts(false, false, true, 0, 0, false) verify(guts) - .closeControls( - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean() - ) - verify(row, Mockito.times(1)).setGutsView(ArgumentMatchers.any()) + .closeControls(any(), any(), any(), any(), any()) + verify(row, times(1)).setGutsView(any()) executor.runAllReady() verify(headsUpManager).setGutsShown(realRow.entry, false) } @@ -250,7 +241,7 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { // First, start out lockscreen or shade as not visible setIsLockscreenOrShadeVisible(false) testScope.testScheduler.runCurrent() - val guts = Mockito.mock(NotificationGuts::class.java) + val guts = mock() gutsManager.exposedGuts = guts // WHEN the lockscreen or shade becomes visible @@ -258,15 +249,9 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { testScope.testScheduler.runCurrent() // THEN the guts are not closed - verify(guts, Mockito.never()).removeCallbacks(ArgumentMatchers.any()) - verify(guts, Mockito.never()) - .closeControls( - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean() - ) + verify(guts, never()).removeCallbacks(any()) + verify(guts, never()) + .closeControls(any(), any(), any(), any(), any()) } @Test @@ -274,7 +259,7 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { // First, start out lockscreen or shade as visible setIsLockscreenOrShadeVisible(true) testScope.testScheduler.runCurrent() - val guts = Mockito.mock(NotificationGuts::class.java) + val guts = mock() gutsManager.exposedGuts = guts // WHEN the lockscreen or shade is no longer visible @@ -282,14 +267,14 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { testScope.testScheduler.runCurrent() // THEN the guts are closed - verify(guts).removeCallbacks(ArgumentMatchers.any()) + verify(guts).removeCallbacks(anyOrNull()) verify(guts) .closeControls( - /* leavebehinds= */ ArgumentMatchers.eq(true), - /* controls= */ ArgumentMatchers.eq(true), - /* x= */ ArgumentMatchers.anyInt(), - /* y= */ ArgumentMatchers.anyInt(), - /* force= */ ArgumentMatchers.eq(true) + /* leavebehinds= */ eq(true), + /* controls= */ eq(true), + /* x= */ any(), + /* y= */ any(), + /* force= */ eq(true), ) } @@ -304,95 +289,68 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { testScope.testScheduler.runCurrent() // THEN the list container is reset - verify(notificationListContainer) - .resetExposedMenuView(ArgumentMatchers.anyBoolean(), ArgumentMatchers.anyBoolean()) + verify(notificationListContainer).resetExposedMenuView(any(), any()) } @Test fun testChangeDensityOrFontScale() { - val guts = Mockito.spy(NotificationGuts(mContext)) - Mockito.`when`(guts.post(ArgumentMatchers.any())).thenAnswer { invocation: InvocationOnMock - -> + val guts = spy(NotificationGuts(mContext)) + whenever(guts.post(any())).thenAnswer { invocation: InvocationOnMock -> handler.post((invocation.arguments[0] as Runnable)) null } // Test doesn't support animation since the guts view is not attached. - Mockito.doNothing() - .`when`(guts) - .openControls( - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.any(Runnable::class.java) - ) + doNothing() + .whenever(guts) + .openControls(any(), any(), any(), any()) val realRow = createTestNotificationRow() val menuItem = createTestMenuItem(realRow) - val row = Mockito.spy(realRow) - Mockito.`when`(row!!.windowToken).thenReturn(Binder()) - Mockito.`when`(row.guts).thenReturn(guts) - Mockito.doNothing().`when`(row).ensureGutsInflated() + val row = spy(realRow) + whenever(row!!.windowToken).thenReturn(Binder()) + whenever(row.guts).thenReturn(guts) + doNothing().whenever(row).ensureGutsInflated() val realEntry = realRow!!.entry - val entry = Mockito.spy(realEntry) - Mockito.`when`(entry.row).thenReturn(row) - Mockito.`when`(entry.getGuts()).thenReturn(guts) + val entry = spy(realEntry) + whenever(entry.row).thenReturn(row) + whenever(entry.getGuts()).thenReturn(guts) Assert.assertTrue(gutsManager.openGutsInternal(row, 0, 0, menuItem)) executor.runAllReady() - verify(guts) - .openControls( - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.any(Runnable::class.java) - ) + verify(guts).openControls(any(), any(), any(), any()) // called once by mGutsManager.bindGuts() in mGutsManager.openGuts() - verify(row).setGutsView(ArgumentMatchers.any()) + verify(row).setGutsView(any()) row.onDensityOrFontScaleChanged() gutsManager.onDensityOrFontScaleChanged(entry) executor.runAllReady() gutsManager.closeAndSaveGuts(false, false, false, 0, 0, false) verify(guts) - .closeControls( - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyBoolean(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.anyBoolean() - ) + .closeControls(any(), any(), any(), any(), any()) // called again by mGutsManager.bindGuts(), in mGutsManager.onDensityOrFontScaleChanged() - verify(row, Mockito.times(2)).setGutsView(ArgumentMatchers.any()) + verify(row, times(2)).setGutsView(any()) } @Test fun testAppOpsSettingsIntent_camera() { val ops = ArraySet() ops.add(AppOpsManager.OP_CAMERA) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.lastValue.action) } @Test fun testAppOpsSettingsIntent_mic() { val ops = ArraySet() ops.add(AppOpsManager.OP_RECORD_AUDIO) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.lastValue.action) } @Test @@ -400,30 +358,22 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { val ops = ArraySet() ops.add(AppOpsManager.OP_CAMERA) ops.add(AppOpsManager.OP_RECORD_AUDIO) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Intent.ACTION_MANAGE_APP_PERMISSIONS, captor.lastValue.action) } @Test fun testAppOpsSettingsIntent_overlay() { val ops = ArraySet() ops.add(AppOpsManager.OP_SYSTEM_ALERT_WINDOW) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Settings.ACTION_MANAGE_APP_OVERLAY_PERMISSION, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Settings.ACTION_MANAGE_APP_OVERLAY_PERMISSION, captor.lastValue.action) } @Test @@ -432,15 +382,11 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { ops.add(AppOpsManager.OP_CAMERA) ops.add(AppOpsManager.OP_RECORD_AUDIO) ops.add(AppOpsManager.OP_SYSTEM_ALERT_WINDOW) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.lastValue.action) } @Test @@ -448,15 +394,11 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { val ops = ArraySet() ops.add(AppOpsManager.OP_CAMERA) ops.add(AppOpsManager.OP_SYSTEM_ALERT_WINDOW) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.lastValue.action) } @Test @@ -464,112 +406,108 @@ class NotificationGutsManagerWithScenesTest : SysuiTestCase() { val ops = ArraySet() ops.add(AppOpsManager.OP_RECORD_AUDIO) ops.add(AppOpsManager.OP_SYSTEM_ALERT_WINDOW) - gutsManager.startAppOpsSettingsActivity("", 0, ops, null) - val captor = ArgumentCaptor.forClass(Intent::class.java) - verify(notificationActivityStarter, Mockito.times(1)) - .startNotificationGutsIntent( - captor.capture(), - ArgumentMatchers.anyInt(), - ArgumentMatchers.any() - ) - assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.value.action) + gutsManager.startAppOpsSettingsActivity("", 0, ops, mock()) + val captor = argumentCaptor() + verify(notificationActivityStarter, times(1)) + .startNotificationGutsIntent(captor.capture(), any(), any()) + assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, captor.lastValue.action) } @Test @Throws(Exception::class) fun testInitializeNotificationInfoView_highPriority() { - val notificationInfoView = Mockito.mock(NotificationInfo::class.java) - val row = Mockito.spy(helper.createRow()) + val notificationInfoView = mock() + val row = spy(helper.createRow()) val entry = row.entry NotificationEntryHelper.modifyRanking(entry) .setUserSentiment(Ranking.USER_SENTIMENT_NEGATIVE) .setImportance(NotificationManager.IMPORTANCE_HIGH) .build() - Mockito.`when`(row.getIsNonblockable()).thenReturn(false) - Mockito.`when`(highPriorityProvider.isHighPriority(entry)).thenReturn(true) + whenever(row.getIsNonblockable()).thenReturn(false) + whenever(highPriorityProvider.isHighPriority(entry)).thenReturn(true) val statusBarNotification = entry.sbn gutsManager.initializeNotificationInfo(row, notificationInfoView) verify(notificationInfoView) .bindNotification( - ArgumentMatchers.any(PackageManager::class.java), - ArgumentMatchers.any(INotificationManager::class.java), - ArgumentMatchers.eq(onUserInteractionCallback), - ArgumentMatchers.eq(channelEditorDialogController), - ArgumentMatchers.eq(statusBarNotification.packageName), - ArgumentMatchers.any(NotificationChannel::class.java), - ArgumentMatchers.eq(entry), - ArgumentMatchers.any(NotificationInfo.OnSettingsClickListener::class.java), - ArgumentMatchers.any(NotificationInfo.OnAppSettingsClickListener::class.java), - ArgumentMatchers.any(UiEventLogger::class.java), - ArgumentMatchers.eq(true), - ArgumentMatchers.eq(false), - ArgumentMatchers.eq(true), /* wasShownHighPriority */ - ArgumentMatchers.eq(assistantFeedbackController), - ArgumentMatchers.any(MetricsLogger::class.java) + any(), + any(), + eq(onUserInteractionCallback), + eq(channelEditorDialogController), + eq(statusBarNotification.packageName), + any(), + eq(entry), + any(), + any(), + any(), + eq(true), + eq(false), + eq(true), /* wasShownHighPriority */ + eq(assistantFeedbackController), + any(), ) } @Test @Throws(Exception::class) fun testInitializeNotificationInfoView_PassesAlongProvisionedState() { - val notificationInfoView = Mockito.mock(NotificationInfo::class.java) - val row = Mockito.spy(helper.createRow()) + val notificationInfoView = mock() + val row = spy(helper.createRow()) NotificationEntryHelper.modifyRanking(row.entry) .setUserSentiment(Ranking.USER_SENTIMENT_NEGATIVE) .build() - Mockito.`when`(row.getIsNonblockable()).thenReturn(false) + whenever(row.getIsNonblockable()).thenReturn(false) val statusBarNotification = row.entry.sbn val entry = row.entry gutsManager.initializeNotificationInfo(row, notificationInfoView) verify(notificationInfoView) .bindNotification( - ArgumentMatchers.any(PackageManager::class.java), - ArgumentMatchers.any(INotificationManager::class.java), - ArgumentMatchers.eq(onUserInteractionCallback), - ArgumentMatchers.eq(channelEditorDialogController), - ArgumentMatchers.eq(statusBarNotification.packageName), - ArgumentMatchers.any(NotificationChannel::class.java), - ArgumentMatchers.eq(entry), - ArgumentMatchers.any(NotificationInfo.OnSettingsClickListener::class.java), - ArgumentMatchers.any(NotificationInfo.OnAppSettingsClickListener::class.java), - ArgumentMatchers.any(UiEventLogger::class.java), - ArgumentMatchers.eq(true), - ArgumentMatchers.eq(false), - ArgumentMatchers.eq(false), /* wasShownHighPriority */ - ArgumentMatchers.eq(assistantFeedbackController), - ArgumentMatchers.any(MetricsLogger::class.java) + any(), + any(), + eq(onUserInteractionCallback), + eq(channelEditorDialogController), + eq(statusBarNotification.packageName), + any(), + eq(entry), + any(), + any(), + any(), + eq(true), + eq(false), + eq(false), /* wasShownHighPriority */ + eq(assistantFeedbackController), + any(), ) } @Test @Throws(Exception::class) fun testInitializeNotificationInfoView_withInitialAction() { - val notificationInfoView = Mockito.mock(NotificationInfo::class.java) - val row = Mockito.spy(helper.createRow()) + val notificationInfoView = mock() + val row = spy(helper.createRow()) NotificationEntryHelper.modifyRanking(row.entry) .setUserSentiment(Ranking.USER_SENTIMENT_NEGATIVE) .build() - Mockito.`when`(row.getIsNonblockable()).thenReturn(false) + whenever(row.getIsNonblockable()).thenReturn(false) val statusBarNotification = row.entry.sbn val entry = row.entry gutsManager.initializeNotificationInfo(row, notificationInfoView) verify(notificationInfoView) .bindNotification( - ArgumentMatchers.any(PackageManager::class.java), - ArgumentMatchers.any(INotificationManager::class.java), - ArgumentMatchers.eq(onUserInteractionCallback), - ArgumentMatchers.eq(channelEditorDialogController), - ArgumentMatchers.eq(statusBarNotification.packageName), - ArgumentMatchers.any(NotificationChannel::class.java), - ArgumentMatchers.eq(entry), - ArgumentMatchers.any(NotificationInfo.OnSettingsClickListener::class.java), - ArgumentMatchers.any(NotificationInfo.OnAppSettingsClickListener::class.java), - ArgumentMatchers.any(UiEventLogger::class.java), - ArgumentMatchers.eq(true), - ArgumentMatchers.eq(false), - ArgumentMatchers.eq(false), /* wasShownHighPriority */ - ArgumentMatchers.eq(assistantFeedbackController), - ArgumentMatchers.any(MetricsLogger::class.java) + any(), + any(), + eq(onUserInteractionCallback), + eq(channelEditorDialogController), + eq(statusBarNotification.packageName), + any(), + eq(entry), + any(), + any(), + any(), + eq(true), + eq(false), + eq(false), /* wasShownHighPriority */ + eq(assistantFeedbackController), + any(), ) } -- GitLab From 090a645487ed1bd7533705d2edab7bd2dc3c91b1 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 22 Oct 2024 11:35:04 +0000 Subject: [PATCH 195/459] Moved keyboard settings string to resource file Fix: 374866704 Flag: com.android.systemui.keyboard_shortcut_helper_rewrite Test: check that the string on keyboard settings button in shortcut helper is translated in other locales Change-Id: Iec7458c61340a78bbbbff886ceea9dd0036932cb --- packages/SystemUI/res/values/strings.xml | 4 ++++ .../keyboard/shortcut/ui/composable/ShortcutHelper.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index 2c5fb5667db7..9e95e4c7f1da 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -3745,6 +3745,10 @@ use. The helper shows shortcuts in categories, which can be collapsed or expanded. [CHAR LIMIT=NONE] --> Drag handle + + Keyboard Settings diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt index 3c8bb09ddc09..eb87c280c1dd 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/ShortcutHelper.kt @@ -833,7 +833,7 @@ private fun KeyboardSettings(horizontalPadding: Dp, verticalPadding: Dp, onClick ) { Row(verticalAlignment = Alignment.CenterVertically) { Text( - "Keyboard Settings", + stringResource(id = R.string.shortcut_helper_keyboard_settings_buttons_label), color = MaterialTheme.colorScheme.onSurfaceVariant, fontSize = 16.sp, ) -- GitLab From 4b054b7d05829baf2e67be331f8f848cb73ad18b Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Tue, 22 Oct 2024 11:41:41 +0000 Subject: [PATCH 196/459] Introduce ShadeDisplayAwareModule This binds context, resources and layout inflater specific to the shade window. A copy of the context is created (only when the new flag is enabled. Those elements will be used in follow up cls. Bug: 362719719 Bug: 374267505 Test: Presubmits - just introducing a flag guarded module not yet used Flag: com.android.systemui.shade_window_goes_around Change-Id: I0c83c3c36168a189f45e8d2ad7288d87e7d5e796 --- packages/SystemUI/aconfig/systemui.aconfig | 7 ++ .../systemui/shade/ShadeDisplayAwareModule.kt | 71 +++++++++++++++++++ .../com/android/systemui/shade/ShadeModule.kt | 5 +- 3 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 426b24dfe070..2cbc2adc0ab7 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1521,6 +1521,13 @@ flag { } } +flag { + name: "shade_window_goes_around" + namespace: "systemui" + description: "Enables the shade window to move between displays" + bug: "362719719" +} + flag { name: "media_projection_request_attribution_fix" namespace: "systemui" diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt new file mode 100644 index 000000000000..c72db56a822f --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt @@ -0,0 +1,71 @@ +/* + * 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.shade + +import android.content.Context +import android.content.res.Resources +import android.view.LayoutInflater +import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY +import com.android.systemui.Flags +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.res.R +import dagger.Module +import dagger.Provides + +/** + * Module responsible for managing display-specific components and resources for the notification + * shade window. + * + * This isolation is crucial because when the window transitions between displays, its associated + * context, resources, and display characteristics (like density and size) also change. If the shade + * window shared the same context as the rest of the system UI, it could lead to inconsistencies and + * errors due to incorrect display information. + * + * By using this dedicated module, we ensure the notification shade window always utilizes the + * correct display context and resources, regardless of the display it's on. + */ +@Module +object ShadeDisplayAwareModule { + + /** Creates a new context for the shade window. */ + @Provides + @ShadeDisplayAware + @SysUISingleton + fun provideShadeDisplayAwareContext(context: Context): Context { + return if (Flags.shadeWindowGoesAround()) { + context + .createWindowContext(context.display, TYPE_APPLICATION_OVERLAY, /* options= */ null) + .apply { setTheme(R.style.Theme_SystemUI) } + } else { + context + } + } + + @Provides + @ShadeDisplayAware + @SysUISingleton + fun provideShadeDisplayAwareResources(@ShadeDisplayAware context: Context): Resources { + return context.resources + } + + @Provides + @ShadeDisplayAware + @SysUISingleton + fun providesDisplayAwareLayoutInflater(@ShadeDisplayAware context: Context): LayoutInflater { + return LayoutInflater.from(context) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index 2348a110eb3a..6f5547a62472 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -49,7 +49,10 @@ import dagger.Provides import javax.inject.Provider /** Module for classes related to the notification shade. */ -@Module(includes = [StartShadeModule::class, ShadeViewProviderModule::class]) +@Module( + includes = + [StartShadeModule::class, ShadeViewProviderModule::class, ShadeDisplayAwareModule::class] +) abstract class ShadeModule { companion object { @Provides -- GitLab From 80d63f34f8edb5390d24708b7d139420c8c97475 Mon Sep 17 00:00:00 2001 From: omarmt Date: Tue, 22 Oct 2024 09:58:16 +0000 Subject: [PATCH 197/459] STL onStop remove dragController if needed Fixes a bug introduced with ag/29700349. This caused a crash (see ag/29996646) and for this reason it has been reverted. During onStop(), if a new drag controller appears, it signals the start of a new gesture, so you can keep the new drag controller in place. Test: atest DraggableHandlerTest Bug: 370949877 Flag: com.android.systemui.scene_container Change-Id: I84f108ba7130c80c844349f0ea7280bf755a62cf --- .../animation/scene/DraggableHandler.kt | 7 ++++- .../animation/scene/DraggableHandlerTest.kt | 28 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) 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 f0742df4411d..8469007eddb6 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 @@ -743,7 +743,12 @@ internal class NestedScrollHandlerImpl( .onStop(velocity = velocityAvailable, canChangeContent = canChangeScene) .invoke() } finally { - dragController = null + // onStop might still be running when a new gesture begins. + // To prevent conflicts, we should only remove the drag controller if it's the + // same one that was active initially. + if (dragController == controller) { + dragController = null + } } }, onCancel = { 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 72a71ddddfca..f24d93f0d79d 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 @@ -848,6 +848,34 @@ class DraggableHandlerTest { assertIdle(SceneB) } + @Test + fun duringATransition_aNewScrollGesture_shouldTakeControl() = runGestureTest { + val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeWithPreview) + // First gesture + nestedScroll.scroll(available = downOffset(fractionOfScreen = 0.1f)) + assertTransition(currentScene = SceneA) + nestedScroll.preFling(available = Velocity.Zero) + assertTransition(currentScene = SceneA) + + // Second gesture, it starts during onStop() animation + nestedScroll.scroll(downOffset(0.1f)) + assertTransition(currentScene = SceneA) + + // Allows onStop() to complete or cancel + advanceUntilIdle() + + // Second gesture continues + nestedScroll.scroll(downOffset(0.1f)) + assertTransition(currentScene = SceneA) + + // Second gesture ends + nestedScroll.preFling(available = Velocity.Zero) + assertTransition(currentScene = SceneA) + + advanceUntilIdle() + assertIdle(currentScene = SceneA) + } + @Test fun onPreFling_velocityLowerThanThreshold_remainSameScene() = runGestureTest { val nestedScroll = nestedScrollConnection(nestedScrollBehavior = EdgeWithPreview) -- GitLab From 25908d56fa3bb5d03d03117745ef8c79de6063ef Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Mon, 21 Oct 2024 17:00:06 +0000 Subject: [PATCH 198/459] Remove ringer repository This CL removes the repository for now since it is obsolete. It will be added back when we add more fields or methods for logging. Flag: com.android.systemui.volume_redesign Bug: 369993851 Test: Build. Run presubmits. Change-Id: Idf620723c88a11914164e6bfe005f74bef72188d --- .../data/VolumeDialogRingerRepository.kt | 37 ------------------- .../domain/VolumeDialogRingerInteractor.kt | 18 ++++----- .../VolumeDialogRingerRepositoryKosmos.kt | 21 ----------- .../VolumeDialogRingerInteractorKosmos.kt | 2 - 4 files changed, 7 insertions(+), 71 deletions(-) delete mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt deleted file mode 100644 index 73b97f642ec9..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepository.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * 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.volume.dialog.ringer.data - -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel -import javax.inject.Inject -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.flow.update - -/** Stores the state of volume dialog ringer model */ -@SysUISingleton -class VolumeDialogRingerRepository @Inject constructor() { - - private val mutableRingerModel = MutableStateFlow(null) - val ringerModel: Flow = mutableRingerModel.filterNotNull() - - fun updateRingerModel(update: (current: VolumeDialogRingerModel?) -> VolumeDialogRingerModel) { - mutableRingerModel.update(update) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt index 5562ea98c073..7265b82148ba 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractor.kt @@ -25,15 +25,15 @@ import com.android.settingslib.volume.shared.model.RingerMode import com.android.systemui.plugins.VolumeDialogController import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog import com.android.systemui.volume.dialog.domain.interactor.VolumeDialogStateInteractor -import com.android.systemui.volume.dialog.ringer.data.VolumeDialogRingerRepository import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel import com.android.systemui.volume.dialog.shared.model.VolumeDialogStateModel import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.mapNotNull -import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.stateIn /** Exposes [VolumeDialogRingerModel]. */ @VolumeDialog @@ -43,17 +43,13 @@ constructor( @VolumeDialog private val coroutineScope: CoroutineScope, volumeDialogStateInteractor: VolumeDialogStateInteractor, private val controller: VolumeDialogController, - private val repository: VolumeDialogRingerRepository, ) { - val ringerModel: Flow = repository.ringerModel - - init { + val ringerModel: Flow = volumeDialogStateInteractor.volumeDialogState - .mapNotNull { state -> toRingerModel(state) } - .onEach { ringerModel -> repository.updateRingerModel { ringerModel } } - .launchIn(coroutineScope) - } + .mapNotNull { toRingerModel(it) } + .stateIn(coroutineScope, SharingStarted.Eagerly, null) + .filterNotNull() private fun toRingerModel(state: VolumeDialogStateModel): VolumeDialogRingerModel? { return state.streamModels[AudioManager.STREAM_RING]?.let { diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt deleted file mode 100644 index 2c518863cf3c..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/data/VolumeDialogRingerRepositoryKosmos.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * 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.volume.dialog.ringer.data - -import com.android.systemui.kosmos.Kosmos - -val Kosmos.volumeDialogRingerRepository by Kosmos.Fixture { VolumeDialogRingerRepository() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt index b2216926db22..c2a1544820c5 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/domain/VolumeDialogRingerInteractorKosmos.kt @@ -20,7 +20,6 @@ import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.plugins.volumeDialogController import com.android.systemui.volume.dialog.domain.interactor.volumeDialogStateInteractor -import com.android.systemui.volume.dialog.ringer.data.volumeDialogRingerRepository val Kosmos.volumeDialogRingerInteractor by Kosmos.Fixture { @@ -28,6 +27,5 @@ val Kosmos.volumeDialogRingerInteractor by coroutineScope = applicationCoroutineScope, volumeDialogStateInteractor = volumeDialogStateInteractor, controller = volumeDialogController, - repository = volumeDialogRingerRepository, ) } -- GitLab From 96940dcde3e9f99b43900f9080fdc110c98167f4 Mon Sep 17 00:00:00 2001 From: Pragya Bajoria Date: Tue, 22 Oct 2024 12:45:20 +0000 Subject: [PATCH 199/459] Refactor DesktopTasksLimiter to adapt it to be migrated into DesktopRepository. Flag: EXEMPT (cosmetic changes only in this CL) Bug: 367269373 Change-Id: I907bfdbe39b8894a56a3c9f09b3d562ba5c7e0fb --- .../DesktopMixedTransitionHandler.kt | 2 +- .../wm/shell/desktopmode/DesktopRepository.kt | 4 +- .../desktopmode/DesktopTasksController.kt | 24 +-- .../shell/desktopmode/DesktopTasksLimiter.kt | 143 +++++++----------- .../DesktopMixedTransitionHandlerTest.kt | 4 +- .../desktopmode/DesktopRepositoryTest.kt | 8 +- .../desktopmode/DesktopTasksLimiterTest.kt | 36 ++--- 7 files changed, 96 insertions(+), 125 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index df9fc59b925e..dba46d0c234a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -138,7 +138,7 @@ class DesktopMixedTransitionHandler( private fun isLastDesktopTask(change: TransitionInfo.Change): Boolean = change.taskInfo?.let { - desktopRepository.getActiveNonMinimizedTaskCount(it.displayId) == 1 + desktopRepository.getExpandedTaskCount(it.displayId) == 1 } ?: false private fun findCloseDesktopTaskChange(info: TransitionInfo): TransitionInfo.Change? { diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt index 443e4179b524..a92c77750790 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopRepository.kt @@ -262,11 +262,11 @@ class DesktopRepository ( ArraySet(desktopTaskDataByDisplayId[displayId]?.minimizedTasks) /** Returns all active non-minimized tasks for [displayId] ordered from top to bottom. */ - fun getActiveNonMinimizedOrderedTasks(displayId: Int): List = + fun getExpandedTasksOrdered(displayId: Int): List = getFreeformTasksInZOrder(displayId).filter { !isMinimizedTask(it) } /** Returns the count of active non-minimized tasks for [displayId]. */ - fun getActiveNonMinimizedTaskCount(displayId: Int): Int { + fun getExpandedTaskCount(displayId: Int): Int { return getActiveTasks(displayId).count { !isMinimizedTask(it) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index b505bee469fe..9a03f0fbac3a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -644,7 +644,7 @@ class DesktopTasksController( remoteTransition: RemoteTransition?, ): IBinder { val taskToMinimize: RunningTaskInfo? = - addAndGetMinimizeChangesIfNeeded(DEFAULT_DISPLAY, wct, taskId) + addAndGetMinimizeChanges(DEFAULT_DISPLAY, wct, taskId) if (remoteTransition == null) { val t = transitions.startTransition(transitionType, wct, null /* handler */) addPendingMinimizeTransition(t, taskToMinimize) @@ -847,7 +847,7 @@ class DesktopTasksController( excludeTaskId: Int? = null, ): Boolean { val doesAnyTaskRequireTaskbarRounding = - taskRepository.getActiveNonMinimizedOrderedTasks(displayId) + taskRepository.getExpandedTasksOrdered(displayId) // exclude current task since maximize/restore transition has not taken place yet. .filterNot { taskId -> taskId == excludeTaskId } .any { taskId -> @@ -999,23 +999,23 @@ class DesktopTasksController( addWallpaperActivity(wct) } - val nonMinimizedTasksOrderedFrontToBack = - taskRepository.getActiveNonMinimizedOrderedTasks(displayId) + val expandedTasksOrderedFrontToBack = + taskRepository.getExpandedTasksOrdered(displayId) // If we're adding a new Task we might need to minimize an old one // TODO(b/365725441): Handle non running task minimization val taskToMinimize: RunningTaskInfo? = if (newTaskIdInFront != null && desktopTasksLimiter.isPresent) { desktopTasksLimiter .get() - .getTaskToMinimizeIfNeeded( - nonMinimizedTasksOrderedFrontToBack, + .getTaskToMinimize( + expandedTasksOrderedFrontToBack, newTaskIdInFront ) } else { null } - nonMinimizedTasksOrderedFrontToBack + expandedTasksOrderedFrontToBack // If there is a Task to minimize, let it stay behind the Home Task .filter { taskId -> taskId != taskToMinimize?.taskId } .reversed() // Start from the back so the front task is brought forward last @@ -1374,7 +1374,7 @@ class DesktopTasksController( // 1) Exit immersive if needed. immersiveTransitionHandler.exitImmersiveIfApplicable(transition, wct, task.displayId) // 2) minimize a Task if needed. - val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) + val taskToMinimize = addAndGetMinimizeChanges(task.displayId, wct, task.taskId) if (taskToMinimize != null) { addPendingMinimizeTransition(transition, taskToMinimize) return wct @@ -1401,7 +1401,7 @@ class DesktopTasksController( // Desktop Mode is already showing and we're launching a new Task - we might need to // minimize another Task. val taskToMinimize = - addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) + addAndGetMinimizeChanges(task.displayId, wct, task.taskId) addPendingMinimizeTransition(transition, taskToMinimize) immersiveTransitionHandler.exitImmersiveIfApplicable( transition, wct, task.displayId @@ -1529,7 +1529,7 @@ class DesktopTasksController( val stableBounds = Rect() displayLayout.getStableBoundsForDesktopMode(stableBounds) - val activeTasks = taskRepository.getActiveNonMinimizedOrderedTasks(displayId) + val activeTasks = taskRepository.getExpandedTasksOrdered(displayId) activeTasks.firstOrNull()?.let { activeTask -> shellTaskOrganizer.getRunningTaskInfo(activeTask)?.let { cascadeWindow(context.resources, stableBounds, @@ -1558,7 +1558,7 @@ class DesktopTasksController( } /** Returns the ID of the Task that will be minimized, or null if no task will be minimized. */ - private fun addAndGetMinimizeChangesIfNeeded( + private fun addAndGetMinimizeChanges( displayId: Int, wct: WindowContainerTransaction, newTaskId: Int @@ -1566,7 +1566,7 @@ class DesktopTasksController( if (!desktopTasksLimiter.isPresent) return null return desktopTasksLimiter .get() - .addAndGetMinimizeTaskChangesIfNeeded(displayId, wct, newTaskId) + .addAndGetMinimizeTaskChanges(displayId, wct, newTaskId) } private fun addPendingMinimizeTransition( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt index d6b721253abf..cd28a4fa67ec 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksLimiter.kt @@ -30,7 +30,7 @@ import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_MINIMIZE_WINDOW import com.android.internal.jank.InteractionJankMonitor import com.android.internal.protolog.ProtoLog import com.android.wm.shell.ShellTaskOrganizer -import com.android.wm.shell.protolog.ShellProtoLogGroup +import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.shared.annotations.ShellMainThread import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionObserver @@ -57,13 +57,11 @@ class DesktopTasksLimiter ( init { require(maxTasksLimit > 0) { - "DesktopTasksLimiter should not be created with a maxTasksLimit at 0 or less. " + - "Current value: $maxTasksLimit." + "DesktopTasksLimiter: maxTasksLimit should be greater than 0. Current value: $maxTasksLimit." } transitions.registerObserver(minimizeTransitionObserver) taskRepository.addActiveTaskListener(leftoverMinimizedTasksRemover) - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: starting limiter with a maximum of %d tasks", maxTasksLimit) + logV("Starting limiter with a maximum of %d tasks", maxTasksLimit) } private data class TaskDetails( @@ -88,20 +86,14 @@ class DesktopTasksLimiter ( finishTransaction: SurfaceControl.Transaction ) { val taskToMinimize = pendingTransitionTokensAndTasks.remove(transition) ?: return - if (!taskRepository.isActiveTask(taskToMinimize.taskId)) return - - if (!isTaskReorderedToBackOrInvisible(info, taskToMinimize)) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: task %d is not reordered to back nor invis", - taskToMinimize.taskId) + if (!isTaskReadyForMinimize(info, taskToMinimize)) { + logV("task %d is not reordered to back nor invis", taskToMinimize.taskId) return } - taskToMinimize.transitionInfo = info activeTransitionTokensAndTasks[transition] = taskToMinimize - this@DesktopTasksLimiter.markTaskMinimized( + this@DesktopTasksLimiter.minimizeTask( taskToMinimize.displayId, taskToMinimize.taskId) } @@ -109,18 +101,15 @@ class DesktopTasksLimiter ( * Returns whether the Task [taskDetails] is being reordered to the back in the transition * [info], or is already invisible. * - * This check can be used to double-check that a task was indeed minimized before - * marking it as such. + * This check confirms a task should be minimized before minimizing it. */ - private fun isTaskReorderedToBackOrInvisible( - info: TransitionInfo, - taskDetails: TaskDetails + private fun isTaskReadyForMinimize( + info: TransitionInfo, + taskDetails: TaskDetails ): Boolean { val taskChange = info.changes.find { change -> change.taskInfo?.taskId == taskDetails.taskId } - if (taskChange == null) { - return !taskRepository.isVisibleTask(taskDetails.taskId) - } + if (taskChange == null) return !taskRepository.isVisibleTask(taskDetails.taskId) return taskChange.mode == TRANSIT_TO_BACK } @@ -145,9 +134,7 @@ class DesktopTasksLimiter ( } override fun onTransitionFinished(transition: IBinder, aborted: Boolean) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: transition %s finished", transition) + logV("transition %s finished", transition) if (activeTransitionTokensAndTasks.remove(transition) != null) { if (aborted) { interactionJankMonitor.cancel(CUJ_DESKTOP_MODE_MINIMIZE_WINDOW) @@ -170,18 +157,11 @@ class DesktopTasksLimiter ( } fun removeLeftoverMinimizedTasks(displayId: Int, wct: WindowContainerTransaction) { - if (taskRepository.getActiveNonMinimizedOrderedTasks(displayId).isNotEmpty()) { - return - } + if (taskRepository.getExpandedTasksOrdered(displayId).isNotEmpty()) return val remainingMinimizedTasks = taskRepository.getMinimizedTasks(displayId) - if (remainingMinimizedTasks.isEmpty()) { - return - } - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: removing leftover minimized tasks: %s", - remainingMinimizedTasks, - ) + if (remainingMinimizedTasks.isEmpty()) return + + logV("Removing leftover minimized tasks: %s", remainingMinimizedTasks) remainingMinimizedTasks.forEach { taskIdToRemove -> val taskToRemove = shellTaskOrganizer.getRunningTaskInfo(taskIdToRemove) if (taskToRemove != null) { @@ -192,35 +172,30 @@ class DesktopTasksLimiter ( } /** - * Mark [taskId], which must be on [displayId], as minimized, this should only be done after the - * corresponding transition has finished so we don't minimize the task if the transition fails. + * Mark task with [taskId] on [displayId] as minimized. + * + * This should be after the corresponding transition has finished so we don't + * minimize the task if the transition fails. */ - private fun markTaskMinimized(displayId: Int, taskId: Int) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: marking %d as minimized", taskId) + private fun minimizeTask(displayId: Int, taskId: Int) { + logV("Minimize taskId=%d, displayId=%d", taskId, displayId) taskRepository.minimizeTask(displayId, taskId) } /** - * Add a minimize-transition to [wct] if adding [newFrontTaskInfo] brings us over the task + * Adds a minimize-transition to [wct] if adding [newFrontTaskInfo] crosses task * limit, returning the task to minimize. - * - * The task must be on [displayId]. */ - fun addAndGetMinimizeTaskChangesIfNeeded( + fun addAndGetMinimizeTaskChanges( displayId: Int, wct: WindowContainerTransaction, newFrontTaskId: Int, ): RunningTaskInfo? { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: addMinimizeBackTaskChangesIfNeeded, newFrontTask=%d", - newFrontTaskId) - val newTaskListOrderedFrontToBack = createOrderedTaskListWithGivenTaskInFront( - taskRepository.getActiveNonMinimizedOrderedTasks(displayId), - newFrontTaskId) - val taskToMinimize = getTaskToMinimizeIfNeeded(newTaskListOrderedFrontToBack) + logV("addAndGetMinimizeTaskChanges, newFrontTask=%d", newFrontTaskId) + // This list is ordered from front to back. + val newTaskOrderedList = createOrderedTaskListWithNewTask( + taskRepository.getExpandedTasksOrdered(displayId), newFrontTaskId) + val taskToMinimize = getTaskToMinimize(newTaskOrderedList) if (taskToMinimize != null) { wct.reorder(taskToMinimize.token, false /* onTop */) return taskToMinimize @@ -229,7 +204,7 @@ class DesktopTasksLimiter ( } /** - * Add a pending minimize transition change, to update the list of minimized apps once the + * Add a pending minimize transition change to update the list of minimized apps once the * transition goes through. */ fun addPendingMinimizeChange(transition: IBinder, displayId: Int, taskId: Int) { @@ -238,51 +213,47 @@ class DesktopTasksLimiter ( } /** - * Returns the Task to minimize given 1. a list of visible tasks ordered from front to back and - * 2. a new task placed in front of all the others. + * Returns the minimized task from the list of visible tasks ordered from front to back with + * the new task placed in front of other tasks. */ - fun getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack: List, + fun getTaskToMinimize( + visibleOrderedTasks: List, newTaskIdInFront: Int - ): RunningTaskInfo? { - return getTaskToMinimizeIfNeeded( - createOrderedTaskListWithGivenTaskInFront( - visibleFreeformTaskIdsOrderedFrontToBack, newTaskIdInFront)) - } + ): RunningTaskInfo? = + getTaskToMinimize(createOrderedTaskListWithNewTask(visibleOrderedTasks, newTaskIdInFront)) /** Returns the Task to minimize given a list of visible tasks ordered from front to back. */ - fun getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack: List - ): RunningTaskInfo? { - if (visibleFreeformTaskIdsOrderedFrontToBack.size <= maxTasksLimit) { - ProtoLog.v( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: no need to minimize; tasks below limit") - // No need to minimize anything + fun getTaskToMinimize(visibleOrderedTasks: List): RunningTaskInfo? { + if (visibleOrderedTasks.size <= maxTasksLimit) { + logV("No need to minimize; tasks below limit") return null } - val taskIdToMinimize = visibleFreeformTaskIdsOrderedFrontToBack.last() + val taskIdToMinimize = visibleOrderedTasks.last() val taskToMinimize = shellTaskOrganizer.getRunningTaskInfo(taskIdToMinimize) if (taskToMinimize == null) { - ProtoLog.e( - ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE, - "DesktopTasksLimiter: taskToMinimize(taskId = %d) == null", - taskIdToMinimize, - ) + logE("taskToMinimize(taskId = %d) == null", taskIdToMinimize) return null } return taskToMinimize } - private fun createOrderedTaskListWithGivenTaskInFront( - existingTaskIdsOrderedFrontToBack: List, - newTaskId: Int - ): List { - return listOf(newTaskId) + - existingTaskIdsOrderedFrontToBack.filter { taskId -> taskId != newTaskId } - } + private fun createOrderedTaskListWithNewTask( + orderedTaskIds: List, newTaskId: Int): List = + listOf(newTaskId) + orderedTaskIds.filter { taskId -> taskId != newTaskId } @VisibleForTesting fun getTransitionObserver(): TransitionObserver = minimizeTransitionObserver -} \ No newline at end of file + + private fun logV(msg: String, vararg arguments: Any?) { + ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) + } + + private fun logE(msg: String, vararg arguments: Any?) { + ProtoLog.e(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) + } + + private companion object { + const val TAG = "DesktopTasksLimiter" + } +} diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt index 81d59d586dd3..50368377691f 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt @@ -147,7 +147,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { fun startAnimation_withClosingDesktopTask_callsCloseTaskHandler() { val transition = mock() val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM)) - whenever(desktopRepository.getActiveNonMinimizedTaskCount(any())).thenReturn(2) + whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(2) whenever( closeDesktopTaskTransitionHandler.startAnimation(any(), any(), any(), any(), any()) ) @@ -170,7 +170,7 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { fun startAnimation_withClosingLastDesktopTask_dispatchesTransition() { val transition = mock() val transitionInfo = createTransitionInfo(task = createTask(WINDOWING_MODE_FREEFORM)) - whenever(desktopRepository.getActiveNonMinimizedTaskCount(any())).thenReturn(1) + whenever(desktopRepository.getExpandedTaskCount(any())).thenReturn(1) whenever(transitions.dispatchTransition(any(), any(), any(), any(), any(), any())) .thenReturn(mock()) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt index 3e2280393c2b..d90443c99d37 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopRepositoryTest.kt @@ -898,7 +898,7 @@ class DesktopRepositoryTest : ShellTestCase() { } @Test - fun getActiveNonMinimizedOrderedTasks_returnsFreeformTasksInCorrectOrder() { + fun getExpandedTasksOrdered_returnsFreeformTasksInCorrectOrder() { repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1) repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2) repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3) @@ -907,13 +907,13 @@ class DesktopRepositoryTest : ShellTestCase() { repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 2) repo.addOrMoveFreeformTaskToTop(displayId = 0, taskId = 1) - val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = 0) + val tasks = repo.getExpandedTasksOrdered(displayId = 0) assertThat(tasks).containsExactly(1, 2, 3).inOrder() } @Test - fun getActiveNonMinimizedOrderedTasks_excludesMinimizedTasks() { + fun getExpandedTasksOrdered_excludesMinimizedTasks() { repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 1) repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 2) repo.addActiveTask(displayId = DEFAULT_DISPLAY, taskId = 3) @@ -923,7 +923,7 @@ class DesktopRepositoryTest : ShellTestCase() { repo.addOrMoveFreeformTaskToTop(displayId = DEFAULT_DISPLAY, taskId = 1) repo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = 2) - val tasks = repo.getActiveNonMinimizedOrderedTasks(displayId = DEFAULT_DISPLAY) + val tasks = repo.getExpandedTasksOrdered(displayId = DEFAULT_DISPLAY) assertThat(tasks).containsExactly(1, 3).inOrder() } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt index 596b76dbdb2e..fa878d0bb077 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksLimiterTest.kt @@ -303,12 +303,12 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test - fun addAndGetMinimizeTaskChangesIfNeeded_tasksWithinLimit_noTaskMinimized() { + fun addAndGetMinimizeTaskChanges_tasksWithinLimit_noTaskMinimized() { (1.. setUpFreeformTask() } val wct = WindowContainerTransaction() val minimizedTaskId = - desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded( + desktopTasksLimiter.addAndGetMinimizeTaskChanges( displayId = DEFAULT_DISPLAY, wct = wct, newFrontTaskId = setUpFreeformTask().taskId) @@ -318,13 +318,13 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test - fun addAndGetMinimizeTaskChangesIfNeeded_tasksAboveLimit_backTaskMinimized() { + fun addAndGetMinimizeTaskChanges_tasksAboveLimit_backTaskMinimized() { // The following list will be ordered bottom -> top, as the last task is moved to top last. val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } val wct = WindowContainerTransaction() val minimizedTaskId = - desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded( + desktopTasksLimiter.addAndGetMinimizeTaskChanges( displayId = DEFAULT_DISPLAY, wct = wct, newFrontTaskId = setUpFreeformTask().taskId) @@ -336,13 +336,13 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test - fun addAndGetMinimizeTaskChangesIfNeeded_nonMinimizedTasksWithinLimit_noTaskMinimized() { + fun addAndGetMinimizeTaskChanges_nonMinimizedTasksWithinLimit_noTaskMinimized() { val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } desktopTaskRepo.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = tasks[0].taskId) val wct = WindowContainerTransaction() val minimizedTaskId = - desktopTasksLimiter.addAndGetMinimizeTaskChangesIfNeeded( + desktopTasksLimiter.addAndGetMinimizeTaskChanges( displayId = 0, wct = wct, newFrontTaskId = setUpFreeformTask().taskId) @@ -352,46 +352,46 @@ class DesktopTasksLimiterTest : ShellTestCase() { } @Test - fun getTaskToMinimizeIfNeeded_tasksWithinLimit_returnsNull() { + fun getTaskToMinimize_tasksWithinLimit_returnsNull() { val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } - val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) + val minimizedTask = desktopTasksLimiter.getTaskToMinimize( + visibleOrderedTasks = tasks.map { it.taskId }) assertThat(minimizedTask).isNull() } @Test - fun getTaskToMinimizeIfNeeded_tasksAboveLimit_returnsBackTask() { + fun getTaskToMinimize_tasksAboveLimit_returnsBackTask() { val tasks = (1..MAX_TASK_LIMIT + 1).map { setUpFreeformTask() } - val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) + val minimizedTask = desktopTasksLimiter.getTaskToMinimize( + visibleOrderedTasks = tasks.map { it.taskId }) // first == front, last == back assertThat(minimizedTask).isEqualTo(tasks.last()) } @Test - fun getTaskToMinimizeIfNeeded_tasksAboveLimit_otherLimit_returnsBackTask() { + fun getTaskToMinimize_tasksAboveLimit_otherLimit_returnsBackTask() { desktopTasksLimiter = DesktopTasksLimiter(transitions, desktopTaskRepo, shellTaskOrganizer, MAX_TASK_LIMIT2, interactionJankMonitor, mContext, handler) val tasks = (1..MAX_TASK_LIMIT2 + 1).map { setUpFreeformTask() } - val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }) + val minimizedTask = desktopTasksLimiter.getTaskToMinimize( + visibleOrderedTasks = tasks.map { it.taskId }) // first == front, last == back assertThat(minimizedTask).isEqualTo(tasks.last()) } @Test - fun getTaskToMinimizeIfNeeded_withNewTask_tasksAboveLimit_returnsBackTask() { + fun getTaskToMinimize_withNewTask_tasksAboveLimit_returnsBackTask() { val tasks = (1..MAX_TASK_LIMIT).map { setUpFreeformTask() } - val minimizedTask = desktopTasksLimiter.getTaskToMinimizeIfNeeded( - visibleFreeformTaskIdsOrderedFrontToBack = tasks.map { it.taskId }, + val minimizedTask = desktopTasksLimiter.getTaskToMinimize( + visibleOrderedTasks = tasks.map { it.taskId }, newTaskIdInFront = setUpFreeformTask().taskId) // first == front, last == back -- GitLab From 3ee9acc200f83429a09a6ed0cde0710632121260 Mon Sep 17 00:00:00 2001 From: Hani Kazmi Date: Tue, 22 Oct 2024 12:47:02 +0000 Subject: [PATCH 200/459] [AAPM] Disable for unsupported form factors. The initial launch is targeted towards general purpose devices. Other form factors may be added later. Bug: 352420507 Flag: android.security.aapm_api Test: Presubmits Change-Id: I15e5ac313e15f50032437515dd8d704559212c8e --- services/java/com/android/server/SystemServer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index e052f94b92ee..2461c1ce3b0e 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -1504,6 +1504,8 @@ public final class SystemServer implements Dumpable { boolean isTv = context.getPackageManager().hasSystemFeature( PackageManager.FEATURE_LEANBACK); + boolean isAutomotive = RoSystemFeatures.hasFeatureAutomotive(context); + boolean enableVrService = context.getPackageManager().hasSystemFeature( PackageManager.FEATURE_VR_MODE_HIGH_PERFORMANCE); @@ -1760,7 +1762,8 @@ public final class SystemServer implements Dumpable { t.traceEnd(); } - if (android.security.Flags.aapmApi()) { + if (!isWatch && !isTv && !isAutomotive + && android.security.Flags.aapmApi()) { t.traceBegin("StartAdvancedProtectionService"); mSystemServiceManager.startService(AdvancedProtectionService.Lifecycle.class); t.traceEnd(); @@ -3137,7 +3140,7 @@ public final class SystemServer implements Dumpable { }, WEBVIEW_PREPARATION); } - if (RoSystemFeatures.hasFeatureAutomotive(context)) { + if (isAutomotive) { t.traceBegin("StartCarServiceHelperService"); final SystemService cshs = mSystemServiceManager .startService(CAR_SERVICE_HELPER_SERVICE_CLASS); -- GitLab From 5191964dd4edad607acca67c99e39599d81217b8 Mon Sep 17 00:00:00 2001 From: lijilou Date: Tue, 22 Oct 2024 20:40:21 +0800 Subject: [PATCH 201/459] Watchdog:do not need add or clear operation when mMonitorQueue is empty. Bug: 374920072 Flag: EXEMPT minor optimization Change-Id: I5a90968cdf35917c6ce8a9fe65ea5643975484a8 --- services/core/java/com/android/server/Watchdog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/Watchdog.java b/services/core/java/com/android/server/Watchdog.java index 918f13096cdc..0dedb739d6a2 100644 --- a/services/core/java/com/android/server/Watchdog.java +++ b/services/core/java/com/android/server/Watchdog.java @@ -289,7 +289,7 @@ public class Watchdog implements Dumpable { public void scheduleCheckLocked(long handlerCheckerTimeoutMillis) { mWaitMaxMillis = handlerCheckerTimeoutMillis; - if (mCompleted) { + if (mCompleted && !mMonitorQueue.isEmpty()) { // Safe to update monitors in queue, Handler is not in the middle of work mMonitors.addAll(mMonitorQueue); mMonitorQueue.clear(); -- GitLab From 4938b5cff952f46fee1f826f387d84082c57ad90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=96mer=20Yavero=C4=9Flu?= Date: Tue, 22 Oct 2024 13:05:57 +0000 Subject: [PATCH 202/459] Remove the dependencies to the IntegrityFileManager from AppIntegrityManagerServiceImpl by setting the methods that use it to a default empty value. This is part of the effort to clean-up the AppIntegrityManager related code. Change-Id: I56d66a9c5e97c5b87632caec8582ad668a5b7ced --- .../AppIntegrityManagerServiceImpl.java | 99 +------------------ .../AppIntegrityManagerServiceImplTest.java | 68 ------------- 2 files changed, 4 insertions(+), 163 deletions(-) diff --git a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java index 509fa3e1c9ba..bb4ae96da53b 100644 --- a/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java +++ b/services/core/java/com/android/server/integrity/AppIntegrityManagerServiceImpl.java @@ -74,7 +74,6 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { private final Context mContext; private final Handler mHandler; private final PackageManagerInternal mPackageManagerInternal; - private final IntegrityFileManager mIntegrityFileManager; /** Create an instance of {@link AppIntegrityManagerServiceImpl}. */ public static AppIntegrityManagerServiceImpl create(Context context) { @@ -84,7 +83,6 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { return new AppIntegrityManagerServiceImpl( context, LocalServices.getService(PackageManagerInternal.class), - IntegrityFileManager.getInstance(), handlerThread.getThreadHandler()); } @@ -92,11 +90,9 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { AppIntegrityManagerServiceImpl( Context context, PackageManagerInternal packageManagerInternal, - IntegrityFileManager integrityFileManager, Handler handler) { mContext = context; mPackageManagerInternal = packageManagerInternal; - mIntegrityFileManager = integrityFileManager; mHandler = handler; IntentFilter integrityVerificationFilter = new IntentFilter(); @@ -144,39 +140,23 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { @Override @BinderThread public String getCurrentRuleSetVersion() { - getCallerPackageNameOrThrow(Binder.getCallingUid()); - - RuleMetadata ruleMetadata = mIntegrityFileManager.readMetadata(); - return (ruleMetadata != null && ruleMetadata.getVersion() != null) - ? ruleMetadata.getVersion() - : ""; + return ""; } @Override @BinderThread public String getCurrentRuleSetProvider() { - getCallerPackageNameOrThrow(Binder.getCallingUid()); - - RuleMetadata ruleMetadata = mIntegrityFileManager.readMetadata(); - return (ruleMetadata != null && ruleMetadata.getRuleProvider() != null) - ? ruleMetadata.getRuleProvider() - : ""; + return ""; } @Override public ParceledListSlice getCurrentRules() { - List rules = Collections.emptyList(); - try { - rules = mIntegrityFileManager.readRules(/* appInstallMetadata= */ null); - } catch (Exception e) { - Slog.e(TAG, "Error getting current rules", e); - } - return new ParceledListSlice<>(rules); + return new ParceledListSlice<>(Collections.emptyList()); } @Override public List getWhitelistedRuleProviders() { - return getAllowedRuleProviderSystemApps(); + return Collections.emptyList(); } private void handleIntegrityVerification(Intent intent) { @@ -184,75 +164,4 @@ public class AppIntegrityManagerServiceImpl extends IAppIntegrityManager.Stub { mPackageManagerInternal.setIntegrityVerificationResult( verificationId, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW); } - - private String getCallerPackageNameOrThrow(int callingUid) { - String callerPackageName = getCallingRulePusherPackageName(callingUid); - if (callerPackageName == null) { - throw new SecurityException( - "Only system packages specified in config_integrityRuleProviderPackages are " - + "allowed to call this method."); - } - return callerPackageName; - } - - private String getCallingRulePusherPackageName(int callingUid) { - // Obtain the system apps that are allowlisted in config_integrityRuleProviderPackages. - List allowedRuleProviders = getAllowedRuleProviderSystemApps(); - if (DEBUG_INTEGRITY_COMPONENT) { - Slog.i( - TAG, - String.format( - "Rule provider system app list contains: %s", allowedRuleProviders)); - } - - // Identify the package names in the caller list. - List callingPackageNames = getPackageListForUid(callingUid); - - // Find the intersection between the allowed and calling packages. Ideally, we will have - // at most one package name here. But if we have more, it is fine. - List allowedCallingPackages = new ArrayList<>(); - for (String packageName : callingPackageNames) { - if (allowedRuleProviders.contains(packageName)) { - allowedCallingPackages.add(packageName); - } - } - - return allowedCallingPackages.isEmpty() ? null : allowedCallingPackages.get(0); - } - - private List getAllowedRuleProviderSystemApps() { - List integrityRuleProviders = - Arrays.asList( - mContext.getResources() - .getStringArray(R.array.config_integrityRuleProviderPackages)); - - // Filter out the rule provider packages that are not system apps. - List systemAppRuleProviders = new ArrayList<>(); - for (String ruleProvider : integrityRuleProviders) { - if (isSystemApp(ruleProvider)) { - systemAppRuleProviders.add(ruleProvider); - } - } - return systemAppRuleProviders; - } - - private boolean isSystemApp(String packageName) { - try { - PackageInfo existingPackageInfo = - mContext.getPackageManager().getPackageInfo(packageName, /* flags= */ 0); - return existingPackageInfo.applicationInfo != null - && existingPackageInfo.applicationInfo.isSystemApp(); - } catch (PackageManager.NameNotFoundException e) { - return false; - } - } - - private List getPackageListForUid(int uid) { - try { - return Arrays.asList(mContext.getPackageManager().getPackagesForUid(uid)); - } catch (NullPointerException e) { - Slog.w(TAG, String.format("No packages were found for uid: %d", uid)); - return List.of(); - } - } } diff --git a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java index a2e6d4c7bfed..93aa10b9112f 100644 --- a/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java +++ b/services/tests/servicestests/src/com/android/server/integrity/AppIntegrityManagerServiceImplTest.java @@ -135,7 +135,6 @@ public class AppIntegrityManagerServiceImplTest { @Mock PlatformCompat mPlatformCompat; @Mock Context mMockContext; @Mock Resources mMockResources; - @Mock IntegrityFileManager mIntegrityFileManager; @Mock Handler mHandler; private final Context mRealContext = InstrumentationRegistry.getTargetContext(); @@ -169,7 +168,6 @@ public class AppIntegrityManagerServiceImplTest { new AppIntegrityManagerServiceImpl( mMockContext, mPackageManagerInternal, - mIntegrityFileManager, mHandler); mSpyPackageManager = spy(mRealContext.getPackageManager()); @@ -177,7 +175,6 @@ public class AppIntegrityManagerServiceImplTest { when(mMockContext.getPackageManager()).thenReturn(mSpyPackageManager); when(mMockContext.getResources()).thenReturn(mMockResources); when(mMockResources.getStringArray(anyInt())).thenReturn(new String[] {}); - when(mIntegrityFileManager.initialized()).thenReturn(true); // These are needed to override the Settings.Global.get result. when(mMockContext.getContentResolver()).thenReturn(mRealContext.getContentResolver()); setIntegrityCheckIncludesRuleProvider(true); @@ -224,71 +221,6 @@ public class AppIntegrityManagerServiceImplTest { 1, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW); } - @Test - public void handleBroadcast_notInitialized() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - when(mIntegrityFileManager.initialized()).thenReturn(false); - ArgumentCaptor broadcastReceiverCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mMockContext) - .registerReceiver(broadcastReceiverCaptor.capture(), any(), any(), any()); - Intent intent = makeVerificationIntent(); - - broadcastReceiverCaptor.getValue().onReceive(mMockContext, intent); - runJobInHandler(); - - // The evaluation will still run since we still evaluate manifest based rules. - verify(mPackageManagerInternal) - .setIntegrityVerificationResult( - 1, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW); - } - - @Test - public void verifierAsInstaller_skipIntegrityVerification() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - setIntegrityCheckIncludesRuleProvider(false); - ArgumentCaptor broadcastReceiverCaptor = - ArgumentCaptor.forClass(BroadcastReceiver.class); - verify(mMockContext, atLeastOnce()) - .registerReceiver(broadcastReceiverCaptor.capture(), any(), any(), any()); - Intent intent = makeVerificationIntent(TEST_FRAMEWORK_PACKAGE); - - broadcastReceiverCaptor.getValue().onReceive(mMockContext, intent); - runJobInHandler(); - - verify(mPackageManagerInternal) - .setIntegrityVerificationResult( - 1, PackageManagerInternal.INTEGRITY_VERIFICATION_ALLOW); - } - - @Test - public void getCurrentRules() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - Rule rule = new Rule(IntegrityFormula.Application.packageNameEquals("package"), Rule.DENY); - when(mIntegrityFileManager.readRules(any())).thenReturn(Arrays.asList(rule)); - - assertThat(mService.getCurrentRules().getList()).containsExactly(rule); - } - - @Test - public void getWhitelistedRuleProviders_returnsEmptyForNonSystemApps() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(false); - - assertThat(mService.getWhitelistedRuleProviders()).isEmpty(); - } - - @Test - public void getWhitelistedRuleProviders() throws Exception { - allowlistUsAsRuleProvider(); - makeUsSystemApp(); - - assertThat(mService.getWhitelistedRuleProviders()).containsExactly(TEST_FRAMEWORK_PACKAGE); - } - private void allowlistUsAsRuleProvider() { Resources mockResources = mock(Resources.class); when(mockResources.getStringArray(R.array.config_integrityRuleProviderPackages)) -- GitLab From 30bd0a99d3b9a02f61a30bfdc1679f09cb15744d Mon Sep 17 00:00:00 2001 From: Chris Poultney Date: Tue, 22 Oct 2024 13:17:34 +0000 Subject: [PATCH 203/459] Add OWNERS for wallpaper tests Bug: 347235611 Change-Id: I0749060a668fa890998bc541e9b3876f661fd8db --- core/tests/coretests/OWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/core/tests/coretests/OWNERS b/core/tests/coretests/OWNERS index b669e3bc4f30..6d27f3156c93 100644 --- a/core/tests/coretests/OWNERS +++ b/core/tests/coretests/OWNERS @@ -4,3 +4,4 @@ per-file BinderTest.java = file:platform/frameworks/native:/libs/binder/OWNERS per-file ParcelTest.java = file:platform/frameworks/native:/libs/binder/OWNERS per-file SurfaceControlRegistryTests.java = file:/services/core/java/com/android/server/wm/OWNERS per-file VintfObjectTest.java = file:platform/system/libvintf:/OWNERS +per-file WallpaperDescriptionTest,WallpaperInstanceTest = file:/core/java/android/service/wallpaper/OWNERS -- GitLab From d8336d2133e17572e7e795cb1aad2b7e224cf0a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20Kurucz?= Date: Mon, 21 Oct 2024 18:22:50 +0000 Subject: [PATCH 204/459] [flexiglass] Update NSSL stack heights, when maxNotifications changes AmbientState#mStackEndHeight depends on NSSL#mMaxDisplayedNotifications, so we need to recalculate the stack end height, whenever the number of max displayed notifications changes. Fixes: 365727076 Test: receive Notifications on the LS, check whether there is enough space to be displayed Flag: com.android.systemui.scene_container Change-Id: Ia67a244b4c229d979718af528a1149f41eb8eee3 --- .../stack/NotificationStackScrollLayout.java | 7 +++- .../NotificationStackScrollLayoutTest.java | 33 ++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index b51ec782f183..87b16efc64fc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -5351,7 +5351,12 @@ public class NotificationStackScrollLayout public void setMaxDisplayedNotifications(int maxDisplayedNotifications) { if (mMaxDisplayedNotifications != maxDisplayedNotifications) { mMaxDisplayedNotifications = maxDisplayedNotifications; - updateContentHeight(); + if (SceneContainerFlag.isEnabled()) { + updateIntrinsicStackHeight(); + updateStackEndHeightAndStackHeight(mAmbientState.getExpansionFraction()); + } else { + updateContentHeight(); + } notifyHeightChangeListener(mShelf); } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java index eea929da83ce..fdfc25390a3f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutTest.java @@ -1218,7 +1218,38 @@ public class NotificationStackScrollLayoutTest extends SysuiTestCase { } @Test - @DisableSceneContainer // TODO(b/312473478): address disabled test + @EnableSceneContainer + public void testSetMaxDisplayedNotifications_updatesStackHeight() { + int fullStackHeight = 300; + int limitedStackHeight = 100; + int maxNotifs = 2; // any non-zero limit + float stackTop = 100; + float stackCutoff = 1100; + float stackViewPortHeight = stackCutoff - stackTop; + mStackScroller.setStackTop(stackTop); + mStackScroller.setStackCutoff(stackCutoff); + when(mStackSizeCalculator.computeHeight(eq(mStackScroller), eq(-1), anyFloat())) + .thenReturn((float) fullStackHeight); + when(mStackSizeCalculator.computeHeight(eq(mStackScroller), eq(maxNotifs), anyFloat())) + .thenReturn((float) limitedStackHeight); + + // When we set a limit on max displayed notifications + mStackScroller.setMaxDisplayedNotifications(maxNotifs); + + // Then + assertThat(mStackScroller.getIntrinsicStackHeight()).isEqualTo(limitedStackHeight); + assertThat(mAmbientState.getStackEndHeight()).isEqualTo(limitedStackHeight); + + // When there is no limit on max displayed notifications + mStackScroller.setMaxDisplayedNotifications(-1); + + // Then + assertThat(mStackScroller.getIntrinsicStackHeight()).isEqualTo(fullStackHeight); + assertThat(mAmbientState.getStackEndHeight()).isEqualTo(stackViewPortHeight); + } + + @Test + @DisableSceneContainer public void testSetMaxDisplayedNotifications_notifiesListeners() { ExpandableView.OnHeightChangedListener listener = mock(ExpandableView.OnHeightChangedListener.class); -- GitLab From fc84868a656235bbe71eae711e379e9c2e7b6e17 Mon Sep 17 00:00:00 2001 From: Pragya Bajoria Date: Tue, 22 Oct 2024 13:22:37 +0000 Subject: [PATCH 205/459] Remove ENABLE_SHELL_TRANSITIONS flag from DesktopTasksControllerTest The flag is always true, so we can remove it from the test to simplify the code. Bug: 332682201 Flag: EXEMPT (only updating tests) Change-Id: If38f210c771149deab438d351897d5a28eb7a9c4 --- .../desktopmode/DesktopTasksControllerTest.kt | 105 +++--------------- 1 file changed, 13 insertions(+), 92 deletions(-) diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 61943568e7d4..7c336cdb54f6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -299,6 +299,8 @@ class DesktopTasksControllerTest : ShellTestCase() { recentsTransitionStateListener = captor.value controller.taskbarDesktopTaskListener = taskbarDesktopTaskListener + + assumeTrue(ENABLE_SHELL_TRANSITIONS) } private fun createController(): DesktopTasksController { @@ -775,7 +777,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS) fun handleRequest_newFreeformTaskLaunch_cascadeApplied() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) setUpLandscapeDisplay() val stableBounds = Rect() displayLayout.getStableBoundsForDesktopMode(stableBounds) @@ -794,7 +795,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_CASCADING_WINDOWS) fun handleRequest_freeformTaskAlreadyExistsInDesktopMode_cascadeNotApplied() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) setUpLandscapeDisplay() val stableBounds = Rect() displayLayout.getStableBoundsForDesktopMode(stableBounds) @@ -1794,8 +1794,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTask_freeformVisible_returnSwitchToFreeformWCT() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val homeTask = setUpHomeTask() val freeformTask = setUpFreeformTask() markTaskVisible(freeformTask) @@ -1812,8 +1810,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTaskWithTaskOnHome_freeformVisible_returnSwitchToFreeformWCT() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val homeTask = setUpHomeTask() val freeformTask = setUpFreeformTask() markTaskVisible(freeformTask) @@ -1839,8 +1835,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTaskToFreeform_underTaskLimit_dontMinimize() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTask = setUpFreeformTask() markTaskVisible(freeformTask) val fullscreenTask = createFullscreenTask() @@ -1854,8 +1848,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTaskToFreeform_bringsTasksOverLimit_otherTaskIsMinimized() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } freeformTasks.forEach { markTaskVisible(it) } val fullscreenTask = createFullscreenTask() @@ -1870,8 +1862,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTaskWithTaskOnHome_bringsTasksOverLimit_otherTaskIsMinimized() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } freeformTasks.forEach { markTaskVisible(it) } val fullscreenTask = createFullscreenTask() @@ -1887,8 +1877,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTaskWithTaskOnHome_beyondLimit_existingAndNewTasksAreMinimized() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val minimizedTask = setUpFreeformTask() taskRepository.minimizeTask(displayId = DEFAULT_DISPLAY, taskId = minimizedTask.taskId) val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } @@ -1909,7 +1897,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTask_noTasks_enforceDesktop_freeformDisplay_returnFreeformWCT() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(context)).thenReturn(true) val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!! tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM @@ -1926,7 +1913,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTask_noTasks_enforceDesktop_fullscreenDisplay_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(context)).thenReturn(true) val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!! tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN @@ -1939,8 +1925,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTask_freeformNotVisible_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTask = setUpFreeformTask() markTaskHidden(freeformTask) val fullscreenTask = createFullscreenTask() @@ -1949,16 +1933,12 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_fullscreenTask_noOtherTasks_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val fullscreenTask = createFullscreenTask() assertThat(controller.handleRequest(Binder(), createTransition(fullscreenTask))).isNull() } @Test fun handleRequest_fullscreenTask_freeformTaskOnOtherDisplay_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val fullscreenTaskDefaultDisplay = createFullscreenTask(displayId = DEFAULT_DISPLAY) createFreeformTask(displayId = SECOND_DISPLAY) @@ -1968,8 +1948,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_freeformVisible_aboveTaskLimit_minimize() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTasks = (1..MAX_TASK_LIMIT).map { _ -> setUpFreeformTask() } freeformTasks.forEach { markTaskVisible(it) } val newFreeformTask = createFreeformTask() @@ -1982,8 +1960,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_relaunchActiveTask_taskBecomesUndefined() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTask = setUpFreeformTask() markTaskHidden(freeformTask) @@ -1998,7 +1974,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_relaunchTask_enforceDesktop_freeformDisplay_noWinModeChange() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(context)).thenReturn(true) val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!! tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FREEFORM @@ -2013,7 +1988,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_relaunchTask_enforceDesktop_fullscreenDisplay_becomesUndefined() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.enterDesktopByDefaultOnFreeformDisplay(context)).thenReturn(true) val tda = rootTaskDisplayAreaOrganizer.getDisplayAreaInfo(DEFAULT_DISPLAY)!! tda.configuration.windowConfiguration.windowingMode = WINDOWING_MODE_FULLSCREEN @@ -2030,8 +2004,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_desktopWallpaperDisabled_freeformNotVisible_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTask1 = setUpFreeformTask() val freeformTask2 = createFreeformTask() @@ -2047,8 +2019,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_desktopWallpaperEnabled_freeformNotVisible_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val freeformTask1 = setUpFreeformTask() val freeformTask2 = createFreeformTask() @@ -2069,8 +2039,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_desktopWallpaperDisabled_noOtherTasks_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val task = createFreeformTask() val result = controller.handleRequest(Binder(), createTransition(task)) @@ -2082,8 +2050,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_desktopWallpaperEnabled_noOtherTasks_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val task = createFreeformTask() val result = controller.handleRequest(Binder(), createTransition(task)) @@ -2098,8 +2064,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_dskWallpaperDisabled_freeformOnOtherDisplayOnly_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val taskDefaultDisplay = createFreeformTask(displayId = DEFAULT_DISPLAY) // Second display task createFreeformTask(displayId = SECOND_DISPLAY) @@ -2114,8 +2078,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVITY) fun handleRequest_freeformTask_dskWallpaperEnabled_freeformOnOtherDisplayOnly_reorderedToTop() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val taskDefaultDisplay = createFreeformTask(displayId = DEFAULT_DISPLAY) // Second display task createFreeformTask(displayId = SECOND_DISPLAY) @@ -2132,7 +2094,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_alreadyInDesktop_noOverrideDensity_noConfigDensityChange() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.useDesktopOverrideDensity()).thenReturn(false) val freeformTask1 = setUpFreeformTask() @@ -2146,7 +2107,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_alreadyInDesktop_overrideDensity_hasConfigDensityChange() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(DesktopModeStatus.useDesktopOverrideDensity()).thenReturn(true) val freeformTask1 = setUpFreeformTask() @@ -2160,7 +2120,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_freeformTask_keyguardLocked_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) whenever(keyguardManager.isKeyguardLocked).thenReturn(true) val freeformTask = createFreeformTask(displayId = DEFAULT_DISPLAY) @@ -2171,8 +2130,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_notOpenOrToFrontTransition_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val task = TestRunningTaskInfoBuilder() .setActivityType(ACTIVITY_TYPE_STANDARD) @@ -2185,21 +2142,17 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun handleRequest_noTriggerTask_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) assertThat(controller.handleRequest(Binder(), createTransition(task = null))).isNull() } @Test fun handleRequest_triggerTaskNotStandard_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) val task = TestRunningTaskInfoBuilder().setActivityType(ACTIVITY_TYPE_HOME).build() assertThat(controller.handleRequest(Binder(), createTransition(task))).isNull() } @Test fun handleRequest_triggerTaskNotFullscreenOrFreeform_returnNull() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) - val task = TestRunningTaskInfoBuilder() .setActivityType(ACTIVITY_TYPE_STANDARD) @@ -3212,7 +3165,6 @@ class DesktopTasksControllerTest : ShellTestCase() { @Test fun snapToHalfScreen_snapBoundsWhenAlreadySnapped_animatesSurfaceWithoutWCT() { - assumeTrue(ENABLE_SHELL_TRANSITIONS) // Set up task to already be in snapped-left bounds val bounds = Rect( STABLE_BOUNDS.left, STABLE_BOUNDS.top, STABLE_BOUNDS.right / 2, STABLE_BOUNDS.bottom @@ -3848,14 +3800,11 @@ class DesktopTasksControllerTest : ShellTestCase() { handlerClass: Class? = null ): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) - if (ENABLE_SHELL_TRANSITIONS) { - if (handlerClass == null) { - verify(transitions).startTransition(eq(type), arg.capture(), isNull()) - } else { - verify(transitions).startTransition(eq(type), arg.capture(), isA(handlerClass)) - } + + if (handlerClass == null) { + verify(transitions).startTransition(eq(type), arg.capture(), isNull()) } else { - verify(shellTaskOrganizer).applyTransaction(arg.capture()) + verify(transitions).startTransition(eq(type), arg.capture(), isA(handlerClass)) } return arg.value } @@ -3865,43 +3814,27 @@ class DesktopTasksControllerTest : ShellTestCase() { ): WindowContainerTransaction { val arg: ArgumentCaptor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) - if (ENABLE_SHELL_TRANSITIONS) { - verify(toggleResizeDesktopTaskTransitionHandler, atLeastOnce()) + verify(toggleResizeDesktopTaskTransitionHandler, atLeastOnce()) .startTransition(capture(arg), eq(currentBounds)) - } else { - verify(shellTaskOrganizer).applyTransaction(capture(arg)) - } return arg.value } private fun getLatestEnterDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) - if (ENABLE_SHELL_TRANSITIONS) { - verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) - } else { - verify(shellTaskOrganizer).applyTransaction(arg.capture()) - } + verify(enterDesktopTransitionHandler).moveToDesktop(arg.capture(), any()) return arg.value } private fun getLatestDragToDesktopWct(): WindowContainerTransaction { val arg: ArgumentCaptor = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) - if (ENABLE_SHELL_TRANSITIONS) { - verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(capture(arg)) - } else { - verify(shellTaskOrganizer).applyTransaction(capture(arg)) - } + verify(dragToDesktopTransitionHandler).finishDragToDesktopTransition(capture(arg)) return arg.value } private fun getLatestExitDesktopWct(): WindowContainerTransaction { val arg = ArgumentCaptor.forClass(WindowContainerTransaction::class.java) - if (ENABLE_SHELL_TRANSITIONS) { - verify(exitDesktopTransitionHandler).startTransition(any(), arg.capture(), any(), any()) - } else { - verify(shellTaskOrganizer).applyTransaction(arg.capture()) - } + verify(exitDesktopTransitionHandler).startTransition(any(), arg.capture(), any(), any()) return arg.value } @@ -3909,27 +3842,15 @@ class DesktopTasksControllerTest : ShellTestCase() { wct.changes[task.token.asBinder()]?.configuration?.windowConfiguration?.bounds private fun verifyWCTNotExecuted() { - if (ENABLE_SHELL_TRANSITIONS) { - verify(transitions, never()).startTransition(anyInt(), any(), isNull()) - } else { - verify(shellTaskOrganizer, never()).applyTransaction(any()) - } + verify(transitions, never()).startTransition(anyInt(), any(), isNull()) } private fun verifyExitDesktopWCTNotExecuted() { - if (ENABLE_SHELL_TRANSITIONS) { - verify(exitDesktopTransitionHandler, never()).startTransition(any(), any(), any(), any()) - } else { - verify(shellTaskOrganizer, never()).applyTransaction(any()) - } + verify(exitDesktopTransitionHandler, never()).startTransition(any(), any(), any(), any()) } private fun verifyEnterDesktopWCTNotExecuted() { - if (ENABLE_SHELL_TRANSITIONS) { - verify(enterDesktopTransitionHandler, never()).moveToDesktop(any(), any()) - } else { - verify(shellTaskOrganizer, never()).applyTransaction(any()) - } + verify(enterDesktopTransitionHandler, never()).moveToDesktop(any(), any()) } private fun createTransition( -- GitLab From ea18b6d174ffbbded5d6755985a59cfdf3a30380 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Tue, 22 Oct 2024 11:28:13 +0200 Subject: [PATCH 206/459] Introduce Modifier.drawInContainer() and .drawInOverlay() (1/2) This CL introduces 3 new modifiers: - Modifier.container() to define a container in which composables can be drawn. - Modifier.drawInContainer() to conditionally draw a composable in a container. - Modifier.drawInOverlay() to draw a composable in an Android overlay, i.e. above everything. Most of the logic in DrawInContainer.kt was forked from AndroidX implementation of RenderInTransitionOverlayNodeElement.kt [1]. I decided to change the name "overlay" there to "container" to avoid confusing them with Android overlays or even SceneTransitionLayout overlays. The drawInOverlay() modifier is currently a @Composable factory because of b/374907972. [1] http://shortn/_hUx8cyTKAw Bug: 373799480 Test: atest DrawInContainerScreenshotTest Flag: com.android.systemui.scene_container Change-Id: I415c6079e8ac8cf28804ca0fef350dc5d66b3609 --- .../compose/ui/graphics/DrawInContainer.kt | 199 ++++++++++++++++++ .../compose/ui/graphics/DrawInOverlay.kt | 79 +++++++ 2 files changed, 278 insertions(+) create mode 100644 packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInContainer.kt create mode 100644 packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInOverlay.kt diff --git a/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInContainer.kt b/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInContainer.kt new file mode 100644 index 000000000000..311519122312 --- /dev/null +++ b/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInContainer.kt @@ -0,0 +1,199 @@ +/* + * 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.compose.ui.graphics + +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.drawWithContent +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.graphics.drawscope.ContentDrawScope +import androidx.compose.ui.graphics.drawscope.DrawScope +import androidx.compose.ui.graphics.drawscope.clipPath +import androidx.compose.ui.graphics.drawscope.translate +import androidx.compose.ui.graphics.layer.GraphicsLayer +import androidx.compose.ui.graphics.layer.drawLayer +import androidx.compose.ui.layout.LayoutCoordinates +import androidx.compose.ui.layout.layout +import androidx.compose.ui.layout.positionInWindow +import androidx.compose.ui.modifier.ModifierLocalModifierNode +import androidx.compose.ui.node.DrawModifierNode +import androidx.compose.ui.node.ModifierNodeElement +import androidx.compose.ui.node.requireDensity +import androidx.compose.ui.node.requireGraphicsContext +import androidx.compose.ui.node.requireLayoutCoordinates +import androidx.compose.ui.unit.Density +import androidx.compose.ui.unit.LayoutDirection +import androidx.compose.ui.util.fastForEach + +/** + * Define this as a container into which other composables can be drawn using [drawInContainer]. + * + * The elements redirected to this container will be drawn above the content of this composable. + */ +fun Modifier.container(state: ContainerState): Modifier { + return layout { measurable, constraints -> + val p = measurable.measure(constraints) + layout(p.width, p.height) { + val coords = coordinates + if (coords != null && !isLookingAhead) { + state.lastCoords = coords + } + + p.place(0, 0) + } + } + .drawWithContent { + drawContent() + state.drawInOverlay(this) + } +} + +/** + * Draw this composable into the container associated to [state]. + * + * @param state the state of the container into which we should draw this composable. + * @param enabled whether the redirection of the drawing to the container is enabled. + * @param zIndex the z-index of the composable in the container. + * @param clipPath the clip path applied when drawing this composable into the container. + */ +fun Modifier.drawInContainer( + state: ContainerState, + enabled: () -> Boolean = { true }, + zIndex: Float = 0f, + clipPath: (LayoutDirection, Density) -> Path? = { _, _ -> null }, +): Modifier { + return this.then( + DrawInContainerElement( + state = state, + enabled = enabled, + zIndex = zIndex, + clipPath = clipPath, + ) + ) +} + +class ContainerState { + private var renderers = mutableStateListOf() + internal var lastCoords: LayoutCoordinates? = null + + internal fun onLayerRendererAttached(renderer: LayerRenderer) { + renderers.add(renderer) + renderers.sortBy { it.zIndex } + } + + internal fun onLayerRendererDetached(renderer: LayerRenderer) { + renderers.remove(renderer) + } + + internal fun drawInOverlay(drawScope: DrawScope) { + renderers.fastForEach { it.drawInOverlay(drawScope) } + } +} + +internal interface LayerRenderer { + val zIndex: Float + + fun drawInOverlay(drawScope: DrawScope) +} + +private data class DrawInContainerElement( + var state: ContainerState, + var enabled: () -> Boolean, + val zIndex: Float, + val clipPath: (LayoutDirection, Density) -> Path?, +) : ModifierNodeElement() { + override fun create(): DrawInContainerNode { + return DrawInContainerNode(state, enabled, zIndex, clipPath) + } + + override fun update(node: DrawInContainerNode) { + node.state = state + node.enabled = enabled + node.zIndex = zIndex + node.clipPath = clipPath + } +} + +/** + * The implementation of [drawInContainer]. + * + * Note: this was forked from AndroidX RenderInTransitionOverlayNodeElement.kt + * (http://shortn/_3dfSFPbm8f). + */ +internal class DrawInContainerNode( + var state: ContainerState, + var enabled: () -> Boolean = { true }, + zIndex: Float = 0f, + var clipPath: (LayoutDirection, Density) -> Path? = { _, _ -> null }, +) : Modifier.Node(), DrawModifierNode, ModifierLocalModifierNode { + var zIndex by mutableFloatStateOf(zIndex) + + private inner class LayerWithRenderer(val layer: GraphicsLayer) : LayerRenderer { + override val zIndex: Float + get() = this@DrawInContainerNode.zIndex + + override fun drawInOverlay(drawScope: DrawScope) { + if (enabled()) { + with(drawScope) { + val containerCoords = + checkNotNull(state.lastCoords) { "container is not placed" } + val (x, y) = + requireLayoutCoordinates().positionInWindow() - + containerCoords.positionInWindow() + val clipPath = clipPath(layoutDirection, requireDensity()) + if (clipPath != null) { + clipPath(clipPath) { translate(x, y) { drawLayer(layer) } } + } else { + translate(x, y) { drawLayer(layer) } + } + } + } + } + } + + // Render in-place logic. Depending on the result of `renderInOverlay()`, the content will + // either render in-place or in the overlay, but never in both places. + override fun ContentDrawScope.draw() { + val layer = requireNotNull(layer) { "Error: layer never initialized" } + layer.record { this@draw.drawContent() } + if (!enabled()) { + drawLayer(layer) + } + } + + val layer: GraphicsLayer? + get() = layerWithRenderer?.layer + + private var layerWithRenderer: LayerWithRenderer? = null + + override fun onAttach() { + LayerWithRenderer(requireGraphicsContext().createGraphicsLayer()).let { + state.onLayerRendererAttached(it) + layerWithRenderer = it + } + } + + override fun onDetach() { + layerWithRenderer?.let { + state.onLayerRendererDetached(it) + requireGraphicsContext().releaseGraphicsLayer(it.layer) + } + } +} diff --git a/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInOverlay.kt b/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInOverlay.kt new file mode 100644 index 000000000000..f5c3a834a8d7 --- /dev/null +++ b/packages/SystemUI/compose/core/src/com/android/compose/ui/graphics/DrawInOverlay.kt @@ -0,0 +1,79 @@ +/* + * 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.compose.ui.graphics + +import android.view.View +import android.view.ViewGroupOverlay +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect +import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCompositionContext +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.unit.IntSize +import androidx.lifecycle.findViewTreeLifecycleOwner +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.lifecycle.setViewTreeLifecycleOwner +import androidx.lifecycle.setViewTreeViewModelStoreOwner +import androidx.savedstate.findViewTreeSavedStateRegistryOwner +import androidx.savedstate.setViewTreeSavedStateRegistryOwner + +/** + * Draw this composable in the [overlay][ViewGroupOverlay] of the [current ComposeView][LocalView]. + */ +@Composable +fun Modifier.drawInOverlay(): Modifier { + val containerState = remember { ContainerState() } + val context = LocalContext.current + val localView = LocalView.current + val compositionContext = rememberCompositionContext() + val displayMetrics = context.resources.displayMetrics + val displaySize = IntSize(displayMetrics.widthPixels, displayMetrics.heightPixels) + + DisposableEffect(containerState, context, localView, compositionContext, displaySize) { + val overlay = localView.rootView.overlay as ViewGroupOverlay + val view = + ComposeView(context).apply { + setParentCompositionContext(compositionContext) + + // Set the owners. + setViewTreeLifecycleOwner(localView.findViewTreeLifecycleOwner()) + setViewTreeViewModelStoreOwner(localView.findViewTreeViewModelStoreOwner()) + setViewTreeSavedStateRegistryOwner(localView.findViewTreeSavedStateRegistryOwner()) + + setContent { Box(Modifier.fillMaxSize().container(containerState)) } + } + + overlay.add(view) + + // Make the ComposeView as big as the display. We have to manually measure and layout the + // View given that there is no layout pass in Android overlays. + view.measure( + View.MeasureSpec.makeSafeMeasureSpec(displaySize.width, View.MeasureSpec.EXACTLY), + View.MeasureSpec.makeSafeMeasureSpec(displaySize.height, View.MeasureSpec.EXACTLY), + ) + view.layout(0, 0, displaySize.width, displaySize.height) + + onDispose { overlay.remove(view) } + } + + return this.drawInContainer(containerState, enabled = { true }) +} -- GitLab From fb64dbe4cb8c0c981f8d9a1e76605bc03295e191 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Tue, 22 Oct 2024 17:18:27 +0800 Subject: [PATCH 207/459] Abort transition for invisible background launch In case there won't be any operation to resume top activity to invoke transition#setReady. Bug: 370682768 Bug: 372405077 Flag: EXEMPT bugfix Test: Start a new task with ActivityOptions#setAvoidMoveToFront. There won't be transition timeout. Change-Id: I703534666727bb6c720cb3e099bc42722dcc6b16 --- .../core/java/com/android/server/wm/ActivityStarter.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5d3ae54f0934..9fda1931b832 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1760,6 +1760,13 @@ class ActivityStarter { startedActivityRootTask.setAlwaysOnTop(true); } + if (isIndependentLaunch && !mDoResume && avoidMoveToFront() && !mTransientLaunch + && !started.shouldBeVisible(true /* ignoringKeyguard */)) { + Slog.i(TAG, "Abort " + transition + " of invisible launch " + started); + transition.abort(); + return startedActivityRootTask; + } + // If there is no state change (e.g. a resumed activity is reparented to top of // another display) to trigger a visibility/configuration checking, we have to // update the configuration for changing to different display. -- GitLab From 897bdc09dcfef53063746a158b25603174f32a1f Mon Sep 17 00:00:00 2001 From: Norman Bintang Date: Tue, 22 Oct 2024 12:35:16 +0800 Subject: [PATCH 208/459] audio: VolumeDialog: Hide ringer button in single volume mode While in singleVolume mode, the ringer mode can't be changed [1]. But the VolumeDialog is still showing it, and it doesn't work. [1] https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/services/core/java/com/android/server/audio/AudioService.java;l=5687;drc=e7e6ec868a3277517795e77976186fc0dfed9365 Bug: 374870615 Test: press volume keys, see the ringer mode is not shown Flag: com.android.systemui.hide_ringer_button_in_single_volume_mode Change-Id: I30508096593084f0e036c2c800c67b6db953a8d1 --- packages/SystemUI/aconfig/systemui.aconfig | 10 ++++++ .../systemui/volume/VolumeDialogImpl.java | 33 +++++++++++++++++-- 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index a984b7d43bb6..1c29db128a8c 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1558,6 +1558,16 @@ flag { } } +flag { + name: "hide_ringer_button_in_single_volume_mode" + namespace: "systemui" + description: "When the device is in single volume mode, hide the ringer button because it doesn't work" + bug: "374870615" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "qs_tile_detailed_view" namespace: "systemui" diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 3d2ebf29cbb9..07509e6368fb 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -64,6 +64,8 @@ import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.RotateDrawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; import android.media.AudioManager; import android.media.AudioSystem; import android.os.Debug; @@ -115,6 +117,7 @@ import com.android.internal.jank.InteractionJankMonitor; import com.android.internal.view.RotationPolicy; import com.android.settingslib.Utils; import com.android.systemui.Dumpable; +import com.android.systemui.Flags; import com.android.systemui.Prefs; import com.android.systemui.dump.DumpManager; import com.android.systemui.haptics.slider.HapticSliderViewBinder; @@ -656,6 +659,11 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, mRingerIcon = mRinger.findViewById(R.id.ringer_icon); } + if (Flags.hideRingerButtonInSingleVolumeMode() && AudioSystem.isSingleVolume(mContext)) { + mRingerAndDrawerContainer.setVisibility(INVISIBLE); + mRinger.setVisibility(INVISIBLE); + } + mSelectedRingerIcon = mDialog.findViewById(R.id.volume_new_ringer_active_icon); mSelectedRingerContainer = mDialog.findViewById( R.id.volume_new_ringer_active_icon_container); @@ -2341,10 +2349,31 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, return; } - final ColorDrawable solidDrawable = new ColorDrawable( + LayerDrawable background; + // mRingerAndDrawerContainer has rounded corner. + // But when it's not visible, mTopContainer needs to have rounded corner. + if (Flags.hideRingerButtonInSingleVolumeMode() + && mRingerAndDrawerContainer.getVisibility() != VISIBLE + ) { + float[] radius = new float[] { + mDialogCornerRadius, mDialogCornerRadius, // Top-left corner + mDialogCornerRadius, mDialogCornerRadius, // Top-right corner + 0, 0, // Bottom-right corner + 0, 0 // Bottom-left corner + }; + + ShapeDrawable roundedDrawable = new ShapeDrawable( + new RoundRectShape(radius, null, null)); + roundedDrawable.getPaint().setColor(Utils.getColorAttrDefaultColor( + mContext, com.android.internal.R.attr.colorSurface)); + + background = new LayerDrawable(new Drawable[] { roundedDrawable }); + } else { + final ColorDrawable solidDrawable = new ColorDrawable( Utils.getColorAttrDefaultColor(mContext, com.android.internal.R.attr.colorSurface)); - final LayerDrawable background = new LayerDrawable(new Drawable[] { solidDrawable }); + background = new LayerDrawable(new Drawable[] { solidDrawable }); + } // Size the solid color to match the primary volume row. In landscape, extend it upwards // slightly so that it fills in the bottom corners of the ringer icon, whose background is -- GitLab From 1162c8af2a2e65db2d5981986a31c7fd227299cc Mon Sep 17 00:00:00 2001 From: Vania Desmonda Date: Tue, 22 Oct 2024 14:56:16 +0000 Subject: [PATCH 209/459] Add a new flag for enable_task_resizing_keyboard_shortcuts. Change-Id: I23ec8322dc9298e507690c06901358318b6626ae Flag: EXEMPT adding a new flag Test: EXEMPT adding a new flag Bug: 335819608 --- .../android/window/flags/lse_desktop_experience.aconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig index 0bcc9c1f58c5..a0d58d5a0c76 100644 --- a/core/java/android/window/flags/lse_desktop_experience.aconfig +++ b/core/java/android/window/flags/lse_desktop_experience.aconfig @@ -348,3 +348,10 @@ flag { description: "Enables a switch to change the concequence of dragging a window to the top edge." bug: "372614715" } + +flag { + name: "enable_task_resizing_keyboard_shortcuts" + namespace: "lse_desktop_experience" + description: "Enables keyboard shortcuts for resizing tasks in desktop mode." + bug: "335819608" +} -- GitLab From 5c4e6576cf572cf0b4572d66e1c1c09bec78318e Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Fri, 18 Oct 2024 23:22:39 +0100 Subject: [PATCH 210/459] Using success animation from state instead of configuration For back gesture we need runtime-provided success animation. Removing success animation from config - it's no longer needed there. Bug: 369817369 Test: still only refactoring Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: Idcb1e10b79a63dbc65f6bf10e8b7581ccf6703d2 --- .../tutorial/ui/composable/ActionKeyTutorialScreen.kt | 8 ++------ .../tutorial/ui/composable/ActionTutorialContent.kt | 9 +++++---- .../tutorial/ui/composable/TutorialAnimation.kt | 9 ++++++--- .../tutorial/ui/composable/TutorialScreenConfig.kt | 9 +++------ .../tutorial/ui/composable/BackGestureTutorialScreen.kt | 6 +----- .../tutorial/ui/composable/GestureTutorialScreen.kt | 2 +- .../tutorial/ui/composable/HomeGestureTutorialScreen.kt | 6 +----- .../ui/composable/RecentAppsGestureTutorialScreen.kt | 5 +---- 8 files changed, 20 insertions(+), 34 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt index 4142be3f9358..058e5874ae7c 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionKeyTutorialScreen.kt @@ -52,7 +52,7 @@ fun ActionKeyTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) Modifier.fillMaxSize() .onKeyEvent { keyEvent: KeyEvent -> if (keyEvent.key == Key.MetaLeft && keyEvent.type == KeyEventType.KeyUp) { - actionState = Finished + actionState = Finished(R.raw.action_key_success) } true } @@ -80,11 +80,7 @@ private fun buildScreenConfig() = titleSuccessResId = R.string.tutorial_action_key_success_title, bodySuccessResId = R.string.tutorial_action_key_success_body, ), - animations = - TutorialScreenConfig.Animations( - educationResId = R.raw.action_key_edu, - successResId = R.raw.action_key_success, - ), + animations = TutorialScreenConfig.Animations(educationResId = R.raw.action_key_edu), ) @Composable diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt index 8e01e3765c32..3d2baee9b936 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/ActionTutorialContent.kt @@ -16,6 +16,7 @@ package com.android.systemui.inputdevice.tutorial.ui.composable +import androidx.annotation.RawRes import androidx.annotation.StringRes import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -48,7 +49,7 @@ sealed interface TutorialActionState { val endMarker: String? = null, ) : TutorialActionState - data object Finished : TutorialActionState + data class Finished(@RawRes val successAnimation: Int) : TutorialActionState } @Composable @@ -68,11 +69,11 @@ fun ActionTutorialContent( Row(modifier = Modifier.fillMaxWidth().weight(1f)) { TutorialDescription( titleTextId = - if (actionState == Finished) config.strings.titleSuccessResId + if (actionState is Finished) config.strings.titleSuccessResId else config.strings.titleResId, titleColor = config.colors.title, bodyTextId = - if (actionState == Finished) config.strings.bodySuccessResId + if (actionState is Finished) config.strings.bodySuccessResId else config.strings.bodyResId, modifier = Modifier.weight(1f), ) @@ -83,7 +84,7 @@ fun ActionTutorialContent( modifier = Modifier.weight(1f).padding(top = 8.dp), ) } - AnimatedVisibility(visible = actionState == Finished, enter = fadeIn()) { + AnimatedVisibility(visible = actionState is Finished, enter = fadeIn()) { DoneButton(onDoneButtonClicked = onDoneButtonClicked) } } diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialAnimation.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialAnimation.kt index ef375a868cef..720c01fc7056 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialAnimation.kt @@ -77,7 +77,9 @@ fun TutorialAnimation( config.colors.animationColors, ) Finished::class -> - SuccessAnimation(config.animations.successResId, config.colors.animationColors) + // Below cast is safe as Finished state is the last state and afterwards we can + // only leave the screen so this composable would be no longer displayed + SuccessAnimation(actionState as Finished, config.colors.animationColors) } } } @@ -100,10 +102,11 @@ private fun EducationAnimation( @Composable private fun SuccessAnimation( - @RawRes successAnimationId: Int, + finishedState: Finished, animationProperties: LottieDynamicProperties, ) { - val composition by rememberLottieComposition(LottieCompositionSpec.RawRes(successAnimationId)) + val composition by + rememberLottieComposition(LottieCompositionSpec.RawRes(finishedState.successAnimation)) val progress by animateLottieCompositionAsState(composition, iterations = 1) LottieAnimation( composition = composition, diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt index 55e5f2d79e60..60dfed3a67a4 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/composable/TutorialScreenConfig.kt @@ -24,13 +24,13 @@ import com.airbnb.lottie.compose.LottieDynamicProperties data class TutorialScreenConfig( val colors: Colors, val strings: Strings, - val animations: Animations + val animations: Animations, ) { data class Colors( val background: Color, val title: Color, - val animationColors: LottieDynamicProperties + val animationColors: LottieDynamicProperties, ) data class Strings( @@ -40,8 +40,5 @@ data class TutorialScreenConfig( @StringRes val bodySuccessResId: Int, ) - data class Animations( - @RawRes val educationResId: Int, - @RawRes val successResId: Int, - ) + data class Animations(@RawRes val educationResId: Int) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index 618722a79a6f..2337ec1801d7 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -44,11 +44,7 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni titleSuccessResId = R.string.touchpad_back_gesture_success_title, bodySuccessResId = R.string.touchpad_back_gesture_success_body, ), - animations = - TutorialScreenConfig.Animations( - educationResId = R.raw.trackpad_back_edu, - successResId = R.raw.trackpad_back_success, - ), + animations = TutorialScreenConfig.Animations(educationResId = R.raw.trackpad_back_edu), ) val recognizer = rememberBackGestureRecognizer(LocalContext.current.resources) val gestureUiState: Flow = diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt index 11e1ff49074a..e058527ffdbe 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt @@ -74,7 +74,7 @@ fun GestureUiState.toTutorialActionState(): TutorialActionState { NotStarted -> TutorialActionState.NotStarted // progress is disabled for now as views are not ready to handle varying progress is GestureUiState.InProgress -> TutorialActionState.InProgress(progress = 0f) - is Finished -> TutorialActionState.Finished + is Finished -> TutorialActionState.Finished(successAnimation) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 05871ce91e39..55749b2f3656 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -43,11 +43,7 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni titleSuccessResId = R.string.touchpad_home_gesture_success_title, bodySuccessResId = R.string.touchpad_home_gesture_success_body, ), - animations = - TutorialScreenConfig.Animations( - educationResId = R.raw.trackpad_home_edu, - successResId = R.raw.trackpad_home_success, - ), + animations = TutorialScreenConfig.Animations(educationResId = R.raw.trackpad_home_edu), ) val recognizer = rememberHomeGestureRecognizer(LocalContext.current.resources) val gestureUiState: Flow = diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index 4fd16448e9f2..d928535f721f 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -44,10 +44,7 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () bodySuccessResId = R.string.touchpad_recent_apps_gesture_success_body, ), animations = - TutorialScreenConfig.Animations( - educationResId = R.raw.trackpad_recent_apps_edu, - successResId = R.raw.trackpad_recent_apps_success, - ), + TutorialScreenConfig.Animations(educationResId = R.raw.trackpad_recent_apps_edu), ) val recognizer = rememberRecentAppsGestureRecognizer(LocalContext.current.resources) val gestureUiState: Flow = -- GitLab From 2c5c7d9bff7266528c5e183b90da37d989c36d52 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Mon, 21 Oct 2024 21:24:39 +0100 Subject: [PATCH 211/459] Adding optional gesture direction to gesture state Required as for live tracking of back gesture we need to know which direction user is swiping. Bug: 369817369 Test: BackGestureRecognizerTest Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: Ib83da984155b53970373e8ad110168f4be556170 --- .../ui/gesture/BackGestureRecognizerTest.kt | 41 +++++++++++++++---- .../ui/gesture/BackGestureRecognizer.kt | 11 ++++- .../tutorial/ui/gesture/GestureState.kt | 8 +++- .../ui/gesture/GestureStateUpdates.kt | 4 +- .../ui/gesture/HomeGestureRecognizer.kt | 3 +- .../ui/gesture/RecentAppsGestureRecognizer.kt | 4 +- 6 files changed, 57 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt index 29e9ba752b36..d9d81692e2b6 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizerTest.kt @@ -20,6 +20,8 @@ import android.view.MotionEvent import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.LEFT +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.RIGHT import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.Finished import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.NotStarted @@ -61,23 +63,46 @@ class BackGestureRecognizerTest : SysuiTestCase() { } @Test - fun triggersProgressRelativeToDistance() { - assertProgressWhileMovingFingers(deltaX = -SWIPE_DISTANCE / 2, expectedProgress = 0.5f) - assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE / 2, expectedProgress = 0.5f) - assertProgressWhileMovingFingers(deltaX = -SWIPE_DISTANCE, expectedProgress = 1f) - assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE, expectedProgress = 1f) + fun triggersProgressRelativeToDistanceWhenSwipingLeft() { + assertProgressWhileMovingFingers( + deltaX = -SWIPE_DISTANCE / 2, + expected = InProgress(progress = 0.5f, direction = LEFT), + ) + assertProgressWhileMovingFingers( + deltaX = -SWIPE_DISTANCE, + expected = InProgress(progress = 1f, direction = LEFT), + ) } - private fun assertProgressWhileMovingFingers(deltaX: Float, expectedProgress: Float) { + @Test + fun triggersProgressRelativeToDistanceWhenSwipingRight() { + assertProgressWhileMovingFingers( + deltaX = SWIPE_DISTANCE / 2, + expected = InProgress(progress = 0.5f, direction = RIGHT), + ) + assertProgressWhileMovingFingers( + deltaX = SWIPE_DISTANCE, + expected = InProgress(progress = 1f, direction = RIGHT), + ) + } + + private fun assertProgressWhileMovingFingers(deltaX: Float, expected: InProgress) { assertStateAfterEvents( events = ThreeFingerGesture.eventsForGestureInProgress { move(deltaX = deltaX) }, - expectedState = InProgress(progress = expectedProgress), + expectedState = expected, ) } @Test fun triggeredProgressIsNoBiggerThanOne() { - assertProgressWhileMovingFingers(deltaX = SWIPE_DISTANCE * 2, expectedProgress = 1f) + assertProgressWhileMovingFingers( + deltaX = SWIPE_DISTANCE * 2, + expected = InProgress(progress = 1f, direction = RIGHT), + ) + assertProgressWhileMovingFingers( + deltaX = -SWIPE_DISTANCE * 2, + expected = InProgress(progress = 1f, direction = LEFT), + ) } @Test diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt index 024048cbbb24..35ea0ea3e048 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/BackGestureRecognizer.kt @@ -18,6 +18,9 @@ package com.android.systemui.touchpad.tutorial.ui.gesture import android.util.MathUtils import android.view.MotionEvent +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.LEFT +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection.RIGHT +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress import kotlin.math.abs /** @@ -44,7 +47,13 @@ class BackGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu gestureStateChangedCallback, gestureState, isFinished = { abs(it.deltaX) >= gestureDistanceThresholdPx }, - progress = { MathUtils.saturate(abs(it.deltaX / gestureDistanceThresholdPx)) }, + progress = ::getProgress, ) } + + private fun getProgress(it: Moving): InProgress { + val direction = if (it.deltaX > 0) RIGHT else LEFT + val value = MathUtils.saturate(abs(it.deltaX / gestureDistanceThresholdPx)) + return InProgress(value, direction) + } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt index b513c49371a4..f27ddb515c24 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureState.kt @@ -21,5 +21,11 @@ sealed interface GestureState { data object Finished : GestureState - data class InProgress(val progress: Float = 0f) : GestureState + data class InProgress(val progress: Float = 0f, val direction: GestureDirection? = null) : + GestureState +} + +enum class GestureDirection { + LEFT, + RIGHT, } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureStateUpdates.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureStateUpdates.kt index f19467726def..24f5d1f00794 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureStateUpdates.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/GestureStateUpdates.kt @@ -21,7 +21,7 @@ inline fun updateGestureState( gestureStateChangedCallback: (GestureState) -> Unit, gestureState: DistanceGestureState?, isFinished: (Finished) -> Boolean, - progress: (Moving) -> Float, + progress: (Moving) -> GestureState.InProgress, ) { when (gestureState) { is Finished -> { @@ -32,7 +32,7 @@ inline fun updateGestureState( } } is Moving -> { - gestureStateChangedCallback(GestureState.InProgress(progress(gestureState))) + gestureStateChangedCallback(progress(gestureState)) } is Started -> gestureStateChangedCallback(GestureState.InProgress()) else -> {} diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt index b804b9a0d4c7..e10b8253ebad 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/HomeGestureRecognizer.kt @@ -18,6 +18,7 @@ package com.android.systemui.touchpad.tutorial.ui.gesture import android.util.MathUtils import android.view.MotionEvent +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState.InProgress /** Recognizes touchpad home gesture, that is - using three fingers on touchpad - swiping up. */ class HomeGestureRecognizer(private val gestureDistanceThresholdPx: Int) : GestureRecognizer { @@ -40,7 +41,7 @@ class HomeGestureRecognizer(private val gestureDistanceThresholdPx: Int) : Gestu gestureStateChangedCallback, gestureState, isFinished = { -it.deltaY >= gestureDistanceThresholdPx }, - progress = { MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx) }, + progress = { InProgress(MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx)) }, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt index 7d484ee85b7c..c47888609a61 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/gesture/RecentAppsGestureRecognizer.kt @@ -54,7 +54,9 @@ class RecentAppsGestureRecognizer( -state.deltaY >= gestureDistanceThresholdPx && abs(velocityTracker.calculateVelocity().value) <= velocityThresholdPxPerMs }, - progress = { MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx) }, + progress = { + GestureState.InProgress(MathUtils.saturate(-it.deltaY / gestureDistanceThresholdPx)) + }, ) } } -- GitLab From 91580c0885060b9ba3091e7bd5628f7743952d45 Mon Sep 17 00:00:00 2001 From: Samer Naoura Date: Tue, 22 Oct 2024 15:45:07 +0000 Subject: [PATCH 212/459] Fix ANR in Process com.android.shell after BR is finished Linked to http://pa/2964369 Bug: 360800881 Fix: 360800881 Test: Watch: https://screenshot.googleplex.com/4hYd3RTfdUXU5mG https://screenshot.googleplex.com/6L4YkmCYey8sHL5, Phone: https://screenshot.googleplex.com/3GWMVACFivfukc7 Flag: EXEMPT minor bugfix Change-Id: I99443f172cf43bde9c3637e91a3af51859eb6f35 --- .../shell/BugreportProgressService.java | 26 +++++++++++++++---- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index bcfd8f620f9c..5a205f2e3165 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -30,7 +30,6 @@ import android.accounts.AccountManager; import android.annotation.MainThread; import android.annotation.Nullable; import android.annotation.SuppressLint; -import android.app.ActivityThread; import android.app.AlertDialog; import android.app.Notification; import android.app.Notification.Action; @@ -117,7 +116,9 @@ import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.Executor; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; @@ -174,6 +175,18 @@ public class BugreportProgressService extends Service { static final String EXTRA_EXTRA_ATTACHMENT_URI = "android.intent.extra.EXTRA_ATTACHMENT_URI"; + private static final ThreadFactory sBugreportManagerCallbackThreadFactory = + new ThreadFactory() { + private static final ThreadFactory mFactory = Executors.defaultThreadFactory(); + + @Override + public Thread newThread(Runnable r) { + Thread thread = mFactory.newThread(r); + thread.setName("BRMgrCallbackThread"); + return thread; + } + }; + private static final int MSG_SERVICE_COMMAND = 1; private static final int MSG_DELAYED_SCREENSHOT = 2; private static final int MSG_SCREENSHOT_REQUEST = 3; @@ -277,6 +290,7 @@ public class BugreportProgressService extends Service { private boolean mIsWatch; private boolean mIsTv; + private ExecutorService mBugreportSingleThreadExecutor; @Override public void onCreate() { @@ -307,6 +321,8 @@ public class BugreportProgressService extends Service { isTv(this) ? NotificationManager.IMPORTANCE_DEFAULT : NotificationManager.IMPORTANCE_LOW)); mBugreportManager = mContext.getSystemService(BugreportManager.class); + mBugreportSingleThreadExecutor = Executors.newSingleThreadExecutor( + sBugreportManagerCallbackThreadFactory); } @Override @@ -337,6 +353,7 @@ public class BugreportProgressService extends Service { public void onDestroy() { mServiceHandler.getLooper().quit(); mScreenshotHandler.getLooper().quit(); + mBugreportSingleThreadExecutor.close(); super.onDestroy(); } @@ -713,8 +730,6 @@ public class BugreportProgressService extends Service { } } - final Executor executor = ActivityThread.currentActivityThread().getExecutor(); - Log.i(TAG, "bugreport type = " + bugreportType + " bugreport file fd: " + bugreportFd + " screenshot file fd: " + screenshotFd); @@ -723,7 +738,8 @@ public class BugreportProgressService extends Service { try { synchronized (mLock) { mBugreportManager.startBugreport(bugreportFd, screenshotFd, - new BugreportParams(bugreportType), executor, bugreportCallback); + new BugreportParams(bugreportType), mBugreportSingleThreadExecutor, + bugreportCallback); bugreportCallback.trackInfoWithIdLocked(); } } catch (RuntimeException e) { -- GitLab From 7fa0d475b4006518afd9d0bcaa92ae234d6f1bc2 Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Tue, 22 Oct 2024 17:05:19 +0100 Subject: [PATCH 213/459] Add ValueAnimator#awaitAnimation to await animation Flag: com.android.systemui.volume_redesign Bug: 369992924 Test: N/A. Extends currently unused API Change-Id: I2726531e40fd7f59ccbfa3366c8d4126480f0051 --- .../dialog/ui/utils/SuspendAnimators.kt | 33 ++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt index 4eae3b9a8da5..c7f5801a87c2 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ui/utils/SuspendAnimators.kt @@ -17,8 +17,11 @@ package com.android.systemui.volume.dialog.ui.utils import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ValueAnimator import android.view.ViewPropertyAnimator import kotlin.coroutines.resume +import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.suspendCancellableCoroutine /** @@ -39,11 +42,12 @@ suspend fun ViewPropertyAnimator.suspendAnimate( } override fun onAnimationEnd(animation: Animator) { - continuation.resume(Unit) + continuation.resumeIfCan(Unit) animationListener?.onAnimationEnd(animation) } override fun onAnimationCancel(animation: Animator) { + continuation.resumeIfCan(Unit) animationListener?.onAnimationCancel(animation) } @@ -54,3 +58,30 @@ suspend fun ViewPropertyAnimator.suspendAnimate( ) continuation.invokeOnCancellation { this.cancel() } } + +/** + * Starts animation and suspends until it's finished. Cancels the animation if the running coroutine + * is cancelled. + */ +@Suppress("UNCHECKED_CAST") +suspend fun ValueAnimator.awaitAnimation(onValueChanged: (T) -> Unit) { + suspendCancellableCoroutine { continuation -> + addListener( + object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) = continuation.resumeIfCan(Unit) + + override fun onAnimationCancel(animation: Animator) = continuation.resumeIfCan(Unit) + } + ) + addUpdateListener { onValueChanged(it.animatedValue as T) } + + start() + continuation.invokeOnCancellation { cancel() } + } +} + +private fun CancellableContinuation.resumeIfCan(value: T) { + if (!isCancelled && !isCompleted) { + resume(value) + } +} -- GitLab From c7bd7ffb7489e21c8266dd10c4e1f4b981cea0f3 Mon Sep 17 00:00:00 2001 From: Gazal Agarwal Date: Mon, 14 Oct 2024 21:33:34 +0000 Subject: [PATCH 214/459] Delegate bugreport consent for system apps. For system apps with the required permission and an in-built consent page, the report will be approved and the bugreport consent popup will be skipped. Bug: 324046728 PWG consultation: b/285006273 Test: Build and flash image. Trigger the Send Feedback flow from settings. Ensure the OS bugreport consent popup is skipped. Check logs to verify consent was delegated. atest CtsRootBugreportTestCases Flag: android.os.allow_consentless_bugreport_delegated_consent Change-Id: I720531386a21f32e5dafcd4d9994d4a54c7921bc --- .../server/incident/PendingReports.java | 32 +++++++++++++++---- .../com/android/server/incident/TEST_MAPPING | 10 ++++++ 2 files changed, 36 insertions(+), 6 deletions(-) create mode 100644 services/core/java/com/android/server/incident/TEST_MAPPING diff --git a/services/core/java/com/android/server/incident/PendingReports.java b/services/core/java/com/android/server/incident/PendingReports.java index adcda0a63152..35b3673fdf77 100644 --- a/services/core/java/com/android/server/incident/PendingReports.java +++ b/services/core/java/com/android/server/incident/PendingReports.java @@ -304,16 +304,16 @@ class PendingReports { denyReportBeforeAddingRec(listener, callingPackage); return; } + AttributionSource attributionSource = + new AttributionSource.Builder(callingUid) + .setPackageName(callingPackage) + .build(); // Only with userdebug/eng build: it could check capture consentless bugreport permission // and approve the report when it's granted. boolean captureConsentlessBugreportOnUserdebugBuildGranted = false; if ((Build.IS_USERDEBUG || Build.IS_ENG) && (flags & IncidentManager.FLAG_ALLOW_CONSENTLESS_BUGREPORT) != 0) { - AttributionSource attributionSource = - new AttributionSource.Builder(callingUid) - .setPackageName(callingPackage) - .build(); captureConsentlessBugreportOnUserdebugBuildGranted = mPermissionManager.checkPermissionForDataDelivery( Manifest.permission.CAPTURE_CONSENTLESS_BUGREPORT_ON_USERDEBUG_BUILD, @@ -321,12 +321,32 @@ class PendingReports { /* message= */ null) == PERMISSION_GRANTED; } - if (captureConsentlessBugreportOnUserdebugBuildGranted) { + + // Allow system apps to skip the consent dialog and use their in-built consent mechanism + // instead. + boolean captureConsentlessBugreportDelegatedConsentGranted = false; + if ((flags & IncidentManager.FLAG_ALLOW_CONSENTLESS_BUGREPORT) != 0) { + captureConsentlessBugreportDelegatedConsentGranted = + mPermissionManager.checkPermissionForDataDelivery( + Manifest.permission + .CAPTURE_CONSENTLESS_BUGREPORT_DELEGATED_CONSENT, + attributionSource, + /* message= */ null) + == PERMISSION_GRANTED; + } + + if (captureConsentlessBugreportOnUserdebugBuildGranted + || captureConsentlessBugreportDelegatedConsentGranted) { try { PendingReportRec rec = new PendingReportRec( callingPackage, receiverClass, reportId, flags, listener); - Log.d(TAG, "approving consentless report: " + rec.getUri()); + if (captureConsentlessBugreportOnUserdebugBuildGranted) { + Log.d(TAG, "approving consentless report: " + rec.getUri()); + } + if (captureConsentlessBugreportDelegatedConsentGranted) { + Log.d(TAG, "delegating consent for report: " + rec.getUri()); + } listener.onReportApproved(); return; } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/incident/TEST_MAPPING b/services/core/java/com/android/server/incident/TEST_MAPPING new file mode 100644 index 000000000000..4f789dbba2b8 --- /dev/null +++ b/services/core/java/com/android/server/incident/TEST_MAPPING @@ -0,0 +1,10 @@ +{ + "postsubmit": [ + { + "name": "CtsRootBugreportTestCases" + }, + { + "name": "BugreportManagerTestCases" + } + ] +} \ No newline at end of file -- GitLab From 2c190cb02b94db14b208feee5cd3e0aff1d766ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Tue, 22 Oct 2024 18:21:16 +0200 Subject: [PATCH 215/459] Listen to alarm changes for all users in ScheduleConditionProvider Previously, the system was only registering for broadcasts on user 0 (SYSTEM) but AlarmManager sends broadcasts only to the user that owns the alarm that is changing. This meant that zen rules with "alarm can override end time" schedules didn't work correctly for secondary users (or for any users, in the case of HSUM). Fixes: 366141808 Test: atest ScheduleConditionProviderTest + manually Flag: android.app.modes_hsum Change-Id: I5f471522db22e8779a9837bbac340d0a7c2b60be --- .../ScheduleConditionProvider.java | 49 ++++-- .../ScheduleConditionProviderTest.java | 157 +++++++++++++++++- 2 files changed, 191 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java index 24b090c6ffab..734c61b6b2a8 100644 --- a/services/core/java/com/android/server/notification/ScheduleConditionProvider.java +++ b/services/core/java/com/android/server/notification/ScheduleConditionProvider.java @@ -42,6 +42,7 @@ import com.android.server.notification.NotificationManagerService.DumpFilter; import com.android.server.pm.PackageManagerService; import java.io.PrintWriter; +import java.time.Clock; import java.util.ArrayList; import java.util.Calendar; import java.util.List; @@ -62,6 +63,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { private static final String SCP_SETTING = "snoozed_schedule_condition_provider"; private final Context mContext = this; + private final Clock mClock; private final ArrayMap mSubscriptions = new ArrayMap<>(); @GuardedBy("mSnoozedForAlarm") private final ArraySet mSnoozedForAlarm = new ArraySet<>(); @@ -72,7 +74,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { private long mNextAlarmTime; public ScheduleConditionProvider() { + this(Clock.systemUTC()); + } + + @VisibleForTesting + ScheduleConditionProvider(Clock clock) { if (DEBUG) Slog.d(TAG, "new " + SIMPLE_NAME + "()"); + mClock = clock; } @Override @@ -86,7 +94,7 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { pw.print(" mConnected="); pw.println(mConnected); pw.print(" mRegistered="); pw.println(mRegistered); pw.println(" mSubscriptions="); - final long now = System.currentTimeMillis(); + final long now = mClock.millis(); synchronized (mSubscriptions) { for (Uri conditionId : mSubscriptions.keySet()) { pw.print(" "); @@ -117,7 +125,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { @Override public void onUserSwitched(UserHandle user) { - // Nothing to do because time-based schedules are not tied to any user data. + // Nothing to do here because evaluateSubscriptions() is called for the new configuration + // when users switch, and that will reevaluate the next alarm, which is the only piece that + // is user-dependent. } @Override @@ -151,12 +161,9 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } private void evaluateSubscriptions() { - if (mAlarmManager == null) { - mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); - } - final long now = System.currentTimeMillis(); + final long now = mClock.millis(); mNextAlarmTime = 0; - long nextUserAlarmTime = getNextAlarm(); + long nextUserAlarmTime = getNextAlarmClockAlarm(); List conditionsToNotify = new ArrayList<>(); synchronized (mSubscriptions) { setRegistered(!mSubscriptions.isEmpty()); @@ -232,7 +239,10 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); } - public long getNextAlarm() { + private long getNextAlarmClockAlarm() { + if (mAlarmManager == null) { + mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE); + } final AlarmManager.AlarmClockInfo info = mAlarmManager.getNextAlarmClock( ActivityManager.getCurrentUser()); return info != null ? info.getTriggerTime() : 0; @@ -252,8 +262,13 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); filter.addAction(ACTION_EVALUATE); filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); - registerReceiver(mReceiver, filter, - Context.RECEIVER_EXPORTED_UNAUDITED); + if (android.app.Flags.modesHsum()) { + registerReceiverForAllUsers(mReceiver, filter, /* broadcastPermission= */ null, + /* scheduler= */ null); + } else { + registerReceiver(mReceiver, filter, + Context.RECEIVER_EXPORTED_UNAUDITED); + } } else { unregisterReceiver(mReceiver); } @@ -327,10 +342,18 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } } - private BroadcastReceiver mReceiver = new BroadcastReceiver() { + private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Slog.d(TAG, "onReceive " + intent.getAction()); + if (android.app.Flags.modesHsum()) { + if (AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED.equals(intent.getAction()) + && getSendingUserId() != ActivityManager.getCurrentUser()) { + // A different user changed their next alarm. + return; + } + } + if (Intent.ACTION_TIMEZONE_CHANGED.equals(intent.getAction())) { synchronized (mSubscriptions) { for (Uri conditionId : mSubscriptions.keySet()) { @@ -345,4 +368,8 @@ public class ScheduleConditionProvider extends SystemConditionProviderService { } }; + @VisibleForTesting // otherwise = NONE + public ArrayMap getSubscriptions() { + return mSubscriptions; + } } diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java index fe4ce465e9be..52c34889a1ec 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java @@ -1,18 +1,38 @@ package com.android.server.notification; +import static android.app.AlarmManager.RTC_WAKEUP; + import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; +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 static java.time.temporal.ChronoUnit.HOURS; +import static java.time.temporal.ChronoUnit.MINUTES; +import android.app.ActivityManager; +import android.app.AlarmManager; import android.app.Application; import android.app.PendingIntent; +import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Intent; +import android.content.IntentFilter; import android.net.Uri; +import android.os.Bundle; +import android.os.SimpleClock; +import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.SetFlagsRule; import android.service.notification.Condition; import android.service.notification.ScheduleCalendar; import android.service.notification.ZenModeConfig; @@ -24,11 +44,20 @@ import androidx.test.filters.SmallTest; import com.android.server.UiServiceTestCase; import com.android.server.pm.PackageManagerService; +import com.google.common.collect.ImmutableList; + import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import java.time.Instant; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.util.Calendar; import java.util.GregorianCalendar; @@ -36,17 +65,22 @@ import java.util.GregorianCalendar; @SmallTest @RunWithLooper public class ScheduleConditionProviderTest extends UiServiceTestCase { + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); - ScheduleConditionProvider mService; + private ScheduleConditionProvider mService; + private TestClock mClock = new TestClock(); + @Mock private AlarmManager mAlarmManager; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); + mContext.addMockSystemService(AlarmManager.class, mAlarmManager); Intent startIntent = new Intent("com.android.server.notification.ScheduleConditionProvider"); startIntent.setPackage("android"); - ScheduleConditionProvider service = new ScheduleConditionProvider(); + ScheduleConditionProvider service = new ScheduleConditionProvider(mClock); service.attach( getContext(), null, // ActivityThread not actually used in Service @@ -57,7 +91,7 @@ public class ScheduleConditionProviderTest extends UiServiceTestCase { ); service.onCreate(); service.onBind(startIntent); - mService = spy(service); + mService = service; } @Test @@ -343,6 +377,87 @@ public class ScheduleConditionProviderTest extends UiServiceTestCase { assertEquals(PackageManagerService.PLATFORM_PACKAGE_NAME, pi.getIntent().getPackage()); } + @Test + @EnableFlags(android.app.Flags.FLAG_MODES_HSUM) + public void onSubscribe_registersReceiverForAllUsers() { + Calendar now = getNow(); + Uri condition = ZenModeConfig.toScheduleConditionId(getScheduleEndsInHour(now)); + + mService.onSubscribe(condition); + + ArgumentCaptor filterCaptor = ArgumentCaptor.forClass(IntentFilter.class); + verify(mContext).registerReceiverForAllUsers(any(), filterCaptor.capture(), any(), any()); + IntentFilter filter = filterCaptor.getValue(); + assertThat(filter.actionsIterator()).isNotNull(); + assertThat(ImmutableList.copyOf(filter.actionsIterator())) + .contains(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_MODES_HSUM) + public void onAlarmClockChanged_storesNextAlarm() { + Instant scheduleStart = Instant.parse("2024-10-22T16:00:00Z"); + Instant scheduleEnd = scheduleStart.plus(1, HOURS); + + Instant now = scheduleStart.plus(15, MINUTES); + mClock.setNowMillis(now.toEpochMilli()); + + Uri condition = ZenModeConfig.toScheduleConditionId( + getOneHourSchedule(scheduleStart.atZone(ZoneId.systemDefault()))); + mService.onSubscribe(condition); + + // Now prepare to send an "alarm set for 16:30" broadcast. + Instant alarm = scheduleStart.plus(30, MINUTES); + ArgumentCaptor receiverCaptor = ArgumentCaptor.forClass( + BroadcastReceiver.class); + verify(mContext).registerReceiverForAllUsers(receiverCaptor.capture(), any(), any(), any()); + BroadcastReceiver receiver = receiverCaptor.getValue(); + receiver.setPendingResult(pendingResultForUserBroadcast(ActivityManager.getCurrentUser())); + when(mAlarmManager.getNextAlarmClock(anyInt())).thenReturn( + new AlarmManager.AlarmClockInfo(alarm.toEpochMilli(), null)); + + Intent intent = new Intent(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); + receiver.onReceive(mContext, intent); + + // The time for the alarm was stored in the ScheduleCalendar, meaning the rule will end when + // the next evaluation after that point happens. + ScheduleCalendar scheduleCalendar = + mService.getSubscriptions().values().stream().findFirst().get(); + assertThat(scheduleCalendar.shouldExitForAlarm(alarm.toEpochMilli() - 1)).isFalse(); + assertThat(scheduleCalendar.shouldExitForAlarm(alarm.toEpochMilli() + 1)).isTrue(); + + // But the next wakeup is unchanged, at the time of the schedule end (17:00). + verify(mAlarmManager, times(2)).setExact(eq(RTC_WAKEUP), eq(scheduleEnd.toEpochMilli()), + any()); + } + + @Test + @EnableFlags(android.app.Flags.FLAG_MODES_HSUM) + public void onAlarmClockChanged_forAnotherUser_isIgnored() { + Instant scheduleStart = Instant.parse("2024-10-22T16:00:00Z"); + Instant now = scheduleStart.plus(15, MINUTES); + mClock.setNowMillis(now.toEpochMilli()); + + Uri condition = ZenModeConfig.toScheduleConditionId( + getOneHourSchedule(scheduleStart.atZone(ZoneId.systemDefault()))); + mService.onSubscribe(condition); + + // Now prepare to send an "alarm set for a different user" broadcast. + ArgumentCaptor receiverCaptor = ArgumentCaptor.forClass( + BroadcastReceiver.class); + verify(mContext).registerReceiverForAllUsers(receiverCaptor.capture(), any(), any(), any()); + BroadcastReceiver receiver = receiverCaptor.getValue(); + + reset(mAlarmManager); + int anotherUser = ActivityManager.getCurrentUser() + 1; + receiver.setPendingResult(pendingResultForUserBroadcast(anotherUser)); + Intent intent = new Intent(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED); + receiver.onReceive(mContext, intent); + + // The alarm data was not read. + verify(mAlarmManager, never()).getNextAlarmClock(anyInt()); + } + private Calendar getNow() { Calendar now = new GregorianCalendar(); now.set(Calendar.HOUR_OF_DAY, 14); @@ -363,4 +478,38 @@ public class ScheduleConditionProviderTest extends UiServiceTestCase { info.endMinute = now.get(Calendar.MINUTE); return info; } + + private static ZenModeConfig.ScheduleInfo getOneHourSchedule(ZonedDateTime start) { + ZenModeConfig.ScheduleInfo info = new ZenModeConfig.ScheduleInfo(); + // Note: DayOfWeek.MONDAY doesn't match Calendar.MONDAY + info.days = new int[] { (start.getDayOfWeek().getValue() % 7) + 1 }; + info.startHour = start.getHour(); + info.startMinute = start.getMinute(); + info.endHour = start.plusHours(1).getHour(); + info.endMinute = start.plusHours(1).getMinute(); + info.exitAtAlarm = true; + return info; + } + + private static BroadcastReceiver.PendingResult pendingResultForUserBroadcast(int userId) { + return new BroadcastReceiver.PendingResult(0, "", new Bundle(), 0, false, false, null, + userId, 0); + } + + private static class TestClock extends SimpleClock { + private long mNowMillis = 441644400000L; + + private TestClock() { + super(ZoneOffset.UTC); + } + + @Override + public long millis() { + return mNowMillis; + } + + private void setNowMillis(long millis) { + mNowMillis = millis; + } + } } -- GitLab From 0334e0e3c527052d2eafa735d1fa76e6bea1a860 Mon Sep 17 00:00:00 2001 From: Josh Date: Tue, 22 Oct 2024 14:10:46 +0000 Subject: [PATCH 216/459] Fixed mixup with keycode / modifier mapping. Keycode mapping and modifier mapping were done through the same function and same map, and this caused a conflict where KEYCODE_1 was being mapped as META_FN_ON. I've separated these two methods Test: ShortcutHelperCategoriesRepositoryTest Flag: com.android.systemui.keyboard_shortcut_helper_rewrite Fix: 372820099 Change-Id: If67ec7919d8dd24c519d5e4d64bd988cb9a07cf6 --- .../ShortcutHelperCategoriesRepositoryTest.kt | 77 +++++++++++++------ .../ShortcutHelperCategoriesRepository.kt | 40 ++++++---- .../data/repository/ShortcutHelperKeys.kt | 21 ++--- 3 files changed, 92 insertions(+), 46 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt index 6e883c24b5d2..9e20e7d0f98c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepositoryTest.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyboard.shortcut.data.repository import android.hardware.input.fakeInputManager +import android.view.KeyEvent.KEYCODE_1 import android.view.KeyEvent.KEYCODE_A import android.view.KeyEvent.KEYCODE_B import android.view.KeyEvent.KEYCODE_C @@ -24,6 +25,7 @@ import android.view.KeyEvent.KEYCODE_D import android.view.KeyEvent.KEYCODE_E import android.view.KeyEvent.KEYCODE_F import android.view.KeyEvent.KEYCODE_G +import android.view.KeyEvent.META_FUNCTION_ON import android.view.KeyboardShortcutGroup import android.view.KeyboardShortcutInfo import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -86,6 +88,48 @@ class ShortcutHelperCategoriesRepositoryTest : SysuiTestCase() { fakeMultiTaskingSource.setGroups(TestShortcuts.multitaskingGroups) } + @Test + fun categories_keycodeAndModifiersAreMappedSeparatelyWhenIdentical() = + testScope.runTest { + fakeSystemSource.setGroups(simpleGroup(simpleShortcutInfo(KEYCODE_1))) + + helper.toggle(deviceId = 123) + val categories by collectLastValue(repo.categories) + + val systemCategory = categories?.firstOrNull { it.type == ShortcutCategoryType.System } + + // Keycode 0x8 should be translated to the Key 1 instead of modifier FN + // which has the same keycode. + val expectedCategory = + ShortcutCategory( + type = ShortcutCategoryType.System, + simpleSubCategory(simpleShortcut("1")), + ) + + assertThat(systemCategory).isEqualTo(expectedCategory) + } + + @Test + fun categories_keyCodeAndModifierHaveSameCode_codesAreMappedCorrectly() = + testScope.runTest { + fakeSystemSource.setGroups(simpleGroup(simpleShortcutInfo(KEYCODE_1, META_FUNCTION_ON))) + + helper.toggle(deviceId = 123) + val categories by collectLastValue(repo.categories) + + val systemCategory = categories?.firstOrNull { it.type == ShortcutCategoryType.System } + + // Keycode 0x8 should be translated to the Key 1 instead of modifier FN + // which has the same keycode. while modifier mask 0x8 should be translated to FN. + val expectedCategory = + ShortcutCategory( + type = ShortcutCategoryType.System, + simpleSubCategory(simpleShortcut("Fn", "1")), + ) + + assertThat(systemCategory).isEqualTo(expectedCategory) + } + @Test fun categories_multipleSubscribers_replaysExistingValueToNewSubscribers() = testScope.runTest { @@ -111,24 +155,14 @@ class ShortcutHelperCategoriesRepositoryTest : SysuiTestCase() { testScope.runTest { fakeSystemSource.setGroups( listOf( - simpleGroup( - simpleShortcutInfo(KEYCODE_A), - simpleShortcutInfo(KEYCODE_B), - ), - simpleGroup( - simpleShortcutInfo(KEYCODE_C), - ), + simpleGroup(simpleShortcutInfo(KEYCODE_A), simpleShortcutInfo(KEYCODE_B)), + simpleGroup(simpleShortcutInfo(KEYCODE_C)), ) ) fakeMultiTaskingSource.setGroups( listOf( - simpleGroup( - simpleShortcutInfo(KEYCODE_D), - ), - simpleGroup( - simpleShortcutInfo(KEYCODE_E), - simpleShortcutInfo(KEYCODE_F), - ), + simpleGroup(simpleShortcutInfo(KEYCODE_D)), + simpleGroup(simpleShortcutInfo(KEYCODE_E), simpleShortcutInfo(KEYCODE_F)), ) ) fakeAppCategoriesSource.setGroups(listOf(simpleGroup(simpleShortcutInfo(KEYCODE_G)))) @@ -144,16 +178,11 @@ class ShortcutHelperCategoriesRepositoryTest : SysuiTestCase() { listOf( simpleSubCategory(simpleShortcut("B")), simpleSubCategory(simpleShortcut("C")), - ) + ), ), ShortcutCategory( ShortcutCategoryType.MultiTasking, - listOf( - simpleSubCategory( - simpleShortcut("E"), - simpleShortcut("F"), - ), - ) + listOf(simpleSubCategory(simpleShortcut("E"), simpleShortcut("F"))), ), ) } @@ -164,14 +193,14 @@ class ShortcutHelperCategoriesRepositoryTest : SysuiTestCase() { private fun simpleShortcut(vararg keys: String) = Shortcut( label = simpleShortcutLabel, - commands = listOf(ShortcutCommand(keys.map { ShortcutKey.Text(it) })) + commands = listOf(ShortcutCommand(keys.map { ShortcutKey.Text(it) })), ) private fun simpleGroup(vararg shortcuts: KeyboardShortcutInfo) = KeyboardShortcutGroup(simpleGroupLabel, shortcuts.asList()) - private fun simpleShortcutInfo(keyCode: Int = 0) = - KeyboardShortcutInfo(simpleShortcutLabel, keyCode, /* modifiers= */ 0) + private fun simpleShortcutInfo(keyCode: Int = 0, modifiers: Int = 0) = + KeyboardShortcutInfo(simpleShortcutLabel, keyCode, modifiers) private val simpleShortcutLabel = "shortcut label" private val simpleGroupLabel = "group label" diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepository.kt index 85bd0b0b1968..a08588750f85 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperCategoriesRepository.kt @@ -68,7 +68,7 @@ constructor( @InputShortcuts private val inputShortcutsSource: KeyboardShortcutGroupsSource, @CurrentAppShortcuts private val currentAppShortcutsSource: KeyboardShortcutGroupsSource, private val inputManager: InputManager, - stateRepository: ShortcutHelperStateRepository + stateRepository: ShortcutHelperStateRepository, ) { private val sources = @@ -76,27 +76,27 @@ constructor( InternalGroupsSource( source = systemShortcutsSource, isTrusted = true, - typeProvider = { System } + typeProvider = { System }, ), InternalGroupsSource( source = multitaskingShortcutsSource, isTrusted = true, - typeProvider = { MultiTasking } + typeProvider = { MultiTasking }, ), InternalGroupsSource( source = appCategoriesShortcutsSource, isTrusted = true, - typeProvider = { AppCategories } + typeProvider = { AppCategories }, ), InternalGroupsSource( source = inputShortcutsSource, isTrusted = false, - typeProvider = { InputMethodEditor } + typeProvider = { InputMethodEditor }, ), InternalGroupsSource( source = currentAppShortcutsSource, isTrusted = false, - typeProvider = { groups -> getCurrentAppShortcutCategoryType(groups) } + typeProvider = { groups -> getCurrentAppShortcutCategoryType(groups) }, ), ) @@ -179,7 +179,7 @@ constructor( shortcutGroup.items, keepIcons, supportedKeyCodes, - ) + ), ) } .filter { it.shortcuts.isNotEmpty() } @@ -214,13 +214,13 @@ constructor( return Shortcut( label = shortcutInfo.label!!.toString(), icon = toShortcutIcon(keepIcon, shortcutInfo), - commands = listOf(shortcutCommand) + commands = listOf(shortcutCommand), ) } private fun toShortcutIcon( keepIcon: Boolean, - shortcutInfo: KeyboardShortcutInfo + shortcutInfo: KeyboardShortcutInfo, ): ShortcutIcon? { if (!keepIcon) { return null @@ -236,13 +236,13 @@ constructor( private fun toShortcutCommand( keyCharacterMap: KeyCharacterMap, - info: KeyboardShortcutInfo + info: KeyboardShortcutInfo, ): ShortcutCommand? { val keys = mutableListOf() var remainingModifiers = info.modifiers SUPPORTED_MODIFIERS.forEach { supportedModifier -> if ((supportedModifier and remainingModifiers) != 0) { - keys += toShortcutKey(keyCharacterMap, supportedModifier) ?: return null + keys += toShortcutModifierKey(supportedModifier) ?: return null // "Remove" the modifier from the remaining modifiers remainingModifiers = remainingModifiers and supportedModifier.inv() } @@ -262,6 +262,20 @@ constructor( return ShortcutCommand(keys) } + private fun toShortcutModifierKey(modifierMask: Int): ShortcutKey? { + val iconResId = ShortcutHelperKeys.keyIcons[modifierMask] + if (iconResId != null) { + return ShortcutKey.Icon(iconResId) + } + + val modifierLabel = ShortcutHelperKeys.modifierLabels[modifierMask] + if (modifierLabel != null) { + return ShortcutKey.Text(modifierLabel(context)) + } + Log.wtf("TAG", "Couldn't find label or icon for modifier $modifierMask") + return null + } + private fun toShortcutKey( keyCharacterMap: KeyCharacterMap, keyCode: Int, @@ -289,7 +303,7 @@ constructor( private suspend fun fetchSupportedKeyCodes( deviceId: Int, - groupsFromAllSources: List> + groupsFromAllSources: List>, ): Set = withContext(backgroundDispatcher) { val allUsedKeyCodes = @@ -320,7 +334,7 @@ constructor( KeyEvent.META_ALT_ON, KeyEvent.META_SHIFT_ON, KeyEvent.META_SYM_ON, - KeyEvent.META_FUNCTION_ON + KeyEvent.META_FUNCTION_ON, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperKeys.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperKeys.kt index 8db16fa9a06e..288efa275219 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperKeys.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperKeys.kt @@ -124,6 +124,17 @@ object ShortcutHelperKeys { KEYCODE_RECENT_APPS to R.drawable.ic_check_box_outline_blank, ) + val modifierLabels = + mapOf String>( + // Modifiers + META_META_ON to { "Meta" }, + META_CTRL_ON to { "Ctrl" }, + META_ALT_ON to { "Alt" }, + META_SHIFT_ON to { "Shift" }, + META_SYM_ON to { "Sym" }, + META_FUNCTION_ON to { "Fn" }, + ) + val specialKeyLabels = mapOf String>( KEYCODE_HOME to { context -> context.getString(R.string.keyboard_key_home) }, @@ -317,7 +328,7 @@ object ShortcutHelperKeys { { context -> context.getString( R.string.keyboard_key_numpad_template, - context.getString(R.string.keyboard_key_enter) + context.getString(R.string.keyboard_key_enter), ) }, KEYCODE_NUMPAD_EQUALS to @@ -343,13 +354,5 @@ object ShortcutHelperKeys { KEYCODE_CTRL_RIGHT to { "Ctrl" }, KEYCODE_SHIFT_LEFT to { "Shift" }, KEYCODE_SHIFT_RIGHT to { "Shift" }, - - // Modifiers - META_META_ON to { "Meta" }, - META_CTRL_ON to { "Ctrl" }, - META_ALT_ON to { "Alt" }, - META_SHIFT_ON to { "Shift" }, - META_SYM_ON to { "Sym" }, - META_FUNCTION_ON to { "Fn" }, ) } -- GitLab From 6342758258de2bb8b505b05a6c60ad4167fedcab Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Fri, 18 Oct 2024 18:19:04 +0200 Subject: [PATCH 217/459] Notif redesign: Improve the way we display the work badge Now instead of fetching the app icon including the work badge and passing that to launcher to normalize, we do something more similar to what launcher does by fetching the app icon without the badge and adding the badge afterwards. Bug: 371174789 Test: manually verified that notifications look good from both main profile and work profile apps; also checked the dumps to verify that things are cached correctly and the cache is cleared when there are no notifications from an app in either profile Flag: android.app.notifications_redesign_app_icons Change-Id: I451998619dc2d7fcff8a88c85a1bfb46085c504c --- .../notification/row/icon/AppIconProvider.kt | 64 +++++++++++++++---- .../row/icon/NotificationIconStyleProvider.kt | 28 +++++++- .../NotificationRowIconViewInflaterFactory.kt | 11 +++- .../row/ExpandableNotificationRowBuilder.kt | 5 +- .../NotificationIconStyleProviderKosmos.kt | 3 +- 5 files changed, 95 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt index 0ddf9f7270df..172b76cbcca9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/AppIconProvider.kt @@ -22,12 +22,14 @@ import android.app.Flags import android.content.Context import android.content.pm.PackageManager.NameNotFoundException import android.graphics.Color -import android.graphics.drawable.BitmapDrawable import android.graphics.drawable.ColorDrawable import android.graphics.drawable.Drawable +import android.os.UserHandle import android.util.Log import com.android.internal.R import com.android.launcher3.icons.BaseIconFactory +import com.android.launcher3.icons.BaseIconFactory.IconOptions +import com.android.launcher3.util.UserIconInfo import com.android.systemui.Dumpable import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager @@ -48,7 +50,11 @@ interface AppIconProvider { */ @Throws(NameNotFoundException::class) @WorkerThread - fun getOrFetchAppIcon(packageName: String, context: Context): Drawable + fun getOrFetchAppIcon( + packageName: String, + context: Context, + withWorkProfileBadge: Boolean = false, + ): Drawable /** * Mark all the entries in the cache that are NOT in [wantedPackages] to be cleared. If they're @@ -81,21 +87,52 @@ constructor(private val sysuiContext: Context, dumpManager: DumpManager) : private val cache = NotifCollectionCache() - override fun getOrFetchAppIcon(packageName: String, context: Context): Drawable { - return cache.getOrFetch(packageName) { fetchAppIcon(packageName, context) } + override fun getOrFetchAppIcon( + packageName: String, + context: Context, + withWorkProfileBadge: Boolean, + ): Drawable { + // Add a suffix to distinguish the app installed on the work profile, since the icon will + // be different. + val key = packageName + if (withWorkProfileBadge) WORK_SUFFIX else "" + + return cache.getOrFetch(key) { fetchAppIcon(packageName, context, withWorkProfileBadge) } } @WorkerThread - private fun fetchAppIcon(packageName: String, context: Context): BitmapDrawable { - val icon = context.packageManager.getApplicationIcon(packageName) - return BitmapDrawable( - context.resources, - iconFactory.createScaledBitmap(icon, BaseIconFactory.MODE_HARDWARE), + private fun fetchAppIcon( + packageName: String, + context: Context, + withWorkProfileBadge: Boolean, + ): Drawable { + val pm = context.packageManager + val icon = pm.getApplicationInfo(packageName, 0).loadUnbadgedIcon(pm) + + val options = + IconOptions().apply { + setUser(userIconInfo(context, withWorkProfileBadge)) + setBitmapGenerationMode(BaseIconFactory.MODE_HARDWARE) + // This color is not used since we're not showing the themed icons. We're just + // setting it so that the icon factory doesn't try to extract colors from our bitmap + // (since it won't work, given it's a hardware bitmap). + setExtractedColor(Color.BLUE) + } + val badgedIcon = iconFactory.createBadgedIconBitmap(icon, options) + return badgedIcon.newIcon(sysuiContext) + } + + private fun userIconInfo(context: Context, withWorkProfileBadge: Boolean): UserIconInfo { + val userId = context.userId + return UserIconInfo( + UserHandle.of(userId), + if (withWorkProfileBadge) UserIconInfo.TYPE_WORK else UserIconInfo.TYPE_MAIN, ) } override fun purgeCache(wantedPackages: Collection) { - cache.purge(wantedPackages) + // We don't know from the packages if it's the work profile app or not, so let's just keep + // both if they're present in the cache. + cache.purge(wantedPackages.flatMap { listOf(it, "$it$WORK_SUFFIX") }) } override fun dump(pwOrig: PrintWriter, args: Array) { @@ -114,6 +151,7 @@ constructor(private val sysuiContext: Context, dumpManager: DumpManager) : companion object { const val TAG = "AppIconProviderImpl" + const val WORK_SUFFIX = "|WORK" } } @@ -122,7 +160,11 @@ class NoOpIconProvider : AppIconProvider { const val TAG = "NoOpIconProvider" } - override fun getOrFetchAppIcon(packageName: String, context: Context): Drawable { + override fun getOrFetchAppIcon( + packageName: String, + context: Context, + withWorkProfileBadge: Boolean, + ): Drawable { Log.wtf(TAG, "NoOpIconProvider should not be used anywhere.") return ColorDrawable(Color.WHITE) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt index 35e38c2c0c14..7177a7bd473a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProvider.kt @@ -20,6 +20,7 @@ import android.annotation.WorkerThread import android.app.Flags import android.content.Context import android.content.pm.ApplicationInfo +import android.os.UserManager import android.service.notification.StatusBarNotification import android.util.Log import com.android.systemui.Dumpable @@ -46,6 +47,12 @@ interface NotificationIconStyleProvider { @WorkerThread fun shouldShowAppIcon(notification: StatusBarNotification, context: Context): Boolean + /** + * Whether the [notification] is coming from a work profile app, and therefore should display + * the briefcase badge. + */ + fun shouldShowWorkProfileBadge(notification: StatusBarNotification, context: Context): Boolean + /** * Mark all the entries in the cache that are NOT in [wantedPackages] to be cleared. If they're * still not needed on the next call of this method (made after a timeout of 1s, in case they @@ -55,7 +62,9 @@ interface NotificationIconStyleProvider { } @SysUISingleton -class NotificationIconStyleProviderImpl @Inject constructor(dumpManager: DumpManager) : +class NotificationIconStyleProviderImpl +@Inject +constructor(private val userManager: UserManager, dumpManager: DumpManager) : NotificationIconStyleProvider, Dumpable { init { dumpManager.registerNormalDumpable(TAG, this) @@ -89,6 +98,15 @@ class NotificationIconStyleProviderImpl @Inject constructor(dumpManager: DumpMan } } + override fun shouldShowWorkProfileBadge( + notification: StatusBarNotification, + context: Context, + ): Boolean { + val packageContext = notification.getPackageContext(context) + // UserManager already caches this, so we don't need to. + return userManager.isManagedProfile(packageContext.userId) + } + override fun purgeCache(wantedPackages: Collection) { cache.purge(wantedPackages) } @@ -114,6 +132,14 @@ class NoOpIconStyleProvider : NotificationIconStyleProvider { return true } + override fun shouldShowWorkProfileBadge( + notification: StatusBarNotification, + context: Context, + ): Boolean { + Log.wtf(TAG, "NoOpIconStyleProvider should not be used anywhere.") + return false + } + override fun purgeCache(wantedPackages: Collection) { Log.wtf(TAG, "NoOpIconStyleProvider should not be used anywhere.") } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt index 7b85bfdfb197..64fdf6fc2708 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/icon/NotificationRowIconViewInflaterFactory.kt @@ -50,6 +50,7 @@ constructor( NotificationRowIconView(context, attrs).also { view -> view.setIconProvider(createIconProvider(row, context)) } + else -> null } } @@ -61,13 +62,19 @@ constructor( val sbn = row.entry.sbn return object : NotificationIconProvider { override fun shouldShowAppIcon(): Boolean { - val shouldShowAppIcon = iconStyleProvider.shouldShowAppIcon(row.entry.sbn, context) + val shouldShowAppIcon = iconStyleProvider.shouldShowAppIcon(sbn, context) row.setIsShowingAppIcon(shouldShowAppIcon) return shouldShowAppIcon } override fun getAppIcon(): Drawable { - return appIconProvider.getOrFetchAppIcon(sbn.packageName, context) + val withWorkProfileBadge = + iconStyleProvider.shouldShowWorkProfileBadge(sbn, context) + return appIconProvider.getOrFetchAppIcon( + sbn.packageName, + context, + withWorkProfileBadge, + ) } } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt index c3996e400726..31d390862540 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRowBuilder.kt @@ -23,6 +23,7 @@ import android.app.NotificationManager import android.content.Context import android.content.pm.LauncherApps import android.os.UserHandle +import android.os.UserManager import android.provider.DeviceConfig import androidx.core.os.bundleOf import com.android.internal.config.sysui.SystemUiDeviceConfigFlags @@ -109,6 +110,7 @@ class ExpandableNotificationRowBuilder( private val mKeyguardBypassController: KeyguardBypassController private val mGroupMembershipManager: GroupMembershipManager private val mGroupExpansionManager: GroupExpansionManager + private val mUserManager: UserManager private val mHeadsUpManager: HeadsUpManager private val mIconManager: IconManager private val mContentBinder: NotificationRowContentBinder @@ -143,6 +145,7 @@ class ExpandableNotificationRowBuilder( mSmartReplyController = Mockito.mock(SmartReplyController::class.java, STUB_ONLY) mGroupExpansionManager = GroupExpansionManagerImpl(mDumpManager, mGroupMembershipManager) + mUserManager = Mockito.mock(UserManager::class.java, STUB_ONLY) mHeadsUpManager = Mockito.mock(HeadsUpManager::class.java, STUB_ONLY) mIconManager = IconManager( @@ -289,7 +292,7 @@ class ExpandableNotificationRowBuilder( { Mockito.mock(NotificationViewFlipperFactory::class.java) }, NotificationRowIconViewInflaterFactory( AppIconProviderImpl(context, mDumpManager), - NotificationIconStyleProviderImpl(mDumpManager), + NotificationIconStyleProviderImpl(mUserManager, mDumpManager), ), ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt index 0fe84fb135ab..b4fb7dd9d760 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/notification/row/icon/NotificationIconStyleProviderKosmos.kt @@ -16,8 +16,9 @@ package com.android.systemui.statusbar.notification.row.icon +import android.os.userManager import com.android.systemui.dump.dumpManager import com.android.systemui.kosmos.Kosmos val Kosmos.notificationIconStyleProvider by - Kosmos.Fixture { NotificationIconStyleProviderImpl(dumpManager) } + Kosmos.Fixture { NotificationIconStyleProviderImpl(userManager, dumpManager) } -- GitLab From e9010cb41e2990775bb29072f03f82bdc6c27093 Mon Sep 17 00:00:00 2001 From: Austin Delgado Date: Tue, 22 Oct 2024 09:50:18 -0700 Subject: [PATCH 218/459] Add check for empty vendor acquired strings Interpret empty vendor acquired strings as null to match existing behavior for null acquired strings Test: atest com.android.server.biometrics Flag: EXEMPT bugfix Bug: 374848821 Change-Id: I93b92750572a812f4993b7123fb94a689ab5debc --- .../android/hardware/fingerprint/FingerprintCallback.java | 2 +- .../android/hardware/fingerprint/FingerprintManager.java | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/fingerprint/FingerprintCallback.java b/core/java/android/hardware/fingerprint/FingerprintCallback.java index 24e9f9ddef77..e4fbe6e09709 100644 --- a/core/java/android/hardware/fingerprint/FingerprintCallback.java +++ b/core/java/android/hardware/fingerprint/FingerprintCallback.java @@ -189,7 +189,7 @@ public class FingerprintCallback { mEnrollmentCallback.onAcquired(acquireInfo == FINGERPRINT_ACQUIRED_GOOD); } final String msg = getAcquiredString(context, acquireInfo, vendorCode); - if (msg == null || msg.isEmpty()) { + if (msg == null) { return; } // emulate HAL 2.1 behavior and send real acquiredInfo diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 7f1cac08b430..590c4d661076 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -1517,7 +1517,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing */ public static String getAcquiredString(Context context, int acquireInfo, int vendorCode) { switch (acquireInfo) { - case FINGERPRINT_ACQUIRED_GOOD: + case FINGERPRINT_ACQUIRED_GOOD, FINGERPRINT_ACQUIRED_START: return null; case FINGERPRINT_ACQUIRED_PARTIAL: return context.getString( @@ -1546,13 +1546,10 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing case FINGERPRINT_ACQUIRED_VENDOR: { String[] msgArray = context.getResources().getStringArray( com.android.internal.R.array.fingerprint_acquired_vendor); - if (vendorCode < msgArray.length) { + if (vendorCode < msgArray.length && !msgArray[vendorCode].isEmpty()) { return msgArray[vendorCode]; } } - break; - case FINGERPRINT_ACQUIRED_START: - return null; } Slog.w(TAG, "Invalid acquired message: " + acquireInfo + ", " + vendorCode); return null; -- GitLab From 1690d43d166c497e7c36ffc6512545b6487e96ea Mon Sep 17 00:00:00 2001 From: Hui Wang Date: Tue, 22 Oct 2024 16:51:15 +0000 Subject: [PATCH 219/459] Update the doc for READ_PHONE_NUMBERS The application with READ_PHONE_STATE should not be auto granted READ_PHONE_NUMBERS since R+. Flag: EXEMPT doc change Bug: 368197175 Test: make Change-Id: I1559084df25dc4b18f99da88cf0abb73561377e5 --- core/res/AndroidManifest.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6ab64768d9f0..2bf526844a82 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -1494,8 +1494,8 @@ android:description="@string/permdesc_readBasicPhoneState" android:protectionLevel="normal" /> - Date: Tue, 22 Oct 2024 17:06:48 +0000 Subject: [PATCH 220/459] [CDM] Check if it's system UID for hidden Perm Sync APIs Bug: 371975420 Test: Manual test Flag: EXEMPT bugfix Change-Id: I9771ce38728d40b026d94cb6785d55f144c66790 --- .../server/companion/CompanionDeviceManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index 42f69e9ae02f..c73e457c565d 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -628,16 +628,25 @@ public class CompanionDeviceManagerService extends SystemService { @Override public void enablePermissionsSync(int associationId) { + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } mSystemDataTransferProcessor.enablePermissionsSync(associationId); } @Override public void disablePermissionsSync(int associationId) { + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } mSystemDataTransferProcessor.disablePermissionsSync(associationId); } @Override public PermissionSyncRequest getPermissionSyncRequest(int associationId) { + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } return mSystemDataTransferProcessor.getPermissionSyncRequest(associationId); } -- GitLab From 29b0e382e37bfd854c28989519e099fb00211863 Mon Sep 17 00:00:00 2001 From: rambowang Date: Tue, 22 Oct 2024 11:06:48 -0500 Subject: [PATCH 221/459] Explicitly annotate system APIs in SatelliteManager with @SystemApi This change explicitly mark system APIs in SatelliteManger with annotation @SystemApi to avoid accidentally expose unnecessary APIs when exposing SatelliteManager class as public API in upcoming change. SatelliteManger is @SystemApi at present. All public fields and methods inside SatelliteManger are defacto system APIs (see system-current.txt). So this change is no-op on the API surface Bug: 357638490 Test: atest FrameworksTelephonyTests Flag: EXEMPT javadoc change only Change-Id: I9483f800ca22c8eb32d943a90a3dbc540badfc16 --- .../telephony/satellite/SatelliteManager.java | 322 +++++++++++++++++- 1 file changed, 312 insertions(+), 10 deletions(-) diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java index 44de65a009ff..ffd5505a816a 100644 --- a/telephony/java/android/telephony/satellite/SatelliteManager.java +++ b/telephony/java/android/telephony/satellite/SatelliteManager.java @@ -127,7 +127,9 @@ public final class SatelliteManager { /** * Exception from the satellite service containing the {@link SatelliteResult} error code. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static class SatelliteException extends Exception { @SatelliteResult private final int mErrorCode; @@ -257,140 +259,210 @@ public final class SatelliteManager { /** * The request was successfully processed. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_SUCCESS = 0; + /** * A generic error which should be used only when other specific errors cannot be used. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_ERROR = 1; + /** * Error received from the satellite server. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_SERVER_ERROR = 2; + /** * Error received from the vendor service. This generic error code should be used * only when the error cannot be mapped to other specific service error codes. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_SERVICE_ERROR = 3; + /** * Error received from satellite modem. This generic error code should be used only when * the error cannot be mapped to other specific modem error codes. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_MODEM_ERROR = 4; + /** * Error received from the satellite network. This generic error code should be used only when * the error cannot be mapped to other specific network error codes. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NETWORK_ERROR = 5; + /** * Telephony is not in a valid state to receive requests from clients. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_INVALID_TELEPHONY_STATE = 6; + /** * Satellite modem is not in a valid state to receive requests from clients. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_INVALID_MODEM_STATE = 7; + /** * Either vendor service, or modem, or Telephony framework has received a request with * invalid arguments from its clients. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_INVALID_ARGUMENTS = 8; + /** * Telephony framework failed to send a request or receive a response from the vendor service * or satellite modem due to internal error. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_REQUEST_FAILED = 9; + /** * Radio did not start or is resetting. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_RADIO_NOT_AVAILABLE = 10; + /** * The request is not supported by either the satellite modem or the network. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_REQUEST_NOT_SUPPORTED = 11; + /** * Satellite modem or network has no resources available to handle requests from clients. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NO_RESOURCES = 12; + /** * Satellite service is not provisioned yet. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_SERVICE_NOT_PROVISIONED = 13; + /** * Satellite service provision is already in progress. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_SERVICE_PROVISION_IN_PROGRESS = 14; + /** * The ongoing request was aborted by either the satellite modem or the network. * This error is also returned when framework decides to abort current send request as one * of the previous send request failed. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_REQUEST_ABORTED = 15; + /** * The device/subscriber is barred from accessing the satellite service. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_ACCESS_BARRED = 16; + /** * Satellite modem timeout to receive ACK or response from the satellite network after * sending a request to the network. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NETWORK_TIMEOUT = 17; + /** * Satellite network is not reachable from the modem. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NOT_REACHABLE = 18; + /** * The device/subscriber is not authorized to register with the satellite service provider. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NOT_AUTHORIZED = 19; + /** * The device does not support satellite. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_NOT_SUPPORTED = 20; /** * The current request is already in-progress. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_REQUEST_IN_PROGRESS = 21; /** * Satellite modem is currently busy due to which current request cannot be processed. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_MODEM_BUSY = 22; /** * Telephony process is not currently available or satellite is not supported. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_ILLEGAL_STATE = 23; /** * Telephony framework timeout to receive ACK or response from the satellite modem after * sending a request to the modem. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_RESULT_MODEM_TIMEOUT = 24; @@ -475,27 +547,41 @@ public final class SatelliteManager { /** * Unknown Non-Terrestrial radio technology. This generic radio technology should be used * only when the radio technology cannot be mapped to other specific radio technologies. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int NT_RADIO_TECHNOLOGY_UNKNOWN = 0; + /** * 3GPP NB-IoT (Narrowband Internet of Things) over Non-Terrestrial-Networks technology. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int NT_RADIO_TECHNOLOGY_NB_IOT_NTN = 1; + /** * 3GPP 5G NR over Non-Terrestrial-Networks technology. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int NT_RADIO_TECHNOLOGY_NR_NTN = 2; + /** * 3GPP eMTC (enhanced Machine-Type Communication) over Non-Terrestrial-Networks technology. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int NT_RADIO_TECHNOLOGY_EMTC_NTN = 3; + /** * Proprietary technology. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int NT_RADIO_TECHNOLOGY_PROPRIETARY = 4; @@ -510,16 +596,35 @@ public final class SatelliteManager { @Retention(RetentionPolicy.SOURCE) public @interface NTRadioTechnology {} - /** Suggested device hold position is unknown. */ + /** + * Suggested device hold position is unknown. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DEVICE_HOLD_POSITION_UNKNOWN = 0; - /** User is suggested to hold the device in portrait mode. */ + + /** + * User is suggested to hold the device in portrait mode. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DEVICE_HOLD_POSITION_PORTRAIT = 1; - /** User is suggested to hold the device in landscape mode with left hand. */ + + /** + * User is suggested to hold the device in landscape mode with left hand. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DEVICE_HOLD_POSITION_LANDSCAPE_LEFT = 2; - /** User is suggested to hold the device in landscape mode with right hand. */ + + /** + * User is suggested to hold the device in landscape mode with right hand. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DEVICE_HOLD_POSITION_LANDSCAPE_RIGHT = 3; @@ -533,18 +638,37 @@ public final class SatelliteManager { @Retention(RetentionPolicy.SOURCE) public @interface DeviceHoldPosition {} - /** Display mode is unknown. */ + /** + * Display mode is unknown. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DISPLAY_MODE_UNKNOWN = 0; - /** Display mode of the device used for satellite communication for non-foldable phones. */ + + /** + * Display mode of the device used for satellite communication for non-foldable phones. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DISPLAY_MODE_FIXED = 1; - /** Display mode of the device used for satellite communication for foldabale phones when the - * device is opened. */ + + /** + * Display mode of the device used for satellite communication for foldabale phones when the + * device is opened. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DISPLAY_MODE_OPENED = 2; - /** Display mode of the device used for satellite communication for foldabable phones when the - * device is closed. */ + + /** + * Display mode of the device used for satellite communication for foldabable phones when the + * device is closed. + * @hide + */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DISPLAY_MODE_CLOSED = 3; @@ -561,13 +685,18 @@ public final class SatelliteManager { /** * The emergency call is handed over to oem-enabled satellite SOS messaging. SOS messages are * sent to SOS providers, which will then forward the messages to emergency providers. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_SOS = 1; + /** * The emergency call is handed over to carrier-enabled satellite T911 messaging. T911 messages * are sent directly to local emergency providers. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public static final int EMERGENCY_CALL_TO_SATELLITE_HANDOVER_TYPE_T911 = 2; @@ -598,7 +727,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestEnabled(@NonNull EnableRequestAttributes attributes, @@ -644,7 +776,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsEnabled(@NonNull @CallbackExecutor Executor executor, @@ -701,7 +836,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsDemoModeEnabled(@NonNull @CallbackExecutor Executor executor, @@ -758,7 +896,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsEmergencyModeEnabled(@NonNull @CallbackExecutor Executor executor, @@ -816,7 +957,10 @@ public final class SatelliteManager { * service is supported on the device and {@code false} otherwise. * If the request is not successful, {@link OutcomeReceiver#onError(Throwable)} * will return a {@link SatelliteException} with the {@link SatelliteResult}. + * + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsSupported(@NonNull @CallbackExecutor Executor executor, @NonNull OutcomeReceiver callback) { @@ -871,7 +1015,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestCapabilities(@NonNull @CallbackExecutor Executor executor, @@ -920,56 +1067,80 @@ public final class SatelliteManager { /** * The default state indicating that datagram transfer is idle. * This should be sent if there are no message transfer activity happening. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE = 0; + /** * A transition state indicating that a datagram is being sent. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_SENDING = 1; + /** * An end state indicating that datagram sending completed successfully. * After datagram transfer completes, {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE} * will be sent if no more messages are pending. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS = 2; + /** * An end state indicating that datagram sending completed with a failure. * After datagram transfer completes, {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE} * must be sent before reporting any additional datagram transfer state changes. All pending * messages will be reported as failed, to the corresponding applications. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED = 3; + /** * A transition state indicating that a datagram is being received. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING = 4; + /** * An end state indicating that datagram receiving completed successfully. * After datagram transfer completes, {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE} * will be sent if no more messages are pending. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_SUCCESS = 5; + /** * An end state indicating that datagram receive operation found that there are no * messages to be retrieved from the satellite. * After datagram transfer completes, {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE} * will be sent if no more messages are pending. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_NONE = 6; + /** * An end state indicating that datagram receive completed with a failure. * After datagram transfer completes, {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE} * will be sent if no more messages are pending. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED = 7; + /** * A transition state indicating that Telephony is waiting for satellite modem to connect to a * satellite network before sending a datagram or polling for datagrams. If the satellite modem @@ -978,14 +1149,19 @@ public final class SatelliteManager { * {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVING} will be sent. Otherwise, * either {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED} or * {@link #SATELLITE_DATAGRAM_TRANSFER_STATE_RECEIVE_FAILED} will be sent. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_WAITING_TO_CONNECT = 8; + /** * The datagram transfer state is unknown. This generic datagram transfer state should be used * only when the datagram transfer state cannot be mapped to other specific datagram transfer * states. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_DATAGRAM_TRANSFER_STATE_UNKNOWN = -1; @@ -1008,58 +1184,86 @@ public final class SatelliteManager { /** * Satellite modem is in idle state. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_IDLE = 0; + /** * Satellite modem is listening for incoming datagrams. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_LISTENING = 1; + /** * Satellite modem is sending and/or receiving datagrams. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_DATAGRAM_TRANSFERRING = 2; + /** * Satellite modem is retrying to send and/or receive datagrams. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_DATAGRAM_RETRYING = 3; + /** * Satellite modem is powered off. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_OFF = 4; + /** * Satellite modem is unavailable. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_UNAVAILABLE = 5; + /** * The satellite modem is powered on but the device is not registered to a satellite cell. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_NOT_CONNECTED = 6; + /** * The satellite modem is powered on and the device is registered to a satellite cell. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_CONNECTED = 7; + /** * The satellite modem is being powered on. * @hide */ public static final int SATELLITE_MODEM_STATE_ENABLING_SATELLITE = 8; + /** * The satellite modem is being powered off. * @hide */ public static final int SATELLITE_MODEM_STATE_DISABLING_SATELLITE = 9; + /** * Satellite modem state is unknown. This generic modem state should be used only when the * modem state cannot be mapped to other specific modem states. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_MODEM_STATE_UNKNOWN = -1; @@ -1083,43 +1287,56 @@ public final class SatelliteManager { /** * Datagram type is unknown. This generic datagram type should be used only when the * datagram type cannot be mapped to other specific datagram types. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DATAGRAM_TYPE_UNKNOWN = 0; + /** * Datagram type indicating that the datagram to be sent or received is of type SOS message. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DATAGRAM_TYPE_SOS_MESSAGE = 1; + /** * Datagram type indicating that the datagram to be sent or received is of type * location sharing. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public static final int DATAGRAM_TYPE_LOCATION_SHARING = 2; + /** * This type of datagram is used to keep the device in satellite connected state or check if * there is any incoming message. * @hide */ public static final int DATAGRAM_TYPE_KEEP_ALIVE = 3; + /** * Datagram type indicating that the datagram to be sent or received is of type SOS message and * is the last message to emergency service provider indicating still needs help. * @hide */ public static final int DATAGRAM_TYPE_LAST_SOS_MESSAGE_STILL_NEED_HELP = 4; + /** * Datagram type indicating that the datagram to be sent or received is of type SOS message and * is the last message to emergency service provider indicating no more help is needed. * @hide */ public static final int DATAGRAM_TYPE_LAST_SOS_MESSAGE_NO_HELP_NEEDED = 5; + /** * Datagram type indicating that the message to be sent or received is of type SMS. * @hide */ public static final int DATAGRAM_TYPE_SMS = 6; + /** * Datagram type indicating that the message to be sent is an SMS checking * for pending incoming SMS. @@ -1150,7 +1367,9 @@ public final class SatelliteManager { /** * Satellite communication restricted by geolocation. This can be * triggered based upon geofence input provided by carrier to enable or disable satellite. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_COMMUNICATION_RESTRICTION_REASON_GEOLOCATION = 1; @@ -1158,7 +1377,9 @@ public final class SatelliteManager { * Satellite communication restricted by entitlement server. This can be triggered based on * the EntitlementStatus value received from the entitlement server to enable or disable * satellite. + * @hide */ + @SystemApi @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public static final int SATELLITE_COMMUNICATION_RESTRICTION_REASON_ENTITLEMENT = 2; @@ -1185,7 +1406,10 @@ public final class SatelliteManager { * @param callback The callback to notify of satellite transmission updates. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @SuppressWarnings("SamShouldBeLast") @@ -1268,7 +1492,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void stopTransmissionUpdates(@NonNull SatelliteTransmissionUpdateCallback callback, @@ -1326,7 +1553,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void provisionService(@NonNull String token, @NonNull byte[] provisionData, @@ -1381,7 +1611,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void deprovisionService(@NonNull String token, @@ -1424,7 +1657,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @SatelliteResult public int registerForProvisionStateChanged( @@ -1476,7 +1712,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void unregisterForProvisionStateChanged( @@ -1514,7 +1753,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsProvisioned(@NonNull @CallbackExecutor Executor executor, @@ -1569,7 +1811,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @SatelliteResult public int registerForModemStateChanged( @@ -1623,7 +1868,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void unregisterForModemStateChanged( @@ -1663,7 +1911,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @SatelliteResult public int registerForIncomingDatagram( @@ -1719,7 +1970,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void unregisterForIncomingDatagram(@NonNull SatelliteDatagramCallback callback) { @@ -1757,7 +2011,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void pollPendingDatagrams(@NonNull @CallbackExecutor Executor executor, @@ -1812,7 +2069,10 @@ public final class SatelliteManager { * @param resultListener Listener for the {@link SatelliteResult} result of the operation. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void sendDatagram(@DatagramType int datagramType, @@ -1860,7 +2120,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestIsCommunicationAllowedForCurrentLocation( @@ -1918,7 +2181,10 @@ public final class SatelliteManager { * will return a {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestTimeForNextSatelliteVisibility(@NonNull @CallbackExecutor Executor executor, @@ -1976,7 +2242,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void setDeviceAlignedWithSatellite(boolean isAligned) { @@ -2016,7 +2285,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalArgumentException if the subscription is invalid. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public void requestAttachEnabledForCarrier(int subId, boolean enableSatellite, @@ -2050,7 +2322,10 @@ public final class SatelliteManager { * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. * @throws IllegalArgumentException if the subscription is invalid. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public void requestIsAttachEnabledForCarrier(int subId, @@ -2075,7 +2350,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalArgumentException if the subscription is invalid. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public void addAttachRestrictionForCarrier(int subId, @@ -2120,7 +2398,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalArgumentException if the subscription is invalid. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) public void removeAttachRestrictionForCarrier(int subId, @@ -2164,7 +2445,10 @@ public final class SatelliteManager { * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. * @throws IllegalArgumentException if the subscription is invalid. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @SatelliteCommunicationRestrictionReason @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) @@ -2214,7 +2498,10 @@ public final class SatelliteManager { * {@link SatelliteException} with the {@link SatelliteResult}. * * @throws SecurityException if the caller doesn't have required permission. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void requestNtnSignalStrength(@NonNull @CallbackExecutor Executor executor, @@ -2277,7 +2564,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void registerForNtnSignalStrengthChanged(@NonNull @CallbackExecutor Executor executor, @@ -2326,7 +2616,10 @@ public final class SatelliteManager { * @throws IllegalArgumentException if the callback is not valid or has already been * unregistered. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void unregisterForNtnSignalStrengthChanged(@NonNull NtnSignalStrengthCallback callback) { @@ -2360,7 +2653,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) @SatelliteResult public int registerForCapabilitiesChanged( @@ -2403,7 +2699,10 @@ public final class SatelliteManager { * * @throws SecurityException if the caller doesn't have required permission. * @throws IllegalStateException if the Telephony process is not currently available. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_OEM_ENABLED_SATELLITE_FLAG) public void unregisterForCapabilitiesChanged( @@ -2436,7 +2735,10 @@ public final class SatelliteManager { * * @return List of plmn for carrier satellite service. If no plmn is available, empty list will * be returned. + * + * @hide */ + @SystemApi @RequiresPermission(Manifest.permission.SATELLITE_COMMUNICATION) @FlaggedApi(Flags.FLAG_CARRIER_ENABLED_SATELLITE_FLAG) @NonNull public List getSatellitePlmnsForCarrier(int subId) { -- GitLab From 5dde51f0a8e37ab8edac5c5e324adfbf06fd02ee Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Tue, 22 Oct 2024 18:10:11 +0100 Subject: [PATCH 222/459] Passing animation markers between model layers Also renaming progressStartMark to progressStartMarker, same for end*. Bug: 369817369 Test: manual, everything works as before Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: I5c530e47def6a8089792900b37c762fc8049511f --- .../ui/composable/BackGestureTutorialScreen.kt | 4 ++-- .../ui/composable/GestureTutorialScreen.kt | 18 +++++++++++------- .../ui/composable/HomeGestureTutorialScreen.kt | 4 ++-- .../RecentAppsGestureTutorialScreen.kt | 4 ++-- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index 2337ec1801d7..d752f54cb6f7 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -51,8 +51,8 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni remember(recognizer) { GestureFlowAdapter(recognizer).gestureStateAsFlow.map { it.toGestureUiState( - progressStartMark = "", - progressEndMark = "", + progressStartMarker = "", + progressEndMarker = "", successAnimation = R.raw.trackpad_back_success, ) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt index e058527ffdbe..2332c0051c69 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/GestureTutorialScreen.kt @@ -51,20 +51,20 @@ sealed interface GestureUiState { data class InProgress( val progress: Float = 0f, - val progressStartMark: String = "", - val progressEndMark: String = "", + val progressStartMarker: String, + val progressEndMarker: String, ) : GestureUiState } fun GestureState.toGestureUiState( - progressStartMark: String, - progressEndMark: String, + progressStartMarker: String, + progressEndMarker: String, successAnimation: Int, ): GestureUiState { return when (this) { GestureState.NotStarted -> NotStarted is GestureState.InProgress -> - GestureUiState.InProgress(this.progress, progressStartMark, progressEndMark) + GestureUiState.InProgress(this.progress, progressStartMarker, progressEndMarker) is GestureState.Finished -> GestureUiState.Finished(successAnimation) } } @@ -72,8 +72,12 @@ fun GestureState.toGestureUiState( fun GestureUiState.toTutorialActionState(): TutorialActionState { return when (this) { NotStarted -> TutorialActionState.NotStarted - // progress is disabled for now as views are not ready to handle varying progress - is GestureUiState.InProgress -> TutorialActionState.InProgress(progress = 0f) + is GestureUiState.InProgress -> + TutorialActionState.InProgress( + progress = progress, + startMarker = progressStartMarker, + endMarker = progressEndMarker, + ) is Finished -> TutorialActionState.Finished(successAnimation) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 55749b2f3656..7c4f33c46211 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -50,8 +50,8 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni remember(recognizer) { GestureFlowAdapter(recognizer).gestureStateAsFlow.map { it.toGestureUiState( - progressStartMark = "", - progressEndMark = "", + progressStartMarker = "", + progressEndMarker = "", successAnimation = R.raw.trackpad_home_success, ) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index d928535f721f..83d9bd1a262a 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -51,8 +51,8 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () remember(recognizer) { GestureFlowAdapter(recognizer).gestureStateAsFlow.map { it.toGestureUiState( - progressStartMark = "", - progressEndMark = "", + progressStartMarker = "", + progressEndMarker = "", successAnimation = R.raw.trackpad_recent_apps_success, ) } -- GitLab From 0917ba7c07a0f97d07f76d912a744be0ca804660 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Tue, 22 Oct 2024 18:26:07 +0100 Subject: [PATCH 223/459] Not depending on system gesture distance for touchpad tutorial For tutorial it's fine to exaggerate gesture a bit so user has better idea of the correct execution. And longer gesture works much better with live gesture tracking, otherwise animation plays very quickly. Bug: 369817369 Test: manual + unit tests Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: Ie7aa6595d26063f1629bb70a4487828a99f05970 --- packages/SystemUI/res/values/dimens.xml | 3 +++ .../tutorial/ui/composable/BackGestureTutorialScreen.kt | 4 +--- .../tutorial/ui/composable/HomeGestureTutorialScreen.kt | 4 +--- .../tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt | 4 +--- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml index 6c8a7403953e..1c2c4cf6be77 100644 --- a/packages/SystemUI/res/values/dimens.xml +++ b/packages/SystemUI/res/values/dimens.xml @@ -1979,6 +1979,9 @@ slowing down. Also for tutorial it should be fine to lean to the side of being more strict rather than not strict enough and not teaching user the proper gesture as a result.--> 0.05dp + + 48dp 18dp diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index d752f54cb6f7..be740ed31dba 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -63,9 +63,7 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni @Composable private fun rememberBackGestureRecognizer(resources: Resources): GestureRecognizer { val distance = - resources.getDimensionPixelSize( - com.android.internal.R.dimen.system_gestures_distance_threshold - ) + resources.getDimensionPixelSize(R.dimen.touchpad_tutorial_gestures_distance_threshold) return remember(distance) { BackGestureRecognizer(distance) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 7c4f33c46211..1d5ee77055ac 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -62,9 +62,7 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni @Composable private fun rememberHomeGestureRecognizer(resources: Resources): GestureRecognizer { val distance = - resources.getDimensionPixelSize( - com.android.internal.R.dimen.system_gestures_distance_threshold - ) + resources.getDimensionPixelSize(R.dimen.touchpad_tutorial_gestures_distance_threshold) return remember(distance) { HomeGestureRecognizer(distance) } } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index 83d9bd1a262a..4dc38c2ecb43 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -63,9 +63,7 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () @Composable private fun rememberRecentAppsGestureRecognizer(resources: Resources): GestureRecognizer { val distance = - resources.getDimensionPixelSize( - com.android.internal.R.dimen.system_gestures_distance_threshold - ) + resources.getDimensionPixelSize(R.dimen.touchpad_tutorial_gestures_distance_threshold) val velocity = resources.getDimension(R.dimen.touchpad_recent_apps_gesture_velocity_threshold) return remember(distance, velocity) { RecentAppsGestureRecognizer(distance, velocity) } } -- GitLab From 2e28de1c2d02dd4085fb68936273e4e415288985 Mon Sep 17 00:00:00 2001 From: Shamali P Date: Thu, 17 Oct 2024 15:58:02 +0000 Subject: [PATCH 224/459] Add flag for changing the system appwidget corner radius Test: Manual Bug: 373351337 Flag: android.appwidget.flags.use_smaller_app_widget_radius Change-Id: I91becd35c676e8f280edee13e0cac657d82d31ab --- core/java/android/appwidget/flags.aconfig | 9 +++++++++ core/res/Android.bp | 1 + core/res/res/values/dimens.xml | 11 +++++++---- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/core/java/android/appwidget/flags.aconfig b/core/java/android/appwidget/flags.aconfig index ac9263c2cab5..3839b5fa2599 100644 --- a/core/java/android/appwidget/flags.aconfig +++ b/core/java/android/appwidget/flags.aconfig @@ -74,3 +74,12 @@ flag { purpose: PURPOSE_BUGFIX } } + +flag { + name: "use_smaller_app_widget_radius" + namespace: "app_widgets" + description: "Updates system corner radius for app widgets to 24.dp instead of 28.dp" + bug: "373351337" + is_exported: true + is_fixed_read_only: true +} diff --git a/core/res/Android.bp b/core/res/Android.bp index 17d7bfa40f90..726ccf5a5c2f 100644 --- a/core/res/Android.bp +++ b/core/res/Android.bp @@ -158,6 +158,7 @@ android_app { flags_packages: [ "android.app.appfunctions.flags-aconfig", "android.app.contextualsearch.flags-aconfig", + "android.appwidget.flags-aconfig", "android.content.pm.flags-aconfig", "android.provider.flags-aconfig", "camera_platform_flags", diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 7184d9a8c890..522dcfaf4729 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -17,7 +17,7 @@ ** limitations under the License. */ --> - + 192dp @@ -1037,9 +1037,12 @@ 280dp - 28dp - - 20dp + 28dp + 24dp + + 20dp + + 16dp 16dp -- GitLab From 79fe8c1e69441161849e357d69d0a445548d38b3 Mon Sep 17 00:00:00 2001 From: Ted Bauer Date: Tue, 22 Oct 2024 17:56:30 +0000 Subject: [PATCH 225/459] Add desktop_stats to SettingsToPropertiesMapper Change-Id: Iefda1b056ce5c08b4835702649fec7dd910b7181 Test: m Bug: 374774332 Flag: EXEMPT for trunk stable onboarding --- .../java/com/android/server/am/SettingsToPropertiesMapper.java | 1 + 1 file changed, 1 insertion(+) diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 2f4e8bbea1d7..7afcb130c54d 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -176,6 +176,7 @@ public class SettingsToPropertiesMapper { "core_libraries", "crumpet", "dck_framework", + "desktop_stats", "devoptions_settings", "game", "gpu", -- GitLab From 315e31bf0b37a02aad093765d11027d72e0744bf Mon Sep 17 00:00:00 2001 From: Joe Castro Date: Thu, 17 Oct 2024 01:21:06 +0000 Subject: [PATCH 226/459] Fixing orphaned component's OWNERS Bug: 183233870 Test: N/A Flag: EXEMPT OWNERS fix Change-Id: I4a86c8ed8c2ee1edaee7f2149c0e4a46d6af426e --- core/java/com/android/internal/widget/floatingtoolbar/OWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/com/android/internal/widget/floatingtoolbar/OWNERS b/core/java/com/android/internal/widget/floatingtoolbar/OWNERS index ed9425cc26c9..999ea0e62a0a 100644 --- a/core/java/com/android/internal/widget/floatingtoolbar/OWNERS +++ b/core/java/com/android/internal/widget/floatingtoolbar/OWNERS @@ -1 +1 @@ -include /core/java/android/view/selectiontoolbar/OWNERS +include /core/java/android/permission/OWNERS -- GitLab From a59f33bdee436df943c7c5dad8c89ce95fc459ab Mon Sep 17 00:00:00 2001 From: Yanye Li Date: Tue, 22 Oct 2024 15:55:02 +0000 Subject: [PATCH 227/459] InputManagerInternal: Add API to set power/wakeup node This can be used by other system service to set input device's wakefulness from kernel sleep state when power policy changes. DD: go/configure-al-kernel-wake Bug: 372812925 Test: atest inputflinger_tests Test: Plug in USB mouse with the set of changes: power/wakeup of mouse becomes enabled and it can wake up from "echo mem > /sys/power/state". Flag: com.android.input.flags.set_input_device_kernel_wake Change-Id: I2cc9e498c8f6b99f5dd00361f17df8cfd2b9d2cd --- .../android/server/input/InputManagerInternal.java | 14 ++++++++++++++ .../android/server/input/InputManagerService.java | 5 +++++ .../server/input/NativeInputManagerService.java | 14 ++++++++++++++ ...om_android_server_input_InputManagerService.cpp | 7 +++++++ 4 files changed, 40 insertions(+) diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java index c888eef7f5df..e40d855293cd 100644 --- a/services/core/java/com/android/server/input/InputManagerInternal.java +++ b/services/core/java/com/android/server/input/InputManagerInternal.java @@ -270,4 +270,18 @@ public abstract class InputManagerInternal { * @param scaleFactor the new scale factor to be applied for pointer icons. */ public abstract void setAccessibilityPointerIconScaleFactor(int displayId, float scaleFactor); + + /** + * Set whether the given input device can wake up the kernel from sleep + * when it generates input events. By default, usually only internal (built-in) + * input devices can wake the kernel from sleep. For an external input device + * that supports remote wakeup to be able to wake the kernel, this must be called + * after each time the device is connected/added. + * + * @param deviceId the device ID of the input device. + * @param enabled When true, device will be configured to wake up kernel. + * + * @return true if setting power wakeup was successful. + */ + public abstract boolean setKernelWakeEnabled(int deviceId, boolean enabled); } diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 98e5319cde30..bea520f9429e 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -3511,6 +3511,11 @@ public class InputManagerService extends IInputManager.Stub public void setAccessibilityPointerIconScaleFactor(int displayId, float scaleFactor) { InputManagerService.this.setAccessibilityPointerIconScaleFactor(displayId, scaleFactor); } + + @Override + public boolean setKernelWakeEnabled(int deviceId, boolean enabled) { + return mNative.setKernelWakeEnabled(deviceId, enabled); + } } @Override diff --git a/services/core/java/com/android/server/input/NativeInputManagerService.java b/services/core/java/com/android/server/input/NativeInputManagerService.java index 21e8bccd2883..283fdea92b63 100644 --- a/services/core/java/com/android/server/input/NativeInputManagerService.java +++ b/services/core/java/com/android/server/input/NativeInputManagerService.java @@ -287,6 +287,17 @@ interface NativeInputManagerService { */ int getLastUsedInputDeviceId(); + /** + * Set whether the given input device can wake up the kernel from sleep + * when it generates input events. By default, usually only internal (built-in) + * input devices can wake the kernel from sleep. For an external input device + * that supports remote wakeup to be able to wake the kernel, this must be called + * after each time the device is connected/added. + * + * Returns true if setting power wakeup was successful. + */ + boolean setKernelWakeEnabled(int deviceId, boolean enabled); + /** The native implementation of InputManagerService methods. */ class NativeImpl implements NativeInputManagerService { /** Pointer to native input manager service object, used by native code. */ @@ -573,5 +584,8 @@ interface NativeInputManagerService { @Override public native int getLastUsedInputDeviceId(); + + @Override + public native boolean setKernelWakeEnabled(int deviceId, boolean enabled); } } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 248ed1a58b75..416e60f06c06 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -3056,6 +3056,12 @@ static void nativeSetMouseSwapPrimaryButtonEnabled(JNIEnv* env, jobject nativeIm im->setMouseSwapPrimaryButtonEnabled(enabled); } +static jboolean nativeSetKernelWakeEnabled(JNIEnv* env, jobject nativeImplObj, jint deviceId, + jboolean enabled) { + NativeInputManager* im = getNativeInputManager(env, nativeImplObj); + return im->getInputManager()->getReader().setKernelWakeEnabled(deviceId, enabled); +} + // ---------------------------------------------------------------------------- static const JNINativeMethod gInputManagerMethods[] = { @@ -3172,6 +3178,7 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*)nativeSetAccessibilityStickyKeysEnabled}, {"setInputMethodConnectionIsActive", "(Z)V", (void*)nativeSetInputMethodConnectionIsActive}, {"getLastUsedInputDeviceId", "()I", (void*)nativeGetLastUsedInputDeviceId}, + {"setKernelWakeEnabled", "(IZ)Z", (void*)nativeSetKernelWakeEnabled}, }; #define FIND_CLASS(var, className) \ -- GitLab From 0fc4d8878df63fb91d1530d6e49158b6c4722aaf Mon Sep 17 00:00:00 2001 From: Weilin Xu Date: Wed, 28 Aug 2024 11:42:53 -0700 Subject: [PATCH 228/459] Define emergency alert system API Added HD radio emergency alert system APIs based on its standard. Bug: 361348719 Flag: android.hardware.radio.hd_radio_emergency_alert_system API-Coverage-Bug: 373474662 Test: atest BroadcastRadioTests Change-Id: Iaffd35cb7e630add497faf6097067e6aedfdcc88 --- core/api/system-current.txt | 87 +++ .../android/hardware/radio/RadioAlert.java | 521 +++++++++++++++++- .../android/hardware/radio/RadioManager.java | 21 +- 3 files changed, 603 insertions(+), 26 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index cab836e147c4..c5c4db6d9d76 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -6516,6 +6516,92 @@ package android.hardware.radio { field @NonNull public static final android.os.Parcelable.Creator CREATOR; } + @FlaggedApi("android.hardware.radio.hd_radio_emergency_alert_system") public final class RadioAlert implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List getInfoList(); + method public int getMessageType(); + method public int getStatus(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field public static final int CATEGORY_CBRNE = 10; // 0xa + field public static final int CATEGORY_ENV = 7; // 0x7 + field public static final int CATEGORY_FIRE = 5; // 0x5 + field public static final int CATEGORY_GEO = 0; // 0x0 + field public static final int CATEGORY_HEALTH = 6; // 0x6 + field public static final int CATEGORY_INFRA = 9; // 0x9 + field public static final int CATEGORY_MET = 1; // 0x1 + field public static final int CATEGORY_OTHER = 11; // 0xb + field public static final int CATEGORY_RESCUE = 4; // 0x4 + field public static final int CATEGORY_SAFETY = 2; // 0x2 + field public static final int CATEGORY_SECURITY = 3; // 0x3 + field public static final int CATEGORY_TRANSPORT = 8; // 0x8 + field public static final int CERTAINTY_LIKELY = 1; // 0x1 + field public static final int CERTAINTY_OBSERVED = 0; // 0x0 + field public static final int CERTAINTY_POSSIBLE = 2; // 0x2 + field public static final int CERTAINTY_UNKNOWN = 4; // 0x4 + field public static final int CERTAINTY_UNLIKELY = 3; // 0x3 + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + field public static final int MESSAGE_TYPE_ALERT = 0; // 0x0 + field public static final int MESSAGE_TYPE_CANCEL = 2; // 0x2 + field public static final int MESSAGE_TYPE_UPDATE = 1; // 0x1 + field public static final int SEVERITY_EXTREME = 0; // 0x0 + field public static final int SEVERITY_MINOR = 3; // 0x3 + field public static final int SEVERITY_MODERATE = 2; // 0x2 + field public static final int SEVERITY_SEVERE = 1; // 0x1 + field public static final int SEVERITY_UNKNOWN = 4; // 0x4 + field public static final int STATUS_ACTUAL = 0; // 0x0 + field public static final int STATUS_EXERCISE = 1; // 0x1 + field public static final int STATUS_TEST = 2; // 0x2 + field public static final int URGENCY_EXPECTED = 1; // 0x1 + field public static final int URGENCY_FUTURE = 2; // 0x2 + field public static final int URGENCY_IMMEDIATE = 0; // 0x0 + field public static final int URGENCY_PAST = 3; // 0x3 + field public static final int URGENCY_UNKNOWN = 4; // 0x4 + } + + public static final class RadioAlert.AlertArea implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List getGeocodes(); + method @NonNull public java.util.List getPolygons(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class RadioAlert.AlertInfo implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List getAreas(); + method @NonNull public int[] getCategories(); + method public int getCertainty(); + method @NonNull public String getDescription(); + method @Nullable public String getLanguage(); + method public int getSeverity(); + method public int getUrgency(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class RadioAlert.Coordinate implements android.os.Parcelable { + method public int describeContents(); + method @FloatRange(from=-90.0, to=90.0) public double getLatitude(); + method @FloatRange(from=-180.0, to=180.0) public double getLongitude(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class RadioAlert.Geocode implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public String getValue(); + method @NonNull public String getValueName(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public static final class RadioAlert.Polygon implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public java.util.List getCoordinates(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + public class RadioManager { method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.Set, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener); method @RequiresPermission(android.Manifest.permission.ACCESS_BROADCAST_RADIO) public void addAnnouncementListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.Set, @NonNull android.hardware.radio.Announcement.OnListUpdatedListener); @@ -6651,6 +6737,7 @@ package android.hardware.radio { public static class RadioManager.ProgramInfo implements android.os.Parcelable { method public int describeContents(); + method @FlaggedApi("android.hardware.radio.hd_radio_emergency_alert_system") @Nullable public android.hardware.radio.RadioAlert getAlert(); method @Deprecated public int getChannel(); method @Nullable public android.hardware.radio.ProgramSelector.Identifier getLogicallyTunedTo(); method public android.hardware.radio.RadioMetadata getMetadata(); diff --git a/core/java/android/hardware/radio/RadioAlert.java b/core/java/android/hardware/radio/RadioAlert.java index 9b93e73555f0..6eb9e5845d30 100644 --- a/core/java/android/hardware/radio/RadioAlert.java +++ b/core/java/android/hardware/radio/RadioAlert.java @@ -17,13 +17,19 @@ package android.hardware.radio; import android.annotation.FlaggedApi; +import android.annotation.FloatRange; +import android.annotation.IntDef; import android.annotation.Nullable; +import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; import androidx.annotation.NonNull; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -35,8 +41,272 @@ import java.util.Objects; * @hide */ @FlaggedApi(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) +@SystemApi public final class RadioAlert implements Parcelable { + /** + * Actionable by all targeted recipients. + */ + public static final int STATUS_ACTUAL = 0; + + /** + * Actionable only by designated exercise participants. + */ + public static final int STATUS_EXERCISE = 1; + + /** + * Technical testing only, all recipients disregard. + */ + public static final int STATUS_TEST = 2; + + /** + * The status of the alert message. + * + *

Status is the appropriate handling of the alert message. + * + * @hide + */ + @IntDef(prefix = { "STATUS_" }, value = { + STATUS_ACTUAL, + STATUS_EXERCISE, + STATUS_TEST, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertStatus {} + + /** + * Initial information requiring attention by targeted recipients. + */ + public static final int MESSAGE_TYPE_ALERT = 0; + + /** + * Updates and supersedes the earlier message(s). + */ + public static final int MESSAGE_TYPE_UPDATE = 1; + + /** + * Cancels the earlier message(s). + */ + public static final int MESSAGE_TYPE_CANCEL = 2; + + /** + * The emergency alert message type. + * + *

The message type indicates the emergency alert message nature. + * + * @hide + */ + @IntDef(prefix = { "MESSAGE_TYPE_" }, value = { + MESSAGE_TYPE_ALERT, + MESSAGE_TYPE_UPDATE, + MESSAGE_TYPE_CANCEL, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertMessageType {} + + /** + * Alert category related to geophysical (inc. landslide). + */ + public static final int CATEGORY_GEO = 0; + + /** + * Alert category related to meteorological (inc. flood). + */ + public static final int CATEGORY_MET = 1; + + /** + * Alert category related to general emergency and public safety. + */ + public static final int CATEGORY_SAFETY = 2; + + /** + * Alert category related to law enforcement, military, homeland and local/private security. + */ + public static final int CATEGORY_SECURITY = 3; + + /** + * Alert category related to rescue and recovery. + */ + public static final int CATEGORY_RESCUE = 4; + + /** + * Alert category related to fire suppression and rescue. + */ + public static final int CATEGORY_FIRE = 5; + + /** + * Alert category related to medical and public health. + */ + public static final int CATEGORY_HEALTH = 6; + + /** + * Alert category related to pollution and other environmental. + */ + public static final int CATEGORY_ENV = 7; + + /** + * Alert category related to public and private transportation. + */ + public static final int CATEGORY_TRANSPORT = 8; + + /** + * Alert category related to utility, telecommunication, other non-transport infrastructure. + */ + public static final int CATEGORY_INFRA = 9; + + /** + * Alert category related to chemical, biological, radiological, nuclear or high-yield + * explosive threat or attack. + */ + public static final int CATEGORY_CBRNE = 10; + + /** + * Alert category of other events. + */ + public static final int CATEGORY_OTHER = 11; + + /** + * The category of the subject event of the emergency alert message. + * + * @hide + */ + @IntDef(prefix = { "CATEGORY_" }, value = { + CATEGORY_GEO, + CATEGORY_MET, + CATEGORY_SAFETY, + CATEGORY_SECURITY, + CATEGORY_RESCUE, + CATEGORY_FIRE, + CATEGORY_HEALTH, + CATEGORY_ENV, + CATEGORY_TRANSPORT, + CATEGORY_INFRA, + CATEGORY_CBRNE, + CATEGORY_OTHER, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertCategory {} + + /** + * Urgency indicating that responsive action should be taken immediately. + */ + public static final int URGENCY_IMMEDIATE = 0; + + /** + * Urgency indicating that responsive action should be taken soon. + */ + public static final int URGENCY_EXPECTED = 1; + + /** + * Urgency indicating that responsive action should be taken in the near future. + */ + public static final int URGENCY_FUTURE = 2; + + /** + * Urgency indicating that responsive action is no longer required. + */ + public static final int URGENCY_PAST = 3; + + /** + * Unknown Urgency. + */ + public static final int URGENCY_UNKNOWN = 4; + + /** + * The urgency of the subject event of the emergency alert message. + * + * @hide + */ + @IntDef(prefix = { "URGENCY_" }, value = { + URGENCY_IMMEDIATE, + URGENCY_EXPECTED, + URGENCY_FUTURE, + URGENCY_PAST, + URGENCY_UNKNOWN, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertUrgency {} + + /** + * Severity indicating extraordinary threat to life or property. + */ + public static final int SEVERITY_EXTREME = 0; + + /** + * Severity indicating significant threat to life or property. + */ + public static final int SEVERITY_SEVERE = 1; + + /** + * Severity indicating possible threat to life or property. + */ + public static final int SEVERITY_MODERATE = 2; + + /** + * Severity indicating minimal to no known threat to life or property. + */ + public static final int SEVERITY_MINOR = 3; + + /** + * Unknown severity. + */ + public static final int SEVERITY_UNKNOWN = 4; + + /** + * The severity of the subject event of the emergency alert message. + * + * @hide + */ + @IntDef(prefix = { "SEVERITY_" }, value = { + SEVERITY_EXTREME, + SEVERITY_SEVERE, + SEVERITY_MODERATE, + SEVERITY_MINOR, + SEVERITY_UNKNOWN, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertSeverity {} + + /** + * Certainty indicating that the event is determined to has occurred or to be ongoing. + */ + public static final int CERTAINTY_OBSERVED = 0; + + /** + * Certainty indicating that the event is likely (probability > ~50%). + */ + public static final int CERTAINTY_LIKELY = 1; + + /** + * Certainty indicating that the event is possible but not likely (probability <= ~50%). + */ + public static final int CERTAINTY_POSSIBLE = 2; + + /** + * Certainty indicating that the event is not expected to occur (probability ~ 0). + */ + public static final int CERTAINTY_UNLIKELY = 3; + + /** + * Unknown certainty. + */ + public static final int CERTAINTY_UNKNOWN = 4; + + /** + * The certainty of the subject event of the emergency alert message. + * + * @hide + */ + @IntDef(prefix = { "CERTAINTY_" }, value = { + CERTAINTY_OBSERVED, + CERTAINTY_LIKELY, + CERTAINTY_POSSIBLE, + CERTAINTY_UNLIKELY, + CERTAINTY_UNKNOWN, + }) + @Retention(RetentionPolicy.SOURCE) + public @interface AlertCertainty {} + public static final class Geocode implements Parcelable { private final String mValueName; @@ -45,8 +315,9 @@ public final class RadioAlert implements Parcelable { /** * Constructor of geocode. * - * @param valueName Name of geocode value - * @param value Value of geocode + * @param valueName Name of geocode value. + * @param value Value of geocode. + * * @hide */ public Geocode(@NonNull String valueName, @NonNull String value) { @@ -71,6 +342,30 @@ public final class RadioAlert implements Parcelable { } }; + /** + * Gets the value name of a geographic code. + * + *

Value name are acronyms should be represented in all capital + * letters without periods (e.g., SAME, FIPS, ZIP). See ITU-T X.1303 + * bis for more info). + * + * @return Value name of a geographic code. + */ + @NonNull + public String getValueName() { + return mValueName; + } + + /** + * Gets the value of a geographic code. + * + * @return Value of a geographic code. + */ + @NonNull + public String getValue() { + return mValue; + } + @Override public int describeContents() { return 0; @@ -116,6 +411,7 @@ public final class RadioAlert implements Parcelable { * * @param latitude Latitude of the coordinate * @param longitude Longitude of the coordinate + * * @hide */ public Coordinate(double latitude, double longitude) { @@ -147,6 +443,26 @@ public final class RadioAlert implements Parcelable { } }; + /** + * Gets the latitude of a coordinate. + * + * @return Latitude of a coordinate. + */ + @FloatRange(from = -90.0, to = 90.0) + public double getLatitude() { + return mLatitude; + } + + /** + * Gets the longitude of a coordinate. + * + * @return Longitude of a coordinate. + */ + @FloatRange(from = -180.0, to = 180.0) + public double getLongitude() { + return mLongitude; + } + @Override public int describeContents() { return 0; @@ -189,6 +505,7 @@ public final class RadioAlert implements Parcelable { * Constructor of polygon. * * @param coordinates Coordinates the polygon is composed of + * * @hide */ public Polygon(@NonNull List coordinates) { @@ -220,6 +537,19 @@ public final class RadioAlert implements Parcelable { } }; + /** + * Gets the coordinates of points defining a polygon. + * + *

A minimum of 4 coordinates must be present and the first and last + * coordinates must be the same. See WGS 84 for more information. + * + * @return Paired values of points defining a polygon. + */ + @NonNull + public List getCoordinates() { + return mCoordinates; + } + @Override public int describeContents() { return 0; @@ -263,6 +593,7 @@ public final class RadioAlert implements Parcelable { * * @param polygons Polygons used in alert area * @param geocodes Geocodes used in alert area + * * @hide */ public AlertArea(@NonNull List polygons, @NonNull List geocodes) { @@ -289,6 +620,28 @@ public final class RadioAlert implements Parcelable { } }; + /** + * Gets polygons delineating the affected area of the alert message. + * + * @return Polygons delineating the affected area of the alert message. + */ + @NonNull + public List getPolygons() { + return mPolygons; + } + + /** + * Gets the geographic codes delineating the affected area of the alert + * message. + * + * @return geographic codes delineating the affected area of the alert + * message. + */ + @NonNull + public List getGeocodes() { + return mGeocodes; + } + @Override public int describeContents() { return 0; @@ -326,18 +679,18 @@ public final class RadioAlert implements Parcelable { public static final class AlertInfo implements Parcelable { - private final List mCategoryList; - private final int mUrgency; - private final int mSeverity; - private final int mCertainty; - private final String mTextualMessage; - private final List mAreaList; + private final @NonNull int[] mCategories; + private final @AlertUrgency int mUrgency; + private final @AlertSeverity int mSeverity; + private final @AlertCertainty int mCertainty; + private final @NonNull String mTextualMessage; + private final @NonNull List mAreaList; @Nullable private final String mLanguage; /** * Constructor for alert info. * - * @param categoryList Array of categories of the subject event of the alert message + * @param categories 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 @@ -347,10 +700,13 @@ public final class RadioAlert implements Parcelable { * @param language The optional language field of the alert info * @hide */ - public AlertInfo(@NonNull List categoryList, int urgency, - int severity, int certainty, String textualMessage, - @NonNull List areaList, @Nullable String language) { - mCategoryList = Objects.requireNonNull(categoryList, "Category list can not be null"); + public AlertInfo(@NonNull int[] categories, @AlertUrgency int urgency, + @AlertSeverity int severity, @AlertCertainty int certainty, + String textualMessage, @NonNull List areaList, + @Nullable String language) { + Objects.requireNonNull(categories, "Categories can not be null"); + Arrays.sort(categories); + mCategories = categories; mUrgency = urgency; mSeverity = severity; mCertainty = certainty; @@ -360,7 +716,8 @@ public final class RadioAlert implements Parcelable { } private AlertInfo(Parcel in) { - mCategoryList = in.readArrayList(Integer.class.getClassLoader(), Integer.class); + mCategories = new int[in.readInt()]; + in.readIntArray(mCategories); mUrgency = in.readInt(); mSeverity = in.readInt(); mCertainty = in.readInt(); @@ -375,6 +732,84 @@ public final class RadioAlert implements Parcelable { } } + /** + * Gets categories of the subject event of the alert info. + * + *

According to ITU-T X.1303, a single alert info block may contains multiple categories. + * + * @return Categories of the subject event of the alert info. + */ + @NonNull + public int[] getCategories() { + return mCategories; + } + + /** + * Gets the urgency of the subject event of the alert info. + * + *

Urgency represents the time available to prepare for the alert. See ITU-T X.1303 bis + * for more info. + * + * @return The urgency of the subject event of the alert info. + */ + @AlertUrgency public int getUrgency() { + return mUrgency; + } + + /** + * Gets the severity of the subject event of the alert info. + * + *

Severity represents the intensity of impact. See ITU-T X.1303 bis for more info. + * + * @return The urgency of the subject event of the alert info + */ + @AlertSeverity public int getSeverity() { + return mSeverity; + } + + /** + * Gets the certainty of the subject event of the alert info. + * + *

Certainty represents confidence in the observation or prediction. See ITU-T X.1303 + * bis for more info. + * + * @return The certainty of the subject event of the alert info. + */ + @AlertCertainty public int getCertainty() { + return mCertainty; + } + + /** + * Gets textual descriptions of the subject event. + * + * @return Textual descriptions of the subject event. + */ + @NonNull + public String getDescription() { + return mTextualMessage; + } + + /** + * Gets geographic areas to which the alert info segment in which it + * appears applies. + * + * @return Areas to which the alert info segment in which it appears applies. + */ + @NonNull + public List getAreas() { + return mAreaList; + } + + /** + * Gets IETF RFC 3066 language code donating the language of the alert message. + * + * @return {@code null} if unspecified, otherwise IETF RFC 3066 language code + */ + @Nullable + public String getLanguage() { + return mLanguage; + } + public static final @NonNull Creator CREATOR = new Creator() { @Override public AlertInfo createFromParcel(Parcel in) { @@ -394,7 +829,8 @@ public final class RadioAlert implements Parcelable { @Override public void writeToParcel(@NonNull Parcel dest, int flags) { - dest.writeList(mCategoryList); + dest.writeInt(mCategories.length); + dest.writeIntArray(mCategories); dest.writeInt(mUrgency); dest.writeInt(mSeverity); dest.writeInt(mCertainty); @@ -411,16 +847,16 @@ public final class RadioAlert implements Parcelable { @NonNull @Override public String toString() { - return "AlertInfo [categoryList=" + mCategoryList + ", urgency=" + mUrgency - + ", severity=" + mSeverity + ", certainty=" + mCertainty + return "AlertInfo [categories=" + Arrays.toString(mCategories) + ", urgency=" + + mUrgency + ", severity=" + mSeverity + ", certainty=" + mCertainty + ", textualMessage=" + mTextualMessage + ", areaList=" + mAreaList + ", language=" + mLanguage + "]"; } @Override public int hashCode() { - return Objects.hash(mCategoryList, mUrgency, mSeverity, mCertainty, mTextualMessage, - mAreaList, mLanguage); + return Objects.hash(Arrays.hashCode(mCategories), mUrgency, mSeverity, mCertainty, + mTextualMessage, mAreaList, mLanguage); } @Override @@ -432,16 +868,17 @@ public final class RadioAlert implements Parcelable { return false; } - return mCategoryList.equals(other.mCategoryList) && mUrgency == other.mUrgency - && mSeverity == other.mSeverity && mCertainty == other.mCertainty + return Arrays.equals(mCategories, other.mCategories) + && mUrgency == other.mUrgency && mSeverity == other.mSeverity + && mCertainty == other.mCertainty && mTextualMessage.equals(other.mTextualMessage) && mAreaList.equals(other.mAreaList) && Objects.equals(mLanguage, other.mLanguage); } } - private final int mStatus; - private final int mMessageType; + private final @AlertStatus int mStatus; + private final @AlertMessageType int mMessageType; private final List mInfoList; /** @@ -452,7 +889,7 @@ public final class RadioAlert implements Parcelable { * @param infoList List of alert info * @hide */ - public RadioAlert(int status, int messageType, + public RadioAlert(@AlertStatus int status, @AlertMessageType int messageType, @NonNull List infoList) { mStatus = status; mMessageType = messageType; @@ -466,6 +903,42 @@ public final class RadioAlert implements Parcelable { AlertInfo.class); } + /** + * Gets the status of the alert message. + * + *

Status is the appropriate handling of the alert message. See ITU-T X.1303 bis for more + * info. + * + * @return The status of the alert message. + */ + @AlertStatus public int getStatus() { + return mStatus; + } + + /** + * Gets the message type of the alert message. + * + *

Message type is The nature of the emergency alert message. See ITU-T X.1303 bis for + * more info. + * + * @return The message type of the alert message. + */ + @AlertMessageType public int getMessageType() { + return mMessageType; + } + + /** + * Gets the alert info list. + * + *

See ITU-T X.1303 bis for more info of alert info. + * + * @return The alert info list. + */ + @NonNull + public List getInfoList() { + return mInfoList; + } + @Override public void writeToParcel(@NonNull Parcel dest, int flags) { dest.writeInt(mStatus); diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index 61854e44287b..a8a2276570d8 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -1547,6 +1547,7 @@ public class RadioManager { private final int mSignalQuality; @Nullable private final RadioMetadata mMetadata; @NonNull private final Map mVendorInfo; + @Nullable private final RadioAlert mAlert; /** @hide */ public ProgramInfo(@NonNull ProgramSelector selector, @@ -1568,6 +1569,8 @@ public class RadioManager { mSignalQuality = signalQuality; mMetadata = metadata; mVendorInfo = (vendorInfo == null) ? new HashMap<>() : vendorInfo; + // TODO(361348719): implement alert in the constructor + mAlert = null; } /** @@ -1745,6 +1748,19 @@ public class RadioManager { return (mInfoFlags & FLAG_HD_AUDIO_ACQUIRED) != 0; } + /** + * Get alert message. + * + *

Alert message can be sent from a radio station of technologies such as HD radio to + * the radio users for some emergency events. + * + * @return alert message if it exists, otherwise {@code null} + */ + @FlaggedApi(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + @Nullable public RadioAlert getAlert() { + return mAlert; + } + /** * Signal quality (as opposed to the name) indication from 0 (no signal) * to 100 (excellent) @@ -1786,6 +1802,7 @@ public class RadioManager { mSignalQuality = in.readInt(); mMetadata = in.readTypedObject(RadioMetadata.CREATOR); mVendorInfo = Utils.readStringMap(in); + mAlert = null; } public static final @android.annotation.NonNull Parcelable.Creator CREATOR @@ -1825,8 +1842,8 @@ public class RadioManager { + ", physicallyTunedTo=" + Objects.toString(mPhysicallyTunedTo) + ", relatedContent=" + mRelatedContent.size() + ", infoFlags=" + mInfoFlags - + ", mSignalQuality=" + mSignalQuality - + ", mMetadata=" + Objects.toString(mMetadata) + + ", signalQuality=" + mSignalQuality + + ", metadata=" + Objects.toString(mMetadata) + "]"; } -- GitLab From fb1033cbb8eba35495f80d3a2be4f95b1c5d0627 Mon Sep 17 00:00:00 2001 From: William Xiao Date: Mon, 21 Oct 2024 13:37:39 -0700 Subject: [PATCH 229/459] Route dream touch handling to scene container We want to reuse the existing dream touch handling logic with the scene container, so route touches there from the various touch handlers as needed. There are still a few issues with the interactions themselves, but verified the touches are sent and received as expected. Bug: 371340996 Fixed: 371340996 Test: atest BouncerFullscreenSwipeTouchHandlerTest BouncerSwipeTouchHandlerTest ShadeTouchHandlerTest Flag: com.android.systemui.scene_container Change-Id: I20630441584e67caa18afb166e4059f386687a37 --- ...ouncerFullscreenSwipeTouchHandlerTest.java | 67 ++++++++++++++- .../touch/BouncerSwipeTouchHandlerTest.java | 68 ++++++++++++++- .../ambient/touch/ShadeTouchHandlerTest.kt | 85 ++++++++++++++++--- .../ambient/touch/BouncerSwipeTouchHandler.kt | 48 ++++++++--- .../ambient/touch/ShadeTouchHandler.kt | 23 ++++- .../ambient/touch/dagger/ShadeModule.java | 9 ++ .../systemui/dreams/DreamOverlayService.java | 9 +- .../dreams/dagger/DreamOverlayModule.java | 9 ++ .../dreams/touch/CommunalTouchHandler.java | 19 ++++- 9 files changed, 298 insertions(+), 39 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerFullscreenSwipeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerFullscreenSwipeTouchHandlerTest.java index 58c3fec5b45e..bd33e52689c2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerFullscreenSwipeTouchHandlerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerFullscreenSwipeTouchHandlerTest.java @@ -20,7 +20,9 @@ import static com.google.common.truth.Truth.assertThat; import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -29,11 +31,12 @@ import android.content.pm.UserInfo; import android.graphics.Rect; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.FlagsParameterization; +import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.VelocityTracker; -import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.logging.UiEventLogger; @@ -42,9 +45,12 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.ambient.touch.scrim.ScrimController; import com.android.systemui.ambient.touch.scrim.ScrimManager; import com.android.systemui.communal.ui.viewmodel.CommunalViewModel; +import com.android.systemui.flags.SceneContainerFlagParameterizationKt; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.scene.domain.interactor.SceneInteractor; +import com.android.systemui.scene.ui.view.WindowRootView; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.phone.CentralSurfaces; @@ -58,10 +64,14 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.List; import java.util.Optional; +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + @SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(ParameterizedAndroidJunit4.class) @EnableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) @DisableFlags(Flags.FLAG_COMMUNAL_BOUNCER_DO_NOT_MODIFY_PLUGIN_OPEN) public class BouncerFullscreenSwipeTouchHandlerTest extends SysuiTestCase { @@ -114,6 +124,11 @@ public class BouncerFullscreenSwipeTouchHandlerTest extends SysuiTestCase { @Mock KeyguardInteractor mKeyguardInteractor; + @Mock + WindowRootView mWindowRootView; + + private SceneInteractor mSceneInteractor; + private static final float TOUCH_REGION = .3f; private static final float MIN_BOUNCER_HEIGHT = .05f; @@ -124,9 +139,21 @@ public class BouncerFullscreenSwipeTouchHandlerTest extends SysuiTestCase { /* flags= */ 0 ); + @Parameters(name = "{0}") + public static List getParams() { + return SceneContainerFlagParameterizationKt.parameterizeSceneContainerFlag(); + } + + public BouncerFullscreenSwipeTouchHandlerTest(FlagsParameterization flags) { + super(); + mSetFlagsRule.setFlagsParameterization(flags); + } + @Before public void setup() { mKosmos = new KosmosJavaAdapter(this); + mSceneInteractor = spy(mKosmos.getSceneInteractor()); + MockitoAnnotations.initMocks(this); mTouchHandler = new BouncerSwipeTouchHandler( mKosmos.getTestScope(), @@ -142,7 +169,9 @@ public class BouncerFullscreenSwipeTouchHandlerTest extends SysuiTestCase { MIN_BOUNCER_HEIGHT, mUiEventLogger, mActivityStarter, - mKeyguardInteractor); + mKeyguardInteractor, + mSceneInteractor, + Optional.of(() -> mWindowRootView)); when(mScrimManager.getCurrentController()).thenReturn(mScrimController); when(mValueAnimatorCreator.create(anyFloat(), anyFloat())).thenReturn(mValueAnimator); @@ -152,6 +181,38 @@ public class BouncerFullscreenSwipeTouchHandlerTest extends SysuiTestCase { when(mKeyguardInteractor.isKeyguardDismissible()).thenReturn(MutableStateFlow(false)); } + /** + * Makes sure that touches go to the scene container when the flag is on. + */ + @Test + @EnableFlags(Flags.FLAG_SCENE_CONTAINER) + public void testSwipeUp_sendsTouchesToWindowRootView() { + mTouchHandler.onGlanceableTouchAvailable(true); + mTouchHandler.onSessionStart(mTouchSession); + ArgumentCaptor gestureListenerCaptor = + ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class); + verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture()); + + final OnGestureListener gestureListener = gestureListenerCaptor.getValue(); + + final int screenHeight = 100; + final float distanceY = screenHeight * 0.42f; + + final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, screenHeight, 0); + final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, screenHeight - distanceY, 0); + + assertThat(gestureListener.onScroll(event1, event2, 0, + distanceY)) + .isTrue(); + + // Ensure only called once + verify(mSceneInteractor).onRemoteUserInputStarted(any()); + verify(mWindowRootView).dispatchTouchEvent(event1); + verify(mWindowRootView).dispatchTouchEvent(event2); + } + /** * Ensures expansion does not happen for full vertical swipes when touch is not available. */ diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java index 95681671b545..494e0b4deef4 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandlerTest.java @@ -26,6 +26,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.never; import static org.mockito.Mockito.reset; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -37,12 +38,12 @@ import android.graphics.Rect; import android.graphics.Region; import android.platform.test.annotations.DisableFlags; import android.platform.test.annotations.EnableFlags; +import android.platform.test.flag.junit.FlagsParameterization; import android.view.GestureDetector; import android.view.GestureDetector.OnGestureListener; import android.view.MotionEvent; import android.view.VelocityTracker; -import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.internal.logging.UiEventLogger; @@ -52,9 +53,12 @@ import com.android.systemui.ambient.touch.scrim.ScrimController; import com.android.systemui.ambient.touch.scrim.ScrimManager; import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants; import com.android.systemui.communal.ui.viewmodel.CommunalViewModel; +import com.android.systemui.flags.SceneContainerFlagParameterizationKt; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.kosmos.KosmosJavaAdapter; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.scene.domain.interactor.SceneInteractor; +import com.android.systemui.scene.ui.view.WindowRootView; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.shared.system.InputChannelCompat; import com.android.systemui.statusbar.NotificationShadeWindowController; @@ -70,10 +74,14 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.List; import java.util.Optional; +import platform.test.runner.parameterized.ParameterizedAndroidJunit4; +import platform.test.runner.parameterized.Parameters; + @SmallTest -@RunWith(AndroidJUnit4.class) +@RunWith(ParameterizedAndroidJunit4.class) @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { private KosmosJavaAdapter mKosmos; @@ -121,6 +129,9 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @Mock Region mRegion; + @Mock + WindowRootView mWindowRootView; + @Mock CommunalViewModel mCommunalViewModel; @@ -130,6 +141,8 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @Captor ArgumentCaptor mRectCaptor; + private SceneInteractor mSceneInteractor; + private static final float TOUCH_REGION = .3f; private static final int SCREEN_WIDTH_PX = 1024; private static final int SCREEN_HEIGHT_PX = 100; @@ -142,9 +155,21 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { /* flags= */ 0 ); + @Parameters(name = "{0}") + public static List getParams() { + return SceneContainerFlagParameterizationKt.parameterizeSceneContainerFlag(); + } + + public BouncerSwipeTouchHandlerTest(FlagsParameterization flags) { + super(); + mSetFlagsRule.setFlagsParameterization(flags); + } + @Before public void setup() { mKosmos = new KosmosJavaAdapter(this); + mSceneInteractor = spy(mKosmos.getSceneInteractor()); + MockitoAnnotations.initMocks(this); mTouchHandler = new BouncerSwipeTouchHandler( mKosmos.getTestScope(), @@ -160,7 +185,10 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { MIN_BOUNCER_HEIGHT, mUiEventLogger, mActivityStarter, - mKeyguardInteractor); + mKeyguardInteractor, + mSceneInteractor, + Optional.of(() -> mWindowRootView) + ); when(mScrimManager.getCurrentController()).thenReturn(mScrimController); when(mValueAnimatorCreator.create(anyFloat(), anyFloat())).thenReturn(mValueAnimator); @@ -367,6 +395,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { * Makes sure the expansion amount is proportional to (1 - scroll). */ @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) public void testSwipeUp_setsCorrectExpansionAmount() { mTouchHandler.onSessionStart(mTouchSession); ArgumentCaptor gestureListenerCaptor = @@ -379,6 +408,36 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { verifyScroll(.7f, gestureListener); } + /** + * Makes sure that touches go to the scene container when the flag is on. + */ + @Test + @EnableFlags(Flags.FLAG_SCENE_CONTAINER) + public void testSwipeUp_sendsTouchesToWindowRootView() { + mTouchHandler.onSessionStart(mTouchSession); + ArgumentCaptor gestureListenerCaptor = + ArgumentCaptor.forClass(GestureDetector.OnGestureListener.class); + verify(mTouchSession).registerGestureListener(gestureListenerCaptor.capture()); + + final OnGestureListener gestureListener = gestureListenerCaptor.getValue(); + + final float distanceY = SCREEN_HEIGHT_PX * 0.42f; + + final MotionEvent event1 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, SCREEN_HEIGHT_PX, 0); + final MotionEvent event2 = MotionEvent.obtain(0, 0, MotionEvent.ACTION_MOVE, + 0, SCREEN_HEIGHT_PX - distanceY, 0); + + assertThat(gestureListener.onScroll(event1, event2, 0, + distanceY)) + .isTrue(); + + // Ensure only called once + verify(mSceneInteractor).onRemoteUserInputStarted(any()); + verify(mWindowRootView).dispatchTouchEvent(event1); + verify(mWindowRootView).dispatchTouchEvent(event2); + } + /** * Verifies that swiping up when the lock pattern is not secure dismissed dream and consumes * the gesture. @@ -476,6 +535,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { * Tests that ending an upward swipe before the set threshold leads to bouncer collapsing down. */ @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) public void testSwipeUpPositionBelowThreshold_collapsesBouncer() { final float swipeUpPercentage = .3f; final float expansion = 1 - swipeUpPercentage; @@ -499,6 +559,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { * Tests that ending an upward swipe above the set threshold will continue the expansion. */ @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) public void testSwipeUpPositionAboveThreshold_expandsBouncer() { final float swipeUpPercentage = .7f; final float expansion = 1 - swipeUpPercentage; @@ -528,6 +589,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { * Tests that swiping up with a speed above the set threshold will continue the expansion. */ @Test + @DisableFlags(Flags.FLAG_SCENE_CONTAINER) public void testSwipeUpVelocityAboveMin_expandsBouncer() { when(mFlingAnimationUtils.getMinVelocityPxPerSecond()).thenReturn((float) 0); diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.kt index 38ea44976175..ad636cf613ad 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ambient/touch/ShadeTouchHandlerTest.kt @@ -18,9 +18,9 @@ package com.android.systemui.ambient.touch import android.app.DreamManager import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.FlagsParameterization import android.view.GestureDetector import android.view.MotionEvent -import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.Flags import com.android.systemui.SysuiTestCase @@ -28,14 +28,20 @@ import com.android.systemui.ambient.touch.TouchHandler.TouchSession import com.android.systemui.communal.domain.interactor.communalSettingsInteractor import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.flags.Flags.COMMUNAL_SERVICE_ENABLED +import com.android.systemui.flags.andSceneContainer import com.android.systemui.flags.fakeFeatureFlagsClassic import com.android.systemui.kosmos.testScope +import com.android.systemui.scene.data.repository.sceneContainerRepository +import com.android.systemui.scene.domain.interactor.sceneInteractor +import com.android.systemui.scene.ui.view.WindowRootView import com.android.systemui.shade.ShadeViewController import com.android.systemui.shared.system.InputChannelCompat import com.android.systemui.statusbar.phone.CentralSurfaces import com.android.systemui.testKosmos import com.google.common.truth.Truth +import com.google.common.truth.Truth.assertThat import java.util.Optional +import javax.inject.Provider import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -47,22 +53,29 @@ import org.mockito.kotlin.never import org.mockito.kotlin.times import org.mockito.kotlin.verify import org.mockito.kotlin.whenever +import platform.test.runner.parameterized.ParameterizedAndroidJunit4 +import platform.test.runner.parameterized.Parameters @SmallTest -@RunWith(AndroidJUnit4::class) -class ShadeTouchHandlerTest : SysuiTestCase() { +@RunWith(ParameterizedAndroidJunit4::class) +class ShadeTouchHandlerTest(flags: FlagsParameterization) : SysuiTestCase() { private var kosmos = testKosmos() private var mCentralSurfaces = mock() private var mShadeViewController = mock() private var mDreamManager = mock() private var mTouchSession = mock() private var communalViewModel = mock() + private var windowRootView = mock() private lateinit var mTouchHandler: ShadeTouchHandler private var mGestureListenerCaptor = argumentCaptor() private var mInputListenerCaptor = argumentCaptor() + init { + mSetFlagsRule.setFlagsParameterization(flags) + } + @Before fun setup() { mTouchHandler = @@ -73,7 +86,9 @@ class ShadeTouchHandlerTest : SysuiTestCase() { mDreamManager, communalViewModel, kosmos.communalSettingsInteractor, - TOUCH_HEIGHT + kosmos.sceneInteractor, + Optional.of(Provider { windowRootView }), + TOUCH_HEIGHT, ) } @@ -97,7 +112,7 @@ class ShadeTouchHandlerTest : SysuiTestCase() { // Verifies that a swipe down forwards captured touches to central surfaces for handling. @Test - @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) + @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, Flags.FLAG_SCENE_CONTAINER) @EnableFlags(Flags.FLAG_COMMUNAL_HUB) fun testSwipeDown_communalEnabled_sentToCentralSurfaces() { kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true) @@ -110,7 +125,11 @@ class ShadeTouchHandlerTest : SysuiTestCase() { // Verifies that a swipe down forwards captured touches to the shade view for handling. @Test - @DisableFlags(Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) + @DisableFlags( + Flags.FLAG_COMMUNAL_HUB, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, + Flags.FLAG_SCENE_CONTAINER, + ) fun testSwipeDown_communalDisabled_sentToShadeView() { swipe(Direction.DOWN) @@ -121,7 +140,7 @@ class ShadeTouchHandlerTest : SysuiTestCase() { // Verifies that a swipe down while dreaming forwards captured touches to the shade view for // handling. @Test - @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) + @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, Flags.FLAG_SCENE_CONTAINER) fun testSwipeDown_dreaming_sentToShadeView() { whenever(mDreamManager.isDreaming).thenReturn(true) swipe(Direction.DOWN) @@ -130,9 +149,34 @@ class ShadeTouchHandlerTest : SysuiTestCase() { verify(mShadeViewController, times(2)).handleExternalTouch(any()) } - // Verifies that a swipe up is not forwarded to central surfaces. + // Verifies that a swipe down forwards captured touches to the window root view for handling. @Test + @EnableFlags(Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_SCENE_CONTAINER) + fun testSwipeDown_sceneContainerEnabled_sentToWindowRootView() { + swipe(Direction.DOWN) + + // Both motion events are sent for central surfaces to process. + assertThat(kosmos.sceneContainerRepository.isRemoteUserInputOngoing.value).isTrue() + verify(windowRootView, times(2)).dispatchTouchEvent(any()) + } + + // Verifies that a swipe down while dreaming forwards captured touches to the window root view + // for handling. + @Test + @EnableFlags(Flags.FLAG_SCENE_CONTAINER) @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) + fun testSwipeDown_dreaming_sentToWindowRootView() { + whenever(mDreamManager.isDreaming).thenReturn(true) + swipe(Direction.DOWN) + + // Both motion events are sent for the shade view to process. + assertThat(kosmos.sceneContainerRepository.isRemoteUserInputOngoing.value).isTrue() + verify(windowRootView, times(2)).dispatchTouchEvent(any()) + } + + // Verifies that a swipe up is not forwarded to central surfaces. + @Test + @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, Flags.FLAG_SCENE_CONTAINER) @EnableFlags(Flags.FLAG_COMMUNAL_HUB) fun testSwipeUp_communalEnabled_touchesNotSent() { kosmos.fakeFeatureFlagsClassic.set(COMMUNAL_SERVICE_ENABLED, true) @@ -146,7 +190,11 @@ class ShadeTouchHandlerTest : SysuiTestCase() { // Verifies that a swipe up is not forwarded to the shade view. @Test - @DisableFlags(Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) + @DisableFlags( + Flags.FLAG_COMMUNAL_HUB, + Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX, + Flags.FLAG_SCENE_CONTAINER, + ) fun testSwipeUp_communalDisabled_touchesNotSent() { swipe(Direction.UP) @@ -155,6 +203,17 @@ class ShadeTouchHandlerTest : SysuiTestCase() { verify(mShadeViewController, never()).handleExternalTouch(any()) } + // Verifies that a swipe up is not forwarded to the window root view. + @Test + @EnableFlags(Flags.FLAG_COMMUNAL_HUB, Flags.FLAG_SCENE_CONTAINER) + fun testSwipeUp_sceneContainerEnabled_touchesNotSent() { + swipe(Direction.UP) + + // Motion events are not sent for window root view to process as the swipe is going in the + // wrong direction. + verify(windowRootView, never()).dispatchTouchEvent(any()) + } + @Test @DisableFlags(Flags.FLAG_HUBMODE_FULLSCREEN_VERTICAL_SWIPE_FIX) fun testCancelMotionEvent_popsTouchSession() { @@ -243,10 +302,16 @@ class ShadeTouchHandlerTest : SysuiTestCase() { private enum class Direction { DOWN, - UP + UP, } companion object { private const val TOUCH_HEIGHT = 20 + + @JvmStatic + @Parameters(name = "{0}") + fun getParams(): List { + return FlagsParameterization.allCombinationsOf().andSceneContainer() + } } } diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt index fd06bb174ea3..a55f9ffd1c5a 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt @@ -38,6 +38,9 @@ import com.android.systemui.bouncer.shared.constants.KeyguardBouncerConstants import com.android.systemui.communal.ui.viewmodel.CommunalViewModel import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.scene.ui.view.WindowRootView import com.android.systemui.shade.ShadeExpansionChangeEvent import com.android.systemui.statusbar.NotificationShadeWindowController import com.android.systemui.statusbar.phone.CentralSurfaces @@ -45,6 +48,7 @@ import com.android.wm.shell.animation.FlingAnimationUtils import java.util.Optional import javax.inject.Inject import javax.inject.Named +import javax.inject.Provider import kotlin.math.abs import kotlin.math.hypot import kotlin.math.max @@ -74,6 +78,8 @@ constructor( private val uiEventLogger: UiEventLogger, private val activityStarter: ActivityStarter, private val keyguardInteractor: KeyguardInteractor, + private val sceneInteractor: SceneInteractor, + private val windowRootViewProvider: Optional>, ) : TouchHandler { /** An interface for creating ValueAnimators. */ interface ValueAnimatorCreator { @@ -100,6 +106,8 @@ constructor( currentScrimController = controller } + private val windowRootView by lazy { windowRootViewProvider.get().get() } + /** Determines whether the touch handler should process touches in fullscreen swiping mode */ private var touchAvailable = false @@ -109,7 +117,7 @@ constructor( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { if (capture == null) { capture = @@ -128,6 +136,11 @@ constructor( expanded = false // Since the user is dragging the bouncer up, set scrimmed to false. currentScrimController?.show() + + if (SceneContainerFlag.isEnabled) { + sceneInteractor.onRemoteUserInputStarted("bouncer touch handler") + e1?.apply { windowRootView.dispatchTouchEvent(e1) } + } } } if (capture != true) { @@ -152,20 +165,27 @@ constructor( /* cancelAction= */ null, /* dismissShade= */ true, /* afterKeyguardGone= */ true, - /* deferred= */ false + /* deferred= */ false, ) return true } - // For consistency, we adopt the expansion definition found in the - // PanelViewController. In this case, expansion refers to the view above the - // bouncer. As that view's expansion shrinks, the bouncer appears. The bouncer - // is fully hidden at full expansion (1) and fully visible when fully collapsed - // (0). - touchSession?.apply { - val screenTravelPercentage = - (abs((this@outer.y - e2.y).toDouble()) / getBounds().height()).toFloat() - setPanelExpansion(1 - screenTravelPercentage) + if (SceneContainerFlag.isEnabled) { + windowRootView.dispatchTouchEvent(e2) + } else { + // For consistency, we adopt the expansion definition found in the + // PanelViewController. In this case, expansion refers to the view above the + // bouncer. As that view's expansion shrinks, the bouncer appears. The + // bouncer + // is fully hidden at full expansion (1) and fully visible when fully + // collapsed + // (0). + touchSession?.apply { + val screenTravelPercentage = + (abs((this@outer.y - e2.y).toDouble()) / getBounds().height()) + .toFloat() + setPanelExpansion(1 - screenTravelPercentage) + } } } @@ -194,7 +214,7 @@ constructor( ShadeExpansionChangeEvent( /* fraction= */ currentExpansion, /* expanded= */ expanded, - /* tracking= */ true + /* tracking= */ true, ) currentScrimController?.expand(event) } @@ -347,7 +367,7 @@ constructor( currentHeight, targetHeight, velocity, - viewHeight + viewHeight, ) } else { // Shows the bouncer, i.e., fully collapses the space above the bouncer. @@ -356,7 +376,7 @@ constructor( currentHeight, targetHeight, velocity, - viewHeight + viewHeight, ) } animator.start() diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt index 9da9a3a98ef5..3cf94ba558fe 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt @@ -27,11 +27,15 @@ import com.android.systemui.ambient.touch.TouchHandler.TouchSession import com.android.systemui.ambient.touch.dagger.ShadeModule import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor import com.android.systemui.communal.ui.viewmodel.CommunalViewModel +import com.android.systemui.scene.domain.interactor.SceneInteractor +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.scene.ui.view.WindowRootView import com.android.systemui.shade.ShadeViewController import com.android.systemui.statusbar.phone.CentralSurfaces import java.util.Optional import javax.inject.Inject import javax.inject.Named +import javax.inject.Provider import kotlin.math.abs import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -49,8 +53,10 @@ constructor( private val dreamManager: DreamManager, private val communalViewModel: CommunalViewModel, private val communalSettingsInteractor: CommunalSettingsInteractor, + private val sceneInteractor: SceneInteractor, + private val windowRootViewProvider: Optional>, @param:Named(ShadeModule.NOTIFICATION_SHADE_GESTURE_INITIATION_HEIGHT) - private val initiationHeight: Int + private val initiationHeight: Int, ) : TouchHandler { /** * Tracks whether or not we are capturing a given touch. Will be null before and after a touch. @@ -60,6 +66,8 @@ constructor( /** Determines whether the touch handler should process touches in fullscreen swiping mode */ private var touchAvailable = false + private val windowRootView by lazy { windowRootViewProvider.get().get() } + init { if (Flags.hubmodeFullscreenVerticalSwipeFix()) { scope.launch { @@ -100,7 +108,7 @@ constructor( e1: MotionEvent?, e2: MotionEvent, distanceX: Float, - distanceY: Float + distanceY: Float, ): Boolean { if (capture == null) { // Only capture swipes that are going downwards. @@ -110,6 +118,10 @@ constructor( if (Flags.hubmodeFullscreenVerticalSwipeFix()) touchAvailable else true if (capture == true) { + if (SceneContainerFlag.isEnabled) { + sceneInteractor.onRemoteUserInputStarted("shade touch handler") + } + // Send the initial touches over, as the input listener has already // processed these touches. e1?.apply { sendTouchEvent(this) } @@ -123,7 +135,7 @@ constructor( e1: MotionEvent?, e2: MotionEvent, velocityX: Float, - velocityY: Float + velocityY: Float, ): Boolean { return capture == true } @@ -132,6 +144,11 @@ constructor( } private fun sendTouchEvent(event: MotionEvent) { + if (SceneContainerFlag.isEnabled) { + windowRootView.dispatchTouchEvent(event) + return + } + if (communalSettingsInteractor.isCommunalFlagEnabled() && !dreamManager.isDreaming) { // Send touches to central surfaces only when on the glanceable hub while not dreaming. // While sending touches where while dreaming will open the shade, the shade diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/dagger/ShadeModule.java b/packages/SystemUI/src/com/android/systemui/ambient/touch/dagger/ShadeModule.java index bc2f35467312..1c781d608b04 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/touch/dagger/ShadeModule.java +++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/dagger/ShadeModule.java @@ -22,8 +22,10 @@ import com.android.systemui.ambient.touch.ShadeTouchHandler; import com.android.systemui.ambient.touch.TouchHandler; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.res.R; +import com.android.systemui.scene.ui.view.WindowRootView; import dagger.Binds; +import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoSet; @@ -50,6 +52,13 @@ public abstract class ShadeModule { public abstract TouchHandler providesNotificationShadeTouchHandler( ShadeTouchHandler touchHandler); + /** + * Window root view is used to send touches to the scene container. Declaring as optional as it + * may not be present on all SysUI variants. + */ + @BindsOptionalOf + abstract WindowRootView bindWindowRootView(); + /** * Provides the height of the gesture area for notification swipe down. */ diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java index 7a6ca0859a09..1ffbbd2a9f32 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayService.java @@ -65,7 +65,6 @@ import com.android.systemui.dreams.dagger.DreamOverlayComponent; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; import com.android.systemui.navigationbar.gestural.domain.GestureInteractor; import com.android.systemui.navigationbar.gestural.domain.TaskMatcher; -import com.android.systemui.scene.shared.flag.SceneContainerFlag; import com.android.systemui.shade.ShadeExpansionChangeEvent; import com.android.systemui.touch.TouchInsetManager; import com.android.systemui.util.concurrency.DelayableExecutor; @@ -503,10 +502,10 @@ public class DreamOverlayService extends android.service.dreams.DreamOverlayServ mDreamOverlayContainerViewController = dreamOverlayComponent.getDreamOverlayContainerViewController(); - if (!SceneContainerFlag.isEnabled()) { - mTouchMonitor = ambientTouchComponent.getTouchMonitor(); - mTouchMonitor.init(); - } + // Touch monitor are also used with SceneContainer. See individual touch handlers for + // handling of SceneContainer. + mTouchMonitor = ambientTouchComponent.getTouchMonitor(); + mTouchMonitor.init(); mStateController.setShouldShowComplications(shouldShowComplications()); diff --git a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java index 12984efb52c2..85fb90d32d98 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/dagger/DreamOverlayModule.java @@ -30,8 +30,10 @@ import com.android.systemui.ambient.statusbar.ui.AmbientStatusBarViewController; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dreams.DreamOverlayContainerView; import com.android.systemui.res.R; +import com.android.systemui.scene.ui.view.WindowRootView; import com.android.systemui.touch.TouchInsetManager; +import dagger.BindsOptionalOf; import dagger.Module; import dagger.Provides; @@ -54,6 +56,13 @@ public abstract class DreamOverlayModule { public static final String DREAM_IN_TRANSLATION_Y_DURATION = "dream_in_complications_translation_y_duration"; + /** + * Window root view is used to send touches to the scene container. Declaring as optional as it + * may not be present on all SysUI variants. + */ + @BindsOptionalOf + abstract WindowRootView bindWindowRootView(); + /** */ @Provides @DreamOverlayComponent.DreamOverlayScope diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java index 5ba780f9c99d..42a68771cdcf 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/CommunalTouchHandler.java @@ -31,6 +31,9 @@ import com.android.systemui.ambient.touch.TouchHandler; import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor; import com.android.systemui.communal.domain.interactor.CommunalInteractor; import com.android.systemui.dreams.touch.dagger.CommunalTouchModule; +import com.android.systemui.scene.domain.interactor.SceneInteractor; +import com.android.systemui.scene.shared.flag.SceneContainerFlag; +import com.android.systemui.scene.ui.view.WindowRootView; import com.android.systemui.statusbar.phone.CentralSurfaces; import kotlinx.coroutines.Job; @@ -42,6 +45,7 @@ import java.util.function.Consumer; import javax.inject.Inject; import javax.inject.Named; +import javax.inject.Provider; /** {@link TouchHandler} responsible for handling touches to open communal hub. **/ public class CommunalTouchHandler implements TouchHandler { @@ -51,6 +55,8 @@ public class CommunalTouchHandler implements TouchHandler { private final CommunalInteractor mCommunalInteractor; private final ConfigurationInteractor mConfigurationInteractor; + private final SceneInteractor mSceneInteractor; + private final WindowRootView mWindowRootView; private Boolean mIsEnabled = false; private ArrayList mFlows = new ArrayList<>(); @@ -69,12 +75,16 @@ public class CommunalTouchHandler implements TouchHandler { @Named(CommunalTouchModule.COMMUNAL_GESTURE_INITIATION_WIDTH) int initiationWidth, CommunalInteractor communalInteractor, ConfigurationInteractor configurationInteractor, + SceneInteractor sceneInteractor, + Optional> windowRootViewProvider, Lifecycle lifecycle) { mInitiationWidth = initiationWidth; mCentralSurfaces = centralSurfaces; mLifecycle = lifecycle; mCommunalInteractor = communalInteractor; mConfigurationInteractor = configurationInteractor; + mSceneInteractor = sceneInteractor; + mWindowRootView = windowRootViewProvider.get().get(); mFlows.add(collectFlow( mLifecycle, @@ -125,8 +135,15 @@ public class CommunalTouchHandler implements TouchHandler { private void handleSessionStart(CentralSurfaces surfaces, TouchSession session) { // Notification shade window has its own logic to be visible if the hub is open, no need to // do anything here other than send touch events over. + if (SceneContainerFlag.isEnabled()) { + mSceneInteractor.onRemoteUserInputStarted("communal touch handler"); + } session.registerInputListener(ev -> { - surfaces.handleCommunalHubTouch((MotionEvent) ev); + if (SceneContainerFlag.isEnabled()) { + mWindowRootView.dispatchTouchEvent((MotionEvent) ev); + } else { + surfaces.handleCommunalHubTouch((MotionEvent) ev); + } if (ev != null && ((MotionEvent) ev).getAction() == MotionEvent.ACTION_UP) { var unused = session.pop(); } -- GitLab From 5b1d97a15aff4e91dd48b701e71c3956b1071ce6 Mon Sep 17 00:00:00 2001 From: Weilin Xu Date: Wed, 9 Oct 2024 13:20:37 -0700 Subject: [PATCH 230/459] Add radio alert in program info constructor Bug: 361348719 Flag: android.hardware.radio.hd_radio_emergency_alert_system Test: atest android.hardware.radio.RadioManagerTest Change-Id: I2b0ac2da36142a444fe5b2202a9caa06e094372f --- .../android/hardware/radio/RadioManager.java | 60 +++++++++- .../hardware/radio/RadioManagerTest.java | 107 +++++++++++++++++- 2 files changed, 158 insertions(+), 9 deletions(-) diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java index a8a2276570d8..c6fa9c2f99c1 100644 --- a/core/java/android/hardware/radio/RadioManager.java +++ b/core/java/android/hardware/radio/RadioManager.java @@ -1556,6 +1556,30 @@ public class RadioManager { @Nullable Collection relatedContent, int infoFlags, int signalQuality, @Nullable RadioMetadata metadata, @Nullable Map vendorInfo) { + this(selector, logicallyTunedTo, physicallyTunedTo, relatedContent, infoFlags, + signalQuality, metadata, vendorInfo, /* alert= */ null); + } + + /** + * Constructor for program info. + * + * @param selector Program selector + * @param logicallyTunedTo Program identifier logically tuned to + * @param physicallyTunedTo Program identifier physically tuned to + * @param relatedContent Related content + * @param infoFlags Program info flags + * @param signalQuality Signal quality + * @param metadata Radio metadata + * @param vendorInfo Vendor parameters + * @param alert Radio alert + * @hide + */ + public ProgramInfo(@NonNull ProgramSelector selector, + @Nullable ProgramSelector.Identifier logicallyTunedTo, + @Nullable ProgramSelector.Identifier physicallyTunedTo, + @Nullable Collection relatedContent, + int infoFlags, int signalQuality, @Nullable RadioMetadata metadata, + @Nullable Map vendorInfo, @Nullable RadioAlert alert) { mSelector = Objects.requireNonNull(selector); mLogicallyTunedTo = logicallyTunedTo; mPhysicallyTunedTo = physicallyTunedTo; @@ -1569,8 +1593,7 @@ public class RadioManager { mSignalQuality = signalQuality; mMetadata = metadata; mVendorInfo = (vendorInfo == null) ? new HashMap<>() : vendorInfo; - // TODO(361348719): implement alert in the constructor - mAlert = null; + mAlert = alert; } /** @@ -1802,7 +1825,12 @@ public class RadioManager { mSignalQuality = in.readInt(); mMetadata = in.readTypedObject(RadioMetadata.CREATOR); mVendorInfo = Utils.readStringMap(in); - mAlert = null; + if (Flags.hdRadioEmergencyAlertSystem()) { + boolean hasNonNullAlert = in.readBoolean(); + mAlert = hasNonNullAlert ? in.readTypedObject(RadioAlert.CREATOR) : null; + } else { + mAlert = null; + } } public static final @android.annotation.NonNull Parcelable.Creator CREATOR @@ -1826,6 +1854,14 @@ public class RadioManager { dest.writeInt(mSignalQuality); dest.writeTypedObject(mMetadata, flags); Utils.writeStringMap(dest, mVendorInfo); + if (Flags.hdRadioEmergencyAlertSystem()) { + if (mAlert == null) { + dest.writeBoolean(false); + } else { + dest.writeBoolean(true); + dest.writeTypedObject(mAlert, flags); + } + } } @Override @@ -1836,19 +1872,28 @@ public class RadioManager { @NonNull @Override public String toString() { - return "ProgramInfo" + String prorgamInfoString = "ProgramInfo" + " [selector=" + mSelector + ", logicallyTunedTo=" + Objects.toString(mLogicallyTunedTo) + ", physicallyTunedTo=" + Objects.toString(mPhysicallyTunedTo) + ", relatedContent=" + mRelatedContent.size() + ", infoFlags=" + mInfoFlags + ", signalQuality=" + mSignalQuality - + ", metadata=" + Objects.toString(mMetadata) - + "]"; + + ", metadata=" + Objects.toString(mMetadata); + if (Flags.hdRadioEmergencyAlertSystem()) { + prorgamInfoString += ", alert=" + Objects.toString(mAlert); + } + prorgamInfoString += "]"; + return prorgamInfoString; } @Override public int hashCode() { + if (Flags.hdRadioEmergencyAlertSystem()) { + return Objects.hash(mSelector, mLogicallyTunedTo, mPhysicallyTunedTo, + mRelatedContent, mInfoFlags, mSignalQuality, mMetadata, mVendorInfo, + mAlert); + } return Objects.hash(mSelector, mLogicallyTunedTo, mPhysicallyTunedTo, mRelatedContent, mInfoFlags, mSignalQuality, mMetadata, mVendorInfo); } @@ -1868,6 +1913,9 @@ public class RadioManager { if (!Objects.equals(mMetadata, other.mMetadata)) return false; if (!Objects.equals(mVendorInfo, other.mVendorInfo)) return false; + if (Flags.hdRadioEmergencyAlertSystem()) { + return Objects.equals(mAlert, other.mAlert); + } return true; } } diff --git a/core/tests/BroadcastRadioTests/src/android/hardware/radio/RadioManagerTest.java b/core/tests/BroadcastRadioTests/src/android/hardware/radio/RadioManagerTest.java index 4c3d4e3af99f..7609d0d50f46 100644 --- a/core/tests/BroadcastRadioTests/src/android/hardware/radio/RadioManagerTest.java +++ b/core/tests/BroadcastRadioTests/src/android/hardware/radio/RadioManagerTest.java @@ -31,6 +31,8 @@ import android.content.Context; import android.content.pm.ApplicationInfo; import android.os.Parcel; import android.os.RemoteException; +import android.platform.test.annotations.DisableFlags; +import android.platform.test.annotations.EnableFlags; import android.platform.test.flag.junit.SetFlagsRule; import android.util.ArrayMap; @@ -142,10 +144,13 @@ public final class RadioManagerTest { new ProgramSelector.Identifier[]{}, /* vendorIds= */ null); private static final RadioMetadata METADATA = createMetadata(); + private static final RadioAlert HD_ALERT = createRadioAlert(); private static final RadioManager.ProgramInfo DAB_PROGRAM_INFO = createDabProgramInfo(DAB_SELECTOR); private static final RadioManager.ProgramInfo HD_PROGRAM_INFO = createHdProgramInfo( - HD_SELECTOR); + HD_SELECTOR, /* alert= */ null); + private static final RadioManager.ProgramInfo HD_PROGRAM_INFO_WITH_ALERT = createHdProgramInfo( + HD_SELECTOR, HD_ALERT); private static final int EVENT_ANNOUNCEMENT_TYPE = Announcement.TYPE_EVENT; private static final List TEST_ANNOUNCEMENT_LIST = Arrays.asList( @@ -1162,6 +1167,20 @@ public final class RadioManagerTest { .that(DAB_PROGRAM_INFO.getVendorInfo()).isEmpty(); } + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void getAlert() { + mExpect.withMessage("Alert in HD program info") + .that(HD_PROGRAM_INFO_WITH_ALERT.getAlert()).isEqualTo(HD_ALERT); + } + + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void getAlert_withNullAlert() { + mExpect.withMessage("Null alert in HD program info") + .that(HD_PROGRAM_INFO.getAlert()).isNull(); + } + @Test public void describeContents_forProgramInfo() { mExpect.withMessage("Program info contents") @@ -1189,6 +1208,69 @@ public final class RadioManagerTest { .that(programInfoFromParcel).isEqualTo(DAB_PROGRAM_INFO); } + @Test + @DisableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void equals_forProgramInfoWithAlertAndFlagDisabled() { + mExpect.withMessage("Program info with alert and flag disabled") + .that(HD_PROGRAM_INFO_WITH_ALERT).isEqualTo(HD_PROGRAM_INFO); + } + + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void equals_forProgramInfoWithAlertAndFlagEnabled() { + RadioManager.ProgramInfo sameProgramInfoWithAlert = createHdProgramInfo(HD_SELECTOR, + HD_ALERT); + + mExpect.withMessage("Program info with alert and flag enabled") + .that(HD_PROGRAM_INFO_WITH_ALERT).isEqualTo(sameProgramInfoWithAlert); + } + + @Test + @DisableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void hashcode_forProgramInfoWithAlertAndFlagDisabled() { + mExpect.withMessage("Hash code of program info with alert and flag disabled") + .that(HD_PROGRAM_INFO_WITH_ALERT.hashCode()).isEqualTo(HD_PROGRAM_INFO.hashCode()); + } + + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void hashcode_forProgramInfoWithAlertAndFlagEnabled() { + RadioManager.ProgramInfo sameProgramInfoWithAlert = createHdProgramInfo(HD_SELECTOR, + HD_ALERT); + + mExpect.withMessage("Hash code of program info with alert and flag enabled") + .that(HD_PROGRAM_INFO_WITH_ALERT.hashCode()) + .isEqualTo(sameProgramInfoWithAlert.hashCode()); + } + + @Test + @DisableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void writeToParcel_forProgramInfoWithAlertAndFlagDisabled() { + Parcel parcel = Parcel.obtain(); + + HD_PROGRAM_INFO_WITH_ALERT.writeToParcel(parcel, /* flags= */ 0); + parcel.setDataPosition(0); + + RadioManager.ProgramInfo programInfoFromParcel = + RadioManager.ProgramInfo.CREATOR.createFromParcel(parcel); + mExpect.withMessage("Program info created from parcel with alert and flag disabled") + .that(programInfoFromParcel).isEqualTo(HD_PROGRAM_INFO); + } + + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void writeToParcel_forProgramInfoWithAlertAndFlagEnabled() { + Parcel parcel = Parcel.obtain(); + + HD_PROGRAM_INFO_WITH_ALERT.writeToParcel(parcel, /* flags= */ 0); + parcel.setDataPosition(0); + + RadioManager.ProgramInfo programInfoFromParcel = + RadioManager.ProgramInfo.CREATOR.createFromParcel(parcel); + mExpect.withMessage("Program info created from parcel with alert and flag enabled") + .that(programInfoFromParcel).isEqualTo(HD_PROGRAM_INFO_WITH_ALERT); + } + @Test public void equals_withSameProgramInfo_returnsTrue() { RadioManager.ProgramInfo dabProgramInfoCompared = createDabProgramInfo(DAB_SELECTOR); @@ -1209,6 +1291,13 @@ public final class RadioManagerTest { .that(DAB_PROGRAM_INFO).isNotEqualTo(dabProgramInfoCompared); } + @Test + @EnableFlags(Flags.FLAG_HD_RADIO_EMERGENCY_ALERT_SYSTEM) + public void equals_withDifferentAlert_returnsFalse() { + mExpect.withMessage("Program info with different alerts") + .that(HD_PROGRAM_INFO).isNotEqualTo(HD_PROGRAM_INFO_WITH_ALERT); + } + @Test public void listModules_forRadioManager() throws Exception { createRadioManager(); @@ -1399,19 +1488,31 @@ public final class RadioManagerTest { return metadataBuilder.putString(RadioMetadata.METADATA_KEY_ARTIST, "artistTest").build(); } + private static RadioAlert createRadioAlert() { + RadioAlert.AlertArea alertArea = new RadioAlert.AlertArea(new ArrayList<>(), + List.of(new RadioAlert.Geocode("SAME", "006109"))); + RadioAlert.AlertInfo alertInfo = new RadioAlert.AlertInfo( + new int[]{RadioAlert.CATEGORY_FIRE}, RadioAlert.URGENCY_EXPECTED, + RadioAlert.SEVERITY_MODERATE, RadioAlert.CERTAINTY_OBSERVED, + "alert description", List.of(alertArea), "en-US"); + return new RadioAlert(RadioAlert.STATUS_ACTUAL, RadioAlert.MESSAGE_TYPE_ALERT, + List.of(alertInfo)); + } + private static RadioManager.ProgramInfo createDabProgramInfo(ProgramSelector selector) { return new RadioManager.ProgramInfo(selector, selector.getPrimaryId(), DAB_FREQUENCY_IDENTIFIER, Arrays.asList(DAB_SID_EXT_IDENTIFIER_RELATED), INFO_FLAGS_DAB, SIGNAL_QUALITY, METADATA, /* vendorInfo= */ null); } - private static RadioManager.ProgramInfo createHdProgramInfo(ProgramSelector selector) { + private static RadioManager.ProgramInfo createHdProgramInfo(ProgramSelector selector, + RadioAlert alert) { long frequency = (selector.getPrimaryId().getValue() >> 32); ProgramSelector.Identifier physicallyTunedToId = new ProgramSelector.Identifier( ProgramSelector.IDENTIFIER_TYPE_AMFM_FREQUENCY, frequency); return new RadioManager.ProgramInfo(selector, selector.getPrimaryId(), physicallyTunedToId, Collections.emptyList(), INFO_FLAGS_HD, SIGNAL_QUALITY, METADATA, - /* vendorInfo= */ null); + /* vendorInfo= */ null, alert); } private void createRadioManager() throws RemoteException { -- GitLab From e030378448c602adfa8229a92903aae619a67b5d Mon Sep 17 00:00:00 2001 From: Michael Mikhail Date: Wed, 16 Oct 2024 20:32:51 +0000 Subject: [PATCH 231/459] Add view models for volume dialog ringer drawer Flag: com.android.systemui.volume_redesign Bug: 369993851 Test: atest SystemUiRoboTests:VolumeDialogRingerDrawerViewModelTest Change-Id: Ib86ea6c2cae651f2f63398badbd42c9d39719957 --- .../VolumeDialogRingerDrawerViewModelTest.kt | 144 +++++++++++++++ .../ui/viewmodel/RingerButtonViewModel.kt | 33 ++++ .../ringer/ui/viewmodel/RingerDrawerState.kt | 34 ++++ .../ringer/ui/viewmodel/RingerViewModel.kt | 27 +++ .../VolumeDialogRingerDrawerViewModel.kt | 172 ++++++++++++++++++ .../dialog/shared/VolumeDialogLogger.kt | 10 + ...VolumeDialogRingerDrawerViewModelKosmos.kt | 35 ++++ .../dialog/shared/VolumeDialogLoggerKosmos.kt | 22 +++ 8 files changed, 477 insertions(+) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt create mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt new file mode 100644 index 000000000000..faf01eddbcc3 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt @@ -0,0 +1,144 @@ +/* + * 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.volume.dialog.ringer.ui.viewmodel + +import android.media.AudioManager.RINGER_MODE_NORMAL +import android.media.AudioManager.RINGER_MODE_SILENT +import android.media.AudioManager.RINGER_MODE_VIBRATE +import android.media.AudioManager.STREAM_RING +import android.testing.TestableLooper +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.settingslib.volume.shared.model.RingerMode +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import com.android.systemui.haptics.fakeVibratorHelper +import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.fakeVolumeDialogController +import com.android.systemui.testKosmos +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +@TestableLooper.RunWithLooper +class VolumeDialogRingerDrawerViewModelTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val controller = kosmos.fakeVolumeDialogController + private val vibratorHelper = kosmos.fakeVibratorHelper + + private lateinit var underTest: VolumeDialogRingerDrawerViewModel + + @Before + fun setUp() { + underTest = kosmos.volumeDialogRingerDrawerViewModel + } + + @Test + fun onSelectedRingerNormalModeButtonClicked_openDrawer() = + testScope.runTest { + val ringerViewModel by collectLastValue(underTest.ringerViewModel) + val normalRingerMode = RingerMode(RINGER_MODE_NORMAL) + + setUpRingerModeAndOpenDrawer(normalRingerMode) + + assertThat(ringerViewModel).isNotNull() + assertThat(ringerViewModel?.drawerState) + .isEqualTo(RingerDrawerState.Open(normalRingerMode)) + } + + @Test + fun onSelectedRingerButtonClicked_drawerOpened_closeDrawer() = + testScope.runTest { + val ringerViewModel by collectLastValue(underTest.ringerViewModel) + val normalRingerMode = RingerMode(RINGER_MODE_NORMAL) + + setUpRingerModeAndOpenDrawer(normalRingerMode) + underTest.onRingerButtonClicked(normalRingerMode) + controller.getState() + + assertThat(ringerViewModel).isNotNull() + assertThat(ringerViewModel?.drawerState) + .isEqualTo(RingerDrawerState.Closed(normalRingerMode)) + } + + @Test + fun onNewRingerButtonClicked_drawerOpened_updateRingerMode_closeDrawer() = + testScope.runTest { + val ringerViewModel by collectLastValue(underTest.ringerViewModel) + val vibrateRingerMode = RingerMode(RINGER_MODE_VIBRATE) + + setUpRingerModeAndOpenDrawer(RingerMode(RINGER_MODE_NORMAL)) + // Select vibrate ringer mode. + underTest.onRingerButtonClicked(vibrateRingerMode) + controller.getState() + runCurrent() + + assertThat(ringerViewModel).isNotNull() + assertThat( + ringerViewModel + ?.availableButtons + ?.get(ringerViewModel!!.currentButtonIndex) + ?.ringerMode + ) + .isEqualTo(vibrateRingerMode) + assertThat(ringerViewModel?.drawerState) + .isEqualTo(RingerDrawerState.Closed(vibrateRingerMode)) + + val silentRingerMode = RingerMode(RINGER_MODE_SILENT) + // Open drawer + underTest.onRingerButtonClicked(vibrateRingerMode) + controller.getState() + + // Select silent ringer mode. + underTest.onRingerButtonClicked(silentRingerMode) + controller.getState() + runCurrent() + + assertThat(ringerViewModel).isNotNull() + assertThat( + ringerViewModel + ?.availableButtons + ?.get(ringerViewModel!!.currentButtonIndex) + ?.ringerMode + ) + .isEqualTo(silentRingerMode) + assertThat(ringerViewModel?.drawerState) + .isEqualTo(RingerDrawerState.Closed(silentRingerMode)) + assertThat(controller.hasScheduledTouchFeedback).isFalse() + assertThat(vibratorHelper.totalVibrations).isEqualTo(2) + } + + private fun TestScope.setUpRingerModeAndOpenDrawer(selectedRingerMode: RingerMode) { + controller.setStreamVolume(STREAM_RING, 50) + controller.setRingerMode(selectedRingerMode.value, false) + runCurrent() + + underTest.onRingerButtonClicked(RingerMode(selectedRingerMode.value)) + controller.getState() + runCurrent() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt new file mode 100644 index 000000000000..78d2d1686096 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt @@ -0,0 +1,33 @@ +/* + * 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.volume.dialog.ringer.ui.viewmodel + +import android.annotation.DrawableRes +import android.annotation.StringRes +import com.android.settingslib.volume.shared.model.RingerMode + +/** Models ringer button that corresponds to each ringer mode. */ +data class RingerButtonViewModel( + /** Image resource id for the image button. */ + @DrawableRes val imageResId: Int, + /** Content description for a11y. */ + @StringRes val contentDescriptionResId: Int, + /** Hint label for accessibility use. */ + @StringRes val hintLabelResId: Int, + /** Used to notify view model when button is clicked. */ + val ringerMode: RingerMode, +) diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt new file mode 100644 index 000000000000..f3218370c4dd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt @@ -0,0 +1,34 @@ +/* + * 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.volume.dialog.ringer.ui.viewmodel + +import com.android.settingslib.volume.shared.model.RingerMode + +/** Models volume dialog ringer drawer state */ +sealed interface RingerDrawerState { + + /** When clicked to open drawer */ + data class Open(val mode: RingerMode) : RingerDrawerState + + /** When clicked to close drawer */ + data class Closed(val mode: RingerMode) : RingerDrawerState + + /** Initial state when volume dialog is shown with a closed drawer. */ + interface Initial : RingerDrawerState { + companion object : Initial + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt new file mode 100644 index 000000000000..a09bfebfd3e3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.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.volume.dialog.ringer.ui.viewmodel + +/** Models volume dialog ringer */ +data class RingerViewModel( + /** List of the available buttons according to the available modes */ + val availableButtons: List, + /** The index of the currently selected button */ + val currentButtonIndex: Int, + /** For open and close animations */ + val drawerState: RingerDrawerState, +) diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt new file mode 100644 index 000000000000..ac82ae39ba5c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt @@ -0,0 +1,172 @@ +/* + * 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.volume.dialog.ringer.ui.viewmodel + +import android.media.AudioAttributes +import android.media.AudioManager.RINGER_MODE_NORMAL +import android.media.AudioManager.RINGER_MODE_SILENT +import android.media.AudioManager.RINGER_MODE_VIBRATE +import android.os.VibrationEffect +import com.android.settingslib.volume.shared.model.RingerMode +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.res.R +import com.android.systemui.statusbar.VibratorHelper +import com.android.systemui.volume.Events +import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog +import com.android.systemui.volume.dialog.ringer.domain.VolumeDialogRingerInteractor +import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel +import com.android.systemui.volume.dialog.shared.VolumeDialogLogger +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.CoroutineDispatcher +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.SharingStarted +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.filterNotNull +import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.stateIn + +private const val TAG = "VolumeDialogRingerDrawerViewModel" + +class VolumeDialogRingerDrawerViewModel +@AssistedInject +constructor( + @VolumeDialog private val coroutineScope: CoroutineScope, + @Background private val backgroundDispatcher: CoroutineDispatcher, + private val interactor: VolumeDialogRingerInteractor, + private val vibrator: VibratorHelper, + private val volumeDialogLogger: VolumeDialogLogger, +) { + + private val drawerState = MutableStateFlow(RingerDrawerState.Initial) + + val ringerViewModel: Flow = + combine(interactor.ringerModel, drawerState) { ringerModel, state -> + ringerModel.toViewModel(state) + } + .flowOn(backgroundDispatcher) + .stateIn(coroutineScope, SharingStarted.Eagerly, null) + .filterNotNull() + + // Vibration attributes. + private val sonificiationVibrationAttributes = + AudioAttributes.Builder() + .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) + .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) + .build() + + fun onRingerButtonClicked(ringerMode: RingerMode) { + if (drawerState.value is RingerDrawerState.Open) { + Events.writeEvent(Events.EVENT_RINGER_TOGGLE, ringerMode.value) + provideTouchFeedback(ringerMode) + interactor.setRingerMode(ringerMode) + } + drawerState.value = + when (drawerState.value) { + is RingerDrawerState.Initial -> { + RingerDrawerState.Open(ringerMode) + } + is RingerDrawerState.Open -> { + RingerDrawerState.Closed(ringerMode) + } + is RingerDrawerState.Closed -> { + RingerDrawerState.Open(ringerMode) + } + } + } + + private fun provideTouchFeedback(ringerMode: RingerMode) { + when (ringerMode.value) { + RINGER_MODE_NORMAL -> { + interactor.scheduleTouchFeedback() + null + } + RINGER_MODE_SILENT -> VibrationEffect.get(VibrationEffect.EFFECT_CLICK) + RINGER_MODE_VIBRATE -> VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK) + else -> VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK) + }?.let { vibrator.vibrate(it, sonificiationVibrationAttributes) } + } + + private fun VolumeDialogRingerModel.toViewModel( + drawerState: RingerDrawerState + ): RingerViewModel { + val currentIndex = availableModes.indexOf(currentRingerMode) + if (currentIndex == -1) { + volumeDialogLogger.onCurrentRingerModeIsUnsupported(currentRingerMode) + } + return RingerViewModel( + availableButtons = availableModes.map { mode -> toButtonViewModel(mode) }, + currentButtonIndex = currentIndex, + drawerState = drawerState, + ) + } + + private fun VolumeDialogRingerModel.toButtonViewModel( + ringerMode: RingerMode + ): RingerButtonViewModel? { + return when (ringerMode.value) { + RINGER_MODE_SILENT -> + RingerButtonViewModel( + imageResId = R.drawable.ic_speaker_mute, + contentDescriptionResId = R.string.volume_ringer_status_silent, + hintLabelResId = R.string.volume_ringer_hint_unmute, + ringerMode = ringerMode, + ) + RINGER_MODE_VIBRATE -> + RingerButtonViewModel( + imageResId = R.drawable.ic_volume_ringer_vibrate, + contentDescriptionResId = R.string.volume_ringer_status_vibrate, + hintLabelResId = R.string.volume_ringer_hint_vibrate, + ringerMode = ringerMode, + ) + RINGER_MODE_NORMAL -> + when { + isMuted && isEnabled -> + RingerButtonViewModel( + imageResId = R.drawable.ic_speaker_mute, + contentDescriptionResId = R.string.volume_ringer_status_normal, + hintLabelResId = R.string.volume_ringer_hint_unmute, + ringerMode = ringerMode, + ) + + availableModes.contains(RingerMode(RINGER_MODE_VIBRATE)) -> + RingerButtonViewModel( + imageResId = R.drawable.ic_speaker_on, + contentDescriptionResId = R.string.volume_ringer_status_normal, + hintLabelResId = R.string.volume_ringer_hint_vibrate, + ringerMode = ringerMode, + ) + + else -> + RingerButtonViewModel( + imageResId = R.drawable.ic_speaker_on, + contentDescriptionResId = R.string.volume_ringer_status_normal, + hintLabelResId = R.string.volume_ringer_hint_mute, + ringerMode = ringerMode, + ) + } + else -> null + } + } + + @AssistedFactory + interface Factory { + fun create(): VolumeDialogRingerDrawerViewModel + } +} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt index 59c38c019823..9a3aa7e3d79f 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt @@ -15,6 +15,7 @@ */ package com.android.systemui.volume.dialog.shared +import com.android.settingslib.volume.shared.model.RingerMode import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.VolumeLog @@ -43,4 +44,13 @@ class VolumeDialogLogger @Inject constructor(@VolumeLog private val logBuffer: L { "Dismiss: ${Events.DISMISS_REASONS[int1]}" }, ) } + + fun onCurrentRingerModeIsUnsupported(ringerMode: RingerMode) { + logBuffer.log( + TAG, + LogLevel.DEBUG, + { int1 = ringerMode.value }, + { "Current ringer mode: $int1, ringer mode is unsupported in ringer drawer options" }, + ) + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt new file mode 100644 index 000000000000..db1c01a8698c --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt @@ -0,0 +1,35 @@ +/* + * 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.volume.dialog.ringer.ui.viewmodel + +import com.android.systemui.haptics.vibratorHelper +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.kosmos.testDispatcher +import com.android.systemui.volume.dialog.ringer.domain.volumeDialogRingerInteractor +import com.android.systemui.volume.dialog.shared.volumeDialogLogger + +val Kosmos.volumeDialogRingerDrawerViewModel by + Kosmos.Fixture { + VolumeDialogRingerDrawerViewModel( + backgroundDispatcher = testDispatcher, + coroutineScope = applicationCoroutineScope, + interactor = volumeDialogRingerInteractor, + vibrator = vibratorHelper, + volumeDialogLogger = volumeDialogLogger, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt new file mode 100644 index 000000000000..f9d4a992cd63 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt @@ -0,0 +1,22 @@ +/* + * 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.volume.dialog.shared + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.log.logcatLogBuffer + +val Kosmos.volumeDialogLogger by Kosmos.Fixture { VolumeDialogLogger(logcatLogBuffer()) } -- GitLab From 14f2d7d283dcd1fc45fb01a72539569d9d523c20 Mon Sep 17 00:00:00 2001 From: Jiaming Cheng Date: Fri, 18 Oct 2024 20:12:35 +0000 Subject: [PATCH 232/459] Add QsTileDetailedView flag It checks the dual_shade and flexiglass flags. Flag: com.android.systemui.qs_tile_detailed_view Test: no test Bug: 374173773 Change-Id: Icbd4a4d4148b0a3b22500f18508c2ef31bfb0ce8 --- .../systemui/qs/flags/QsDetailedView.kt | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt diff --git a/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt b/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt new file mode 100644 index 000000000000..ffeec4e0480c --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/qs/flags/QsDetailedView.kt @@ -0,0 +1,93 @@ +/* + * 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.qs.flags + +import com.android.systemui.Flags +import com.android.systemui.flags.FlagToken +import com.android.systemui.flags.RefactorFlagUtils +import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.shade.shared.flag.DualShade + +/** Helper for reading or using the QS Detailed View flag state. */ +@Suppress("NOTHING_TO_INLINE") +object QsDetailedView { + /** The aconfig flag name */ + const val FLAG_NAME = Flags.FLAG_QS_TILE_DETAILED_VIEW + + /** A token used for dependency declaration */ + val token: FlagToken + get() = FlagToken(FLAG_NAME, isEnabled) + + /** Is the flag enabled */ + @JvmStatic + inline val isEnabled + get() = + Flags.qsTileDetailedView() && // mainAconfigFlag + DualShade.isEnabled && + SceneContainerFlag.isEnabled + + // NOTE: Changes should also be made in getSecondaryFlags + + /** The main aconfig flag. */ + inline fun getMainAconfigFlag() = FlagToken(FLAG_NAME, Flags.qsTileDetailedView()) + + /** The set of secondary flags which must be enabled for qs detailed view to work properly */ + inline fun getSecondaryFlags(): Sequence = + sequenceOf( + DualShade.token + // NOTE: Changes should also be made in isEnabled + ) + SceneContainerFlag.getAllRequirements() + + /** The full set of requirements for QsDetailedView */ + inline fun getAllRequirements(): Sequence { + return sequenceOf(getMainAconfigFlag()) + getSecondaryFlags() + } + + /** Return all dependencies of this flag in pairs where [Pair.first] depends on [Pair.second] */ + inline fun getFlagDependencies(): Sequence> { + val mainAconfigFlag = getMainAconfigFlag() + return getSecondaryFlags().map { mainAconfigFlag to it } + } + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) + + /** Returns a developer-readable string that describes the current requirement list. */ + @JvmStatic + fun requirementDescription(): String { + return buildString { + getAllRequirements().forEach { requirement -> + append('\n') + append(if (requirement.isEnabled) " [MET]" else "[NOT MET]") + append(" ${requirement.name}") + } + } + } +} -- GitLab From 5049acdb3d268803b308bc25832fc8784947fc07 Mon Sep 17 00:00:00 2001 From: Justin Lannin Date: Fri, 11 Oct 2024 21:38:43 +0000 Subject: [PATCH 233/459] Health: Add fixed-read-only flag for platform_oxygen_saturation_enabled This flag will be used to enable the oxygen saturation (SpO2) platform APIs. Bug: 369876269 Flag: android.permission.flags.platform_oxygen_saturation_enabled Test: New flag definition. Change-Id: I9f7decd1171c60dddf0443a4894c04eaa1608c3f --- core/java/android/permission/flags.aconfig | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index bfefba5b36e6..3df7ff9e8165 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -282,3 +282,12 @@ flag { description: "This fixed read-only flag is used to enable platform support for Skin Temperature." bug: "369872443" } + +flag { + name: "platform_oxygen_saturation_enabled" + is_fixed_read_only: true + is_exported: true + namespace: "android_health_services" + description: "This fixed read-only flag is used to enable platform support for Oxygen Saturation (SpO2)." + bug: "369873227" +} -- GitLab From 2ed92e02e844b59776fe9ddd802c38c51efa2ce8 Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Tue, 22 Oct 2024 20:25:40 +0000 Subject: [PATCH 234/459] Persist input gain in settings Creates InputDeviceVolumeHelper to maintain a map of input device to its gain index. Plug it into AudioService to allow persist input gain and call lower stack to apply the gain. Expose APIs in AudioDeviceVolumeManager to set/get device input gain, get max/min input gain, get isInputGainFixed. Design doc: go/audio-system-settings-gain-control Change-Id: Ib69793348cad3af145391b43d396fcc729d92244 Bug:b/364923030 Test:AudioServiceTest Flag:com.android.media.flags.enable_audio_input_device_routing_and_volume_control --- core/java/android/provider/Settings.java | 9 +- .../media/AudioDeviceVolumeManager.java | 80 +++++++ media/java/android/media/IAudioService.aidl | 15 ++ .../android/provider/SettingsBackupTest.java | 4 +- .../android/server/audio/AudioService.java | 128 ++++++++++- .../server/audio/InputDeviceVolumeHelper.java | 198 ++++++++++++++++++ .../server/audio/AudioServiceTest.java | 32 +++ 7 files changed, 462 insertions(+), 4 deletions(-) create mode 100644 services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 764570ead4e1..725af340c158 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -5471,6 +5471,14 @@ public final class Settings { @Readable public static final String VOLUME_MASTER = "volume_master"; + /** + * The mapping of input device to its input gain index. + * + * @hide + */ + @Readable + public static final String INPUT_GAIN_INDEX_SETTINGS = "input_gain_index_settings"; + /** * Master mono (int 1 = mono, 0 = normal). * @@ -8390,7 +8398,6 @@ public final class Settings { @Readable public static final String LOCK_SCREEN_LOCK_AFTER_TIMEOUT = "lock_screen_lock_after_timeout"; - /** * This preference contains the string that shows for owner info on LockScreen. * @hide diff --git a/media/java/android/media/AudioDeviceVolumeManager.java b/media/java/android/media/AudioDeviceVolumeManager.java index 13876ad6c3c7..e1fbfea19235 100644 --- a/media/java/android/media/AudioDeviceVolumeManager.java +++ b/media/java/android/media/AudioDeviceVolumeManager.java @@ -16,8 +16,11 @@ package android.media; +import static com.android.media.flags.Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL; + import android.Manifest; import android.annotation.CallbackExecutor; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; @@ -432,6 +435,83 @@ public class AudioDeviceVolumeManager { return VolumeInfo.getDefaultVolumeInfo(); } + /** + * @hide + * Sets the input gain index for a particular AudioDeviceAttributes. + * TODO(b/364923030): create InputVolumeInfo on top of VolumeInfo rather than using index to + * handle volume information, to solve issues e.g. gain index ranges might be different for + * different categories of devices. + */ + @FlaggedApi(FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public void setInputGainIndex(@NonNull AudioDeviceAttributes ada, int index) { + try { + getService().setInputGainIndex(ada, index); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Gets the input gain index for a particular AudioDeviceAttributes. + */ + @FlaggedApi(FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getInputGainIndex(@NonNull AudioDeviceAttributes ada) { + try { + return getService().getInputGainIndex(ada); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Gets the maximum input gain index for input device. + */ + @FlaggedApi(FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getMaxInputGainIndex() { + try { + return getService().getMaxInputGainIndex(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Gets the minimum input gain index for input device. + */ + @FlaggedApi(FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getMinInputGainIndex() { + try { + return getService().getMinInputGainIndex(); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * @hide + * Indicates if an input device does not support input gain control. + *

The following APIs have no effect when input gain is fixed: + *

    + *
  • {@link #setInputGainIndex(AudioDeviceAttributes, int)} + *
+ */ + @FlaggedApi(FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @RequiresPermission(Manifest.permission.MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public boolean isInputGainFixed(@NonNull AudioDeviceAttributes ada) { + try { + return getService().isInputGainFixed(ada); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + /** * @hide * Return human-readable name for volume behavior diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl index c22b67462af2..9fd3f5beb25c 100644 --- a/media/java/android/media/IAudioService.aidl +++ b/media/java/android/media/IAudioService.aidl @@ -189,6 +189,21 @@ interface IAudioService { void setMicrophoneMute(boolean on, String callingPackage, int userId, in String attributionTag); + @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED") + void setInputGainIndex(in AudioDeviceAttributes ada, int index); + + @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED") + int getInputGainIndex(in AudioDeviceAttributes ada); + + @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED") + int getMaxInputGainIndex(); + + @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED") + int getMinInputGainIndex(); + + @EnforcePermission("MODIFY_AUDIO_SETTINGS_PRIVILEGED") + boolean isInputGainFixed(in AudioDeviceAttributes ada); + oneway void setMicrophoneMuteFromSwitch(boolean on); void setRingerModeExternal(int ringerMode, String caller); diff --git a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java index d39b5645109d..1659c9eb67f2 100644 --- a/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java +++ b/packages/SettingsProvider/test/src/android/provider/SettingsBackupTest.java @@ -903,8 +903,8 @@ public class SettingsBackupTest { Settings.System.EGG_MODE, // I am the lolrus Settings.System.END_BUTTON_BEHAVIOR, // bug? Settings.System.DEFAULT_DEVICE_FONT_SCALE, // Non configurable - Settings.System - .HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, + Settings.System.HIDE_ROTATION_LOCK_TOGGLE_FOR_ACCESSIBILITY, + Settings.System.INPUT_GAIN_INDEX_SETTINGS, // candidate for backup? Settings.System.LOCKSCREEN_DISABLED, // ? Settings.System.MEDIA_BUTTON_RECEIVER, // candidate for backup? diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 78a1fa768879..bfef6855fe7e 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -68,10 +68,11 @@ import static com.android.media.audio.Flags.audioserverPermissions; import static com.android.media.audio.Flags.disablePrescaleAbsoluteVolume; import static com.android.media.audio.Flags.equalScoLeaVcIndexRange; import static com.android.media.audio.Flags.replaceStreamBtSco; -import static com.android.media.audio.Flags.ringerModeAffectsAlarm; import static com.android.media.audio.Flags.ringMyCar; +import static com.android.media.audio.Flags.ringerModeAffectsAlarm; import static com.android.media.audio.Flags.setStreamVolumeOrder; import static com.android.media.audio.Flags.vgsVssSyncMuteOrder; +import static com.android.media.flags.Flags.enableAudioInputDeviceRoutingAndVolumeControl; import static com.android.server.audio.SoundDoseHelper.ACTION_CHECK_MUSIC_ACTIVE; import static com.android.server.utils.EventLogger.Event.ALOGE; import static com.android.server.utils.EventLogger.Event.ALOGI; @@ -491,6 +492,10 @@ public class AudioService extends IAudioService.Stub private static final int MSG_INIT_SPATIALIZER = 102; private static final int MSG_INIT_ADI_DEVICE_STATES = 103; + private static final int MSG_INIT_INPUT_GAINS = 104; + private static final int MSG_SET_INPUT_GAIN_INDEX = 105; + private static final int MSG_PERSIST_INPUT_GAIN_INDEX = 106; + // end of messages handled under wakelock // retry delay in case of failure to indicate system ready to AudioFlinger @@ -512,6 +517,11 @@ public class AudioService extends IAudioService.Stub **/ private SparseArray mStreamStates; + /** + * @see InputDeviceVolumeHelper + */ + private InputDeviceVolumeHelper mInputDeviceVolumeHelper; + /*package*/ int getVssVolumeForDevice(int stream, int device) { final VolumeStreamState streamState = mStreamStates.get(stream); return streamState != null ? streamState.getIndex(device) : -1; @@ -1501,6 +1511,15 @@ public class AudioService extends IAudioService.Stub 0 /* arg1 */, 0 /* arg2 */, null /* obj */, 0 /* delay */); queueMsgUnderWakeLock(mAudioHandler, MSG_INIT_SPATIALIZER, 0 /* arg1 */, 0 /* arg2 */, null /* obj */, 0 /* delay */); + if (enableAudioInputDeviceRoutingAndVolumeControl()) { + queueMsgUnderWakeLock( + mAudioHandler, + MSG_INIT_INPUT_GAINS, + 0 /* arg1 */, + 0 /* arg2 */, + null /* obj */, + 0 /* delay */); + } mDisplayManager = context.getSystemService(DisplayManager.class); @@ -1594,6 +1613,16 @@ public class AudioService extends IAudioService.Stub } } + /** Called by handling of MSG_INIT_INPUT_GAINS */ + private void onInitInputGains() { + mInputDeviceVolumeHelper = + new InputDeviceVolumeHelper( + mSettings, + mContentResolver, + mSettingsLock, + System.INPUT_GAIN_INDEX_SETTINGS); + } + private SubscriptionManager.OnSubscriptionsChangedListener mSubscriptionChangedListener = new SubscriptionManager.OnSubscriptionsChangedListener() { @Override @@ -5742,6 +5771,90 @@ public class AudioService extends IAudioService.Stub : aliasStreamType == sStreamVolumeAlias.get(AudioSystem.STREAM_SYSTEM); } + /** + * @see AudioDeviceVolumeManager#setInputGainIndex(AudioDeviceAttributes, int) + */ + @Override + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public void setInputGainIndex(@NonNull AudioDeviceAttributes ada, int index) { + super.setInputGainIndex_enforcePermission(); + + if (mInputDeviceVolumeHelper.setInputGainIndex(ada, index)) { + // Post message to set system volume (it in turn will post a message + // to persist). + sendMsg( + mAudioHandler, + MSG_SET_INPUT_GAIN_INDEX, + SENDMSG_QUEUE, + /*arg1*/ index, + /*arg2*/ 0, + /*obj*/ ada, + /*delay*/ 0); + } + } + + private void setInputGainIndexInt(@NonNull AudioDeviceAttributes ada, int index) { + // TODO(b/364923030): call AudioSystem to apply input gain in native layer. + + // Post a persist input gain msg. + sendMsg( + mAudioHandler, + MSG_PERSIST_INPUT_GAIN_INDEX, + SENDMSG_QUEUE, + /*arg1*/ index, + /*arg2*/ 0, + /*obj*/ ada, + PERSIST_DELAY); + } + + private void persistInputGainIndex(@NonNull AudioDeviceAttributes ada, int index) { + mInputDeviceVolumeHelper.persistInputGainIndex(ada, index); + } + + /** + * @see AudioDeviceVolumeManager#getInputGainIndex(AudioDeviceAttributes) + */ + @Override + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getInputGainIndex(@NonNull AudioDeviceAttributes ada) { + super.getInputGainIndex_enforcePermission(); + + return mInputDeviceVolumeHelper.getInputGainIndex(ada); + } + + /** + * @see AudioDeviceVolumeManager#getMaxInputGainIndex() + */ + @Override + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getMaxInputGainIndex() { + super.getMaxInputGainIndex_enforcePermission(); + + return mInputDeviceVolumeHelper.getMaxInputGainIndex(); + } + + /** + * @see AudioDeviceVolumeManager#getMinInputGainIndex() + */ + @Override + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public int getMinInputGainIndex() { + super.getMinInputGainIndex_enforcePermission(); + + return mInputDeviceVolumeHelper.getMinInputGainIndex(); + } + + /** + * @see AudioDeviceVolumeManager#isInputGainFixed(AudioDeviceAttributes) + */ + @Override + @android.annotation.EnforcePermission(MODIFY_AUDIO_SETTINGS_PRIVILEGED) + public boolean isInputGainFixed(@NonNull AudioDeviceAttributes ada) { + super.isInputGainFixed_enforcePermission(); + + return mInputDeviceVolumeHelper.isInputGainFixed(ada); + } + /** @see AudioManager#setMicrophoneMute(boolean) */ @Override public void setMicrophoneMute(boolean on, String callingPackage, int userId, @@ -10077,6 +10190,14 @@ public class AudioService extends IAudioService.Stub vgs.persistVolumeGroup(msg.arg1); break; + case MSG_SET_INPUT_GAIN_INDEX: + setInputGainIndexInt((AudioDeviceAttributes) msg.obj, msg.arg1); + break; + + case MSG_PERSIST_INPUT_GAIN_INDEX: + persistInputGainIndex((AudioDeviceAttributes) msg.obj, msg.arg1); + break; + case MSG_PERSIST_RINGER_MODE: // note that the value persisted is the current ringer mode, not the // value of ringer mode as of the time the request was made to persist @@ -10147,6 +10268,11 @@ public class AudioService extends IAudioService.Stub mAudioEventWakeLock.release(); break; + case MSG_INIT_INPUT_GAINS: + onInitInputGains(); + mAudioEventWakeLock.release(); + break; + case MSG_INIT_ADI_DEVICE_STATES: onInitAdiDeviceStates(); mAudioEventWakeLock.release(); diff --git a/services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java b/services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java new file mode 100644 index 000000000000..d83dca629d74 --- /dev/null +++ b/services/core/java/com/android/server/audio/InputDeviceVolumeHelper.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2014 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.server.audio; + +import static android.media.AudioManager.GET_DEVICES_INPUTS; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.content.ContentResolver; +import android.media.AudioDeviceAttributes; +import android.media.AudioDeviceInfo; +import android.media.AudioManager; +import android.media.AudioSystem; +import android.os.UserHandle; +import android.util.IntArray; +import android.util.SparseIntArray; + +import java.util.HashSet; +import java.util.Set; + +/** Maintains the current state of input gains. */ +/*package*/ class InputDeviceVolumeHelper { + private static final String TAG = "InputDeviceVolumeHelper"; + + // TODO(b/364923030): retrieve these constants from AudioPolicyManager. + private final int INDEX_MIN = 0; + private final int INDEX_MAX = 100; + private final int INDEX_DEFAULT = 50; + + private final SettingsAdapter mSettings; + private final ContentResolver mContentResolver; + private final Object mSettingsLock; + private final String mInputGainIndexSettingsName; + + // A map between device internal type (e.g. AudioSystem.DEVICE_IN_BUILTIN_MIC) to its input gain + // index. + private final SparseIntArray mInputGainIndexMap; + private final Set mSupportedDeviceTypes; + + InputDeviceVolumeHelper( + SettingsAdapter settings, + ContentResolver contentResolver, + Object settingsLock, + String settingsName) { + mSettings = settings; + mContentResolver = contentResolver; + mSettingsLock = settingsLock; + mInputGainIndexSettingsName = settingsName; + + IntArray internalDeviceTypes = new IntArray(); + int status = AudioSystem.getSupportedDeviceTypes(GET_DEVICES_INPUTS, internalDeviceTypes); + mInputGainIndexMap = + new SparseIntArray( + status == AudioManager.SUCCESS + ? internalDeviceTypes.size() + : AudioSystem.DEVICE_IN_ALL_SET.size()); + + if (status == AudioManager.SUCCESS) { + Set supportedDeviceTypes = new HashSet<>(); + for (int i = 0; i < internalDeviceTypes.size(); i++) { + supportedDeviceTypes.add(internalDeviceTypes.get(i)); + } + mSupportedDeviceTypes = supportedDeviceTypes; + } else { + mSupportedDeviceTypes = AudioSystem.DEVICE_IN_ALL_SET; + } + + readSettings(); + } + + public void readSettings() { + synchronized (InputDeviceVolumeHelper.class) { + for (int inputDeviceType : mSupportedDeviceTypes) { + // Retrieve current input gain for device. If no input gain stored for current + // device, use default input gain. + int index; + if (!hasValidSettingsName()) { + index = INDEX_DEFAULT; + } else { + String name = getSettingNameForDevice(inputDeviceType); + index = + mSettings.getSystemIntForUser( + mContentResolver, name, INDEX_DEFAULT, UserHandle.USER_CURRENT); + } + + mInputGainIndexMap.put(inputDeviceType, getValidIndex(index)); + } + } + } + + public boolean hasValidSettingsName() { + return mInputGainIndexSettingsName != null && !mInputGainIndexSettingsName.isEmpty(); + } + + public @Nullable String getSettingNameForDevice(int inputDeviceType) { + if (!hasValidSettingsName()) { + return null; + } + final String suffix = AudioSystem.getInputDeviceName(inputDeviceType); + if (suffix.isEmpty()) { + return mInputGainIndexSettingsName; + } + return mInputGainIndexSettingsName + "_" + suffix; + } + + private int getValidIndex(int index) { + if (index < INDEX_MIN) { + return INDEX_MIN; + } + if (index > INDEX_MAX) { + return INDEX_MAX; + } + return index; + } + + public int getInputGainIndex(@NonNull AudioDeviceAttributes ada) { + int inputDeviceType = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(ada.getType()); + ensureValidInputDeviceType(inputDeviceType); + + synchronized (InputDeviceVolumeHelper.class) { + return mInputGainIndexMap.get(inputDeviceType, INDEX_DEFAULT); + } + } + + public int getMaxInputGainIndex() { + return INDEX_MAX; + } + + public int getMinInputGainIndex() { + return INDEX_MIN; + } + + public boolean isInputGainFixed(@NonNull AudioDeviceAttributes ada) { + int inputDeviceType = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(ada.getType()); + ensureValidInputDeviceType(inputDeviceType); + + // For simplicity, all devices have non fixed input gain. This might change + // when more input devices are supported and some do not support input gain control. + return false; + } + + public boolean setInputGainIndex(@NonNull AudioDeviceAttributes ada, int index) { + int inputDeviceType = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(ada.getType()); + ensureValidInputDeviceType(inputDeviceType); + + int oldIndex; + synchronized (mSettingsLock) { + synchronized (InputDeviceVolumeHelper.class) { + oldIndex = getInputGainIndex(ada); + index = getValidIndex(index); + + if (oldIndex == index) { + return false; + } + + mInputGainIndexMap.put(inputDeviceType, index); + return true; + } + } + } + + public void persistInputGainIndex(@NonNull AudioDeviceAttributes ada, int index) { + int inputDeviceType = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(ada.getType()); + ensureValidInputDeviceType(inputDeviceType); + + if (hasValidSettingsName()) { + mSettings.putSystemIntForUser( + mContentResolver, + getSettingNameForDevice(inputDeviceType), + index, + UserHandle.USER_CURRENT); + } + } + + public boolean isValidInputDeviceType(int inputDeviceType) { + return mSupportedDeviceTypes.contains(inputDeviceType); + } + + private void ensureValidInputDeviceType(int inputDeviceType) { + if (!isValidInputDeviceType(inputDeviceType)) { + throw new IllegalArgumentException("Bad input device type " + inputDeviceType); + } + } +} diff --git a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java index b7100ea00a40..c9e9f00985f1 100644 --- a/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/audio/AudioServiceTest.java @@ -15,6 +15,8 @@ */ package com.android.server.audio; +import static android.media.AudioDeviceInfo.TYPE_BUILTIN_MIC; + import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; @@ -27,16 +29,20 @@ import static org.mockito.Mockito.when; import android.app.AppOpsManager; import android.content.Context; +import android.media.AudioDeviceAttributes; import android.media.AudioSystem; import android.os.Looper; import android.os.PermissionEnforcer; import android.os.UserHandle; +import android.platform.test.annotations.EnableFlags; import android.util.Log; import androidx.test.InstrumentationRegistry; import androidx.test.filters.MediumTest; import androidx.test.runner.AndroidJUnit4; +import com.android.media.flags.Flags; + import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -53,6 +59,7 @@ public class AudioServiceTest { private static final String TAG = "AudioServiceTest"; private static final int MAX_MESSAGE_HANDLING_DELAY_MS = 100; + private static final int DEFAULT_INPUT_GAIN_INDEX = 50; @Rule public final MockitoRule mockito = MockitoJUnit.rule(); @@ -202,4 +209,29 @@ public class AudioServiceTest { reset(mSpySystemServer); } } + + /** Test input gain index setter and getter */ + @EnableFlags(Flags.FLAG_ENABLE_AUDIO_INPUT_DEVICE_ROUTING_AND_VOLUME_CONTROL) + @Test + public void testInputGainIndex() throws Exception { + Log.i(TAG, "running testInputGainIndex"); + Assert.assertNotNull(mAudioService); + Thread.sleep(MAX_MESSAGE_HANDLING_DELAY_MS); // wait for full AudioService initialization + + AudioDeviceAttributes ada = + new AudioDeviceAttributes( + AudioDeviceAttributes.ROLE_INPUT, TYPE_BUILTIN_MIC, /* address= */ ""); + + Assert.assertEquals( + "default input gain index reporting wrong value", + DEFAULT_INPUT_GAIN_INDEX, + mAudioService.getInputGainIndex(ada)); + + int inputGainIndex = 20; + mAudioService.setInputGainIndex(ada, inputGainIndex); + Assert.assertEquals( + "input gain index reporting wrong value", + inputGainIndex, + mAudioService.getInputGainIndex(ada)); + } } -- GitLab From 48de5b95fbb03488e0cf3c52891253ce896c22bc Mon Sep 17 00:00:00 2001 From: Harshit Mahajan Date: Fri, 11 Oct 2024 12:20:50 +0000 Subject: [PATCH 235/459] Marking SystemApi for PackageWatchdog and Observer We would be moving PackageWatchdog it's observers to new module. All the api calls across boundary would need to be happen via SystemApi. Marking the required APIs as SystemApi. Bug: 361126781 Test: atest CtsRootPackageWatchdogTestCases Flag: android.crashrecovery.flags.enable_crashrecovery Change-Id: I40c15975d3e00958b265f9a1f8dd72cdea412902 --- AconfigFlags.bp | 4 ++ core/java/Android.bp | 7 +++ .../com/android/server/PackageWatchdog.java | 44 +++++++++++++------ .../java/com/android/server/RescueParty.java | 4 +- .../RollbackPackageHealthObserver.java | 12 +++-- 5 files changed, 52 insertions(+), 19 deletions(-) diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 1ae9ada41338..68ad84b68557 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -1559,6 +1559,10 @@ java_aconfig_library { name: "android.crashrecovery.flags-aconfig-java", aconfig_declarations: "android.crashrecovery.flags-aconfig", defaults: ["framework-minus-apex-aconfig-java-defaults"], + apex_available: [ + "//apex_available:platform", + "com.android.crashrecovery", + ], } java_aconfig_library { diff --git a/core/java/Android.bp b/core/java/Android.bp index d12e1bf77e17..9875efe04361 100644 --- a/core/java/Android.bp +++ b/core/java/Android.bp @@ -344,6 +344,13 @@ filegroup { ], } +filegroup { + name: "service-crashrecovery-shared-srcs", + srcs: [ + "android/util/IndentingPrintWriter.java", + ], +} + filegroup { name: "incremental_aidl", srcs: [ diff --git a/packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java b/packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java index 9a8261c20f8a..8e5ae2082ac1 100644 --- a/packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java +++ b/packages/CrashRecovery/services/module/java/com/android/server/PackageWatchdog.java @@ -24,9 +24,12 @@ import static com.android.server.crashrecovery.CrashRecoveryUtils.dumpCrashRecov import static java.lang.annotation.RetentionPolicy.SOURCE; +import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.annotation.SystemApi; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -94,6 +97,8 @@ import java.util.concurrent.TimeUnit; * be notified. * @hide */ +@FlaggedApi(Flags.FLAG_ENABLE_CRASHRECOVERY) +@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) public class PackageWatchdog { private static final String TAG = "PackageWatchdog"; @@ -351,7 +356,7 @@ public class PackageWatchdog { * *

If monitoring a package supporting explicit health check, at the end of the monitoring * duration if {@link #onHealthCheckPassed} was never called, - * {@link PackageHealthObserver#execute} will be called as if the package failed. + * {@link PackageHealthObserver#onExecuteHealthCheckMitigation} will be called as if the package failed. * *

If {@code observer} is already monitoring a package in {@code packageNames}, * the monitoring window of that package will be reset to {@code durationMs} and the health @@ -514,8 +519,8 @@ public class PackageWatchdog { maybeExecute(currentObserverToNotify, versionedPackage, failureReason, currentObserverImpact, mitigationCount); } else { - currentObserverToNotify.execute(versionedPackage, - failureReason, mitigationCount); + currentObserverToNotify.onExecuteHealthCheckMitigation( + versionedPackage, failureReason, mitigationCount); } } } @@ -550,7 +555,8 @@ public class PackageWatchdog { maybeExecute(currentObserverToNotify, failingPackage, failureReason, currentObserverImpact, /*mitigationCount=*/ 1); } else { - currentObserverToNotify.execute(failingPackage, failureReason, 1); + currentObserverToNotify.onExecuteHealthCheckMitigation(failingPackage, + failureReason, 1); } } } @@ -564,7 +570,8 @@ public class PackageWatchdog { synchronized (mLock) { mLastMitigation = mSystemClock.uptimeMillis(); } - currentObserverToNotify.execute(versionedPackage, failureReason, mitigationCount); + currentObserverToNotify.onExecuteHealthCheckMitigation(versionedPackage, failureReason, + mitigationCount); } } @@ -626,12 +633,12 @@ public class PackageWatchdog { currentObserverInternal.setBootMitigationCount( currentObserverMitigationCount); saveAllObserversBootMitigationCountToMetadata(METADATA_FILE); - currentObserverToNotify.executeBootLoopMitigation( + currentObserverToNotify.onExecuteBootLoopMitigation( currentObserverMitigationCount); } else { mBootThreshold.setMitigationCount(mitigationCount); mBootThreshold.saveMitigationCountToMetadata(); - currentObserverToNotify.executeBootLoopMitigation(mitigationCount); + currentObserverToNotify.onExecuteBootLoopMitigation(mitigationCount); } } } @@ -717,7 +724,9 @@ public class PackageWatchdog { return mPackagesExemptFromImpactLevelThreshold; } - /** Possible severity values of the user impact of a {@link PackageHealthObserver#execute}. + /** + * Possible severity values of the user impact of a + * {@link PackageHealthObserver#onExecuteHealthCheckMitigation}. * @hide */ @Retention(SOURCE) @@ -753,6 +762,7 @@ public class PackageWatchdog { } /** Register instances of this interface to receive notifications on package failure. */ + @SuppressLint({"CallbackName"}) public interface PackageHealthObserver { /** * Called when health check fails for the {@code versionedPackage}. @@ -765,7 +775,7 @@ public class PackageWatchdog { * * * @return any one of {@link PackageHealthObserverImpact} to express the impact - * to the user on {@link #execute} + * to the user on {@link #onExecuteHealthCheckMitigation} */ @PackageHealthObserverImpact int onHealthCheckFailed( @Nullable VersionedPackage versionedPackage, @@ -773,7 +783,10 @@ public class PackageWatchdog { int mitigationCount); /** - * Executes mitigation for {@link #onHealthCheckFailed}. + * This would be called after {@link #onHealthCheckFailed}. + * This is called only if current observer returned least + * {@link PackageHealthObserverImpact} mitigation for failed health + * check. * * @param versionedPackage the package that is failing. This may be null if a native * service is crashing. @@ -782,7 +795,7 @@ public class PackageWatchdog { * (including this time). * @return {@code true} if action was executed successfully, {@code false} otherwise */ - boolean execute(@Nullable VersionedPackage versionedPackage, + boolean onExecuteHealthCheckMitigation(@Nullable VersionedPackage versionedPackage, @FailureReasons int failureReason, int mitigationCount); @@ -798,11 +811,14 @@ public class PackageWatchdog { } /** - * Executes mitigation for {@link #onBootLoop} + * This would be called after {@link #onBootLoop}. + * This is called only if current observer returned least + * {@link PackageHealthObserverImpact} mitigation for fixing boot loop + * * @param mitigationCount the number of times mitigation has been attempted for this * boot loop (including this time). */ - default boolean executeBootLoopMitigation(int mitigationCount) { + default boolean onExecuteBootLoopMitigation(int mitigationCount) { return false; } @@ -1083,7 +1099,7 @@ public class PackageWatchdog { if (versionedPkg != null) { Slog.i(TAG, "Explicit health check failed for package " + versionedPkg); - registeredObserver.execute(versionedPkg, + registeredObserver.onExecuteHealthCheckMitigation(versionedPkg, PackageWatchdog.FAILURE_REASON_EXPLICIT_HEALTH_CHECK, 1); } } diff --git a/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java b/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java index f1b2f6b38efa..f1103e19c90e 100644 --- a/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java +++ b/packages/CrashRecovery/services/module/java/com/android/server/RescueParty.java @@ -728,7 +728,7 @@ public class RescueParty { } @Override - public boolean execute(@Nullable VersionedPackage failedPackage, + public boolean onExecuteHealthCheckMitigation(@Nullable VersionedPackage failedPackage, @FailureReasons int failureReason, int mitigationCount) { if (isDisabled()) { return false; @@ -796,7 +796,7 @@ public class RescueParty { } @Override - public boolean executeBootLoopMitigation(int mitigationCount) { + public boolean onExecuteBootLoopMitigation(int mitigationCount) { if (isDisabled()) { return false; } diff --git a/packages/CrashRecovery/services/module/java/com/android/server/rollback/RollbackPackageHealthObserver.java b/packages/CrashRecovery/services/module/java/com/android/server/rollback/RollbackPackageHealthObserver.java index 2931652ee081..8277e573e7c2 100644 --- a/packages/CrashRecovery/services/module/java/com/android/server/rollback/RollbackPackageHealthObserver.java +++ b/packages/CrashRecovery/services/module/java/com/android/server/rollback/RollbackPackageHealthObserver.java @@ -19,8 +19,11 @@ package com.android.server.rollback; import static com.android.server.crashrecovery.CrashRecoveryUtils.logCrashRecoveryEvent; import android.annotation.AnyThread; +import android.annotation.FlaggedApi; import android.annotation.NonNull; import android.annotation.Nullable; +import android.annotation.SuppressLint; +import android.annotation.SystemApi; import android.annotation.WorkerThread; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -75,6 +78,9 @@ import java.util.function.Consumer; * * @hide */ +@FlaggedApi(Flags.FLAG_ENABLE_CRASHRECOVERY) +@SuppressLint({"CallbackName"}) +@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) public final class RollbackPackageHealthObserver implements PackageHealthObserver { private static final String TAG = "RollbackPackageHealthObserver"; private static final String NAME = "rollback-observer"; @@ -148,7 +154,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve // Note: For non-native crashes the rollback-all step has higher impact impact = PackageHealthObserverImpact.USER_IMPACT_LEVEL_30; } else if (getAvailableRollback(failedPackage) != null) { - // Rollback is available, we may get a callback into #execute + // Rollback is available, we may get a callback into #onExecuteHealthCheckMitigation impact = PackageHealthObserverImpact.USER_IMPACT_LEVEL_30; } else if (anyRollbackAvailable) { // If any rollbacks are available, we will commit them @@ -165,7 +171,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public boolean execute(@Nullable VersionedPackage failedPackage, + public boolean onExecuteHealthCheckMitigation(@Nullable VersionedPackage failedPackage, @FailureReasons int rollbackReason, int mitigationCount) { Slog.i(TAG, "Executing remediation." + " failedPackage: " @@ -219,7 +225,7 @@ public final class RollbackPackageHealthObserver implements PackageHealthObserve } @Override - public boolean executeBootLoopMitigation(int mitigationCount) { + public boolean onExecuteBootLoopMitigation(int mitigationCount) { if (Flags.recoverabilityDetection()) { List availableRollbacks = getAvailableRollbacks(); -- GitLab From 9b5439b32a2b8ac2fa15392c509178eb299327b2 Mon Sep 17 00:00:00 2001 From: Song Chun Fan Date: Wed, 16 Oct 2024 14:23:00 -0700 Subject: [PATCH 236/459] [7/N] only the current verifier can call VerificationSession APIs Only the current verifier bound by the system can call VerificationSession APIs and the PackageInstaller API to change the verification policy. This makes sure that even if there are multiple verifiers installed on the device, only the one bound by the system can affect the ongoing installations. + Removes @RequiresPermission from VerificationSession APIs because we no longer directly check for caller permission (instead, we are checking for UID matches) + Add shell commands to get/set the global policy (for testing) + Improve error handling when binding to the verifier has failed + Some code polish FLAG: android.content.pm.verification_service BUG: 360129657 Test: atest CtsPackageManagerTestCases:VerifierServiceTest Change-Id: If90d075ff117c666ae71bb593cad284f65f4d123 --- core/api/system-current.txt | 12 +- .../android/content/pm/IPackageInstaller.aidl | 4 +- .../pkg/IVerificationSessionInterface.aidl | 9 +- .../pm/verify/pkg/VerificationSession.java | 21 +- .../pm/verify/VerificationSessionTest.java | 4 +- .../server/pm/PackageInstallerService.java | 23 +- .../server/pm/PackageInstallerSession.java | 10 +- .../server/pm/PackageManagerShellCommand.java | 92 +++++++ .../pm/verify/pkg/VerifierController.java | 251 ++++++++++-------- .../pm/verify/pkg/VerifierControllerTest.java | 6 + 10 files changed, 277 insertions(+), 155 deletions(-) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 349d06ca8ad6..910c2a8f920c 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -4636,7 +4636,7 @@ package android.content.pm.verify.pkg { @FlaggedApi("android.content.pm.verification_service") public final class VerificationSession implements android.os.Parcelable { method public int describeContents(); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long extendTimeRemaining(long); + method public long extendTimeRemaining(long); method @NonNull public java.util.List getDeclaredLibraries(); method @NonNull public android.os.PersistableBundle getExtensionParams(); method public int getId(); @@ -4644,12 +4644,12 @@ package android.content.pm.verify.pkg { method @NonNull public String getPackageName(); method @NonNull public android.content.pm.SigningInfo getSigningInfo(); method @NonNull public android.net.Uri getStagedPackageUri(); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long getTimeoutTime(); + method public long getTimeoutTime(); method public int getVerificationPolicy(); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus, @NonNull android.os.PersistableBundle); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationIncomplete(int); - method @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public boolean setVerificationPolicy(int); + method public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus); + method public void reportVerificationComplete(@NonNull android.content.pm.verify.pkg.VerificationStatus, @NonNull android.os.PersistableBundle); + method public void reportVerificationIncomplete(int); + method public boolean setVerificationPolicy(int); method public void writeToParcel(@NonNull android.os.Parcel, int); field @NonNull public static final android.os.Parcelable.Creator CREATOR; field public static final int VERIFICATION_INCOMPLETE_NETWORK_UNAVAILABLE = 1; // 0x1 diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl index c911326ccffd..ecea47944c72 100644 --- a/core/java/android/content/pm/IPackageInstaller.aidl +++ b/core/java/android/content/pm/IPackageInstaller.aidl @@ -94,9 +94,9 @@ interface IPackageInstaller { @JavaPassthrough(annotation="@android.annotation.RequiresPermission(anyOf={android.Manifest.permission.INSTALL_PACKAGES,android.Manifest.permission.REQUEST_INSTALL_PACKAGES})") void reportUnarchivalStatus(int unarchiveId, int status, long requiredStorageBytes, in PendingIntent userActionIntent, in UserHandle userHandle); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") + @EnforcePermission("VERIFICATION_AGENT") int getVerificationPolicy(); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") + @EnforcePermission("VERIFICATION_AGENT") boolean setVerificationPolicy(int policy); } diff --git a/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl index 66caf2d0fec0..2ab745205193 100644 --- a/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl +++ b/core/java/android/content/pm/verify/pkg/IVerificationSessionInterface.aidl @@ -24,16 +24,9 @@ import android.os.PersistableBundle; * @hide */ interface IVerificationSessionInterface { - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") long getTimeoutTime(int verificationId); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") long extendTimeRemaining(int verificationId, long additionalMs); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") boolean setVerificationPolicy(int verificationId, int policy); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") void reportVerificationIncomplete(int verificationId, int reason); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") - void reportVerificationComplete(int verificationId, in VerificationStatus status); - @JavaPassthrough(annotation="@android.annotation.RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT)") - void reportVerificationCompleteWithExtensionResponse(int verificationId, in VerificationStatus status, in PersistableBundle response); + void reportVerificationComplete(int verificationId, in VerificationStatus status, in @nullable PersistableBundle extensionResponse); } \ No newline at end of file diff --git a/core/java/android/content/pm/verify/pkg/VerificationSession.java b/core/java/android/content/pm/verify/pkg/VerificationSession.java index 4ade21198f37..97f78e0978fa 100644 --- a/core/java/android/content/pm/verify/pkg/VerificationSession.java +++ b/core/java/android/content/pm/verify/pkg/VerificationSession.java @@ -19,7 +19,6 @@ package android.content.pm.verify.pkg; import android.annotation.FlaggedApi; import android.annotation.IntDef; import android.annotation.NonNull; -import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.content.pm.Flags; import android.content.pm.PackageInstaller; @@ -166,8 +165,8 @@ public final class VerificationSession implements Parcelable { /** * Get the value of Clock.elapsedRealtime() at which time this verification * will timeout as incomplete if no other verification response is provided. + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long getTimeoutTime() { try { return mSession.getTimeoutTime(mId); @@ -190,8 +189,8 @@ public final class VerificationSession implements Parcelable { /** * Override the verification policy for this session. * @return True if the override was successful, False otherwise. + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public boolean setVerificationPolicy(@PackageInstaller.VerificationPolicy int policy) { if (mVerificationPolicy == policy) { // No effective policy change @@ -215,8 +214,8 @@ public final class VerificationSession implements Parcelable { * This may be called multiple times. If the request would bypass any max * duration by the system, the method will return a lower value than the * requested amount that indicates how much the time was extended. + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public long extendTimeRemaining(long additionalMs) { try { return mSession.extendTimeRemaining(mId, additionalMs); @@ -227,9 +226,9 @@ public final class VerificationSession implements Parcelable { /** * Report to the system that verification could not be completed along - * with an approximate reason to pass on to the installer. + * with an approximate reason to pass on to the installer.] + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationIncomplete(@VerificationIncompleteReason int reason) { try { mSession.reportVerificationIncomplete(mId, reason); @@ -242,11 +241,11 @@ public final class VerificationSession implements Parcelable { * Report to the system that the verification has completed and the * install process may act on that status to either block in the case * of failure or continue to process the install in the case of success. + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull VerificationStatus status) { try { - mSession.reportVerificationComplete(mId, status); + mSession.reportVerificationComplete(mId, status, /* extensionResponse= */ null); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -256,12 +255,12 @@ public final class VerificationSession implements Parcelable { * Same as {@link #reportVerificationComplete(VerificationStatus)}, but also provide * a result to the extension params provided in the request, which will be passed to the * installer in the installation result. + * @throws SecurityException if the caller is not the current verifier bound by the system. */ - @RequiresPermission(android.Manifest.permission.VERIFICATION_AGENT) public void reportVerificationComplete(@NonNull VerificationStatus status, - @NonNull PersistableBundle response) { + @NonNull PersistableBundle extensionResponse) { try { - mSession.reportVerificationCompleteWithExtensionResponse(mId, status, response); + mSession.reportVerificationComplete(mId, status, extensionResponse); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java index 90ae306952fe..f1e1df5ae3fb 100644 --- a/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java +++ b/core/tests/coretests/src/android/content/pm/verify/VerificationSessionTest.java @@ -142,10 +142,10 @@ public class VerificationSessionTest { new VerificationStatus.Builder().setVerified(true).build(); mTestSession.reportVerificationComplete(status); verify(mTestSessionInterface, times(1)).reportVerificationComplete( - eq(TEST_ID), eq(status)); + eq(TEST_ID), eq(status), eq(null)); mTestSession.reportVerificationComplete(status, response); verify(mTestSessionInterface, times(1)) - .reportVerificationCompleteWithExtensionResponse( + .reportVerificationComplete( eq(TEST_ID), eq(status), eq(response)); final int reason = VerificationSession.VERIFICATION_INCOMPLETE_UNKNOWN; diff --git a/services/core/java/com/android/server/pm/PackageInstallerService.java b/services/core/java/com/android/server/pm/PackageInstallerService.java index f6a808b6c33e..a59f4bd8abe2 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerService.java +++ b/services/core/java/com/android/server/pm/PackageInstallerService.java @@ -39,6 +39,7 @@ import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT; import static org.xmlpull.v1.XmlPullParser.START_TAG; import android.Manifest; +import android.annotation.EnforcePermission; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; @@ -87,6 +88,7 @@ import android.os.HandlerThread; import android.os.Looper; import android.os.Message; import android.os.ParcelableException; +import android.os.PermissionEnforcer; import android.os.Process; import android.os.RemoteCallback; import android.os.RemoteCallbackList; @@ -314,6 +316,8 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements public PackageInstallerService(Context context, PackageManagerService pm, Supplier apexParserSupplier) { + super(PermissionEnforcer.fromContext(context)); + mContext = context; mPm = pm; @@ -1877,23 +1881,20 @@ public class PackageInstallerService extends IPackageInstaller.Stub implements } @Override + @EnforcePermission(android.Manifest.permission.VERIFICATION_AGENT) public @PackageInstaller.VerificationPolicy int getVerificationPolicy() { - if (mContext.checkCallingOrSelfPermission(Manifest.permission.VERIFICATION_AGENT) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("You need the " - + "com.android.permission.VERIFICATION_AGENT permission " - + "to get the verification policy"); - } + getVerificationPolicy_enforcePermission(); return mVerificationPolicy.get(); } @Override + @EnforcePermission(android.Manifest.permission.VERIFICATION_AGENT) public boolean setVerificationPolicy(@PackageInstaller.VerificationPolicy int policy) { - if (mContext.checkCallingOrSelfPermission(Manifest.permission.VERIFICATION_AGENT) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("You need the " - + "com.android.permission.VERIFICATION_AGENT permission " - + "to set the verification policy"); + setVerificationPolicy_enforcePermission(); + final int callingUid = getCallingUid(); + // Only the verifier currently bound by the system can change the policy, except for Shell + if (!PackageManagerServiceUtils.isRootOrShell(callingUid)) { + mVerifierController.assertCallerIsCurrentVerifier(callingUid); } if (!isValidVerificationPolicy(policy)) { return false; diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 9a9e434c32d3..512b19582237 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -2884,14 +2884,13 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { } // Send the request to the verifier and wait for its response before the rest of // the installation can proceed. + final VerifierCallback verifierCallback = new VerifierCallback(); if (!mVerifierController.startVerificationSession(mPm::snapshotComputer, userId, sessionId, getPackageName(), Uri.fromFile(stageDir), signingInfo, declaredLibraries, mVerificationPolicy.get(), /* extensionParams= */ null, - new VerifierCallback(), /* retry= */ false)) { - // A verifier is installed but cannot be connected. Installation disallowed. - onSessionVerificationFailure(INSTALL_FAILED_INTERNAL_ERROR, - "A verifier agent is available on device but cannot be connected.", - /* extras= */ null); + verifierCallback, /* retry= */ false)) { + // A verifier is installed but cannot be connected. + verifierCallback.onConnectionFailed(); } } else { // No need to check with verifier. Proceed with the rest of the verification. @@ -2995,7 +2994,6 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { onSessionVerificationFailure(INSTALL_FAILED_VERIFICATION_FAILURE, "A verifier agent is available on device but cannot be connected.", bundle); - }); } /** diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 4652c3af1185..f8e56e11735f 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -399,6 +399,10 @@ class PackageManagerShellCommand extends ShellCommand { return runUnarchive(); case "get-domain-verification-agent": return runGetDomainVerificationAgent(); + case "get-verification-policy": + return runGetVerificationPolicy(); + case "set-verification-policy": + return runSetVerificationPolicy(); default: { if (ART_SERVICE_COMMANDS.contains(cmd)) { return runArtServiceCommand(); @@ -4645,6 +4649,86 @@ class PackageManagerShellCommand extends ShellCommand { return 0; } + private int runGetVerificationPolicy() throws RemoteException { + final PrintWriter pw = getOutPrintWriter(); + int userId = UserHandle.USER_ALL; + + String opt; + while ((opt = getNextOption()) != null) { + if (opt.equals("--user")) { + userId = UserHandle.parseUserArg(getNextArgRequired()); + if (userId != UserHandle.USER_ALL && userId != UserHandle.USER_CURRENT) { + UserManagerInternal umi = + LocalServices.getService(UserManagerInternal.class); + UserInfo userInfo = umi.getUserInfo(userId); + if (userInfo == null) { + pw.println("Failure [user " + userId + " doesn't exist]"); + return 1; + } + } + } else { + pw.println("Error: Unknown option: " + opt); + return 1; + } + } + final int translatedUserId = + translateUserId(userId, UserHandle.USER_SYSTEM, "runGetVerificationPolicy"); + try { + final IPackageInstaller installer = mInterface.getPackageInstaller(); + // TODO(b/360129657): global verification policy should be per user + final int policy = installer.getVerificationPolicy(); + pw.println(policy); + } catch (Exception e) { + pw.println("Failure [" + e.getMessage() + "]"); + return 1; + } + return 0; + } + + private int runSetVerificationPolicy() throws RemoteException { + final PrintWriter pw = getOutPrintWriter(); + int userId = UserHandle.USER_ALL; + + String opt; + while ((opt = getNextOption()) != null) { + if (opt.equals("--user")) { + userId = UserHandle.parseUserArg(getNextArgRequired()); + if (userId != UserHandle.USER_ALL && userId != UserHandle.USER_CURRENT) { + UserManagerInternal umi = + LocalServices.getService(UserManagerInternal.class); + UserInfo userInfo = umi.getUserInfo(userId); + if (userInfo == null) { + pw.println("Failure [user " + userId + " doesn't exist]"); + return 1; + } + } + } else { + pw.println("Error: Unknown option: " + opt); + return 1; + } + } + final String policyStr = getNextArg(); + if (policyStr == null) { + pw.println("Error: policy not specified"); + return 1; + } + final int translatedUserId = + translateUserId(userId, UserHandle.USER_SYSTEM, "runSetVerificationPolicy"); + try { + final IPackageInstaller installer = mInterface.getPackageInstaller(); + // TODO(b/360129657): global verification policy should be per user + final boolean success = installer.setVerificationPolicy(Integer.parseInt(policyStr)); + if (!success) { + pw.println("Failure setting verification policy."); + return 1; + } + } catch (Exception e) { + pw.println("Failure [" + e.getMessage() + "]"); + return 1; + } + return 0; + } + @Override public void onHelp() { final PrintWriter pw = getOutPrintWriter(); @@ -5073,6 +5157,14 @@ class PackageManagerShellCommand extends ShellCommand { pw.println(" --user: return the agent of the given user (SYSTEM_USER if unspecified)"); pw.println(" get-package-storage-stats [--user ] "); pw.println(" Return the storage stats for the given app, if present"); + pw.println(" get-verification-policy [--user USER_ID]"); + pw.println(" Display current verification enforcement policy which will be applied to"); + pw.println(" all the future installation sessions"); + pw.println(" --user: show the policy of the given user (SYSTEM_USER if unspecified)"); + pw.println(" set-verification-policy POLICY [--user USER_ID]"); + pw.println(" Sets the verification policy of all the future installation sessions."); + pw.println(" --user: set the policy of the given user (SYSTEM_USER if unspecified)"); + pw.println(""); pw.println(""); printArtServiceHelp(); pw.println(""); diff --git a/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java index a35618b309bb..78849d286ebe 100644 --- a/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java +++ b/services/core/java/com/android/server/pm/verify/pkg/VerifierController.java @@ -18,13 +18,12 @@ package com.android.server.pm.verify.pkg; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE; import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE; +import static android.os.Process.INVALID_UID; import static android.os.Process.SYSTEM_UID; import static android.provider.DeviceConfig.NAMESPACE_PACKAGE_MANAGER_SERVICE; -import android.Manifest; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.RequiresPermission; import android.annotation.SuppressLint; import android.content.ComponentName; import android.content.Context; @@ -114,10 +113,17 @@ public class VerifierController { private final Context mContext; private final Handler mHandler; + // Guards the remote service object, as well as the verifier name and UID, which should all be + // changed at the same time. + private final Object mLock = new Object(); @Nullable + @GuardedBy("mLock") private ServiceConnector mRemoteService; @Nullable + @GuardedBy("mLock") private ComponentName mRemoteServiceComponentName; + @GuardedBy("mLock") + private int mRemoteServiceUid = INVALID_UID; @NonNull private Injector mInjector; @@ -143,9 +149,11 @@ public class VerifierController { */ @Nullable public String getVerifierPackageName(Supplier snapshotSupplier, int userId) { - if (isVerifierConnected()) { - // Verifier is connected or is being connected, so it must be installed. - return mRemoteServiceComponentName.getPackageName(); + synchronized (mLock) { + if (isVerifierConnectedLocked()) { + // Verifier is connected or is being connected, so it must be installed. + return mRemoteServiceComponentName.getPackageName(); + } } // Verifier has been disconnected, or it hasn't been connected. Check if it's installed. return mInjector.getVerifierPackageName(snapshotSupplier.get(), userId); @@ -178,16 +186,29 @@ public class VerifierController { } return true; } + Computer snapshot = snapshotSupplier.get(); Pair, ComponentName> result = - mInjector.getRemoteService(snapshotSupplier.get(), mContext, userId, mHandler); + mInjector.getRemoteService(snapshot, mContext, userId, mHandler); if (result == null || result.first == null) { if (DEBUG) { Slog.i(TAG, "Unable to find a qualified verifier."); } return false; } - mRemoteService = result.first; - mRemoteServiceComponentName = result.second; + final int verifierUid = snapshot.getPackageUidInternal( + result.second.getPackageName(), 0, userId, /* callingUid= */ SYSTEM_UID); + if (verifierUid == INVALID_UID) { + if (DEBUG) { + Slog.i(TAG, "Unable to find the UID of the qualified verifier."); + } + return false; + } + synchronized (mLock) { + mRemoteService = result.first; + mRemoteServiceComponentName = result.second; + mRemoteServiceUid = verifierUid; + } + if (DEBUG) { Slog.i(TAG, "Connecting to a qualified verifier: " + mRemoteServiceComponentName); } @@ -212,10 +233,13 @@ public class VerifierController { } private void destroy() { - if (isVerifierConnected()) { - mRemoteService.unbind(); - mRemoteService = null; - mRemoteServiceComponentName = null; + synchronized (mLock) { + if (isVerifierConnectedLocked()) { + mRemoteService.unbind(); + mRemoteService = null; + mRemoteServiceComponentName = null; + mRemoteServiceUid = INVALID_UID; + } } } }); @@ -223,7 +247,8 @@ public class VerifierController { return true; } - private boolean isVerifierConnected() { + @GuardedBy("mLock") + private boolean isVerifierConnectedLocked() { return mRemoteService != null && mRemoteServiceComponentName != null; } @@ -232,19 +257,21 @@ public class VerifierController { * requested for verification. */ public void notifyPackageNameAvailable(@NonNull String packageName) { - if (!isVerifierConnected()) { - if (DEBUG) { - Slog.i(TAG, "Verifier is not connected. Not notifying package name available"); + synchronized (mLock) { + if (!isVerifierConnectedLocked()) { + if (DEBUG) { + Slog.i(TAG, "Verifier is not connected. Not notifying package name available"); + } + return; } - return; + // Best effort. We don't check for the result. + mRemoteService.run(service -> { + if (DEBUG) { + Slog.i(TAG, "Notifying package name available for " + packageName); + } + service.onPackageNameAvailable(packageName); + }); } - // Best effort. We don't check for the result. - mRemoteService.run(service -> { - if (DEBUG) { - Slog.i(TAG, "Notifying package name available for " + packageName); - } - service.onPackageNameAvailable(packageName); - }); } /** @@ -253,27 +280,29 @@ public class VerifierController { * will no longer be requested for verification, possibly because the installation is canceled. */ public void notifyVerificationCancelled(@NonNull String packageName) { - if (!isVerifierConnected()) { - if (DEBUG) { - Slog.i(TAG, "Verifier is not connected. Not notifying verification cancelled"); + synchronized (mLock) { + if (!isVerifierConnectedLocked()) { + if (DEBUG) { + Slog.i(TAG, "Verifier is not connected. Not notifying verification cancelled"); + } + return; } - return; + // Best effort. We don't check for the result. + mRemoteService.run(service -> { + if (DEBUG) { + Slog.i(TAG, "Notifying verification cancelled for " + packageName); + } + service.onVerificationCancelled(packageName); + }); } - // Best effort. We don't check for the result. - mRemoteService.run(service -> { - if (DEBUG) { - Slog.i(TAG, "Notifying verification cancelled for " + packageName); - } - service.onVerificationCancelled(packageName); - }); } /** * Called to notify the bound verifier agent that a package that's pending installation needs * to be verified right now. *

The verification request must be sent to the verifier as soon as the verifier is - * connected. If the connection cannot be made within {@link #CONNECTION_TIMEOUT_SECONDS}

- * of when the request is sent out, we consider the verification to be failed and notify the + * connected. If the connection cannot be made within the specified time limit from + * when the request is sent out, we consider the verification to be failed and notify the * installation session.

*

If a response is not returned from the verifier agent within a timeout duration from the * time the request is sent to the verifier, the verification will be considered a failure.

@@ -291,43 +320,48 @@ public class VerifierController { if (!bindToVerifierServiceIfNeeded(snapshotSupplier, userId)) { return false; } - if (!isVerifierConnected()) { - if (DEBUG) { - Slog.i(TAG, "Verifier is not connected. Not notifying verification required"); - } - // Normally this should not happen because we just tried to bind. But if the verifier - // just crashed or just became unavailable, we should notify the installation session so - // it can finish with a verification failure. - return false; - } // For now, the verification id is the same as the installation session id. final int verificationId = installationSessionId; - final VerificationSession session = new VerificationSession( - /* id= */ verificationId, - /* installSessionId= */ installationSessionId, - packageName, stagedPackageUri, signingInfo, declaredLibraries, extensionParams, - verificationPolicy, new VerificationSessionInterface(callback)); - AndroidFuture unusedFuture = mRemoteService.post(service -> { - if (!retry) { - if (DEBUG) { - Slog.i(TAG, "Notifying verification required for session " + verificationId); - } - service.onVerificationRequired(session); - } else { + synchronized (mLock) { + if (!isVerifierConnectedLocked()) { if (DEBUG) { - Slog.i(TAG, "Notifying verification retry for session " + verificationId); + Slog.i(TAG, "Verifier is not connected. Not notifying verification required"); } - service.onVerificationRetry(session); - } - }).orTimeout(mInjector.getVerifierConnectionTimeoutMillis(), TimeUnit.MILLISECONDS) - .whenComplete((res, err) -> { - if (err != null) { - Slog.e(TAG, "Error notifying verification request for session " + verificationId, - err); - // Notify the installation session so it can finish with verification failure. - callback.onConnectionFailed(); + // Normally this should not happen because we just tried to bind. But if the + // verifier just crashed or just became unavailable, we should notify the + // installation session so it can finish with a verification failure. + return false; } - }); + final VerificationSession session = new VerificationSession( + /* id= */ verificationId, + /* installSessionId= */ installationSessionId, + packageName, stagedPackageUri, signingInfo, declaredLibraries, extensionParams, + verificationPolicy, new VerificationSessionInterface(callback)); + AndroidFuture unusedFuture = mRemoteService.post(service -> { + if (!retry) { + if (DEBUG) { + Slog.i(TAG, "Notifying verification required for session " + + verificationId); + } + service.onVerificationRequired(session); + } else { + if (DEBUG) { + Slog.i(TAG, "Notifying verification retry for session " + + verificationId); + } + service.onVerificationRetry(session); + } + }).orTimeout(mInjector.getVerifierConnectionTimeoutMillis(), TimeUnit.MILLISECONDS) + .whenComplete((res, err) -> { + if (err != null) { + Slog.e(TAG, "Error notifying verification request for session " + + verificationId, err); + // Notify the installation session so it can finish with verification + // failure. + callback.onConnectionFailed(); + } + }); + } // Keep track of the session status with the ID. Start counting down the session timeout. final long defaultTimeoutMillis = mInjector.getVerificationRequestTimeoutMillis(); final long maxExtendedTimeoutMillis = mInjector.getMaxVerificationExtendedTimeoutMillis(); @@ -369,24 +403,27 @@ public class VerifierController { * Called to notify the bound verifier agent that a verification request has timed out. */ public void notifyVerificationTimeout(int verificationId) { - if (!isVerifierConnected()) { - if (DEBUG) { - Slog.i(TAG, - "Verifier is not connected. Not notifying timeout for " + verificationId); + synchronized (mLock) { + if (!isVerifierConnectedLocked()) { + if (DEBUG) { + Slog.i(TAG, + "Verifier is not connected. Not notifying timeout for " + + verificationId); + } + return; } - return; + AndroidFuture unusedFuture = mRemoteService.post(service -> { + if (DEBUG) { + Slog.i(TAG, "Notifying timeout for " + verificationId); + } + service.onVerificationTimeout(verificationId); + }).whenComplete((res, err) -> { + if (err != null) { + Slog.e(TAG, "Error notifying VerificationTimeout for session " + + verificationId, err); + } + }); } - AndroidFuture unusedFuture = mRemoteService.post(service -> { - if (DEBUG) { - Slog.i(TAG, "Notifying timeout for " + verificationId); - } - service.onVerificationTimeout(verificationId); - }).whenComplete((res, err) -> { - if (err != null) { - Slog.e(TAG, "Error notifying VerificationTimeout for session " - + verificationId, (Throwable) err); - } - }); } /** @@ -405,17 +442,19 @@ public class VerifierController { } } - @RequiresPermission(Manifest.permission.VERIFICATION_AGENT) - private void checkCallerPermission() { - // TODO: think of a better way to test it on non-eng builds - if (Build.IS_ENG) { - return; - } - if (mContext.checkCallingOrSelfPermission(Manifest.permission.VERIFICATION_AGENT) - != PackageManager.PERMISSION_GRANTED) { - throw new SecurityException("You need the" - + " com.android.permission.VERIFICATION_AGENT permission" - + " to use VerificationSession APIs."); + /** + * Assert that the calling UID is the same as the UID of the currently connected verifier. + */ + public void assertCallerIsCurrentVerifier(int callingUid) { + synchronized (mLock) { + if (!isVerifierConnectedLocked()) { + throw new IllegalStateException( + "Unable to proceed because the verifier has been disconnected."); + } + if (callingUid != mRemoteServiceUid) { + throw new IllegalStateException( + "Calling uid " + callingUid + " is not the current verifier."); + } } } @@ -429,7 +468,7 @@ public class VerifierController { @Override public long getTimeoutTime(int verificationId) { - checkCallerPermission(); + assertCallerIsCurrentVerifier(getCallingUid()); synchronized (mVerificationStatus) { final VerificationStatusTracker tracker = mVerificationStatus.get(verificationId); if (tracker == null) { @@ -442,7 +481,7 @@ public class VerifierController { @Override public long extendTimeRemaining(int verificationId, long additionalMs) { - checkCallerPermission(); + assertCallerIsCurrentVerifier(getCallingUid()); synchronized (mVerificationStatus) { final VerificationStatusTracker tracker = mVerificationStatus.get(verificationId); if (tracker == null) { @@ -456,7 +495,7 @@ public class VerifierController { @Override public boolean setVerificationPolicy(int verificationId, @PackageInstaller.VerificationPolicy int policy) { - checkCallerPermission(); + assertCallerIsCurrentVerifier(getCallingUid()); synchronized (mVerificationStatus) { final VerificationStatusTracker tracker = mVerificationStatus.get(verificationId); if (tracker == null) { @@ -469,7 +508,7 @@ public class VerifierController { @Override public void reportVerificationIncomplete(int id, int reason) { - checkCallerPermission(); + assertCallerIsCurrentVerifier(getCallingUid()); final VerificationStatusTracker tracker; synchronized (mVerificationStatus) { tracker = mVerificationStatus.get(id); @@ -484,15 +523,9 @@ public class VerifierController { } @Override - public void reportVerificationComplete(int id, VerificationStatus verificationStatus) { - reportVerificationCompleteWithExtensionResponse(id, verificationStatus, - /* extensionResponse= */ null); - } - - @Override - public void reportVerificationCompleteWithExtensionResponse(int id, - VerificationStatus verificationStatus, PersistableBundle extensionResponse) { - checkCallerPermission(); + public void reportVerificationComplete(int id, VerificationStatus verificationStatus, + @Nullable PersistableBundle extensionResponse) { + assertCallerIsCurrentVerifier(getCallingUid()); final VerificationStatusTracker tracker; synchronized (mVerificationStatus) { tracker = mVerificationStatus.get(id); diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java index 24617984eaf7..3046d4beb7a3 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/verify/pkg/VerifierControllerTest.java @@ -24,6 +24,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -49,6 +50,7 @@ import android.util.Pair; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import androidx.test.platform.app.InstrumentationRegistry; import com.android.internal.infra.AndroidFuture; import com.android.internal.infra.ServiceConnector; @@ -122,6 +124,10 @@ public class VerifierControllerTest { @Before public void setUp() { MockitoAnnotations.initMocks(this); + // Mock that the UID of this test becomes the UID of the verifier + when(mSnapshot.getPackageUidInternal(anyString(), anyLong(), anyInt(), anyInt())) + .thenReturn(InstrumentationRegistry.getInstrumentation().getContext() + .getApplicationInfo().uid); when(mInjector.getVerifierPackageName(any(Computer.class), anyInt())).thenReturn( TEST_VERIFIER_COMPONENT_NAME.getPackageName()); when(mInjector.getRemoteService( -- GitLab From 736e8955eca6b7a367c6b1611202e14b0dc11b10 Mon Sep 17 00:00:00 2001 From: David Padlipsky Date: Wed, 16 Oct 2024 18:44:45 +0000 Subject: [PATCH 237/459] Implement toggle talkback shortcut Bug: 373458181 Test: atest WmTests Flag: com.android.hardware.input.keyboard_a11y_shortcut_control Change-Id: I42d61f620b7b15e0e4d215d6b99b090b9862b15d --- .../hardware/input/KeyGestureEvent.java | 4 +++ .../server/input/KeyGestureController.java | 12 +++++++++ .../server/policy/PhoneWindowManager.java | 26 ++++++++++++++++++- .../policy/TalkbackShortcutController.java | 13 +++++++--- .../server/policy/KeyGestureEventTests.java | 24 +++++++++++++++++ .../server/policy/TestPhoneWindowManager.java | 2 +- 6 files changed, 75 insertions(+), 6 deletions(-) diff --git a/core/java/android/hardware/input/KeyGestureEvent.java b/core/java/android/hardware/input/KeyGestureEvent.java index 2df541818e3d..71d17ebc40e3 100644 --- a/core/java/android/hardware/input/KeyGestureEvent.java +++ b/core/java/android/hardware/input/KeyGestureEvent.java @@ -100,6 +100,7 @@ public final class KeyGestureEvent { public static final int KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT = 60; public static final int KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS = 61; public static final int KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY = 62; + public static final int KEY_GESTURE_TYPE_TOGGLE_TALKBACK = 63; public static final int FLAG_CANCELLED = 1; @@ -177,6 +178,7 @@ public final class KeyGestureEvent { KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT, KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS, KEY_GESTURE_TYPE_MOVE_TO_NEXT_DISPLAY, + KEY_GESTURE_TYPE_TOGGLE_TALKBACK, }) @Retention(RetentionPolicy.SOURCE) public @interface KeyGestureType { @@ -597,6 +599,8 @@ public final class KeyGestureEvent { return "KEY_GESTURE_TYPE_ACCESSIBILITY_SHORTCUT"; case KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS: return "KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS"; + case KEY_GESTURE_TYPE_TOGGLE_TALKBACK: + return "KEY_GESTURE_TYPE_TOGGLE_TALKBACK"; default: return Integer.toHexString(value); } diff --git a/services/core/java/com/android/server/input/KeyGestureController.java b/services/core/java/com/android/server/input/KeyGestureController.java index 2f5236f51c48..bd1625ea6d3e 100644 --- a/services/core/java/com/android/server/input/KeyGestureController.java +++ b/services/core/java/com/android/server/input/KeyGestureController.java @@ -20,6 +20,7 @@ import static android.content.pm.PackageManager.FEATURE_LEANBACK; import static android.content.pm.PackageManager.FEATURE_WATCH; import static android.view.WindowManagerPolicyConstants.FLAG_INTERACTIVE; +import static com.android.hardware.input.Flags.keyboardA11yShortcutControl; import static com.android.hardware.input.Flags.useKeyGestureEventHandler; import static com.android.hardware.input.Flags.useKeyGestureEventHandlerMultiPressGestures; import static com.android.server.flags.Flags.newBugreportKeyboardShortcut; @@ -577,6 +578,17 @@ final class KeyGestureController { focusedToken, /* flags = */0); } break; + case KeyEvent.KEYCODE_T: + if (keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + return handleKeyGesture(deviceId, new int[]{keyCode}, + KeyEvent.META_META_ON | KeyEvent.META_ALT_ON, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK, + KeyGestureEvent.ACTION_GESTURE_COMPLETE, displayId, + focusedToken, /* flags = */0); + } + } + break; case KeyEvent.KEYCODE_DEL: if (newBugreportKeyboardShortcut()) { if (firstDown && mEnableBugReportKeyboardShortcut && event.isMetaPressed() diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index ad5c84026aa6..0b5b0d2a0b26 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -84,6 +84,7 @@ import static android.view.WindowManagerGlobal.ADD_PERMISSION_DENIED; import static android.view.contentprotection.flags.Flags.createAccessibilityOverlayAppOpEnabled; import static com.android.hardware.input.Flags.emojiAndScreenshotKeycodesAvailable; +import static com.android.hardware.input.Flags.keyboardA11yShortcutControl; import static com.android.hardware.input.Flags.modifierShortcutDump; import static com.android.hardware.input.Flags.useKeyGestureEventHandler; import static com.android.hardware.input.Flags.useKeyGestureEventHandlerMultiPressGestures; @@ -1615,7 +1616,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { case TRIPLE_PRESS_PRIMARY_NOTHING: break; case TRIPLE_PRESS_PRIMARY_TOGGLE_ACCESSIBILITY: - mTalkbackShortcutController.toggleTalkback(mCurrentUserId); + mTalkbackShortcutController.toggleTalkback(mCurrentUserId, + TalkbackShortcutController.ShortcutSource.GESTURE); if (mTalkbackShortcutController.isTalkBackShortcutGestureEnabled()) { performHapticFeedback(HapticFeedbackConstants.CONFIRM, "Stem primary - Triple Press - Toggle Accessibility"); @@ -3603,6 +3605,17 @@ public class PhoneWindowManager implements WindowManagerPolicy { return true; } break; + case KeyEvent.KEYCODE_T: + if (keyboardA11yShortcutControl()) { + if (firstDown && event.isMetaPressed() && event.isAltPressed()) { + mTalkbackShortcutController.toggleTalkback(mCurrentUserId, + TalkbackShortcutController.ShortcutSource.KEYBOARD); + notifyKeyGestureCompleted(event, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK); + return true; + } + } + break; case KeyEvent.KEYCODE_DEL: if (newBugreportKeyboardShortcut()) { if (mEnableBugReportKeyboardShortcut && firstDown @@ -4034,6 +4047,8 @@ public class PhoneWindowManager implements WindowManagerPolicy { case KeyGestureEvent.KEY_GESTURE_TYPE_TV_ACCESSIBILITY_SHORTCUT_CHORD: return mDefaultDisplayPolicy.isAwake() && mAccessibilityShortcutController .isAccessibilityShortcutAvailable(false); + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: + return keyboardA11yShortcutControl(); default: return false; } @@ -4251,6 +4266,15 @@ public class PhoneWindowManager implements WindowManagerPolicy { mContext.closeSystemDialogs(); } return true; + case KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK: + if (keyboardA11yShortcutControl()) { + if (complete) { + mTalkbackShortcutController.toggleTalkback(mCurrentUserId, + TalkbackShortcutController.ShortcutSource.KEYBOARD); + } + return true; + } + break; } return false; } diff --git a/services/core/java/com/android/server/policy/TalkbackShortcutController.java b/services/core/java/com/android/server/policy/TalkbackShortcutController.java index e544ae64521c..9e16a7d5e83a 100644 --- a/services/core/java/com/android/server/policy/TalkbackShortcutController.java +++ b/services/core/java/com/android/server/policy/TalkbackShortcutController.java @@ -44,6 +44,11 @@ class TalkbackShortcutController { private final Context mContext; private final PackageManager mPackageManager; + public enum ShortcutSource { + GESTURE, + KEYBOARD, + } + TalkbackShortcutController(Context context) { mContext = context; mPackageManager = mContext.getPackageManager(); @@ -55,7 +60,7 @@ class TalkbackShortcutController { * @return talkback state after toggle. {@code true} if talkback is enabled, {@code false} if * talkback is disabled */ - boolean toggleTalkback(int userId) { + boolean toggleTalkback(int userId, ShortcutSource source) { final Set enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(mContext, userId); ComponentName componentName = getTalkbackComponent(); @@ -65,13 +70,13 @@ class TalkbackShortcutController { boolean isTalkbackAlreadyEnabled = enabledServices.contains(componentName); - if (isTalkBackShortcutGestureEnabled()) { + if (source == ShortcutSource.KEYBOARD || isTalkBackShortcutGestureEnabled()) { isTalkbackAlreadyEnabled = !isTalkbackAlreadyEnabled; AccessibilityUtils.setAccessibilityServiceState(mContext, componentName, - isTalkbackAlreadyEnabled); + isTalkbackAlreadyEnabled, userId); // log stem triple press telemetry if it's a talkback enabled event. - if (isTalkbackAlreadyEnabled) { + if (source == ShortcutSource.GESTURE && isTalkbackAlreadyEnabled) { logStemTriplePressAccessibilityTelemetry(componentName); } } diff --git a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java index cdb45423c11a..d83ffd15ff71 100644 --- a/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java +++ b/services/tests/wmtests/src/com/android/server/policy/KeyGestureEventTests.java @@ -35,6 +35,7 @@ import android.view.KeyEvent; import androidx.test.filters.MediumTest; +import com.android.hardware.input.Flags; import com.android.internal.annotations.Keep; import junit.framework.Assert; @@ -393,6 +394,17 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { META_ON | CTRL_ON); } + @Test + @EnableFlags(Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL) + @DisableFlags(com.android.hardware.input.Flags.FLAG_USE_KEY_GESTURE_EVENT_HANDLER) + public void testToggleTalkbackPress() { + testShortcutInternal("Meta + Alt + T -> Toggle talkback", + new int[]{META_KEY, ALT_KEY, KeyEvent.KEYCODE_T}, + KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK, + KeyEvent.KEYCODE_T, + META_ON | ALT_ON); + } + private void testShortcutInternal(String testName, int[] testKeys, @KeyGestureEvent.KeyGestureType int expectedKeyGestureType, int expectedKey, int expectedModifierState) { @@ -699,4 +711,16 @@ public class KeyGestureEventTests extends ShortcutKeyTestBase { sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_CLOSE_ALL_DIALOGS)); mPhoneWindowManager.assertCloseAllDialogs(); } + + @Test + @EnableFlags(com.android.hardware.input.Flags.FLAG_KEYBOARD_A11Y_SHORTCUT_CONTROL) + public void testKeyGestureToggleTalkback() { + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK)); + mPhoneWindowManager.assertTalkBack(true); + + Assert.assertTrue( + sendKeyGestureEventComplete(KeyGestureEvent.KEY_GESTURE_TYPE_TOGGLE_TALKBACK)); + mPhoneWindowManager.assertTalkBack(false); + } } diff --git a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java index a85f8666d2e1..62670b49b6d2 100644 --- a/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java +++ b/services/tests/wmtests/src/com/android/server/policy/TestPhoneWindowManager.java @@ -197,7 +197,7 @@ class TestPhoneWindowManager { } @Override - boolean toggleTalkback(int currentUserId) { + boolean toggleTalkback(int currentUserId, ShortcutSource source) { mIsTalkBackEnabled = !mIsTalkBackEnabled; return mIsTalkBackEnabled; } -- GitLab From fc314420d3fbbe2c99706ac52b802f3b225942cf Mon Sep 17 00:00:00 2001 From: burakov Date: Fri, 18 Oct 2024 11:11:54 +0000 Subject: [PATCH 238/459] [flexiglass] Fix transition check unintentionally removed in ag/29690011 Bug: 356596436 Flag: com.android.systemui.scene_container Test: Existing unit tests still pass. Change-Id: I73df75469d57a607e72e697a75964460c5a7f153 --- .../stack/ui/viewmodel/NotificationScrollViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt index 574ca3ffe5b6..56b335648138 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationScrollViewModel.kt @@ -104,7 +104,7 @@ constructor( 1f } else if ( change.isTransitioningBetween(Scenes.Gone, Scenes.Shade) || - change.isTransitioning(from = Scenes.Gone, to = Scenes.Lockscreen) + change.isTransitioning(from = Scenes.Shade, to = Scenes.Lockscreen) ) { shadeExpansion } else if (change.isTransitioningBetween(Scenes.Gone, Scenes.QuickSettings)) { -- GitLab From d158b9b8b6ded5c713ac6d860c42ba906ed3fc61 Mon Sep 17 00:00:00 2001 From: Wenyu Zhang Date: Tue, 22 Oct 2024 18:52:58 +0000 Subject: [PATCH 239/459] Revert "Activate hot plugged device" This reverts commit a07f97b74a1707c71ea1956e46dcede0749cc3b2. Reason for revert: Somehow the newly plugged device does not appear in the device list from calling mAudioManager.getDevices(). Maybe there is some timing issue this function is called before the new device is fully available. Bug: b/374174565 Change-Id: Ibb711be5755200bded34b65645966b869a34b876 --- .../settingslib/media/InputRouteManager.java | 18 +----- .../media/InputRouteManagerTest.java | 57 +++---------------- 2 files changed, 10 insertions(+), 65 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java index 63661f698f4e..4f315a2a2486 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/InputRouteManager.java @@ -74,23 +74,7 @@ public final class InputRouteManager { new AudioDeviceCallback() { @Override public void onAudioDevicesAdded(@NonNull AudioDeviceInfo[] addedDevices) { - // Activate the last hot plugged valid input device, to match the output device - // behavior. - @AudioDeviceType int deviceTypeToActivate = mSelectedInputDeviceType; - for (AudioDeviceInfo info : addedDevices) { - if (InputMediaDevice.isSupportedInputDevice(info.getType())) { - deviceTypeToActivate = info.getType(); - } - } - - // Only activate if we find a different valid input device. e.g. if none of the - // addedDevices is supported input device, we don't need to activate anything. - if (mSelectedInputDeviceType != deviceTypeToActivate) { - mSelectedInputDeviceType = deviceTypeToActivate; - AudioDeviceAttributes deviceAttributes = - createInputDeviceAttributes(mSelectedInputDeviceType); - setPreferredDeviceForAllPresets(deviceAttributes); - } + applyDefaultSelectedTypeToAllPresets(); } @Override diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java index d808a25ebc04..782cee23fb42 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/InputRouteManagerTest.java @@ -24,7 +24,6 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeast; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -139,18 +138,6 @@ public class InputRouteManagerTest { /* address= */ ""); } - private AudioDeviceAttributes getUsbHeadsetDeviceAttributes() { - return new AudioDeviceAttributes( - AudioDeviceAttributes.ROLE_INPUT, - AudioDeviceInfo.TYPE_USB_HEADSET, - /* address= */ ""); - } - - private AudioDeviceAttributes getHdmiDeviceAttributes() { - return new AudioDeviceAttributes( - AudioDeviceAttributes.ROLE_INPUT, AudioDeviceInfo.TYPE_HDMI, /* address= */ ""); - } - private void onPreferredDevicesForCapturePresetChanged(InputRouteManager inputRouteManager) { final List audioDeviceAttributesList = new ArrayList(); @@ -316,47 +303,21 @@ public class InputRouteManagerTest { } @Test - public void onAudioDevicesAdded_shouldActivateAddedDevice() { - final AudioManager audioManager = mock(AudioManager.class); - InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); - AudioDeviceInfo[] devices = {mockWiredHeadsetInfo()}; - inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); - - // The only added wired headset will be activated. - for (@MediaRecorder.Source int preset : PRESETS) { - verify(audioManager, atLeast(1)) - .setPreferredDeviceForCapturePreset(preset, getWiredHeadsetDeviceAttributes()); - } - } - - @Test - public void onAudioDevicesAdded_shouldActivateLastAddedDevice() { + public void onAudioDevicesAdded_shouldApplyDefaultSelectedDeviceToAllPresets() { final AudioManager audioManager = mock(AudioManager.class); - InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); - AudioDeviceInfo[] devices = {mockWiredHeadsetInfo(), mockUsbHeadsetInfo()}; - inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); - - // When adding multiple valid input devices, the last added device (usb headset in this - // case) will be activated. - for (@MediaRecorder.Source int preset : PRESETS) { - verify(audioManager, never()) - .setPreferredDeviceForCapturePreset(preset, getWiredHeadsetDeviceAttributes()); - verify(audioManager, atLeast(1)) - .setPreferredDeviceForCapturePreset(preset, getUsbHeadsetDeviceAttributes()); - } - } + AudioDeviceAttributes wiredHeadsetDeviceAttributes = getWiredHeadsetDeviceAttributes(); + when(audioManager.getDevicesForAttributes(INPUT_ATTRIBUTES)) + .thenReturn(Collections.singletonList(wiredHeadsetDeviceAttributes)); - @Test - public void onAudioDevicesAdded_doNotActivateInvalidAddedDevice() { - final AudioManager audioManager = mock(AudioManager.class); InputRouteManager inputRouteManager = new InputRouteManager(mContext, audioManager); - AudioDeviceInfo[] devices = {mockHdmiInfo()}; + AudioDeviceInfo[] devices = {mockWiredHeadsetInfo()}; inputRouteManager.mAudioDeviceCallback.onAudioDevicesAdded(devices); - // Do not activate since HDMI is not a valid input device. + // Called twice, one after initiation, the other after onAudioDevicesAdded call. + verify(audioManager, atLeast(2)).getDevicesForAttributes(INPUT_ATTRIBUTES); for (@MediaRecorder.Source int preset : PRESETS) { - verify(audioManager, never()) - .setPreferredDeviceForCapturePreset(preset, getHdmiDeviceAttributes()); + verify(audioManager, atLeast(2)) + .setPreferredDeviceForCapturePreset(preset, wiredHeadsetDeviceAttributes); } } -- GitLab From 8c463d5f5c59430185c2ecd92f613c200ee2429a Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 22 Oct 2024 14:09:15 -0700 Subject: [PATCH 240/459] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I53edbb69c44b691f67e09f4e7a6b5eb232ddc484 --- core/res/res/values-fa/strings.xml | 10 +++++----- core/res/res/values-km/strings.xml | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml index ad8f056a8609..ad0809f7e501 100644 --- a/core/res/res/values-fa/strings.xml +++ b/core/res/res/values-fa/strings.xml @@ -678,8 +678,8 @@ "مهلت تنظیم اثر انگشت به‌پایان رسید. دوباره امتحان کنید." "عملکرد اثر انگشت لغو شد" "کاربر عملیات اثر انگشت را لغو کرد" - "تلاش‌ها از حد مجاز بیشتر شده است. به‌جای آن از قفل صفحه استفاده کنید." - "تلاش‌های بیش‌ازحد. حالا از قفل صفحه استفاده کنید." + "تلاش‌های بسیار زیاد ناموفق. به‌جای آن، از قفل صفحه استفاده کنید." + "تلاش‌های بسیار زیاد ناموفق. حالا از قفل صفحه استفاده کنید." "اثر انگشت پردازش نشد. دوباره امتحان کنید." "اثر انگشتی ثبت نشده است" "این دستگاه حسگر اثر انگشت ندارد" @@ -740,9 +740,9 @@ "داده‌ چهره جدید ذخیره نشد. اول داده‌ چهره قدیمی را حذف کنید." "عملیات شناسایی چهره لغو شد." "کاربر «قفل‌گشایی با چهره» را لغو کرد" - "تعداد زیادی تلاش ناموفق. بعداً دوباره امتحان کنید." - "تعداد تلاش‌ها از حد مجاز بیشتر شده است. قفل‌گشایی با چهره دردسترس نیست." - "تلاش‌ها بیش از حدمجاز شده است. درعوض قفل صفحه را وارد کنید." + "تلاش‌های بسیار زیاد ناموفق. بعداً دوباره امتحان کنید." + "تلاش‌های بسیار زیاد ناموفق. قفل‌گشایی با چهره دردسترس نیست." + "تلاش‌های بسیار زیاد ناموفق. درعوض، قفل صفحه را وارد کنید." "چهره تأیید نشد. دوباره امتحان کنید." "«قفل‌گشایی با چهره» را راه‌اندازی نکرده‌اید" "از «قفل‌گشایی با چهره» در این دستگاه پشتیبانی نمی‌شود" diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml index df7006ace657..41f2de05d303 100644 --- a/core/res/res/values-km/strings.xml +++ b/core/res/res/values-km/strings.xml @@ -234,7 +234,7 @@ "បើក​បណ្ដាញ​ឥត​ខ្សែ" "បិទ​បណ្ដាញ​ឥតខ្សែ" "ចាក់​សោ​អេក្រង់" - "បិទ" + "បិទថាមពល" "បិទ​កម្ម​វិធី​រោទ៍" "កម្មវិធី​រោទ៍​ញ័រ" "បើក​កម្មវិធី​រោទ៍" @@ -258,11 +258,11 @@ "ជម្រើស Android TV" "ជម្រើស​ទូរស័ព្ទ" "ចាក់​សោ​អេក្រង់" - "បិទ" + "បិទថាមពល" "ថាមពល" "ចាប់ផ្ដើមឡើងវិញ" "អាសន្ន" - "របាយការណ៍​កំហុស" + "របាយការណ៍អំពីបញ្ហា" "បញ្ចប់​សម័យ" "រូបថតអេក្រង់" "របាយការណ៍អំពីបញ្ហា" -- GitLab From b576b62e646ab3b5821d40c930b20cb935f38294 Mon Sep 17 00:00:00 2001 From: Jacqueline Bronger Date: Tue, 22 Oct 2024 23:18:25 +0200 Subject: [PATCH 241/459] Dismiss TV PiP notification right after exiting Previously it was only dismissed during clean up, but it was delayed when exiting the PiP. Going back to fullscreen was already dismissing it immediately. Bug: 362428392 Test: manual - launcherx dashboard and home screen cards are removed immediately after closing PiP from both PiP menu or dashboard controls. Flag: EXEMPT bugfix Change-Id: Ia7d254796ee9f76c8f574f2d2e18d718f87349c7 --- .../Shell/src/com/android/wm/shell/pip/tv/TvPipController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java index 0ed5079b7fba..8ac7f89d8f8a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/tv/TvPipController.java @@ -476,6 +476,7 @@ public class TvPipController implements PipTransitionController.PipTransitionCal } mPipTaskOrganizer.removePip(); mTvPipMenuController.closeMenu(); + mPipNotificationController.dismiss(); } @Override -- GitLab From f9a15f7f4d6cdf8f9aa2a1623f5ae092346b54c5 Mon Sep 17 00:00:00 2001 From: Ats Jenk Date: Tue, 22 Oct 2024 21:28:45 +0000 Subject: [PATCH 242/459] Add flag for TaskViewTaskController clean up Bug: 369995920 Flag: EXEMPT adding flag Change-Id: I6ecc57e2e9216c2124392e1a491bdd135f08322c Test: n/a --- libs/WindowManager/Shell/aconfig/multitasking.aconfig | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libs/WindowManager/Shell/aconfig/multitasking.aconfig b/libs/WindowManager/Shell/aconfig/multitasking.aconfig index cf0a975b6c30..714d5e0de367 100644 --- a/libs/WindowManager/Shell/aconfig/multitasking.aconfig +++ b/libs/WindowManager/Shell/aconfig/multitasking.aconfig @@ -168,3 +168,13 @@ flag { description: "Enables flexibile split feature for split screen" bug: "349828130" } + +flag { + name: "enable_task_view_controller_cleanup" + namespace: "multitasking" + description: "Fix memory leak with task view controllers" + bug: "369995920" + metadata { + purpose: PURPOSE_BUGFIX + } +} -- GitLab From c8f89e7443572b9863976a5bb898d969d759a944 Mon Sep 17 00:00:00 2001 From: Jayant Chowdhary Date: Thu, 17 Oct 2024 02:55:46 +0000 Subject: [PATCH 243/459] camera: Clarify hot pixel map coordinate system when sensor pixel mode is MAXIMUM_RESOLUTION Bug: 373252717 Test: m -j ds-docs-java Flag: EXEMPT Docs only Change-Id: Iffc30c684d5b98a3efb0f275f14cf03171a17700 Signed-off-by: Jayant Chowdhary --- .../camera2/CameraCharacteristics.java | 8 +++---- .../hardware/camera2/CaptureRequest.java | 10 ++++---- .../hardware/camera2/CaptureResult.java | 24 +++++++++++++------ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 37983df75f2b..1137e1e89f67 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -4247,7 +4247,7 @@ public final class CameraCharacteristics extends CameraMetadata + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}.

*

Units: Pixel coordinates on the image sensor

*

Optional - The value for this key may be {@code null} on some devices.

* @@ -4273,7 +4273,7 @@ public final class CameraCharacteristics extends CameraMetadata + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}.

*

Units: Pixels

*

Optional - The value for this key may be {@code null} on some devices.

* @@ -4298,7 +4298,7 @@ public final class CameraCharacteristics extends CameraMetadata + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}.

*

Units: Pixel coordinates on the image sensor

*

Optional - The value for this key may be {@code null} on some devices.

* @@ -4332,7 +4332,7 @@ public final class CameraCharacteristics extends CameraMetadata *
  • This key will be present if * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}, since RAW + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, since RAW * images may not necessarily have a regular bayer pattern when * {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}} is set to * {@link android.hardware.camera2.CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION }.
  • diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index a193ee10b6e6..a5c5a9952879 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -1465,7 +1465,7 @@ public final class CaptureRequest extends CameraMetadata> * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}} + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -1715,7 +1715,7 @@ public final class CaptureRequest extends CameraMetadata> * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}, + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -1940,7 +1940,7 @@ public final class CaptureRequest extends CameraMetadata> * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}, + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -3285,8 +3285,8 @@ public final class CaptureRequest extends CameraMetadata> *

    For camera devices with the * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}

    - *

    {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to * {@link android.hardware.camera2.CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION }.

    diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index e5ca46ab0a72..a6bdb3f1bb07 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -866,7 +866,7 @@ public class CaptureResult extends CameraMetadata> { * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}} + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -1366,7 +1366,7 @@ public class CaptureResult extends CameraMetadata> { * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}, + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -2002,7 +2002,7 @@ public class CaptureResult extends CameraMetadata> { * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}, + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to @@ -3953,8 +3953,8 @@ public class CaptureResult extends CameraMetadata> { *

    For camera devices with the * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}}

    - *

    {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, + * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to * {@link android.hardware.camera2.CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION }.

    @@ -5137,6 +5137,14 @@ public class CaptureResult extends CameraMetadata> { * height dimensions are given in {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE android.sensor.info.pixelArraySize}. * This may include hot pixels that lie outside of the active array * bounds given by {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE android.sensor.info.activeArraySize}.

    + *

    For camera devices with the + * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } + * capability or devices where + * {@link CameraCharacteristics#getAvailableCaptureRequestKeys } + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, + * {@link CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.pixelArraySizeMaximumResolution} will be used as the + * pixel array size if the corresponding request sets {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} to + * {@link android.hardware.camera2.CameraMetadata#SENSOR_PIXEL_MODE_MAXIMUM_RESOLUTION }.

    *

    Range of valid values:

    *

    n <= number of pixels on the sensor. * The (x, y) coordinates must be bounded by @@ -5145,6 +5153,8 @@ public class CaptureResult extends CameraMetadata> { * * @see CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE + * @see CameraCharacteristics#SENSOR_INFO_PIXEL_ARRAY_SIZE_MAXIMUM_RESOLUTION + * @see CaptureRequest#SENSOR_PIXEL_MODE */ @PublicKey @NonNull @@ -5798,8 +5808,8 @@ public class CaptureResult extends CameraMetadata> { *

    For camera devices with the * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_ULTRA_HIGH_RESOLUTION_SENSOR } * capability or devices where {@link CameraCharacteristics#getAvailableCaptureRequestKeys } - * lists {@link CaptureRequest#SENSOR_PIXEL_MODE {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}} - * , the current active physical device + * lists {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode}, + * the current active physical device * {@link CameraCharacteristics#SENSOR_INFO_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.activeArraySizeMaximumResolution} / * {@link CameraCharacteristics#SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE_MAXIMUM_RESOLUTION android.sensor.info.preCorrectionActiveArraySizeMaximumResolution} must be used as the * coordinate system for requests where {@link CaptureRequest#SENSOR_PIXEL_MODE android.sensor.pixelMode} is set to -- GitLab From af1597b2e2f2d608bfa23f8dc0070efb794a15a3 Mon Sep 17 00:00:00 2001 From: "Usha Kokkula (xWF)" Date: Thu, 10 Oct 2024 09:55:21 +0000 Subject: [PATCH 244/459] Google RCS uses FTEU MO SMS for phone number verification Add google-owned SMS short codes for the United States Of America, Canada, Indonesia, Mexico, Ghana, Uganda, Malawi, Brazil, Tanzania,Egypt and the United Arab Emirates. Test: atest android.telephony.cts.SmsUsageMonitorShortCodeTest abtd test : https://android-build.corp.google.com/abtd/run/L81800030007272380/ Bug Id: b/365037248 Change-Id: I10828e50e8e47de8e36274b9a11d80539f5d1656 --- core/res/res/xml/sms_short_codes.xml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/core/res/res/xml/sms_short_codes.xml b/core/res/res/xml/sms_short_codes.xml index 581dee571a69..bb5380e1312d 100644 --- a/core/res/res/xml/sms_short_codes.xml +++ b/core/res/res/xml/sms_short_codes.xml @@ -34,7 +34,7 @@ http://smscoin.net/software/engine/WordPress/Paid+SMS-registration/ --> - + @@ -70,7 +70,7 @@ - + @@ -79,7 +79,7 @@ - + @@ -123,8 +123,8 @@ http://www.tja.ee/public/documents/Elektrooniline_side/Oigusaktid/ENG/Estonian_Numbering_Plan_annex_06_09_2010.mht --> - - + + @@ -147,7 +147,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -226,13 +226,13 @@ - + - + @@ -324,7 +324,7 @@ - + @@ -336,11 +336,11 @@ - + - + -- GitLab From ce18060c15035e1a95ddbae69e73546c21815d10 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 22 Oct 2024 14:35:04 -0700 Subject: [PATCH 245/459] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ib24fb701949a91ea5a348c35359dd526d8f4212e --- libs/WindowManager/Shell/res/values-af/strings.xml | 1 + libs/WindowManager/Shell/res/values-am/strings.xml | 1 + libs/WindowManager/Shell/res/values-ar/strings.xml | 1 + libs/WindowManager/Shell/res/values-as/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-az/strings.xml | 1 + libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml | 1 + libs/WindowManager/Shell/res/values-be/strings.xml | 1 + libs/WindowManager/Shell/res/values-bg/strings.xml | 1 + libs/WindowManager/Shell/res/values-bn/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-bs/strings.xml | 1 + libs/WindowManager/Shell/res/values-ca/strings.xml | 1 + libs/WindowManager/Shell/res/values-cs/strings.xml | 1 + libs/WindowManager/Shell/res/values-da/strings.xml | 1 + libs/WindowManager/Shell/res/values-de/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-el/strings.xml | 1 + libs/WindowManager/Shell/res/values-en-rAU/strings.xml | 1 + libs/WindowManager/Shell/res/values-en-rCA/strings.xml | 1 + libs/WindowManager/Shell/res/values-en-rGB/strings.xml | 1 + libs/WindowManager/Shell/res/values-en-rIN/strings.xml | 1 + libs/WindowManager/Shell/res/values-es-rUS/strings.xml | 1 + libs/WindowManager/Shell/res/values-es/strings.xml | 1 + libs/WindowManager/Shell/res/values-et/strings.xml | 1 + libs/WindowManager/Shell/res/values-eu/strings.xml | 1 + libs/WindowManager/Shell/res/values-fa/strings.xml | 1 + libs/WindowManager/Shell/res/values-fi/strings.xml | 1 + libs/WindowManager/Shell/res/values-fr-rCA/strings.xml | 1 + libs/WindowManager/Shell/res/values-fr/strings.xml | 1 + libs/WindowManager/Shell/res/values-gl/strings.xml | 1 + libs/WindowManager/Shell/res/values-gu/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-hi/strings.xml | 1 + libs/WindowManager/Shell/res/values-hr/strings.xml | 1 + libs/WindowManager/Shell/res/values-hu/strings.xml | 1 + libs/WindowManager/Shell/res/values-hy/strings.xml | 1 + libs/WindowManager/Shell/res/values-in/strings.xml | 1 + libs/WindowManager/Shell/res/values-is/strings.xml | 1 + libs/WindowManager/Shell/res/values-it/strings.xml | 1 + libs/WindowManager/Shell/res/values-iw/strings.xml | 1 + libs/WindowManager/Shell/res/values-ja/strings.xml | 1 + libs/WindowManager/Shell/res/values-ka/strings.xml | 1 + libs/WindowManager/Shell/res/values-kk/strings.xml | 1 + libs/WindowManager/Shell/res/values-km/strings.xml | 1 + libs/WindowManager/Shell/res/values-kn/strings.xml | 1 + libs/WindowManager/Shell/res/values-ko/strings.xml | 1 + libs/WindowManager/Shell/res/values-ky/strings.xml | 1 + libs/WindowManager/Shell/res/values-lo/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-lt/strings.xml | 1 + libs/WindowManager/Shell/res/values-lv/strings.xml | 1 + libs/WindowManager/Shell/res/values-mk/strings.xml | 1 + libs/WindowManager/Shell/res/values-ml/strings.xml | 1 + libs/WindowManager/Shell/res/values-mn/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-mr/strings.xml | 1 + libs/WindowManager/Shell/res/values-ms/strings.xml | 1 + libs/WindowManager/Shell/res/values-my/strings.xml | 1 + libs/WindowManager/Shell/res/values-nb/strings.xml | 1 + libs/WindowManager/Shell/res/values-ne/strings.xml | 1 + libs/WindowManager/Shell/res/values-nl/strings.xml | 1 + libs/WindowManager/Shell/res/values-or/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-pa/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-pl/strings.xml | 1 + libs/WindowManager/Shell/res/values-pt-rBR/strings.xml | 1 + libs/WindowManager/Shell/res/values-pt-rPT/strings.xml | 1 + libs/WindowManager/Shell/res/values-pt/strings.xml | 1 + libs/WindowManager/Shell/res/values-ro/strings.xml | 1 + libs/WindowManager/Shell/res/values-ru/strings.xml | 1 + libs/WindowManager/Shell/res/values-si/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-sk/strings.xml | 1 + libs/WindowManager/Shell/res/values-sl/strings.xml | 1 + libs/WindowManager/Shell/res/values-sq/strings.xml | 2 ++ libs/WindowManager/Shell/res/values-sr/strings.xml | 1 + libs/WindowManager/Shell/res/values-sv/strings.xml | 1 + libs/WindowManager/Shell/res/values-sw/strings.xml | 1 + libs/WindowManager/Shell/res/values-ta/strings.xml | 1 + libs/WindowManager/Shell/res/values-te/strings.xml | 1 + libs/WindowManager/Shell/res/values-th/strings.xml | 1 + libs/WindowManager/Shell/res/values-tl/strings.xml | 1 + libs/WindowManager/Shell/res/values-tr/strings.xml | 1 + libs/WindowManager/Shell/res/values-uk/strings.xml | 1 + libs/WindowManager/Shell/res/values-ur/strings.xml | 1 + libs/WindowManager/Shell/res/values-uz/strings.xml | 1 + libs/WindowManager/Shell/res/values-vi/strings.xml | 1 + libs/WindowManager/Shell/res/values-zh-rCN/strings.xml | 1 + libs/WindowManager/Shell/res/values-zh-rHK/strings.xml | 1 + libs/WindowManager/Shell/res/values-zh-rTW/strings.xml | 1 + libs/WindowManager/Shell/res/values-zu/strings.xml | 1 + 84 files changed, 94 insertions(+) diff --git a/libs/WindowManager/Shell/res/values-af/strings.xml b/libs/WindowManager/Shell/res/values-af/strings.xml index a0718d9ba148..b29e8bf5e922 100644 --- a/libs/WindowManager/Shell/res/values-af/strings.xml +++ b/libs/WindowManager/Shell/res/values-af/strings.xml @@ -134,6 +134,7 @@ "Gryp skerm vas" "App kan nie hierheen geskuif word nie" "Maksimeer" + "Stel terug" "Spring na links" "Spring na regs" "Maak By Verstek Oop-instellings" diff --git a/libs/WindowManager/Shell/res/values-am/strings.xml b/libs/WindowManager/Shell/res/values-am/strings.xml index f160c70b7505..d96033f286f8 100644 --- a/libs/WindowManager/Shell/res/values-am/strings.xml +++ b/libs/WindowManager/Shell/res/values-am/strings.xml @@ -134,6 +134,7 @@ "ማያ ገጹን አሳድግ" "መተግበሪያ ወደዚህ መንቀሳቀስ አይችልም" "አሳድግ" + "ወደነበረበት መልስ" "ወደ ግራ አሳድግ" "ወደ ቀኝ አሳድግ" "በነባሪ ቅንብሮች ክፈት" diff --git a/libs/WindowManager/Shell/res/values-ar/strings.xml b/libs/WindowManager/Shell/res/values-ar/strings.xml index 81706a21f77f..42ef4c307b1e 100644 --- a/libs/WindowManager/Shell/res/values-ar/strings.xml +++ b/libs/WindowManager/Shell/res/values-ar/strings.xml @@ -134,6 +134,7 @@ "التقاط صورة للشاشة" "لا يمكن نقل التطبيق إلى هنا" "تكبير" + "استعادة" "المحاذاة إلى اليسار" "المحاذاة إلى اليمين" "إعدادات الفتح تلقائيًا" diff --git a/libs/WindowManager/Shell/res/values-as/strings.xml b/libs/WindowManager/Shell/res/values-as/strings.xml index 9fd4941afe84..8e9c7045118f 100644 --- a/libs/WindowManager/Shell/res/values-as/strings.xml +++ b/libs/WindowManager/Shell/res/values-as/strings.xml @@ -134,6 +134,8 @@ "স্ক্ৰীন স্নেপ কৰক" "ইয়ালৈ এপ্‌টো আনিব নোৱাৰি" "মেক্সিমাইজ কৰক" + + "বাওঁফাললৈ স্নেপ কৰক" "সোঁফাললৈ স্নেপ কৰক" "ডিফ’ল্ট ছেটিং খোলক" diff --git a/libs/WindowManager/Shell/res/values-az/strings.xml b/libs/WindowManager/Shell/res/values-az/strings.xml index 3ab639730a90..1310f6f743f4 100644 --- a/libs/WindowManager/Shell/res/values-az/strings.xml +++ b/libs/WindowManager/Shell/res/values-az/strings.xml @@ -134,6 +134,7 @@ "Ekranı çəkin" "Tətbiqi bura köçürmək mümkün deyil" "Böyüdün" + "Bərpa edin" "Sola tərəf çəkin" "Sağa tərəf çəkin" "Defolt ayarlarla açın" diff --git a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml index 507625661527..b9c42397f8c7 100644 --- a/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml +++ b/libs/WindowManager/Shell/res/values-b+sr+Latn/strings.xml @@ -134,6 +134,7 @@ "Uklopi ekran" "Aplikacija ne može da se premesti ovde" "Uvećajte" + "Vratite" "Prikačite levo" "Prikačite desno" "Podešavanje Podrazumevano otvaraj" diff --git a/libs/WindowManager/Shell/res/values-be/strings.xml b/libs/WindowManager/Shell/res/values-be/strings.xml index 95530c44562e..5d389d849433 100644 --- a/libs/WindowManager/Shell/res/values-be/strings.xml +++ b/libs/WindowManager/Shell/res/values-be/strings.xml @@ -134,6 +134,7 @@ "Размясціць на палавіне экрана" "Нельга перамясціць сюды праграму" "Разгарнуць" + "Аднавіць" "Размясціць злева" "Размясціць справа" "Налады параметра \"Адкрываць стандартна\"" diff --git a/libs/WindowManager/Shell/res/values-bg/strings.xml b/libs/WindowManager/Shell/res/values-bg/strings.xml index db498c1dfe1a..807878620d90 100644 --- a/libs/WindowManager/Shell/res/values-bg/strings.xml +++ b/libs/WindowManager/Shell/res/values-bg/strings.xml @@ -134,6 +134,7 @@ "Прилепване на екрана" "Приложението не може да бъде преместено тук" "Увеличаване" + "Възстановяване" "Прилепване наляво" "Прилепване надясно" "Отваряне на настройките по подразбиране" diff --git a/libs/WindowManager/Shell/res/values-bn/strings.xml b/libs/WindowManager/Shell/res/values-bn/strings.xml index 4c2025378f04..8db7144e6db6 100644 --- a/libs/WindowManager/Shell/res/values-bn/strings.xml +++ b/libs/WindowManager/Shell/res/values-bn/strings.xml @@ -134,6 +134,8 @@ "স্ক্রিনে অ্যাপ মানানসই হিসেবে ছোট বড় করুন" "অ্যাপটি এখানে সরানো যাবে না" "বড় করুন" + + "বাঁদিকে স্ন্যাপ করুন" "ডানদিকে স্ন্যাপ করুন" "ডিফল্ট হিসেবে থাকা সেটিংস খুলুন" diff --git a/libs/WindowManager/Shell/res/values-bs/strings.xml b/libs/WindowManager/Shell/res/values-bs/strings.xml index 102a91233627..3d922d8334c8 100644 --- a/libs/WindowManager/Shell/res/values-bs/strings.xml +++ b/libs/WindowManager/Shell/res/values-bs/strings.xml @@ -134,6 +134,7 @@ "Snimi ekran" "Ne možete premjestiti aplikaciju ovdje" "Maksimiziranje" + "Vraćanje" "Pomicanje ulijevo" "Pomicanje udesno" "Otvaranje prema zadanim postavkama" diff --git a/libs/WindowManager/Shell/res/values-ca/strings.xml b/libs/WindowManager/Shell/res/values-ca/strings.xml index 3e3fcd05a05b..dc96cd0f72ec 100644 --- a/libs/WindowManager/Shell/res/values-ca/strings.xml +++ b/libs/WindowManager/Shell/res/values-ca/strings.xml @@ -134,6 +134,7 @@ "Ajusta la pantalla" "L\'aplicació no es pot moure aquí" "Maximitza" + "Restaura" "Ajusta a l\'esquerra" "Ajusta a la dreta" "Configuració d\'obertura predeterminada" diff --git a/libs/WindowManager/Shell/res/values-cs/strings.xml b/libs/WindowManager/Shell/res/values-cs/strings.xml index 0627f54ecf47..30ba78ad8e06 100644 --- a/libs/WindowManager/Shell/res/values-cs/strings.xml +++ b/libs/WindowManager/Shell/res/values-cs/strings.xml @@ -134,6 +134,7 @@ "Rozpůlit obrazovku" "Aplikaci sem nelze přesunout" "Maximalizovat" + "Obnovit" "Přichytit vlevo" "Přichytit vpravo" "Otevírat podle výchozího nastavení" diff --git a/libs/WindowManager/Shell/res/values-da/strings.xml b/libs/WindowManager/Shell/res/values-da/strings.xml index ed9e5f07bad3..433b858cfd84 100644 --- a/libs/WindowManager/Shell/res/values-da/strings.xml +++ b/libs/WindowManager/Shell/res/values-da/strings.xml @@ -134,6 +134,7 @@ "Tilpas skærm" "Apps kan ikke flyttes hertil" "Maksimér" + "Gendan" "Fastgør til venstre" "Fastgør til højre" "Indstillinger for automatisk åbning" diff --git a/libs/WindowManager/Shell/res/values-de/strings.xml b/libs/WindowManager/Shell/res/values-de/strings.xml index ec1cb03d7108..0b4d189716c2 100644 --- a/libs/WindowManager/Shell/res/values-de/strings.xml +++ b/libs/WindowManager/Shell/res/values-de/strings.xml @@ -134,6 +134,8 @@ "Bildschirm teilen" "Die App kann nicht hierher verschoben werden" "Maximieren" + + "Links andocken" "Rechts andocken" "Einstellungen für die Option „Standardmäßig öffnen“" diff --git a/libs/WindowManager/Shell/res/values-el/strings.xml b/libs/WindowManager/Shell/res/values-el/strings.xml index 7a690ce2e188..beff019e6897 100644 --- a/libs/WindowManager/Shell/res/values-el/strings.xml +++ b/libs/WindowManager/Shell/res/values-el/strings.xml @@ -134,6 +134,7 @@ "Προβολή στο μισό της οθόνης" "Δεν είναι δυνατή η μετακίνηση της εφαρμογής εδώ" "Μεγιστοποίηση" + "Επαναφορά" "Κούμπωμα αριστερά" "Κούμπωμα δεξιά" "Άνοιγμα ρυθμίσεων από προεπιλογή" diff --git a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml index afb3f8e1a5ce..01d3d25e7e4f 100644 --- a/libs/WindowManager/Shell/res/values-en-rAU/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rAU/strings.xml @@ -134,6 +134,7 @@ "Snap screen" "App can\'t be moved here" "Maximise" + "Restore" "Snap left" "Snap right" "Open by default settings" diff --git a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml index aa392519145b..20ec076a33d1 100644 --- a/libs/WindowManager/Shell/res/values-en-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rCA/strings.xml @@ -134,6 +134,7 @@ "Snap Screen" "App can\'t be moved here" "Maximize" + "Restore" "Snap left" "Snap right" "Open by default settings" diff --git a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml index afb3f8e1a5ce..01d3d25e7e4f 100644 --- a/libs/WindowManager/Shell/res/values-en-rGB/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rGB/strings.xml @@ -134,6 +134,7 @@ "Snap screen" "App can\'t be moved here" "Maximise" + "Restore" "Snap left" "Snap right" "Open by default settings" diff --git a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml index afb3f8e1a5ce..01d3d25e7e4f 100644 --- a/libs/WindowManager/Shell/res/values-en-rIN/strings.xml +++ b/libs/WindowManager/Shell/res/values-en-rIN/strings.xml @@ -134,6 +134,7 @@ "Snap screen" "App can\'t be moved here" "Maximise" + "Restore" "Snap left" "Snap right" "Open by default settings" diff --git a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml index 5244a61883d0..c9e7ecbb056e 100644 --- a/libs/WindowManager/Shell/res/values-es-rUS/strings.xml +++ b/libs/WindowManager/Shell/res/values-es-rUS/strings.xml @@ -134,6 +134,7 @@ "Ajustar pantalla" "No se puede mover la app aquí" "Maximizar" + "Restablecer" "Ajustar a la izquierda" "Ajustar a la derecha" "Abrir con la configuración predeterminada" diff --git a/libs/WindowManager/Shell/res/values-es/strings.xml b/libs/WindowManager/Shell/res/values-es/strings.xml index a673351f8316..903294bbd1cf 100644 --- a/libs/WindowManager/Shell/res/values-es/strings.xml +++ b/libs/WindowManager/Shell/res/values-es/strings.xml @@ -134,6 +134,7 @@ "Ajustar pantalla" "La aplicación no se puede mover aquí" "Maximizar" + "Restaurar" "Acoplar a la izquierda" "Acoplar a la derecha" "Abrir con los ajustes predeterminados" diff --git a/libs/WindowManager/Shell/res/values-et/strings.xml b/libs/WindowManager/Shell/res/values-et/strings.xml index 686385c4bdb8..f6bebff9a4f3 100644 --- a/libs/WindowManager/Shell/res/values-et/strings.xml +++ b/libs/WindowManager/Shell/res/values-et/strings.xml @@ -134,6 +134,7 @@ "Kuva poolel ekraanil" "Rakendust ei saa siia teisaldada" "Maksimeeri" + "Taasta" "Tõmmake vasakule" "Tõmmake paremale" "Avamisviisi vaikeseaded" diff --git a/libs/WindowManager/Shell/res/values-eu/strings.xml b/libs/WindowManager/Shell/res/values-eu/strings.xml index 1f0e54cedd58..267452f2e6e1 100644 --- a/libs/WindowManager/Shell/res/values-eu/strings.xml +++ b/libs/WindowManager/Shell/res/values-eu/strings.xml @@ -134,6 +134,7 @@ "Zatitu pantaila" "Aplikazioa ezin da hona ekarri" "Maximizatu" + "Leheneratu" "Ezarri ezkerrean" "Ezarri eskuinean" "Modu lehenetsian irekitzearen ezarpenak" diff --git a/libs/WindowManager/Shell/res/values-fa/strings.xml b/libs/WindowManager/Shell/res/values-fa/strings.xml index ad39b28eed1e..ec4779b0a129 100644 --- a/libs/WindowManager/Shell/res/values-fa/strings.xml +++ b/libs/WindowManager/Shell/res/values-fa/strings.xml @@ -134,6 +134,7 @@ "بزرگ کردن صفحه" "برنامه را نمی‌توان به اینجا منتقل کرد" "بزرگ کردن" + "بازیابی کردن" "کشیدن به‌چپ" "کشیدن به‌راست" "تنظیمات باز کردن به‌طور پیش‌فرض" diff --git a/libs/WindowManager/Shell/res/values-fi/strings.xml b/libs/WindowManager/Shell/res/values-fi/strings.xml index 2f0edd33226b..6dcd20cc0227 100644 --- a/libs/WindowManager/Shell/res/values-fi/strings.xml +++ b/libs/WindowManager/Shell/res/values-fi/strings.xml @@ -134,6 +134,7 @@ "Jaa näyttö" "Sovellusta ei voi siirtää tänne" "Suurenna" + "Palauta" "Siirrä vasemmalle" "Siirrä oikealle" "Avaa oletusasetusten mukaan" diff --git a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml index 245396156aad..df6d503c2121 100644 --- a/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr-rCA/strings.xml @@ -134,6 +134,7 @@ "Aligner l\'écran" "Impossible de déplacer l\'appli ici" "Agrandir" + "Restaurer" "Épingler à gauche" "Épingler à droite" "Ouvrir les paramètres par défaut" diff --git a/libs/WindowManager/Shell/res/values-fr/strings.xml b/libs/WindowManager/Shell/res/values-fr/strings.xml index aee234565ad0..3a7f2f0bd4fa 100644 --- a/libs/WindowManager/Shell/res/values-fr/strings.xml +++ b/libs/WindowManager/Shell/res/values-fr/strings.xml @@ -134,6 +134,7 @@ "Fractionner l\'écran" "Impossible de déplacer l\'appli ici" "Agrandir" + "Restaurer" "Ancrer à gauche" "Ancrer à droite" "Ouvrir les paramètres par défaut" diff --git a/libs/WindowManager/Shell/res/values-gl/strings.xml b/libs/WindowManager/Shell/res/values-gl/strings.xml index b61588ac24ed..cb7bb324de27 100644 --- a/libs/WindowManager/Shell/res/values-gl/strings.xml +++ b/libs/WindowManager/Shell/res/values-gl/strings.xml @@ -134,6 +134,7 @@ "Encaixar pantalla" "Non se pode mover aquí a aplicación" "Maximizar" + "Restaurar" "Axustar á esquerda" "Axustar á dereita" "Abrir coa configuración predeterminada" diff --git a/libs/WindowManager/Shell/res/values-gu/strings.xml b/libs/WindowManager/Shell/res/values-gu/strings.xml index fd4f2baeb871..bee06fed5fd1 100644 --- a/libs/WindowManager/Shell/res/values-gu/strings.xml +++ b/libs/WindowManager/Shell/res/values-gu/strings.xml @@ -134,6 +134,8 @@ "સ્ક્રીન સ્નૅપ કરો" "ઍપ અહીં ખસેડી શકાતી નથી" "મોટું કરો" + + "ડાબે સ્નૅપ કરો" "જમણે સ્નૅપ કરો" "\'ડિફૉલ્ટ તરીકે ખોલો\' સેટિંગ" diff --git a/libs/WindowManager/Shell/res/values-hi/strings.xml b/libs/WindowManager/Shell/res/values-hi/strings.xml index d2cd23df8296..2c141996b109 100644 --- a/libs/WindowManager/Shell/res/values-hi/strings.xml +++ b/libs/WindowManager/Shell/res/values-hi/strings.xml @@ -134,6 +134,7 @@ "स्नैप स्क्रीन" "ऐप्लिकेशन को यहां मूव नहीं किया जा सकता" "बड़ा करें" + "पहले जैसा करें" "बाईं ओर स्नैप करें" "दाईं ओर स्नैप करें" "डिफ़ॉल्ट सेटिंग के हिसाब से खोलें" diff --git a/libs/WindowManager/Shell/res/values-hr/strings.xml b/libs/WindowManager/Shell/res/values-hr/strings.xml index 80949b4c8edd..a2a52d13b463 100644 --- a/libs/WindowManager/Shell/res/values-hr/strings.xml +++ b/libs/WindowManager/Shell/res/values-hr/strings.xml @@ -134,6 +134,7 @@ "Izradi snimku zaslona" "Aplikacija se ne može premjestiti ovdje" "Maksimiziraj" + "Vrati" "Poravnaj lijevo" "Poravnaj desno" "Otvori prema zadanim postavkama" diff --git a/libs/WindowManager/Shell/res/values-hu/strings.xml b/libs/WindowManager/Shell/res/values-hu/strings.xml index cebf5857db34..03cc9f569d29 100644 --- a/libs/WindowManager/Shell/res/values-hu/strings.xml +++ b/libs/WindowManager/Shell/res/values-hu/strings.xml @@ -134,6 +134,7 @@ "Igazodás a képernyő adott részéhez" "Az alkalmazás nem helyezhető át ide" "Teljes méret" + "Visszaállítás" "Balra igazítás" "Jobbra igazítás" "Alapértelmezett beállítások megnyitása" diff --git a/libs/WindowManager/Shell/res/values-hy/strings.xml b/libs/WindowManager/Shell/res/values-hy/strings.xml index 63a9d6d92134..28c762eb0752 100644 --- a/libs/WindowManager/Shell/res/values-hy/strings.xml +++ b/libs/WindowManager/Shell/res/values-hy/strings.xml @@ -134,6 +134,7 @@ "Ծալել էկրանը" "Հավելվածը հնարավոր չէ տեղափոխել այստեղ" "Ծավալել" + "Վերականգնել" "Ամրացնել ձախ կողմում" "Ամրացնել աջ կողմում" "Բացել կարգավորումներն ըստ կանխադրման" diff --git a/libs/WindowManager/Shell/res/values-in/strings.xml b/libs/WindowManager/Shell/res/values-in/strings.xml index a06d01cc524a..4929b79875a0 100644 --- a/libs/WindowManager/Shell/res/values-in/strings.xml +++ b/libs/WindowManager/Shell/res/values-in/strings.xml @@ -134,6 +134,7 @@ "Gabungkan Layar" "Aplikasi tidak dapat dipindahkan ke sini" "Maksimalkan" + "Pulihkan" "Maksimalkan ke kiri" "Maksimalkan ke kanan" "Buka dengan setelan default" diff --git a/libs/WindowManager/Shell/res/values-is/strings.xml b/libs/WindowManager/Shell/res/values-is/strings.xml index a20f4604ff90..d7ba53f73926 100644 --- a/libs/WindowManager/Shell/res/values-is/strings.xml +++ b/libs/WindowManager/Shell/res/values-is/strings.xml @@ -134,6 +134,7 @@ "Smelluskjár" "Ekki er hægt að færa forritið hingað" "Stækka" + "Endurheimta" "Smella til vinstri" "Smella til hægri" "Stillingar sjálfvirkrar opnunar" diff --git a/libs/WindowManager/Shell/res/values-it/strings.xml b/libs/WindowManager/Shell/res/values-it/strings.xml index 39fd6ba326a6..4522d37d289a 100644 --- a/libs/WindowManager/Shell/res/values-it/strings.xml +++ b/libs/WindowManager/Shell/res/values-it/strings.xml @@ -134,6 +134,7 @@ "Aggancia schermo" "Impossibile spostare l\'app qui" "Ingrandisci" + "Ripristina" "Aggancia a sinistra" "Aggancia a destra" "Apri in base alle impostazioni predefinite" diff --git a/libs/WindowManager/Shell/res/values-iw/strings.xml b/libs/WindowManager/Shell/res/values-iw/strings.xml index 0586d1f8cd16..110d357d0cb2 100644 --- a/libs/WindowManager/Shell/res/values-iw/strings.xml +++ b/libs/WindowManager/Shell/res/values-iw/strings.xml @@ -134,6 +134,7 @@ "כיווץ המסך" "לא ניתן להעביר את האפליקציה לכאן" "הגדלה" + "שחזור" "הצמדה לשמאל" "הצמדה לימין" "הגדרות לפתיחה כברירת מחדל" diff --git a/libs/WindowManager/Shell/res/values-ja/strings.xml b/libs/WindowManager/Shell/res/values-ja/strings.xml index 8aa8269af8a5..69421da5b450 100644 --- a/libs/WindowManager/Shell/res/values-ja/strings.xml +++ b/libs/WindowManager/Shell/res/values-ja/strings.xml @@ -134,6 +134,7 @@ "画面のスナップ" "アプリはここに移動できません" "最大化" + "復元" "左にスナップ" "右にスナップ" "デフォルトの設定で開く" diff --git a/libs/WindowManager/Shell/res/values-ka/strings.xml b/libs/WindowManager/Shell/res/values-ka/strings.xml index 6672599d2763..46859889304a 100644 --- a/libs/WindowManager/Shell/res/values-ka/strings.xml +++ b/libs/WindowManager/Shell/res/values-ka/strings.xml @@ -134,6 +134,7 @@ "აპლიკაციის დაპატარავება ეკრანზე" "აპის აქ გადატანა შეუძლებელია" "მაქსიმალურად გაშლა" + "აღდგენა" "მარცხნივ გადატანა" "მარჯვნივ გადატანა" "პარამეტრების ნაგულისხმევად გახსნა" diff --git a/libs/WindowManager/Shell/res/values-kk/strings.xml b/libs/WindowManager/Shell/res/values-kk/strings.xml index 56ae4416192a..84e7ea5b7af3 100644 --- a/libs/WindowManager/Shell/res/values-kk/strings.xml +++ b/libs/WindowManager/Shell/res/values-kk/strings.xml @@ -134,6 +134,7 @@ "Экранды бөлу" "Қолданба бұл жерге қойылмайды." "Жаю" + "Қалпына келтіру" "Солға тіркеу" "Оңға тіркеу" "Әдепкісінше ашу параметрлері" diff --git a/libs/WindowManager/Shell/res/values-km/strings.xml b/libs/WindowManager/Shell/res/values-km/strings.xml index 460b8678c2c9..7eb81e158513 100644 --- a/libs/WindowManager/Shell/res/values-km/strings.xml +++ b/libs/WindowManager/Shell/res/values-km/strings.xml @@ -134,6 +134,7 @@ "ថតអេក្រង់" "មិនអាចផ្លាស់ទីកម្មវិធីមកទីនេះបានទេ" "ពង្រីក" + "ស្ដារ" "ផ្លាស់ទីទៅឆ្វេង" "ផ្លាស់ទីទៅស្ដាំ" "ការកំណត់បើកតាមលំនាំដើម" diff --git a/libs/WindowManager/Shell/res/values-kn/strings.xml b/libs/WindowManager/Shell/res/values-kn/strings.xml index 2e2be46c21f6..2b43f573e1ab 100644 --- a/libs/WindowManager/Shell/res/values-kn/strings.xml +++ b/libs/WindowManager/Shell/res/values-kn/strings.xml @@ -134,6 +134,7 @@ "ಸ್ನ್ಯಾಪ್ ಸ್ಕ್ರೀನ್" "ಆ್ಯಪ್ ಅನ್ನು ಇಲ್ಲಿಗೆ ಸರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ" "ಮ್ಯಾಕ್ಸಿಮೈಸ್ ಮಾಡಿ" + "ಮರುಸ್ಥಾಪಿಸಿ" "ಎಡಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ" "ಬಲಕ್ಕೆ ಸ್ನ್ಯಾಪ್ ಮಾಡಿ" "ಡೀಫಾಲ್ಟ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಿಂದ ತೆರೆಯಿರಿ" diff --git a/libs/WindowManager/Shell/res/values-ko/strings.xml b/libs/WindowManager/Shell/res/values-ko/strings.xml index 4bcc76dd0259..8f36aab7ce8a 100644 --- a/libs/WindowManager/Shell/res/values-ko/strings.xml +++ b/libs/WindowManager/Shell/res/values-ko/strings.xml @@ -134,6 +134,7 @@ "화면 분할" "앱을 여기로 이동할 수 없음" "최대화하기" + "복원" "왼쪽으로 맞추기" "오른쪽으로 맞추기" "기본값으로 열기 설정" diff --git a/libs/WindowManager/Shell/res/values-ky/strings.xml b/libs/WindowManager/Shell/res/values-ky/strings.xml index 6ae51a4ab770..c1219ba86249 100644 --- a/libs/WindowManager/Shell/res/values-ky/strings.xml +++ b/libs/WindowManager/Shell/res/values-ky/strings.xml @@ -134,6 +134,7 @@ "Экранды сүрөткө тартып алуу" "Колдонмону бул жерге жылдырууга болбойт" "Чоңойтуу" + "Калыбына келтирүү" "Солго жылдыруу" "Оңго жылдыруу" "Демейки шартта ачуу параметрлери" diff --git a/libs/WindowManager/Shell/res/values-lo/strings.xml b/libs/WindowManager/Shell/res/values-lo/strings.xml index f8a09da308b9..375fc6435935 100644 --- a/libs/WindowManager/Shell/res/values-lo/strings.xml +++ b/libs/WindowManager/Shell/res/values-lo/strings.xml @@ -134,6 +134,8 @@ "ສະແນັບໜ້າຈໍ" "ບໍ່ສາມາດຍ້າຍແອັບມາບ່ອນນີ້ໄດ້" "ຂະຫຍາຍໃຫຍ່ສຸດ" + + "ແນບຊ້າຍ" "ແນບຂວາ" "ເປີດຕາມການຕັ້ງຄ່າເລີ່ມຕົ້ນ" diff --git a/libs/WindowManager/Shell/res/values-lt/strings.xml b/libs/WindowManager/Shell/res/values-lt/strings.xml index 857e90e6d340..dfc3b45786de 100644 --- a/libs/WindowManager/Shell/res/values-lt/strings.xml +++ b/libs/WindowManager/Shell/res/values-lt/strings.xml @@ -134,6 +134,7 @@ "Sutraukti ekraną" "Programos negalima perkelti čia" "Padidinti" + "Atkurti" "Pritraukti kairėje" "Pritraukti dešinėje" "Atidaryti pagal numatytuosius nustatymus" diff --git a/libs/WindowManager/Shell/res/values-lv/strings.xml b/libs/WindowManager/Shell/res/values-lv/strings.xml index e56363e06c46..87818524cabe 100644 --- a/libs/WindowManager/Shell/res/values-lv/strings.xml +++ b/libs/WindowManager/Shell/res/values-lv/strings.xml @@ -134,6 +134,7 @@ "Fiksēt ekrānu" "Lietotni nevar pārvietot šeit." "Maksimizēt" + "Atjaunot" "Piestiprināt pa kreisi" "Piestiprināt pa labi" "Atvērt pēc noklusējuma iestatījumiem" diff --git a/libs/WindowManager/Shell/res/values-mk/strings.xml b/libs/WindowManager/Shell/res/values-mk/strings.xml index 1bf7a28aa410..88fed7414758 100644 --- a/libs/WindowManager/Shell/res/values-mk/strings.xml +++ b/libs/WindowManager/Shell/res/values-mk/strings.xml @@ -134,6 +134,7 @@ "Подели го екранот на половина" "Апликацијата не може да се премести овде" "Максимизирај" + "Врати" "Фотографирај лево" "Фотографирај десно" "Отвори според стандардните поставки" diff --git a/libs/WindowManager/Shell/res/values-ml/strings.xml b/libs/WindowManager/Shell/res/values-ml/strings.xml index 3401f6d6b54a..71fb78eca0f3 100644 --- a/libs/WindowManager/Shell/res/values-ml/strings.xml +++ b/libs/WindowManager/Shell/res/values-ml/strings.xml @@ -134,6 +134,7 @@ "സ്‌ക്രീൻ സ്‌നാപ്പ് ചെയ്യുക" "ആപ്പ് ഇവിടേക്ക് നീക്കാനാകില്ല" "വലുതാക്കുക" + "പുനഃസ്ഥാപിക്കുക" "ഇടതുവശത്തേക്ക് സ്‌നാപ്പ് ചെയ്യുക" "വലതുവശത്തേക്ക് സ്‌നാപ്പ് ചെയ്യുക" "ഡിഫോൾട്ട് ക്രമീകരണം ഉപയോഗിച്ച് തുറക്കുക" diff --git a/libs/WindowManager/Shell/res/values-mn/strings.xml b/libs/WindowManager/Shell/res/values-mn/strings.xml index 87708d0a0cc2..04f2f8202961 100644 --- a/libs/WindowManager/Shell/res/values-mn/strings.xml +++ b/libs/WindowManager/Shell/res/values-mn/strings.xml @@ -134,6 +134,8 @@ "Дэлгэцийг таллах" "Аппыг ийш зөөх боломжгүй" "Томруулах" + + "Зүүн тийш зэрэгцүүлэх" "Баруун тийш зэрэгцүүлэх" "Өгөгдмөл тохиргоогоор нээх" diff --git a/libs/WindowManager/Shell/res/values-mr/strings.xml b/libs/WindowManager/Shell/res/values-mr/strings.xml index 1ea41e557c4f..be1df3273b21 100644 --- a/libs/WindowManager/Shell/res/values-mr/strings.xml +++ b/libs/WindowManager/Shell/res/values-mr/strings.xml @@ -134,6 +134,7 @@ "स्क्रीन स्नॅप करा" "अ‍ॅप इथे हलवू शकत नाही" "मोठे करा" + "रिस्टोअर करा" "डावीकडे स्नॅप करा" "उजवीकडे स्नॅप करा" "बाय डीफॉल्ट सेटिंग्ज उघडा" diff --git a/libs/WindowManager/Shell/res/values-ms/strings.xml b/libs/WindowManager/Shell/res/values-ms/strings.xml index ca248e133eb8..04da8869d5a7 100644 --- a/libs/WindowManager/Shell/res/values-ms/strings.xml +++ b/libs/WindowManager/Shell/res/values-ms/strings.xml @@ -134,6 +134,7 @@ "Tangkap Skrin" "Apl tidak boleh dialihkan ke sini" "Maksimumkan" + "Pulihkan" "Autojajar ke kiri" "Autojajar ke kanan" "Buka tetapan secara lalai" diff --git a/libs/WindowManager/Shell/res/values-my/strings.xml b/libs/WindowManager/Shell/res/values-my/strings.xml index 3c4325bfc5b8..915a7cd3d67a 100644 --- a/libs/WindowManager/Shell/res/values-my/strings.xml +++ b/libs/WindowManager/Shell/res/values-my/strings.xml @@ -134,6 +134,7 @@ "စခရင်ကို ချုံ့မည်" "အက်ပ်ကို ဤနေရာသို့ ရွှေ့၍မရပါ" "ချဲ့ရန်" + "ပြန်ပြောင်းရန်" "ဘယ်တွင် ချဲ့ရန်" "ညာတွင် ချဲ့ရန်" "မူရင်းဆက်တင်ဖြင့် ဖွင့်ရန်" diff --git a/libs/WindowManager/Shell/res/values-nb/strings.xml b/libs/WindowManager/Shell/res/values-nb/strings.xml index 4096bbf69fe7..8e5aee1eb49b 100644 --- a/libs/WindowManager/Shell/res/values-nb/strings.xml +++ b/libs/WindowManager/Shell/res/values-nb/strings.xml @@ -134,6 +134,7 @@ "Fest skjermen" "Appen kan ikke flyttes hit" "Maksimer" + "Gjenopprett" "Fest til venstre" "Fest til høyre" "Innstillinger for åpning som standard" diff --git a/libs/WindowManager/Shell/res/values-ne/strings.xml b/libs/WindowManager/Shell/res/values-ne/strings.xml index 2fc5e0902efa..42f2336c63ff 100644 --- a/libs/WindowManager/Shell/res/values-ne/strings.xml +++ b/libs/WindowManager/Shell/res/values-ne/strings.xml @@ -134,6 +134,7 @@ "स्क्रिन स्न्याप गर्नुहोस्" "एप सारेर यहाँ ल्याउन सकिएन" "ठुलो बनाउनुहोस्" + "रिस्टोर गर्नुहोस्" "बायाँतिर स्न्याप गर्नुहोस्" "दायाँतिर स्न्याप गर्नुहोस्" "डिफल्ट सेटिङअनुसार खोल्नुहोस्" diff --git a/libs/WindowManager/Shell/res/values-nl/strings.xml b/libs/WindowManager/Shell/res/values-nl/strings.xml index 65fd8ea44d2e..d19a4d44d6f9 100644 --- a/libs/WindowManager/Shell/res/values-nl/strings.xml +++ b/libs/WindowManager/Shell/res/values-nl/strings.xml @@ -134,6 +134,7 @@ "Scherm halveren" "Kan de app niet hierheen verplaatsen" "Maximaliseren" + "Herstellen" "Links uitlijnen" "Rechts uitlijnen" "Instellingen voor Standaard openen" diff --git a/libs/WindowManager/Shell/res/values-or/strings.xml b/libs/WindowManager/Shell/res/values-or/strings.xml index 1f96daad93b9..f67a6b2b7d38 100644 --- a/libs/WindowManager/Shell/res/values-or/strings.xml +++ b/libs/WindowManager/Shell/res/values-or/strings.xml @@ -134,6 +134,8 @@ "ସ୍କ୍ରିନକୁ ସ୍ନାପ କରନ୍ତୁ" "ଆପକୁ ଏଠାକୁ ମୁଭ କରାଯାଇପାରିବ ନାହିଁ" "ବଡ଼ କରନ୍ତୁ" + + "ବାମରେ ସ୍ନାପ କରନ୍ତୁ" "ଡାହାଣରେ ସ୍ନାପ କରନ୍ତୁ" "ଡିଫଲ୍ଟ ସେଟିଂସକୁ ଖୋଲନ୍ତୁ" diff --git a/libs/WindowManager/Shell/res/values-pa/strings.xml b/libs/WindowManager/Shell/res/values-pa/strings.xml index f93f5097ac66..76d59af75bfb 100644 --- a/libs/WindowManager/Shell/res/values-pa/strings.xml +++ b/libs/WindowManager/Shell/res/values-pa/strings.xml @@ -134,6 +134,8 @@ "ਸਕ੍ਰੀਨ ਨੂੰ ਸਨੈਪ ਕਰੋ" "ਐਪ ਨੂੰ ਇੱਥੇ ਨਹੀਂ ਲਿਜਾਇਆ ਜਾ ਸਕਦਾ" "ਵੱਡਾ ਕਰੋ" + + "ਖੱਬੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ" "ਸੱਜੇ ਪਾਸੇ ਸਨੈਪ ਕਰੋ" "ਪੂਰਵ-ਨਿਰਧਾਰਿਤ ਸੈਟਿੰਗਾਂ ਮੁਤਾਬਕ ਖੋਲ੍ਹੋ" diff --git a/libs/WindowManager/Shell/res/values-pl/strings.xml b/libs/WindowManager/Shell/res/values-pl/strings.xml index 1e76e82094d8..502e53abdcd3 100644 --- a/libs/WindowManager/Shell/res/values-pl/strings.xml +++ b/libs/WindowManager/Shell/res/values-pl/strings.xml @@ -134,6 +134,7 @@ "Przyciągnij ekran" "Nie można przenieść aplikacji tutaj" "Maksymalizuj" + "Przywróć" "Przyciągnij do lewej" "Przyciągnij do prawej" "Ustawienia domyślnego otwierania" diff --git a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml index 0bdb0786ef71..3ec5e76bc5b4 100644 --- a/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rBR/strings.xml @@ -134,6 +134,7 @@ "Ajustar tela" "Não é possível mover o app para cá" "Maximizar" + "Restaurar" "Ajustar à esquerda" "Ajustar à direita" "Configurações \"Abrir por padrão\"" diff --git a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml index 0e10da1e6e0a..184a5b336fd8 100644 --- a/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt-rPT/strings.xml @@ -134,6 +134,7 @@ "Encaixar ecrã" "Não é possível mover a app para aqui" "Maximizar" + "Restaurar" "Encaixar à esquerda" "Encaixar à direita" "Definições de Abrir por predefinição" diff --git a/libs/WindowManager/Shell/res/values-pt/strings.xml b/libs/WindowManager/Shell/res/values-pt/strings.xml index 0bdb0786ef71..3ec5e76bc5b4 100644 --- a/libs/WindowManager/Shell/res/values-pt/strings.xml +++ b/libs/WindowManager/Shell/res/values-pt/strings.xml @@ -134,6 +134,7 @@ "Ajustar tela" "Não é possível mover o app para cá" "Maximizar" + "Restaurar" "Ajustar à esquerda" "Ajustar à direita" "Configurações \"Abrir por padrão\"" diff --git a/libs/WindowManager/Shell/res/values-ro/strings.xml b/libs/WindowManager/Shell/res/values-ro/strings.xml index c94273630432..9703328d4d98 100644 --- a/libs/WindowManager/Shell/res/values-ro/strings.xml +++ b/libs/WindowManager/Shell/res/values-ro/strings.xml @@ -134,6 +134,7 @@ "Micșorează fereastra și fixeaz-o" "Aplicația nu poate fi mutată aici" "Maximizează" + "Restabilește" "Trage la stânga" "Trage la dreapta" "Setări de deschidere în mod prestabilit" diff --git a/libs/WindowManager/Shell/res/values-ru/strings.xml b/libs/WindowManager/Shell/res/values-ru/strings.xml index e2c39387c8b4..401a8aab2576 100644 --- a/libs/WindowManager/Shell/res/values-ru/strings.xml +++ b/libs/WindowManager/Shell/res/values-ru/strings.xml @@ -134,6 +134,7 @@ "Свернуть" "Приложение нельзя сюда переместить" "Развернуть" + "Восстановить" "Привязать слева" "Привязать справа" "Настройки, регулирующие, как по умолчанию открываются ссылки" diff --git a/libs/WindowManager/Shell/res/values-si/strings.xml b/libs/WindowManager/Shell/res/values-si/strings.xml index 83a09f5beffe..c101b4cd757c 100644 --- a/libs/WindowManager/Shell/res/values-si/strings.xml +++ b/libs/WindowManager/Shell/res/values-si/strings.xml @@ -134,6 +134,8 @@ "ස්නැප් තිරය" "යෙදුම මෙතැනට ගෙන යා නොහැක" "විහිදන්න" + + "වමට ස්නැප් කරන්න" "දකුණට ස්නැප් කරන්න" "පෙරනිමි සැකසීම් මඟින් විවෘත කරන්න" diff --git a/libs/WindowManager/Shell/res/values-sk/strings.xml b/libs/WindowManager/Shell/res/values-sk/strings.xml index 1b3907e5775b..7214300f1eb7 100644 --- a/libs/WindowManager/Shell/res/values-sk/strings.xml +++ b/libs/WindowManager/Shell/res/values-sk/strings.xml @@ -134,6 +134,7 @@ "Zobraziť polovicu obrazovky" "Aplikácia sa sem nedá presunúť" "Maximalizovať" + "Obnoviť" "Prichytiť vľavo" "Prichytiť vpravo" "Otvárať podľa predvolených nastavení" diff --git a/libs/WindowManager/Shell/res/values-sl/strings.xml b/libs/WindowManager/Shell/res/values-sl/strings.xml index 0a1b4a691313..04fe7e89c16e 100644 --- a/libs/WindowManager/Shell/res/values-sl/strings.xml +++ b/libs/WindowManager/Shell/res/values-sl/strings.xml @@ -134,6 +134,7 @@ "Pripni zaslon" "Aplikacije ni mogoče premakniti sem" "Maksimiraj" + "Obnovi" "Pripni levo" "Pripni desno" "Nastavitve privzetega odpiranja" diff --git a/libs/WindowManager/Shell/res/values-sq/strings.xml b/libs/WindowManager/Shell/res/values-sq/strings.xml index 75120d2418b5..6662ca1a059d 100644 --- a/libs/WindowManager/Shell/res/values-sq/strings.xml +++ b/libs/WindowManager/Shell/res/values-sq/strings.xml @@ -134,6 +134,8 @@ "Regjistro ekranin" "Aplikacioni nuk mund të zhvendoset këtu" "Maksimizo" + + "Zhvendos majtas" "Zhvendos djathtas" "Hap sipas cilësimeve të parazgjedhura" diff --git a/libs/WindowManager/Shell/res/values-sr/strings.xml b/libs/WindowManager/Shell/res/values-sr/strings.xml index 8b5c4dfff363..d0a4ae684af7 100644 --- a/libs/WindowManager/Shell/res/values-sr/strings.xml +++ b/libs/WindowManager/Shell/res/values-sr/strings.xml @@ -134,6 +134,7 @@ "Уклопи екран" "Апликација не може да се премести овде" "Увећајте" + "Вратите" "Прикачите лево" "Прикачите десно" "Подешавање Подразумевано отварај" diff --git a/libs/WindowManager/Shell/res/values-sv/strings.xml b/libs/WindowManager/Shell/res/values-sv/strings.xml index e40b6492fc71..6ce2a9a1cb4d 100644 --- a/libs/WindowManager/Shell/res/values-sv/strings.xml +++ b/libs/WindowManager/Shell/res/values-sv/strings.xml @@ -134,6 +134,7 @@ "Fäst skärmen" "Det går inte att flytta appen hit" "Utöka" + "Återställ" "Fäst till vänster" "Fäst till höger" "Inställningar för Öppna som standard" diff --git a/libs/WindowManager/Shell/res/values-sw/strings.xml b/libs/WindowManager/Shell/res/values-sw/strings.xml index e63229ccf2cd..40967f02be45 100644 --- a/libs/WindowManager/Shell/res/values-sw/strings.xml +++ b/libs/WindowManager/Shell/res/values-sw/strings.xml @@ -134,6 +134,7 @@ "Panga Madirisha kwenye Skrini" "Imeshindwa kuhamishia programu hapa" "Panua" + "Rejesha" "Telezesha kushoto" "Telezesha kulia" "Fungua kwa mipangilio chaguomsingi" diff --git a/libs/WindowManager/Shell/res/values-ta/strings.xml b/libs/WindowManager/Shell/res/values-ta/strings.xml index 95972f1f9486..3140c2c77fae 100644 --- a/libs/WindowManager/Shell/res/values-ta/strings.xml +++ b/libs/WindowManager/Shell/res/values-ta/strings.xml @@ -134,6 +134,7 @@ "திரையை ஸ்னாப் செய்" "ஆப்ஸை இங்கே நகர்த்த முடியாது" "பெரிதாக்கும்" + "மீட்டெடுக்கும்" "இடதுபுறம் நகர்த்தும்" "வலதுபுறம் நகர்த்தும்" "இயல்பாக அமைப்புகளைத் திறக்கும்" diff --git a/libs/WindowManager/Shell/res/values-te/strings.xml b/libs/WindowManager/Shell/res/values-te/strings.xml index 6223c83d7599..62e62c7a1e25 100644 --- a/libs/WindowManager/Shell/res/values-te/strings.xml +++ b/libs/WindowManager/Shell/res/values-te/strings.xml @@ -134,6 +134,7 @@ "స్క్రీన్‌ను స్నాప్ చేయండి" "యాప్‌ను ఇక్కడకి తరలించడం సాధ్యం కాదు" "మ్యాగ్జిమైజ్ చేయండి" + "రీస్టోర్ చేయండి" "ఎడమ వైపున స్నాప్ చేయండి" "కుడి వైపున స్నాప్ చేయండి" "ఆటోమేటిక్ సెట్టింగ్‌ల ద్వారా తెరవండి" diff --git a/libs/WindowManager/Shell/res/values-th/strings.xml b/libs/WindowManager/Shell/res/values-th/strings.xml index f74499c0ddbf..e6386a20e492 100644 --- a/libs/WindowManager/Shell/res/values-th/strings.xml +++ b/libs/WindowManager/Shell/res/values-th/strings.xml @@ -134,6 +134,7 @@ "สแนปหน้าจอ" "ย้ายแอปมาที่นี่ไม่ได้" "ขยายใหญ่สุด" + "คืนค่า" "จัดพอดีกับทางซ้าย" "จัดพอดีกับทางขวา" "เปิดตามการตั้งค่าเริ่มต้น" diff --git a/libs/WindowManager/Shell/res/values-tl/strings.xml b/libs/WindowManager/Shell/res/values-tl/strings.xml index 7d984e0a1c14..176be336117d 100644 --- a/libs/WindowManager/Shell/res/values-tl/strings.xml +++ b/libs/WindowManager/Shell/res/values-tl/strings.xml @@ -134,6 +134,7 @@ "I-snap ang Screen" "Hindi mailipat dito ang app" "I-maximize" + "I-restore" "I-snap pakaliwa" "I-snap pakanan" "Buksan sa pamamagitan ng mga default na setting" diff --git a/libs/WindowManager/Shell/res/values-tr/strings.xml b/libs/WindowManager/Shell/res/values-tr/strings.xml index ba186aae80c8..73248e3d0c96 100644 --- a/libs/WindowManager/Shell/res/values-tr/strings.xml +++ b/libs/WindowManager/Shell/res/values-tr/strings.xml @@ -134,6 +134,7 @@ "Ekranın Yarısına Tuttur" "Uygulama buraya taşınamıyor" "Ekranı kapla" + "Geri yükle" "Sola tuttur" "Sağa tuttur" "Varsayılan olarak açma ayarları" diff --git a/libs/WindowManager/Shell/res/values-uk/strings.xml b/libs/WindowManager/Shell/res/values-uk/strings.xml index 756e64da4574..a655a3eb452c 100644 --- a/libs/WindowManager/Shell/res/values-uk/strings.xml +++ b/libs/WindowManager/Shell/res/values-uk/strings.xml @@ -134,6 +134,7 @@ "Зафіксувати екран" "Сюди не можна перемістити додаток" "Розгорнути" + "Відновити" "Закріпити ліворуч" "Закріпити праворуч" "Налаштування \"Відкривати за умовчанням\"" diff --git a/libs/WindowManager/Shell/res/values-ur/strings.xml b/libs/WindowManager/Shell/res/values-ur/strings.xml index 8aaa306a2ada..4bdea83e59e3 100644 --- a/libs/WindowManager/Shell/res/values-ur/strings.xml +++ b/libs/WindowManager/Shell/res/values-ur/strings.xml @@ -134,6 +134,7 @@ "اسکرین کا اسناپ شاٹ لیں" "ایپ کو یہاں منتقل نہیں کیا جا سکتا" "بڑا کریں" + "بحال کریں" "دائیں منتقل کریں" "بائیں منتقل کریں" "بطور ڈیفالٹ ترتیبات کھولیں" diff --git a/libs/WindowManager/Shell/res/values-uz/strings.xml b/libs/WindowManager/Shell/res/values-uz/strings.xml index 4e4a58ba25dc..b3a496f27582 100644 --- a/libs/WindowManager/Shell/res/values-uz/strings.xml +++ b/libs/WindowManager/Shell/res/values-uz/strings.xml @@ -134,6 +134,7 @@ "Ekranni biriktirish" "Ilova bu yerga surilmaydi" "Yoyish" + "Tiklash" "Chapga tortish" "Oʻngga tortish" "Birlamchi sozlamalar asosida ochish" diff --git a/libs/WindowManager/Shell/res/values-vi/strings.xml b/libs/WindowManager/Shell/res/values-vi/strings.xml index 09a143af61a0..36d66e432590 100644 --- a/libs/WindowManager/Shell/res/values-vi/strings.xml +++ b/libs/WindowManager/Shell/res/values-vi/strings.xml @@ -134,6 +134,7 @@ "Điều chỉnh kích thước màn hình" "Không di chuyển được ứng dụng đến đây" "Phóng to tối đa" + "Khôi phục" "Di chuyển nhanh sang trái" "Di chuyển nhanh sang phải" "Mở các chế độ cài đặt theo mặc định" diff --git a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml index 795febb0ee3f..64446cd4b342 100644 --- a/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rCN/strings.xml @@ -134,6 +134,7 @@ "屏幕快照" "无法将应用移至此处" "最大化" + "恢复" "贴靠左侧" "贴靠右侧" "默认打开设置" diff --git a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml index 0c6ad618ec58..4970e8b92afb 100644 --- a/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rHK/strings.xml @@ -134,6 +134,7 @@ "貼齊畫面" "應用程式無法移至這裡" "最大化" + "還原" "貼齊左邊" "貼齊右邊" "採用預設設定打開" diff --git a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml index 442a6feae787..fcdcccaee5f5 100644 --- a/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml +++ b/libs/WindowManager/Shell/res/values-zh-rTW/strings.xml @@ -134,6 +134,7 @@ "貼齊畫面" "應用程式無法移至此處" "最大化" + "還原" "靠左對齊" "靠右對齊" "開啟連結的預設設定" diff --git a/libs/WindowManager/Shell/res/values-zu/strings.xml b/libs/WindowManager/Shell/res/values-zu/strings.xml index 47613d451a33..cbc6c022a3c6 100644 --- a/libs/WindowManager/Shell/res/values-zu/strings.xml +++ b/libs/WindowManager/Shell/res/values-zu/strings.xml @@ -134,6 +134,7 @@ "Thwebula Isikrini" "I-app ayikwazi ukuhanjiswa lapha" "Khulisa" + "Buyisela" "Chofoza kwesobunxele" "Chofoza kwesokudla" "Vula amasethingi ngokuzenzakalela" -- GitLab From 01ccb45fe40cca005f87af261ebaa4a2584f851c Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Tue, 22 Oct 2024 14:36:02 -0700 Subject: [PATCH 246/459] Apply new code formatting to navigationbar Apply ktfmt 0.52 formatting to com.android.systemui.navigationbar Test: atest SystemUITests:com.android.systemui.navigationbar.gestural Flag: EXEMPT Code formatting Change-Id: Id940efb9a2b7919f1d7cee38d312c553af79ba8c --- .../navigationbar/TaskbarDelegateTest.kt | 91 +++---- ...ingRotationButtonPositionCalculatorTest.kt | 222 ++++++++++-------- .../NavigationBarControllerEmptyImpl.kt | 12 +- .../navigationbar/gestural/BackPanel.kt | 58 ++--- .../gestural/BackPanelController.kt | 40 ++-- .../navigationbar/gestural/EdgePanelParams.kt | 26 +- .../gestural/domain/GestureInteractor.kt | 4 +- .../NavbarOrientationTrackingLogger.kt | 4 +- 8 files changed, 246 insertions(+), 211 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt index eae6cdbe4d2c..d921dde1fa44 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/TaskbarDelegateTest.kt @@ -35,44 +35,30 @@ import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidJUnit4::class) class TaskbarDelegateTest : SysuiTestCase() { - val DISPLAY_ID = 0; - val MODE_GESTURE = 0; - val MODE_THREE_BUTTON = 1; + val DISPLAY_ID = 0 + + val MODE_GESTURE = 0 + + val MODE_THREE_BUTTON = 1 private lateinit var mTaskStackChangeListeners: TaskStackChangeListeners private lateinit var mTaskbarDelegate: TaskbarDelegate - @Mock - lateinit var mEdgeBackGestureHandler : EdgeBackGestureHandler - @Mock - lateinit var mLightBarControllerFactory : LightBarTransitionsController.Factory - @Mock - lateinit var mLightBarTransitionController: LightBarTransitionsController - @Mock - lateinit var mCommandQueue: CommandQueue - @Mock - lateinit var mOverviewProxyService: OverviewProxyService - @Mock - lateinit var mNavBarHelper: NavBarHelper - @Mock - lateinit var mNavigationModeController: NavigationModeController - @Mock - lateinit var mSysUiState: SysUiState - @Mock - lateinit var mDumpManager: DumpManager - @Mock - lateinit var mAutoHideController: AutoHideController - @Mock - lateinit var mLightBarController: LightBarController - @Mock - lateinit var mOptionalPip: Optional - @Mock - lateinit var mBackAnimation: BackAnimation - @Mock - lateinit var mCurrentSysUiState: NavBarHelper.CurrentSysuiState - @Mock - lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager - @Mock - lateinit var mStatusBarStateController: StatusBarStateController + @Mock lateinit var mEdgeBackGestureHandler: EdgeBackGestureHandler + @Mock lateinit var mLightBarControllerFactory: LightBarTransitionsController.Factory + @Mock lateinit var mLightBarTransitionController: LightBarTransitionsController + @Mock lateinit var mCommandQueue: CommandQueue + @Mock lateinit var mOverviewProxyService: OverviewProxyService + @Mock lateinit var mNavBarHelper: NavBarHelper + @Mock lateinit var mNavigationModeController: NavigationModeController + @Mock lateinit var mSysUiState: SysUiState + @Mock lateinit var mDumpManager: DumpManager + @Mock lateinit var mAutoHideController: AutoHideController + @Mock lateinit var mLightBarController: LightBarController + @Mock lateinit var mOptionalPip: Optional + @Mock lateinit var mBackAnimation: BackAnimation + @Mock lateinit var mCurrentSysUiState: NavBarHelper.CurrentSysuiState + @Mock lateinit var mStatusBarKeyguardViewManager: StatusBarKeyguardViewManager + @Mock lateinit var mStatusBarStateController: StatusBarStateController @Before fun setup() { @@ -82,11 +68,26 @@ class TaskbarDelegateTest : SysuiTestCase() { `when`(mNavBarHelper.currentSysuiState).thenReturn(mCurrentSysUiState) `when`(mSysUiState.setFlag(anyLong(), anyBoolean())).thenReturn(mSysUiState) mTaskStackChangeListeners = TaskStackChangeListeners.getTestInstance() - mTaskbarDelegate = TaskbarDelegate(context, mLightBarControllerFactory, - mStatusBarKeyguardViewManager, mStatusBarStateController) - mTaskbarDelegate.setDependencies(mCommandQueue, mOverviewProxyService, mNavBarHelper, - mNavigationModeController, mSysUiState, mDumpManager, mAutoHideController, - mLightBarController, mOptionalPip, mBackAnimation, mTaskStackChangeListeners) + mTaskbarDelegate = + TaskbarDelegate( + context, + mLightBarControllerFactory, + mStatusBarKeyguardViewManager, + mStatusBarStateController, + ) + mTaskbarDelegate.setDependencies( + mCommandQueue, + mOverviewProxyService, + mNavBarHelper, + mNavigationModeController, + mSysUiState, + mDumpManager, + mAutoHideController, + mLightBarController, + mOptionalPip, + mBackAnimation, + mTaskStackChangeListeners, + ) } @Test @@ -108,10 +109,12 @@ class TaskbarDelegateTest : SysuiTestCase() { fun screenPinningEnabled_updatesSysuiState() { mTaskbarDelegate.init(DISPLAY_ID) mTaskStackChangeListeners.listenerImpl.onLockTaskModeChanged( - ActivityManager.LOCK_TASK_MODE_PINNED) - verify(mSysUiState, times(1)).setFlag( - ArgumentMatchers.eq(QuickStepContract.SYSUI_STATE_SCREEN_PINNING), - ArgumentMatchers.eq(true) + ActivityManager.LOCK_TASK_MODE_PINNED ) + verify(mSysUiState, times(1)) + .setFlag( + ArgumentMatchers.eq(QuickStepContract.SYSUI_STATE_SCREEN_PINNING), + ArgumentMatchers.eq(true), + ) } } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/gestural/FloatingRotationButtonPositionCalculatorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/gestural/FloatingRotationButtonPositionCalculatorTest.kt index f3cea3e8bb96..a64eda7af790 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/gestural/FloatingRotationButtonPositionCalculatorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/navigationbar/gestural/FloatingRotationButtonPositionCalculatorTest.kt @@ -8,24 +8,23 @@ import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalcul import com.android.systemui.shared.rotation.FloatingRotationButtonPositionCalculator.Position import com.google.common.truth.Truth.assertThat import org.junit.Test +import org.junit.runner.RunWith import platform.test.runner.parameterized.ParameterizedAndroidJunit4 -import platform.test.runner.parameterized.Parameter import platform.test.runner.parameterized.Parameters -import org.junit.runner.RunWith @RunWith(ParameterizedAndroidJunit4::class) @SmallTest -internal class FloatingRotationButtonPositionCalculatorTest( - private val testCase: TestCase, -) : SysuiTestCase() { +internal class FloatingRotationButtonPositionCalculatorTest(private val testCase: TestCase) : + SysuiTestCase() { @Test fun calculatePosition() { - val position = testCase.calculator.calculatePosition( - testCase.rotation, - testCase.taskbarVisible, - testCase.taskbarStashed - ) + val position = + testCase.calculator.calculatePosition( + testCase.rotation, + testCase.taskbarVisible, + testCase.taskbarStashed, + ) assertThat(position).isEqualTo(testCase.expectedPosition) } @@ -34,21 +33,22 @@ internal class FloatingRotationButtonPositionCalculatorTest( val rotation: Int, val taskbarVisible: Boolean, val taskbarStashed: Boolean, - val expectedPosition: Position + val expectedPosition: Position, ) { - override fun toString(): String = - buildString { - append("when calculator = ") - append(when (calculator) { - posLeftCalculator -> "LEFT" - posRightCalculator -> "RIGHT" - else -> error("Unknown calculator: $calculator") - }) - append(", rotation = $rotation") - append(", taskbarVisible = $taskbarVisible") - append(", taskbarStashed = $taskbarStashed") - append(" - expected $expectedPosition") + override fun toString(): String = buildString { + append("when calculator = ") + append( + when (calculator) { + posLeftCalculator -> "LEFT" + posRightCalculator -> "RIGHT" + else -> error("Unknown calculator: $calculator") } + ) + append(", rotation = $rotation") + append(", taskbarVisible = $taskbarVisible") + append(", taskbarStashed = $taskbarStashed") + append(" - expected $expectedPosition") + } } companion object { @@ -56,12 +56,20 @@ internal class FloatingRotationButtonPositionCalculatorTest( private const val MARGIN_TASKBAR_LEFT = 20 private const val MARGIN_TASKBAR_BOTTOM = 30 - private val posLeftCalculator = FloatingRotationButtonPositionCalculator( - MARGIN_DEFAULT, MARGIN_TASKBAR_LEFT, MARGIN_TASKBAR_BOTTOM, true - ) - private val posRightCalculator = FloatingRotationButtonPositionCalculator( - MARGIN_DEFAULT, MARGIN_TASKBAR_LEFT, MARGIN_TASKBAR_BOTTOM, false - ) + private val posLeftCalculator = + FloatingRotationButtonPositionCalculator( + MARGIN_DEFAULT, + MARGIN_TASKBAR_LEFT, + MARGIN_TASKBAR_BOTTOM, + true, + ) + private val posRightCalculator = + FloatingRotationButtonPositionCalculator( + MARGIN_DEFAULT, + MARGIN_TASKBAR_LEFT, + MARGIN_TASKBAR_BOTTOM, + false, + ) @Parameters(name = "{0}") @JvmStatic @@ -73,77 +81,84 @@ internal class FloatingRotationButtonPositionCalculatorTest( rotation = Surface.ROTATION_0, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.LEFT, - translationX = MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.LEFT, + translationX = MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_90, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.RIGHT, - translationX = -MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.RIGHT, + translationX = -MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_180, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.TOP or Gravity.RIGHT, - translationX = -MARGIN_DEFAULT, - translationY = MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.TOP or Gravity.RIGHT, + translationX = -MARGIN_DEFAULT, + translationY = MARGIN_DEFAULT, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_270, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.TOP or Gravity.LEFT, - translationX = MARGIN_DEFAULT, - translationY = MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.TOP or Gravity.LEFT, + translationX = MARGIN_DEFAULT, + translationY = MARGIN_DEFAULT, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_0, taskbarVisible = true, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.LEFT, - translationX = MARGIN_TASKBAR_LEFT, - translationY = -MARGIN_TASKBAR_BOTTOM - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.LEFT, + translationX = MARGIN_TASKBAR_LEFT, + translationY = -MARGIN_TASKBAR_BOTTOM, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_0, taskbarVisible = true, taskbarStashed = true, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.LEFT, - translationX = MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.LEFT, + translationX = MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posLeftCalculator, rotation = Surface.ROTATION_90, taskbarVisible = true, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.RIGHT, - translationX = -MARGIN_TASKBAR_LEFT, - translationY = -MARGIN_TASKBAR_BOTTOM - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.RIGHT, + translationX = -MARGIN_TASKBAR_LEFT, + translationY = -MARGIN_TASKBAR_BOTTOM, + ), ), // Position right @@ -152,78 +167,85 @@ internal class FloatingRotationButtonPositionCalculatorTest( rotation = Surface.ROTATION_0, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.RIGHT, - translationX = -MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.RIGHT, + translationX = -MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_90, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.TOP or Gravity.RIGHT, - translationX = -MARGIN_DEFAULT, - translationY = MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.TOP or Gravity.RIGHT, + translationX = -MARGIN_DEFAULT, + translationY = MARGIN_DEFAULT, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_180, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.TOP or Gravity.LEFT, - translationX = MARGIN_DEFAULT, - translationY = MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.TOP or Gravity.LEFT, + translationX = MARGIN_DEFAULT, + translationY = MARGIN_DEFAULT, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_270, taskbarVisible = false, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.LEFT, - translationX = MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.LEFT, + translationX = MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_0, taskbarVisible = true, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.RIGHT, - translationX = -MARGIN_TASKBAR_LEFT, - translationY = -MARGIN_TASKBAR_BOTTOM - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.RIGHT, + translationX = -MARGIN_TASKBAR_LEFT, + translationY = -MARGIN_TASKBAR_BOTTOM, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_0, taskbarVisible = true, taskbarStashed = true, - expectedPosition = Position( - gravity = Gravity.BOTTOM or Gravity.RIGHT, - translationX = -MARGIN_DEFAULT, - translationY = -MARGIN_DEFAULT - ) + expectedPosition = + Position( + gravity = Gravity.BOTTOM or Gravity.RIGHT, + translationX = -MARGIN_DEFAULT, + translationY = -MARGIN_DEFAULT, + ), ), TestCase( calculator = posRightCalculator, rotation = Surface.ROTATION_90, taskbarVisible = true, taskbarStashed = false, - expectedPosition = Position( - gravity = Gravity.TOP or Gravity.RIGHT, - translationX = -MARGIN_TASKBAR_LEFT, - translationY = MARGIN_TASKBAR_BOTTOM - ) - ) + expectedPosition = + Position( + gravity = Gravity.TOP or Gravity.RIGHT, + translationX = -MARGIN_TASKBAR_LEFT, + translationY = MARGIN_TASKBAR_BOTTOM, + ), + ), ) } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt index c392c2ff17f3..45ff7f4f87ef 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarControllerEmptyImpl.kt @@ -18,9 +18,9 @@ package com.android.systemui.navigationbar import com.android.internal.statusbar.RegisterStatusBarResult import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.shared.statusbar.phone.BarTransitions import com.android.systemui.navigationbar.views.NavigationBar import com.android.systemui.navigationbar.views.NavigationBarView +import com.android.systemui.shared.statusbar.phone.BarTransitions import javax.inject.Inject /** A no-op version of [NavigationBarController] for variants like Arc and TV. */ @@ -30,18 +30,28 @@ class NavigationBarControllerEmptyImpl @Inject constructor() : NavigationBarCont includeDefaultDisplay: Boolean, result: RegisterStatusBarResult?, ) {} + override fun removeNavigationBar(displayId: Int) {} + override fun checkNavBarModes(displayId: Int) {} + override fun finishBarAnimations(displayId: Int) {} + override fun touchAutoDim(displayId: Int) {} + override fun transitionTo( displayId: Int, @BarTransitions.TransitionMode barMode: Int, animate: Boolean, ) {} + override fun disableAnimationsDuringHide(displayId: Int, delay: Long) {} + override fun getDefaultNavigationBarView(): NavigationBarView? = null + override fun getNavigationBarView(displayId: Int): NavigationBarView? = null + override fun isOverviewEnabled(displayId: Int) = false + override fun getDefaultNavigationBar(): NavigationBar? = null } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt index e931f8f5398a..2d001508a720 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanel.kt @@ -46,7 +46,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : private var arrowLength = AnimatedFloat( name = "arrowLength", - minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_PIXELS + minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_PIXELS, ) /** @@ -56,7 +56,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : var arrowHeight = AnimatedFloat( name = "arrowHeight", - minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_ROTATION_DEGREES + minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_ROTATION_DEGREES, ) val backgroundWidth = @@ -89,7 +89,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : AnimatedFloat( name = "scale", minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_SCALE, - minimumValue = 0f + minimumValue = 0f, ) val scalePivotX = @@ -111,7 +111,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : name = "arrowAlpha", minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_ALPHA, minimumValue = 0f, - maximumValue = 1f + maximumValue = 1f, ) val backgroundAlpha = @@ -119,7 +119,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : name = "backgroundAlpha", minimumVisibleChange = SpringAnimation.MIN_VISIBLE_CHANGE_ALPHA, minimumValue = 0f, - maximumValue = 1f + maximumValue = 1f, ) private val allAnimatedFloat = @@ -133,7 +133,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : scale, horizontalTranslation, arrowAlpha, - backgroundAlpha + backgroundAlpha, ) /** @@ -162,7 +162,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : com.android.internal.R.attr.materialColorOnSecondaryContainer } else { com.android.internal.R.attr.materialColorOnSecondaryFixed - } + }, ) arrowBackgroundPaint.color = @@ -172,7 +172,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : com.android.internal.R.attr.materialColorSecondaryContainer } else { com.android.internal.R.attr.materialColorSecondaryFixedDim - } + }, ) } @@ -242,7 +242,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : fun stretchTo( stretchAmount: Float, startingVelocity: Float? = null, - springForce: SpringForce? = null + springForce: SpringForce? = null, ) { animation.apply { startingVelocity?.let { @@ -303,7 +303,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : fun addAnimationEndListener( animatedFloat: AnimatedFloat, - endListener: DelayedOnAnimationEndListener + endListener: DelayedOnAnimationEndListener, ): Boolean { return if (animatedFloat.isRunning) { animatedFloat.addEndListener(endListener) @@ -327,43 +327,43 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : backgroundHeightStretchAmount: Float, edgeCornerStretchAmount: Float, farCornerStretchAmount: Float, - fullyStretchedDimens: EdgePanelParams.BackIndicatorDimens + fullyStretchedDimens: EdgePanelParams.BackIndicatorDimens, ) { horizontalTranslation.stretchBy( finalPosition = fullyStretchedDimens.horizontalTranslation, - amount = horizontalTranslationStretchAmount + amount = horizontalTranslationStretchAmount, ) arrowLength.stretchBy( finalPosition = fullyStretchedDimens.arrowDimens.length, - amount = arrowStretchAmount + amount = arrowStretchAmount, ) arrowHeight.stretchBy( finalPosition = fullyStretchedDimens.arrowDimens.height, - amount = arrowStretchAmount + amount = arrowStretchAmount, ) arrowAlpha.stretchBy( finalPosition = fullyStretchedDimens.arrowDimens.alpha, - amount = arrowAlphaStretchAmount + amount = arrowAlphaStretchAmount, ) backgroundAlpha.stretchBy( finalPosition = fullyStretchedDimens.backgroundDimens.alpha, - amount = backgroundAlphaStretchAmount + amount = backgroundAlphaStretchAmount, ) backgroundWidth.stretchBy( finalPosition = fullyStretchedDimens.backgroundDimens.width, - amount = backgroundWidthStretchAmount + amount = backgroundWidthStretchAmount, ) backgroundHeight.stretchBy( finalPosition = fullyStretchedDimens.backgroundDimens.height, - amount = backgroundHeightStretchAmount + amount = backgroundHeightStretchAmount, ) backgroundEdgeCornerRadius.stretchBy( finalPosition = fullyStretchedDimens.backgroundDimens.edgeCornerRadius, - amount = edgeCornerStretchAmount + amount = edgeCornerStretchAmount, ) backgroundFarCornerRadius.stretchBy( finalPosition = fullyStretchedDimens.backgroundDimens.farCornerRadius, - amount = farCornerStretchAmount + amount = farCornerStretchAmount, ) } @@ -381,7 +381,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : arrowAlpha.stretchTo( stretchAmount = 0f, startingVelocity = startingVelocity, - springForce = springForce + springForce = springForce, ) } @@ -403,7 +403,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : /** Updates resting arrow and background size not accounting for stretch */ internal fun setRestingDimens( restingParams: EdgePanelParams.BackIndicatorDimens, - animate: Boolean = true + animate: Boolean = true, ) { horizontalTranslation.updateRestingPosition(restingParams.horizontalTranslation) scale.updateRestingPosition(restingParams.scale) @@ -417,11 +417,11 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : backgroundHeight.updateRestingPosition(restingParams.backgroundDimens.height, animate) backgroundEdgeCornerRadius.updateRestingPosition( restingParams.backgroundDimens.edgeCornerRadius, - animate + animate, ) backgroundFarCornerRadius.updateRestingPosition( restingParams.backgroundDimens.farCornerRadius, - animate + animate, ) } @@ -483,11 +483,11 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : topLeft = edgeCorner, bottomLeft = edgeCorner, topRight = farCorner, - bottomRight = farCorner + bottomRight = farCorner, ) canvas.drawPath( arrowBackground, - arrowBackgroundPaint.apply { alpha = (255 * backgroundAlpha.pos).toInt() } + arrowBackgroundPaint.apply { alpha = (255 * backgroundAlpha.pos).toInt() }, ) val dx = arrowLength.pos @@ -498,7 +498,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : val arrowOffset = (backgroundWidth - dx) / 2 canvas.translate( /* dx= */ arrowOffset, - /* dy= */ 0f /* pass 0 for the y position since the canvas was already translated */ + /* dy= */ 0f, /* pass 0 for the y position since the canvas was already translated */ ) val arrowPointsAwayFromEdge = !arrowsPointLeft.xor(isLeftPanel) @@ -532,7 +532,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : topLeft: Float = 0f, topRight: Float = 0f, bottomRight: Float = 0f, - bottomLeft: Float = 0f + bottomLeft: Float = 0f, ): Path = Path().apply { val corners = @@ -544,7 +544,7 @@ class BackPanel(context: Context, private val latencyTracker: LatencyTracker) : bottomRight, bottomRight, bottomLeft, - bottomLeft + bottomLeft, ) addRoundRect(this@toPathWithRoundCorners, corners, Path.Direction.CW) } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt index d8c13b6e8f6d..7e07e4d5097f 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -124,7 +124,7 @@ internal constructor( vibratorHelper, configurationController, latencyTracker, - interactionJankMonitor + interactionJankMonitor, ) .also { it.init() } } @@ -206,7 +206,7 @@ internal constructor( COMMITTED, /* back action currently cancelling, arrow soon to be GONE */ - CANCELLED + CANCELLED, } /** @@ -224,7 +224,7 @@ internal constructor( animation: DynamicAnimation<*>, canceled: Boolean, value: Float, - velocity: Float + velocity: Float, ) { animation.removeEndListener(this) @@ -421,7 +421,7 @@ internal constructor( if ( isPastThresholdToActive( isPastThreshold = isPastStaticThreshold, - dynamicDelay = entryToActiveDelayCalculation + dynamicDelay = entryToActiveDelayCalculation, ) ) { updateArrowState(GestureState.ACTIVE) @@ -437,7 +437,7 @@ internal constructor( isPastStaticThreshold && isPastDynamicReactivationThreshold && isWithinYActivationThreshold, - delay = MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION + delay = MIN_DURATION_INACTIVE_BEFORE_ACTIVE_ANIMATION, ) ) { updateArrowState(GestureState.ACTIVE) @@ -593,7 +593,7 @@ internal constructor( arrowAlphaStretchAmount = 1f, edgeCornerStretchAmount = 1f, farCornerStretchAmount = 1f, - fullyStretchedDimens = params.fullyStretchedIndicator + fullyStretchedDimens = params.fullyStretchedIndicator, ) } @@ -608,7 +608,7 @@ internal constructor( params.entryIndicator.arrowDimens.alphaInterpolator?.get(progress)?.value ?: 0f, edgeCornerStretchAmount = params.edgeCornerInterpolator.getInterpolation(progress), farCornerStretchAmount = params.farCornerInterpolator.getInterpolation(progress), - fullyStretchedDimens = params.preThresholdIndicator + fullyStretchedDimens = params.preThresholdIndicator, ) } @@ -643,7 +643,7 @@ internal constructor( ?: 0f, edgeCornerStretchAmount = params.edgeCornerInterpolator.getInterpolation(progress), farCornerStretchAmount = params.farCornerInterpolator.getInterpolation(progress), - fullyStretchedDimens = params.preThresholdIndicator + fullyStretchedDimens = params.preThresholdIndicator, ) } @@ -688,7 +688,7 @@ internal constructor( private fun isPastThresholdToActive( isPastThreshold: Boolean, delay: Float? = null, - dynamicDelay: () -> Float = { delay ?: 0F } + dynamicDelay: () -> Float = { delay ?: 0F }, ): Boolean { val resetValue = 0L val isPastThresholdForFirstTime = pastThresholdWhileEntryOrInactiveTime == resetValue @@ -709,7 +709,7 @@ internal constructor( private fun playWithBackgroundWidthAnimation( onEnd: DelayedOnAnimationEndListener, - delay: Long = 0L + delay: Long = 0L, ) { if (delay == 0L) { updateRestingArrowDimens() @@ -871,8 +871,8 @@ internal constructor( GestureState.FLUNG -> params.activeIndicator.backgroundDimens GestureState.COMMITTED -> params.committedIndicator.backgroundDimens GestureState.CANCELLED -> params.cancelledIndicator.backgroundDimens - } - ) + }, + ), ) } @@ -970,7 +970,7 @@ internal constructor( } mainHandler.postDelayed( onEndSetCommittedStateListener.runnable, - MIN_DURATION_FLING_ANIMATION + MIN_DURATION_FLING_ANIMATION, ) updateRestingArrowDimens() } @@ -984,13 +984,13 @@ internal constructor( updateRestingArrowDimens() mainHandler.postDelayed( onEndSetGoneStateListener.runnable, - MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION + MIN_DURATION_COMMITTED_AFTER_FLING_ANIMATION, ) } else { mView.popScale(POP_ON_COMMITTED_VELOCITY) mainHandler.postDelayed( onAlphaEndSetGoneStateListener.runnable, - MIN_DURATION_COMMITTED_ANIMATION + MIN_DURATION_COMMITTED_ANIMATION, ) } } @@ -1008,14 +1008,14 @@ internal constructor( private fun performDeactivatedHapticFeedback() { vibratorHelper.performHapticFeedback( mView, - HapticFeedbackConstants.GESTURE_THRESHOLD_DEACTIVATE + HapticFeedbackConstants.GESTURE_THRESHOLD_DEACTIVATE, ) } private fun performActivatedHapticFeedback() { vibratorHelper.performHapticFeedback( mView, - HapticFeedbackConstants.GESTURE_THRESHOLD_ACTIVATE + HapticFeedbackConstants.GESTURE_THRESHOLD_ACTIVATE, ) } @@ -1075,7 +1075,7 @@ internal constructor( "xDelta=${"%.1f".format(totalTouchDeltaActive)}", "xTranslation=${"%.1f".format(previousXTranslation)}", "pre=${"%.0f".format(preProgress)}%", - "post=${"%.0f".format(postProgress)}%" + "post=${"%.0f".format(postProgress)}%", ) val debugPaint = Paint().apply { color = Color.WHITE } val debugInfoBottom = debugStrings.size * 32f + 4f @@ -1084,7 +1084,7 @@ internal constructor( 4f, canvas.width.toFloat(), debugStrings.size * 32f + 4f, - debugPaint + debugPaint, ) debugPaint.apply { color = Color.BLACK @@ -1132,7 +1132,7 @@ class Step( private val threshold: Float, private val factor: Float = 1.1f, private val postThreshold: T, - private val preThreshold: T + private val preThreshold: T, ) { data class Value(val value: T, val isNewState: Boolean) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt index db8749f59d9c..283ae7f84c59 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgePanelParams.kt @@ -16,7 +16,7 @@ data class EdgePanelParams(private var resources: Resources) { val heightSpring: SpringForce? = null, val lengthSpring: SpringForce? = null, var alphaSpring: Step? = null, - var alphaInterpolator: Step? = null + var alphaInterpolator: Step? = null, ) data class BackgroundDimens( @@ -178,14 +178,14 @@ data class EdgePanelParams(private var resources: Resources) { threshold = commonArrowDimensAlphaThreshold, factor = commonArrowDimensAlphaFactor, postThreshold = createSpring(180f, 0.9f), - preThreshold = createSpring(2000f, 0.6f) + preThreshold = createSpring(2000f, 0.6f), ) val commonArrowDimensAlphaSpringInterpolator = Step( threshold = commonArrowDimensAlphaThreshold, factor = commonArrowDimensAlphaFactor, postThreshold = 1f, - preThreshold = 0f + preThreshold = 0f, ) entryIndicator = @@ -204,7 +204,7 @@ data class EdgePanelParams(private var resources: Resources) { lengthSpring = createSpring(600f, 0.4f), heightSpring = createSpring(600f, 0.4f), alphaSpring = commonArrowDimensAlphaSpring, - alphaInterpolator = commonArrowDimensAlphaSpringInterpolator + alphaInterpolator = commonArrowDimensAlphaSpringInterpolator, ), backgroundDimens = BackgroundDimens( @@ -217,7 +217,7 @@ data class EdgePanelParams(private var resources: Resources) { heightSpring = createSpring(1500f, 0.45f), farCornerRadiusSpring = createSpring(300f, 0.5f), edgeCornerRadiusSpring = createSpring(150f, 0.5f), - ) + ), ) activeIndicator = @@ -235,7 +235,7 @@ data class EdgePanelParams(private var resources: Resources) { lengthSpring = activeCommittedArrowLengthSpring, heightSpring = activeCommittedArrowHeightSpring, alphaSpring = commonArrowDimensAlphaSpring, - alphaInterpolator = commonArrowDimensAlphaSpringInterpolator + alphaInterpolator = commonArrowDimensAlphaSpringInterpolator, ), backgroundDimens = BackgroundDimens( @@ -248,7 +248,7 @@ data class EdgePanelParams(private var resources: Resources) { heightSpring = createSpring(10000f, 1f), edgeCornerRadiusSpring = createSpring(2600f, 0.855f), farCornerRadiusSpring = createSpring(1200f, 0.30f), - ) + ), ) preThresholdIndicator = @@ -266,7 +266,7 @@ data class EdgePanelParams(private var resources: Resources) { lengthSpring = createSpring(100f, 0.6f), heightSpring = createSpring(100f, 0.6f), alphaSpring = commonArrowDimensAlphaSpring, - alphaInterpolator = commonArrowDimensAlphaSpringInterpolator + alphaInterpolator = commonArrowDimensAlphaSpringInterpolator, ), backgroundDimens = BackgroundDimens( @@ -281,7 +281,7 @@ data class EdgePanelParams(private var resources: Resources) { heightSpring = createSpring(1500f, 0.45f), farCornerRadiusSpring = createSpring(300f, 1f), edgeCornerRadiusSpring = createSpring(250f, 0.5f), - ) + ), ) committedIndicator = @@ -317,7 +317,7 @@ data class EdgePanelParams(private var resources: Resources) { lengthSpring = createSpring(850f, 0.46f), heightSpring = createSpring(850f, 0.46f), length = activeIndicator.arrowDimens.length, - height = activeIndicator.arrowDimens.height + height = activeIndicator.arrowDimens.height, ), backgroundDimens = committedIndicator.backgroundDimens.copy( @@ -325,7 +325,7 @@ data class EdgePanelParams(private var resources: Resources) { heightSpring = flungCommittedHeightSpring, edgeCornerRadiusSpring = flungCommittedEdgeCornerSpring, farCornerRadiusSpring = flungCommittedFarCornerSpring, - ) + ), ) cancelledIndicator = @@ -334,7 +334,7 @@ data class EdgePanelParams(private var resources: Resources) { entryIndicator.backgroundDimens.copy( width = 0f, alpha = 0f, - alphaSpring = createSpring(450f, 1f) + alphaSpring = createSpring(450f, 1f), ) ) @@ -366,7 +366,7 @@ data class EdgePanelParams(private var resources: Resources) { heightSpring = null, edgeCornerRadiusSpring = null, farCornerRadiusSpring = null, - ) + ), ) } } 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 0166176721c3..ba746cda480e 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 @@ -55,7 +55,7 @@ constructor( ) { enum class Scope { Local, - Global + Global, } private val _localGestureBlockedMatchers = MutableStateFlow>(setOf()) @@ -86,7 +86,7 @@ constructor( combine( _topActivity, gestureRepository.gestureBlockedMatchers, - _localGestureBlockedMatchers.asStateFlow() + _localGestureBlockedMatchers.asStateFlow(), ) { runningTask, global, local -> runningTask != null && (global + local).any { it.matches(runningTask) } } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/views/buttons/NavbarOrientationTrackingLogger.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/views/buttons/NavbarOrientationTrackingLogger.kt index a5ba17b98a40..251fd2e5954c 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/views/buttons/NavbarOrientationTrackingLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/views/buttons/NavbarOrientationTrackingLogger.kt @@ -31,7 +31,7 @@ constructor(@NavbarOrientationTrackingLog private val buffer: LogBuffer) { isImmersiveMode: Boolean, isSecondaryHandleVisible: Boolean, currentRotation: Int, - startingQuickSwitchRotation: Int + startingQuickSwitchRotation: Int, ) { buffer.log( TAG, @@ -52,7 +52,7 @@ constructor(@NavbarOrientationTrackingLog private val buffer: LogBuffer) { "\tDelta Rotation: ${getDeltaRotation(int1, int2)}\n" + "\tStarting QuickSwitch Rotation: $int1\n" + "\tCurrent Rotation: $int2\n" - } + }, ) } -- GitLab From 482575cf22741e67b758b1eb13dbc23db7c4fbaf Mon Sep 17 00:00:00 2001 From: Eghosa Ewansiha-Vlachavas Date: Tue, 22 Oct 2024 15:58:00 +0000 Subject: [PATCH 247/459] Allow resizing out of invalid size If app bounds are already below min width/ height, allow bounds to be increased. If app bounds already excced max width/ height, allow bounds to be decreased. Flag: NONE(bug fix) Fixes: 367875464 Fixes: 368077155 Test: atest WMShellUnitTests:DragPositioningCallbackUtilityTest Change-Id: Icbad1a29b5e01bec50711da1456c7eb700796d8f --- .../DragPositioningCallbackUtility.java | 30 ++- .../DragPositioningCallbackUtilityTest.kt | 229 +++++++++++++++++- 2 files changed, 245 insertions(+), 14 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java index 60c922293d80..78e7962dcec3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtility.java @@ -29,8 +29,6 @@ import android.util.DisplayMetrics; import android.view.SurfaceControl; import android.window.DesktopModeFlags; -import androidx.annotation.NonNull; - import com.android.wm.shell.R; import com.android.wm.shell.common.DisplayController; import com.android.wm.shell.shared.desktopmode.DesktopModeStatus; @@ -129,13 +127,15 @@ public class DragPositioningCallbackUtility { // If width or height are negative or exceeding the width or height constraints, revert the // respective bounds to use previous bound dimensions. - if (isExceedingWidthConstraint(repositionTaskBounds, stableBounds, displayController, + if (isExceedingWidthConstraint(repositionTaskBounds.width(), + /* startingWidth= */ oldRight - oldLeft, stableBounds, displayController, windowDecoration)) { repositionTaskBounds.right = oldRight; repositionTaskBounds.left = oldLeft; isAspectRatioMaintained = false; } - if (isExceedingHeightConstraint(repositionTaskBounds, stableBounds, displayController, + if (isExceedingHeightConstraint(repositionTaskBounds.height(), + /* startingHeight= */oldBottom - oldTop, stableBounds, displayController, windowDecoration)) { repositionTaskBounds.top = oldTop; repositionTaskBounds.bottom = oldBottom; @@ -208,28 +208,34 @@ public class DragPositioningCallbackUtility { return result; } - private static boolean isExceedingWidthConstraint(@NonNull Rect repositionTaskBounds, + private static boolean isExceedingWidthConstraint(int repositionedWidth, int startingWidth, Rect maxResizeBounds, DisplayController displayController, WindowDecoration windowDecoration) { + boolean isSizeIncreasing = (repositionedWidth - startingWidth) > 0; // Check if width is less than the minimum width constraint. - if (repositionTaskBounds.width() < getMinWidth(displayController, windowDecoration)) { - return true; + if (repositionedWidth < getMinWidth(displayController, windowDecoration)) { + // Only allow width to be increased if it is already below minimum. + return !isSizeIncreasing; } // Check if width is more than the maximum resize bounds on desktop windowing mode. + // Only allow width to be decreased if it already exceeds maximum. return isSizeConstraintForDesktopModeEnabled(windowDecoration.mDecorWindowContext) - && repositionTaskBounds.width() > maxResizeBounds.width(); + && repositionedWidth > maxResizeBounds.width() && isSizeIncreasing; } - private static boolean isExceedingHeightConstraint(@NonNull Rect repositionTaskBounds, + private static boolean isExceedingHeightConstraint(int repositionedHeight, int startingHeight, Rect maxResizeBounds, DisplayController displayController, WindowDecoration windowDecoration) { + boolean isSizeIncreasing = (repositionedHeight - startingHeight) > 0; // Check if height is less than the minimum height constraint. - if (repositionTaskBounds.height() < getMinHeight(displayController, windowDecoration)) { - return true; + if (repositionedHeight < getMinHeight(displayController, windowDecoration)) { + // Only allow height to be increased if it is already below minimum. + return !isSizeIncreasing; } // Check if height is more than the maximum resize bounds on desktop windowing mode. + // Only allow height to be decreased if it already exceeds maximum. return isSizeConstraintForDesktopModeEnabled(windowDecoration.mDecorWindowContext) - && repositionTaskBounds.height() > maxResizeBounds.height(); + && repositionedHeight > maxResizeBounds.height() && isSizeIncreasing; } private static float getMinWidth(DisplayController displayController, diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtilityTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtilityTest.kt index 24f6becc3536..a20a89c644ed 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtilityTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/windowdecor/DragPositioningCallbackUtilityTest.kt @@ -36,6 +36,7 @@ import com.android.wm.shell.common.DisplayController import com.android.wm.shell.common.DisplayLayout import com.android.wm.shell.shared.desktopmode.DesktopModeStatus import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_BOTTOM +import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_LEFT import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_RIGHT import com.android.wm.shell.windowdecor.DragPositioningCallback.CTRL_TYPE_TOP import com.google.common.truth.Truth.assertThat @@ -48,9 +49,9 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.any -import org.mockito.Mockito.`when` as whenever import org.mockito.MockitoAnnotations import org.mockito.quality.Strictness +import org.mockito.Mockito.`when` as whenever /** * Tests for [DragPositioningCallbackUtility]. @@ -191,6 +192,62 @@ class DragPositioningCallbackUtilityTest { assertThat(repositionTaskBounds.bottom).isEqualTo(STARTING_BOUNDS.bottom) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING) + fun testChangeBounds_unresizeableApp_initialHeightLessThanMin_increasingBounds_resizeAllowed() { + mockWindowDecoration.mTaskInfo.isResizeable = false + val startingPoint = PointF(BELOW_MIN_HEIGHT_BOUNDS.right.toFloat(), + BELOW_MIN_HEIGHT_BOUNDS.bottom.toFloat()) + val repositionTaskBounds = Rect(BELOW_MIN_HEIGHT_BOUNDS) + + // Resize to increased bounds + val newX = BELOW_MIN_HEIGHT_BOUNDS.right.toFloat() + 20 + val newY = BELOW_MIN_HEIGHT_BOUNDS.bottom.toFloat() + 10 + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is in direction of desired range + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, + repositionTaskBounds, BELOW_MIN_HEIGHT_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.right + 20) + assertThat(repositionTaskBounds.bottom).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.bottom + 10) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING) + fun testChangeBounds_unresizeableApp_initialHeightMoreThanMax_decreasingBounds_resizeAllowed() { + mockWindowDecoration.mTaskInfo.isResizeable = false + val startingPoint = PointF(EXCEEDS_MAX_HEIGHT_BOUNDS.right.toFloat(), + EXCEEDS_MAX_HEIGHT_BOUNDS.top.toFloat()) + val repositionTaskBounds = Rect(EXCEEDS_MAX_HEIGHT_BOUNDS) + + // Resize to decreased bounds. + val newX = EXCEEDS_MAX_HEIGHT_BOUNDS.right.toFloat() - 10 + val newY = EXCEEDS_MAX_HEIGHT_BOUNDS.top.toFloat() + 20 + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is in direction of desired range. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, + repositionTaskBounds, EXCEEDS_MAX_HEIGHT_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.top + 20) + assertThat(repositionTaskBounds.right).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.right - 10) + assertThat(repositionTaskBounds.bottom).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.bottom) + } + @Test @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING) fun testChangeBounds_unresizeableApp_widthLessThanMin_resetToStartingBounds() { @@ -211,13 +268,68 @@ class DragPositioningCallbackUtilityTest { ) ) - assertThat(repositionTaskBounds.left).isEqualTo(STARTING_BOUNDS.left) assertThat(repositionTaskBounds.top).isEqualTo(STARTING_BOUNDS.top) assertThat(repositionTaskBounds.right).isEqualTo(STARTING_BOUNDS.right) assertThat(repositionTaskBounds.bottom).isEqualTo(STARTING_BOUNDS.bottom) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING) + fun testChangeBounds_unresizeableApp_initialWidthLessThanMin_increasingBounds_resizeAllowed() { + mockWindowDecoration.mTaskInfo.isResizeable = false + val startingPoint = PointF(BELOW_MIN_WIDTH_BOUNDS.right.toFloat(), + BELOW_MIN_WIDTH_BOUNDS.bottom.toFloat()) + val repositionTaskBounds = Rect(BELOW_MIN_WIDTH_BOUNDS) + + // Resize to increased bounds. + val newX = BELOW_MIN_WIDTH_BOUNDS.right.toFloat() + 10 + val newY = BELOW_MIN_WIDTH_BOUNDS.bottom.toFloat() + 20 + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is in direction of desired range. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, + repositionTaskBounds, BELOW_MIN_WIDTH_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.right + 10) + assertThat(repositionTaskBounds.bottom).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.bottom + 20) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_WINDOWING_SCALED_RESIZING) + fun testChangeBounds_unresizeableApp_initialWidthMoreThanMax_decreasingBounds_resizeAllowed() { + mockWindowDecoration.mTaskInfo.isResizeable = false + val startingPoint = PointF(EXCEEDS_MAX_WIDTH_BOUNDS.left.toFloat(), + EXCEEDS_MAX_WIDTH_BOUNDS.top.toFloat()) + val repositionTaskBounds = Rect(EXCEEDS_MAX_WIDTH_BOUNDS) + + // Resize to decreased bounds. + val newX = EXCEEDS_MAX_WIDTH_BOUNDS.left.toFloat() + 20 + val newY = EXCEEDS_MAX_WIDTH_BOUNDS.top.toFloat() + 10 + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is in direction of desired range. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_LEFT or CTRL_TYPE_TOP, + repositionTaskBounds, EXCEEDS_MAX_WIDTH_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.left + 20) + assertThat(repositionTaskBounds.top).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.top + 10) + assertThat(repositionTaskBounds.right).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.right) + assertThat(repositionTaskBounds.bottom).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.bottom) + } + @Test fun testChangeBoundsDoesNotChangeHeightWhenNegative() { @@ -425,6 +537,60 @@ class DragPositioningCallbackUtilityTest { assertThat(repositionTaskBounds.bottom).isEqualTo(STARTING_BOUNDS.bottom) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS) + fun testMinHeight_initialHeightLessThanMin_increasingHeight_resizeAllowed() { + val startingPoint = PointF(BELOW_MIN_HEIGHT_BOUNDS.right.toFloat(), + BELOW_MIN_HEIGHT_BOUNDS.bottom.toFloat()) + val repositionTaskBounds = Rect(BELOW_MIN_HEIGHT_BOUNDS) + + // Attempt to increase height. + val newX = BELOW_MIN_HEIGHT_BOUNDS.right.toFloat() + val newY = BELOW_MIN_HEIGHT_BOUNDS.bottom.toFloat() + 10 + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is increasing height closer to valid region. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, + repositionTaskBounds, BELOW_MIN_HEIGHT_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.right) + assertThat(repositionTaskBounds.bottom).isEqualTo(BELOW_MIN_HEIGHT_BOUNDS.bottom + 10) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS) + fun testMinWidth_initialWidthLessThanMin_increasingBounds_resizeAllowed() { + val startingPoint = PointF(BELOW_MIN_WIDTH_BOUNDS.right.toFloat(), + BELOW_MIN_WIDTH_BOUNDS.bottom.toFloat()) + val repositionTaskBounds = Rect(BELOW_MIN_WIDTH_BOUNDS) + + // Attempt to increase width. + val newX = BELOW_MIN_WIDTH_BOUNDS.right.toFloat() + 10 + val newY = BELOW_MIN_WIDTH_BOUNDS.bottom.toFloat() + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is increasing width closer to valid region. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_BOTTOM, + repositionTaskBounds, BELOW_MIN_WIDTH_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.right + 10) + assertThat(repositionTaskBounds.bottom).isEqualTo(BELOW_MIN_WIDTH_BOUNDS.bottom) + } + @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS) fun taskMinWidthHeightUndefined_changeBoundsInDesktopModeAllowedSize_shouldChangeBounds() { @@ -547,6 +713,61 @@ class DragPositioningCallbackUtilityTest { assertThat(repositionTaskBounds.height()).isLessThan(STABLE_BOUNDS.bottom) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS) + fun testMaxHeight_initialHeightMoreThanMax_decreasingHeight_resizeAllowed() { + mockWindowDecoration.mTaskInfo.isResizeable = false + val startingPoint = PointF(EXCEEDS_MAX_HEIGHT_BOUNDS.right.toFloat(), + EXCEEDS_MAX_HEIGHT_BOUNDS.top.toFloat()) + val repositionTaskBounds = Rect(EXCEEDS_MAX_HEIGHT_BOUNDS) + + // Attempt to decrease height + val newX = EXCEEDS_MAX_HEIGHT_BOUNDS.right.toFloat() - 10 + val newY = EXCEEDS_MAX_HEIGHT_BOUNDS.top.toFloat() + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is decreasing height closer to valid region. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_RIGHT or CTRL_TYPE_TOP, + repositionTaskBounds, EXCEEDS_MAX_HEIGHT_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.left) + assertThat(repositionTaskBounds.top).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.right - 10) + assertThat(repositionTaskBounds.bottom).isEqualTo(EXCEEDS_MAX_HEIGHT_BOUNDS.bottom ) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_SIZE_CONSTRAINTS) + fun testMaxHeight_initialWidthMoreThanMax_decreasingBounds_resizeAllowed() { + val startingPoint = PointF(EXCEEDS_MAX_WIDTH_BOUNDS.left.toFloat(), + EXCEEDS_MAX_WIDTH_BOUNDS.top.toFloat()) + val repositionTaskBounds = Rect(EXCEEDS_MAX_WIDTH_BOUNDS) + + // Attempt to decrease width. + val newX = EXCEEDS_MAX_WIDTH_BOUNDS.left.toFloat() + 20 + val newY = EXCEEDS_MAX_WIDTH_BOUNDS.top.toFloat() + val delta = DragPositioningCallbackUtility.calculateDelta(newX, newY, startingPoint) + + // Resize should be allowed as drag is decreasing width closer to valid region. + assertTrue( + DragPositioningCallbackUtility.changeBounds( + CTRL_TYPE_LEFT or CTRL_TYPE_TOP, + repositionTaskBounds, EXCEEDS_MAX_WIDTH_BOUNDS, STABLE_BOUNDS, delta, + mockDisplayController, mockWindowDecoration + ) + ) + + assertThat(repositionTaskBounds.left).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.left + 20) + assertThat(repositionTaskBounds.top).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.top) + assertThat(repositionTaskBounds.right).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.right) + assertThat(repositionTaskBounds.bottom).isEqualTo(EXCEEDS_MAX_WIDTH_BOUNDS.bottom) + } + private fun initializeTaskInfo(taskMinWidth: Int = MIN_WIDTH, taskMinHeight: Int = MIN_HEIGHT) { mockWindowDecoration.mTaskInfo = ActivityManager.RunningTaskInfo().apply { taskId = TASK_ID @@ -571,6 +792,10 @@ class DragPositioningCallbackUtilityTest { private const val NAVBAR_HEIGHT = 50 private val DISPLAY_BOUNDS = Rect(0, 0, 2400, 1600) private val STARTING_BOUNDS = Rect(0, 0, 100, 100) + private val BELOW_MIN_WIDTH_BOUNDS = Rect(0, 0, 50, 100) + private val BELOW_MIN_HEIGHT_BOUNDS = Rect(0, 0, 100, 50) + private val EXCEEDS_MAX_WIDTH_BOUNDS = Rect(0, 0, 3000, 1500) + private val EXCEEDS_MAX_HEIGHT_BOUNDS = Rect(0, 0, 1000, 2000) private val OFF_CENTER_STARTING_BOUNDS = Rect(-100, -100, 10, 10) private val DISALLOWED_RESIZE_AREA = Rect( DISPLAY_BOUNDS.left, -- GitLab From 6ba5e1e146c3519bd384baaeaf3b935537f61b47 Mon Sep 17 00:00:00 2001 From: Stefan Andonian Date: Wed, 16 Oct 2024 00:35:08 +0000 Subject: [PATCH 248/459] [Record Issue QS Tile] Save Start Time and output for go/winscope integration This file is only going to be outputted when both a screen recording and winscope traces are present. Otherwise the metadata is not useful. Includes unit tests. Bug: 372973430 Test: Verified that this file is outputted locally. Looked at the file and verified that the correct JSON was present: https://drive.google.com/file/d/10HFrtPKabufsXKN-ElF_iBTsSbteDbia/view?usp=sharing Flag: EXEMPT small change with unit tests. Change-Id: Id02611a76fb9b36de997c6a29fa0d1ccb2e1db42 --- .../IssueRecordingServiceSessionTest.kt | 6 +- .../ScreenRecordingStartTimeStoreTest.kt | 57 ++++++++++++++ .../screenrecord/RecordingServiceTest.java | 12 ++- .../recordissue/IssueRecordingService.kt | 15 ++-- .../IssueRecordingServiceSession.kt | 21 +++-- .../ScreenRecordingStartTimeStore.kt | 78 +++++++++++++++++++ .../systemui/recordissue/TraceurConnection.kt | 9 ++- .../screenrecord/RecordingService.java | 9 ++- .../screenrecord/ScreenMediaRecorder.java | 7 +- 9 files changed, 190 insertions(+), 24 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStoreTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStore.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt index a3f81274dfc5..9dbcf18b2416 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt @@ -60,6 +60,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { private val iActivityManager = mock() private val notificationManager = mock() private val panelInteractor = mock() + private val screenRecordingStartTimeStore = mock() private lateinit var underTest: IssueRecordingServiceSession @@ -76,6 +77,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { iActivityManager, notificationManager, userContextProvider, + screenRecordingStartTimeStore, ) } @@ -90,7 +92,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { @Test fun stopsTracing_afterReceivingStopTracingCommand() { - underTest.stop(mContext.contentResolver) + underTest.stop() bgExecutor.runAllReady() Truth.assertThat(issueRecordingState.isRecording).isFalse() @@ -124,7 +126,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { underTest.share(0, uri) bgExecutor.runAllReady() - verify(traceurConnection).shareTraces(uri) + verify(traceurConnection).shareTraces(any()) } @Test diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStoreTest.kt new file mode 100644 index 000000000000..737b10166199 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStoreTest.kt @@ -0,0 +1,57 @@ +/* + * 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.recordissue + +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.kosmos.Kosmos +import com.android.systemui.kosmos.testCase +import com.android.systemui.settings.UserTracker +import com.android.systemui.settings.userTracker +import com.google.common.truth.Truth +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.MockitoAnnotations + +@SmallTest +@RunWith(AndroidJUnit4::class) +@TestableLooper.RunWithLooper(setAsMainLooper = true) +class ScreenRecordingStartTimeStoreTest : SysuiTestCase() { + private val userTracker: UserTracker = Kosmos().also { it.testCase = this }.userTracker + + private lateinit var underTest: ScreenRecordingStartTimeStore + + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + underTest = ScreenRecordingStartTimeStore(userTracker) + } + + @Test + fun markStartTime_correctlyStoresValues_inSharedPreferences() { + underTest.markStartTime() + + val startTimeMetadata = underTest.userIdToScreenRecordingStartTime.get(userTracker.userId) + Truth.assertThat(startTimeMetadata).isNotNull() + Truth.assertThat(startTimeMetadata!!.getLong(ELAPSED_REAL_TIME_NANOS_KEY)).isNotNull() + Truth.assertThat(startTimeMetadata.getLong(REAL_TO_ELAPSED_TIME_OFFSET_NANOS_KEY)) + .isNotNull() + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/RecordingServiceTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/RecordingServiceTest.java index 0d5ddaeedb9e..bff3903e0114 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/RecordingServiceTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenrecord/RecordingServiceTest.java @@ -52,6 +52,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.SysuiTestCase; import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.recordissue.ScreenRecordingStartTimeStore; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; @@ -95,6 +96,8 @@ public class RecordingServiceTest extends SysuiTestCase { private SysuiStatusBarStateController mStatusBarStateController; @Mock private ActivityStarter mActivityStarter; + @Mock + private ScreenRecordingStartTimeStore mScreenRecordingStartTimeStore; private static final String PERMISSION_SELF = "com.android.systemui.permission.SELF"; @@ -108,9 +111,10 @@ public class RecordingServiceTest extends SysuiTestCase { RecordingController controller, Executor executor, Handler handler, UiEventLogger uiEventLogger, NotificationManager notificationManager, - UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil) { - super(controller, executor, handler, - uiEventLogger, notificationManager, userContextTracker, keyguardDismissUtil); + UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil, + ScreenRecordingStartTimeStore screenRecordingStartTimeStore) { + super(controller, executor, handler, uiEventLogger, notificationManager, + userContextTracker, keyguardDismissUtil, screenRecordingStartTimeStore); attachBaseContext(mContext); } } @@ -120,7 +124,7 @@ public class RecordingServiceTest extends SysuiTestCase { MockitoAnnotations.initMocks(this); mRecordingService = Mockito.spy(new RecordingServiceTestable(mController, mExecutor, mHandler, mUiEventLogger, mNotificationManager, - mUserContextTracker, mKeyguardDismissUtil)); + mUserContextTracker, mKeyguardDismissUtil, mScreenRecordingStartTimeStore)); // Return actual context info doReturn(mContext).when(mRecordingService).getApplicationContext(); diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt index ad0ede44a58e..32d9ba822382 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt @@ -24,11 +24,9 @@ import android.content.res.Resources import android.net.Uri import android.os.Handler import android.os.IBinder -import android.os.Looper import android.util.Log import com.android.internal.logging.UiEventLogger import com.android.systemui.animation.DialogTransitionAnimator -import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.LongRunning import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.qs.pipeline.domain.interactor.PanelInteractor @@ -39,6 +37,7 @@ import com.android.systemui.screenrecord.RecordingServiceStrings import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.traceur.MessageConstants.INTENT_EXTRA_TRACE_TYPE +import com.android.traceur.PresetTraceConfigs import com.android.traceur.TraceConfig import java.util.concurrent.Executor import javax.inject.Inject @@ -47,7 +46,6 @@ class IssueRecordingService @Inject constructor( controller: RecordingController, - @Background private val bgLooper: Looper, @LongRunning private val bgExecutor: Executor, @Main handler: Handler, uiEventLogger: UiEventLogger, @@ -59,6 +57,7 @@ constructor( private val issueRecordingState: IssueRecordingState, traceurConnectionProvider: TraceurConnection.Provider, iActivityManager: IActivityManager, + screenRecordingStartTimeStore: ScreenRecordingStartTimeStore, ) : RecordingService( controller, @@ -68,6 +67,7 @@ constructor( notificationManager, userContextProvider, keyguardDismissUtil, + screenRecordingStartTimeStore, ) { private val traceurConnection: TraceurConnection = traceurConnectionProvider.create() @@ -82,6 +82,7 @@ constructor( iActivityManager, notificationManager, userContextProvider, + screenRecordingStartTimeStore, ) /** @@ -111,21 +112,23 @@ constructor( Log.d(getTag(), "handling action: ${intent?.action}") when (intent?.action) { ACTION_START -> { - session.start() + val screenRecord = intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false) with(session) { traceConfig = intent.getParcelableExtra(INTENT_EXTRA_TRACE_TYPE, TraceConfig::class.java) + ?: PresetTraceConfigs.getDefaultConfig() takeBugReport = intent.getBooleanExtra(EXTRA_BUG_REPORT, false) + this.screenRecord = screenRecord start() } - if (!intent.getBooleanExtra(EXTRA_SCREEN_RECORD, false)) { + if (!screenRecord) { // If we don't want to record the screen, the ACTION_SHOW_START_NOTIF action // will circumvent the RecordingService's screen recording start code. return super.onStartCommand(Intent(ACTION_SHOW_START_NOTIF), flags, startId) } } ACTION_STOP, - ACTION_STOP_NOTIF -> session.stop(contentResolver) + ACTION_STOP_NOTIF -> session.stop() ACTION_SHARE -> { session.share( intent.getIntExtra(EXTRA_NOTIFICATION_ID, mNotificationId), diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt index 4c01293d1cad..06407acb62d0 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt @@ -18,7 +18,6 @@ package com.android.systemui.recordissue import android.app.IActivityManager import android.app.NotificationManager -import android.content.ContentResolver import android.net.Uri import android.os.UserHandle import android.provider.Settings @@ -47,19 +46,25 @@ class IssueRecordingServiceSession( private val iActivityManager: IActivityManager, private val notificationManager: NotificationManager, private val userContextProvider: UserContextProvider, + private val startTimeStore: ScreenRecordingStartTimeStore, ) { var takeBugReport = false var traceConfig = PresetTraceConfigs.getDefaultConfig() + var screenRecord = false fun start() { bgExecutor.execute { traceurConnection.startTracing(traceConfig) } issueRecordingState.isRecording = true } - fun stop(contentResolver: ContentResolver) { + fun stop() { bgExecutor.execute { if (traceConfig.longTrace) { - Settings.Global.putInt(contentResolver, NOTIFY_SESSION_ENDED_SETTING, DISABLED) + Settings.Global.putInt( + userContextProvider.userContext.contentResolver, + NOTIFY_SESSION_ENDED_SETTING, + DISABLED, + ) } traceurConnection.stopTracing() } @@ -73,11 +78,17 @@ class IssueRecordingServiceSession( notificationId, UserHandle(userContextProvider.userContext.userId), ) - + val screenRecordingUris: List = + mutableListOf().apply { + screenRecording?.let { add(it) } + if (traceConfig.winscope && screenRecord) { + startTimeStore.getFileUri(userContextProvider.userContext)?.let { add(it) } + } + } if (takeBugReport) { iActivityManager.requestBugReportWithExtraAttachment(screenRecording) } else { - traceurConnection.shareTraces(screenRecording) + traceurConnection.shareTraces(screenRecordingUris) } } diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStore.kt b/packages/SystemUI/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStore.kt new file mode 100644 index 000000000000..5d8bc5564f10 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/recordissue/ScreenRecordingStartTimeStore.kt @@ -0,0 +1,78 @@ +/* + * 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.recordissue + +import android.content.Context +import android.net.Uri +import android.os.SystemClock +import android.util.Log +import android.util.SparseArray +import androidx.annotation.VisibleForTesting +import androidx.core.content.FileProvider +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.settings.UserTracker +import java.io.File +import java.util.concurrent.TimeUnit +import javax.inject.Inject +import org.json.JSONObject + +private const val TAG = "ScreenRecordingStartTimeStore" +@VisibleForTesting const val REAL_TO_ELAPSED_TIME_OFFSET_NANOS_KEY = "realToElapsedTimeOffsetNanos" +@VisibleForTesting const val ELAPSED_REAL_TIME_NANOS_KEY = "elapsedRealTimeNanos" +private const val RECORDING_METADATA_FILE_SUFFIX = "screen_recording_metadata.json" +private const val AUTHORITY = "com.android.systemui.fileprovider" + +@SysUISingleton +class ScreenRecordingStartTimeStore @Inject constructor(private val userTracker: UserTracker) { + @VisibleForTesting val userIdToScreenRecordingStartTime = SparseArray() + + fun markStartTime() { + val elapsedRealTimeNano = SystemClock.elapsedRealtimeNanos() + val realToElapsedTimeOffsetNano = + TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()) - + SystemClock.elapsedRealtimeNanos() + val startTimeMetadata = + JSONObject() + .put(ELAPSED_REAL_TIME_NANOS_KEY, elapsedRealTimeNano) + .put(REAL_TO_ELAPSED_TIME_OFFSET_NANOS_KEY, realToElapsedTimeOffsetNano) + userIdToScreenRecordingStartTime.put(userTracker.userId, startTimeMetadata) + } + + /** + * Outputs start time metadata as Json to a file that can then be shared. Returns the Uri or + * null if the file system is not usable and the start time meta data is available. Uses + * com.android.systemui.fileprovider's authority. + * + * Because this file is not uniquely named, it doesn't need to be cleaned up. Every time it is + * outputted, it will overwrite the last file's contents. This is a feature, not a bug. + */ + fun getFileUri(context: Context): Uri? { + val dir = context.externalCacheDir?.apply { mkdirs() } ?: return null + try { + val outFile = + File(dir, RECORDING_METADATA_FILE_SUFFIX).apply { + userIdToScreenRecordingStartTime.get(userTracker.userId)?.let { + writeText(it.toString()) + } ?: return null + } + return FileProvider.getUriForFile(context, AUTHORITY, outFile) + } catch (e: Exception) { + Log.e(TAG, "failed to get screen recording start time metadata via file uri", e) + return null + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt b/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt index 81529b357527..e6df3cd59ec9 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/TraceurConnection.kt @@ -76,8 +76,9 @@ private constructor(userContextProvider: UserContextProvider, private val bgLoop @WorkerThread fun stopTracing() = sendMessage(MessageConstants.STOP_WHAT) @WorkerThread - fun shareTraces(screenRecord: Uri?) { - val replyHandler = Messenger(ShareFilesHandler(screenRecord, userContextProvider, bgLooper)) + fun shareTraces(screenRecordingUris: List) { + val replyHandler = + Messenger(ShareFilesHandler(screenRecordingUris, userContextProvider, bgLooper)) sendMessage(MessageConstants.SHARE_WHAT, replyTo = replyHandler) } @@ -101,7 +102,7 @@ private constructor(userContextProvider: UserContextProvider, private val bgLoop } private class ShareFilesHandler( - private val screenRecord: Uri?, + private val screenRecordingUris: List, private val userContextProvider: UserContextProvider, looper: Looper, ) : Handler(looper) { @@ -122,7 +123,7 @@ private class ShareFilesHandler( ArrayList().apply { perfetto?.let { add(it) } winscope?.let { add(it) } - screenRecord?.let { add(it) } + screenRecordingUris.forEach { add(it) } } val fileSharingIntent = FileSender.buildSendIntent(userContextProvider.userContext, uris) diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index c3de06778ee5..5028c2ea8f0a 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -43,6 +43,7 @@ import com.android.internal.logging.UiEventLogger; import com.android.systemui.dagger.qualifiers.LongRunning; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget; +import com.android.systemui.recordissue.ScreenRecordingStartTimeStore; import com.android.systemui.res.R; import com.android.systemui.screenrecord.ScreenMediaRecorder.ScreenMediaRecorderListener; import com.android.systemui.settings.UserContextProvider; @@ -92,6 +93,7 @@ public class RecordingService extends Service implements ScreenMediaRecorderList private boolean mShowTaps; private boolean mOriginalShowTaps; private ScreenMediaRecorder mRecorder; + private final ScreenRecordingStartTimeStore mScreenRecordingStartTimeStore; private final Executor mLongExecutor; private final UiEventLogger mUiEventLogger; protected final NotificationManager mNotificationManager; @@ -103,7 +105,8 @@ public class RecordingService extends Service implements ScreenMediaRecorderList public RecordingService(RecordingController controller, @LongRunning Executor executor, @Main Handler handler, UiEventLogger uiEventLogger, NotificationManager notificationManager, - UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil) { + UserContextProvider userContextTracker, KeyguardDismissUtil keyguardDismissUtil, + ScreenRecordingStartTimeStore screenRecordingStartTimeStore) { mController = controller; mLongExecutor = executor; mMainHandler = handler; @@ -111,6 +114,7 @@ public class RecordingService extends Service implements ScreenMediaRecorderList mNotificationManager = notificationManager; mUserContextTracker = userContextTracker; mKeyguardDismissUtil = keyguardDismissUtil; + mScreenRecordingStartTimeStore = screenRecordingStartTimeStore; } /** @@ -178,7 +182,8 @@ public class RecordingService extends Service implements ScreenMediaRecorderList currentUid, mAudioSource, captureTarget, - this + this, + mScreenRecordingStartTimeStore ); if (startRecording()) { diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java index e024710ed3eb..54da1b04aeb4 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java @@ -55,6 +55,7 @@ import android.view.WindowManager; import com.android.internal.R; import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget; +import com.android.systemui.recordissue.ScreenRecordingStartTimeStore; import java.io.Closeable; import java.io.File; @@ -91,6 +92,7 @@ public class ScreenMediaRecorder extends MediaProjection.Callback { private ScreenInternalAudioRecorder mAudio; private ScreenRecordingAudioSource mAudioSource; private final MediaProjectionCaptureTarget mCaptureRegion; + private final ScreenRecordingStartTimeStore mScreenRecordingStartTimeStore; private final Handler mHandler; private Context mContext; @@ -99,13 +101,15 @@ public class ScreenMediaRecorder extends MediaProjection.Callback { public ScreenMediaRecorder(Context context, Handler handler, int uid, ScreenRecordingAudioSource audioSource, MediaProjectionCaptureTarget captureRegion, - ScreenMediaRecorderListener listener) { + ScreenMediaRecorderListener listener, + ScreenRecordingStartTimeStore screenRecordingStartTimeStore) { mContext = context; mHandler = handler; mUid = uid; mCaptureRegion = captureRegion; mListener = listener; mAudioSource = audioSource; + mScreenRecordingStartTimeStore = screenRecordingStartTimeStore; } private void prepare() throws IOException, RemoteException, RuntimeException { @@ -278,6 +282,7 @@ public class ScreenMediaRecorder extends MediaProjection.Callback { Log.d(TAG, "start recording"); prepare(); mMediaRecorder.start(); + mScreenRecordingStartTimeStore.markStartTime(); recordInternalAudio(); } -- GitLab From 0760098db36d84cce6ad446ec4ce1f5e08bf151f Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 22 Oct 2024 15:03:26 -0700 Subject: [PATCH 249/459] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Ief1bab3706d3b147b28e416d50d0117e08980ba6 --- .../accessibilitymenu/res/values-de/strings.xml | 6 +++--- .../accessibilitymenu/res/values-km/strings.xml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml index 9d9b05a5e3cb..f9e548b48065 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-de/strings.xml @@ -1,8 +1,8 @@ - "Menü für Bedienungshilfen" - "Über das Menü für Bedienungshilfen lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen." + "Menü „Bedienungshilfen“" + "Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen." "Assistant" "Assistant" "Einstellungen für Bedienungshilfen" @@ -20,7 +20,7 @@ "Helligkeit verringern" "Zum vorherigen Bildschirm" "Zum nächsten Bildschirm" - "Über das Menü für Bedienungshilfen lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen." + "Über das Menü „Bedienungshilfen“ lässt sich ein großes Menü zur Bedienung deines Geräts auf dem Bildschirm öffnen. Du kannst beispielsweise das Gerät sperren, die Lautstärke und Helligkeit anpassen und Screenshots machen." "Gerät mit großem Menü steuern" "Einstellungen für das Menü „Bedienungshilfen“" "Große Schaltflächen" diff --git a/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml index e091dd99a76d..02c091e42a29 100644 --- a/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml +++ b/packages/SystemUI/accessibility/accessibilitymenu/res/values-km/strings.xml @@ -3,7 +3,7 @@ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> "ម៉ឺនុយ​ភាពងាយស្រួល" "ម៉ឺនុយភាពងាយស្រួលផ្ដល់ម៉ឺនុយធំនៅលើអេក្រង់ ដើម្បីគ្រប់គ្រងឧបករណ៍របស់អ្នក។ អ្នកអាច​ចាក់សោឧបករណ៍​របស់អ្នក គ្រប់គ្រងកម្រិតសំឡេងនិងពន្លឺ ថតរូបអេក្រង់ និង​អ្វីៗច្រើនទៀត។" - "ជំនួយការ" + "Google Assistant" "Google Assistant" "ការកំណត់​ភាព​ងាយស្រួល" "ថាមពល" -- GitLab From f7a777bf91a312c3f098592920c57a40bb2d1eb9 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 22 Oct 2024 15:04:40 -0700 Subject: [PATCH 250/459] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: Id221e89c17a6e58d7a66d1b807c6b81159e4a6e7 --- packages/SystemUI/res/values-af/strings.xml | 6 ++++++ packages/SystemUI/res/values-am/strings.xml | 6 ++++++ packages/SystemUI/res/values-ar/strings.xml | 6 ++++++ packages/SystemUI/res/values-as/strings.xml | 6 ++++++ packages/SystemUI/res/values-az/strings.xml | 6 ++++++ packages/SystemUI/res/values-b+sr+Latn/strings.xml | 8 +++++++- packages/SystemUI/res/values-be/strings.xml | 6 ++++++ packages/SystemUI/res/values-bg/strings.xml | 4 ++++ packages/SystemUI/res/values-bn/strings.xml | 6 ++++++ packages/SystemUI/res/values-bs/strings.xml | 6 ++++++ packages/SystemUI/res/values-ca/strings.xml | 14 ++++++++++---- packages/SystemUI/res/values-cs/strings.xml | 6 ++++++ packages/SystemUI/res/values-da/strings.xml | 6 ++++++ packages/SystemUI/res/values-de/strings.xml | 6 ++++++ packages/SystemUI/res/values-el/strings.xml | 6 ++++++ packages/SystemUI/res/values-en-rAU/strings.xml | 6 ++++++ packages/SystemUI/res/values-en-rCA/strings.xml | 3 +++ packages/SystemUI/res/values-en-rGB/strings.xml | 6 ++++++ packages/SystemUI/res/values-en-rIN/strings.xml | 6 ++++++ packages/SystemUI/res/values-es-rUS/strings.xml | 8 +++++++- packages/SystemUI/res/values-es/strings.xml | 6 ++++++ packages/SystemUI/res/values-et/strings.xml | 8 +++++++- packages/SystemUI/res/values-eu/strings.xml | 6 ++++++ packages/SystemUI/res/values-fa/strings.xml | 6 ++++++ packages/SystemUI/res/values-fi/strings.xml | 6 ++++++ packages/SystemUI/res/values-fr-rCA/strings.xml | 6 ++++++ packages/SystemUI/res/values-fr/strings.xml | 6 ++++++ packages/SystemUI/res/values-gl/strings.xml | 6 ++++++ packages/SystemUI/res/values-gu/strings.xml | 6 ++++++ packages/SystemUI/res/values-hi/strings.xml | 6 ++++++ packages/SystemUI/res/values-hr/strings.xml | 6 ++++++ packages/SystemUI/res/values-hu/strings.xml | 6 ++++++ packages/SystemUI/res/values-hy/strings.xml | 8 +++++++- packages/SystemUI/res/values-in/strings.xml | 6 ++++++ packages/SystemUI/res/values-is/strings.xml | 6 ++++++ packages/SystemUI/res/values-it/strings.xml | 6 ++++++ packages/SystemUI/res/values-iw/strings.xml | 6 ++++++ packages/SystemUI/res/values-ja/strings.xml | 6 ++++++ packages/SystemUI/res/values-ka/strings.xml | 6 ++++++ packages/SystemUI/res/values-kk/strings.xml | 6 ++++++ packages/SystemUI/res/values-km/strings.xml | 6 ++++++ packages/SystemUI/res/values-kn/strings.xml | 6 ++++++ packages/SystemUI/res/values-ko/strings.xml | 6 ++++++ packages/SystemUI/res/values-ky/strings.xml | 6 ++++++ packages/SystemUI/res/values-lo/strings.xml | 6 ++++++ packages/SystemUI/res/values-lt/strings.xml | 4 ++++ packages/SystemUI/res/values-lv/strings.xml | 6 ++++++ packages/SystemUI/res/values-mk/strings.xml | 6 ++++++ packages/SystemUI/res/values-ml/strings.xml | 6 ++++++ packages/SystemUI/res/values-mn/strings.xml | 6 ++++++ packages/SystemUI/res/values-mr/strings.xml | 6 ++++++ packages/SystemUI/res/values-ms/strings.xml | 6 ++++++ packages/SystemUI/res/values-my/strings.xml | 8 +++++++- packages/SystemUI/res/values-nb/strings.xml | 6 ++++++ packages/SystemUI/res/values-ne/strings.xml | 6 ++++++ packages/SystemUI/res/values-nl/strings.xml | 6 ++++++ packages/SystemUI/res/values-or/strings.xml | 6 ++++++ packages/SystemUI/res/values-pa/strings.xml | 6 ++++++ packages/SystemUI/res/values-pl/strings.xml | 6 ++++++ packages/SystemUI/res/values-pt-rBR/strings.xml | 6 ++++++ packages/SystemUI/res/values-pt-rPT/strings.xml | 6 +++++- packages/SystemUI/res/values-pt/strings.xml | 6 ++++++ packages/SystemUI/res/values-ro/strings.xml | 6 ++++++ packages/SystemUI/res/values-ru/strings.xml | 6 ++++++ packages/SystemUI/res/values-si/strings.xml | 6 ++++++ packages/SystemUI/res/values-sk/strings.xml | 6 ++++++ packages/SystemUI/res/values-sl/strings.xml | 6 ++++++ packages/SystemUI/res/values-sq/strings.xml | 6 ++++++ packages/SystemUI/res/values-sr/strings.xml | 8 +++++++- packages/SystemUI/res/values-sv/strings.xml | 6 ++++++ packages/SystemUI/res/values-sw/strings.xml | 6 ++++++ packages/SystemUI/res/values-ta/strings.xml | 6 ++++++ packages/SystemUI/res/values-te/strings.xml | 6 ++++++ packages/SystemUI/res/values-th/strings.xml | 6 ++++++ packages/SystemUI/res/values-tl/strings.xml | 6 ++++++ packages/SystemUI/res/values-tr/strings.xml | 6 ++++++ packages/SystemUI/res/values-uk/strings.xml | 8 +++++++- packages/SystemUI/res/values-ur/strings.xml | 6 ++++++ packages/SystemUI/res/values-uz/strings.xml | 4 ++++ packages/SystemUI/res/values-vi/strings.xml | 6 ++++++ packages/SystemUI/res/values-zh-rCN/strings.xml | 10 ++++++++-- packages/SystemUI/res/values-zh-rHK/strings.xml | 6 ++++++ packages/SystemUI/res/values-zh-rTW/strings.xml | 6 ++++++ packages/SystemUI/res/values-zu/strings.xml | 6 ++++++ 84 files changed, 507 insertions(+), 14 deletions(-) diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml index f00ba9dad6c4..3f6825839c63 100644 --- a/packages/SystemUI/res/values-af/strings.xml +++ b/packages/SystemUI/res/values-af/strings.xml @@ -1405,6 +1405,8 @@ "Vou ikoon uit" "of" "Sleephandvatsel" + + "Navigeer met jou sleutelbord" "Leer kortpadsleutels" "Navigeer met jou raakpaneel" @@ -1462,4 +1464,8 @@ "Verskaf deur apps" "Vertoon" "Onbekend" + + + + diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml index 9f759fb43a43..c66d7a686f67 100644 --- a/packages/SystemUI/res/values-am/strings.xml +++ b/packages/SystemUI/res/values-am/strings.xml @@ -1405,6 +1405,8 @@ "መዘርጊያ አዶ" "ወይም" "መያዣ ይጎትቱ" + + "የቁልፍ ሰሌዳዎን በመጠቀም ያስሱ" "የቁልፍ ሰሌዳ አቋራጮችን ይወቁ" "የመዳሰሻ ሰሌዳዎን በመጠቀም ያስሱ" @@ -1462,4 +1464,8 @@ "በመተግበሪያዎች የቀረበ" "ማሳያ" "ያልታወቀ" + + + + diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml index c2539a7ec689..c55948879b93 100644 --- a/packages/SystemUI/res/values-ar/strings.xml +++ b/packages/SystemUI/res/values-ar/strings.xml @@ -1405,6 +1405,8 @@ "رمز التوسيع" "أو" "مقبض السحب" + + "التنقّل باستخدام لوحة المفاتيح" "تعرَّف على اختصارات لوحة المفاتيح" "التنقّل باستخدام لوحة اللمس" @@ -1462,4 +1464,8 @@ "مقدَّمة من التطبيقات" "العرض" "غير معروفة" + + + + diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml index 240d29eaaf28..c006caa1a260 100644 --- a/packages/SystemUI/res/values-as/strings.xml +++ b/packages/SystemUI/res/values-as/strings.xml @@ -1405,6 +1405,8 @@ "বিস্তাৰ কৰাৰ চিহ্ন" "অথবা" "ড্ৰেগ হেণ্ডেল" + + "কীব’ৰ্ড ব্যৱহাৰ কৰি নেভিগে’ট কৰক" "কীব’ৰ্ডৰ শ্বৰ্টকাটসমূহৰ বিষয়ে জানক" "আপোনাৰ টাচ্চপেড ব্যৱহাৰ কৰি নেভিগে’ট কৰক" @@ -1462,4 +1464,8 @@ "এপে প্ৰদান কৰা" "ডিছপ্লে’" "অজ্ঞাত" + + + + diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml index d3ebd7d6f43c..f33fa778c7ec 100644 --- a/packages/SystemUI/res/values-az/strings.xml +++ b/packages/SystemUI/res/values-az/strings.xml @@ -1405,6 +1405,8 @@ "İkonanı genişləndirin" "və ya" "Dəstəyi çəkin" + + "Klaviaturadan istifadə edərək hərəkət edin" "Klaviatura qısayolları haqqında öyrənin" "Taçpeddən istifadə edərək hərəkət edin" @@ -1462,4 +1464,8 @@ "Tətbiqlər tərəfindən təmin edilir" "Displey" "Naməlum" + + + + diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml index a1fc84637a90..11db758db776 100644 --- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml +++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml @@ -555,7 +555,7 @@ "Prebaci ceo ekran" "Kada prebacujete ceo ekran, vidi se sve što je na njemu. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj." "Kada prebacujete aplikaciju, vidi se sav sadržaj koji se prikazuje ili pušta u njoj. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, audio i video sadržaj." - "Prebacivanje ekrana" + "Prebacii ekran" "Odaberite aplikaciju koju želite da prebacite" "Želite da počnete da delite?" "Kada delite, snimate ili prebacujete, Android ima pristup kompletnom sadržaju koji je vidljiv na ekranu ili se pušta na uređaju. Zato pazite na lozinke, informacije o plaćanju, poruke, slike, i audio i video sadržaj." @@ -1405,6 +1405,8 @@ "Ikona za proširivanje" "ili" "Marker za prevlačenje" + + "Krećite se pomoću tastature" "Saznajte više o tasterskim prečicama" "Krećite se pomoću tačpeda" @@ -1462,4 +1464,8 @@ "Obezbeđuju aplikacije" "Ekran" "Nepoznato" + + + + diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml index 526a11e0cb8f..8ba951ff5a02 100644 --- a/packages/SystemUI/res/values-be/strings.xml +++ b/packages/SystemUI/res/values-be/strings.xml @@ -1405,6 +1405,8 @@ "Значок \"Разгарнуць\"" "або" "Маркер перацягвання" + + "Навігацыя з дапамогай клавіятуры" "Азнаёмцеся са спалучэннямі клавіш" "Навігацыя з дапамогай сэнсарнай панэлі" @@ -1462,4 +1464,8 @@ "Забяспечваюцца праграмамі" "Экран" "Невядома" + + + + diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml index b843068e85d7..71649cf18bb4 100644 --- a/packages/SystemUI/res/values-bg/strings.xml +++ b/packages/SystemUI/res/values-bg/strings.xml @@ -1405,6 +1405,8 @@ "Икона за разгъване" "или" "Манипулатор за преместване с плъзгане" + + "Навигирайте посредством клавиатурата си" "Научете за клавишните комбинации" "Навигирайте посредством сензорния панел" @@ -1462,4 +1464,6 @@ "Предоставено от приложения" "Екран" "Неизвестно" + "Нулиране на панелите" + "Да се възстанови ли първоначалният ред и размери на панелите?" diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml index 0732387fe337..92056c9014f7 100644 --- a/packages/SystemUI/res/values-bn/strings.xml +++ b/packages/SystemUI/res/values-bn/strings.xml @@ -1405,6 +1405,8 @@ "আইকন বড় করুন" "অথবা" "টেনে আনার হ্যান্ডেল" + + "আপনার কীবোর্ড ব্যবহার করে নেভিগেট করুন" "কীবোর্ড শর্টকাট সম্পর্কে জানুন" "আপনার টাচপ্যাড ব্যবহার করে নেভিগেট করুন" @@ -1462,4 +1464,8 @@ "অ্যাপের তরফ থেকে দেওয়া" "ডিসপ্লে" "অজানা" + + + + diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml index b1146f4c482c..a02b604b8333 100644 --- a/packages/SystemUI/res/values-bs/strings.xml +++ b/packages/SystemUI/res/values-bs/strings.xml @@ -1405,6 +1405,8 @@ "Ikona proširivanja" "ili" "Ručica za prevlačenje" + + "Krećite se pomoću tastature" "Saznajte više o prečicama tastature" "Krećite se pomoću dodirne podloge" @@ -1462,4 +1464,8 @@ "Pružaju aplikacije" "Prikaz" "Nepoznato" + + + + diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml index a836b97bfa79..7ea02369e608 100644 --- a/packages/SystemUI/res/values-ca/strings.xml +++ b/packages/SystemUI/res/values-ca/strings.xml @@ -129,8 +129,8 @@ "Comparteix" "S\'ha desat la gravació de pantalla" "Toca per veure-la" - "S\'ha produït un error en desar la gravació de la pantalla" - "S\'ha produït un error en iniciar la gravació de pantalla" + "Hi ha hagut un error en desar la gravació de la pantalla" + "Hi ha hagut un error en iniciar la gravació de pantalla" "Vols aturar la gravació?" "Ara mateix estàs gravant tota la pantalla" "Ara mateix estàs gravant %1$s" @@ -159,8 +159,8 @@ "Comparteix" "S\'ha desat la gravació del problema" "Toca per veure" - "S\'ha produït un error en desar la gravació del problema" - "S\'ha produït un error en iniciar la gravació del problema" + "Hi ha hagut un error en desar la gravació del problema" + "Hi ha hagut un error en iniciar la gravació del problema" "Visualització en pantalla completa" "Per sortir, llisca cap avall des de la part superior de la pantalla" "Entesos" @@ -1405,6 +1405,8 @@ "Desplega la icona" "o" "Ansa per arrossegar" + + "Navega amb el teclat" "Aprèn les tecles de drecera" "Navega amb el ratolí tàctil" @@ -1462,4 +1464,8 @@ "Proporcionat per aplicacions" "Pantalla" "Desconegut" + + + + diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml index 70bdb6277343..750e75db8e10 100644 --- a/packages/SystemUI/res/values-cs/strings.xml +++ b/packages/SystemUI/res/values-cs/strings.xml @@ -1405,6 +1405,8 @@ "Ikona rozbalení" "nebo" "Úchyt pro přetažení" + + "Navigujte pomocí klávesnice" "Naučte se klávesové zkratky" "Navigujte pomocí touchpadu" @@ -1462,4 +1464,8 @@ "Poskytováno aplikacemi" "Displej" "Neznámé" + + + + diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml index eeece4c4395b..b52b1823bdab 100644 --- a/packages/SystemUI/res/values-da/strings.xml +++ b/packages/SystemUI/res/values-da/strings.xml @@ -1405,6 +1405,8 @@ "Ikon for Udvid" "eller" "Håndtag" + + "Naviger ved hjælp af dit tastatur" "Se tastaturgenveje" "Naviger ved hjælp af din touchplade" @@ -1462,4 +1464,8 @@ "Fra apps" "Skærm" "Ukendt" + + + + diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml index 95703148499b..ba6452f0da1c 100644 --- a/packages/SystemUI/res/values-de/strings.xml +++ b/packages/SystemUI/res/values-de/strings.xml @@ -1405,6 +1405,8 @@ "Symbol „Maximieren“" "oder" "Ziehpunkt" + + "Navigation mit der Tastatur" "Informationen zu Tastenkombinationen" "Navigation mit dem Touchpad" @@ -1462,4 +1464,8 @@ "Von Apps bereitgestellt" "Display" "Unbekannt" + + + + diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml index 5551740f67d7..4cccb5ab4351 100644 --- a/packages/SystemUI/res/values-el/strings.xml +++ b/packages/SystemUI/res/values-el/strings.xml @@ -1405,6 +1405,8 @@ "Εικονίδιο ανάπτυξης" "ή" "Λαβή μεταφοράς" + + "Πλοήγηση με το πληκτρολόγιο" "Μάθετε συντομεύσεις πληκτρολογίου" "Πλοήγηση με την επιφάνεια αφής" @@ -1462,4 +1464,8 @@ "Παρέχεται από εφαρμογές" "Προβολή" "Άγνωστο" + + + + diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml index df9d2103b783..e96dd8c480b6 100644 --- a/packages/SystemUI/res/values-en-rAU/strings.xml +++ b/packages/SystemUI/res/values-en-rAU/strings.xml @@ -1405,6 +1405,8 @@ "Expand icon" "or" "Drag handle" + + "Navigate using your keyboard" "Learn keyboards shortcuts" "Navigate using your touchpad" @@ -1462,4 +1464,8 @@ "Provided by apps" "Display" "Unknown" + + + + diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml index 28cb9a311f5f..eee14f81ab50 100644 --- a/packages/SystemUI/res/values-en-rCA/strings.xml +++ b/packages/SystemUI/res/values-en-rCA/strings.xml @@ -1405,6 +1405,7 @@ "Expand icon" "or" "Drag handle" + "Keyboard Settings" "Navigate using your keyboard" "Learn keyboards shortcuts" "Navigate using your touchpad" @@ -1462,4 +1463,6 @@ "Provided by apps" "Display" "Unknown" + "Reset tiles" + "Reset tiles to their original order and sizes?" diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml index df9d2103b783..e96dd8c480b6 100644 --- a/packages/SystemUI/res/values-en-rGB/strings.xml +++ b/packages/SystemUI/res/values-en-rGB/strings.xml @@ -1405,6 +1405,8 @@ "Expand icon" "or" "Drag handle" + + "Navigate using your keyboard" "Learn keyboards shortcuts" "Navigate using your touchpad" @@ -1462,4 +1464,8 @@ "Provided by apps" "Display" "Unknown" + + + + diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml index df9d2103b783..e96dd8c480b6 100644 --- a/packages/SystemUI/res/values-en-rIN/strings.xml +++ b/packages/SystemUI/res/values-en-rIN/strings.xml @@ -1405,6 +1405,8 @@ "Expand icon" "or" "Drag handle" + + "Navigate using your keyboard" "Learn keyboards shortcuts" "Navigate using your touchpad" @@ -1462,4 +1464,8 @@ "Provided by apps" "Display" "Unknown" + + + + diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml index e39b2a48f9ee..97bd547dac94 100644 --- a/packages/SystemUI/res/values-es-rUS/strings.xml +++ b/packages/SystemUI/res/values-es-rUS/strings.xml @@ -554,7 +554,7 @@ "Transmitir una app" "Transmitir pantalla entera" "Cuando transmitas la pantalla entera, todo lo que se muestre es visible. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos." - "Cuando transmitas una app, todo lo que se muestre o reproduzcas en ella será visible. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos." + "Cuando transmitas una app, todo lo que se muestre o reproduzca en ella será visible. Por lo tanto, debes tener cuidado con contraseñas, detalles de pagos, mensajes, fotos, audios y videos." "Transmitir pantalla" "Elige la app para transmitir" "¿Quieres empezar a compartir?" @@ -1405,6 +1405,8 @@ "Ícono de expandir" "o" "Controlador de arrastre" + + "Navega con el teclado" "Aprende combinaciones de teclas" "Navega con el panel táctil" @@ -1462,4 +1464,8 @@ "Proporcionado por apps" "Pantalla" "Desconocido" + + + + diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml index 6d77be4ff7cc..8d018bb35b55 100644 --- a/packages/SystemUI/res/values-es/strings.xml +++ b/packages/SystemUI/res/values-es/strings.xml @@ -1405,6 +1405,8 @@ "Icono de desplegar" "o" "Controlador de arrastre" + + "Desplázate con el teclado" "Aprende combinaciones de teclas" "Desplázate con el panel táctil" @@ -1462,4 +1464,8 @@ "Proporcionado por aplicaciones" "Pantalla" "Desconocido" + + + + diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml index ed1440996b31..53651da18753 100644 --- a/packages/SystemUI/res/values-et/strings.xml +++ b/packages/SystemUI/res/values-et/strings.xml @@ -556,7 +556,7 @@ "Kogu ekraanikuva ülekandmisel on kogu sellel kuvatav sisu nähtav. Seega olge ettevaatlik näiteks paroolide, makseteabe, sõnumite, fotode ning heli ja videoga." "Rakenduse ülekandmisel on kogu rakenduses kuvatav või esitatav sisu nähtav. Seega olge ettevaatlik näiteks paroolide, makseteabe, sõnumite, fotode ning heli ja videoga." "Kanna üle ekraanikuva" - "Vali ülekandmiseks rakendus" + "Valige ülekandmiseks rakendus" "Kas alustada jagamist?" "Kui jagate, salvestate või kannate üle, on Androidil juurdepääs kõigele, mis on teie ekraanikuval nähtaval või mida teie seadmes esitatakse. Seega olge ettevaatlik selliste andmetega nagu paroolid, makseteave, sõnumid, fotod ning heli ja video." "Kui jagate, salvestate või kannate rakendust üle, on Androidil juurdepääs kõigele, mida selles rakenduses kuvatakse või esitatakse. Seega olge paroolide, makseteabe, sõnumite, fotode, heli ja videoga ettevaatlik." @@ -1405,6 +1405,8 @@ "Laiendamisikoon" "või" "Lohistamispide" + + "Navigeerige klaviatuuri abil" "Õppige klaviatuuri otseteid" "Navigeerige puuteplaadi abil" @@ -1462,4 +1464,8 @@ "Rakendustelt" "Kuva" "Teadmata" + + + + diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml index 2fb75d31c156..f7398628dbf0 100644 --- a/packages/SystemUI/res/values-eu/strings.xml +++ b/packages/SystemUI/res/values-eu/strings.xml @@ -1405,6 +1405,8 @@ "Zabaltzeko ikonoa" "edo" "Arrastatzeko kontrol-puntua" + + "Nabigatu teklatua erabilita" "Ikasi lasterbideak" "Nabigatu ukipen-panela erabilita" @@ -1462,4 +1464,8 @@ "Aplikazioenak" "Pantaila" "Ezezagunak" + + + + diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml index b18c84ad3507..3d0b720e4951 100644 --- a/packages/SystemUI/res/values-fa/strings.xml +++ b/packages/SystemUI/res/values-fa/strings.xml @@ -1405,6 +1405,8 @@ "نماد ازهم بازکردن" "یا" "دستگیره کشاندن" + + "پیمایش کردن بااستفاده از صفحه‌کلید" "آشنایی با میان‌برهای صفحه‌کلید" "پیمایش کردن بااستفاده از صفحه لمسی" @@ -1462,4 +1464,8 @@ "ارائه‌شده از برنامه‌ها" "نمایشگر" "نامشخص" + + + + diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml index 46027419ec7f..ca6a97b0ec8c 100644 --- a/packages/SystemUI/res/values-fi/strings.xml +++ b/packages/SystemUI/res/values-fi/strings.xml @@ -1405,6 +1405,8 @@ "Laajennuskuvake" "tai" "Vetokahva" + + "Siirry käyttämällä näppäimistöä" "Opettele pikanäppäimiä" "Siirry käyttämällä kosketuslevyä" @@ -1462,4 +1464,8 @@ "Sovellusten tarjoama" "Näyttö" "Tuntematon" + + + + diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml index 77434a5fd283..4496b5ebfb16 100644 --- a/packages/SystemUI/res/values-fr-rCA/strings.xml +++ b/packages/SystemUI/res/values-fr-rCA/strings.xml @@ -1405,6 +1405,8 @@ "Icône Développer" "ou" "Poignée de déplacement" + + "Naviguer à l\'aide de votre clavier" "Apprenez à utiliser les raccourcis-clavier" "Naviguer à l\'aide de votre pavé tactile" @@ -1462,4 +1464,8 @@ "Fournies par des applis" "Affichage" "Inconnu" + + + + diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml index fa16862ac1d7..77b98eb11f74 100644 --- a/packages/SystemUI/res/values-fr/strings.xml +++ b/packages/SystemUI/res/values-fr/strings.xml @@ -1405,6 +1405,8 @@ "Icône Développer" "ou" "Poignée de déplacement" + + "Naviguer à l\'aide du clavier" "Découvrir les raccourcis clavier" "Naviguer à l\'aide de votre pavé tactile" @@ -1462,4 +1464,8 @@ "Fournis par des applis" "Écran" "Inconnu" + + + + diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml index 1d2c785a198e..3b94095c99b7 100644 --- a/packages/SystemUI/res/values-gl/strings.xml +++ b/packages/SystemUI/res/values-gl/strings.xml @@ -1405,6 +1405,8 @@ "Icona de despregar" "ou" "Controlador de arrastre" + + "Navega co teclado" "Aprende a usar os atallos de teclado" "Navega co panel táctil" @@ -1462,4 +1464,8 @@ "Provenientes de aplicacións" "Visualización" "Categoría descoñecida" + + + + diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml index c6014b18e4f6..f87184abcac3 100644 --- a/packages/SystemUI/res/values-gu/strings.xml +++ b/packages/SystemUI/res/values-gu/strings.xml @@ -1405,6 +1405,8 @@ "\'મોટું કરો\'નું આઇકન" "અથવા" "ઑબ્જેક્ટ ખેંચવાનું હૅન્ડલ" + + "તમારા કીબોર્ડ વડે નૅવિગેટ કરો" "કીબોર્ડ શૉર્ટકર્ટ જાણો" "તમારા ટચપૅડ વડે નૅવિગેટ કરો" @@ -1462,4 +1464,8 @@ "ઍપ દ્વારા પ્રદાન કરવામાં આવેલી" "ડિસ્પ્લે" "અજાણ" + + + + diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml index 28a4f2bc05eb..767f9df9aa83 100644 --- a/packages/SystemUI/res/values-hi/strings.xml +++ b/packages/SystemUI/res/values-hi/strings.xml @@ -1405,6 +1405,8 @@ "बड़ा करने का आइकॉन" "या" "खींचकर छोड़ने वाला हैंडल" + + "कीबोर्ड का इस्तेमाल करके नेविगेट करें" "कीबोर्ड शॉर्टकट के बारे में जानें" "टचपैड का इस्तेमाल करके नेविगेट करें" @@ -1462,4 +1464,8 @@ "ऐप्लिकेशन से मिली जानकारी" "डिसप्ले" "कोई जानकारी नहीं है" + + + + diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml index cc19bea1fee0..f04045181686 100644 --- a/packages/SystemUI/res/values-hr/strings.xml +++ b/packages/SystemUI/res/values-hr/strings.xml @@ -1405,6 +1405,8 @@ "Ikona za proširivanje" "ili" "Marker za povlačenje" + + "Krećite se pomoću tipkovnice" "Saznajte više o tipkovnim prečacima" "Krećite se pomoću dodirne podloge" @@ -1462,4 +1464,8 @@ "Pružaju aplikacije" "Prikaz" "Nepoznato" + + + + diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml index 9ee748bdc04c..629e2ff11c10 100644 --- a/packages/SystemUI/res/values-hu/strings.xml +++ b/packages/SystemUI/res/values-hu/strings.xml @@ -1405,6 +1405,8 @@ "Kibontás ikon" "vagy" "Fogópont" + + "Navigáció a billentyűzet segítségével" "Billentyűparancsok megismerése" "Navigálás az érintőpaddal" @@ -1462,4 +1464,8 @@ "Alkalmazás által biztosított" "Kijelző" "Ismeretlen" + + + + diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml index b07a78522437..92da53b839bd 100644 --- a/packages/SystemUI/res/values-hy/strings.xml +++ b/packages/SystemUI/res/values-hy/strings.xml @@ -312,7 +312,7 @@ "Փոխանցել աուդիոն" "Աուդիոյի փոխանցում" "անցնել աուդիոյի փոխանցման կարգավորումներ" - "Այս սարքի երաժշտությունն ու տեսանյութերը երկու ականջակալներում էլ կնվագարկվեն" + "Այս սարքի երաժշտությունն ու տեսանյութերը երկուսի ականջակալներում էլ կնվագարկվեն" "Կիսվեք ձեր աուդիոյով" "%1$s և %2$s" "Անցնել %1$s սարքին" @@ -1405,6 +1405,8 @@ "Ծավալել պատկերակը" "կամ" "Տեղափոխման նշիչ" + + "Կողմնորոշվեք ձեր ստեղնաշարի օգնությամբ" "Սովորեք օգտագործել ստեղնային դյուրանցումները" "Կողմնորոշվեք ձեր հպահարթակի օգնությամբ" @@ -1462,4 +1464,8 @@ "Տրամադրվել են հավելվածների կողմից" "Էկրան" "Անհայտ" + + + + diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml index 84a45c6c8a08..d0544052126f 100644 --- a/packages/SystemUI/res/values-in/strings.xml +++ b/packages/SystemUI/res/values-in/strings.xml @@ -1405,6 +1405,8 @@ "Ikon luaskan" "atau" "Handel geser" + + "Menavigasi menggunakan keyboard" "Pelajari pintasan keyboard" "Menavigasi menggunakan touchpad" @@ -1462,4 +1464,8 @@ "Disediakan oleh aplikasi" "Tampilan" "Tidak diketahui" + + + + diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml index f27790c05b1b..607f48fe5582 100644 --- a/packages/SystemUI/res/values-is/strings.xml +++ b/packages/SystemUI/res/values-is/strings.xml @@ -1405,6 +1405,8 @@ "Stækka tákn" "eða" "Dragkló" + + "Flettu með því að nota lyklaborðið" "Kynntu þér flýtilykla" "Flettu með því að nota snertiflötinn" @@ -1462,4 +1464,8 @@ "Frá forritum" "Skjár" "Óþekkt" + + + + diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml index 7ace302022b6..0cbdb8688cdf 100644 --- a/packages/SystemUI/res/values-it/strings.xml +++ b/packages/SystemUI/res/values-it/strings.xml @@ -1405,6 +1405,8 @@ "Icona Espandi" "oppure" "Punto di trascinamento" + + "Naviga usando la tastiera" "Informazioni sulle scorciatoie da tastiera" "Naviga usando il touchpad" @@ -1462,4 +1464,8 @@ "Forniti dalle app" "Display" "Sconosciuti" + + + + diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml index b5783cf56688..465d8f5eaed9 100644 --- a/packages/SystemUI/res/values-iw/strings.xml +++ b/packages/SystemUI/res/values-iw/strings.xml @@ -1405,6 +1405,8 @@ "סמל ההרחבה" "או" "נקודת האחיזה לגרירה" + + "ניווט באמצעות המקלדת" "מידע על מקשי קיצור" "ניווט באמצעות לוח המגע" @@ -1462,4 +1464,8 @@ "מסופקים על ידי אפליקציות" "מסך" "לא ידוע" + + + + diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml index 8427f6709d31..6df9f73875ef 100644 --- a/packages/SystemUI/res/values-ja/strings.xml +++ b/packages/SystemUI/res/values-ja/strings.xml @@ -1405,6 +1405,8 @@ "開くアイコン" "または" "ドラッグ ハンドル" + + "キーボードを使用して移動する" "キーボード ショートカットの詳細" "タッチパッドを使用して移動する" @@ -1462,4 +1464,8 @@ "アプリから提供" "ディスプレイ" "不明" + + + + diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml index 3b0732da57c4..b30c7483e6e3 100644 --- a/packages/SystemUI/res/values-ka/strings.xml +++ b/packages/SystemUI/res/values-ka/strings.xml @@ -1405,6 +1405,8 @@ "ხატულის გაფართოება" "ან" "სახელური ჩავლებისთვის" + + "ნავიგაცია კლავიატურის გამოყენებით" "კლავიატურის მალსახმობების სწავლა" "ნავიგაცია სენსორული პანელის გამოყენებით" @@ -1462,4 +1464,8 @@ "მოწოდებულია აპების მიერ" "ეკრანი" "უცნობი" + + + + diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml index 65115583f681..c9517ec3ad21 100644 --- a/packages/SystemUI/res/values-kk/strings.xml +++ b/packages/SystemUI/res/values-kk/strings.xml @@ -1405,6 +1405,8 @@ "Жаю белгішесі" "немесе" "Сүйрейтін тетік" + + "Пернетақтамен жұмыс істеңіз" "Перне тіркесімдерін үйреніңіз." "Сенсорлық тақтамен жұмыс істеңіз" @@ -1462,4 +1464,8 @@ "Қолданбалар ұсынған" "Дисплей" "Белгісіз" + + + + diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml index 7b7f912b3e1c..10a125b6e07c 100644 --- a/packages/SystemUI/res/values-km/strings.xml +++ b/packages/SystemUI/res/values-km/strings.xml @@ -1405,6 +1405,8 @@ "រូបតំណាង \"ពង្រីក\"" "ឬ" "ដង​អូស" + + "រុករកដោយប្រើក្ដារចុចរបស់អ្នក" "ស្វែងយល់អំពីផ្លូវកាត់​ក្ដារ​ចុច" "រុករកដោយប្រើផ្ទាំងប៉ះរបស់អ្នក" @@ -1462,4 +1464,8 @@ "ផ្ដល់ជូនដោយកម្មវិធី" "ផ្ទាំងបង្ហាញ" "មិនស្គាល់" + + + + diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml index c4417b7990b0..3ff0629835d6 100644 --- a/packages/SystemUI/res/values-kn/strings.xml +++ b/packages/SystemUI/res/values-kn/strings.xml @@ -1405,6 +1405,8 @@ "ವಿಸ್ತೃತಗೊಳಿಸುವ ಐಕಾನ್" "ಅಥವಾ" "ಡ್ರ್ಯಾಗ್‌ ಹ್ಯಾಂಡಲ್‌" + + "ನಿಮ್ಮ ಕೀಬೋರ್ಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" "ಕೀಬೋರ್ಡ್ ಶಾರ್ಟ್‌ಕಟ್‌ಗಳನ್ನು ಕಲಿಯಿರಿ" "ನಿಮ್ಮ ಟಚ್‌ಪ್ಯಾಡ್ ಬಳಸಿ ನ್ಯಾವಿಗೇಟ್ ಮಾಡಿ" @@ -1462,4 +1464,8 @@ "ಆ್ಯಪ್‌ಗಳಿಂದ ಒದಗಿಸಲಾಗಿದೆ" "ಡಿಸ್‌ಪ್ಲೇ" "ಅಪರಿಚಿತ" + + + + diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml index 5602ee79eb37..0c1dc01e5dd9 100644 --- a/packages/SystemUI/res/values-ko/strings.xml +++ b/packages/SystemUI/res/values-ko/strings.xml @@ -1405,6 +1405,8 @@ "확장 아이콘" "또는" "드래그 핸들" + + "키보드를 사용하여 이동" "단축키 알아보기" "터치패드를 사용하여 이동" @@ -1462,4 +1464,8 @@ "앱에서 제공" "디스플레이" "알 수 없음" + + + + diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml index 93777db15280..b74e4947034d 100644 --- a/packages/SystemUI/res/values-ky/strings.xml +++ b/packages/SystemUI/res/values-ky/strings.xml @@ -1405,6 +1405,8 @@ "Жайып көрсөтүү сүрөтчөсү" "же" "Cүйрөө маркери" + + "Нерселерге баскычтоп аркылуу өтүңүз" "Ыкчам баскычтар тууралуу билип алыңыз" "Нерселерге сенсордук такта аркылуу өтүңүз" @@ -1462,4 +1464,8 @@ "Колдонмолор сунуштады" "Экран" "Белгисиз" + + + + diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml index 07f3853b3c8b..ce8c95941fed 100644 --- a/packages/SystemUI/res/values-lo/strings.xml +++ b/packages/SystemUI/res/values-lo/strings.xml @@ -1405,6 +1405,8 @@ "ໄອຄອນຂະຫຍາຍ" "ຫຼື" "ບ່ອນຈັບລາກ" + + "ນຳທາງໂດຍໃຊ້ແປ້ນພິມຂອງທ່ານ" "ສຶກສາຄີລັດ" "ນຳທາງໂດຍໃຊ້ແຜ່ນສຳຜັດຂອງທ່ານ" @@ -1462,4 +1464,8 @@ "ສະໜອງໃຫ້ໂດຍແອັບ" "ການສະແດງຜົນ" "ບໍ່ຮູ້ຈັກ" + + + + diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml index 605b8dd2e303..a7906b6ee184 100644 --- a/packages/SystemUI/res/values-lt/strings.xml +++ b/packages/SystemUI/res/values-lt/strings.xml @@ -1405,6 +1405,8 @@ "Išskleidimo piktograma" "arba" "Vilkimo rankenėlė" + + "Naršykite naudodamiesi klaviatūra" "Sužinokite apie sparčiuosius klavišus" "Naršykite naudodamiesi jutikline dalimi" @@ -1462,4 +1464,6 @@ "Teikia programos" "Ekranas" "Nežinoma" + "Išklotinės nustatymas iš naujo" + "Iš naujo nustatyti išklotinės pradinę tvarką ir dydžius?" diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml index 0393ad50a619..cff7278df5a8 100644 --- a/packages/SystemUI/res/values-lv/strings.xml +++ b/packages/SystemUI/res/values-lv/strings.xml @@ -1405,6 +1405,8 @@ "Izvēršanas ikona" "vai" "Vilkšanas turis" + + "Pārvietošanās, izmantojot tastatūru" "Uzziniet par īsinājumtaustiņiem." "Pārvietošanās, izmantojot skārienpaliktni" @@ -1462,4 +1464,8 @@ "Nodrošina lietotnes" "Displejs" "Nezināma" + + + + diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml index 6b956ec6f532..464ef33c9b1f 100644 --- a/packages/SystemUI/res/values-mk/strings.xml +++ b/packages/SystemUI/res/values-mk/strings.xml @@ -1405,6 +1405,8 @@ "Икона за проширување" "или" "Рачка за влечење" + + "Движете се со користење на тастатурата" "Научете кратенки од тастатурата" "Движете се со користење на допирната подлога" @@ -1462,4 +1464,8 @@ "Обезбедено од апликации" "Екран" "Непознато" + + + + diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml index cd0a0442d3b0..08e979979482 100644 --- a/packages/SystemUI/res/values-ml/strings.xml +++ b/packages/SystemUI/res/values-ml/strings.xml @@ -1405,6 +1405,8 @@ "വികസിപ്പിക്കൽ ഐക്കൺ" "അല്ലെങ്കിൽ" "വലിച്ചിടുന്നതിനുള്ള ഹാൻഡിൽ" + + "നിങ്ങളുടെ കീബോർഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക" "കീബോർഡ് കുറുക്കുവഴികൾ മനസ്സിലാക്കുക" "നിങ്ങളുടെ ടച്ച്‌പാഡ് ഉപയോഗിച്ച് നാവിഗേറ്റ് ചെയ്യുക" @@ -1462,4 +1464,8 @@ "ആപ്പുകൾ നൽകുന്നത്" "ഡിസ്‌പ്ലേ" "അജ്ഞാതം" + + + + diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml index e4f174641043..73b6aab3d665 100644 --- a/packages/SystemUI/res/values-mn/strings.xml +++ b/packages/SystemUI/res/values-mn/strings.xml @@ -1405,6 +1405,8 @@ "Дэлгэх дүрс тэмдэг" "эсвэл" "Чирэх бариул" + + "Гараа ашиглан шилжих" "Товчлуурын шууд холбоосыг мэдэж аваарай" "Мэдрэгч самбараа ашиглан шилжээрэй" @@ -1462,4 +1464,8 @@ "Аппуудаас өгсөн" "Дэлгэц" "Тодорхойгүй" + + + + diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml index 458fe2cb3c84..22044c2817a6 100644 --- a/packages/SystemUI/res/values-mr/strings.xml +++ b/packages/SystemUI/res/values-mr/strings.xml @@ -1405,6 +1405,8 @@ "विस्तार करा आयकन" "किंवा" "ड्रॅग हॅंडल" + + "तुमचा कीबोर्ड वापरून नेव्हिगेट करा" "कीबोर्ड शॉर्टकट जाणून घ्या" "तुमचा टचपॅड वापरून नेव्हिगेट करा" @@ -1462,4 +1464,8 @@ "अ‍ॅप्सद्वारे पुरवलेले" "डिस्प्ले" "अज्ञात" + + + + diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml index 8912366fbed4..7ee2dcdb54f3 100644 --- a/packages/SystemUI/res/values-ms/strings.xml +++ b/packages/SystemUI/res/values-ms/strings.xml @@ -1405,6 +1405,8 @@ "Kembangkan ikon" "atau" "Pemegang seret" + + "Navigasi menggunakan papan kekunci anda" "Ketahui pintasan papan kekunci" "Navigasi menggunakan pad sentuh anda" @@ -1462,4 +1464,8 @@ "Disediakan oleh apl" "Paparan" "Tidak diketahui" + + + + diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml index e3880017fde4..d3ccaf9cf635 100644 --- a/packages/SystemUI/res/values-my/strings.xml +++ b/packages/SystemUI/res/values-my/strings.xml @@ -555,7 +555,7 @@ "ဖန်သားပြင်တစ်ခုလုံးကို ကာစ်လုပ်ရန်" "သင့်ဖန်သားပြင်တစ်ခုလုံးကို ကာစ်လုပ်သည့်အခါ ဖန်သားပြင်ပေါ်ရှိ အရာအားလုံးကို မြင်နိုင်သည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။" "အက်ပ်တစ်ခုကို ကာစ်လုပ်သည့်အခါ ယင်းအက်ပ်တွင် ပြထားသော (သို့) ဖွင့်ထားသော အရာအားလုံးကို မြင်နိုင်သည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။" - "စခရင် ကာစ်လုပ်ရန်" + "ဖန်သားပြင်ကာစ်လုပ်ရန်" "ကာစ်လုပ်ရန် အက်ပ်ရွေးခြင်း" "စတင်မျှဝေမလား။" "မျှဝေ၊ ရုပ်သံဖမ်း (သို့) ကာစ်လုပ်သည့်အခါ Android သည် သင့်ဖန်သားပြင်တွင် မြင်နိုင်သည့် (သို့) သင့်စက်တွင် ဖွင့်ထားသည့် အရာအားလုံးကို တွေ့နိုင်သည်။ စကားဝှက်၊ ငွေပေးချေမှု အချက်အလက်၊ မက်ဆေ့ဂျ်၊ ဓာတ်ပုံ၊ အသံနှင့် ဗီဒီယိုကဲ့သို့ အရာများကို ဂရုစိုက်ပါ။" @@ -1405,6 +1405,8 @@ "ပိုပြရန် သင်္ကေတ" "သို့မဟုတ်" "ဖိဆွဲအထိန်း" + + "သင့်ကီးဘုတ်ကိုသုံး၍ လမ်းညွှန်ခြင်း" "လက်ကွက်ဖြတ်လမ်းများကို လေ့လာပါ" "သင့်တာ့ချ်ပက်ကိုသုံး၍ လမ်းညွှန်ခြင်း" @@ -1462,4 +1464,8 @@ "အက်ပ်များက ပံ့ပိုးထားသည်" "ဖန်သားပြင်" "အမျိုးအမည်မသိ" + + + + diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml index 49c004b362e7..03e9f350ff86 100644 --- a/packages/SystemUI/res/values-nb/strings.xml +++ b/packages/SystemUI/res/values-nb/strings.xml @@ -1405,6 +1405,8 @@ "Vis-ikon" "eller" "Håndtak" + + "Naviger med tastaturet" "Lær deg hurtigtaster" "Naviger med styreflaten" @@ -1462,4 +1464,8 @@ "Levert av apper" "Skjerm" "Ukjent" + + + + diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml index e364e9ec3edf..4d165cc3a58f 100644 --- a/packages/SystemUI/res/values-ne/strings.xml +++ b/packages/SystemUI/res/values-ne/strings.xml @@ -1405,6 +1405,8 @@ "\"एक्स्पान्ड गर्नुहोस्\" आइकन" "वा" "ड्र्याग ह्यान्डल" + + "किबोर्ड प्रयोग गरी नेभिगेट गर्नुहोस्" "किबोर्डका सर्टकटहरू प्रयोग गर्न सिक्नुहोस्" "टचप्याड प्रयोग गरी नेभिगेट गर्नुहोस्" @@ -1462,4 +1464,8 @@ "एपले उपलब्ध गराएका" "डिस्प्ले" "अज्ञात" + + + + diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml index 0f8eb1146251..4249cb70b7ee 100644 --- a/packages/SystemUI/res/values-nl/strings.xml +++ b/packages/SystemUI/res/values-nl/strings.xml @@ -1405,6 +1405,8 @@ "Icoon voor uitvouwen" "of" "Handgreep voor slepen" + + "Navigeren met je toetsenbord" "Leer sneltoetsen die je kunt gebruiken" "Navigeren met je touchpad" @@ -1462,4 +1464,8 @@ "Geleverd door apps" "Scherm" "Onbekend" + + + + diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml index 16127eb93ade..e2cd9ec8a114 100644 --- a/packages/SystemUI/res/values-or/strings.xml +++ b/packages/SystemUI/res/values-or/strings.xml @@ -1405,6 +1405,8 @@ "ଆଇକନକୁ ବିସ୍ତାର କରନ୍ତୁ" "କିମ୍ବା" "ଡ୍ରାଗ ହେଣ୍ଡେଲ" + + "ଆପଣଙ୍କ କୀବୋର୍ଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ" "କୀବୋର୍ଡ ସର୍ଟକଟଗୁଡ଼ିକ ବିଷୟରେ ଜାଣନ୍ତୁ" "ଆପଣଙ୍କ ଟଚପେଡ ବ୍ୟବହାର କରି ନାଭିଗେଟ କରନ୍ତୁ" @@ -1462,4 +1464,8 @@ "ଆପ୍ସ ଦ୍ୱାରା ପ୍ରଦାନ କରାଯାଇଛି" "ଡିସପ୍ଲେ" "ଅଜଣା" + + + + diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml index 63de1a6bda61..3c3102c838c2 100644 --- a/packages/SystemUI/res/values-pa/strings.xml +++ b/packages/SystemUI/res/values-pa/strings.xml @@ -1405,6 +1405,8 @@ "ਪ੍ਰਤੀਕ ਦਾ ਵਿਸਤਾਰ ਕਰੋ" "ਜਾਂ" "ਘਸੀਟਣ ਵਾਲਾ ਹੈਂਡਲ" + + "ਆਪਣੇ ਕੀ-ਬੋਰਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ" "ਕੀ-ਬੋਰਡ ਸ਼ਾਰਟਕੱਟ ਬਾਰੇ ਜਾਣੋ" "ਆਪਣੇ ਟੱਚਪੈਡ ਦੀ ਵਰਤੋਂ ਕਰ ਕੇ ਨੈਵੀਗੇਟ ਕਰੋ" @@ -1462,4 +1464,8 @@ "ਐਪਾਂ ਵੱਲੋਂ ਮੁਹੱਈਆ ਕੀਤਾ ਗਿਆ" "ਡਿਸਪਲੇ" "ਅਗਿਆਤ" + + + + diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml index a5dbc06e2530..5b0fa56b3656 100644 --- a/packages/SystemUI/res/values-pl/strings.xml +++ b/packages/SystemUI/res/values-pl/strings.xml @@ -1405,6 +1405,8 @@ "Ikona rozwijania" "lub" "Uchwyt do przeciągania" + + "Nawiguj za pomocą klawiatury" "Dowiedz się więcej o skrótach klawiszowych" "Nawiguj za pomocą touchpada" @@ -1462,4 +1464,8 @@ "Z aplikacji" "Wyświetlacz" "Nieznane" + + + + diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml index da192e334e31..938602757904 100644 --- a/packages/SystemUI/res/values-pt-rBR/strings.xml +++ b/packages/SystemUI/res/values-pt-rBR/strings.xml @@ -1405,6 +1405,8 @@ "Ícone \"Abrir\"" "ou" "Alça de arrastar" + + "Navegue usando o teclado" "Aprenda atalhos do teclado" "Navegue usando o touchpad" @@ -1462,4 +1464,8 @@ "Fornecidos por apps" "Exibição" "Desconhecidos" + + + + diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml index 127a97ea6ebc..fcd9bbab2c20 100644 --- a/packages/SystemUI/res/values-pt-rPT/strings.xml +++ b/packages/SystemUI/res/values-pt-rPT/strings.xml @@ -687,7 +687,7 @@ "Áudio espacial" "Desativar" "Corrigido" - "Head tracking" + "Posição da cabeça" "Toque para alterar o modo de campainha" "desativar som" "reativar som" @@ -1405,6 +1405,8 @@ "Ícone de expandir" "ou" "Indicador para arrastar" + + "Navegue com o teclado" "Aprenda atalhos de teclado" "Navegue com o touchpad" @@ -1462,4 +1464,6 @@ "Disponibilizado por apps" "Ecrã" "Desconhecido" + "Reponha os mosaicos" + "Repor os mosaicos para a ordem e os tamanhos originais?" diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml index da192e334e31..938602757904 100644 --- a/packages/SystemUI/res/values-pt/strings.xml +++ b/packages/SystemUI/res/values-pt/strings.xml @@ -1405,6 +1405,8 @@ "Ícone \"Abrir\"" "ou" "Alça de arrastar" + + "Navegue usando o teclado" "Aprenda atalhos do teclado" "Navegue usando o touchpad" @@ -1462,4 +1464,8 @@ "Fornecidos por apps" "Exibição" "Desconhecidos" + + + + diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml index 5c97ab579183..42d24cdf66e5 100644 --- a/packages/SystemUI/res/values-ro/strings.xml +++ b/packages/SystemUI/res/values-ro/strings.xml @@ -1405,6 +1405,8 @@ "Pictograma de extindere" "sau" "Ghidaj de tragere" + + "Navighează folosind tastatura" "Învață comenzile rapide de la tastatură" "Navighează folosind touchpadul" @@ -1462,4 +1464,8 @@ "Oferite de aplicații" "Ecran" "Necunoscută" + + + + diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml index 5ae021def63e..cbb89c0efeee 100644 --- a/packages/SystemUI/res/values-ru/strings.xml +++ b/packages/SystemUI/res/values-ru/strings.xml @@ -1405,6 +1405,8 @@ "Значок \"Развернуть\"" "или" "Маркер перемещения" + + "Навигация с помощью клавиатуры" "Узнайте о сочетаниях клавиш." "Навигация с помощью сенсорной панели" @@ -1462,4 +1464,8 @@ "Приложения" "Экран" "Неизвестно" + + + + diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml index 03c2ba4379ce..1ff4316ac2f8 100644 --- a/packages/SystemUI/res/values-si/strings.xml +++ b/packages/SystemUI/res/values-si/strings.xml @@ -1405,6 +1405,8 @@ "දිගහැරීම් නිරූපකය" "හෝ" "ඇදීම් හැඬලය" + + "ඔබේ යතුරු පුවරුව භාවිතයෙන් සංචාලනය කරන්න" "යතුරුපුවරු කෙටිමං ඉගෙන ගන්න" "ඔබේ ස්පර්ශ පෑඩ් භාවිතයෙන් සංචාලනය කරන්න" @@ -1462,4 +1464,8 @@ "යෙදුම් මගින් සපයනු ලැබේ" "සංදර්ශකය" "නොදනී" + + + + diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml index ac80ae27c2d7..5f5ead1ded24 100644 --- a/packages/SystemUI/res/values-sk/strings.xml +++ b/packages/SystemUI/res/values-sk/strings.xml @@ -1405,6 +1405,8 @@ "Ikona rozbalenia" "alebo" "Presúvadlo" + + "Prechádzajte pomocou klávesnice" "Naučte sa klávesové skratky" "Prechádzajte pomocou touchpadu" @@ -1462,4 +1464,8 @@ "Poskytnuté aplikáciami" "Zobrazovanie" "Neznáme" + + + + diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml index f953a94dd5a5..3c027d964651 100644 --- a/packages/SystemUI/res/values-sl/strings.xml +++ b/packages/SystemUI/res/values-sl/strings.xml @@ -1405,6 +1405,8 @@ "Ikona za razširitev" "ali" "Ročica za vlečenje" + + "Krmarjenje s tipkovnico" "Učenje bližnjičnih tipk" "Krmarjenje s sledilno ploščico" @@ -1462,4 +1464,8 @@ "Zagotavljajo aplikacije" "Zaslon" "Neznano" + + + + diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml index 0166acce341b..e6f84f44129e 100644 --- a/packages/SystemUI/res/values-sq/strings.xml +++ b/packages/SystemUI/res/values-sq/strings.xml @@ -1405,6 +1405,8 @@ "Ikona e zgjerimit" "ose" "Doreza e zvarritjes" + + "Navigo duke përdorur tastierën tënde" "Mëso shkurtoret e tastierës" "Navigo duke përdorur bllokun me prekje" @@ -1462,4 +1464,8 @@ "Mundësuar nga aplikacionet" "Ekrani" "Nuk njihet" + + + + diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml index d7075adc9a66..e82e2a2850df 100644 --- a/packages/SystemUI/res/values-sr/strings.xml +++ b/packages/SystemUI/res/values-sr/strings.xml @@ -555,7 +555,7 @@ "Пребаци цео екран" "Када пребацујете цео екран, види се све што је на њему. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај." "Када пребацујете апликацију, види се сав садржај који се приказује или пушта у њој. Зато пазите на лозинке, информације о плаћању, поруке, слике, аудио и видео садржај." - "Пребацивање екрана" + "Пребации екран" "Одаберите апликацију коју желите да пребаците" "Желите да почнете да делите?" "Када делите, снимате или пребацујете, Android има приступ комплетном садржају који је видљив на екрану или се пушта на уређају. Зато пазите на лозинке, информације о плаћању, поруке, слике, и аудио и видео садржај." @@ -1405,6 +1405,8 @@ "Икона за проширивање" "или" "Маркер за превлачење" + + "Крећите се помоћу тастатуре" "Сазнајте више о тастерским пречицама" "Крећите се помоћу тачпеда" @@ -1462,4 +1464,8 @@ "Обезбеђују апликације" "Екран" "Непознато" + + + + diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml index e03fc27b8cbf..06e46070b3d7 100644 --- a/packages/SystemUI/res/values-sv/strings.xml +++ b/packages/SystemUI/res/values-sv/strings.xml @@ -1405,6 +1405,8 @@ "Ikonen Utöka" "eller" "Handtag" + + "Navigera med tangentbordet" "Lär dig kortkommandon" "Navigera med styrplattan" @@ -1462,4 +1464,8 @@ "Tillhandahålls av appar" "Skärm" "Okänt" + + + + diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml index 0ab6f7d5000a..b8a9dc9abe82 100644 --- a/packages/SystemUI/res/values-sw/strings.xml +++ b/packages/SystemUI/res/values-sw/strings.xml @@ -1405,6 +1405,8 @@ "Panua aikoni" "au" "Aikoni ya buruta" + + "Kusogeza kwa kutumia kibodi yako" "Jifunze kuhusu mikato ya kibodi" "Kusogeza kwa kutumia padi yako ya kugusa" @@ -1462,4 +1464,8 @@ "Vinavyotolewa na programu" "Maonyesho" "Visivyojulikana" + + + + diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml index f930d84dbfc8..b53c8ec286cf 100644 --- a/packages/SystemUI/res/values-ta/strings.xml +++ b/packages/SystemUI/res/values-ta/strings.xml @@ -1405,6 +1405,8 @@ "விரிவாக்குவதற்கான ஐகான்" "அல்லது" "இழுப்பதற்கான ஹேண்டில்" + + "கீபோர்டைப் பயன்படுத்திச் செல்லுதல்" "கீபோர்டு ஷார்ட்கட்கள் குறித்துத் தெரிந்துகொள்ளுங்கள்" "டச்பேடைப் பயன்படுத்திச் செல்லுதல்" @@ -1462,4 +1464,8 @@ "ஆப்ஸ் வழங்குபவை" "டிஸ்ப்ளே" "தெரியவில்லை" + + + + diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml index 85973dfc1d85..d185851f5442 100644 --- a/packages/SystemUI/res/values-te/strings.xml +++ b/packages/SystemUI/res/values-te/strings.xml @@ -1405,6 +1405,8 @@ "విస్తరించండి చిహ్నం" "లేదా" "లాగే హ్యాండిల్" + + "మీ కీబోర్డ్ ఉపయోగించి నావిగేట్ చేయండి" "కీబోర్డ్ షార్ట్‌కట్‌ల గురించి తెలుసుకోండి" "మీ టచ్‌ప్యాడ్‌ని ఉపయోగించి నావిగేట్ చేయండి" @@ -1462,4 +1464,8 @@ "యాప్‌ల ద్వారా అందించబడినవి" "డిస్‌ప్లే" "తెలియదు" + + + + diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml index 67006b6e6273..a2a68c1311f0 100644 --- a/packages/SystemUI/res/values-th/strings.xml +++ b/packages/SystemUI/res/values-th/strings.xml @@ -1405,6 +1405,8 @@ "ไอคอนขยาย" "หรือ" "แฮนเดิลการลาก" + + "ไปยังส่วนต่างๆ โดยใช้แป้นพิมพ์" "ดูข้อมูลเกี่ยวกับแป้นพิมพ์ลัด" "ไปยังส่วนต่างๆ โดยใช้ทัชแพด" @@ -1462,4 +1464,8 @@ "ให้บริการโดยแอป" "จอแสดงผล" "ไม่ทราบ" + + + + diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml index e41c53f2fa5c..43490435999e 100644 --- a/packages/SystemUI/res/values-tl/strings.xml +++ b/packages/SystemUI/res/values-tl/strings.xml @@ -1405,6 +1405,8 @@ "I-expand ang icon" "o" "Handle sa pag-drag" + + "Mag-navigate gamit ang iyong keyboard" "Matuto ng mga keyboard shortcut" "Mag-navigate gamit ang iyong touchpad" @@ -1462,4 +1464,8 @@ "Ibinibigay ng mga app" "Display" "Hindi Alam" + + + + diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml index 1dab64adc32a..cf892e091882 100644 --- a/packages/SystemUI/res/values-tr/strings.xml +++ b/packages/SystemUI/res/values-tr/strings.xml @@ -1405,6 +1405,8 @@ "Genişlet simgesi" "veya" "Sürükleme tutamacı" + + "Klavyenizi kullanarak gezinin" "Klavye kısayollarını öğrenin" "Dokunmatik alanınızı kullanarak gezinin" @@ -1462,4 +1464,8 @@ "Uygulamalar tarafından sağlanır" "Ekran" "Bilinmiyor" + + + + diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml index fcdccdb7e77d..307fc27d91e4 100644 --- a/packages/SystemUI/res/values-uk/strings.xml +++ b/packages/SystemUI/res/values-uk/strings.xml @@ -313,7 +313,7 @@ "Надсилання аудіо" "відкрити налаштування надсилання аудіо" "Музика й відео із цього пристрою відтворюватимуться на обох парах навушників" - "Поділитися аудіо" + "Надіслати аудіо" "Пристрої \"%1$s\" і \"%2$s\"" "Перемкнути на \"%1$s\"" "%s заряду акумулятора" @@ -1405,6 +1405,8 @@ "Значок розгортання" "або" "Маркер переміщення" + + "Навігація за допомогою клавіатури" "Комбінації клавіш: докладніше" "Навігація за допомогою сенсорної панелі" @@ -1462,4 +1464,8 @@ "Надано додатками" "Екран" "Невідомо" + + + + diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml index a091d305b924..455848618bb2 100644 --- a/packages/SystemUI/res/values-ur/strings.xml +++ b/packages/SystemUI/res/values-ur/strings.xml @@ -1405,6 +1405,8 @@ "آئیکن پھیلائیں" "یا" "گھسیٹنے کا ہینڈل" + + "اپنے کی بورڈ کا استعمال کر کے نیویگیٹ کریں" "کی بورڈ شارٹ کٹس جانیں" "اپنے ٹچ پیڈ کا استعمال کر کے نیویگیٹ کریں" @@ -1462,4 +1464,8 @@ "ایپس کے ذریعہ فراہم کردہ" "ڈسپلے" "نامعلوم" + + + + diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml index 51dcb29d3128..00c97b1e63ea 100644 --- a/packages/SystemUI/res/values-uz/strings.xml +++ b/packages/SystemUI/res/values-uz/strings.xml @@ -1405,6 +1405,8 @@ "Yoyish belgisi" "yoki" "Surish dastagi" + + "Klaviatura yordamida kezing" "Tezkor tugmalar haqida" "Sensorli panel yordamida kezing" @@ -1462,4 +1464,6 @@ "Ilovalarga tegishli" "Ekran" "Noaniq" + "Katakchalarni asliga qaytarish" + "Katakchalar asl tartibi va oʻlchamiga qaytarilsinmi?" diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml index 98fc4679178a..6145f7cda6da 100644 --- a/packages/SystemUI/res/values-vi/strings.xml +++ b/packages/SystemUI/res/values-vi/strings.xml @@ -1405,6 +1405,8 @@ "Biểu tượng Mở rộng" "hoặc" "Nút kéo" + + "Di chuyển bằng bàn phím" "Tìm hiểu về phím tắt" "Di chuyển bằng bàn di chuột" @@ -1462,4 +1464,8 @@ "Do các ứng dụng cung cấp" "Hiển thị" "Không xác định" + + + + diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml index cf80402a89d8..53ba1799b2be 100644 --- a/packages/SystemUI/res/values-zh-rCN/strings.xml +++ b/packages/SystemUI/res/values-zh-rCN/strings.xml @@ -441,7 +441,7 @@ "模式" "完成" "设置" - "已开启" + "开启" "已开启 • %1$s" "已关闭" "未设置" @@ -556,7 +556,7 @@ "投放整个屏幕时,屏幕上的所有内容均公开可见。因此,请务必小心操作,谨防泄露密码、付款信息、消息、照片、音频、视频等。" "投放单个应用时,该应用显示或播放的所有内容均公开可见。因此,请务必小心操作,谨防泄露密码、付款信息、消息、照片、音频、视频等。" "投放屏幕" - "选择要投放的应用" + "选择要投屏的应用" "开始分享?" "在分享内容时,Android 可以访问屏幕上显示或设备中播放的所有内容。因此,请务必小心操作,谨防密码、付款信息、消息、照片、音频和视频等内容遭到泄露。" "在分享、录制或投放内容时,Android 可以访问通过此应用显示或播放的所有内容。因此,请务必小心操作,谨防密码、付款信息、消息、照片、音频和视频等内容遭到泄露。" @@ -1405,6 +1405,8 @@ "展开图标" "或" "拖动手柄" + + "使用键盘导航" "了解键盘快捷键" "使用触控板导航" @@ -1462,4 +1464,8 @@ "由应用提供" "显示" "未知" + + + + diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml index 39cf982dd36e..f496c413ea43 100644 --- a/packages/SystemUI/res/values-zh-rHK/strings.xml +++ b/packages/SystemUI/res/values-zh-rHK/strings.xml @@ -1405,6 +1405,8 @@ "展開圖示" "或" "拖曳控點" + + "使用鍵盤導覽" "瞭解鍵盤快速鍵" "使用觸控板導覽" @@ -1462,4 +1464,8 @@ "由應用程式提供" "螢幕" "不明" + + + + diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml index cbde8c3d3e8d..5157809a1b43 100644 --- a/packages/SystemUI/res/values-zh-rTW/strings.xml +++ b/packages/SystemUI/res/values-zh-rTW/strings.xml @@ -1405,6 +1405,8 @@ "展開圖示" "或" "拖曳控點" + + "使用鍵盤操作" "學習鍵盤快速鍵" "使用觸控板操作" @@ -1462,4 +1464,8 @@ "由應用程式提供" "螢幕" "不明" + + + + diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml index 2e668c5f732a..cd577e595722 100644 --- a/packages/SystemUI/res/values-zu/strings.xml +++ b/packages/SystemUI/res/values-zu/strings.xml @@ -1405,6 +1405,8 @@ "Nweba isithonjana" "noma" "Hudula isibambi" + + "Funa usebenzisa ikhibhodi yakho" "Funda izinqamuleli zamakhibhodi" "Funa usebenzisa iphedi yokuthinta" @@ -1462,4 +1464,8 @@ "Kuhlinzekwe ama-app" "Bonisa" "Akwaziwa" + + + + -- GitLab From 66d34345816aeca5e6f7996eab521f37c963f0a3 Mon Sep 17 00:00:00 2001 From: David Anderson Date: Wed, 9 Oct 2024 21:23:08 -0700 Subject: [PATCH 251/459] Introduce an ITradeInMode service. This is used by the DeviceDiagnostics app to enter trade-in mode during setup wizard. Bug: 307713521 Test: manual test Flag: com.android.tradeinmode.flags.enable_trade_in_mode Change-Id: Ib1b4b2979a17aa63ab5e45701ed038e348348f9a --- AconfigFlags.bp | 1 + core/java/android/os/ITradeInMode.aidl | 62 ++++ core/res/Android.bp | 1 + core/res/AndroidManifest.xml | 8 + data/etc/privapp-permissions-platform.xml | 1 + .../android/server/TradeInModeService.java | 342 ++++++++++++++++++ .../java/com/android/server/SystemServer.java | 4 + 7 files changed, 419 insertions(+) create mode 100644 core/java/android/os/ITradeInMode.aidl create mode 100644 services/core/java/com/android/server/TradeInModeService.java diff --git a/AconfigFlags.bp b/AconfigFlags.bp index deb6f1393b0a..55e62398ff62 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -21,6 +21,7 @@ aconfig_declarations_group { java_aconfig_libraries: [ // !!! KEEP THIS LIST ALPHABETICAL !!! "aconfig_mediacodec_flags_java_lib", + "aconfig_trade_in_mode_flags_java_lib", "android-sdk-flags-java", "android.adaptiveauth.flags-aconfig-java", "android.app.appfunctions.flags-aconfig-java", diff --git a/core/java/android/os/ITradeInMode.aidl b/core/java/android/os/ITradeInMode.aidl new file mode 100644 index 000000000000..f15954d14d0e --- /dev/null +++ b/core/java/android/os/ITradeInMode.aidl @@ -0,0 +1,62 @@ +/* + * 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.os; + +/** @hide */ +interface ITradeInMode { + /** + * Enable adb in limited-privilege trade-in mode. Returns true if trade-in + * mode was enabled. + * + * Trade-in mode can be enabled if the following conditions are all true: + * ro.debuggable is 0. + * Settings.Global.ADB_ENABLED is 0. + * Settings.Global.USER_SETUP_COMPLETE is 0. + * Settings.Secure.DEVICE_PROVISIONED is 0. + * + * It is stopped automatically when any of the following conditions become + * true: + * + * Settings.Global.USER_SETUP_COMPLETE is 1. + * Settings.Secure.DEVICE_PROVISIONED is 1. + * A change in network configuration occurs. + * An account is added. + * + * ENTER_TRADE_IN_MODE permission is required. + */ + boolean start(); + + /** + * Returns whether evaluation mode is allowed on this device. It will return + * false if any kind of device protection (such as FRP) is detected. + * + * ENTER_TRADE_IN_MODE permission is required. + */ + boolean isEvaluationModeAllowed(); + + /** + * Enable full adb access and provision the device. This forces a factory + * reset on the next boot. + * + * This will return false if start() was not called, if factory reset + * protection is active, or if trade-in mode was disabled due to any of the + * conditions listed above for start(). + * + * ENTER_TRADE_IN_MODE permission is required. + */ + boolean enterEvaluationMode(); +} diff --git a/core/res/Android.bp b/core/res/Android.bp index aa324fcaca58..bfa1fb234bc5 100644 --- a/core/res/Android.bp +++ b/core/res/Android.bp @@ -169,6 +169,7 @@ android_app { "android.media.tv.flags-aconfig", "android.security.flags-aconfig", "com.android.hardware.input.input-aconfig", + "aconfig_trade_in_mode_flags", ], } diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6ab64768d9f0..00d66e4a3a9a 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -8464,6 +8464,14 @@ + + + true + + false + 1000 diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java index 89d3dd63a08e..9e9de10d4b1c 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipResizeGestureHandler.java @@ -15,7 +15,12 @@ */ package com.android.wm.shell.pip.phone; +import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_BOTTOM; +import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_LEFT; import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_NONE; +import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_RIGHT; +import static com.android.internal.policy.TaskResizingAlgorithm.CTRL_TOP; +import static com.android.wm.shell.pip.phone.PipMenuView.ANIM_TYPE_NONE; import android.annotation.Nullable; import android.content.Context; @@ -23,6 +28,7 @@ import android.content.res.Resources; import android.graphics.Point; import android.graphics.PointF; import android.graphics.Rect; +import android.graphics.Region; import android.hardware.input.InputManager; import android.os.Looper; import android.view.BatchedInputEventReceiver; @@ -36,6 +42,7 @@ import android.view.ViewConfiguration; import androidx.annotation.VisibleForTesting; +import com.android.internal.policy.TaskResizingAlgorithm; import com.android.wm.shell.R; import com.android.wm.shell.common.ShellExecutor; import com.android.wm.shell.common.pip.PipBoundsAlgorithm; @@ -48,6 +55,7 @@ import com.android.wm.shell.pip.PipTaskOrganizer; import java.io.PrintWriter; import java.util.function.Consumer; +import java.util.function.Function; /** * Helper on top of PipTouchHandler that handles inputs OUTSIDE of the PIP window, which is used to @@ -71,6 +79,7 @@ public class PipResizeGestureHandler { private final PipPinchResizingAlgorithm mPinchResizingAlgorithm; private final int mDisplayId; private final ShellExecutor mMainExecutor; + private final Region mTmpRegion = new Region(); private final PointF mDownPoint = new PointF(); private final PointF mDownSecondPoint = new PointF(); @@ -81,15 +90,24 @@ public class PipResizeGestureHandler { private final Rect mLastResizeBounds = new Rect(); private final Rect mUserResizeBounds = new Rect(); private final Rect mDownBounds = new Rect(); + private final Rect mDragCornerSize = new Rect(); + private final Rect mTmpTopLeftCorner = new Rect(); + private final Rect mTmpTopRightCorner = new Rect(); + private final Rect mTmpBottomLeftCorner = new Rect(); + private final Rect mTmpBottomRightCorner = new Rect(); + private final Rect mDisplayBounds = new Rect(); + private final Function mMovementBoundsSupplier; private final Runnable mUpdateMovementBoundsRunnable; private final Consumer mUpdateResizeBoundsCallback; + private int mDelta; private float mTouchSlop; private boolean mAllowGesture; private boolean mIsAttached; private boolean mIsEnabled; private boolean mEnablePinchResize; + private boolean mEnableDragCornerResize; private boolean mIsSysUiStateValid; private boolean mThresholdCrossed; private boolean mOngoingPinchToResize = false; @@ -113,7 +131,7 @@ public class PipResizeGestureHandler { PipBoundsState pipBoundsState, PipMotionHelper motionHelper, PipTouchState pipTouchState, PipTaskOrganizer pipTaskOrganizer, PipDismissTargetHandler pipDismissTargetHandler, - Runnable updateMovementBoundsRunnable, + Function movementBoundsSupplier, Runnable updateMovementBoundsRunnable, PipUiEventLogger pipUiEventLogger, PhonePipMenuController menuActivityController, ShellExecutor mainExecutor, @Nullable PipPerfHintController pipPerfHintController) { mContext = context; @@ -126,6 +144,7 @@ public class PipResizeGestureHandler { mPipTouchState = pipTouchState; mPipTaskOrganizer = pipTaskOrganizer; mPipDismissTargetHandler = pipDismissTargetHandler; + mMovementBoundsSupplier = movementBoundsSupplier; mUpdateMovementBoundsRunnable = updateMovementBoundsRunnable; mPhonePipMenuController = menuActivityController; mPipUiEventLogger = pipUiEventLogger; @@ -161,9 +180,20 @@ public class PipResizeGestureHandler { } private void reloadResources() { + final Resources res = mContext.getResources(); + mDelta = res.getDimensionPixelSize(R.dimen.pip_resize_edge_size); + mEnableDragCornerResize = res.getBoolean(R.bool.config_pipEnableDragCornerResize); mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop(); } + private void resetDragCorners() { + mDragCornerSize.set(0, 0, mDelta, mDelta); + mTmpTopLeftCorner.set(mDragCornerSize); + mTmpTopRightCorner.set(mDragCornerSize); + mTmpBottomLeftCorner.set(mDragCornerSize); + mTmpBottomRightCorner.set(mDragCornerSize); + } + private void disposeInputChannel() { if (mInputEventReceiver != null) { mInputEventReceiver.dispose(); @@ -211,7 +241,7 @@ public class PipResizeGestureHandler { @VisibleForTesting void onInputEvent(InputEvent ev) { - if (!mEnablePinchResize) { + if (!mEnableDragCornerResize && !mEnablePinchResize) { // No need to handle anything if neither form of resizing is enabled. return; } @@ -239,6 +269,8 @@ public class PipResizeGestureHandler { if (mEnablePinchResize && mOngoingPinchToResize) { onPinchResize(mv); + } else if (mEnableDragCornerResize) { + onDragCornerResize(mv); } } } @@ -250,6 +282,48 @@ public class PipResizeGestureHandler { return mCtrlType != CTRL_NONE || mOngoingPinchToResize; } + /** + * Check whether the current x,y coordinate is within the region in which drag-resize should + * start. + * This consists of 4 small squares on the 4 corners of the PIP window, a quarter of which + * overlaps with the PIP window while the rest goes outside of the PIP window. + * _ _ _ _ + * |_|_|_________|_|_| + * |_|_| |_|_| + * | PIP | + * | WINDOW | + * _|_ _|_ + * |_|_|_________|_|_| + * |_|_| |_|_| + */ + public boolean isWithinDragResizeRegion(int x, int y) { + if (!mEnableDragCornerResize) { + return false; + } + + final Rect currentPipBounds = mPipBoundsState.getBounds(); + if (currentPipBounds == null) { + return false; + } + resetDragCorners(); + mTmpTopLeftCorner.offset(currentPipBounds.left - mDelta / 2, + currentPipBounds.top - mDelta / 2); + mTmpTopRightCorner.offset(currentPipBounds.right - mDelta / 2, + currentPipBounds.top - mDelta / 2); + mTmpBottomLeftCorner.offset(currentPipBounds.left - mDelta / 2, + currentPipBounds.bottom - mDelta / 2); + mTmpBottomRightCorner.offset(currentPipBounds.right - mDelta / 2, + currentPipBounds.bottom - mDelta / 2); + + mTmpRegion.setEmpty(); + mTmpRegion.op(mTmpTopLeftCorner, Region.Op.UNION); + mTmpRegion.op(mTmpTopRightCorner, Region.Op.UNION); + mTmpRegion.op(mTmpBottomLeftCorner, Region.Op.UNION); + mTmpRegion.op(mTmpBottomRightCorner, Region.Op.UNION); + + return mTmpRegion.contains(x, y); + } + public boolean isUsingPinchToZoom() { return mEnablePinchResize; } @@ -260,17 +334,62 @@ public class PipResizeGestureHandler { public boolean willStartResizeGesture(MotionEvent ev) { if (isInValidSysUiState()) { - if (ev.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN) { - if (mEnablePinchResize && ev.getPointerCount() == 2) { - onPinchResize(ev); - mOngoingPinchToResize = mAllowGesture; - return mAllowGesture; - } + switch (ev.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + if (isWithinDragResizeRegion((int) ev.getRawX(), (int) ev.getRawY())) { + return true; + } + break; + + case MotionEvent.ACTION_POINTER_DOWN: + if (mEnablePinchResize && ev.getPointerCount() == 2) { + onPinchResize(ev); + mOngoingPinchToResize = mAllowGesture; + return mAllowGesture; + } + break; + + default: + break; } } return false; } + private void setCtrlType(int x, int y) { + final Rect currentPipBounds = mPipBoundsState.getBounds(); + + Rect movementBounds = mMovementBoundsSupplier.apply(currentPipBounds); + + mDisplayBounds.set(movementBounds.left, + movementBounds.top, + movementBounds.right + currentPipBounds.width(), + movementBounds.bottom + currentPipBounds.height()); + + if (mTmpTopLeftCorner.contains(x, y) && currentPipBounds.top != mDisplayBounds.top + && currentPipBounds.left != mDisplayBounds.left) { + mCtrlType |= CTRL_LEFT; + mCtrlType |= CTRL_TOP; + } + if (mTmpTopRightCorner.contains(x, y) && currentPipBounds.top != mDisplayBounds.top + && currentPipBounds.right != mDisplayBounds.right) { + mCtrlType |= CTRL_RIGHT; + mCtrlType |= CTRL_TOP; + } + if (mTmpBottomRightCorner.contains(x, y) + && currentPipBounds.bottom != mDisplayBounds.bottom + && currentPipBounds.right != mDisplayBounds.right) { + mCtrlType |= CTRL_RIGHT; + mCtrlType |= CTRL_BOTTOM; + } + if (mTmpBottomLeftCorner.contains(x, y) + && currentPipBounds.bottom != mDisplayBounds.bottom + && currentPipBounds.left != mDisplayBounds.left) { + mCtrlType |= CTRL_LEFT; + mCtrlType |= CTRL_BOTTOM; + } + } + private boolean isInValidSysUiState() { return mIsSysUiStateValid; } @@ -364,6 +483,59 @@ public class PipResizeGestureHandler { } } + private void onDragCornerResize(MotionEvent ev) { + int action = ev.getActionMasked(); + float x = ev.getX(); + float y = ev.getY() - mOhmOffset; + if (action == MotionEvent.ACTION_DOWN) { + mLastResizeBounds.setEmpty(); + mAllowGesture = isInValidSysUiState() && isWithinDragResizeRegion((int) x, (int) y); + if (mAllowGesture) { + setCtrlType((int) x, (int) y); + mDownPoint.set(x, y); + mDownBounds.set(mPipBoundsState.getBounds()); + } + } else if (mAllowGesture) { + switch (action) { + case MotionEvent.ACTION_POINTER_DOWN: + // We do not support multi touch for resizing via drag + mAllowGesture = false; + break; + case MotionEvent.ACTION_MOVE: + // Capture inputs + if (!mThresholdCrossed + && Math.hypot(x - mDownPoint.x, y - mDownPoint.y) > mTouchSlop) { + mThresholdCrossed = true; + // Reset the down to begin resizing from this point + mDownPoint.set(x, y); + mInputMonitor.pilferPointers(); + } + if (mThresholdCrossed) { + if (mPhonePipMenuController.isMenuVisible()) { + mPhonePipMenuController.hideMenu(ANIM_TYPE_NONE, + false /* resize */); + } + final Rect currentPipBounds = mPipBoundsState.getBounds(); + mLastResizeBounds.set(TaskResizingAlgorithm.resizeDrag(x, y, + mDownPoint.x, mDownPoint.y, currentPipBounds, mCtrlType, mMinSize.x, + mMinSize.y, mMaxSize, true, + mDownBounds.width() > mDownBounds.height())); + mPipBoundsAlgorithm.transformBoundsToAspectRatio(mLastResizeBounds, + mPipBoundsState.getAspectRatio(), false /* useCurrentMinEdgeSize */, + true /* useCurrentSize */); + mPipTaskOrganizer.scheduleUserResizePip(mDownBounds, mLastResizeBounds, + null); + mPipBoundsState.setHasUserResizedPip(true); + } + break; + case MotionEvent.ACTION_UP: + case MotionEvent.ACTION_CANCEL: + finishResize(); + break; + } + } + } + private void snapToMovementBoundsEdge(Rect bounds, Rect movementBounds) { final int leftEdge = bounds.left; diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java index 9c4e723efc23..f4c2a33079ba 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipTouchHandler.java @@ -213,7 +213,7 @@ public class PipTouchHandler { mPipResizeGestureHandler = new PipResizeGestureHandler(context, pipBoundsAlgorithm, pipBoundsState, mMotionHelper, mTouchState, pipTaskOrganizer, mPipDismissTargetHandler, - this::updateMovementBounds, pipUiEventLogger, + this::getMovementBounds, this::updateMovementBounds, pipUiEventLogger, menuController, mainExecutor, mPipPerfHintController); mConnection = new PipAccessibilityInteractionConnection(mContext, pipBoundsState, mMotionHelper, pipTaskOrganizer, mPipBoundsAlgorithm.getSnapAlgorithm(), diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java index 66f8c0b9558d..880ca2ce0cf9 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/pip/phone/PipResizeGestureHandlerTest.java @@ -124,7 +124,7 @@ public class PipResizeGestureHandlerTest extends ShellTestCase { mPipResizeGestureHandler = new PipResizeGestureHandler(mContext, pipBoundsAlgorithm, mPipBoundsState, motionHelper, mPipTouchState, mPipTaskOrganizer, mPipDismissTargetHandler, - () -> {}, mPipUiEventLogger, mPhonePipMenuController, + (Rect bounds) -> new Rect(), () -> {}, mPipUiEventLogger, mPhonePipMenuController, mMainExecutor, null /* pipPerfHintController */) { @Override public void pilferPointers() { -- GitLab From 5aeb9fd4d89e9ee3911fc61b29a6b04d693734ed Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Tue, 22 Oct 2024 16:30:57 -0700 Subject: [PATCH 257/459] Remove dependencies on the 1-variant fallback When adding a dependencies, if the variants don't match, but the dependency only has 1 variant anyways, soong will always use that variant. This makes it hard to add new variants to soong, because the 1-variant fallback stops being used and you start getting missing variant errors. Make changes to bp files such that all dependencies correctly specify the variant to use. Bug: 372091092 Flag: EXEMPT refactor Test: m nothing Change-Id: I305d9a549fc132c3d14f56eae1abbac1b9defd10 --- AconfigFlags.bp | 2 +- Android.bp | 2 +- .../core/apps/reources_manager/Android.bp | 2 +- api/Android.bp | 26 +++--- api/api.go | 14 +-- api/api_test.go | 2 +- boot/Android.bp | 2 +- core/api/Android.bp | 20 ++--- core/tests/FileSystemUtilsTest/Android.bp | 2 +- core/tests/overlaytests/remount/Android.bp | 2 +- libs/WindowManager/Shell/Android.bp | 8 +- libs/androidfw/Android.bp | 2 + mime/Android.bp | 2 +- packages/CtsShim/build/Android.bp | 4 +- packages/SystemUI/checks/Android.bp | 4 +- ravenwood/Android.bp | 2 +- services/core/Android.bp | 8 +- .../host/Android.bp | 2 +- .../host/Android.bp | 6 +- services/tests/apexsystemservices/Android.bp | 2 +- services/tests/wmtests/Android.bp | 2 +- tests/BinaryTransparencyHostTest/Android.bp | 2 +- .../host/Android.bp | 2 +- .../Android.bp | 2 + tests/FsVerityTest/Android.bp | 2 +- tests/OdmApps/Android.bp | 2 +- tests/RollbackTest/Android.bp | 89 ++++++++++--------- tests/SharedLibraryLoadingTest/Android.bp | 2 +- tests/StagedInstallTest/Android.bp | 2 +- tests/SystemMemoryTest/host/Android.bp | 2 +- .../lint/global/integration_tests/Android.bp | 4 +- tools/preload-check/Android.bp | 2 +- 32 files changed, 120 insertions(+), 107 deletions(-) diff --git a/AconfigFlags.bp b/AconfigFlags.bp index 319189660a55..e71ded922ae6 100644 --- a/AconfigFlags.bp +++ b/AconfigFlags.bp @@ -112,7 +112,7 @@ aconfig_declarations_group { filegroup { name: "framework-minus-apex-aconfig-srcjars", - srcs: [ + device_common_srcs: [ ":framework-minus-apex-aconfig-declarations{.srcjars}", ], } diff --git a/Android.bp b/Android.bp index b114898f3887..d2e80034423b 100644 --- a/Android.bp +++ b/Android.bp @@ -61,7 +61,7 @@ license { filegroup { name: "framework-non-updatable-sources", - srcs: [ + device_common_srcs: [ // Java/AIDL sources under frameworks/base ":framework-annotations", ":framework-blobstore-sources", diff --git a/apct-tests/perftests/core/apps/reources_manager/Android.bp b/apct-tests/perftests/core/apps/reources_manager/Android.bp index 96b9d6af5f31..a95e1175fb0c 100644 --- a/apct-tests/perftests/core/apps/reources_manager/Android.bp +++ b/apct-tests/perftests/core/apps/reources_manager/Android.bp @@ -27,7 +27,7 @@ android_test_helper_app { static_libs: ["androidx.appcompat_appcompat"], } -genrule { +java_genrule { name: "LargeResourcesUncompressed", srcs: [":LargeResourcesCompressed"], out: ["LargeResourcesUncompressed.apk"], diff --git a/api/Android.bp b/api/Android.bp index 3f2316f005bd..3c92cb26b0fe 100644 --- a/api/Android.bp +++ b/api/Android.bp @@ -124,7 +124,7 @@ combined_apis { }), } -genrule { +java_genrule { name: "frameworks-base-api-current-compat", srcs: [ ":android.api.public.latest", @@ -140,7 +140,7 @@ genrule { "$(location :frameworks-base-api-current.txt)", } -genrule { +java_genrule { name: "frameworks-base-api-system-current-compat", srcs: [ ":android.api.public.latest", @@ -160,7 +160,7 @@ genrule { "$(location :frameworks-base-api-system-current.txt)", } -genrule { +java_genrule { name: "frameworks-base-api-module-lib-current-compat", srcs: [ ":android.api.public.latest", @@ -184,7 +184,7 @@ genrule { "$(location :frameworks-base-api-module-lib-current.txt)", } -genrule { +java_genrule { name: "frameworks-base-api-current.srcjar", tools: ["merge_zips"], out: ["current.srcjar"], @@ -209,7 +209,7 @@ genrule_defaults { "$(location soong_zip) -o $(out) -C $(genDir)/out -D $(genDir)/out", } -genrule { +java_genrule { name: "sdk-annotations.zip", defaults: ["sdk-annotations-defaults"], srcs: [ @@ -218,7 +218,7 @@ genrule { ], } -genrule { +java_genrule { name: "sdk-annotations-system.zip", defaults: ["sdk-annotations-defaults"], srcs: [ @@ -227,7 +227,7 @@ genrule { ], } -genrule { +java_genrule { name: "sdk-annotations-module-lib.zip", defaults: ["sdk-annotations-defaults"], srcs: [ @@ -236,7 +236,7 @@ genrule { ], } -genrule { +java_genrule { name: "sdk-annotations-system-server.zip", defaults: ["sdk-annotations-defaults"], srcs: [ @@ -245,7 +245,7 @@ genrule { ], } -genrule { +java_genrule { name: "combined-removed-dex", visibility: [ "//frameworks/base/boot", @@ -460,7 +460,7 @@ genrule_defaults { tools: ["extract-flagged-apis"], } -genrule { +java_genrule { name: "flag-api-mapping-PublicApi", defaults: ["flag-api-mapping-generation-defaults"], srcs: [":frameworks-base-api-current.txt"], @@ -470,7 +470,7 @@ genrule { }, } -genrule { +java_genrule { name: "flag-api-mapping-SystemApi", defaults: ["flag-api-mapping-generation-defaults"], srcs: [":frameworks-base-api-system-current.txt"], @@ -480,7 +480,7 @@ genrule { }, } -genrule { +java_genrule { name: "flag-api-mapping-ModuleLibApi", defaults: ["flag-api-mapping-generation-defaults"], srcs: [":frameworks-base-api-module-lib-current.txt"], @@ -490,7 +490,7 @@ genrule { }, } -genrule { +java_genrule { name: "flag-api-mapping-SystemServerApi", defaults: ["flag-api-mapping-generation-defaults"], srcs: [":frameworks-base-api-system-server-current.txt"], diff --git a/api/api.go b/api/api.go index 1bbf3709480a..29083dfc8968 100644 --- a/api/api.go +++ b/api/api.go @@ -20,7 +20,6 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" - "android/soong/genrule" "android/soong/java" ) @@ -138,9 +137,10 @@ type libraryProps struct { } type fgProps struct { - Name *string - Srcs proptools.Configurable[[]string] - Visibility []string + Name *string + Srcs proptools.Configurable[[]string] + Device_common_srcs proptools.Configurable[[]string] + Visibility []string } type defaultsProps struct { @@ -201,7 +201,7 @@ func createMergedTxt(ctx android.LoadHookContext, txt MergedTxtDefinition, stubs } } props.Visibility = []string{"//visibility:public"} - ctx.CreateModule(genrule.GenRuleFactory, &props) + ctx.CreateModule(java.GenRuleFactory, &props) } func createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, system_server_modules proptools.Configurable[[]string]) { @@ -230,7 +230,7 @@ func createMergedAnnotationsFilegroups(ctx android.LoadHookContext, modules, sys } { props := fgProps{} props.Name = proptools.StringPtr(i.name) - props.Srcs = createSrcs(i.modules, i.tag) + props.Device_common_srcs = createSrcs(i.modules, i.tag) ctx.CreateModule(android.FileGroupFactory, &props) } } @@ -429,7 +429,7 @@ func createMergedFrameworkSystemServerExportableStubs(ctx android.LoadHookContex func createPublicStubsSourceFilegroup(ctx android.LoadHookContext, modules proptools.Configurable[[]string]) { props := fgProps{} props.Name = proptools.StringPtr("all-modules-public-stubs-source") - props.Srcs = createSrcs(modules, "{.public.stubs.source}") + props.Device_common_srcs = createSrcs(modules, "{.public.stubs.source}") props.Visibility = []string{"//frameworks/base"} ctx.CreateModule(android.FileGroupFactory, &props) } diff --git a/api/api_test.go b/api/api_test.go index fb26f821eec1..166f053978f2 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -253,7 +253,7 @@ func TestCombinedApisDefaults(t *testing.T) { `) subModuleDependsOnSelectAppendedModule := java.CheckModuleHasDependency(t, - result.TestContext, "foo-current.txt", "", "framework-foo") + result.TestContext, "foo-current.txt", "android_common", "framework-foo") android.AssertBoolEquals(t, "Submodule expected to depend on the select-appended module", true, subModuleDependsOnSelectAppendedModule) } diff --git a/boot/Android.bp b/boot/Android.bp index f60bb9e7149a..6eead42a4d30 100644 --- a/boot/Android.bp +++ b/boot/Android.bp @@ -234,7 +234,7 @@ custom_platform_bootclasspath { ], } -genrule { // This module exists to make the srcjar output available to Make. +java_genrule { // This module exists to make the srcjar output available to Make. name: "platform-bootclasspath.srcjar", srcs: [":platform-bootclasspath{.srcjar}"], out: ["platform-bootclasspath.srcjar"], diff --git a/core/api/Android.bp b/core/api/Android.bp index 77594b758d19..06eea52881ea 100644 --- a/core/api/Android.bp +++ b/core/api/Android.bp @@ -100,50 +100,50 @@ filegroup { // Exportable stub artifacts filegroup { name: "non-updatable-exportable-current.txt", - srcs: [":api-stubs-docs-non-updatable{.exportable.api.txt}"], + device_common_srcs: [":api-stubs-docs-non-updatable{.exportable.api.txt}"], } filegroup { name: "non-updatable-exportable-removed.txt", - srcs: [":api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], + device_common_srcs: [":api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], } filegroup { name: "non-updatable-exportable-system-current.txt", - srcs: [":system-api-stubs-docs-non-updatable{.exportable.api.txt}"], + device_common_srcs: [":system-api-stubs-docs-non-updatable{.exportable.api.txt}"], } filegroup { name: "non-updatable-exportable-system-removed.txt", - srcs: [":system-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], + device_common_srcs: [":system-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], } filegroup { name: "non-updatable-exportable-module-lib-current.txt", - srcs: [":module-lib-api-stubs-docs-non-updatable{.exportable.api.txt}"], + device_common_srcs: [":module-lib-api-stubs-docs-non-updatable{.exportable.api.txt}"], } filegroup { name: "non-updatable-exportable-module-lib-removed.txt", - srcs: [":module-lib-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], + device_common_srcs: [":module-lib-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], } filegroup { name: "non-updatable-exportable-test-current.txt", - srcs: [":test-api-stubs-docs-non-updatable{.exportable.api.txt}"], + device_common_srcs: [":test-api-stubs-docs-non-updatable{.exportable.api.txt}"], } filegroup { name: "non-updatable-exportable-test-removed.txt", - srcs: [":test-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], + device_common_srcs: [":test-api-stubs-docs-non-updatable{.exportable.removed-api.txt}"], } filegroup { name: "non-updatable-exportable-system-server-current.txt", - srcs: [":services-non-updatable-stubs{.exportable.api.txt}"], + device_common_srcs: [":services-non-updatable-stubs{.exportable.api.txt}"], } filegroup { name: "non-updatable-exportable-system-server-removed.txt", - srcs: [":services-non-updatable-stubs{.exportable.removed-api.txt}"], + device_common_srcs: [":services-non-updatable-stubs{.exportable.removed-api.txt}"], } diff --git a/core/tests/FileSystemUtilsTest/Android.bp b/core/tests/FileSystemUtilsTest/Android.bp index 53c22df67b85..ae04aa4b5576 100644 --- a/core/tests/FileSystemUtilsTest/Android.bp +++ b/core/tests/FileSystemUtilsTest/Android.bp @@ -69,7 +69,7 @@ java_test_host { "compatibility-host-util", "compatibility-tradefed", ], - data: [ + device_common_data: [ ":embedded_native_libs_test_app", ":extract_native_libs_test_app", ], diff --git a/core/tests/overlaytests/remount/Android.bp b/core/tests/overlaytests/remount/Android.bp index 0a6b88bcbb63..31c15148d8d8 100644 --- a/core/tests/overlaytests/remount/Android.bp +++ b/core/tests/overlaytests/remount/Android.bp @@ -32,7 +32,7 @@ java_test_host { "frameworks-base-hostutils", ], test_suites: ["general-tests"], - java_resources: [ + device_common_java_resources: [ ":com.android.overlaytest.overlaid", ":com.android.overlaytest.overlay", ":OverlayRemountedTest_SharedLibrary", diff --git a/libs/WindowManager/Shell/Android.bp b/libs/WindowManager/Shell/Android.bp index 25d3067a34bc..4b0c7009eaa0 100644 --- a/libs/WindowManager/Shell/Android.bp +++ b/libs/WindowManager/Shell/Android.bp @@ -79,7 +79,7 @@ filegroup { path: "src", } -genrule { +java_genrule { name: "wm_shell_protolog_src", srcs: [ ":protolog-impl", @@ -99,7 +99,7 @@ genrule { out: ["wm_shell_protolog.srcjar"], } -genrule { +java_genrule { name: "generate-wm_shell_protolog.json", srcs: [ ":wm_shell_protolog-groups", @@ -116,7 +116,7 @@ genrule { out: ["wm_shell_protolog.json"], } -genrule { +java_genrule { name: "gen-wmshell.protolog.pb", srcs: [ ":wm_shell_protolog-groups", @@ -133,7 +133,7 @@ genrule { out: ["wmshell.protolog.pb"], } -genrule { +java_genrule { name: "protolog.json.gz", srcs: [":generate-wm_shell_protolog.json"], out: ["wmshell.protolog.json.gz"], diff --git a/libs/androidfw/Android.bp b/libs/androidfw/Android.bp index 77800a305f02..15ef58ecf3bd 100644 --- a/libs/androidfw/Android.bp +++ b/libs/androidfw/Android.bp @@ -258,6 +258,8 @@ cc_test { "tests/data/**/*.apk", "tests/data/**/*.arsc", "tests/data/**/*.idmap", + ], + device_common_data: [ ":FrameworkResourcesSparseTestApp", ":FrameworkResourcesNotSparseTestApp", ], diff --git a/mime/Android.bp b/mime/Android.bp index 757862b998b4..20110f1dfb47 100644 --- a/mime/Android.bp +++ b/mime/Android.bp @@ -92,7 +92,7 @@ filegroup { visibility: [ "//visibility:private", ], - srcs: [ + device_common_srcs: [ ":debian.mime.types.minimized", ":android.mime.types.minimized", ":vendor.mime.types.minimized", diff --git a/packages/CtsShim/build/Android.bp b/packages/CtsShim/build/Android.bp index 5b3d47e9f74d..bd892637a5eb 100644 --- a/packages/CtsShim/build/Android.bp +++ b/packages/CtsShim/build/Android.bp @@ -55,7 +55,7 @@ android_app { ], } -genrule { +java_genrule { name: "generate_priv_manifest", srcs: [ "shim_priv/AndroidManifest.xml", @@ -169,7 +169,7 @@ android_app { min_sdk_version: "24", } -genrule { +java_genrule { name: "generate_shim_manifest", srcs: [ "shim/AndroidManifest.xml", diff --git a/packages/SystemUI/checks/Android.bp b/packages/SystemUI/checks/Android.bp index 04ac748d0c78..1ec22018c8c9 100644 --- a/packages/SystemUI/checks/Android.bp +++ b/packages/SystemUI/checks/Android.bp @@ -40,9 +40,11 @@ java_test_host { data: [ ":androidx.annotation_annotation", ":dagger2", - ":framework", ":kotlinx-coroutines-core", ], + device_common_data: [ + ":framework", + ], static_libs: [ "SystemUILintChecker", ], diff --git a/ravenwood/Android.bp b/ravenwood/Android.bp index d9182010c1cb..733e8a97d871 100644 --- a/ravenwood/Android.bp +++ b/ravenwood/Android.bp @@ -306,7 +306,7 @@ sh_test_host { name: "ravenwood-stats-checker", src: "scripts/ravenwood-stats-checker.sh", test_suites: ["general-tests"], - data: [ + device_common_data: [ ":framework-minus-apex.ravenwood-base_all{hoststubgen_framework-minus-apex_stats.csv}", ":framework-minus-apex.ravenwood-base_all{hoststubgen_framework-minus-apex_apis.csv}", ":framework-minus-apex.ravenwood-base_all{hoststubgen_framework-minus-apex_keep_all.txt}", diff --git a/services/core/Android.bp b/services/core/Android.bp index 3532b0a59f3d..349f3ee2b9f0 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -50,7 +50,7 @@ java_library_static { ], } -genrule { +java_genrule { name: "services.core.protologsrc", srcs: [ ":protolog-impl", @@ -70,7 +70,7 @@ genrule { out: ["services.core.protolog.srcjar"], } -genrule { +java_genrule { name: "generate-protolog.json", srcs: [ ":protolog-groups", @@ -87,7 +87,7 @@ genrule { out: ["services.core.protolog.json"], } -genrule { +java_genrule { name: "gen-core.protolog.pb", srcs: [ ":protolog-groups", @@ -281,7 +281,7 @@ prebuilt_etc { src: "java/com/android/server/location/gnss/gps_debug.conf", } -genrule { +java_genrule { name: "services.core.json.gz", srcs: [":generate-protolog.json"], out: ["services.core.protolog.json.gz"], diff --git a/services/tests/BackgroundInstallControlServiceTests/host/Android.bp b/services/tests/BackgroundInstallControlServiceTests/host/Android.bp index 682ed91c22dd..8e1013656fe6 100644 --- a/services/tests/BackgroundInstallControlServiceTests/host/Android.bp +++ b/services/tests/BackgroundInstallControlServiceTests/host/Android.bp @@ -28,7 +28,7 @@ java_test_host { "compatibility-tradefed", "compatibility-host-util", ], - data: [ + device_common_data: [ ":BackgroundInstallControlServiceTestApp", ":BackgroundInstallControlMockApp1", ":BackgroundInstallControlMockApp2", diff --git a/services/tests/PackageManagerServiceTests/host/Android.bp b/services/tests/PackageManagerServiceTests/host/Android.bp index b46a6fffbaa9..6ad40f4d2733 100644 --- a/services/tests/PackageManagerServiceTests/host/Android.bp +++ b/services/tests/PackageManagerServiceTests/host/Android.bp @@ -44,7 +44,7 @@ java_test_host { "block_device_writer_jar", ], test_suites: ["device-tests"], - data: [ + device_common_data: [ ":PackageManagerTestApex", ":PackageManagerTestApexApp", ":PackageManagerServiceServerTests", @@ -53,7 +53,7 @@ java_test_host { "block_device_writer", "fsverity_multilib", ], - java_resources: [ + device_common_java_resources: [ ":PackageManagerTestOverlayActor", ":PackageManagerTestOverlay", ":PackageManagerTestOverlayTarget", @@ -73,7 +73,7 @@ java_test_host { ], } -genrule { +java_genrule { name: "PackageManagerTestAppVersion3Invalid", tools: [ "soong_zip", diff --git a/services/tests/apexsystemservices/Android.bp b/services/tests/apexsystemservices/Android.bp index 9dacfeabf1ef..d0a2eb873fcb 100644 --- a/services/tests/apexsystemservices/Android.bp +++ b/services/tests/apexsystemservices/Android.bp @@ -27,7 +27,7 @@ java_test_host { name: "ApexSystemServicesTestCases", srcs: ["src/**/*.java"], libs: ["tradefed"], - java_resources: [ + device_common_java_resources: [ ":test_com.android.server", ], static_libs: [ diff --git a/services/tests/wmtests/Android.bp b/services/tests/wmtests/Android.bp index 76ff23188632..d99a6e922ce7 100644 --- a/services/tests/wmtests/Android.bp +++ b/services/tests/wmtests/Android.bp @@ -19,7 +19,7 @@ filegroup { ], } -genrule { +java_genrule { name: "wmtests.protologsrc", srcs: [ ":protolog-impl", diff --git a/tests/BinaryTransparencyHostTest/Android.bp b/tests/BinaryTransparencyHostTest/Android.bp index 38cb9869f165..e14e5fea001f 100644 --- a/tests/BinaryTransparencyHostTest/Android.bp +++ b/tests/BinaryTransparencyHostTest/Android.bp @@ -32,7 +32,7 @@ java_test_host { static_libs: [ "truth", ], - data: [ + device_common_data: [ ":BinaryTransparencyTestApp", ":EasterEgg", ":FeatureSplitBase", diff --git a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp index 37cb8500fbab..a0e047759dab 100644 --- a/tests/CompanionDeviceMultiDeviceTests/host/Android.bp +++ b/tests/CompanionDeviceMultiDeviceTests/host/Android.bp @@ -36,7 +36,7 @@ python_test_host { unit_test: false, tags: ["mobly"], }, - data: [ + device_common_data: [ ":cdm_snippet_legacy", ], version: { diff --git a/tests/DynamicCodeLoggerIntegrationTests/Android.bp b/tests/DynamicCodeLoggerIntegrationTests/Android.bp index 3f2c80831565..45bbcb434da5 100644 --- a/tests/DynamicCodeLoggerIntegrationTests/Android.bp +++ b/tests/DynamicCodeLoggerIntegrationTests/Android.bp @@ -55,6 +55,8 @@ android_test { java_resources: [ ":DynamicCodeLoggerTestLibrary", + ], + device_first_java_resources: [ ":DynamicCodeLoggerNativeExecutable", ], } diff --git a/tests/FsVerityTest/Android.bp b/tests/FsVerityTest/Android.bp index 02268c37a5a3..c2dfa0fffb3b 100644 --- a/tests/FsVerityTest/Android.bp +++ b/tests/FsVerityTest/Android.bp @@ -43,7 +43,7 @@ java_test_host { data_device_bins_both: [ "block_device_writer", ], - data: [ + device_common_data: [ ":FsVerityTestApp", ], } diff --git a/tests/OdmApps/Android.bp b/tests/OdmApps/Android.bp index a5c6d6513f50..9f32d4628769 100644 --- a/tests/OdmApps/Android.bp +++ b/tests/OdmApps/Android.bp @@ -26,7 +26,7 @@ java_test_host { srcs: ["src/**/*.java"], libs: ["tradefed"], test_suites: ["device-tests"], - data: [ + device_common_data: [ ":TestOdmApp", ":TestOdmPrivApp", ], diff --git a/tests/RollbackTest/Android.bp b/tests/RollbackTest/Android.bp index 21007ef1396f..766ff4a727bd 100644 --- a/tests/RollbackTest/Android.bp +++ b/tests/RollbackTest/Android.bp @@ -26,7 +26,11 @@ android_test { manifest: "RollbackTest/AndroidManifest.xml", platform_apis: true, srcs: ["RollbackTest/src/**/*.java"], - static_libs: ["androidx.test.rules", "cts-rollback-lib", "cts-install-lib"], + static_libs: [ + "androidx.test.rules", + "cts-rollback-lib", + "cts-install-lib", + ], test_suites: ["general-tests"], test_config: "RollbackTest.xml", java_resources: [ @@ -48,7 +52,7 @@ java_test_host { ], test_suites: ["general-tests"], test_config: "StagedRollbackTest.xml", - data: [ + device_common_data: [ ":com.android.apex.apkrollback.test_v1", ":test.rebootless_apex_v1", ":RollbackTest", @@ -59,10 +63,13 @@ java_test_host { name: "NetworkStagedRollbackTest", srcs: ["NetworkStagedRollbackTest/src/**/*.java"], libs: ["tradefed"], - static_libs: ["RollbackTestLib", "frameworks-base-hostutils"], + static_libs: [ + "RollbackTestLib", + "frameworks-base-hostutils", + ], test_suites: ["general-tests"], test_config: "NetworkStagedRollbackTest.xml", - data: [":RollbackTest"], + device_common_data: [":RollbackTest"], } java_test_host { @@ -74,7 +81,7 @@ java_test_host { ], test_suites: ["general-tests"], test_config: "MultiUserRollbackTest.xml", - data : [":RollbackTest"], + device_common_data: [":RollbackTest"], } java_library_host { @@ -84,55 +91,55 @@ java_library_host { } genrule { - name: "com.android.apex.apkrollback.test.pem", - out: ["com.android.apex.apkrollback.test.pem"], - cmd: "openssl genrsa -out $(out) 4096", + name: "com.android.apex.apkrollback.test.pem", + out: ["com.android.apex.apkrollback.test.pem"], + cmd: "openssl genrsa -out $(out) 4096", } genrule { - name: "com.android.apex.apkrollback.test.pubkey", - srcs: [":com.android.apex.apkrollback.test.pem"], - out: ["com.android.apex.apkrollback.test.pubkey"], - tools: ["avbtool"], - cmd: "$(location avbtool) extract_public_key --key $(in) --output $(out)", + name: "com.android.apex.apkrollback.test.pubkey", + srcs: [":com.android.apex.apkrollback.test.pem"], + out: ["com.android.apex.apkrollback.test.pubkey"], + tools: ["avbtool"], + cmd: "$(location avbtool) extract_public_key --key $(in) --output $(out)", } apex_key { - name: "com.android.apex.apkrollback.test.key", - private_key: ":com.android.apex.apkrollback.test.pem", - public_key: ":com.android.apex.apkrollback.test.pubkey", - installable: false, + name: "com.android.apex.apkrollback.test.key", + private_key: ":com.android.apex.apkrollback.test.pem", + public_key: ":com.android.apex.apkrollback.test.pubkey", + installable: false, } apex { - name: "com.android.apex.apkrollback.test_v1", - manifest: "testdata/manifest_v1.json", - androidManifest: "testdata/AndroidManifest.xml", - file_contexts: ":apex.test-file_contexts", - key: "com.android.apex.apkrollback.test.key", - apps: ["TestAppAv1"], - installable: false, - updatable: false, + name: "com.android.apex.apkrollback.test_v1", + manifest: "testdata/manifest_v1.json", + androidManifest: "testdata/AndroidManifest.xml", + file_contexts: ":apex.test-file_contexts", + key: "com.android.apex.apkrollback.test.key", + apps: ["TestAppAv1"], + installable: false, + updatable: false, } apex { - name: "com.android.apex.apkrollback.test_v2", - manifest: "testdata/manifest_v2.json", - androidManifest: "testdata/AndroidManifest.xml", - file_contexts: ":apex.test-file_contexts", - key: "com.android.apex.apkrollback.test.key", - apps: ["TestAppAv2"], - installable: false, - updatable: false, + name: "com.android.apex.apkrollback.test_v2", + manifest: "testdata/manifest_v2.json", + androidManifest: "testdata/AndroidManifest.xml", + file_contexts: ":apex.test-file_contexts", + key: "com.android.apex.apkrollback.test.key", + apps: ["TestAppAv2"], + installable: false, + updatable: false, } apex { - name: "com.android.apex.apkrollback.test_v2Crashing", - manifest: "testdata/manifest_v2.json", - androidManifest: "testdata/AndroidManifest.xml", - file_contexts: ":apex.test-file_contexts", - key: "com.android.apex.apkrollback.test.key", - apps: ["TestAppACrashingV2"], - installable: false, - updatable: false, + name: "com.android.apex.apkrollback.test_v2Crashing", + manifest: "testdata/manifest_v2.json", + androidManifest: "testdata/AndroidManifest.xml", + file_contexts: ":apex.test-file_contexts", + key: "com.android.apex.apkrollback.test.key", + apps: ["TestAppACrashingV2"], + installable: false, + updatable: false, } diff --git a/tests/SharedLibraryLoadingTest/Android.bp b/tests/SharedLibraryLoadingTest/Android.bp index 088278d6ee89..8027519b95fb 100644 --- a/tests/SharedLibraryLoadingTest/Android.bp +++ b/tests/SharedLibraryLoadingTest/Android.bp @@ -28,7 +28,7 @@ java_test_host { "junit", ], test_suites: ["general-tests"], - data: [ + device_common_data: [ ":SharedLibraryLoadingTests_StandardSharedLibrary", ":SharedLibraryLoadingTests_SharedLibraryLoadedAfter", ":SharedLibraryLoadingTests_SharedLibraryClientTests", diff --git a/tests/StagedInstallTest/Android.bp b/tests/StagedInstallTest/Android.bp index 27511411c97e..451870ee4c9a 100644 --- a/tests/StagedInstallTest/Android.bp +++ b/tests/StagedInstallTest/Android.bp @@ -55,7 +55,7 @@ java_test_host { "frameworks-base-hostutils", "cts-install-lib-host", ], - data: [ + device_common_data: [ ":StagedInstallInternalTestApp", ":apex.apexd_test", ":com.android.apex.apkrollback.test_v1", diff --git a/tests/SystemMemoryTest/host/Android.bp b/tests/SystemMemoryTest/host/Android.bp index cc8bc45a7411..153569746cd2 100644 --- a/tests/SystemMemoryTest/host/Android.bp +++ b/tests/SystemMemoryTest/host/Android.bp @@ -26,7 +26,7 @@ java_test_host { srcs: ["src/**/*.java"], libs: ["tradefed"], test_suites: ["general-tests"], - data: [ + device_common_data: [ ":SystemMemoryTestDevice", ], } diff --git a/tools/lint/global/integration_tests/Android.bp b/tools/lint/global/integration_tests/Android.bp index 40281d263a4c..05ba405d2c52 100644 --- a/tools/lint/global/integration_tests/Android.bp +++ b/tools/lint/global/integration_tests/Android.bp @@ -38,7 +38,7 @@ java_library { python_library_host { name: "AndroidGlobalLintTestNoAidl_py", - data: [":AndroidGlobalLintTestNoAidl{.lint}"], + device_common_data: [":AndroidGlobalLintTestNoAidl{.lint}"], pkg_path: "no_aidl", } @@ -53,7 +53,7 @@ java_library { python_library_host { name: "AndroidGlobalLintTestMissingAnnotation_py", - data: [":AndroidGlobalLintTestMissingAnnotation{.lint}"], + device_common_data: [":AndroidGlobalLintTestMissingAnnotation{.lint}"], pkg_path: "missing_annotation", } diff --git a/tools/preload-check/Android.bp b/tools/preload-check/Android.bp index 73caac694cb4..24ec12c50520 100644 --- a/tools/preload-check/Android.bp +++ b/tools/preload-check/Android.bp @@ -28,5 +28,5 @@ java_test_host { libs: ["tradefed"], test_suites: ["general-tests"], required: ["preload-check-device"], - data: [":preload-check-device"], + device_common_data: [":preload-check-device"], } -- GitLab From 63dfcadd34439a6c6b95655f4756c109e2977834 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Tue, 22 Oct 2024 17:09:06 -0700 Subject: [PATCH 258/459] Import translations. DO NOT MERGE ANYWHERE Auto-generated-cl: translation import Change-Id: I390901d04b967256b874fca520261a7f8274169e --- packages/SettingsLib/res/values-af/strings.xml | 8 ++++---- packages/SettingsLib/res/values-am/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ar/strings.xml | 8 ++++---- packages/SettingsLib/res/values-as/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-az/strings.xml | 8 ++++---- .../SettingsLib/res/values-b+sr+Latn/strings.xml | 8 ++++---- packages/SettingsLib/res/values-be/strings.xml | 8 ++++---- packages/SettingsLib/res/values-bg/strings.xml | 8 ++++---- packages/SettingsLib/res/values-bn/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-bs/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ca/strings.xml | 12 ++++++------ packages/SettingsLib/res/values-cs/strings.xml | 8 ++++---- packages/SettingsLib/res/values-da/strings.xml | 8 ++++---- packages/SettingsLib/res/values-de/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-el/strings.xml | 8 ++++---- packages/SettingsLib/res/values-en-rAU/strings.xml | 8 ++++---- packages/SettingsLib/res/values-en-rCA/strings.xml | 2 ++ packages/SettingsLib/res/values-en-rGB/strings.xml | 8 ++++---- packages/SettingsLib/res/values-en-rIN/strings.xml | 8 ++++---- packages/SettingsLib/res/values-es-rUS/strings.xml | 8 ++++---- packages/SettingsLib/res/values-es/strings.xml | 8 ++++---- packages/SettingsLib/res/values-et/strings.xml | 8 ++++---- packages/SettingsLib/res/values-eu/strings.xml | 8 ++++---- packages/SettingsLib/res/values-fa/strings.xml | 8 ++++---- packages/SettingsLib/res/values-fi/strings.xml | 8 ++++---- packages/SettingsLib/res/values-fr-rCA/strings.xml | 8 ++++---- packages/SettingsLib/res/values-fr/strings.xml | 8 ++++---- packages/SettingsLib/res/values-gl/strings.xml | 8 ++++---- packages/SettingsLib/res/values-gu/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-hi/arrays.xml | 2 +- packages/SettingsLib/res/values-hi/strings.xml | 8 ++++---- packages/SettingsLib/res/values-hr/strings.xml | 10 +++++----- packages/SettingsLib/res/values-hu/strings.xml | 8 ++++---- packages/SettingsLib/res/values-hy/strings.xml | 8 ++++---- packages/SettingsLib/res/values-in/strings.xml | 8 ++++---- packages/SettingsLib/res/values-is/strings.xml | 8 ++++---- packages/SettingsLib/res/values-it/strings.xml | 8 ++++---- packages/SettingsLib/res/values-iw/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ja/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ka/strings.xml | 8 ++++---- packages/SettingsLib/res/values-kk/strings.xml | 8 ++++---- packages/SettingsLib/res/values-km/strings.xml | 8 ++++---- packages/SettingsLib/res/values-kn/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ko/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ky/strings.xml | 8 ++++---- packages/SettingsLib/res/values-lo/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-lt/strings.xml | 8 ++++---- packages/SettingsLib/res/values-lv/strings.xml | 8 ++++---- packages/SettingsLib/res/values-mk/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ml/strings.xml | 8 ++++---- packages/SettingsLib/res/values-mn/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-mr/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ms/strings.xml | 8 ++++---- packages/SettingsLib/res/values-my/strings.xml | 8 ++++---- packages/SettingsLib/res/values-nb/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ne/strings.xml | 8 ++++---- packages/SettingsLib/res/values-nl/strings.xml | 8 ++++---- packages/SettingsLib/res/values-or/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-pa/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-pl/strings.xml | 2 ++ packages/SettingsLib/res/values-pt-rBR/strings.xml | 8 ++++---- packages/SettingsLib/res/values-pt-rPT/strings.xml | 8 ++++---- packages/SettingsLib/res/values-pt/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ro/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ru/strings.xml | 8 ++++---- packages/SettingsLib/res/values-si/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-sk/strings.xml | 8 ++++---- packages/SettingsLib/res/values-sl/strings.xml | 8 ++++---- packages/SettingsLib/res/values-sq/strings.xml | 10 ++++++---- packages/SettingsLib/res/values-sr/strings.xml | 8 ++++---- packages/SettingsLib/res/values-sv/strings.xml | 8 ++++---- packages/SettingsLib/res/values-sw/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ta/strings.xml | 8 ++++---- packages/SettingsLib/res/values-te/strings.xml | 8 ++++---- packages/SettingsLib/res/values-th/strings.xml | 8 ++++---- packages/SettingsLib/res/values-tl/strings.xml | 8 ++++---- packages/SettingsLib/res/values-tr/strings.xml | 8 ++++---- packages/SettingsLib/res/values-uk/strings.xml | 8 ++++---- packages/SettingsLib/res/values-ur/strings.xml | 8 ++++---- packages/SettingsLib/res/values-uz/strings.xml | 8 ++++---- packages/SettingsLib/res/values-vi/strings.xml | 8 ++++---- packages/SettingsLib/res/values-zh-rCN/strings.xml | 8 ++++---- packages/SettingsLib/res/values-zh-rHK/strings.xml | 8 ++++---- packages/SettingsLib/res/values-zh-rTW/strings.xml | 8 ++++---- packages/SettingsLib/res/values-zu/strings.xml | 8 ++++---- 85 files changed, 356 insertions(+), 332 deletions(-) diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml index 2f158c88305a..79c379996d8b 100644 --- a/packages/SettingsLib/res/values-af/strings.xml +++ b/packages/SettingsLib/res/values-af/strings.xml @@ -357,6 +357,8 @@ "Aktiveer die Verbeterde Konnektiwiteit-kenmerk." "Plaaslike terminaal" "Aktiveer terminaalprogram wat plaaslike skermtoegang bied" + "Linux-ontwikkelingomgewing" + "Laat loop Linux-terminaal op Android" "HDCP-kontrolering" "Stel HDCP-kontrolering se gedrag" "Ontfouting" @@ -686,11 +688,9 @@ "Geaktiveer" "Jou toestel moet herselflaai om hierdie verandering toe te pas. Herselflaai nou of kanselleer." "Bedrade oorfoon" - - + "Bedrade oudio" "USB-oudio" - - + "Bedrade mikrofoon" "USB-mikrofoon" "BT-mikrofoon" "Aan" diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml index 1040f377c6cd..5cde078af811 100644 --- a/packages/SettingsLib/res/values-am/strings.xml +++ b/packages/SettingsLib/res/values-am/strings.xml @@ -357,6 +357,8 @@ "የተሻሻለ ተገናኝነት ባህሪውን ያነቃል።" "አካባቢያዊ ተርሚናል" "የአካባቢያዊ ሼል መዳረሻ የሚያቀርብ የተርሚናል መተግበሪያ አንቃ" + "የLinux ግንባታ አከባቢ" + "Android ላይ Linux ተርሚናል ያሂዱ" "የHDCP ምልከታ" "የHDCP መመልከቻ ጠባይ አዘጋጅ" "ስህተት በማስወገድ ላይ" @@ -686,11 +688,9 @@ "ነቅቷል" "የእርስዎን መሣሪያ ይህ ለው ለማመልከት እንደገና መነሣት አለበት። አሁን እንደገና ያስነሡ ወይም ይተዉት።" "ባለገመድ የራስ ላይ ማዳመጫ" - - + "ግራ የሚያጋባ ኦዶዮ" "USB ኦዲዮ" - - + "ባለገመድ ማይክሮፎን" "USB ማይክሮፎን" "ብሉቱዝ ማይክሮፎን" "አብራ" diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml index 9e1db5fbf36d..09bfd83f7121 100644 --- a/packages/SettingsLib/res/values-ar/strings.xml +++ b/packages/SettingsLib/res/values-ar/strings.xml @@ -357,6 +357,8 @@ "لتفعيل الميزة \"إمكانية اتصال محسّن\"" "تطبيق طرفي محلي" "تفعيل تطبيق طرفي يوفر إمكانية الدخول إلى واجهة النظام المحلية" + "‏بيئة تطوير نظام التشغيل Linux" + "‏تشغيل محطة Linux الطرفية على Android" "‏التحقق من HDCP" "‏تعيين سلوك التحقق من HDCP" "تصحيح الأخطاء" @@ -686,11 +688,9 @@ "مفعّل" "يجب إعادة تشغيل جهازك ليتم تطبيق هذا التغيير. يمكنك إعادة التشغيل الآن أو إلغاء التغيير." "سماعات رأس سلكية" - - + "سمّاعة رأس سلكية" "‏مكبر صوت USB" - - + "ميكروفون سلكي" "‏ميكروفون USB" "ميكروفون يعمل بالبلوتوث" "مفعّلة" diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml index 76a39368f7fd..83cd2fe07942 100644 --- a/packages/SettingsLib/res/values-as/strings.xml +++ b/packages/SettingsLib/res/values-as/strings.xml @@ -357,6 +357,10 @@ "উন্নত সংযোগ সুবিধাটো সক্ষম কৰে।" "স্থানীয় টাৰ্মিনেল" "স্থানীয় শ্বেলৰ এক্সেছ দিয়া টাৰ্মিনেল এপ্ সক্ষম কৰক" + + + + "HDCP পৰীক্ষণ" "HDCP পৰীক্ষণ আচৰণ ছেট কৰক" "ডিবাগিং" @@ -686,11 +690,9 @@ "সক্ষম কৰা আছে" "এই সলনিটো কার্যকৰী হ’বলৈ আপোনাৰ ডিভাইচটো ৰিবুট কৰিবই লাগিব। এতিয়াই ৰিবুট কৰক অথবা বাতিল কৰক।" "তাঁৰযুক্ত হেডফ’ন" - - + "তাঁৰযুক্ত অডিঅ’" "ইউএছবি অডিঅ\'" - - + "তাঁৰযুক্ত মাইক্ৰ’ফ’ন" "ইউএছবি মাইক্ৰ’ফ’ন" "ব্লুটুথ মাইক্ৰ’ফ’ন" "অন" diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml index 2d9e1d9fb726..459cfaaae9c4 100644 --- a/packages/SettingsLib/res/values-az/strings.xml +++ b/packages/SettingsLib/res/values-az/strings.xml @@ -357,6 +357,8 @@ "Qabaqcıl məlumat mübadiləsini aktiv edir." "Yerli terminal" "Yerli örtük girişini təklif edən terminal tətbiqi aktiv edin" + "Linux inkişaf mühiti" + "Android-də Linux terminalını işə salın" "HDCP yoxlanışı" "HDCP yoxlanışı qaydası ayalansın" "Sazlama" @@ -686,11 +688,9 @@ "Aktiv" "Bu dəyişikliyin tətbiq edilməsi üçün cihaz yenidən başladılmalıdır. İndi yenidən başladın və ya ləğv edin." "Naqilli qulaqlıq" - - + "Simli audio" "USB audio" - - + "Simli mikrofon" "USB mikrofon" "Bluetooth mikrofonu" "Aktiv" diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml index 01f0ff26eddc..f883c93fd15e 100644 --- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml +++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml @@ -357,6 +357,8 @@ "Omogućava funkciju Poboljšano povezivanje." "Lokalni terminal" "Omogući apl. terminala za pristup lokalnom komandnom okruženju" + "Linux okruženje za programiranje" + "Pokrenite Linux terminal na Android-u" "HDCP provera" "Podešavanje ponašanja HDCP provere" "Otklanjanje grešaka" @@ -686,11 +688,9 @@ "Omogućeno" "Morate da restartujete uređaj da bi se ova promena primenila. Restartujte ga odmah ili otkažite." "Žičane slušalice" - - + "Žičane slušalice" "USB audio" - - + "Žičani mikrofon" "USB mikrofon" "Bluetooth mikrofon" "Uključeno" diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml index f710b1d76028..ca07c4def3a0 100644 --- a/packages/SettingsLib/res/values-be/strings.xml +++ b/packages/SettingsLib/res/values-be/strings.xml @@ -357,6 +357,8 @@ "Уключае функцыю \"Палепшанае падключэнне\"." "Лакальны тэрмінал" "Уключэнне прыкладання тэрмінала, якое прапануе доступ да лакальнай абалонкі" + "Асяроддзе распрацоўкі Linux" + "Запусціць тэрмінал Linux на прыладзе Android" "Праверка HDCP" "Усталяваць рэжым праверкі HDCP" "Адладка" @@ -686,11 +688,9 @@ "Уключана" "Перазагрузіце прыладу, каб прымяніць гэта змяненне. Перазагрузіце ці скасуйце." "Правадныя навушнікі" - - + "Правадныя навушнікі" "Аўдыяпрылада USB" - - + "Правадны мікрафон" "Мікрафон USB" "Мікрафон з Bluetooth" "Уключана" diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml index c5c4c914a919..7661a31d4dc2 100644 --- a/packages/SettingsLib/res/values-bg/strings.xml +++ b/packages/SettingsLib/res/values-bg/strings.xml @@ -357,6 +357,8 @@ "Активира функцията за подобрена свързаност." "Локален терминал" "Актив. на прил. за терминал с достъп до локалния команден ред" + "Среда на програмиране на Linux" + "Стартиране на терминала на Linux под Android" "Проверка с HDCP" "Проверка с HDCP" "Отстраняване на грешки" @@ -686,11 +688,9 @@ "Активирано" "За да бъде приложена тази промяна, устройството ви трябва да бъде рестартирано. Рестартирайте сега или анулирайте." "Слушалки с кабел" - - + "Слушалки с кабел" "Аудиоустройство с USB" - - + "Микрофон с кабел" "Микрофон с USB" "Микрофон с Bluetooth" "Включване" diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml index be6b9be9887c..f71a003c14c9 100644 --- a/packages/SettingsLib/res/values-bn/strings.xml +++ b/packages/SettingsLib/res/values-bn/strings.xml @@ -357,6 +357,10 @@ "কানেক্টিভিটি ফিচার উন্নত করার বিষয়টি চালু করা হয়েছে।" "স্থানীয় টার্মিনাল" "স্থানীয় শেল অ্যাক্সেসের প্রস্তাব করে এমন টার্মিনাল অ্যাপ্লিকেশন সক্ষম করুন" + + + + "HDCP পরীক্ষণ" "HDCP চেক করার আচরণ সেট করুন" "ডিবাগিং" @@ -686,11 +690,9 @@ "চালু করা আছে" "এই পরিবর্তনটি প্রয়োগ করার জন্য আপনার ডিভাইসটি অবশ্যই রিবুট করতে হবে। এখনই রিবুট করুন বা বাতিল করুন।" "তারযুক্ত হেডফোন" - - + "তারযুক্ত অডিও" "USB অডিও" - - + "তারযুক্ত মাইক্রোফোন" "USB মাইক্রোফোন" "BT মাইক্রোফোন" "চালু আছে" diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml index f34343050579..b76b028ac4b9 100644 --- a/packages/SettingsLib/res/values-bs/strings.xml +++ b/packages/SettingsLib/res/values-bs/strings.xml @@ -357,6 +357,8 @@ "Omogućava funkciju Poboljšane povezivosti." "Lokalni terminal" "Omogući terminalnu aplik. koja nudi pristup lok. kom. okruženju" + "Linuxovo okruženje za razvoj" + "Pokreni Linux terminal na Androidu" "HDCP provjera" "Postavke HDCP provjere" "Otklanjanje grešaka" @@ -686,11 +688,9 @@ "Omogućeno" "Morate ponovo pokrenuti uređaj da se ova promjena primijeni. Ponovo pokrenite odmah ili otkažite." "Žičane slušalice" - - + "Žičani audio uređaj" "USB audio" - - + "Žičani mikrofon" "USB mikrofon" "BT mikrofon" "Uključi" diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml index 3557b10c764b..2aa3ffa6d145 100644 --- a/packages/SettingsLib/res/values-ca/strings.xml +++ b/packages/SettingsLib/res/values-ca/strings.xml @@ -357,6 +357,8 @@ "Activa la funció de connectivitat millorada." "Terminal local" "Activa l\'aplicació de terminal que ofereix accés al shell local" + "Entorn de desenvolupament Linux" + "Executa el terminal de Linux a Android" "Comprovació d\'HDCP" "Defineix comprovació HDCP" "Depuració" @@ -611,10 +613,10 @@ "Dades compartides" "Mostra i modifica les dades compartides" "No hi ha dades compartides per a aquest usuari" - "S\'ha produït un error en recollir les dades compartides. Torna-ho a provar." + "Hi ha hagut un error en recollir les dades compartides. Torna-ho a provar." "Identificador de dades compartides: %d" "Caduquen el dia %s" - "S\'ha produït un error en suprimir les dades compartides." + "Hi ha hagut un error en suprimir les dades compartides." "No s\'ha adquirit cap arrendament d\'aquestes dades. Vols suprimir-les?" "Aplicacions que comparteixen dades" "L\'aplicació no ha proporcionat cap descripció." @@ -686,11 +688,9 @@ "Activat" "Has de reiniciar el teu dispositiu perquè s\'apliquin els canvis. Reinicia\'l ara o cancel·la." "Auriculars amb cable" - - + "Àudio amb cable" "Àudio USB" - - + "Micròfon amb cable" "Micròfon USB" "Micròfon Bluetooth" "Activa" diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml index ae47c4677da1..0a88338cf264 100644 --- a/packages/SettingsLib/res/values-cs/strings.xml +++ b/packages/SettingsLib/res/values-cs/strings.xml @@ -357,6 +357,8 @@ "Aktivuje funkci Lepší připojování." "Místní terminál" "Aktivovat terminálovou aplikaci pro místní přístup k prostředí shell" + "Vývojové prostředí Linux" + "Spustit na Androidu terminál Linux" "Kontrola HDCP" "Nastavit chování kontroly HDCP" "Ladění" @@ -686,11 +688,9 @@ "Zapnuto" "Aby se tato změna projevila, je třeba zařízení restartovat. Restartujte zařízení nebo zrušte akci." "Kabelová sluchátka" - - + "Zvuk přes kabel" "Zvuk USB" - - + "Kabelový mikrofon" "Mikrofon USB" "Mikrofon Bluetooth" "Zapnout" diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml index 82d702124a5a..983003bf1550 100644 --- a/packages/SettingsLib/res/values-da/strings.xml +++ b/packages/SettingsLib/res/values-da/strings.xml @@ -357,6 +357,8 @@ "Aktivér funktionen Enhanced Connectivity." "Lokal terminal" "Aktivér terminalappen, der giver lokal shell-adgang" + "Linux-udviklingsmiljø" + "Kør Linux-terminal i Android" "HDCP-kontrol" "Angiv HDCP-kontroladfærd" "Fejlretning" @@ -686,11 +688,9 @@ "Aktiveret" "Din enhed skal genstartes for at anvende denne ændring. Genstart nu, eller annuller." "Høretelefoner med ledning" - - + "Lyd med ledning" "USB-lydenhed" - - + "Mikrofon med ledning" "USB-mikrofon" "BT-mikrofon" "Til" diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml index 00ae7e48fd72..1a5e15a5903f 100644 --- a/packages/SettingsLib/res/values-de/strings.xml +++ b/packages/SettingsLib/res/values-de/strings.xml @@ -357,6 +357,10 @@ "Aktiviert die Funktion \"Verbesserte Konnektivität\"." "Lokales Terminal" "Terminal-App mit Zugriff auf lokale Shell aktivieren" + + + + "HDCP-Prüfung" "HDCP-Prüfverhalten festlegen" "Debugging" @@ -686,11 +690,9 @@ "Aktiviert" "Damit diese Änderung übernommen wird, musst du dein Gerät neu starten. Du kannst es jetzt neu starten oder den Vorgang abbrechen." "Kabelgebundene Kopfhörer" - - + "Kabelgebundene Kopfhörer" "USB-Audio" - - + "Kabelgebundenes Mikrofon" "USB-Mikrofon" "Bluetooth-Mikrofon" "An" diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml index 7dbe27485491..c838f689528e 100644 --- a/packages/SettingsLib/res/values-el/strings.xml +++ b/packages/SettingsLib/res/values-el/strings.xml @@ -357,6 +357,8 @@ "Επιτρέπει τη λειτουργία Βελτιωμένης συνδεσιμότητας." "Τοπική τερματική εφαρμογή" "Ενεργοπ.τερμ.εφαρμογής που προσφέρει πρόσβαση στο τοπικό κέλυφος" + "Περιβάλλον ανάπτυξης Linux" + "Εκτέλεση τερματικού Linux σε Android" "Έλεγχος HDCP" "Ρύθμιση συμπεριφοράς ελέγχου HDCP" "Εντοπισμός σφαλμάτων" @@ -686,11 +688,9 @@ "Ενεργή" "Για να εφαρμοστεί αυτή η αλλαγή, θα πρέπει να επανεκκινήσετε τη συσκευή σας. Επανεκκίνηση τώρα ή ακύρωση." "Ενσύρματα ακουστικά" - - + "Ενσύρματος ήχος" "Ήχος USB" - - + "Ενσύρματο μικρόφωνο" "Μικρόφωνο USB" "Μικρόφωνο BT" "Ενεργό" diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml index f29a02bc21e4..b4bf2055df0e 100644 --- a/packages/SettingsLib/res/values-en-rAU/strings.xml +++ b/packages/SettingsLib/res/values-en-rAU/strings.xml @@ -357,6 +357,8 @@ "Enables the enhanced connectivity feature." "Local terminal" "Enable terminal app that offers local shell access" + "Linux development environment" + "Run Linux terminal on Android" "HDCP checking" "Set HDCP checking behaviour" "Debugging" @@ -686,11 +688,9 @@ "Enabled" "Your device must be rebooted for this change to apply. Reboot now or cancel." "Wired headphones" - - + "Wired audio" "USB audio" - - + "Wired microphone" "USB microphone" "BT microphone" "On" diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml index 81489fe4cd65..af392b83cfb1 100644 --- a/packages/SettingsLib/res/values-en-rCA/strings.xml +++ b/packages/SettingsLib/res/values-en-rCA/strings.xml @@ -357,6 +357,8 @@ "Enables the Enhanced Connectivity feature." "Local terminal" "Enable terminal app that offers local shell access" + "Linux development environment" + "Run Linux terminal on Android" "HDCP checking" "Set HDCP checking behavior" "Debugging" diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml index f29a02bc21e4..b4bf2055df0e 100644 --- a/packages/SettingsLib/res/values-en-rGB/strings.xml +++ b/packages/SettingsLib/res/values-en-rGB/strings.xml @@ -357,6 +357,8 @@ "Enables the enhanced connectivity feature." "Local terminal" "Enable terminal app that offers local shell access" + "Linux development environment" + "Run Linux terminal on Android" "HDCP checking" "Set HDCP checking behaviour" "Debugging" @@ -686,11 +688,9 @@ "Enabled" "Your device must be rebooted for this change to apply. Reboot now or cancel." "Wired headphones" - - + "Wired audio" "USB audio" - - + "Wired microphone" "USB microphone" "BT microphone" "On" diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml index f29a02bc21e4..b4bf2055df0e 100644 --- a/packages/SettingsLib/res/values-en-rIN/strings.xml +++ b/packages/SettingsLib/res/values-en-rIN/strings.xml @@ -357,6 +357,8 @@ "Enables the enhanced connectivity feature." "Local terminal" "Enable terminal app that offers local shell access" + "Linux development environment" + "Run Linux terminal on Android" "HDCP checking" "Set HDCP checking behaviour" "Debugging" @@ -686,11 +688,9 @@ "Enabled" "Your device must be rebooted for this change to apply. Reboot now or cancel." "Wired headphones" - - + "Wired audio" "USB audio" - - + "Wired microphone" "USB microphone" "BT microphone" "On" diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml index 07b8d88a95d5..3c1a27822a3c 100644 --- a/packages/SettingsLib/res/values-es-rUS/strings.xml +++ b/packages/SettingsLib/res/values-es-rUS/strings.xml @@ -357,6 +357,8 @@ "Habilita la función Conectividad mejorada." "Terminal local" "Habilitar aplicac. de terminal que ofrece acceso al shell local" + "Entorno de desarrollo de Linux" + "Ejecuta la terminal de Linux en Android" "Comprobación HDCP" "Configurar comportamiento de la comprobación HDCP" "Depuración" @@ -686,11 +688,9 @@ "Habilitado" "Debes reiniciar el dispositivo para que se aplique el cambio. Reinícialo ahora o cancela la acción." "Auriculares con cable" - - + "Auriculares con cable" "Audio USB" - - + "Micrófono con cable" "Micrófono USB" "Micrófono Bluetooth" "Activar" diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml index 56355b1059ce..94502c5e0b3a 100644 --- a/packages/SettingsLib/res/values-es/strings.xml +++ b/packages/SettingsLib/res/values-es/strings.xml @@ -357,6 +357,8 @@ "Habilita la función de conectividad mejorada." "Terminal local" "Habilitar aplicación de terminal que ofrece acceso a shell local" + "Entorno de desarrollo de Linux" + "Ejecuta un terminal de Linux en Android" "Comprobación de HDCP" "Establecer comprobación HDCP" "Depuración" @@ -686,11 +688,9 @@ "Habilitado" "Es necesario reiniciar tu dispositivo para que se apliquen los cambios. Reinicia ahora o cancela la acción." "Auriculares con cable" - - + "Audio con cable" "Audio USB" - - + "Micrófono con cable" "Micrófono USB" "Micrófono Bluetooth" "Activado" diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml index 6582864e2e32..5f5a38c1464b 100644 --- a/packages/SettingsLib/res/values-et/strings.xml +++ b/packages/SettingsLib/res/values-et/strings.xml @@ -357,6 +357,8 @@ "Lubab täiustatud ühenduvuse funktsiooni." "Kohalik terminal" "Luba kohalikku turvalist juurdepääsu pakkuv terminalirakendus" + "Linuxi arenduskeskkond" + "Linuxi terminali käitamine Androidis" "HDCP-kontrollimine" "HDCP käitumise määramine" "Silumine" @@ -686,11 +688,9 @@ "Lubatud" "Selle muudatuse rakendamiseks tuleb seade taaskäivitada. Taaskäivitage kohe või tühistage." "Juhtmega kõrvaklapid" - - + "Juhtmega heli" "USB-heli" - - + "Juhtmega mikrofon" "USB-mikrofon" "BT mikrofon" "Sees" diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml index f9ec6f715448..2c512b78b5ef 100644 --- a/packages/SettingsLib/res/values-eu/strings.xml +++ b/packages/SettingsLib/res/values-eu/strings.xml @@ -357,6 +357,8 @@ "Konexioak hobetzeko eginbidea gaitzen du." "Tokiko terminala" "Gaitu tokiko shell-sarbidea duen terminal-aplikazioa" + "Linux-eko garapen-ingurunea" + "Exekutatu Linux-en terminala Android-en" "HDCP egiaztapena" "Ezarri HDCP egiaztapen-portaera" "Arazketa" @@ -686,11 +688,9 @@ "Gaituta" "Aldaketa aplikatzeko, berrabiarazi egin behar da gailua. Berrabiaraz ezazu orain, edo utzi bertan behera." "Entzungailu kableduna" - - + "Audio kableduna" "USB bidezko audioa" - - + "Mikrofono kableduna" "USB bidezko mikrofonoa" "Bluetooth bidezko mikrofonoa" "Aktibatu" diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml index 9c704c5b89eb..1aeca86aed6c 100644 --- a/packages/SettingsLib/res/values-fa/strings.xml +++ b/packages/SettingsLib/res/values-fa/strings.xml @@ -357,6 +357,8 @@ "ویژگی «اتصال بهبودیافته» را فعال می‌کند." "ترمینال محلی" "فعال کردن ترمینال برنامه‌ کاربردی که دسترسی به برنامه محلی را پیشنهاد می‌کند" + "‏محیط توسعه نرم‌افزار Linux" + "‏اجرا کردن پایانه Linux در Android" "‏بررسی HDCP" "‏تنظیم عملکرد بررسی HDCP" "اشکال‌زدایی" @@ -686,11 +688,9 @@ "فعال" "برای اعمال این تغییر، دستگاه باید بازراه‌اندازی شود. یا اکنون بازراه‌اندازی کنید یا لغو کنید." "هدفون سیمی" - - + "صدای سیمی" "‏بلندگوی USB" - - + "میکروفون سیمی" "‏میکروفون USB" "میکروفون بلوتوث" "روشن" diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml index 193ec7065086..53724a3b7d86 100644 --- a/packages/SettingsLib/res/values-fi/strings.xml +++ b/packages/SettingsLib/res/values-fi/strings.xml @@ -357,6 +357,8 @@ "Ottaa käyttöön Parannetut yhteydet ‑ominaisuuden." "Paikallinen pääte" "Ota käyttöön päätesov. joka mahdollistaa paikall. liittymäkäytön" + "Linux-kehitysympäristö" + "Käynnistä Linux-pääte Androidilla" "HDCP-tarkistus" "Aseta HDCP-tarkistus" "Vianetsintä" @@ -686,11 +688,9 @@ "Käytössä" "Laitteesi on käynnistettävä uudelleen, jotta muutos tulee voimaan. Käynnistä uudelleen nyt tai peru." "Langalliset kuulokkeet" - - + "Langallinen audio" "USB-audio" - - + "Langallinen mikrofoni" "USB-mikrofoni" "BT-mikrofoni" "Päällä" diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml index b527990c5221..30eba9eceb5a 100644 --- a/packages/SettingsLib/res/values-fr-rCA/strings.xml +++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml @@ -357,6 +357,8 @@ "Active la fonctionnalité Connectivité améliorée." "Terminal local" "Activer l\'appli Terminal permettant l\'accès au shell local" + "Environnement de développement Linux" + "Exécuter le terminal Linux sur Android" "Vérification HDCP" "Configurer vérification HDCP" "Débogage" @@ -686,11 +688,9 @@ "Activé" "Votre appareil doit être redémarré pour que ce changement prenne effet. Redémarrez-le maintenant ou annulez la modification." "Écouteurs filaires" - - + "Audio filaire" "Audio par USB" - - + "Microphone filaire" "Microphone USB" "Microphone BT" "Activé" diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml index fb2bcf322edb..f4afc8701609 100644 --- a/packages/SettingsLib/res/values-fr/strings.xml +++ b/packages/SettingsLib/res/values-fr/strings.xml @@ -357,6 +357,8 @@ "Active la fonctionnalité Connectivité améliorée." "Terminal local" "Activer l\'application Terminal permettant l\'accès au shell local" + "Environnement de développement Linux" + "Exécuter le terminal Linux sur Android" "Vérification HDCP" "Config. vérification HDCP" "Débogage" @@ -686,11 +688,9 @@ "Activé" "Vous devez redémarrer l\'appareil pour que cette modification soit appliquée. Redémarrez maintenant ou annulez l\'opération." "Casque filaire" - - + "Audio filaire" "Audio USB" - - + "Micro filaire" "Micro USB" "Micro Bluetooth" "Allumé" diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml index d6e9f3fb4210..be1fac816f7d 100644 --- a/packages/SettingsLib/res/values-gl/strings.xml +++ b/packages/SettingsLib/res/values-gl/strings.xml @@ -357,6 +357,8 @@ "Activa a función de conectividade mellorada" "Terminal local" "Activa a aplicación terminal que ofrece acceso ao shell local" + "Contorno de programación Linux" + "Executar terminal de Linux en Android" "Comprobación HDCP" "Definir comprobación HDCP" "Depuración" @@ -686,11 +688,9 @@ "Activado" "É necesario reiniciar o teu dispositivo para aplicar este cambio. Reiníciao agora ou cancela o cambio." "Auriculares con cable" - - + "Audio con cable" "Audio USB" - - + "Micrófono con cable" "Micrófono USB" "Micrófono Bluetooth" "Activada" diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml index b804dd4ef8cb..f343ff4aa4c4 100644 --- a/packages/SettingsLib/res/values-gu/strings.xml +++ b/packages/SettingsLib/res/values-gu/strings.xml @@ -357,6 +357,10 @@ "કનેક્ટિવિટીની વિસ્તૃત સુવિધા ચાલુ કરે છે." "સ્થાનિક ટર્મિનલ" "સ્થાનિક શેલ અ‍ૅક્સેસની ઑફર કરતી ટર્મિનલ એપ્લિકેશનને સક્ષમ કરો" + + + + "HDCP તપાસણી" "HDCP તપાસણીની વર્તણૂક બદલો" "ડીબગિંગ" @@ -686,11 +690,9 @@ "ચાલુ છે" "આ ફેરફારને લાગુ કરવા માટે તમારા ડિવાઇસને રીબૂટ કરવાની જરૂર છે. હમણાં જ રીબૂટ કરો કે રદ કરો." "વાયરવાળો હૅડફોન" - - + "વાયર્ડ ઑડિયો" "USB ઑડિયો" - - + "વાયર્ડ માઇક્રોફોન" "USB માઇક્રોફોન" "BT માઇક્રોફોન" "ચાલુ" diff --git a/packages/SettingsLib/res/values-hi/arrays.xml b/packages/SettingsLib/res/values-hi/arrays.xml index 7a22465f80e5..2173ad62404a 100644 --- a/packages/SettingsLib/res/values-hi/arrays.xml +++ b/packages/SettingsLib/res/values-hi/arrays.xml @@ -216,7 +216,7 @@ "एनिमेशन बंद" "एनिमेशन स्‍केल .5x" - "ऐनिमेशन स्‍केल 1x" + "ऐनिमेशन स्‍केल 1 गुना" "एनिमेशन स्‍केल 1.5x" "एनिमेशन स्‍केल 2x" "एनिमेशन स्‍केल 5x" diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml index 7c5e66ccaf03..352dba79565d 100644 --- a/packages/SettingsLib/res/values-hi/strings.xml +++ b/packages/SettingsLib/res/values-hi/strings.xml @@ -357,6 +357,8 @@ "कनेक्टिविटी बेहतर बनाने की सुविधा को चालू करें" "स्थानीय टर्मिनल" "लोकल शेल तक पहुंचने की सुविधा देने वाले टर्मिनल ऐप को चालू करें" + "Linux डेवलपमेंट एनवायरमेंट" + "Android पर Linux का टर्मिनल ऐप्लिकेशन चलाएं" "HDCP जांच" "HDCP जाँच व्‍यवहार सेट करें" "डीबग करना" @@ -686,11 +688,9 @@ "चालू है" "बदली गई सेटिंग को लागू करने के लिए, डिवाइस को रीस्टार्ट करना होगा. अपने डिवाइस को रीस्टार्ट करें या रद्द करें." "तार वाला हेडफ़ोन" - - + "तार वाला हेडफ़ोन" "यूएसबी ऑडियो" - - + "तार वाला माइक्रोफ़ोन" "यूएसबी माइक्रोफ़ोन" "ब्लूटूथ माइक्रोफ़ोन" "चालू है" diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml index fc474dd2957e..0df2a7a073e4 100644 --- a/packages/SettingsLib/res/values-hr/strings.xml +++ b/packages/SettingsLib/res/values-hr/strings.xml @@ -357,6 +357,8 @@ "Omogućuje značajku Poboljšana povezivost." "Lokalni terminal" "Omogući aplikaciju terminala koja nudi pristup lokalnoj ovojnici" + "Linuxovo razvojno okruženje" + "Pokrenite Linux terminal na Androidu" "HDCP provjera" "Postavke HDCP provjere" "Otklanjanje pogrešaka" @@ -418,7 +420,7 @@ "Omogućeno na neograničeno vrijeme" "Brzina animacije prozora" "Brzina animacije prijelaza" - "Razmjer duljine animatora" + "Brzina generiranja animacija" "Simulacija sekundarnih zaslona" "Aplikacije" "Ukloni aktivnosti" @@ -686,11 +688,9 @@ "Omogućeno" "Uređaj se mora ponovno pokrenuti da bi se ta promjena primijenila. Ponovo pokrenite uređaj odmah ili odustanite." "Žičane slušalice" - - + "Žičane slušalice" "USB zvučnik" - - + "Žičani mikrofon" "USB mikrofon" "BT mikrofon" "Uključeno" diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml index 95b28928ab01..86a959a97cd0 100644 --- a/packages/SettingsLib/res/values-hu/strings.xml +++ b/packages/SettingsLib/res/values-hu/strings.xml @@ -357,6 +357,8 @@ "Bekapcsolja az Enhanced Connectivity funkciót." "Helyi végpont" "Végalkalmazás engedélyezése a helyi rendszerhéj eléréséhez" + "Linux fejlesztői környezet" + "Linux-terminál futtatása Androidon" "HDCP-ellenőrzés" "HDCP-ellenőrzés beállítása" "Hibakeresés" @@ -686,11 +688,9 @@ "Engedélyezve" "Az eszközt újra kell indítani, hogy a módosítás megtörténjen. Indítsa újra most, vagy vesse el a módosítást." "Vezetékes fejhallgató" - - + "Vezetékes audio" "USB-hangeszköz" - - + "Vezetékes mikrofon" "USB-mikrofon" "BT-mikrofon" "Be" diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml index 51190f3a2599..4c29740b552a 100644 --- a/packages/SettingsLib/res/values-hy/strings.xml +++ b/packages/SettingsLib/res/values-hy/strings.xml @@ -357,6 +357,8 @@ "Միացնում է «Տվյալների լավացված փոխանակում» գործառույթը։" "Տեղային տերմինալ" "Միացնել տերմինալային հավելվածը, որն առաջարկում է մուտք տեղային խեցի" + "Լինուքսի մշակման միջավայր" + "Գործարկել Լինուքս տերմինալը Android-ում" "HDCP ստուգում" "HDCP-ի ստուգման կարգը" "Վրիպազերծում" @@ -686,11 +688,9 @@ "Միացված է" "Սարքն անհրաժեշտ է վերագործարկել, որպեսզի փոփոխությունը կիրառվի։ Վերագործարկեք հիմա կամ չեղարկեք փոփոխությունը։" "Լարով ականջակալ" - - + "Լարով միացվող աուդիո սարք" "USB աուդիո" - - + "Լարով միացվող խոսափող" "USB խոսափող" "Bluetooth խոսափող" "Միացնել" diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml index 84280cf8a0de..3b265f8e9d38 100644 --- a/packages/SettingsLib/res/values-in/strings.xml +++ b/packages/SettingsLib/res/values-in/strings.xml @@ -357,6 +357,8 @@ "Mengaktifkan fitur Konektivitas Yang Disempurnakan." "Terminal lokal" "Aktifkan aplikasi terminal yang menawarkan akses kerangka lokal" + "Lingkungan pengembangan Linux" + "Jalankan terminal Linux di Android" "Pemeriksaan HDCP" "Setel perilaku pemeriksaan HDCP" "Proses debug" @@ -686,11 +688,9 @@ "Aktif" "Perangkat Anda harus di-reboot agar perubahan ini diterapkan. Reboot sekarang atau batalkan." "Headphone berkabel" - - + "Audio berkabel" "Audio USB" - - + "Mikrofon berkabel" "Mikrofon USB" "Mikrofon BT" "Aktif" diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml index daadae6010dd..d0184e112fc0 100644 --- a/packages/SettingsLib/res/values-is/strings.xml +++ b/packages/SettingsLib/res/values-is/strings.xml @@ -357,6 +357,8 @@ "Virkjar eiginleika aukinnar tengigetu." "Staðbundin skipanalína" "Virkja skipanalínuforrit sem leyfir staðbundinn skeljaraðgang" + "Þróunarumhverfi Linux" + "Keyra Linux-útstöð í Android" "HDCP-athugun" "Velja virkni HDCP-ath." "Villuleit" @@ -686,11 +688,9 @@ "Virkt" "Endurræsa þarf tækið til að þessi breyting taki gildi. Endurræstu núna eða hættu við." "Heyrnartól með snúru" - - + "Heyrnartól með snúru" "USB-hljóð" - - + "Hljóðnemi með snúru" "USB-hljóðnemi" "BT-hljóðnemi" "Kveikt" diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml index 36aa2b334cbe..773aa2659171 100644 --- a/packages/SettingsLib/res/values-it/strings.xml +++ b/packages/SettingsLib/res/values-it/strings.xml @@ -357,6 +357,8 @@ "Consente di attivare la funzionalità Connettività migliorata." "Terminale locale" "Abilita l\'app Terminale che offre l\'accesso alla shell locale" + "Ambiente di sviluppo Linux" + "Esegui il terminale Linux su Android" "Verifica HDCP" "Comportamento di verifica HDCP" "Debug" @@ -686,11 +688,9 @@ "Attivo" "Per applicare questa modifica, devi riavviare il dispositivo. Riavvia ora o annulla." "Cuffie con cavo" - - + "Audio con cavo" "Audio USB" - - + "Microfono con cavo" "Microfono USB" "Microfono BT" "On" diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml index 942b99b68897..45c41dd4251b 100644 --- a/packages/SettingsLib/res/values-iw/strings.xml +++ b/packages/SettingsLib/res/values-iw/strings.xml @@ -357,6 +357,8 @@ "הפעלה של תכונת הקישוריות המשופרת." "מסוף מקומי" "הפעלה של אפליקציית מסוף המציעה גישה מקומית למעטפת" + "‏סביבת פיתוח של Linux" + "‏הפעלת טרמינל Linux ב-Android" "‏בדיקת HDCP" "‏הגדרת האופן של בדיקת HDCP" "ניפוי באגים" @@ -686,11 +688,9 @@ "מופעל" "צריך להפעיל מחדש את המכשיר כדי להחיל את השינוי. יש להפעיל מחדש עכשיו או לבטל." "אוזניות חוטיות" - - + "אודיו עם חיבור קווי" "‏אודיו ב-USB" - - + "מיקרופון עם חיבור קווי" "‏מיקרופון ב-USB" "‏מיקרופון BT" "פועלת" diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml index 5924ab2a42ca..ae3f1970d206 100644 --- a/packages/SettingsLib/res/values-ja/strings.xml +++ b/packages/SettingsLib/res/values-ja/strings.xml @@ -357,6 +357,8 @@ "接続強化機能を有効にします。" "ローカルターミナル" "ローカルシェルアクセスを提供するターミナルアプリを有効にします" + "Linux 開発環境" + "Android で Linux ターミナルを実行する" "HDCP チェック" "HDCP チェック動作を設定" "デバッグ" @@ -686,11 +688,9 @@ "有効" "この変更を適用するには、デバイスの再起動が必要です。今すぐ再起動するか、キャンセルしてください。" "有線ヘッドフォン" - - + "有線オーディオ" "USB オーディオ" - - + "有線マイク" "USB マイク" "BT マイク" "ON" diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml index 5f3d54f2dc70..fe9dbb52cdd0 100644 --- a/packages/SettingsLib/res/values-ka/strings.xml +++ b/packages/SettingsLib/res/values-ka/strings.xml @@ -357,6 +357,8 @@ "ჩართავს კავშირის გაძლიერებული შესაძლებლობის ფუნქციას." "ადგილობრივი ტერმინალი" "ლოკალურ გარსზე წვდომის ტერმინალური აპლიკაციის ჩართვა" + "Linux-ის შემუშავების გარემო" + "Linux ტერმინალის გაშვება Android-ზე" "HDCP შემოწმება" "დააყენე HDCP შემოწმების ქცევა" "გამართვა" @@ -686,11 +688,9 @@ "ჩართული" "ამ ცვლილების ასამოქმედებლად თქვენი მოწყობილობა უნდა გადაიტვირთოს. გადატვირთეთ ახლავე ან გააუქმეთ." "სადენიანი ყურსასმენი" - - + "სადენიანი აუდიო" "USB აუდიო" - - + "სადენიანი მიკროფონი" "USB მიკროფონი" "BT მიკროფონი" "ჩართვა" diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml index bb6e353ae321..1162e8f8a00f 100644 --- a/packages/SettingsLib/res/values-kk/strings.xml +++ b/packages/SettingsLib/res/values-kk/strings.xml @@ -357,6 +357,8 @@ "Жетілдірілген байланыс функциясын қосады." "Жергілікті терминал" "Жергілікті шелл-код қол жетімділігін ұсынатын терминалды қолданбаны қосу" + "Linux әзірлеуші ортасы" + "Android-та Linux терминалын іске қосыңыз." "HDCP тексерісі" "HDCP (кең жолақты цифрлық контент қорғау) тексеру мүмкіндігін орнату" "Түзету" @@ -686,11 +688,9 @@ "Қосулы" "Бұл өзгеріс күшіне енуі үшін, құрылғыны қайта жүктеу керек. Қазір қайта жүктеңіз не бас тартыңыз." "Сымды құлақаспап" - - + "Сымды аудио" "USB аудио" - - + "Сымды микрофон" "USB микрофон" "Bluetooth микрофоны" "Қосу" diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml index 20ed723f4bc2..5a184c585ef5 100644 --- a/packages/SettingsLib/res/values-km/strings.xml +++ b/packages/SettingsLib/res/values-km/strings.xml @@ -357,6 +357,8 @@ "បើក​មុខងារ​ការតភ្ជាប់​ដែលបានធ្វើឱ្យប្រសើរឡើង។" "ស្ថានីយ​មូលដ្ឋាន" "បើក​កម្មវិធី​ស្ថានីយ​ដែល​ផ្ដល់​ការ​ចូល​សែល​មូលដ្ឋាន" + "មជ្ឈដ្ឋាន​អភិវឌ្ឍន៍ Linux" + "ដំណើរការទែមីណាល់ Linux នៅលើ Android" "ពិនិត្យ HDCP" "កំណត់​ឥរិយាបថ​ពិនិត្យ HDCP" "ការជួសជុល" @@ -686,11 +688,9 @@ "បានបើក" "ត្រូវតែ​ចាប់ផ្ដើម​ឧបករណ៍​របស់អ្នក​ឡើងវិញ ដើម្បីឱ្យ​ការផ្លាស់ប្ដូរ​នេះ​មានប្រសិទ្ធភាព។ ចាប់ផ្ដើមឡើងវិញ​ឥឡូវនេះ ឬ​បោះបង់​។" "កាស​មានខ្សែ" - - + "សំឡេងប្រើខ្សែ" "ឧបករណ៍បំពងសំឡេង USB" - - + "មីក្រូហ្វូនប្រើខ្សែ" "មីក្រូហ្វូន USB" "មីក្រូហ្វូន BT" "បើក" diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml index 50a1234ca348..f34a43cfdd19 100644 --- a/packages/SettingsLib/res/values-kn/strings.xml +++ b/packages/SettingsLib/res/values-kn/strings.xml @@ -357,6 +357,8 @@ "ವರ್ಧಿತ ಸಂಪರ್ಕ ವೈಶಿಷ್ಟ್ಯವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ" "ಸ್ಥಳೀಯ ಟರ್ಮಿನಲ್" "ಸ್ಥಳೀಯ ಶೆಲ್ ಪ್ರವೇಶವನ್ನು ಒದಗಿಸುವ ಟರ್ಮಿನಲ್ ಆ್ಯಪ್‌ ಸಕ್ರಿಯಗೊಳಿಸಿ" + "Linux ಡೆವಲಪ್‌ಮೆಂಟ್ ಎನ್ವಿರಾನ್‌ಮೆಂಟ್" + "Android ನಲ್ಲಿ Linux ಟರ್ಮಿನಲ್ ಅನ್ನು ರನ್ ಮಾಡಿ" "HDCP ಪರೀಕ್ಷಿಸುವಿಕೆ" "HDCP ಪರಿಶೀಲನಾ ನಡವಳಿಕೆಯನ್ನು ಹೊಂದಿಸಿ" "ಡೀಬಗ್ ಮಾಡುವಿಕೆ" @@ -686,11 +688,9 @@ "ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" "ಈ ಬದಲಾವಣೆ ಅನ್ವಯವಾಗಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ರೀಬೂಟ್ ಮಾಡಬೇಕು. ಇದೀಗ ರೀಬೂಟ್ ಮಾಡಿ ಅಥವಾ ರದ್ದುಗೊಳಿಸಿ." "ವೈಯರ್ ಹೊಂದಿರುವ ಹೆಡ್‌ಫೋನ್" - - + "ವೈರ್ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಆಡಿಯೋ" "USB ಆಡಿಯೋ" - - + "ವೈರ್‌ ಸಂಪರ್ಕ ಹೊಂದಿರುವ ಮೈಕ್ರೋಫೋನ್" "USB ಮೈಕ್ರೊಫೋನ್‌" "BT ಮೈಕ್ರೊಫೋನ್" "ಆನ್ ಆಗಿದೆ" diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml index f9949ce97a4c..d803404fb34a 100644 --- a/packages/SettingsLib/res/values-ko/strings.xml +++ b/packages/SettingsLib/res/values-ko/strings.xml @@ -357,6 +357,8 @@ "향상된 연결 기능을 사용 설정합니다." "로컬 터미널" "로컬 셸 액세스를 제공하는 터미널 앱 사용" + "Linux 개발 환경" + "Android에서 Linux 터미널 실행" "HDCP 확인" "HDCP 확인 동작 설정" "디버깅" @@ -686,11 +688,9 @@ "사용 설정됨" "변경사항을 적용하려면 기기를 재부팅해야 합니다. 지금 재부팅하거나 취소하세요." "유선 헤드폰" - - + "유선 오디오" "USB 오디오" - - + "유선 마이크" "USB 마이크" "블루투스 마이크" "사용" diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml index 40bbb35bdec3..2fb036f8356c 100644 --- a/packages/SettingsLib/res/values-ky/strings.xml +++ b/packages/SettingsLib/res/values-ky/strings.xml @@ -357,6 +357,8 @@ "Жакшыртылган туташуу функциясын иштетет." "Жергиликтүү терминал" "Жергиликтүү буйрук кабыгын сунуштаган терминалга уруксат берүү" + "Linux иштеп чыгуу чөйрөсү" + "Android\'де Linux терминалын иштетүү" "HDCP текшерүү" "HDCP текшерүү тартиби" "Мүчүлүштүктөрдү аныктоо" @@ -686,11 +688,9 @@ "Күйүк" "Бул өзгөрүү күчүнө кириши үчүн, түзмөктү өчүрүп күйгүзүңүз. Азыр же кийинчерээк өчүрүп күйгүзсөңүз болот." "Зымдуу гарнитура" - - + "Зымдуу аудио түзмөк" "USB аудио" - - + "Зымдуу микрофон" "USB микрофон" "Bluetooth микрофону" "Күйгүзүү" diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml index b5f89225eec0..da631b6bc87b 100644 --- a/packages/SettingsLib/res/values-lo/strings.xml +++ b/packages/SettingsLib/res/values-lo/strings.xml @@ -357,6 +357,10 @@ "ເປີດນຳໃຊ້ຄຸນສົມບັດການເຊື່ອມຕໍ່ທີ່ເສີມແຕ່ງແລ້ວ" "Terminal ໃນໂຕເຄື່ອງ" "ເປີດນຳໃຊ້ແອັບຯ Terminal ທີ່ໃຫ້ການເຂົ້າເຖິງ shell ໃນໂຕເຄື່ອງໄດ້" + + + + "ການກວດສອບ HDCP" "ຕັ້ງວິທີການກວດສອບ HDCP" "ການດີບັກ" @@ -686,11 +690,9 @@ "ເປີດການນຳໃຊ້ແລ້ວ" "ທ່ານຕ້ອງປິດເປີດອຸປະກອນຄືນໃໝ່ເພື່ອນຳໃຊ້ການປ່ຽນແປງນີ້. ປິດເປີດໃໝ່ດຽວນີ້ ຫຼື ຍົກເລີກ." "ຫູຟັງແບບມີສາຍ" - - + "ສຽງແບບມີສາຍ" "ສຽງ USB" - - + "ໄມໂຄຣໂຟນແບບມີສາຍ" "ໄມໂຄຣໂຟນ USB" "ໄມໂຄຣໂຟນ BT" "ເປີດ" diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml index fd23ecefecfa..0c235b8a6f35 100644 --- a/packages/SettingsLib/res/values-lt/strings.xml +++ b/packages/SettingsLib/res/values-lt/strings.xml @@ -357,6 +357,8 @@ "Įgalinti patobulinto ryšio funkciją." "Vietinis terminalas" "Įgal. terminalo progr., siūlančią prieigą prie viet. apvalkalo" + "„Linux“ kūrimo aplinka" + "„Linux“ terminalo paleidimas sistemoje „Android“" "HDCP tikrinimas" "Nust. HDCP tikrin. elgs." "Derinimas" @@ -686,11 +688,9 @@ "Įgalinta" "Kad pakeitimas būtų pritaikytas, įrenginį reikia paleisti iš naujo. Dabar paleiskite iš naujo arba atšaukite." "Laidinės ausinės" - - + "Laidinis garso įrenginys" "USB garsas" - - + "Laidinis mikrofonas" "USB mikrofonas" "„Bluetooth“ mikrofonas" "Įjungta" diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml index 4fbbbe9ec028..daaebc880ec9 100644 --- a/packages/SettingsLib/res/values-lv/strings.xml +++ b/packages/SettingsLib/res/values-lv/strings.xml @@ -357,6 +357,8 @@ "Tiek iespējota uzlabotās savienojamības funkcija." "Vietējā beigu lietotne" "Iespējot beigu lietotni, kurā piedāvāta vietējā čaulas piekļuve" + "Linux izstrādes vide" + "Palaist Linux termināli Android ierīcē" "HDCP pārbaude" "HDCP pārb. iestatīšana" "Atkļūdošana" @@ -686,11 +688,9 @@ "Iespējots" "Lai šīs izmaiņas tiktu piemērotas, nepieciešama ierīces atkārtota palaišana. Atkārtoti palaidiet to tūlīt vai atceliet izmaiņas." "Vadu austiņas" - - + "Vadu audio" "USB audio" - - + "Vadu mikrofons" "USB mikrofons" "Bluetooth mikrofons" "Ieslēgts" diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml index ea53b93dab15..f5e84a23aa07 100644 --- a/packages/SettingsLib/res/values-mk/strings.xml +++ b/packages/SettingsLib/res/values-mk/strings.xml @@ -357,6 +357,8 @@ "Ја овозможува функцијата „Подобрена поврзливост“." "Локален терминал" "Овозможи апликација на терминал што овозможува локален пристап кон школка." + "Програмерска околина на Linux" + "Извршување Linux-терминал на Android" "Проверка со HDCP" "Постави однесување на проверка на HDCP" "Отстранување грешки" @@ -686,11 +688,9 @@ "Овозможено" "За да се примени променава, уредот мора да се рестартира. Рестартирајте сега или откажете." "Жичени слушалки" - - + "Жичени слушалки" "USB-аудио" - - + "Жичен микрофон" "USB-микрофон" "Микрофон со Bluetooth" "Вклучено" diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml index 43ac8622a159..7dd2073642f3 100644 --- a/packages/SettingsLib/res/values-ml/strings.xml +++ b/packages/SettingsLib/res/values-ml/strings.xml @@ -357,6 +357,8 @@ "മെച്ചപ്പെടുത്തിയ കണക്റ്റിവിറ്റി ഫീച്ചർ പ്രവർത്തനക്ഷമമാക്കുന്നു." "പ്രാദേശിക ടെർമിനൽ" "പ്രാദേശിക ഷെൽ ആക്‌സസ് നൽകുന്ന ടെർമിനൽ അപ്ലിക്കേഷൻ പ്രവർത്തനക്ഷമമാക്കുക" + "Linux ഡെവലപ്പ്മെന്റ് എൻവയോൺമെന്റ്" + "Android-ൽ Linux ടെർമിനൽ പ്രവർത്തിപ്പിക്കുക" "HDCP പരിശോധന" "HDCP ചെക്കിംഗ്‌രീതി സജ്ജമാക്കുക" "ഡീബഗ്ഗിംഗ്" @@ -686,11 +688,9 @@ "പ്രവർത്തനക്ഷമമാക്കി" "ഈ മാറ്റം ബാധകമാകുന്നതിന് നിങ്ങളുടെ ഉപകരണം റീബൂട്ട് ചെയ്യേണ്ടതുണ്ട്. ഇപ്പോൾ റീബൂട്ട് ചെയ്യുകയോ റദ്ദാക്കുകയോ ചെയ്യുക." "വയേർഡ് ഹെഡ്ഫോൺ" - - + "വയേർഡ് ഓഡിയോ" "USB ഓഡിയോ" - - + "വയേർഡ് മൈക്രോഫോൺ" "USB മൈക്രോഫോൺ" "BT മൈക്രോഫോൺ" "ഓണാണ്" diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml index d3b67c752e7c..615edff447b4 100644 --- a/packages/SettingsLib/res/values-mn/strings.xml +++ b/packages/SettingsLib/res/values-mn/strings.xml @@ -357,6 +357,10 @@ "Сайжруулсан холболтын онцлогийг идэвхжүүлдэг." "Локал терминал" "Локал суурьт хандалт хийх боломж олгодог терминалын апп-г идэвхжүүлэх" + + + + "HDCP шалгах" "HDCP шалгах авирыг тохируулах" "Дебаг" @@ -686,11 +690,9 @@ "Идэвхжүүлсэн" "Энэ өөрчлөлтийг хэрэгжүүлэхийн тулд таны төхөөрөмжийг дахин асаах ёстой. Одоо дахин асаах эсвэл цуцлана уу." "Утастай чихэвч" - - + "Утастай аудио" "USB аудио" - - + "Утастай микрофон" "USB микрофон" "BT микрофон" "Асаах" diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml index 9d22c0060f9e..be9464c30241 100644 --- a/packages/SettingsLib/res/values-mr/strings.xml +++ b/packages/SettingsLib/res/values-mr/strings.xml @@ -357,6 +357,8 @@ "वर्धित कनेक्टिव्हिटी वैशिष्‍ट्य सुरू करा." "स्थानिक टर्मिनल" "स्थानिक शेल प्रवेश देणारा टर्मिनल अ‍ॅप सुरू करा" + "Linux विकास पर्यावरण" + "Android वर Linux टर्मिनल रन करा" "HDCP तपासणी" "HDCP तपासणी वर्तन सेट करा" "डीबग करणे" @@ -686,11 +688,9 @@ "सुरू केले आहे" "हा बदल लागू करण्यासाठी तुमचे डिव्हाइस रीबूट करणे आवश्यक आहे. आता रीबूट करा किंवा रद्द करा." "वायर्ड हेडफोन" - - + "वायर्ड ऑडिओ" "USB ऑडिओ" - - + "वायर्ड मायक्रोफोन" "USB मायक्रोफोन" "BT मायक्रोफोन" "सुरू करा" diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml index 22ff9dd5d41a..8f67d339fba0 100644 --- a/packages/SettingsLib/res/values-ms/strings.xml +++ b/packages/SettingsLib/res/values-ms/strings.xml @@ -357,6 +357,8 @@ "Mendayakan ciri Kesambungan Dipertingkat" "Terminal setempat" "Dayakan apl terminal yang menawarkan akses shell tempatan" + "Persekitaran pembangunan Linux" + "Terminal Run Linux pada Android" "Penyemakan HDCP" "Ttpkn tngkh laku smk HDCP" "Menyahpepijat" @@ -686,11 +688,9 @@ "Didayakan" "Peranti anda mesti dibut semula supaya perubahan ini berlaku. But semula sekarang atau batalkan." "Fon kepala berwayar" - - + "Audio berwayar" "Audio USB" - - + "Mikrofon berwayar" "Mikrofon USB" "Mikrofon BT" "Hidup" diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml index 9a337128786d..9bb30c74c03e 100644 --- a/packages/SettingsLib/res/values-my/strings.xml +++ b/packages/SettingsLib/res/values-my/strings.xml @@ -357,6 +357,8 @@ "အရည်အသွေးမြှင့်တင်ထားသော ချိတ်ဆက်နိုင်သည့် ဝန်ဆောင်မှုကို ဖွင့်ပါ။" "လိုကယ်တာမီနယ်" "local shell အသုံးပြုခွင့်ကမ်းလှမ်းသော တာမင်နယ်အပလီကေးရှင်းဖွင့်ပါ" + "Linux ဆော့ဖ်ဝဲရေးမှု ပတ်ဝန်းကျင်" + "Android တွင် Linux တာမီနယ် လုပ်ဆောင်ရန်" "HDCP စစ်ဆေးမှု" "HDCP စစ်ဆေးပုံကို သတ်မှတ်မည်" "အမှားရှာဖွေဖယ်ရှားခြင်း" @@ -686,11 +688,9 @@ "ဖွင့်ထားသည်" "ဤအပြောင်းအလဲ ထည့်သွင်းရန် သင့်စက်ကို ပြန်လည်စတင်ရမည်။ ယခု ပြန်လည်စတင်ပါ သို့မဟုတ် ပယ်ဖျက်ပါ။" "ကြိုးတပ်နားကြပ်" - - + "ကြိုးသွယ်ထားသည့် အသံ" "USB အသံ" - - + "ကြိုးသွယ်ထားသည့် မိုက်ခရိုဖုန်း" "USB မိုက်ခရိုဖုန်း" "BT မိုက်ခရိုဖုန်း" "ဖွင့်" diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml index 3b03d739673a..10c0e2105d26 100644 --- a/packages/SettingsLib/res/values-nb/strings.xml +++ b/packages/SettingsLib/res/values-nb/strings.xml @@ -357,6 +357,8 @@ "Slår på Forbedret tilkobling-funksjonen." "Lokal terminal" "Aktiver terminalappen som gir lokal kommandolistetilgang" + "Linux-utviklingsmiljø" + "Kjør Linux-terminal på Android" "HDCP-kontroll" "Angi HDPC-kontrolladferd" "Feilsøking" @@ -686,11 +688,9 @@ "Slått på" "Enheten din må startes på nytt for at denne endringen skal tre i kraft. Start på nytt nå eller avbryt." "Hodetelefoner med kabel" - - + "Lyd med kabel" "USB-lyd" - - + "Mikrofon med kabel" "USB-mikrofon" "BT-mikrofon" "På" diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml index 84c8466abfaa..b26376179c62 100644 --- a/packages/SettingsLib/res/values-ne/strings.xml +++ b/packages/SettingsLib/res/values-ne/strings.xml @@ -357,6 +357,8 @@ "यसले परिष्कृत जडानको सुविधा सक्षम पार्छ।" "स्थानीय टर्मिनल" "स्थानीय सेल पहुँच प्रदान गर्ने टर्मिनल एप सक्षम गर्नुहोस्" + "Linux डेभलप्मेन्ट इन्भायरमेन्ट" + "Android मा Linux टर्मिनल एप प्रयोग गर्नुहोस्" "HDCP जाँच" "HDCP जाँच व्यवहार सेट गर्नुहोस्" "डिबग गरिँदै छ" @@ -686,11 +688,9 @@ "सक्षम पारिएको छ" "यो परिवर्तन लागू गर्न तपाईंको यन्त्र अनिवार्य रूपमा रिबुट गर्नु पर्छ। अहिले रिबुट गर्नुहोस् वा रद्द गर्नुहोस्।" "तारयुक्त हेडफोन" - - + "तारयुक्त अडियो" "USB अडियो" - - + "तारयुक्त माइक्रोफोन" "USB माइक्रोफोन" "BT माइक्रोफोन" "अन छ" diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml index 83df29acd836..75d561762967 100644 --- a/packages/SettingsLib/res/values-nl/strings.xml +++ b/packages/SettingsLib/res/values-nl/strings.xml @@ -357,6 +357,8 @@ "Hiermee wordt de functie voor verbeterde connectiviteit aangezet." "Lokale terminal" "Terminal-app aanzetten die lokale shell-toegang biedt" + "Linux-ontwikkelomgeving" + "Linux-terminal uitvoeren op Android" "HDCP-controle" "HDCP-controlegedrag instellen" "Foutopsporing" @@ -686,11 +688,9 @@ "Aan" "Je apparaat moet opnieuw worden opgestart om deze wijziging toe te passen. Start nu opnieuw op of annuleer de wijziging." "Bedrade koptelefoon" - - + "Bedrade audio" "USB-audio" - - + "Bedrade microfoon" "USB-microfoon" "BT-microfoon" "Aan" diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml index d03c8f30502e..fb3a16695536 100644 --- a/packages/SettingsLib/res/values-or/strings.xml +++ b/packages/SettingsLib/res/values-or/strings.xml @@ -357,6 +357,10 @@ "ଏନହାନ୍ସଡ୍ କନେକ୍ଟିଭିଟି ଫିଚର୍ ସକ୍ଷମ କରିଥାଏ।" "ସ୍ଥାନୀୟ ଟର୍ମିନାଲ୍‌" "ସ୍ଥାନୀୟ ଶେଲ୍‌କୁ ଆକ‌ସେସ୍‌ ଦେଉଥିବା ଟର୍ମିନଲ୍‌ ଆପ୍‌କୁ ସକ୍ଷମ କରନ୍ତୁ" + + + + "HDCP ଯାଞ୍ଚ" "HDCPର ଯାଞ୍ଚ ଗତିବିଧି ସେଟ୍‍ କରନ୍ତୁ" "ଡିବଗ୍‌ କରୁଛି" @@ -686,11 +690,9 @@ "ସକ୍ଷମ କରାଯାଇଛି" "ଏହି ପରିବର୍ତ୍ତନ ଲାଗୁ କରିବା ପାଇଁ ଆପଣଙ୍କ ଡିଭାଇସକୁ ନିଶ୍ଚିତ ରୂପେ ରିବୁଟ୍ କରାଯିବା ଆବଶ୍ୟକ। ବର୍ତ୍ତମାନ ରିବୁଟ୍ କରନ୍ତୁ କିମ୍ବା ବାତିଲ କରନ୍ତୁ।" "ତାରଯୁକ୍ତ ହେଡଫୋନ" - - + "ୱାୟାର୍ଡ ଅଡିଓ" "USB ଅଡିଓ" - - + "ୱାୟାର୍ଡ ମାଇକ୍ରୋଫୋନ" "USB ମାଇକ୍ରୋଫୋନ" "BT ମାଇକ୍ରୋଫୋନ" "ଚାଲୁ ଅଛି" diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml index 1d482076ca59..06a17a3d69a0 100644 --- a/packages/SettingsLib/res/values-pa/strings.xml +++ b/packages/SettingsLib/res/values-pa/strings.xml @@ -357,6 +357,10 @@ "ਵਿਸਤ੍ਰਿਤ ਕਨੈਕਟੀਵਿਟੀ ਵਿਸ਼ੇਸ਼ਤਾ ਨੂੰ ਚਾਲੂ ਕਰਦਾ ਹੈ।" "ਸਥਾਨਕ ਟਰਮੀਨਲ" "ਟਰਮੀਨਲ ਐਪ ਨੂੰ ਚਾਲੂ ਕਰੋ ਜੋ ਸਥਾਨਕ ਸ਼ੈਲ ਪਹੁੰਚ ਪੇਸ਼ਕਸ਼ ਕਰਦਾ ਹੈ" + + + + "HDCP ਜਾਂਚ" "HDCP ਜਾਂਚ ਵਿਵਹਾਰ ਸੈੱਟ ਕਰੋ" "ਡੀਬੱਗਿੰਗ" @@ -686,11 +690,9 @@ "ਚਾਲੂ ਕੀਤਾ ਗਿਆ" "ਇਸ ਤਬਦੀਲੀ ਨੂੰ ਲਾਗੂ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਨੂੰ ਰੀਬੂਟ ਕਰਨਾ ਲਾਜ਼ਮੀ ਹੈ। ਹੁਣੇ ਰੀਬੂਟ ਕਰੋ ਜਾਂ ਰੱਦ ਕਰੋ।" "ਤਾਰ ਵਾਲੇ ਹੈੱਡਫ਼ੋਨ" - - + "ਤਾਰ ਵਾਲਾ ਆਡੀਓ ਡੀਵਾਈਸ" "USB ਆਡੀਓ" - - + "ਤਾਰ ਵਾਲਾ ਮਾਈਕ੍ਰੋਫ਼ੋਨ" "USB ਮਾਈਕ੍ਰੋਫ਼ੋਨ" "BT ਮਾਈਕ੍ਰੋਫ਼ੋਨ" "ਚਾਲੂ" diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml index e8492d33e39f..0a8ea16b0279 100644 --- a/packages/SettingsLib/res/values-pl/strings.xml +++ b/packages/SettingsLib/res/values-pl/strings.xml @@ -357,6 +357,8 @@ "Włącza funkcję lepszej obsługi połączeń." "Terminal lokalny" "Włącz terminal, który umożliwia dostęp do powłoki lokalnej" + "Środowisko programistyczne Linux" + "Uruchom terminal Linux na Androidzie" "Sprawdzanie HDCP" "Ustaw sprawdzanie HDCP" "Debugowanie" diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml index 20bd69a2e15e..c39648817af9 100644 --- a/packages/SettingsLib/res/values-pt-rBR/strings.xml +++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml @@ -357,6 +357,8 @@ "Ativa o recurso \"Conectividade melhorada\"." "Terminal local" "Ativar o app terminal que oferece acesso ao shell local" + "Ambiente de desenvolvimento do Linux" + "Executar terminal Linux no Android" "Verificação HDCP" "Config. a verificação HDCP" "Depuração" @@ -686,11 +688,9 @@ "Ativado" "É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele." "Fones de ouvido com fio" - - + "Áudio com fio" "Áudio USB" - - + "Microfone com fio" "Microfone USB" "Microfone Bluetooth" "Ativado" diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml index 488dd5aa5652..be91222c38f2 100644 --- a/packages/SettingsLib/res/values-pt-rPT/strings.xml +++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml @@ -357,6 +357,8 @@ "Ativa a funcionalidade Conetividade melhorada." "Terminal local" "Ativar aplicação terminal que oferece acesso local à shell" + "Ambiente de programação Linux" + "Executar terminal do Linux no Android" "Verificação HDCP" "Definir o comportamento da verificação HDCP" "Depuração" @@ -686,11 +688,9 @@ "Ativada" "É necessário reiniciar o dispositivo para aplicar esta alteração. Reinicie agora ou cancele." "Auscultadores com fios" - - + "Áudio com fios" "Áudio USB" - - + "Microfone com fios" "Microfone USB" "Microfone BT" "Ligado" diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml index 20bd69a2e15e..c39648817af9 100644 --- a/packages/SettingsLib/res/values-pt/strings.xml +++ b/packages/SettingsLib/res/values-pt/strings.xml @@ -357,6 +357,8 @@ "Ativa o recurso \"Conectividade melhorada\"." "Terminal local" "Ativar o app terminal que oferece acesso ao shell local" + "Ambiente de desenvolvimento do Linux" + "Executar terminal Linux no Android" "Verificação HDCP" "Config. a verificação HDCP" "Depuração" @@ -686,11 +688,9 @@ "Ativado" "É necessário reinicializar o dispositivo para que a mudança seja aplicada. Faça isso agora ou cancele." "Fones de ouvido com fio" - - + "Áudio com fio" "Áudio USB" - - + "Microfone com fio" "Microfone USB" "Microfone Bluetooth" "Ativado" diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml index edd03560c176..4a0023fd6387 100644 --- a/packages/SettingsLib/res/values-ro/strings.xml +++ b/packages/SettingsLib/res/values-ro/strings.xml @@ -357,6 +357,8 @@ "Activează funcția Conectivitate îmbunătățită." "Aplicație terminal locală" "Activează aplicația terminal care oferă acces la shell local" + "Mediu de dezvoltare Linux" + "Rulează Linux terminal pe Android" "Verificare HDCP" "Configurează verif. HDCP" "Depanare" @@ -686,11 +688,9 @@ "Activat" "Pentru ca modificarea să se aplice, trebuie să repornești dispozitivul. Repornește-l acum sau anulează." "Căști cu fir" - - + "Audio cu fir" "Audio USB" - - + "Microfon cu fir" "Microfon USB" "Microfon BT" "Activat" diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml index 55fbfa5711ba..1abe67a3f020 100644 --- a/packages/SettingsLib/res/values-ru/strings.xml +++ b/packages/SettingsLib/res/values-ru/strings.xml @@ -357,6 +357,8 @@ "Включить улучшенный обмен данными" "Локальный терминальный доступ" "Разрешить терминальный доступ к локальной оболочке" + "Среда разработки Linux" + "Запустить терминал Linux в Android" "Проверка HDCP" "Порядок проверки HDCP" "Отладка" @@ -686,11 +688,9 @@ "Включено" "Чтобы изменение вступило в силу, необходимо перезапустить устройство. Вы можете сделать это сейчас или позже." "Проводные наушники" - - + "Проводное аудиоустройство" "USB-аудиоустройство" - - + "Проводной микрофон" "USB-микрофон" "Bluetooth-микрофон" "Вкл." diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml index d48824a744b4..2764ed270497 100644 --- a/packages/SettingsLib/res/values-si/strings.xml +++ b/packages/SettingsLib/res/values-si/strings.xml @@ -357,6 +357,10 @@ "වැඩිදියුණු කළ සබැඳුම් හැකියා විශේෂාංගය සබල කරයි." "අභ්‍යන්තර අන්තය" "දේශීය ෂෙල් ප්‍රවේශනය පිරිනමන ටර්මිනල් යෙදුම සබල කරන්න" + + + + "HDCP පරික්ෂාව" "HDCP පරික්ෂා හැසිරීම සකසන්න" "නිදොස්කරණය" @@ -686,11 +690,9 @@ "සබලයි" "මෙම වෙනස යෙදීමට ඔබේ උපාංගය නැවත පණ ගැන්විය යුතුය. දැන් නැවත පණ ගන්වන්න හෝ අවලංගු කරන්න." "රැහැන්ගත හෙඩ්ෆෝන්" - - + "රැහැන්ගත ශ්‍රව්‍ය" "USB ශ්‍රව්‍ය" - - + "රැහැන්ගත මයික්‍රෆෝනය" "USB මයික්‍රෆෝනය" "BT මයික්‍රෆෝනය" "ක්‍රියාත්මකයි" diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml index b80748296ad0..74c294b84db7 100644 --- a/packages/SettingsLib/res/values-sk/strings.xml +++ b/packages/SettingsLib/res/values-sk/strings.xml @@ -357,6 +357,8 @@ "Povoľuje funkciu Zlepšené možnosti pripojenia." "Miestny terminál" "Povoliť terminálovú apl. na miestny prístup k prostrediu shell" + "Vývojové prostredie Linux" + "Spúšťanie terminálu systému Linux v Androide" "Kontrola HDCP" "Nastaviť spôsob kontroly HDCP" "Ladenie" @@ -686,11 +688,9 @@ "Zapnuté" "Zmena sa prejaví až po reštarte zariadenia. Môžete ho teraz reštartovať alebo akciu zrušiť." "Slúchadlá s káblom" - - + "Zvuk cez kábel" "Zvuk cez USB" - - + "Káblový mikrofón" "Mikrofón s rozhraním USB" "Mikrofón Bluetooth" "Zapnúť" diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml index a4c0622f368c..0945cc042dc5 100644 --- a/packages/SettingsLib/res/values-sl/strings.xml +++ b/packages/SettingsLib/res/values-sl/strings.xml @@ -357,6 +357,8 @@ "Omogoči funkcijo Izboljšana povezljivost." "Lokalni terminal" "Omogočanje terminalske aplikacije za dostop do lokalne lupine" + "Razvojno okolje Linux" + "Zagon terminala Linux v Androidu" "Preverjanje HDCP" "Nastavi preverjanje HDCP" "Odpravljanje napak" @@ -686,11 +688,9 @@ "Omogočeno" "Napravo je treba znova zagnati, da bo ta sprememba uveljavljena. Znova zaženite zdaj ali prekličite." "Žične slušalke" - - + "Žične slušalke" "Zvok USB" - - + "Žični mikrofon" "Mikrofon USB" "Mikrofon Bluetooth" "Vklop" diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml index 19c42119d26e..e26d428ff99e 100644 --- a/packages/SettingsLib/res/values-sq/strings.xml +++ b/packages/SettingsLib/res/values-sq/strings.xml @@ -357,6 +357,10 @@ "Aktivizon veçorinë e \"Lidhshmërisë së përmirësuar\"." "Terminali lokal" "Aktivizo aplikacionin terminal që ofron qasje në guaskën lokale" + + + + "Kontrolli HDCP" "Cakto kontrollin e HDCP-së" "Korrigjimi i gabimeve" @@ -686,11 +690,9 @@ "Aktiv" "Pajisja jote duhet të riniset që ky ndryshim të zbatohet. Rinise tani ose anuloje." "Kufje me tela" - - + "Audio me tel" "Pajisja audio me USB" - - + "Mikrofon me tel" "Mikrofoni me USB" "Mikrofoni me Bluetooth" "Aktive" diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml index 1862910ff94a..d351a12bac21 100644 --- a/packages/SettingsLib/res/values-sr/strings.xml +++ b/packages/SettingsLib/res/values-sr/strings.xml @@ -357,6 +357,8 @@ "Омогућава функцију Побољшано повезивање." "Локални терминал" "Омогући апл. терминала за приступ локалном командном окружењу" + "Linux окружење за програмирање" + "Покрените Linux терминал на Android-у" "HDCP провера" "Подешавање понашања HDCP провере" "Отклањање грешака" @@ -686,11 +688,9 @@ "Омогућено" "Морате да рестартујете уређај да би се ова промена применила. Рестартујте га одмах или откажите." "Жичане слушалице" - - + "Жичане слушалице" "USB аудио" - - + "Жичани микрофон" "USB микрофон" "Bluetooth микрофон" "Укључено" diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml index 1ee80c5fb822..1c1117d39d5b 100644 --- a/packages/SettingsLib/res/values-sv/strings.xml +++ b/packages/SettingsLib/res/values-sv/strings.xml @@ -357,6 +357,8 @@ "Aktiverar funktionen Förbättrad anslutning." "Lokal terminal" "Aktivera en terminalapp som ger åtkomst till hyllor lokalt" + "Linux-utvecklingsmiljö" + "Kör Linux-terminalen på Android" "HDCP-kontroll" "Konfigurera HDCP-kontroll" "Felsökning" @@ -686,11 +688,9 @@ "Aktiverat" "Enheten måste startas om för att ändringen ska börja gälla. Starta om nu eller avbryt." "Hörlur med kabel" - - + "Ljud med kabel" "USB-ljud" - - + "Mikrofon med kabel" "USB-mikrofon" "BT-mikrofon" "På" diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml index d33eafe24b69..820fcc877190 100644 --- a/packages/SettingsLib/res/values-sw/strings.xml +++ b/packages/SettingsLib/res/values-sw/strings.xml @@ -357,6 +357,8 @@ "Huwasha kipengele cha Muunganisho Ulioboreshwa." "Kituo cha karibu" "Washa programu ya mwisho inayotoa ufikiaji mkuu wa karibu" + "Mazingira ya usanidi wa Linux" + "Tumia temino ya Linux kwenye Android" "Inakagua HDCP" "Weka HDCP ya kukagua tabia" "Utatuzi" @@ -686,11 +688,9 @@ "Imewashwa" "Ni lazima uwashe tena kifaa chako ili mabadiliko haya yatekelezwe. Washa tena sasa au ughairi." "Kipokea sauti cha kichwani chenye waya" - - + "Kipokea sauti cha kichwani kinachotumia waya" "Sauti ya USB" - - + "Maikrofoni inayotumia waya" "Maikrofoni ya USB" "Maikrofoni ya Bluetooth" "Umewashwa" diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml index 2c0781d6837c..98412c1f41f4 100644 --- a/packages/SettingsLib/res/values-ta/strings.xml +++ b/packages/SettingsLib/res/values-ta/strings.xml @@ -357,6 +357,8 @@ "மேம்படுத்தப்பட்ட இணைப்புநிலை அம்சத்தை இயக்கும்." "அக முனையம்" "அக ஷெல் அணுகலை வழங்கும் இறுதிப் ஆப்ஸை இயக்கு" + "Linux டெவெலப்மெண்ட் சூழல்" + "Androidல் Linux டெர்மினலை இயக்கும்" "HDCP சரிபார்ப்பு" "HDCP சரிபார்க்கும் செயல்பாடுகளை அமை" "பிழைதிருத்தம்" @@ -686,11 +688,9 @@ "இயக்கப்பட்டது" "இந்த மாற்றங்கள் செயல்படுத்தப்பட உங்கள் சாதனத்தை மறுபடி தொடங்க வேண்டும். இப்போதே மறுபடி தொடங்கவும் அல்லது ரத்துசெய்யவும்." "வயர்டு ஹெட்ஃபோன்" - - + "வயருள்ள ஹெட்ஃபோன்" "USB ஆடியோ" - - + "வயருள்ள மைக்ரோஃபோன்" "USB மைக்ரோஃபோன்" "BT மைக்ரோஃபோன்" "ஆன்" diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml index 145af84985b5..3770bb776627 100644 --- a/packages/SettingsLib/res/values-te/strings.xml +++ b/packages/SettingsLib/res/values-te/strings.xml @@ -357,6 +357,8 @@ "మెరుగైన కనెక్టివిటీ ఫీచర్‌ను ఎనేబుల్ చేస్తుంది." "స్థానిక టెర్మినల్" "స్థానిక షెల్ యాక్సెస్‌ను అందించే టెర్మినల్ యాప్‌ను ప్రారంభించండి" + "Linux డెవలప్మెంట్ ఎన్విరాన్మెంట్" + "Androidలో Linux టెర్మినల్‌ను రన్ చేయండి" "HDCP చెకింగ్‌" "HDCP తనిఖీ ప్రవర్తనను సెట్ చేయండి" "డీబగ్గింగ్" @@ -686,11 +688,9 @@ "ఎనేబుల్ చేయబడింది" "ఈ మార్పును వర్తింపజేయాలంటే మీరు మీ పరికరాన్ని తప్పనిసరిగా రీబూట్ చేయాలి. ఇప్పుడే రీబూట్ చేయండి లేదా రద్దు చేయండి." "వైర్ ఉన్న హెడ్‌ఫోన్" - - + "వైర్ ఉన్న ఆడియో" "USB ఆడియో" - - + "వైర్ ఉన్న మైక్రోఫోన్" "USB మైక్రోఫోన్" "BT మైక్రోఫోన్" "ఆన్‌లో ఉంది" diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml index ae6585c51081..57b8f5914e71 100644 --- a/packages/SettingsLib/res/values-th/strings.xml +++ b/packages/SettingsLib/res/values-th/strings.xml @@ -357,6 +357,8 @@ "เปิดใช้ฟีเจอร์การเชื่อมต่อที่ปรับปรุงแล้ว" "เทอร์มินัลในตัวเครื่อง" "เปิดใช้งานแอปเทอร์มินัลที่ให้การเข้าถึงเชลล์ในตัวเครื่อง" + "สภาพแวดล้อมในการพัฒนาซอฟต์แวร์ Linux" + "เรียกใช้เทอร์มินัล Linux บน Android" "การตรวจสอบ HDCP" "ตั้งค่าการตรวจสอบ HDCP" "การแก้ไขข้อบกพร่อง" @@ -686,11 +688,9 @@ "เปิดใช้" "คุณต้องรีบูตอุปกรณ์เพื่อให้การเปลี่ยนแปลงนี้มีผล รีบูตเลยหรือยกเลิก" "หูฟังแบบใช้สาย" - - + "หูฟังแบบใช้สาย" "เสียง USB" - - + "ไมโครโฟนแบบใช้สาย" "ไมโครโฟน USB" "ไมโครโฟน BT" "เปิด" diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml index 6e60e2b65932..e869e7f3bbb4 100644 --- a/packages/SettingsLib/res/values-tl/strings.xml +++ b/packages/SettingsLib/res/values-tl/strings.xml @@ -357,6 +357,8 @@ "Ine-enable ang feature na Pinagandang Pagkakonekta." "Lokal na terminal" "Paganahin ang terminal app na nag-aalok ng lokal na shell access" + "Development environment ng Linux" + "Paganahin ang Linux terminal sa Android" "Pagsusuring HDCP" "HDCP checking behavior" "Pagde-debug" @@ -686,11 +688,9 @@ "Na-enable" "Dapat i-reboot ang iyong device para mailapat ang pagbabagong ito. Mag-reboot ngayon o kanselahin." "Wired na headphone" - - + "Wired na audio" "USB audio" - - + "Wired na mikropono" "USB na mikropono" "BT na mikropono" "Naka-on" diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml index 8d709b9f3916..188f5aa2ce8e 100644 --- a/packages/SettingsLib/res/values-tr/strings.xml +++ b/packages/SettingsLib/res/values-tr/strings.xml @@ -357,6 +357,8 @@ "Gelişmiş Bağlantı özelliğini etkinleştirir." "Yerel terminal" "Yerel kabuk erişimi sunan terminal uygulamasını etkinleştir" + "Linux geliştirme ortamı" + "Android\'de Linux terminali çalıştırın" "HDCP denetimi" "HDCP denetimini ayarla" "Hata ayıklama" @@ -686,11 +688,9 @@ "Etkin" "Bu değişikliğin geçerli olması için cihazınızın yeniden başlatılması gerekir. Şimdi yeniden başlatın veya iptal edin." "Kablolu kulaklık" - - + "Kablolu ses" "USB ses cihazı" - - + "Kablolu mikrofon" "USB mikrofon" "BT mikrofonu" "Açık" diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml index 7b1086ca303f..b82db3a8a85f 100644 --- a/packages/SettingsLib/res/values-uk/strings.xml +++ b/packages/SettingsLib/res/values-uk/strings.xml @@ -357,6 +357,8 @@ "Вмикає функцію покращеного з\'єднання." "Локальний термінал" "Увімк. програму-термінал, що надає локальний доступ до оболонки" + "Середовище Linux для розробки" + "Запуск термінала Linux на Android" "Перевірка HDCP" "Порядок перевірки HDCP" "Налагодження" @@ -686,11 +688,9 @@ "Увімкнено" "Щоб застосувати ці зміни, потрібний перезапуск. Перезапустіть пристрій або скасуйте зміни." "Дротові навушники" - - + "Дротовий аудіопристрій" "USB-аудіо" - - + "Дротовий мікрофон" "USB-мікрофон" "Bluetooth-мікрофон" "Увімкнено" diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml index db00474f0750..43f03a20e0fc 100644 --- a/packages/SettingsLib/res/values-ur/strings.xml +++ b/packages/SettingsLib/res/values-ur/strings.xml @@ -357,6 +357,8 @@ "بہتر کردہ کنیکٹوٹی کی خصوصیات کو فعال کرتا ہے۔" "مقامی ٹرمینل" "مقامی شیل رسائی پیش کرنے والی ٹرمینل ایپ فعال کریں" + "‏‫Linux ڈیولپمنٹ ماحول" + "‏‫Android پر Linux ٹرمینل چلائیں" "‏HDCP چیکنگ" "‏HDCP چیکنگ برتاؤ سیٹ کریں" "ڈیبگ کرنا" @@ -686,11 +688,9 @@ "فعال" "اس تبدیلی کو لاگو کرنے کے ليے آپ کے آلہ کو ریبوٹ کرنا ضروری ہے۔ ابھی ریبوٹ کریں یا منسوخ کریں۔" "تار والا ہیڈ فون" - - + "تار والا ہیڈ فون" "‏‫USB آڈیو" - - + "تار والا مائیکروفون" "‏‫USB مائیکروفون" "‏‫BT مائیکروفون" "آن" diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml index 833863e2eee7..685d6e63b082 100644 --- a/packages/SettingsLib/res/values-uz/strings.xml +++ b/packages/SettingsLib/res/values-uz/strings.xml @@ -357,6 +357,8 @@ "Kuchaytirilgan aloqa funksiyasini ishga tushiradi." "Mahalliy terminal" "Mahalliy terminalga kirishga ruxsat beruvchi terminal ilovani faollashtirish" + "Linux dasturlash muhiti" + "Android orqali Linux terminalini ishga tushirish" "HDCP tekshiruvi" "HDCPni tekshirish tartibi" "Nosozliklarni tuzatish" @@ -686,11 +688,9 @@ "Yoniq" "Oʻzgarishlar kuchga kirishi uchun qurilmani oʻchirib yoqing. Buni hozir yoki keyinroq bajarishingiz mumkin." "Simli quloqlik" - - + "Simli audio" "USB audio" - - + "Simli mikrofon" "USB mikrofon" "Bluetooth mikrofon" "Yoniq" diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml index fba3a13864b5..7e98afddbe10 100644 --- a/packages/SettingsLib/res/values-vi/strings.xml +++ b/packages/SettingsLib/res/values-vi/strings.xml @@ -357,6 +357,8 @@ "Bật tính năng Kết nối nâng cao." "Dòng lệnh cục bộ" "Bật ứng dụng dòng lệnh cung cấp quyền truy cập vỏ cục bộ" + "Môi trường phát triển Linux" + "Chạy thiết bị đầu cuối Linux trên Android" "Kiểm tra HDCP" "Đặt hành vi kiểm tra HDCP" "Gỡ lỗi" @@ -686,11 +688,9 @@ "Đã bật" "Bạn phải khởi động lại thiết bị để áp dụng sự thay đổi này. Hãy khởi động lại ngay hoặc hủy." "Tai nghe có dây" - - + "Thiết bị âm thanh có dây" "Âm thanh qua cổng USB" - - + "Micrô có dây" "Micrô USB" "Micrô BT" "Đang bật" diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml index 29a4590878cf..0f3373e1142f 100644 --- a/packages/SettingsLib/res/values-zh-rCN/strings.xml +++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml @@ -357,6 +357,8 @@ "启用增强连接性功能。" "本地终端" "启用终端应用,以便在本地访问 Shell" + "Linux 开发环境" + "在 Android 上运行 Linux 终端" "HDCP 检查" "设置 HDCP 检查行为" "调试" @@ -686,11 +688,9 @@ "已启用" "设备必须重新启动才能应用此更改。您可以立即重新启动或取消。" "有线耳机" - - + "有线音频" "USB 音频" - - + "有线麦克风" "USB 麦克风" "蓝牙麦克风" "开启" diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml index 71fd6eec762b..d6ec1ca579e1 100644 --- a/packages/SettingsLib/res/values-zh-rHK/strings.xml +++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml @@ -357,6 +357,8 @@ "啟用強化連線功能。" "本機終端機" "啟用可提供本機命令介面存取權的終端機應用程式" + "Linux 開發環境" + "在 Android 上執行 Linux 終端機" "HDCP 檢查" "設定 HDCP 檢查行為" "除錯" @@ -686,11 +688,9 @@ "已啟用" "你的裝置必須重新開機,才能套用此變更。請立即重新開機或取消。" "有線耳機" - - + "有線音響" "USB 音訊" - - + "有線麥克風" "USB 麥克風" "藍牙麥克風" "開啟" diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml index b5700bcb31ea..08bf732652b9 100644 --- a/packages/SettingsLib/res/values-zh-rTW/strings.xml +++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml @@ -357,6 +357,8 @@ "啟用「加強型連線」功能。" "本機終端機" "啟用可提供本機命令介面存取權的終端機應用程式" + "Linux 開發環境" + "在 Android 上執行 Linux 終端機" "HDCP 檢查" "設定 HDCP 檢查行為" "偵錯" @@ -686,11 +688,9 @@ "已啟用" "裝置必須重新啟動才能套用這項變更。請立即重新啟動或取消變更。" "有線耳機" - - + "有線音訊" "USB 音訊" - - + "有線麥克風" "USB 麥克風" "藍牙麥克風" "開啟" diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml index 2f822b35a704..ad4f04555d05 100644 --- a/packages/SettingsLib/res/values-zu/strings.xml +++ b/packages/SettingsLib/res/values-zu/strings.xml @@ -357,6 +357,8 @@ "Inika amandla isici Sokuxhumeka Okuthuthukisiwe." "Itheminali yasendaweni" "Nika amandla uhlelo lokusebenza letheminali olunikeza ukufinyelela kwasendaweni kwe-shell" + "Indawo yokuthuthukiswa yeLinux" + "Sebenzisa itheminali yeLinux ku-Android" "Ihlola i-HDCP" "Hlela ukuhlola ukuziphatha kwe-HDCP" "Ilungisa inkinga" @@ -686,11 +688,9 @@ "Inikwe amandla" "Kufanele idivayisi yakho iqaliswe ukuze lolu shintsho lusebenze. Qalisa manje noma khansela." "Amahedifoni anentambo" - - + "Umsindo onentambo" "Umsindo we-USB" - - + "Imakrofoni enentambo" "Imakrofoni ye-USB" "Imakrofoni ye-BT" "Vuliwe" -- GitLab From 1b6fc84962f7be2876e2fa7e7887f5329b80a0f1 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Tue, 22 Oct 2024 17:16:54 -0700 Subject: [PATCH 259/459] Remove framework support for audio HIDL HAL V5 This HAL version has been deprecated in Android V. Bug: 308446058 Test: m Change-Id: Ied7b1086aaa6409b12db465579122f6bef6d4ec7 --- media/java/android/media/AudioHalVersionInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/media/java/android/media/AudioHalVersionInfo.java b/media/java/android/media/AudioHalVersionInfo.java index 2b6f72eabeec..3e456a65c2e4 100644 --- a/media/java/android/media/AudioHalVersionInfo.java +++ b/media/java/android/media/AudioHalVersionInfo.java @@ -84,7 +84,7 @@ public final class AudioHalVersionInfo implements Parcelable, Comparable VERSIONS = - List.of(AIDL_1_0, HIDL_7_1, HIDL_7_0, HIDL_6_0, HIDL_5_0); + List.of(AIDL_1_0, HIDL_7_1, HIDL_7_0, HIDL_6_0); private static final String TAG = "AudioHalVersionInfo"; private AudioHalVersion mHalVersion = new AudioHalVersion(); -- GitLab From c385acf0e66fbbe1cc21fa597cae2619e0c07af4 Mon Sep 17 00:00:00 2001 From: Shamali Patwa Date: Wed, 23 Oct 2024 00:33:05 +0000 Subject: [PATCH 260/459] Add additional members to OWNERS for appwidget Change-Id: I5c1c8128c1c568915776036c8309ebaccf777d06 Test: manual --- core/java/android/appwidget/OWNERS | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/java/android/appwidget/OWNERS b/core/java/android/appwidget/OWNERS index 191083303769..0e85d5bd7a27 100644 --- a/core/java/android/appwidget/OWNERS +++ b/core/java/android/appwidget/OWNERS @@ -3,3 +3,5 @@ sihua@google.com pinyaoting@google.com suprabh@google.com sunnygoyal@google.com +zakcohen@google.com +shamalip@google.com -- GitLab From cfa6252c6383e3239262d7e94d7c3399bad1efc0 Mon Sep 17 00:00:00 2001 From: TYM Tsai Date: Tue, 22 Oct 2024 17:40:51 +0800 Subject: [PATCH 261/459] Keeps art profile for pre-dexopt When pre-dexopt, the profile is created before commit install package. There are also clear app data and the profile during commiting. So add a flag to avoid to delete the profile for pre-dexopt. Bug: 321139675 Flag: android.content.pm.improve_install_freeze Test: atest CtsStorageHostTestCases:android.appsecurity.cts.StorageHostTest#testVerifyStatsByDataType Test: atest CtsPackageManagerTestCases Test: atest CtsInstallHostTestCases Test: atest CtsCompilationTestCases Change-Id: If22165407f5edf11d383d169ea02a6c853f3e19e --- .../android/server/pm/DeletePackageHelper.java | 15 +++++++++------ .../android/server/pm/InstallPackageHelper.java | 3 ++- .../com/android/server/pm/InstallRequest.java | 10 ++++++++++ .../android/server/pm/RemovePackageHelper.java | 10 ++++++---- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/pm/DeletePackageHelper.java b/services/core/java/com/android/server/pm/DeletePackageHelper.java index 8398ffc75f0d..f6e518a4fed7 100644 --- a/services/core/java/com/android/server/pm/DeletePackageHelper.java +++ b/services/core/java/com/android/server/pm/DeletePackageHelper.java @@ -397,7 +397,7 @@ final class DeletePackageHelper { try { executeDeletePackageLIF(action, packageName, deleteCodeAndResources, - allUserHandles, writeSettings); + allUserHandles, writeSettings, /* keepArtProfile= */ false); } catch (SystemDeleteException e) { if (DEBUG_REMOVE) Slog.d(TAG, "deletePackageLI: system deletion failure", e); return false; @@ -433,11 +433,11 @@ final class DeletePackageHelper { } public void executeDeletePackage(DeletePackageAction action, String packageName, - boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings) - throws SystemDeleteException { + boolean deleteCodeAndResources, @NonNull int[] allUserHandles, boolean writeSettings, + boolean keepArtProfile) throws SystemDeleteException { try (PackageManagerTracedLock installLock = mPm.mInstallLock.acquireLock()) { executeDeletePackageLIF(action, packageName, deleteCodeAndResources, allUserHandles, - writeSettings); + writeSettings, keepArtProfile); } } @@ -445,11 +445,14 @@ final class DeletePackageHelper { @GuardedBy("mPm.mInstallLock") private void executeDeletePackageLIF(DeletePackageAction action, String packageName, boolean deleteCodeAndResources, - @NonNull int[] allUserHandles, boolean writeSettings) throws SystemDeleteException { + @NonNull int[] allUserHandles, boolean writeSettings, boolean keepArtProfile) + throws SystemDeleteException { final PackageSetting ps = action.mDeletingPs; final PackageRemovedInfo outInfo = action.mRemovedInfo; final UserHandle user = action.mUser; - final int flags = action.mFlags; + final int flags = + keepArtProfile ? action.mFlags | Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES + : action.mFlags; final boolean systemApp = PackageManagerServiceUtils.isSystemApp(ps); // We need to get the permission state before package state is (potentially) destroyed. diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index 83292b775ddc..355184e1c758 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1101,6 +1101,7 @@ final class InstallPackageHelper { request.setError(e.error, e.getMessage()); return; } + request.setKeepArtProfile(true); DexOptHelper.performDexoptIfNeeded(request, mDexManager, mContext, null); } } @@ -2406,7 +2407,7 @@ final class InstallPackageHelper { // Settings will be written during the call to updateSettingsLI(). mDeletePackageHelper.executeDeletePackage( reconciledPkg.mDeletePackageAction, packageName, - true, allUsers, false); + true, allUsers, false, installRequest.isKeepArtProfile()); } catch (SystemDeleteException e) { if (mPm.mIsEngBuild) { throw new RuntimeException("Unexpected failure", e); diff --git a/services/core/java/com/android/server/pm/InstallRequest.java b/services/core/java/com/android/server/pm/InstallRequest.java index 089bbb7b0022..b0fe3a97af6e 100644 --- a/services/core/java/com/android/server/pm/InstallRequest.java +++ b/services/core/java/com/android/server/pm/InstallRequest.java @@ -169,6 +169,8 @@ final class InstallRequest { private final boolean mHasAppMetadataFileFromInstaller; + private boolean mKeepArtProfile = false; + // New install InstallRequest(InstallingSession params) { mUserId = params.getUser().getIdentifier(); @@ -1059,4 +1061,12 @@ final class InstallRequest { mPackageMetrics.onStepFinished(PackageMetrics.STEP_FREEZE_INSTALL); } } + + void setKeepArtProfile(boolean keepArtProfile) { + mKeepArtProfile = keepArtProfile; + } + + boolean isKeepArtProfile() { + return mKeepArtProfile; + } } diff --git a/services/core/java/com/android/server/pm/RemovePackageHelper.java b/services/core/java/com/android/server/pm/RemovePackageHelper.java index f9a8968b8ad6..f01a74e8d60d 100644 --- a/services/core/java/com/android/server/pm/RemovePackageHelper.java +++ b/services/core/java/com/android/server/pm/RemovePackageHelper.java @@ -258,9 +258,10 @@ final class RemovePackageHelper { */ public void clearPackageStateForUserLIF(PackageSetting ps, int userId, int flags) { final String packageName = ps.getPackageName(); - // Step 1: always destroy app profiles. - mAppDataHelper.destroyAppProfilesLIF(packageName); - + // Step 1: always destroy app profiles except when explicitly preserved + if ((flags & Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES) == 0) { + mAppDataHelper.destroyAppProfilesLIF(packageName); + } final AndroidPackage pkg; final SharedUserSetting sus; synchronized (mPm.mLock) { @@ -277,7 +278,8 @@ final class RemovePackageHelper { resolvedPkg = PackageImpl.buildFakeForDeletion(packageName, ps.getVolumeUuid()); } - int appDataDeletionFlags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL; + int appDataDeletionFlags = FLAG_STORAGE_DE | FLAG_STORAGE_CE | FLAG_STORAGE_EXTERNAL + | (flags & Installer.FLAG_CLEAR_APP_DATA_KEEP_ART_PROFILES); // Personal data is preserved if the DELETE_KEEP_DATA flag is on if ((flags & PackageManager.DELETE_KEEP_DATA) != 0) { if ((flags & PackageManager.DELETE_ARCHIVE) != 0) { -- GitLab From aa974cf42b0b6a69ec60727fe248a1d22be1fe14 Mon Sep 17 00:00:00 2001 From: Wilson Wu Date: Wed, 23 Oct 2024 01:56:28 +0000 Subject: [PATCH 262/459] Add null check in vibration util methods To avoid an exception when given ringtone uri is null, add null check in hasVibration method. Also add a check in getVibrationUri method to avoid any potential exception in the future. Flag: EXEMPT bugfix Fix: 374858125 Test: atest RingtoneManagerTest Test: atest RingtoneTest Test: atest RingerTest Change-Id: I51b28dcd349ac040273168aa6bac1427f20d7d95 --- media/java/android/media/Utils.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/media/java/android/media/Utils.java b/media/java/android/media/Utils.java index 41e9b65da93a..11bd221ec696 100644 --- a/media/java/android/media/Utils.java +++ b/media/java/android/media/Utils.java @@ -719,6 +719,9 @@ public class Utils { * @return {@code true} if the Uri has vibration parameter */ public static boolean hasVibration(Uri ringtoneUri) { + if (ringtoneUri == null) { + return false; + } final String vibrationUriString = ringtoneUri.getQueryParameter(VIBRATION_URI_PARAM); return vibrationUriString != null; } @@ -730,7 +733,10 @@ public class Utils { * @return parsed {@link Uri} of vibration parameter, {@code null} if the vibration parameter * is not found. */ - public static Uri getVibrationUri(Uri ringtoneUri) { + public static @Nullable Uri getVibrationUri(Uri ringtoneUri) { + if (ringtoneUri == null) { + return null; + } final String vibrationUriString = ringtoneUri.getQueryParameter(VIBRATION_URI_PARAM); if (vibrationUriString == null) { return null; -- GitLab From 455de7250742780cdcd6743eb3ec423cac39b90c Mon Sep 17 00:00:00 2001 From: Tomasz Wasilczyk Date: Tue, 22 Oct 2024 20:41:18 -0700 Subject: [PATCH 263/459] Add unit testing hook for TelephonyManager ISms Bug: 365800992 Test: atest com.android.internal.telephony.SmsMessageBodyTest Flag: TEST_ONLY Change-Id: I0b02f6a8602b009dd689f035653257e153f56e93 --- .../java/android/telephony/TelephonyManager.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index a7fe0cb0940c..fad59f8bb37b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -17277,6 +17277,18 @@ public class TelephonyManager { } } + /** + * Setup sISms for testing. + * + * @hide + */ + @VisibleForTesting + public static void setupISmsForTest(ISms iSms) { + synchronized (sCacheLock) { + sISms = iSms; + } + } + /** * Whether device can connect to 5G network when two SIMs are active. * -- GitLab From 652ef2a4dc98beeca5058db3f533f94ee6033e68 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Fri, 4 Oct 2024 23:54:59 +0000 Subject: [PATCH 264/459] Fix drag flag logs - The util method was previously only printing the first matching flag Flag: EXEMPT bugfix Bug: 375083991 Test: N/a Change-Id: I0aac84efc4008dfe18df1c389c0b85da154f7242 --- .../wm/shell/draganddrop/DragUtils.java | 30 ++++++++++++------- .../android/server/wm/DragDropController.java | 2 +- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java index 22cfa328bfda..248a1124cd86 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/draganddrop/DragUtils.java @@ -125,25 +125,35 @@ public class DragUtils { StringJoiner str = new StringJoiner("|"); if ((dragFlags & DRAG_FLAG_GLOBAL) != 0) { str.add("GLOBAL"); - } else if ((dragFlags & DRAG_FLAG_GLOBAL_URI_READ) != 0) { + } + if ((dragFlags & DRAG_FLAG_GLOBAL_URI_READ) != 0) { str.add("GLOBAL_URI_READ"); - } else if ((dragFlags & DRAG_FLAG_GLOBAL_URI_WRITE) != 0) { + } + if ((dragFlags & DRAG_FLAG_GLOBAL_URI_WRITE) != 0) { str.add("GLOBAL_URI_WRITE"); - } else if ((dragFlags & DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION) != 0) { + } + if ((dragFlags & DRAG_FLAG_GLOBAL_PERSISTABLE_URI_PERMISSION) != 0) { str.add("GLOBAL_PERSISTABLE_URI_PERMISSION"); - } else if ((dragFlags & DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION) != 0) { + } + if ((dragFlags & DRAG_FLAG_GLOBAL_PREFIX_URI_PERMISSION) != 0) { str.add("GLOBAL_PREFIX_URI_PERMISSION"); - } else if ((dragFlags & DRAG_FLAG_OPAQUE) != 0) { + } + if ((dragFlags & DRAG_FLAG_OPAQUE) != 0) { str.add("OPAQUE"); - } else if ((dragFlags & DRAG_FLAG_ACCESSIBILITY_ACTION) != 0) { + } + if ((dragFlags & DRAG_FLAG_ACCESSIBILITY_ACTION) != 0) { str.add("ACCESSIBILITY_ACTION"); - } else if ((dragFlags & DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION) != 0) { + } + if ((dragFlags & DRAG_FLAG_REQUEST_SURFACE_FOR_RETURN_ANIMATION) != 0) { str.add("REQUEST_SURFACE_FOR_RETURN_ANIMATION"); - } else if ((dragFlags & DRAG_FLAG_GLOBAL_SAME_APPLICATION) != 0) { + } + if ((dragFlags & DRAG_FLAG_GLOBAL_SAME_APPLICATION) != 0) { str.add("GLOBAL_SAME_APPLICATION"); - } else if ((dragFlags & DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG) != 0) { + } + if ((dragFlags & DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG) != 0) { str.add("START_INTENT_SENDER_ON_UNHANDLED_DRAG"); - } else if ((dragFlags & DRAG_FLAG_HIDE_CALLING_TASK_ON_DRAG_START) != 0) { + } + if ((dragFlags & DRAG_FLAG_HIDE_CALLING_TASK_ON_DRAG_START) != 0) { str.add("HIDE_CALLING_TASK_ON_DRAG_START"); } return str.toString(); diff --git a/services/core/java/com/android/server/wm/DragDropController.java b/services/core/java/com/android/server/wm/DragDropController.java index c849a37ede53..258a87eae196 100644 --- a/services/core/java/com/android/server/wm/DragDropController.java +++ b/services/core/java/com/android/server/wm/DragDropController.java @@ -156,7 +156,7 @@ class DragDropController { SurfaceControl surface, int touchSource, int touchDeviceId, int touchPointerId, float touchX, float touchY, float thumbCenterX, float thumbCenterY, ClipData data) { if (DEBUG_DRAG) { - Slog.d(TAG_WM, "perform drag: win=" + window + " surface=" + surface + " flags=" + + Slog.d(TAG_WM, "perform drag: win=" + window + " surface=" + surface + " flags=0x" + Integer.toHexString(flags) + " data=" + data + " touch(" + touchX + "," + touchY + ") thumb center(" + thumbCenterX + "," + thumbCenterY + ")"); } -- GitLab From bac53a6171d4f198645079981537a236ba779f8c Mon Sep 17 00:00:00 2001 From: Yiyi Shen Date: Wed, 23 Oct 2024 12:03:24 +0800 Subject: [PATCH 265/459] [Audiosharing] Add rounded background with different radius Test: manual Flag: com.android.settingslib.flags.enable_le_audio_sharing Bug: 366149567 Change-Id: I4555f3665639b05e7b5d12e30c517454d26351a2 --- .../audio_sharing_rounded_bg_ripple.xml | 8 ++++- ...udio_sharing_rounded_bg_ripple_bottom.xml} | 21 ++++++++----- .../audio_sharing_rounded_bg_ripple_top.xml | 31 +++++++++++++++++++ 3 files changed, 52 insertions(+), 8 deletions(-) rename packages/SettingsLib/res/drawable/{audio_sharing_rounded_bg.xml => audio_sharing_rounded_bg_ripple_bottom.xml} (55%) create mode 100644 packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_top.xml diff --git a/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple.xml b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple.xml index 18696c627ec6..91a95a51fae2 100644 --- a/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple.xml +++ b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple.xml @@ -16,6 +16,12 @@ --> - + + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg.xml b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_bottom.xml similarity index 55% rename from packages/SettingsLib/res/drawable/audio_sharing_rounded_bg.xml rename to packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_bottom.xml index 35517ea0ec11..cce8a75a3385 100644 --- a/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg.xml +++ b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_bottom.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + android:color="?android:attr/colorControlHighlight"> + + + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_top.xml b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_top.xml new file mode 100644 index 000000000000..140419705dd5 --- /dev/null +++ b/packages/SettingsLib/res/drawable/audio_sharing_rounded_bg_ripple_top.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + \ No newline at end of file -- GitLab From d0736c2214c10b18af9cab55cf73877b33caaa4c Mon Sep 17 00:00:00 2001 From: Toshiki Kikuchi Date: Wed, 23 Oct 2024 13:30:42 +0900 Subject: [PATCH 266/459] Add enable_display_windowing_mode_switching flag Flag: EXEMPT adding flag Bug: 374849026 Test: m Change-Id: I2fd607d7f40b6f242123a2a19dd67f4031befe81 --- .../android/window/flags/lse_desktop_experience.aconfig | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/java/android/window/flags/lse_desktop_experience.aconfig b/core/java/android/window/flags/lse_desktop_experience.aconfig index a0d58d5a0c76..b805f5a2734b 100644 --- a/core/java/android/window/flags/lse_desktop_experience.aconfig +++ b/core/java/android/window/flags/lse_desktop_experience.aconfig @@ -355,3 +355,10 @@ flag { description: "Enables keyboard shortcuts for resizing tasks in desktop mode." bug: "335819608" } + +flag { + name: "enable_display_windowing_mode_switching" + namespace: "lse_desktop_experience" + description: "Change the default display's windowing mode to freeform when display connected in extended mode." + bug: "374849026" +} -- GitLab From 0bd19ff7cb9deead40ffcdb319e6fffc3a183d43 Mon Sep 17 00:00:00 2001 From: Stefan Andonian Date: Tue, 15 Oct 2024 04:29:57 +0000 Subject: [PATCH 267/459] [Record Issue QS Tile] Allow Bug report flow to also have screen recording metadata Bug: 372973430 Test: Verified that the whole flow worked fine locally. Flag: EXEMPT small update Change-Id: I794a4c1cfb972a9aa0f5a3165671f7bfbdcffda7 --- core/java/android/app/IActivityManager.aidl | 2 +- .../shell/BugreportProgressService.java | 29 +++++++++++-------- .../IssueRecordingServiceSessionTest.kt | 2 +- .../IssueRecordingServiceSession.kt | 11 ++++++- .../server/am/ActivityManagerService.java | 15 +++++----- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index ffb920b907ab..f880901429f7 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -501,7 +501,7 @@ interface IActivityManager { in String shareDescription); void requestInteractiveBugReport(); - void requestBugReportWithExtraAttachment(in Uri extraAttachment); + void requestBugReportWithExtraAttachments(in List extraAttachment); void requestFullBugReport(); void requestRemoteBugReport(long nonce); boolean launchBugReportHandlerApp(); diff --git a/packages/Shell/src/com/android/shell/BugreportProgressService.java b/packages/Shell/src/com/android/shell/BugreportProgressService.java index bcfd8f620f9c..0a68e6791df5 100644 --- a/packages/Shell/src/com/android/shell/BugreportProgressService.java +++ b/packages/Shell/src/com/android/shell/BugreportProgressService.java @@ -90,10 +90,10 @@ import com.android.internal.app.ChooserActivity; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; -import libcore.io.Streams; - import com.google.android.collect.Lists; +import libcore.io.Streams; + import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.File; @@ -171,8 +171,8 @@ public class BugreportProgressService extends Service { static final String EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION"; static final String EXTRA_ORIGINAL_INTENT = "android.intent.extra.ORIGINAL_INTENT"; static final String EXTRA_INFO = "android.intent.extra.INFO"; - static final String EXTRA_EXTRA_ATTACHMENT_URI = - "android.intent.extra.EXTRA_ATTACHMENT_URI"; + static final String EXTRA_EXTRA_ATTACHMENT_URIS = + "android.intent.extra.EXTRA_ATTACHMENT_URIS"; private static final int MSG_SERVICE_COMMAND = 1; private static final int MSG_DELAYED_SCREENSHOT = 2; @@ -682,10 +682,11 @@ public class BugreportProgressService extends Service { long nonce = intent.getLongExtra(EXTRA_BUGREPORT_NONCE, 0); String baseName = getBugreportBaseName(bugreportType); String name = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()); - Uri extraAttachment = intent.getParcelableExtra(EXTRA_EXTRA_ATTACHMENT_URI, Uri.class); + List extraAttachments = + intent.getParcelableArrayListExtra(EXTRA_EXTRA_ATTACHMENT_URIS, Uri.class); BugreportInfo info = new BugreportInfo(mContext, baseName, name, shareTitle, - shareDescription, bugreportType, mBugreportsDir, nonce, extraAttachment); + shareDescription, bugreportType, mBugreportsDir, nonce, extraAttachments); synchronized (mLock) { if (info.bugreportFile.exists()) { Log.e(TAG, "Failed to start bugreport generation, the requested bugreport file " @@ -1233,9 +1234,13 @@ public class BugreportProgressService extends Service { clipData.addItem(new ClipData.Item(null, null, null, screenshotUri)); attachments.add(screenshotUri); } - if (info.extraAttachment != null) { - clipData.addItem(new ClipData.Item(null, null, null, info.extraAttachment)); - attachments.add(info.extraAttachment); + if (info.extraAttachments != null) { + info.extraAttachments.forEach(it -> { + if (it != null) { + clipData.addItem(new ClipData.Item(null, null, null, it)); + attachments.add(it); + } + }); } intent.setClipData(clipData); intent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, attachments); @@ -2096,7 +2101,7 @@ public class BugreportProgressService extends Service { final long nonce; @Nullable - public Uri extraAttachment = null; + public List extraAttachments = null; private final Object mLock = new Object(); @@ -2106,7 +2111,7 @@ public class BugreportProgressService extends Service { BugreportInfo(Context context, String baseName, String name, @Nullable String shareTitle, @Nullable String shareDescription, @BugreportParams.BugreportMode int type, File bugreportsDir, long nonce, - @Nullable Uri extraAttachment) { + @Nullable List extraAttachments) { this.context = context; this.name = this.initialName = name; this.shareTitle = shareTitle == null ? "" : shareTitle; @@ -2115,7 +2120,7 @@ public class BugreportProgressService extends Service { this.nonce = nonce; this.baseName = baseName; this.bugreportFile = new File(bugreportsDir, getFileName(this, ".zip")); - this.extraAttachment = extraAttachment; + this.extraAttachments = extraAttachments; } void createBugreportFile() { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt index 9dbcf18b2416..aceaab8206a2 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/recordissue/IssueRecordingServiceSessionTest.kt @@ -115,7 +115,7 @@ class IssueRecordingServiceSessionTest : SysuiTestCase() { underTest.share(0, uri) bgExecutor.runAllReady() - verify(iActivityManager).requestBugReportWithExtraAttachment(uri) + verify(iActivityManager).requestBugReportWithExtraAttachments(any()) } @Test diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt index 06407acb62d0..43539335d8e4 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingServiceSession.kt @@ -18,6 +18,7 @@ package com.android.systemui.recordissue import android.app.IActivityManager import android.app.NotificationManager +import android.content.Intent import android.net.Uri import android.os.UserHandle import android.provider.Settings @@ -27,6 +28,7 @@ import com.android.systemui.settings.UserContextProvider import com.android.traceur.PresetTraceConfigs import java.util.concurrent.Executor +private const val SHELL_PACKAGE = "com.android.shell" private const val NOTIFY_SESSION_ENDED_SETTING = "should_notify_trace_session_ended" private const val DISABLED = 0 @@ -86,7 +88,14 @@ class IssueRecordingServiceSession( } } if (takeBugReport) { - iActivityManager.requestBugReportWithExtraAttachment(screenRecording) + screenRecordingUris.forEach { + userContextProvider.userContext.grantUriPermission( + SHELL_PACKAGE, + it, + Intent.FLAG_GRANT_READ_URI_PERMISSION, + ) + } + iActivityManager.requestBugReportWithExtraAttachments(screenRecordingUris) } else { traceurConnection.shareTraces(screenRecordingUris) } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6ba851423219..a6189d2148fa 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -632,8 +632,8 @@ public class ActivityManagerService extends IActivityManager.Stub static final String EXTRA_DESCRIPTION = "android.intent.extra.DESCRIPTION"; static final String EXTRA_BUGREPORT_TYPE = "android.intent.extra.BUGREPORT_TYPE"; static final String EXTRA_BUGREPORT_NONCE = "android.intent.extra.BUGREPORT_NONCE"; - static final String EXTRA_EXTRA_ATTACHMENT_URI = - "android.intent.extra.EXTRA_ATTACHMENT_URI"; + static final String EXTRA_EXTRA_ATTACHMENT_URIS = + "android.intent.extra.EXTRA_ATTACHMENT_URIS"; /** * The maximum number of bytes that {@link #setProcessStateSummary} accepts. @@ -7660,7 +7660,7 @@ public class ActivityManagerService extends IActivityManager.Stub */ public void requestBugReportWithDescription(@Nullable String shareTitle, @Nullable String shareDescription, int bugreportType, long nonce, - @Nullable Uri extraAttachment) { + @Nullable List extraAttachments) { String type = null; switch (bugreportType) { case BugreportParams.BUGREPORT_MODE_FULL: @@ -7715,8 +7715,9 @@ public class ActivityManagerService extends IActivityManager.Stub triggerShellBugreport.setPackage(SHELL_APP_PACKAGE); triggerShellBugreport.putExtra(EXTRA_BUGREPORT_TYPE, bugreportType); triggerShellBugreport.putExtra(EXTRA_BUGREPORT_NONCE, nonce); - if (extraAttachment != null) { - triggerShellBugreport.putExtra(EXTRA_EXTRA_ATTACHMENT_URI, extraAttachment); + if (extraAttachments != null && !extraAttachments.isEmpty()) { + triggerShellBugreport.putParcelableArrayListExtra(EXTRA_EXTRA_ATTACHMENT_URIS, + new ArrayList(extraAttachments)); triggerShellBugreport.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } triggerShellBugreport.addFlags(Intent.FLAG_RECEIVER_FOREGROUND); @@ -7775,9 +7776,9 @@ public class ActivityManagerService extends IActivityManager.Stub * Takes an interactive bugreport with a progress notification. Also attaches given file uri. */ @Override - public void requestBugReportWithExtraAttachment(@NonNull Uri extraAttachment) { + public void requestBugReportWithExtraAttachments(@NonNull List extraAttachments) { requestBugReportWithDescription(null, null, BugreportParams.BUGREPORT_MODE_INTERACTIVE, 0L, - extraAttachment); + extraAttachments); } /** -- GitLab From e5b2400c6f91531830187ed92e58a97a76f1aaa8 Mon Sep 17 00:00:00 2001 From: Atneya Nair Date: Tue, 22 Oct 2024 21:48:41 -0700 Subject: [PATCH 268/459] appops: Consolidate check/note/startOp validation Pull out common argument validation logic from these three methods. This ensures that checkOp validates packages instead of accepting uid/package mismatches. It also upgrades note/start to return MODE_ERROR on invalid vdi and unresolvable package name. Test: CtsAppOpsTestCases Flag: android.permission.flags.check_op_validate_package Bug: 294609684 Change-Id: I3b022348b22ed5a935e0c9cf6a73ad464e72d028 --- .../android/server/appop/AppOpsService.java | 170 +++++++++++++----- 1 file changed, 123 insertions(+), 47 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index e0cf96fbccd0..339b697ae84c 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -71,6 +71,7 @@ import static android.content.Intent.EXTRA_REPLACING; import static android.content.pm.PermissionInfo.PROTECTION_DANGEROUS; import static android.content.pm.PermissionInfo.PROTECTION_FLAG_APPOP; import static android.permission.flags.Flags.deviceAwareAppOpNewSchemaEnabled; +import static android.permission.flags.Flags.checkOpValidatePackage; import static com.android.server.appop.AppOpsService.ModeCallback.ALL_OPS; @@ -2841,20 +2842,30 @@ public class AppOpsService extends IAppOpsService.Stub { private int checkOperationImpl(int code, int uid, String packageName, @Nullable String attributionTag, int virtualDeviceId, boolean raw) { - verifyIncomingOp(code); - if (!isValidVirtualDeviceId(virtualDeviceId)) { - Slog.w(TAG, - "checkOperationImpl returned MODE_IGNORED as virtualDeviceId " + virtualDeviceId - + " is invalid"); - return AppOpsManager.MODE_IGNORED; - } - if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { - return AppOpsManager.opToDefaultMode(code); - } + String resolvedPackageName; + if (!shouldUseNewCheckOp()) { + verifyIncomingOp(code); + if (!isValidVirtualDeviceId(virtualDeviceId)) { + Slog.w(TAG, "checkOperationImpl returned MODE_IGNORED as virtualDeviceId " + + virtualDeviceId + " is invalid"); + return AppOpsManager.MODE_IGNORED; + } + if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { + return AppOpsManager.opToDefaultMode(code); + } - String resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); - if (resolvedPackageName == null) { - return AppOpsManager.MODE_IGNORED; + resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); + if (resolvedPackageName == null) { + return AppOpsManager.MODE_IGNORED; + } + } else { + // Note, this flag changes the behavior in this case: invalid packages now don't + // succeed checkOp + resolvedPackageName = validateOpRequest(code, uid, packageName, + virtualDeviceId, false, "checkOperation"); + if (resolvedPackageName == null) { + return AppOpsManager.MODE_IGNORED; + } } return checkOperationUnchecked(code, uid, resolvedPackageName, attributionTag, virtualDeviceId, raw); @@ -3114,25 +3125,37 @@ public class AppOpsService extends IAppOpsService.Stub { @Nullable String attributionTag, int virtualDeviceId, boolean shouldCollectAsyncNotedOp, @Nullable String message, boolean shouldCollectMessage) { - verifyIncomingUid(uid); - verifyIncomingOp(code); - if (!isValidVirtualDeviceId(virtualDeviceId)) { - Slog.w(TAG, - "checkOperationImpl returned MODE_IGNORED as virtualDeviceId " + virtualDeviceId - + " is invalid"); - return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, - packageName); - } - if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { - return new SyncNotedAppOp(AppOpsManager.MODE_ERRORED, code, attributionTag, - packageName); - } + String resolvedPackageName; + if (!shouldUseNewCheckOp()) { + verifyIncomingUid(uid); + verifyIncomingOp(code); + if (!isValidVirtualDeviceId(virtualDeviceId)) { + Slog.w(TAG, "checkOperationImpl returned MODE_IGNORED as virtualDeviceId " + + virtualDeviceId + " is invalid"); + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } + if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { + return new SyncNotedAppOp(AppOpsManager.MODE_ERRORED, code, attributionTag, + packageName); + } - String resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); - if (resolvedPackageName == null) { - return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, - packageName); + resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); + if (resolvedPackageName == null) { + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } + } else { + // Note, this flag changes the behavior in this case: + // invalid package is now IGNORE instead of ERROR for consistency + resolvedPackageName = validateOpRequest(code, uid, packageName, + virtualDeviceId, true, "noteOperation"); + if (resolvedPackageName == null) { + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } } + return noteOperationUnchecked(code, uid, resolvedPackageName, attributionTag, virtualDeviceId, Process.INVALID_UID, null, null, Context.DEVICE_ID_DEFAULT, AppOpsManager.OP_FLAG_SELF, shouldCollectAsyncNotedOp, @@ -3569,24 +3592,35 @@ public class AppOpsService extends IAppOpsService.Stub { boolean startIfModeDefault, boolean shouldCollectAsyncNotedOp, @NonNull String message, boolean shouldCollectMessage, @AttributionFlags int attributionFlags, int attributionChainId) { - verifyIncomingUid(uid); - verifyIncomingOp(code); - if (!isValidVirtualDeviceId(virtualDeviceId)) { - Slog.w(TAG, - "startOperationImpl returned MODE_IGNORED as virtualDeviceId " + virtualDeviceId - + " is invalid"); - return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, - packageName); - } - if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { - return new SyncNotedAppOp(AppOpsManager.MODE_ERRORED, code, attributionTag, - packageName); - } + String resolvedPackageName; + if (!shouldUseNewCheckOp()) { + verifyIncomingUid(uid); + verifyIncomingOp(code); + if (!isValidVirtualDeviceId(virtualDeviceId)) { + Slog.w(TAG, "startOperationImpl returned MODE_IGNORED as virtualDeviceId " + + virtualDeviceId + " is invalid"); + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } + if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { + return new SyncNotedAppOp(AppOpsManager.MODE_ERRORED, code, attributionTag, + packageName); + } - String resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); - if (resolvedPackageName == null) { - return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, - packageName); + resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); + if (resolvedPackageName == null) { + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } + } else { + // Note, this flag changes the behavior in this case: + // invalid package is now IGNORE instead of ERROR for consistency + resolvedPackageName = validateOpRequest(code, uid, packageName, + virtualDeviceId, true, "startOperation"); + if (resolvedPackageName == null) { + return new SyncNotedAppOp(AppOpsManager.MODE_IGNORED, code, attributionTag, + packageName); + } } // As a special case for OP_RECORD_AUDIO_HOTWORD, OP_RECEIVE_AMBIENT_TRIGGER_AUDIO and @@ -4308,6 +4342,48 @@ public class AppOpsService extends IAppOpsService.Stub { || (permInfo.getProtectionFlags() & PROTECTION_FLAG_APPOP) != 0; } + private boolean shouldUseNewCheckOp() { + final long identity = Binder.clearCallingIdentity(); + try { + return checkOpValidatePackage(); + } catch (Exception e) { + // before device provider init, only on old storage + return true; + } finally { + Binder.restoreCallingIdentity(identity); + } + } + + /** + * Validates arguments for a particular op request + * @param shouldVerifyUid - If the calling uid needs perms for other uids, due to the method + * being an appop write. + * @param methodName - For logging purposes + * @return The resolved package for the request, null on any failure + */ + private @Nullable String validateOpRequest(int code, int uid, String packageName, int vdi, + boolean shouldVerifyUid, String methodName) { + verifyIncomingOp(code); + if (shouldVerifyUid) { + verifyIncomingUid(uid); + } + if (!isValidVirtualDeviceId(vdi)) { + Slog.w(TAG, methodName + ": error due to virtualDeviceId " + vdi + " is invalid"); + return null; + } + if (!isIncomingPackageValid(packageName, UserHandle.getUserId(uid))) { + Slog.w(TAG, methodName + ": error due to package: " + packageName + + " is invalid for " + uid); + return null; + } + String resolvedPackageName = AppOpsManager.resolvePackageName(uid, packageName); + if (resolvedPackageName == null) { + Slog.w(TAG, methodName + ": error due to unable to resolve uid: " + uid); + return null; + } + return resolvedPackageName; + } + private void verifyIncomingProxyUid(@NonNull AttributionSource attributionSource) { if (attributionSource.getUid() == Binder.getCallingUid()) { return; -- GitLab From 4be8065070b7fc47c87de41ce8526a56435d4102 Mon Sep 17 00:00:00 2001 From: Chen Bai Date: Wed, 16 Oct 2024 00:16:05 -0700 Subject: [PATCH 269/459] brightness: apply bedtime mode specific curve Flag: com.android.server.display.feature.flags.auto_brightness_mode_bedtime_wear Test: DisplayPowerControllerTest Test: AutomaticBrightnessStrategyTest Bug: 373781809 Change-Id: Id13700cc465b34bb56910e919b61cf6acdb5c72d --- .../display/DisplayPowerController.java | 44 +++++++--- .../DisplayBrightnessController.java | 10 ++- .../DisplayBrightnessStrategySelector.java | 6 +- .../StrategySelectionNotifyRequest.java | 15 +++- .../brightness/StrategySelectionRequest.java | 13 ++- .../strategy/AutomaticBrightnessStrategy.java | 46 +++++++---- .../AutomaticBrightnessStrategy2.java | 2 +- .../display/DisplayPowerControllerTest.java | 57 ++++++++++++- .../DisplayBrightnessControllerTest.java | 5 +- ...DisplayBrightnessStrategySelectorTest.java | 40 ++++----- .../AutoBrightnessFallbackStrategyTest.java | 21 +++-- .../AutomaticBrightnessStrategy2Test.java | 24 ++++-- .../AutomaticBrightnessStrategyTest.java | 82 ++++++++++++++----- 13 files changed, 272 insertions(+), 93 deletions(-) diff --git a/services/core/java/com/android/server/display/DisplayPowerController.java b/services/core/java/com/android/server/display/DisplayPowerController.java index 5c8430b8198f..a9ed0aaf324b 100644 --- a/services/core/java/com/android/server/display/DisplayPowerController.java +++ b/services/core/java/com/android/server/display/DisplayPowerController.java @@ -507,6 +507,9 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call // The time of inactivity after which the stylus can be assumed to be no longer in use. private long mIdleStylusTimeoutMillisConfig = 0; + // Whether wear bedtime mode is enabled in the settings. + private boolean mIsWearBedtimeModeEnabled; + /** * Creates the display power controller. */ @@ -563,6 +566,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call mBrightnessTracker = brightnessTracker; mOnBrightnessChangeRunnable = onBrightnessChangeRunnable; + mIsWearBedtimeModeEnabled = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.Wearable.BEDTIME_MODE, /* def= */ 0) == 1; + mContext.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(Settings.Global.Wearable.BEDTIME_MODE), + false /*notifyForDescendants*/, mSettingsObserver, UserHandle.USER_ALL); + final Resources resources = context.getResources(); // DOZE AND DIM SETTINGS @@ -1166,8 +1175,7 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call screenBrightnessThresholds, ambientBrightnessThresholdsIdle, screenBrightnessThresholdsIdle, mContext, mBrightnessRangeController, mBrightnessThrottler, mDisplayDeviceConfig.getAmbientHorizonShort(), - mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits, - mBrightnessClamperController, mFlags); + mDisplayDeviceConfig.getAmbientHorizonLong(), userLux, userNits, mFlags); mDisplayBrightnessController.setUpAutoBrightness( mAutomaticBrightnessController, mSensorManager, mDisplayDeviceConfig, mHandler, defaultModeBrightnessMapper, mIsEnabled, mLeadDisplayId); @@ -1386,9 +1394,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call final boolean useDozeBrightness = mFlags.isNormalBrightnessForDozeParameterEnabled() ? (!mPowerRequest.useNormalBrightnessForDoze && mPowerRequest.policy == POLICY_DOZE) || Display.isDozeState(state) : Display.isDozeState(state); - - DisplayBrightnessState displayBrightnessState = mDisplayBrightnessController - .updateBrightness(mPowerRequest, state, mDisplayOffloadSession); + DisplayBrightnessState displayBrightnessState = + mDisplayBrightnessController.updateBrightness( + mPowerRequest, + state, + mDisplayOffloadSession, + mIsWearBedtimeModeEnabled); float brightnessState = displayBrightnessState.getBrightness(); float rawBrightnessState = displayBrightnessState.getBrightness(); mBrightnessReasonTemp.set(displayBrightnessState.getBrightnessReason()); @@ -1429,16 +1440,24 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call && !mAutomaticBrightnessController.isInIdleMode()) { // Set sendUpdate to false, we're already in updatePowerState() so there's no need // to trigger it again - mAutomaticBrightnessController.switchMode(useDozeBrightness - ? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT, - /* sendUpdate= */ false); + if (useDozeBrightness) { + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_DOZE, + /* sendUpdate= */ false); + } else if (mFlags.isAutoBrightnessModeBedtimeWearEnabled() + && mIsWearBedtimeModeEnabled) { + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + /* sendUpdate= */ false); + } else { + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT, + /* sendUpdate= */ false); + } } mAutomaticBrightnessStrategy.setAutoBrightnessState(state, allowAutoBrightnessWhileDozing, mBrightnessReasonTemp.getReason(), mPowerRequest.policy, mPowerRequest.useNormalBrightnessForDoze, mDisplayBrightnessController.getLastUserSetScreenBrightness(), - userSetBrightnessChanged); + userSetBrightnessChanged, mIsWearBedtimeModeEnabled); // If the brightness is already set then it's been overridden by something other than // the user, or is a temporary adjustment. @@ -3172,6 +3191,12 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call + autoBrightnessPresetToString(preset)); setUpAutoBrightness(mContext, mHandler); sendUpdatePowerState(); + } else if (uri.equals( + Settings.Global.getUriFor(Settings.Global.Wearable.BEDTIME_MODE))) { + mIsWearBedtimeModeEnabled = Settings.Global.getInt(mContext.getContentResolver(), + Settings.Global.Wearable.BEDTIME_MODE, /* def= */ 0) == 1; + Slog.i(mTag, "Update for bedtime mode. Enable: " + mIsWearBedtimeModeEnabled); + sendUpdatePowerState(); } else { handleSettingsChange(); } @@ -3275,7 +3300,6 @@ final class DisplayPowerController implements AutomaticBrightnessController.Call BrightnessRangeController brightnessModeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits, - BrightnessClamperController brightnessClamperController, DisplayManagerFlags displayManagerFlags) { return new AutomaticBrightnessController(callbacks, looper, sensorManager, lightSensor, diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java index 4bd980822e46..5b12dfb951d5 100644 --- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java +++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessController.java @@ -150,12 +150,13 @@ public final class DisplayBrightnessController { public DisplayBrightnessState updateBrightness( DisplayManagerInternal.DisplayPowerRequest displayPowerRequest, int targetDisplayState, - DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) { + DisplayManagerInternal.DisplayOffloadSession displayOffloadSession, + boolean isBedtimeModeWearEnabled) { DisplayBrightnessState state; synchronized (mLock) { mDisplayBrightnessStrategy = mDisplayBrightnessStrategySelector.selectStrategy( constructStrategySelectionRequest(displayPowerRequest, targetDisplayState, - displayOffloadSession)); + displayOffloadSession, isBedtimeModeWearEnabled)); state = mDisplayBrightnessStrategy .updateBrightness(constructStrategyExecutionRequest(displayPowerRequest)); } @@ -629,7 +630,8 @@ public final class DisplayBrightnessController { private StrategySelectionRequest constructStrategySelectionRequest( DisplayManagerInternal.DisplayPowerRequest displayPowerRequest, int targetDisplayState, - DisplayManagerInternal.DisplayOffloadSession displayOffloadSession) { + DisplayManagerInternal.DisplayOffloadSession displayOffloadSession, + boolean isBedtimeModeEnabled) { boolean userSetBrightnessChanged = updateUserSetScreenBrightness(); float lastUserSetScreenBrightness; synchronized (mLock) { @@ -637,7 +639,7 @@ public final class DisplayBrightnessController { } return new StrategySelectionRequest(displayPowerRequest, targetDisplayState, lastUserSetScreenBrightness, userSetBrightnessChanged, displayOffloadSession, - mIsStylusBeingUsed); + mIsStylusBeingUsed, isBedtimeModeEnabled); } private StrategyExecutionRequest constructStrategyExecutionRequest( diff --git a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java index ded7447c5fbc..60c1b8ff4db9 100644 --- a/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java +++ b/services/core/java/com/android/server/display/brightness/DisplayBrightnessStrategySelector.java @@ -305,7 +305,8 @@ public class DisplayBrightnessStrategySelector { strategySelectionRequest.getDisplayPowerRequest().policy, strategySelectionRequest.getDisplayPowerRequest().useNormalBrightnessForDoze, strategySelectionRequest.getLastUserSetScreenBrightness(), - strategySelectionRequest.isUserSetBrightnessChanged()); + strategySelectionRequest.isUserSetBrightnessChanged(), + strategySelectionRequest.isWearBedtimeModeEnabled()); return !strategySelectionRequest.isStylusBeingUsed() && mAutomaticBrightnessStrategy1.isAutoBrightnessValid(); } @@ -320,7 +321,8 @@ public class DisplayBrightnessStrategySelector { strategySelectionRequest.getLastUserSetScreenBrightness(), strategySelectionRequest.isUserSetBrightnessChanged(), mAllowAutoBrightnessWhileDozing, - getAutomaticBrightnessStrategy().shouldUseAutoBrightness()); + getAutomaticBrightnessStrategy().shouldUseAutoBrightness(), + strategySelectionRequest.isWearBedtimeModeEnabled()); } private void postProcess(StrategySelectionNotifyRequest strategySelectionNotifyRequest) { diff --git a/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java b/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java index bfa90e297059..c2bec5ffe052 100644 --- a/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java +++ b/services/core/java/com/android/server/display/brightness/StrategySelectionNotifyRequest.java @@ -47,13 +47,15 @@ public final class StrategySelectionNotifyRequest { private final boolean mAllowAutoBrightnessWhileDozingConfig; // True if the auto brightness is enabled in the settings private final boolean mIsAutoBrightnessEnabled; + // True if wear bedtime mode is enabled in the settings. + private final boolean mIsBedtimeModeWearEnabled; public StrategySelectionNotifyRequest( DisplayManagerInternal.DisplayPowerRequest displayPowerRequest, int targetDisplayState, DisplayBrightnessStrategy displayBrightnessStrategy, float lastUserSetScreenBrightness, boolean userSetBrightnessChanged, boolean allowAutoBrightnessWhileDozingConfig, - boolean isAutoBrightnessEnabled) { + boolean isAutoBrightnessEnabled, boolean isBedtimeModeWearEnabled) { mDisplayPowerRequest = displayPowerRequest; mTargetDisplayState = targetDisplayState; mSelectedDisplayBrightnessStrategy = displayBrightnessStrategy; @@ -61,6 +63,7 @@ public final class StrategySelectionNotifyRequest { mUserSetBrightnessChanged = userSetBrightnessChanged; mAllowAutoBrightnessWhileDozingConfig = allowAutoBrightnessWhileDozingConfig; mIsAutoBrightnessEnabled = isAutoBrightnessEnabled; + mIsBedtimeModeWearEnabled = isBedtimeModeWearEnabled; } public DisplayBrightnessStrategy getSelectedDisplayBrightnessStrategy() { @@ -81,7 +84,8 @@ public final class StrategySelectionNotifyRequest { && mLastUserSetScreenBrightness == other.getLastUserSetScreenBrightness() && mAllowAutoBrightnessWhileDozingConfig == other.isAllowAutoBrightnessWhileDozingConfig() - && mIsAutoBrightnessEnabled == other.isAutoBrightnessEnabled(); + && mIsAutoBrightnessEnabled == other.isAutoBrightnessEnabled() + && mIsBedtimeModeWearEnabled == other.isBedtimeModeWearEnabled(); } @Override @@ -99,6 +103,10 @@ public final class StrategySelectionNotifyRequest { return mUserSetBrightnessChanged; } + public boolean isBedtimeModeWearEnabled() { + return mIsBedtimeModeWearEnabled; + } + public DisplayManagerInternal.DisplayPowerRequest getDisplayPowerRequest() { return mDisplayPowerRequest; } @@ -126,6 +134,7 @@ public final class StrategySelectionNotifyRequest { + " mLastUserSetScreenBrightness=" + mLastUserSetScreenBrightness + " mUserSetBrightnessChanged=" + mUserSetBrightnessChanged + " mAllowAutoBrightnessWhileDozingConfig=" + mAllowAutoBrightnessWhileDozingConfig - + " mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled; + + " mIsAutoBrightnessEnabled=" + mIsAutoBrightnessEnabled + + " mIsBedtimeModeWearEnabled" + mIsBedtimeModeWearEnabled; } } diff --git a/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java b/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java index 5c1f03d877a6..2077c9dfb79c 100644 --- a/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java +++ b/services/core/java/com/android/server/display/brightness/StrategySelectionRequest.java @@ -42,17 +42,21 @@ public final class StrategySelectionRequest { private boolean mIsStylusBeingUsed; + private boolean mIsWearBedtimeModeEnabled; + public StrategySelectionRequest(DisplayManagerInternal.DisplayPowerRequest displayPowerRequest, int targetDisplayState, float lastUserSetScreenBrightness, boolean userSetBrightnessChanged, DisplayManagerInternal.DisplayOffloadSession displayOffloadSession, - boolean isStylusBeingUsed) { + boolean isStylusBeingUsed, + boolean isWearBedtimeModeEnabled) { mDisplayPowerRequest = displayPowerRequest; mTargetDisplayState = targetDisplayState; mLastUserSetScreenBrightness = lastUserSetScreenBrightness; mUserSetBrightnessChanged = userSetBrightnessChanged; mDisplayOffloadSession = displayOffloadSession; mIsStylusBeingUsed = isStylusBeingUsed; + mIsWearBedtimeModeEnabled = isWearBedtimeModeEnabled; } public DisplayManagerInternal.DisplayPowerRequest getDisplayPowerRequest() { @@ -72,6 +76,10 @@ public final class StrategySelectionRequest { return mUserSetBrightnessChanged; } + public boolean isWearBedtimeModeEnabled() { + return mIsWearBedtimeModeEnabled; + } + public DisplayManagerInternal.DisplayOffloadSession getDisplayOffloadSession() { return mDisplayOffloadSession; } @@ -91,7 +99,8 @@ public final class StrategySelectionRequest { && mLastUserSetScreenBrightness == other.getLastUserSetScreenBrightness() && mUserSetBrightnessChanged == other.isUserSetBrightnessChanged() && mDisplayOffloadSession.equals(other.getDisplayOffloadSession()) - && mIsStylusBeingUsed == other.isStylusBeingUsed(); + && mIsStylusBeingUsed == other.isStylusBeingUsed() + && mIsWearBedtimeModeEnabled == other.isWearBedtimeModeEnabled(); } @Override diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java index 2fdec78bbbda..ff73693d803b 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy.java @@ -17,6 +17,7 @@ package com.android.server.display.brightness.strategy; import static android.hardware.display.DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; @@ -132,10 +133,11 @@ public class AutomaticBrightnessStrategy extends AutomaticBrightnessStrategy2 public void setAutoBrightnessState(int targetDisplayState, boolean allowAutoBrightnessWhileDozingConfig, int brightnessReason, int policy, boolean useNormalBrightnessForDoze, float lastUserSetScreenBrightness, - boolean userSetBrightnessChanged) { + boolean userSetBrightnessChanged, boolean isBedtimeModeWearEnabled) { // We are still in the process of updating the power state, so there's no need to trigger // an update again - switchMode(targetDisplayState, useNormalBrightnessForDoze, policy, /* sendUpdate= */ false); + switchMode(targetDisplayState, useNormalBrightnessForDoze, policy, isBedtimeModeWearEnabled, + /* sendUpdate= */ false); // If the policy is POLICY_DOZE and the display state is not STATE_OFF, auto-brightness // should only be enabled if the config allows it @@ -349,7 +351,8 @@ public class AutomaticBrightnessStrategy extends AutomaticBrightnessStrategy2 strategySelectionNotifyRequest.getDisplayPowerRequest() .useNormalBrightnessForDoze, strategySelectionNotifyRequest.getLastUserSetScreenBrightness(), - strategySelectionNotifyRequest.isUserSetBrightnessChanged()); + strategySelectionNotifyRequest.isUserSetBrightnessChanged(), + strategySelectionNotifyRequest.isBedtimeModeWearEnabled()); } mIsConfigured = false; } @@ -505,18 +508,33 @@ public class AutomaticBrightnessStrategy extends AutomaticBrightnessStrategy2 } private void switchMode(int state, boolean useNormalBrightnessForDoze, int policy, - boolean sendUpdate) { - if (mDisplayManagerFlags.areAutoBrightnessModesEnabled() - && mAutomaticBrightnessController != null - && !mAutomaticBrightnessController.isInIdleMode()) { - - final boolean shouldUseDozeMode = - mDisplayManagerFlags.isNormalBrightnessForDozeParameterEnabled() - ? (!useNormalBrightnessForDoze && policy == POLICY_DOZE) - || Display.isDozeState(state) : Display.isDozeState(state); - mAutomaticBrightnessController.switchMode(shouldUseDozeMode - ? AUTO_BRIGHTNESS_MODE_DOZE : AUTO_BRIGHTNESS_MODE_DEFAULT, sendUpdate); + boolean isWearBedtimeModeEnabled, boolean sendUpdate) { + if (!mDisplayManagerFlags.areAutoBrightnessModesEnabled() + || mAutomaticBrightnessController == null + || mAutomaticBrightnessController.isInIdleMode()) { + return; + } + + final boolean shouldUseBedtimeMode = + mDisplayManagerFlags.isAutoBrightnessModeBedtimeWearEnabled() + && isWearBedtimeModeEnabled; + if (shouldUseBedtimeMode) { + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + sendUpdate); + return; } + + final boolean shouldUseDozeMode = + mDisplayManagerFlags.isNormalBrightnessForDozeParameterEnabled() + ? (!useNormalBrightnessForDoze && policy == POLICY_DOZE) + || Display.isDozeState(state) + : Display.isDozeState(state); + if (shouldUseDozeMode) { + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_DOZE, sendUpdate); + return; + } + + mAutomaticBrightnessController.switchMode(AUTO_BRIGHTNESS_MODE_DEFAULT, sendUpdate); } /** diff --git a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java index 5e79565f7c54..6e2e7e704997 100644 --- a/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java +++ b/services/core/java/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2.java @@ -109,7 +109,7 @@ public class AutomaticBrightnessStrategy2 { public void setAutoBrightnessState(int targetDisplayState, boolean allowAutoBrightnessWhileDozingConfig, int brightnessReason, int policy, boolean useNormalBrightnessForDoze, float lastUserSetScreenBrightness, - boolean userSetBrightnessChanged) { + boolean userSetBrightnessChanged, boolean isBedtimeModeEnabled) { // If the policy is POLICY_DOZE and the display state is not STATE_OFF, auto-brightness // should only be enabled if the config allows it final boolean autoBrightnessEnabledInDoze = allowAutoBrightnessWhileDozingConfig diff --git a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java index 9189c2f20d66..27fd1e6187bb 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/DisplayPowerControllerTest.java @@ -18,6 +18,7 @@ package com.android.server.display; import static com.android.dx.mockito.inline.extended.ExtendedMockito.doAnswer; import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify; +import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE; import static com.android.server.display.AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_IDLE; @@ -1290,7 +1291,6 @@ public final class DisplayPowerControllerTest { /* ambientLightHorizonLong= */ anyInt(), eq(lux), eq(nits), - any(BrightnessClamperController.class), any(DisplayManagerFlags.class) ); } @@ -1928,6 +1928,60 @@ public final class DisplayPowerControllerTest { .switchMode(eq(AUTO_BRIGHTNESS_MODE_DOZE), /* sendUpdate= */ anyBoolean()); } + @Test + public void testSwitchToBedtimeAutoBrightnessMode_wearBedtimeEnabledAndBrightRequest() { + when(mDisplayManagerFlagsMock.areAutoBrightnessModesEnabled()).thenReturn(true); + when(mDisplayManagerFlagsMock.isAutoBrightnessModeBedtimeWearEnabled()).thenReturn(true); + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.Wearable.BEDTIME_MODE, + /* value= */ 1); + mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); + when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); + + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.automaticBrightnessController) + .switchMode(eq(AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR), /* sendUpdate= */ anyBoolean()); + } + + @Test + public void testNotSwitchToBedtimeAutoBrightnessMode_wearBedtimeDisabled() { + when(mDisplayManagerFlagsMock.areAutoBrightnessModesEnabled()).thenReturn(true); + when(mDisplayManagerFlagsMock.isAutoBrightnessModeBedtimeWearEnabled()).thenReturn(true); + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.Wearable.BEDTIME_MODE, + /* value= */ 0); + mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); + when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_ON); + + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_BRIGHT; + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.automaticBrightnessController) + .switchMode(eq(AUTO_BRIGHTNESS_MODE_DEFAULT), /* sendUpdate= */ anyBoolean()); + } + + @Test + public void testSwitchToDozeAutoBrightnessMode_wearBedtimeEnabledAndDozeRequest() { + when(mDisplayManagerFlagsMock.areAutoBrightnessModesEnabled()).thenReturn(true); + when(mDisplayManagerFlagsMock.isAutoBrightnessModeBedtimeWearEnabled()).thenReturn(true); + Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.Wearable.BEDTIME_MODE, + /* value= */ 1); + mHolder = createDisplayPowerController(DISPLAY_ID, UNIQUE_ID); + when(mHolder.displayPowerState.getScreenState()).thenReturn(Display.STATE_DOZE); + + DisplayPowerRequest dpr = new DisplayPowerRequest(); + dpr.policy = DisplayPowerRequest.POLICY_DOZE; + mHolder.dpc.requestPowerState(dpr, /* waitForNegativeProximity= */ false); + advanceTime(1); // Run updatePowerState + + verify(mHolder.automaticBrightnessController) + .switchMode(eq(AUTO_BRIGHTNESS_MODE_DOZE), /* sendUpdate= */ anyBoolean()); + } + @Test public void testOnSwitchUserUpdatesBrightness() { int userSerial = 12345; @@ -2710,7 +2764,6 @@ public final class DisplayPowerControllerTest { BrightnessRangeController brightnessRangeController, BrightnessThrottler brightnessThrottler, int ambientLightHorizonShort, int ambientLightHorizonLong, float userLux, float userNits, - BrightnessClamperController brightnessClamperController, DisplayManagerFlags displayManagerFlags) { return mAutomaticBrightnessController; } diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java index b3baa5deb4a7..4f875c38b92f 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessControllerTest.java @@ -121,8 +121,9 @@ public final class DisplayBrightnessControllerTest { int targetDisplayState = Display.STATE_DOZE; when(mDisplayBrightnessStrategySelector.selectStrategy( any(StrategySelectionRequest.class))).thenReturn(displayBrightnessStrategy); - mDisplayBrightnessController.updateBrightness(displayPowerRequest, targetDisplayState, mock( - DisplayManagerInternal.DisplayOffloadSession.class)); + mDisplayBrightnessController.updateBrightness(displayPowerRequest, targetDisplayState, + mock(DisplayManagerInternal.DisplayOffloadSession.class), + /* isBedtimeModeWearEnabled= */ false); verify(displayBrightnessStrategy).updateBrightness( eq(new StrategyExecutionRequest(displayPowerRequest, DEFAULT_BRIGHTNESS, /* userSetBrightnessChanged= */ false, /* isStylusBeingUsed */ false))); diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java index fe1505162e24..b99a18c8e68c 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/DisplayBrightnessStrategySelectorTest.java @@ -199,7 +199,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mDozeBrightnessModeStrategy); } @@ -216,7 +216,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertNotEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mDozeBrightnessModeStrategy); } @@ -231,7 +231,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertNotEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mDozeBrightnessModeStrategy); } @@ -255,7 +255,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertNotEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_DOZE, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mDozeBrightnessModeStrategy); } @@ -266,7 +266,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_OFF, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mScreenOffBrightnessModeStrategy); } @@ -279,7 +279,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mOverrideBrightnessStrategy); } @@ -293,7 +293,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mTemporaryBrightnessStrategy); } @@ -308,7 +308,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mBoostBrightnessStrategy); } @@ -323,7 +323,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mInvalidBrightnessStrategy); } @@ -335,7 +335,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mFollowerBrightnessStrategy); } @@ -354,7 +354,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mOffloadBrightnessStrategy); } @@ -379,12 +379,13 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mAutomaticBrightnessStrategy); verify(mAutomaticBrightnessStrategy).setAutoBrightnessState(Display.STATE_ON, true, BrightnessReason.REASON_UNKNOWN, DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, - /* useNormalBrightnessForDoze= */ false, 0.1f, false); + /* useNormalBrightnessForDoze= */ false, 0.1f, false, + /* isBedtimeModeWearEnabled= */ false); } @@ -409,7 +410,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertNotEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_BEING_USED)), + STYLUS_IS_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mAutomaticBrightnessStrategy); } @@ -430,7 +431,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mAutoBrightnessFallbackStrategy); } @@ -449,7 +450,7 @@ public final class DisplayBrightnessStrategySelectorTest { mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED))); + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false))); } @Test @@ -468,7 +469,7 @@ public final class DisplayBrightnessStrategySelectorTest { assertEquals(mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)), + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)), mFallbackBrightnessStrategy); } @@ -484,12 +485,13 @@ public final class DisplayBrightnessStrategySelectorTest { mDisplayBrightnessStrategySelector.selectStrategy( new StrategySelectionRequest(displayPowerRequest, Display.STATE_ON, 0.1f, false, mDisplayOffloadSession, - STYLUS_IS_NOT_BEING_USED)); + STYLUS_IS_NOT_BEING_USED, /* isBedtimeModeWearEnabled= */ false)); StrategySelectionNotifyRequest strategySelectionNotifyRequest = new StrategySelectionNotifyRequest(displayPowerRequest, Display.STATE_ON, mFollowerBrightnessStrategy, 0.1f, - false, false, false); + false, false, false, + /* isBedtimeModeWearEnabled= */ false); for (DisplayBrightnessStrategy displayBrightnessStrategy : mDisplayBrightnessStrategySelector.mDisplayBrightnessStrategies) { diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java index 2a71af06e0c2..e3893c86a6de 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutoBrightnessFallbackStrategyTest.java @@ -150,7 +150,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(true); @@ -172,7 +173,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(true); @@ -194,7 +196,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ false); + /* isAutoBrightnessEnabled= */ false, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false); @@ -216,7 +219,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false); @@ -238,7 +242,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false); @@ -260,7 +265,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ true, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false); @@ -282,7 +288,8 @@ public class AutoBrightnessFallbackStrategyTest { /* lastUserSetScreenBrightness= */ PowerManager.BRIGHTNESS_INVALID_FLOAT, /* userSetBrightnessChanged= */ false, /* allowAutoBrightnessWhileDozingConfig= */ false, - /* isAutoBrightnessEnabled= */ true); + /* isAutoBrightnessEnabled= */ true, + /* isBedtimeModeWearEnabled= */ false); mAutoBrightnessFallbackStrategy.strategySelectionPostProcessor(ssnr); verify(mScreenOffBrightnessSensorController).setLightSensorEnabled(false); diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java index e38654225c29..ae1b01959ced 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategy2Test.java @@ -112,7 +112,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, mBrightnessConfiguration, @@ -139,7 +140,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -167,7 +169,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, useNormalBrightnessForDoze, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -193,7 +196,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, mBrightnessConfiguration, @@ -223,7 +227,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, useNormalBrightnessForDoze, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED, mBrightnessConfiguration, @@ -250,7 +255,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -278,7 +284,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED, mBrightnessConfiguration, @@ -307,7 +314,8 @@ public class AutomaticBrightnessStrategy2Test { mAutomaticBrightnessStrategy.updatePendingAutoBrightnessAdjustments(); mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, diff --git a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java index 8a1f86093ecf..65f8ea7bfdfc 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/brightness/strategy/AutomaticBrightnessStrategyTest.java @@ -123,7 +123,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, mBrightnessConfiguration, @@ -150,7 +151,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -177,7 +179,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -204,7 +207,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_DISABLED, mBrightnessConfiguration, @@ -233,7 +237,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED, mBrightnessConfiguration, @@ -261,7 +266,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, lastUserSetBrightness, - userSetBrightnessChanged); + userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -290,7 +296,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, - lastUserSetBrightness, userSetBrightnessChanged); + lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_ENABLED, mBrightnessConfiguration, @@ -319,7 +326,8 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setAutoBrightnessState(targetDisplayState, allowAutoBrightnessWhileDozing, brightnessReason, policy, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, lastUserSetBrightness, - userSetBrightnessChanged); + userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController) .configure(AutomaticBrightnessController.AUTO_BRIGHTNESS_OFF_DUE_TO_DISPLAY_STATE, mBrightnessConfiguration, @@ -352,7 +360,8 @@ public class AutomaticBrightnessStrategyTest { when(mAutomaticBrightnessController.isInIdleMode()).thenReturn(true); mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController, never()) .switchMode(anyInt(), /* sendUpdate= */ anyBoolean()); @@ -361,7 +370,8 @@ public class AutomaticBrightnessStrategyTest { when(mAutomaticBrightnessController.isInIdleMode()).thenReturn(false); mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); verify(mAutomaticBrightnessController).switchMode( AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT, /* sendUpdate= */ false); @@ -375,7 +385,8 @@ public class AutomaticBrightnessStrategyTest { // state is DOZE, policy is DOZE and useNormalBrightnessForDoze is false. mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_DOZE, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); // 1st AUTO_BRIGHTNESS_MODE_DOZE verify(mAutomaticBrightnessController).switchMode( AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE, @@ -385,7 +396,8 @@ public class AutomaticBrightnessStrategyTest { // state is ON, policy is DOZE and useNormalBrightnessForDoze is false. mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); // 2nd AUTO_BRIGHTNESS_MODE_DOZE verify(mAutomaticBrightnessController, times(2)).switchMode( AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE, @@ -396,7 +408,8 @@ public class AutomaticBrightnessStrategyTest { // state is DOZE, policy is DOZE and useNormalBrightnessForDoze is true. mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_DOZE, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); // 3rd AUTO_BRIGHTNESS_MODE_DOZE verify(mAutomaticBrightnessController, times(3)).switchMode( AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DOZE, @@ -406,11 +419,42 @@ public class AutomaticBrightnessStrategyTest { // state is ON, policy is DOZE and useNormalBrightnessForDoze is true. mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, allowAutoBrightnessWhileDozing, brightnessReason, policy, - useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged); + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ false); // AUTO_BRIGHTNESS_MODE_DEFAULT verify(mAutomaticBrightnessController).switchMode( AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT, /* sendUpdate= */ false); + + // Wear Bedtime autobrightness mode feature disabled. + when(mDisplayManagerFlags.isAutoBrightnessModeBedtimeWearEnabled()).thenReturn(false); + mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, + allowAutoBrightnessWhileDozing, brightnessReason, policy, + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ true); + verify(mAutomaticBrightnessController, times(2)).switchMode( + AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_DEFAULT, + /* sendUpdate= */ false); + + // Wear Bedtime autobrightness mode feature enabled. + when(mDisplayManagerFlags.isAutoBrightnessModeBedtimeWearEnabled()).thenReturn(true); + mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_ON, + allowAutoBrightnessWhileDozing, brightnessReason, policy, + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ true); + verify(mAutomaticBrightnessController).switchMode( + AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + /* sendUpdate= */ false); + + // Wear bedtime mode enabled, keep bedtime curve even though doze is requested. + mAutomaticBrightnessStrategy.setAutoBrightnessState(Display.STATE_DOZE, + allowAutoBrightnessWhileDozing, brightnessReason, + DisplayManagerInternal.DisplayPowerRequest.POLICY_DOZE, + useNormalBrightnessForDoze, lastUserSetBrightness, userSetBrightnessChanged, + /* isBedtimeModeWearEnabled= */ true); + verify(mAutomaticBrightnessController, times(2)).switchMode( + AutomaticBrightnessController.AUTO_BRIGHTNESS_MODE_BEDTIME_WEAR, + /* sendUpdate= */ false); } @Test @@ -429,14 +473,14 @@ public class AutomaticBrightnessStrategyTest { setTemporaryAutoBrightnessAdjustment(temporaryAutoBrightnessAdjustments); mAutomaticBrightnessStrategy.accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness, policy, targetDisplayState, - DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, + DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, brightnessConfiguration, autoBrightnessState); verify(mAutomaticBrightnessController).configure(autoBrightnessState, brightnessConfiguration, lastUserSetScreenBrightness, userSetBrightnessChanged, temporaryAutoBrightnessAdjustments, /* userChangedAutoBrightnessAdjustment= */ false, policy, targetDisplayState, - DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, + DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, /* shouldResetShortTermModel= */ true); assertTrue(mAutomaticBrightnessStrategy.isTemporaryAutoBrightnessAdjustmentApplied()); assertFalse(mAutomaticBrightnessStrategy.shouldResetShortTermModel()); @@ -447,7 +491,7 @@ public class AutomaticBrightnessStrategyTest { mAutomaticBrightnessStrategy.setShouldResetShortTermModel(true); mAutomaticBrightnessStrategy.accommodateUserBrightnessChanges(userSetBrightnessChanged, lastUserSetScreenBrightness, policy, targetDisplayState, - DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, + DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, brightnessConfiguration, autoBrightnessState); assertFalse(mAutomaticBrightnessStrategy.isTemporaryAutoBrightnessAdjustmentApplied()); assertTrue(mAutomaticBrightnessStrategy.shouldResetShortTermModel()); @@ -572,7 +616,7 @@ public class AutomaticBrightnessStrategyTest { BrightnessReason.REASON_UNKNOWN, DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, /* lastUserSetScreenBrightness= */ 0.1f, - /* userSetBrightnessChanged= */ false); + /* userSetBrightnessChanged= */ false, /* isBedtimeModeWearEnabled= */ false); when(mAutomaticBrightnessController.getAutomaticScreenBrightness(null)) .thenReturn(Float.NaN); assertFalse(mAutomaticBrightnessStrategy.isAutoBrightnessValid()); @@ -589,7 +633,7 @@ public class AutomaticBrightnessStrategyTest { BrightnessReason.REASON_UNKNOWN, DisplayManagerInternal.DisplayPowerRequest.POLICY_BRIGHT, DEFAULT_USE_NORMAL_BRIGHTNESS_FOR_DOZE, /* lastUserSetScreenBrightness= */ 0.1f, - /* userSetBrightnessChanged= */ false); + /* userSetBrightnessChanged= */ false, /* isBedtimeModeWearEnabled= */ false); when(mAutomaticBrightnessController.getAutomaticScreenBrightness(null)) .thenReturn(0.2f); assertTrue(mAutomaticBrightnessStrategy.isAutoBrightnessValid()); -- GitLab From d4b0c0a079aa2a104c0e24af1cce556c7ba0a7bf Mon Sep 17 00:00:00 2001 From: Jared Finder Date: Sat, 31 Aug 2024 00:11:41 +0000 Subject: [PATCH 270/459] Adding XR software and hardware feature strings Bug: 364416355 Change-Id: I1d95699f8b0292ccc3b00eff9e5aeaf90b0ce0c2 Flag: android.xr.xr_manifest_entries Test: Checked that project still built. --- core/api/current.txt | 5 ++ .../android/content/pm/PackageManager.java | 58 +++++++++++++++++++ 2 files changed, 63 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index 6f60378d73e3..6ec9cf359942 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -13372,6 +13372,11 @@ package android.content.pm { field public static final String FEATURE_WIFI_PASSPOINT = "android.hardware.wifi.passpoint"; field public static final String FEATURE_WIFI_RTT = "android.hardware.wifi.rtt"; field public static final String FEATURE_WINDOW_MAGNIFICATION = "android.software.window_magnification"; + field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FEATURE_XR_API_OPENXR = "android.software.xr.api.openxr"; + field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FEATURE_XR_API_SPATIAL = "android.software.xr.api.spatial"; + field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FEATURE_XR_INPUT_CONTROLLER = "android.hardware.xr.input.controller"; + field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FEATURE_XR_INPUT_EYE_TRACKING = "android.hardware.xr.input.eye_tracking"; + field @FlaggedApi("android.xr.xr_manifest_entries") public static final String FEATURE_XR_INPUT_HAND_TRACKING = "android.hardware.xr.input.hand_tracking"; field public static final int FLAG_PERMISSION_WHITELIST_INSTALLER = 2; // 0x2 field public static final int FLAG_PERMISSION_WHITELIST_SYSTEM = 1; // 0x1 field public static final int FLAG_PERMISSION_WHITELIST_UPGRADE = 4; // 0x4 diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index e985f88f38fc..47d9f09a5727 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -4863,6 +4863,64 @@ public abstract class PackageManager { public static final String FEATURE_CONTEXTUAL_SEARCH_HELPER = "android.software.contextualsearch"; + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device + * supports XR input from XR controllers. + */ + @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_XR_INPUT_CONTROLLER = + "android.hardware.xr.input.controller"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device + * supports XR input from the user's hands. + */ + @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_XR_INPUT_HAND_TRACKING = + "android.hardware.xr.input.hand_tracking"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device + * supports XR input from the user's eye gaze. + */ + @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_XR_INPUT_EYE_TRACKING = + "android.hardware.xr.input.eye_tracking"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device + * supports OpenXR. The feature version indicates + * the highest version of OpenXR supported by the device using the following encoding: + *

      + *
    • Major version in bits 31-16
    • + *
    • Minor version in bits 15-0
    • + *
    + * This is the same encoding as the top 32 bits of an {@code XrVersion}. + *

    + * Example: OpenXR 1.1 support is encoded as 0x00010001. + */ + @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_XR_API_OPENXR = + "android.software.xr.api.openxr"; + + /** + * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: This device + * supports the Android XR Spatial APIs. The feature version indicates the highest version of + * the Android XR Spatial APIs supported by the device. + * + *

    Also see Getting started with Spatializing + * your app. + */ + // TODO(b/374330735): update public documentation once link content is finalized + @FlaggedApi(android.xr.Flags.FLAG_XR_MANIFEST_ENTRIES) + @SdkConstant(SdkConstantType.FEATURE) + public static final String FEATURE_XR_API_SPATIAL = + "android.software.xr.api.spatial"; + /** @hide */ public static final boolean APP_ENUMERATION_ENABLED_BY_DEFAULT = true; -- GitLab From 9011425d182cc274c336f4f9e0948c22994c6de5 Mon Sep 17 00:00:00 2001 From: Anna Bauza Date: Tue, 22 Oct 2024 19:47:31 +0000 Subject: [PATCH 271/459] Add option to skip cache sysdump for caches which have zeros in stats Flag: EXEMPT bugfix Test: N/A Bug: 375039673 Change-Id: Ie840ba660541a78773d54098a8f27ebf29468015 --- .../android/app/PropertyInvalidatedCache.java | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java index acedef0c7788..c93a6dd8969e 100644 --- a/core/java/android/app/PropertyInvalidatedCache.java +++ b/core/java/android/app/PropertyInvalidatedCache.java @@ -30,20 +30,16 @@ import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; -import android.text.TextUtils; import android.util.Log; import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.VisibleForTesting; import com.android.internal.os.BackgroundThread; -import com.android.internal.util.FastPrintWriter; import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -1494,6 +1490,7 @@ public class PropertyInvalidatedCache { final static String NAME_LIKE = "-name-like="; final static String PROPERTY_CONTAINS = "-property-has="; final static String PROPERTY_LIKE = "-property-like="; + final static String BRIEF = "-brief"; /** * Return true if any argument is a detailed specification switch. @@ -1539,6 +1536,21 @@ public class PropertyInvalidatedCache { return false; } + /** + * helper method to check if dump should be skipped due to zero values + * @param args takes command arguments to check if -brief is present + * @return True if dump should be skipped + */ + private boolean skipDump(String[] args) { + for (String a : args) { + if (a.equals(BRIEF)) { + return (mSkips[NONCE_CORKED] + mSkips[NONCE_UNSET] + mSkips[NONCE_DISABLED] + + mSkips[NONCE_BYPASS] + mHits + mMisses) == 0; + } + } + return false; + } + private void dumpContents(PrintWriter pw, boolean detailed, String[] args) { // If the user has requested specific caches and this is not one of them, return // immediately. @@ -1549,25 +1561,28 @@ public class PropertyInvalidatedCache { NonceHandler.Stats stats = mNonce.getStats(); synchronized (mLock) { - pw.println(formatSimple(" Cache Name: %s", cacheName())); - pw.println(formatSimple(" Property: %s", mPropertyName)); - final long skips = mSkips[NONCE_CORKED] + mSkips[NONCE_UNSET] + mSkips[NONCE_DISABLED] - + mSkips[NONCE_BYPASS]; - pw.println(formatSimple( - " Hits: %d, Misses: %d, Skips: %d, Clears: %d", - mHits, mMisses, skips, mClears)); - pw.println(formatSimple( - " Skip-corked: %d, Skip-unset: %d, Skip-bypass: %d, Skip-other: %d", - mSkips[NONCE_CORKED], mSkips[NONCE_UNSET], - mSkips[NONCE_BYPASS], mSkips[NONCE_DISABLED])); - pw.println(formatSimple( - " Nonce: 0x%016x, Invalidates: %d, CorkedInvalidates: %d", - mLastSeenNonce, stats.invalidated, stats.corkedInvalidates)); - pw.println(formatSimple( - " Current Size: %d, Max Size: %d, HW Mark: %d, Overflows: %d", - mCache.size(), mMaxEntries, mHighWaterMark, mMissOverflow)); - pw.println(formatSimple(" Enabled: %s", mDisabled ? "false" : "true")); - pw.println(""); + if (!skipDump(args)) { + pw.println(formatSimple(" Cache Name: %s", cacheName())); + pw.println(formatSimple(" Property: %s", mPropertyName)); + final long skips = + mSkips[NONCE_CORKED] + mSkips[NONCE_UNSET] + mSkips[NONCE_DISABLED] + + mSkips[NONCE_BYPASS]; + pw.println(formatSimple( + " Hits: %d, Misses: %d, Skips: %d, Clears: %d", + mHits, mMisses, skips, mClears)); + pw.println(formatSimple( + " Skip-corked: %d, Skip-unset: %d, Skip-bypass: %d, Skip-other: %d", + mSkips[NONCE_CORKED], mSkips[NONCE_UNSET], + mSkips[NONCE_BYPASS], mSkips[NONCE_DISABLED])); + pw.println(formatSimple( + " Nonce: 0x%016x, Invalidates: %d, CorkedInvalidates: %d", + mLastSeenNonce, stats.invalidated, stats.corkedInvalidates)); + pw.println(formatSimple( + " Current Size: %d, Max Size: %d, HW Mark: %d, Overflows: %d", + mCache.size(), mMaxEntries, mHighWaterMark, mMissOverflow)); + pw.println(formatSimple(" Enabled: %s", mDisabled ? "false" : "true")); + pw.println(""); + } // No specific cache was requested. This is the default, and no details // should be dumped. -- GitLab From 8315ff0300ec088872acccacdff788707275cad1 Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Mon, 21 Oct 2024 06:47:37 +0000 Subject: [PATCH 272/459] Add mixed transition handling for desktop changes Identifies desktop changes (immersive exits for now) within transitions that should be mainly handled by existing handlers and splits it so that the desktop change is animated by its own handler. Specifically, deskop immersive exits during an open/front transition should be split so that the immersive task that is being resized is animated by the immersive handler, while the opening task remains animated by the DefaultTransitionHandler. Similarly, for intent launches with a remote handler, the immersive change is split and animated by the immersive handler and the rest is sent to the remote handler to animate. Flag: com.android.window.flags.enable_fully_immersive_in_desktop Bug: 372319492 Test: while in desktop immersive, launch an app from the taskbar and see both of them animate Test: while in desktop immersive, launch an app from the notification shade and see both of them animate Change-Id: Ib63601322df20505dd7c012d85b5705d31dec5a8 --- .../wm/shell/dagger/WMShellModule.java | 14 +- ...ndler.kt => DesktopImmersiveController.kt} | 113 ++++++-- .../desktopmode/DesktopTasksController.kt | 102 ++++++-- .../FreeformTaskTransitionObserver.java | 28 +- .../shell/transition/DefaultMixedHandler.java | 28 +- .../transition/DefaultMixedTransition.java | 168 +++++++++--- ...t.kt => DesktopImmersiveControllerTest.kt} | 245 +++++++++++------- .../desktopmode/DesktopTasksControllerTest.kt | 147 +++++++++-- .../FreeformTaskTransitionObserverTest.java | 41 ++- 9 files changed, 676 insertions(+), 210 deletions(-) rename libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/{DesktopFullImmersiveTransitionHandler.kt => DesktopImmersiveController.kt} (81%) rename libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/{DesktopFullImmersiveTransitionHandlerTest.kt => DesktopImmersiveControllerTest.kt} (72%) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index 4c2588984500..b700a5455f1a 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -67,7 +67,7 @@ import com.android.wm.shell.dagger.pip.PipModule; import com.android.wm.shell.desktopmode.CloseDesktopTaskTransitionHandler; import com.android.wm.shell.desktopmode.DefaultDragToDesktopTransitionHandler; import com.android.wm.shell.desktopmode.DesktopActivityOrientationChangeHandler; -import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler; +import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.desktopmode.DesktopMixedTransitionHandler; import com.android.wm.shell.desktopmode.DesktopModeDragAndDropTransitionHandler; import com.android.wm.shell.desktopmode.DesktopModeEventLogger; @@ -397,12 +397,12 @@ public abstract class WMShellModule { Context context, ShellInit shellInit, Transitions transitions, - Optional desktopImmersiveTransitionHandler, + Optional desktopImmersiveController, WindowDecorViewModel windowDecorViewModel, Optional taskChangeListener, FocusTransitionObserver focusTransitionObserver) { return new FreeformTaskTransitionObserver( - context, shellInit, transitions, desktopImmersiveTransitionHandler, + context, shellInit, transitions, desktopImmersiveController, windowDecorViewModel, taskChangeListener, focusTransitionObserver); } @@ -638,7 +638,7 @@ public abstract class WMShellModule { ToggleResizeDesktopTaskTransitionHandler toggleResizeDesktopTaskTransitionHandler, DragToDesktopTransitionHandler dragToDesktopTransitionHandler, @DynamicOverride DesktopRepository desktopRepository, - Optional desktopFullImmersiveTransitionHandler, + Optional desktopImmersiveController, DesktopModeLoggerTransitionObserver desktopModeLoggerTransitionObserver, LaunchAdjacentController launchAdjacentController, RecentsTransitionHandler recentsTransitionHandler, @@ -657,7 +657,7 @@ public abstract class WMShellModule { returnToDragStartAnimator, enterDesktopTransitionHandler, exitDesktopTransitionHandler, desktopModeDragAndDropTransitionHandler, toggleResizeDesktopTaskTransitionHandler, - dragToDesktopTransitionHandler, desktopFullImmersiveTransitionHandler.get(), + dragToDesktopTransitionHandler, desktopImmersiveController.get(), desktopRepository, desktopModeLoggerTransitionObserver, launchAdjacentController, recentsTransitionHandler, multiInstanceHelper, mainExecutor, desktopTasksLimiter, @@ -705,7 +705,7 @@ public abstract class WMShellModule { @WMSingleton @Provides - static Optional provideDesktopImmersiveHandler( + static Optional provideDesktopImmersiveController( Context context, Transitions transitions, @DynamicOverride DesktopRepository desktopRepository, @@ -713,7 +713,7 @@ public abstract class WMShellModule { ShellTaskOrganizer shellTaskOrganizer) { if (DesktopModeStatus.canEnterDesktopMode(context)) { return Optional.of( - new DesktopFullImmersiveTransitionHandler( + new DesktopImmersiveController( transitions, desktopRepository, displayController, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt similarity index 81% rename from libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt rename to libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt index 19ffd969cfac..d0bc5f0955f7 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopImmersiveController.kt @@ -36,20 +36,21 @@ import com.android.wm.shell.common.DisplayController import com.android.wm.shell.protolog.ShellProtoLogGroup.WM_SHELL_DESKTOP_MODE import com.android.wm.shell.transition.Transitions import com.android.wm.shell.transition.Transitions.TransitionHandler +import com.android.wm.shell.transition.Transitions.TransitionObserver import com.android.wm.shell.windowdecor.OnTaskResizeAnimationListener /** - * A [TransitionHandler] to move a task in/out of desktop's full immersive state where the task + * A controller to move tasks in/out of desktop's full immersive state where the task * remains freeform while being able to take fullscreen bounds and have its App Header visibility * be transient below the status bar like in fullscreen immersive mode. */ -class DesktopFullImmersiveTransitionHandler( +class DesktopImmersiveController( private val transitions: Transitions, private val desktopRepository: DesktopRepository, private val displayController: DisplayController, private val shellTaskOrganizer: ShellTaskOrganizer, private val transactionSupplier: () -> SurfaceControl.Transaction, -) : TransitionHandler { +) : TransitionHandler, TransitionObserver { constructor( transitions: Transitions, @@ -67,7 +68,7 @@ class DesktopFullImmersiveTransitionHandler( private var state: TransitionState? = null @VisibleForTesting - val pendingExternalExitTransitions = mutableSetOf() + val pendingExternalExitTransitions = mutableListOf() /** Whether there is an immersive transition that hasn't completed yet. */ private val inProgress: Boolean @@ -184,6 +185,17 @@ class DesktopFullImmersiveTransitionHandler( return null } + + /** Whether the [change] in the [transition] is a known immersive change. */ + fun isImmersiveChange( + transition: IBinder, + change: TransitionInfo.Change, + ): Boolean { + return pendingExternalExitTransitions.any { + it.transition == transition && it.taskId == change.taskInfo?.taskId + } + } + private fun addPendingImmersiveExit(taskId: Int, displayId: Int, transition: IBinder) { pendingExternalExitTransitions.add( ExternalPendingExit( @@ -201,10 +213,11 @@ class DesktopFullImmersiveTransitionHandler( finishTransaction: SurfaceControl.Transaction, finishCallback: Transitions.TransitionFinishCallback ): Boolean { + logD("startAnimation transition=%s", transition) val state = requireState() if (transition != state.transition) return false animateResize( - transitionState = state, + targetTaskId = state.taskId, info = info, startTransaction = startTransaction, finishTransaction = finishTransaction, @@ -214,40 +227,55 @@ class DesktopFullImmersiveTransitionHandler( } private fun animateResize( - transitionState: TransitionState, + targetTaskId: Int, info: TransitionInfo, startTransaction: SurfaceControl.Transaction, finishTransaction: SurfaceControl.Transaction, finishCallback: Transitions.TransitionFinishCallback ) { + logD("animateResize for task#%d", targetTaskId) val change = info.changes.first { c -> val taskInfo = c.taskInfo - return@first taskInfo != null && taskInfo.taskId == transitionState.taskId + return@first taskInfo != null && taskInfo.taskId == targetTaskId } + animateResizeChange(change, startTransaction, finishTransaction, finishCallback) + } + + /** + * Animate an immersive change. + * + * As of now, both enter and exit transitions have the same animation, a veiled resize. + */ + fun animateResizeChange( + change: TransitionInfo.Change, + startTransaction: SurfaceControl.Transaction, + finishTransaction: SurfaceControl.Transaction, + finishCallback: Transitions.TransitionFinishCallback, + ) { + val taskId = change.taskInfo!!.taskId val leash = change.leash val startBounds = change.startAbsBounds val endBounds = change.endAbsBounds - + logD("Animating resize change for task#%d from %s to %s", taskId, startBounds, endBounds) + + startTransaction + .setPosition(leash, startBounds.left.toFloat(), startBounds.top.toFloat()) + .setWindowCrop(leash, startBounds.width(), startBounds.height()) + .show(leash) + onTaskResizeAnimationListener + ?.onAnimationStart(taskId, startTransaction, startBounds) + ?: startTransaction.apply() val updateTransaction = transactionSupplier() ValueAnimator.ofObject(rectEvaluator, startBounds, endBounds).apply { duration = FULL_IMMERSIVE_ANIM_DURATION_MS interpolator = DecelerateInterpolator() addListener( - onStart = { - startTransaction - .setPosition(leash, startBounds.left.toFloat(), startBounds.top.toFloat()) - .setWindowCrop(leash, startBounds.width(), startBounds.height()) - .show(leash) - onTaskResizeAnimationListener - ?.onAnimationStart(transitionState.taskId, startTransaction, startBounds) - ?: startTransaction.apply() - }, onEnd = { finishTransaction .setPosition(leash, endBounds.left.toFloat(), endBounds.top.toFloat()) .setWindowCrop(leash, endBounds.width(), endBounds.height()) .apply() - onTaskResizeAnimationListener?.onAnimationEnd(transitionState.taskId) + onTaskResizeAnimationListener?.onAnimationEnd(taskId) finishCallback.onTransitionFinished(null /* wct */) clearState() } @@ -259,7 +287,7 @@ class DesktopFullImmersiveTransitionHandler( .setWindowCrop(leash, rect.width(), rect.height()) .apply() onTaskResizeAnimationListener - ?.onBoundsChange(transitionState.taskId, updateTransaction, rect) + ?.onBoundsChange(taskId, updateTransaction, rect) ?: updateTransaction.apply() } start() @@ -289,15 +317,20 @@ class DesktopFullImmersiveTransitionHandler( * |onTransitionReady|, before this transition actually animates) because drawing decorations * depends on whether the task is in full immersive state or not. */ - fun onTransitionReady(transition: IBinder, info: TransitionInfo) { + override fun onTransitionReady( + transition: IBinder, + info: TransitionInfo, + startTransaction: SurfaceControl.Transaction, + finishTransaction: SurfaceControl.Transaction, + ) { + logD("onTransitionReady transition=%s", transition) // Check if this is a pending external exit transition. val pendingExit = pendingExternalExitTransitions .firstOrNull { pendingExit -> pendingExit.transition == transition } if (pendingExit != null) { - pendingExternalExitTransitions.remove(pendingExit) if (info.hasTaskChange(taskId = pendingExit.taskId)) { if (desktopRepository.isTaskInFullImmersiveState(pendingExit.taskId)) { - logV("Pending external exit for task ${pendingExit.taskId} verified") + logV("Pending external exit for task#%d verified", pendingExit.taskId) desktopRepository.setTaskInFullImmersiveState( displayId = pendingExit.displayId, taskId = pendingExit.taskId, @@ -316,7 +349,7 @@ class DesktopFullImmersiveTransitionHandler( val state = requireState() val startBounds = info.changes.first { c -> c.taskInfo?.taskId == state.taskId } .startAbsBounds - logV("Direct move for task ${state.taskId} in ${state.direction} direction verified") + logV("Direct move for task#%d in %s direction verified", state.taskId, state.direction) when (state.direction) { Direction.ENTER -> { desktopRepository.setTaskInFullImmersiveState( @@ -348,7 +381,7 @@ class DesktopFullImmersiveTransitionHandler( .filter { c -> desktopRepository.isTaskInFullImmersiveState(c.taskInfo!!.taskId) } .filter { c -> c.startRotation != c.endRotation } .forEach { c -> - logV("Detected immersive exit due to rotation for task: ${c.taskInfo!!.taskId}") + logV("Detected immersive exit due to rotation for task#%d", c.taskInfo!!.taskId) desktopRepository.setTaskInFullImmersiveState( displayId = c.taskInfo!!.displayId, taskId = c.taskInfo!!.taskId, @@ -357,6 +390,32 @@ class DesktopFullImmersiveTransitionHandler( } } + override fun onTransitionMerged(merged: IBinder, playing: IBinder) { + logD("onTransitionMerged merged=%s playing=%s", merged, playing) + val pendingExit = pendingExternalExitTransitions + .firstOrNull { pendingExit -> pendingExit.transition == merged } + if (pendingExit != null) { + logV( + "Pending exit transition %s for task#%s merged into %s", + merged, pendingExit.taskId, playing + ) + pendingExit.transition = playing + } + } + + override fun onTransitionFinished(transition: IBinder, aborted: Boolean) { + logD("onTransitionFinished transition=%s aborted=%b", transition, aborted) + val pendingExit = pendingExternalExitTransitions + .firstOrNull { pendingExit -> pendingExit.transition == transition } + if (pendingExit != null) { + logV( + "Pending exit transition %s for task#%s finished", + transition, pendingExit + ) + pendingExternalExitTransitions.remove(pendingExit) + } + } + private fun clearState() { state = null } @@ -399,7 +458,7 @@ class DesktopFullImmersiveTransitionHandler( data class ExternalPendingExit( val taskId: Int, val displayId: Int, - val transition: IBinder, + var transition: IBinder, ) private enum class Direction { @@ -410,6 +469,10 @@ class DesktopFullImmersiveTransitionHandler( ProtoLog.v(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) } + private fun logD(msg: String, vararg arguments: Any?) { + ProtoLog.d(WM_SHELL_DESKTOP_MODE, "%s: $msg", TAG, *arguments) + } + private companion object { private const val TAG = "DesktopImmersive" diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt index 18cf1f2ef4cc..781aee07a902 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopTasksController.kt @@ -48,6 +48,7 @@ import android.view.DragEvent import android.view.KeyEvent import android.view.MotionEvent import android.view.SurfaceControl +import android.view.SurfaceControl.Transaction import android.view.WindowManager.TRANSIT_CHANGE import android.view.WindowManager.TRANSIT_CLOSE import android.view.WindowManager.TRANSIT_NONE @@ -59,6 +60,7 @@ import android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_WALLPAPER_ACTIVI import android.window.DesktopModeFlags.ENABLE_WINDOWING_DYNAMIC_INITIAL_BOUNDS import android.window.RemoteTransition import android.window.TransitionInfo +import android.window.TransitionInfo.Change import android.window.TransitionRequestInfo import android.window.WindowContainerTransaction import androidx.annotation.BinderThread @@ -115,6 +117,7 @@ import com.android.wm.shell.sysui.UserChangeListener import com.android.wm.shell.transition.FocusTransitionObserver import com.android.wm.shell.transition.OneShotRemoteHandler import com.android.wm.shell.transition.Transitions +import com.android.wm.shell.transition.Transitions.TransitionFinishCallback import com.android.wm.shell.windowdecor.DragPositioningCallbackUtility import com.android.wm.shell.windowdecor.MoveToDesktopAnimator import com.android.wm.shell.windowdecor.OnTaskRepositionAnimationListener @@ -146,7 +149,7 @@ class DesktopTasksController( private val desktopModeDragAndDropTransitionHandler: DesktopModeDragAndDropTransitionHandler, private val toggleResizeDesktopTaskTransitionHandler: ToggleResizeDesktopTaskTransitionHandler, private val dragToDesktopTransitionHandler: DragToDesktopTransitionHandler, - private val immersiveTransitionHandler: DesktopFullImmersiveTransitionHandler, + private val desktopImmersiveController: DesktopImmersiveController, private val taskRepository: DesktopRepository, private val desktopModeLoggerTransitionObserver: DesktopModeLoggerTransitionObserver, private val launchAdjacentController: LaunchAdjacentController, @@ -252,7 +255,7 @@ class DesktopTasksController( toggleResizeDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener) enterDesktopTaskTransitionHandler.setOnTaskResizeAnimationListener(listener) dragToDesktopTransitionHandler.onTaskResizeAnimationListener = listener - immersiveTransitionHandler.onTaskResizeAnimationListener = listener + desktopImmersiveController.onTaskResizeAnimationListener = listener } fun setOnTaskRepositionAnimationListener(listener: OnTaskRepositionAnimationListener) { @@ -372,7 +375,7 @@ class DesktopTasksController( // TODO(342378842): Instead of using default display, support multiple displays val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( DEFAULT_DISPLAY, wct, taskId) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, displayId = DEFAULT_DISPLAY, excludeTaskId = taskId, @@ -403,7 +406,7 @@ class DesktopTasksController( } logV("moveRunningTaskToDesktop taskId=%d", task.taskId) exitSplitIfApplicable(wct, task) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, displayId = task.displayId, excludeTaskId = task.taskId, @@ -452,7 +455,7 @@ class DesktopTasksController( val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask(taskInfo.displayId, wct, taskInfo.taskId) addMoveToDesktopChanges(wct, taskInfo) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct, taskInfo.displayId) val transition = dragToDesktopTransitionHandler.finishDragToDesktopTransition(wct) transition?.let { @@ -499,7 +502,7 @@ class DesktopTasksController( taskId ) ) - return immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo) + return desktopImmersiveController.exitImmersiveIfApplicable(wct, taskInfo) } fun minimizeTask(taskInfo: RunningTaskInfo) { @@ -512,7 +515,7 @@ class DesktopTasksController( removeWallpaperActivity(wct) } // Notify immersive handler as it might need to exit immersive state. - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable(wct, taskInfo) + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable(wct, taskInfo) wct.reorder(taskInfo.token, false) val transition = freeformTaskTransitionStarter.startMinimizedModeTransition(wct) @@ -616,7 +619,7 @@ class DesktopTasksController( logV("moveBackgroundTaskToFront taskId=%s", taskId) val wct = WindowContainerTransaction() // TODO: b/342378842 - Instead of using default display, support multiple displays - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, displayId = DEFAULT_DISPLAY, excludeTaskId = taskId, @@ -642,7 +645,7 @@ class DesktopTasksController( logV("moveTaskToFront taskId=%s", taskInfo.taskId) val wct = WindowContainerTransaction() wct.reorder(taskInfo.token, true /* onTop */, true /* includingParents */) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, displayId = taskInfo.displayId, excludeTaskId = taskInfo.taskId, @@ -749,12 +752,12 @@ class DesktopTasksController( private fun moveDesktopTaskToFullImmersive(taskInfo: RunningTaskInfo) { check(taskInfo.isFreeform) { "Task must already be in freeform" } - immersiveTransitionHandler.moveTaskToImmersive(taskInfo) + desktopImmersiveController.moveTaskToImmersive(taskInfo) } private fun exitDesktopTaskFromFullImmersive(taskInfo: RunningTaskInfo) { check(taskInfo.isFreeform) { "Task must already be in freeform" } - immersiveTransitionHandler.moveTaskToNonImmersive(taskInfo) + desktopImmersiveController.moveTaskToNonImmersive(taskInfo) } /** @@ -1233,6 +1236,67 @@ class DesktopTasksController( return result } + /** Whether the given [change] in the [transition] is a known desktop change. */ + fun isDesktopChange( + transition: IBinder, + change: TransitionInfo.Change, + ): Boolean { + // Only the immersive controller is currently involved in mixed transitions. + return Flags.enableFullyImmersiveInDesktop() + && desktopImmersiveController.isImmersiveChange(transition, change) + } + + /** + * Whether the given transition [info] will potentially include a desktop change, in which + * case the transition should be treated as mixed so that the change is in part animated by + * one of the desktop transition handlers. + */ + fun shouldPlayDesktopAnimation(info: TransitionRequestInfo): Boolean { + // Only immersive mixed transition are currently supported. + if (!Flags.enableFullyImmersiveInDesktop()) return false + val triggerTask = info.triggerTask ?: return false + if (!isDesktopModeShowing(triggerTask.displayId)) { + return false + } + if (!TransitionUtil.isOpeningType(info.type)) { + return false + } + taskRepository.getTaskInFullImmersiveState(displayId = triggerTask.displayId) + ?: return false + return when { + triggerTask.isFullscreen -> { + // Trigger fullscreen task will enter desktop, so any existing immersive task + // should exit. + shouldFullscreenTaskLaunchSwitchToDesktop(triggerTask) + } + triggerTask.isFreeform -> { + // Trigger freeform task will enter desktop, so any existing immersive task should + // exit. + !shouldFreeformTaskLaunchSwitchToFullscreen(triggerTask) + } + else -> false + } + } + + /** Animate a desktop change found in a mixed transitions. */ + fun animateDesktopChange( + transition: IBinder, + change: Change, + startTransaction: Transaction, + finishTransaction: Transaction, + finishCallback: TransitionFinishCallback, + ) { + if (!desktopImmersiveController.isImmersiveChange(transition, change)) { + throw IllegalStateException("Only immersive changes support desktop mixed transitions") + } + desktopImmersiveController.animateResizeChange( + change, + startTransaction, + finishTransaction, + finishCallback + ) + } + private fun taskContainsDragAndDropCookie(taskInfo: RunningTaskInfo?) = taskInfo?.launchCookies?.any { it == dragAndDropFullscreenCookie } ?: false @@ -1279,7 +1343,7 @@ class DesktopTasksController( wct.startTask(requestedTaskId, options.toBundle()) val taskToMinimize = bringDesktopAppsToFrontBeforeShowingNewTask( callingTask.displayId, wct, requestedTaskId) - val runOnTransit = immersiveTransitionHandler.exitImmersiveIfApplicable( + val runOnTransit = desktopImmersiveController.exitImmersiveIfApplicable( wct = wct, displayId = callingTask.displayId, excludeTaskId = requestedTaskId, @@ -1392,7 +1456,7 @@ class DesktopTasksController( return null } val wct = WindowContainerTransaction() - if (!isDesktopModeShowing(task.displayId)) { + if (shouldFreeformTaskLaunchSwitchToFullscreen(task)) { logD("Bring desktop tasks to front on transition=taskId=%d", task.taskId) if (taskRepository.isActiveTask(task.taskId) && !forceEnterDesktop(task.displayId)) { // We are outside of desktop mode and already existing desktop task is being @@ -1423,7 +1487,7 @@ class DesktopTasksController( } // Desktop Mode is showing and we're launching a new Task: // 1) Exit immersive if needed. - immersiveTransitionHandler.exitImmersiveIfApplicable(transition, wct, task.displayId) + desktopImmersiveController.exitImmersiveIfApplicable(transition, wct, task.displayId) // 2) minimize a Task if needed. val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) if (taskToMinimize != null) { @@ -1438,7 +1502,7 @@ class DesktopTasksController( transition: IBinder ): WindowContainerTransaction? { logV("handleFullscreenTaskLaunch") - if (isDesktopModeShowing(task.displayId) || forceEnterDesktop(task.displayId)) { + if (shouldFullscreenTaskLaunchSwitchToDesktop(task)) { logD("Switch fullscreen task to freeform on transition: taskId=%d", task.taskId) return WindowContainerTransaction().also { wct -> addMoveToDesktopChanges(wct, task) @@ -1454,7 +1518,7 @@ class DesktopTasksController( val taskToMinimize = addAndGetMinimizeChangesIfNeeded(task.displayId, wct, task.taskId) addPendingMinimizeTransition(transition, taskToMinimize) - immersiveTransitionHandler.exitImmersiveIfApplicable( + desktopImmersiveController.exitImmersiveIfApplicable( transition, wct, task.displayId ) } @@ -1462,6 +1526,12 @@ class DesktopTasksController( return null } + private fun shouldFreeformTaskLaunchSwitchToFullscreen(task: RunningTaskInfo): Boolean = + !isDesktopModeShowing(task.displayId) + + private fun shouldFullscreenTaskLaunchSwitchToDesktop(task: RunningTaskInfo): Boolean = + isDesktopModeShowing(task.displayId) || forceEnterDesktop(task.displayId) + /** * If a task is not compatible with desktop mode freeform, it should always be launched in * fullscreen. diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java index 771573d48e45..7631ece761b5 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserver.java @@ -28,7 +28,7 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.android.window.flags.Flags; -import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler; +import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.Transitions; @@ -48,7 +48,7 @@ import java.util.Optional; */ public class FreeformTaskTransitionObserver implements Transitions.TransitionObserver { private final Transitions mTransitions; - private final Optional mImmersiveTransitionHandler; + private final Optional mDesktopImmersiveController; private final WindowDecorViewModel mWindowDecorViewModel; private final Optional mTaskChangeListener; private final FocusTransitionObserver mFocusTransitionObserver; @@ -60,12 +60,12 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs Context context, ShellInit shellInit, Transitions transitions, - Optional immersiveTransitionHandler, + Optional desktopImmersiveController, WindowDecorViewModel windowDecorViewModel, Optional taskChangeListener, FocusTransitionObserver focusTransitionObserver) { mTransitions = transitions; - mImmersiveTransitionHandler = immersiveTransitionHandler; + mDesktopImmersiveController = desktopImmersiveController; mWindowDecorViewModel = windowDecorViewModel; mTaskChangeListener = taskChangeListener; mFocusTransitionObserver = focusTransitionObserver; @@ -89,7 +89,8 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs // TODO(b/367268953): Remove when DesktopTaskListener is introduced and the repository // is updated from there **before** the |mWindowDecorViewModel| methods are invoked. // Otherwise window decoration relayout won't run with the immersive state up to date. - mImmersiveTransitionHandler.ifPresent(h -> h.onTransitionReady(transition, info)); + mDesktopImmersiveController.ifPresent(h -> + h.onTransitionReady(transition, info, startT, finishT)); } // Update focus state first to ensure the correct state can be queried from listeners. // TODO(371503964): Remove this once the unified task repository is ready. @@ -194,10 +195,20 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs } @Override - public void onTransitionStarting(@NonNull IBinder transition) {} + public void onTransitionStarting(@NonNull IBinder transition) { + if (Flags.enableFullyImmersiveInDesktop()) { + // TODO(b/367268953): Remove when DesktopTaskListener is introduced. + mDesktopImmersiveController.ifPresent(h -> h.onTransitionStarting(transition)); + } + } @Override public void onTransitionMerged(@NonNull IBinder merged, @NonNull IBinder playing) { + if (Flags.enableFullyImmersiveInDesktop()) { + // TODO(b/367268953): Remove when DesktopTaskListener is introduced. + mDesktopImmersiveController.ifPresent(h -> h.onTransitionMerged(merged, playing)); + } + final List infoOfMerged = mTransitionToTaskInfo.get(merged); if (infoOfMerged == null) { @@ -218,6 +229,11 @@ public class FreeformTaskTransitionObserver implements Transitions.TransitionObs @Override public void onTransitionFinished(@NonNull IBinder transition, boolean aborted) { + if (Flags.enableFullyImmersiveInDesktop()) { + // TODO(b/367268953): Remove when DesktopTaskListener is introduced. + mDesktopImmersiveController.ifPresent(h -> h.onTransitionFinished(transition, aborted)); + } + final List taskInfo = mTransitionToTaskInfo.getOrDefault(transition, Collections.emptyList()); mTransitionToTaskInfo.remove(transition); diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java index 766a6b3f48ac..0d89f757903e 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedHandler.java @@ -83,8 +83,11 @@ public class DefaultMixedHandler implements MixedTransitionHandler, /** Both the display and split-state (enter/exit) is changing */ static final int TYPE_DISPLAY_AND_SPLIT_CHANGE = 2; - /** Pip was entered while handling an intent with its own remoteTransition. */ - static final int TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE = 3; + /** + * While handling an intent with its own remoteTransition, a PIP enter or Desktop immersive + * exit change is found. + */ + static final int TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE = 3; /** Recents transition while split-screen foreground. */ static final int TYPE_RECENTS_DURING_SPLIT = 4; @@ -110,6 +113,9 @@ public class DefaultMixedHandler implements MixedTransitionHandler, /** The display changes when pip is entering. */ static final int TYPE_ENTER_PIP_WITH_DISPLAY_CHANGE = 11; + /** Open transition during a desktop session. */ + static final int TYPE_OPEN_IN_DESKTOP = 12; + /** The default animation for this mixed transition. */ static final int ANIM_TYPE_DEFAULT = 0; @@ -296,7 +302,7 @@ public class DefaultMixedHandler implements MixedTransitionHandler, return null; } final MixedTransition mixed = createDefaultMixedTransition( - MixedTransition.TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE, transition); + MixedTransition.TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE, transition); mixed.mLeftoversHandler = handler.first; mActiveTransitions.add(mixed); if (mixed.mLeftoversHandler != mPlayer.getRemoteTransitionHandler()) { @@ -334,6 +340,20 @@ public class DefaultMixedHandler implements MixedTransitionHandler, MixedTransition.TYPE_UNFOLD, transition)); } return wct; + } else if (mDesktopTasksController != null + && mDesktopTasksController.shouldPlayDesktopAnimation(request)) { + final Pair handler = + mPlayer.dispatchRequest(transition, request, /* skip= */ this); + if (handler == null) { + return null; + } + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " Got a desktop request, so" + + " treat it as Mixed. handler=%s", handler.first); + final MixedTransition mixed = createDefaultMixedTransition( + MixedTransition.TYPE_OPEN_IN_DESKTOP, transition); + mixed.mLeftoversHandler = handler.first; + mActiveTransitions.add(mixed); + return handler.second; } return null; } @@ -341,7 +361,7 @@ public class DefaultMixedHandler implements MixedTransitionHandler, private DefaultMixedTransition createDefaultMixedTransition(int type, IBinder transition) { return new DefaultMixedTransition( type, transition, mPlayer, this, mPipHandler, mSplitHandler, mKeyguardHandler, - mUnfoldHandler, mActivityEmbeddingController); + mUnfoldHandler, mActivityEmbeddingController, mDesktopTasksController); } @Override diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java index c8921d256d7f..3d3de88cdafc 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/DefaultMixedTransition.java @@ -30,6 +30,7 @@ import android.window.TransitionInfo; import com.android.internal.protolog.ProtoLog; import com.android.wm.shell.activityembedding.ActivityEmbeddingController; +import com.android.wm.shell.desktopmode.DesktopTasksController; import com.android.wm.shell.keyguard.KeyguardTransitionHandler; import com.android.wm.shell.pip.PipTransitionController; import com.android.wm.shell.protolog.ShellProtoLogGroup; @@ -39,15 +40,19 @@ import com.android.wm.shell.unfold.UnfoldTransitionHandler; class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { private final UnfoldTransitionHandler mUnfoldHandler; private final ActivityEmbeddingController mActivityEmbeddingController; + @Nullable + private final DesktopTasksController mDesktopTasksController; DefaultMixedTransition(int type, IBinder transition, Transitions player, MixedTransitionHandler mixedHandler, PipTransitionController pipHandler, StageCoordinator splitHandler, KeyguardTransitionHandler keyguardHandler, UnfoldTransitionHandler unfoldHandler, - ActivityEmbeddingController activityEmbeddingController) { + ActivityEmbeddingController activityEmbeddingController, + @Nullable DesktopTasksController desktopTasksController) { super(type, transition, player, mixedHandler, pipHandler, splitHandler, keyguardHandler); mUnfoldHandler = unfoldHandler; mActivityEmbeddingController = activityEmbeddingController; + mDesktopTasksController = desktopTasksController; switch (type) { case TYPE_UNFOLD: @@ -57,7 +62,8 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { case TYPE_ENTER_PIP_FROM_ACTIVITY_EMBEDDING: case TYPE_ENTER_PIP_FROM_SPLIT: case TYPE_KEYGUARD: - case TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE: + case TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE: + case TYPE_OPEN_IN_DESKTOP: default: break; } @@ -85,11 +91,14 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { case TYPE_KEYGUARD -> animateKeyguard(this, info, startTransaction, finishTransaction, finishCallback, mKeyguardHandler, mPipHandler); - case TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE -> - animateOpenIntentWithRemoteAndPip(transition, info, startTransaction, + case TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE -> + animateOpenIntentWithRemoteAndPipOrDesktop(transition, info, startTransaction, finishTransaction, finishCallback); case TYPE_UNFOLD -> animateUnfold(info, startTransaction, finishTransaction, finishCallback); + case TYPE_OPEN_IN_DESKTOP -> + animateOpenInDesktop( + transition, info, startTransaction, finishTransaction, finishCallback); default -> throw new IllegalStateException( "Starting default mixed animation with unknown or illegal type: " + mType); }; @@ -146,31 +155,34 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { return true; } - private boolean animateOpenIntentWithRemoteAndPip( + private boolean animateOpenIntentWithRemoteAndPipOrDesktop( @NonNull IBinder transition, @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Mixed transition for opening an intent" - + " with a remote transition and PIP #%d", info.getDebugId()); - boolean handledToPip = tryAnimateOpenIntentWithRemoteAndPip( + + " with a remote transition and PIP or Desktop #%d", info.getDebugId()); + boolean handledToPipOrDesktop = tryAnimateOpenIntentWithRemoteAndPipOrDesktop( info, startTransaction, finishTransaction, finishCallback); // Consume the transition on remote handler if the leftover handler already handle this // transition. And if it cannot, the transition will be handled by remote handler, so don't // consume here. - // Need to check leftOverHandler as it may change in #animateOpenIntentWithRemoteAndPip - if (handledToPip && mHasRequestToRemote + // Need to check leftOverHandler as it may change in + // #animateOpenIntentWithRemoteAndPipOrDesktop + if (handledToPipOrDesktop && mHasRequestToRemote && mLeftoversHandler != mPlayer.getRemoteTransitionHandler()) { mPlayer.getRemoteTransitionHandler().onTransitionConsumed(transition, false, null); } - return handledToPip; + return handledToPipOrDesktop; } - private boolean tryAnimateOpenIntentWithRemoteAndPip( + private boolean tryAnimateOpenIntentWithRemoteAndPipOrDesktop( @NonNull TransitionInfo info, @NonNull SurfaceControl.Transaction startTransaction, @NonNull SurfaceControl.Transaction finishTransaction, @NonNull Transitions.TransitionFinishCallback finishCallback) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, + "tryAnimateOpenIntentWithRemoteAndPipOrDesktop"); TransitionInfo.Change pipChange = null; for (int i = info.getChanges().size() - 1; i >= 0; --i) { TransitionInfo.Change change = info.getChanges().get(i); @@ -183,13 +195,31 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { info.getChanges().remove(i); } } + TransitionInfo.Change desktopChange = null; + for (int i = info.getChanges().size() - 1; i >= 0; --i) { + TransitionInfo.Change change = info.getChanges().get(i); + if (mDesktopTasksController != null + && mDesktopTasksController.isDesktopChange(mTransition, change)) { + if (desktopChange != null) { + throw new IllegalStateException("More than 1 desktop changes in one" + + " transition? " + info); + } + desktopChange = change; + info.getChanges().remove(i); + } + } Transitions.TransitionFinishCallback finishCB = (wct) -> { --mInFlightSubAnimations; joinFinishArgs(wct); if (mInFlightSubAnimations > 0) return; finishCallback.onTransitionFinished(mFinishWCT); }; - if (pipChange == null) { + if ((pipChange == null && desktopChange == null) + || (pipChange != null && desktopChange != null)) { + // Don't split the transition. Let the leftovers handler handle it all. + // TODO: b/? - split the transition into three pieces when there's both a PIP and a + // desktop change are present. For example, during remote intent open over a desktop + // with both a PIP capable task and an immersive task. if (mLeftoversHandler != null) { mInFlightSubAnimations = 1; if (mLeftoversHandler.startAnimation( @@ -198,27 +228,52 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { } } return false; - } - ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Splitting PIP into a separate" - + " animation because remote-animation likely doesn't support it #%d", - info.getDebugId()); - // Split the transition into 2 parts: the pip part and the rest. - mInFlightSubAnimations = 2; - // make a new startTransaction because pip's startEnterAnimation "consumes" it so - // we need a separate one to send over to launcher. - SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); + } else if (pipChange != null && desktopChange == null) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Splitting PIP into a separate" + + " animation because remote-animation likely doesn't support it #%d", + info.getDebugId()); + // Split the transition into 2 parts: the pip part and the rest. + mInFlightSubAnimations = 2; + // make a new startTransaction because pip's startEnterAnimation "consumes" it so + // we need a separate one to send over to launcher. + SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); + + mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction, finishCB); + + // Dispatch the rest of the transition normally. + if (mLeftoversHandler != null + && mLeftoversHandler.startAnimation(mTransition, info, + startTransaction, finishTransaction, finishCB)) { + return true; + } + mLeftoversHandler = mPlayer.dispatchTransition( + mTransition, info, startTransaction, finishTransaction, finishCB, + mMixedHandler); + return true; + } else if (pipChange == null && desktopChange != null) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Splitting desktop change into a" + + "separate animation because remote-animation likely doesn't support" + + "it #%d", info.getDebugId()); + mInFlightSubAnimations = 2; + SurfaceControl.Transaction otherStartT = new SurfaceControl.Transaction(); - mPipHandler.startEnterAnimation(pipChange, otherStartT, finishTransaction, finishCB); + mDesktopTasksController.animateDesktopChange( + mTransition, desktopChange, otherStartT, finishTransaction, finishCB); - // Dispatch the rest of the transition normally. - if (mLeftoversHandler != null - && mLeftoversHandler.startAnimation(mTransition, info, - startTransaction, finishTransaction, finishCB)) { + // Dispatch the rest of the transition normally. + if (mLeftoversHandler != null + && mLeftoversHandler.startAnimation(mTransition, info, + startTransaction, finishTransaction, finishCB)) { + return true; + } + mLeftoversHandler = mPlayer.dispatchTransition( + mTransition, info, startTransaction, finishTransaction, finishCB, + mMixedHandler); return true; + } else { + throw new IllegalStateException( + "All PIP and Immersive combinations should've been handled"); } - mLeftoversHandler = mPlayer.dispatchTransition( - mTransition, info, startTransaction, finishTransaction, finishCB, mMixedHandler); - return true; } private boolean animateUnfold( @@ -246,6 +301,51 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { mTransition, info, startTransaction, finishTransaction, finishCB); } + private boolean animateOpenInDesktop( + @NonNull IBinder transition, + @NonNull TransitionInfo info, + @NonNull SurfaceControl.Transaction startTransaction, + @NonNull SurfaceControl.Transaction finishTransaction, + @NonNull Transitions.TransitionFinishCallback finishCallback) { + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "animateOpenInDesktop"); + TransitionInfo.Change desktopChange = null; + for (int i = info.getChanges().size() - 1; i >= 0; --i) { + TransitionInfo.Change change = info.getChanges().get(i); + if (mDesktopTasksController.isDesktopChange(mTransition, change)) { + if (desktopChange != null) { + throw new IllegalStateException("More than 1 desktop changes in one" + + " transition? " + info); + } + desktopChange = change; + info.getChanges().remove(i); + } + } + final Transitions.TransitionFinishCallback finishCB = (wct) -> { + --mInFlightSubAnimations; + joinFinishArgs(wct); + if (mInFlightSubAnimations > 0) return; + finishCallback.onTransitionFinished(mFinishWCT); + }; + if (desktopChange == null) { + if (mLeftoversHandler != null) { + mInFlightSubAnimations = 1; + if (mLeftoversHandler.startAnimation( + mTransition, info, startTransaction, finishTransaction, finishCB)) { + return true; + } + } + return false; + } + ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Splitting desktop change into a" + + "separate animation #%d", info.getDebugId()); + mInFlightSubAnimations = 2; + mDesktopTasksController.animateDesktopChange( + transition, desktopChange, startTransaction, finishTransaction, finishCB); + mLeftoversHandler = mPlayer.dispatchTransition( + mTransition, info, startTransaction, finishTransaction, finishCB, mMixedHandler); + return true; + } + @Override void mergeAnimation( @NonNull IBinder transition, @NonNull TransitionInfo info, @@ -279,7 +379,7 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { case TYPE_KEYGUARD: mKeyguardHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback); return; - case TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE: + case TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE: mPipHandler.end(); if (mLeftoversHandler != null) { mLeftoversHandler.mergeAnimation( @@ -289,6 +389,10 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { case TYPE_UNFOLD: mUnfoldHandler.mergeAnimation(transition, info, t, mergeTarget, finishCallback); return; + case TYPE_OPEN_IN_DESKTOP: + mDesktopTasksController.mergeAnimation( + transition, info, t, mergeTarget, finishCallback); + return; default: throw new IllegalStateException("Playing a default mixed transition with unknown or" + " illegal type: " + mType); @@ -310,12 +414,14 @@ class DefaultMixedTransition extends DefaultMixedHandler.MixedTransition { case TYPE_KEYGUARD: mKeyguardHandler.onTransitionConsumed(transition, aborted, finishT); break; - case TYPE_OPTIONS_REMOTE_AND_PIP_CHANGE: + case TYPE_OPTIONS_REMOTE_AND_PIP_OR_DESKTOP_CHANGE: mLeftoversHandler.onTransitionConsumed(transition, aborted, finishT); break; case TYPE_UNFOLD: mUnfoldHandler.onTransitionConsumed(transition, aborted, finishT); break; + case TYPE_OPEN_IN_DESKTOP: + mDesktopTasksController.onTransitionConsumed(transition, aborted, finishT); default: break; } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt similarity index 72% rename from libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt rename to libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt index 5842dfaef0fe..e83f5c7a79a1 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopFullImmersiveTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopImmersiveControllerTest.kt @@ -15,6 +15,7 @@ */ package com.android.wm.shell.desktopmode +import android.app.ActivityManager.RunningTaskInfo import android.app.WindowConfiguration.WINDOW_CONFIG_BOUNDS import android.graphics.Rect import android.os.Binder @@ -58,13 +59,13 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever /** - * Tests for [DesktopFullImmersiveTransitionHandler]. + * Tests for [DesktopImmersiveController]. * - * Usage: atest WMShellUnitTests:DesktopFullImmersiveTransitionHandlerTest + * Usage: atest WMShellUnitTests:DesktopImmersiveControllerTest */ @SmallTest @RunWith(AndroidTestingRunner::class) -class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { +class DesktopImmersiveControllerTest : ShellTestCase() { @JvmField @Rule val setFlagsRule = SetFlagsRule() @@ -75,7 +76,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { @Mock private lateinit var mockDisplayLayout: DisplayLayout private val transactionSupplier = { SurfaceControl.Transaction() } - private lateinit var immersiveHandler: DesktopFullImmersiveTransitionHandler + private lateinit var controller: DesktopImmersiveController @Before fun setUp() { @@ -87,7 +88,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { whenever(mockDisplayLayout.getStableBounds(any())).thenAnswer { invocation -> (invocation.getArgument(0) as Rect).set(STABLE_BOUNDS) } - immersiveHandler = DesktopFullImmersiveTransitionHandler( + controller = DesktopImmersiveController( transitions = mockTransitions, desktopRepository = desktopRepository, displayController = mockDisplayController, @@ -100,7 +101,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { fun enterImmersive_transitionReady_updatesRepository() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -108,16 +109,14 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.moveTaskToImmersive(task) - immersiveHandler.onTransitionReady( + controller.moveTaskToImmersive(task) + controller.onTransitionReady( transition = mockBinder, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { - taskInfo = task - } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isTrue() @@ -128,7 +127,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { fun enterImmersive_savesPreImmersiveBounds() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -137,16 +136,14 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { ) assertThat(desktopRepository.removeBoundsBeforeFullImmersive(task.taskId)).isNull() - immersiveHandler.moveTaskToImmersive(task) - immersiveHandler.onTransitionReady( + controller.moveTaskToImmersive(task) + controller.onTransitionReady( transition = mockBinder, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { - taskInfo = task - } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.removeBoundsBeforeFullImmersive(task.taskId)).isNotNull() @@ -156,7 +153,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { fun exitImmersive_transitionReady_updatesRepository() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -164,16 +161,14 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.moveTaskToNonImmersive(task) - immersiveHandler.onTransitionReady( + controller.moveTaskToNonImmersive(task) + controller.onTransitionReady( transition = mockBinder, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { - taskInfo = task - } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse() @@ -184,7 +179,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { fun exitImmersive_onTransitionReady_removesBoundsBeforeImmersive() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) desktopRepository.setTaskInFullImmersiveState( displayId = task.displayId, @@ -193,16 +188,14 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { ) desktopRepository.saveBoundsBeforeFullImmersive(task.taskId, Rect(100, 100, 600, 600)) - immersiveHandler.moveTaskToNonImmersive(task) - immersiveHandler.onTransitionReady( + controller.moveTaskToNonImmersive(task) + controller.onTransitionReady( transition = mockBinder, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { - taskInfo = task - } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.removeBoundsBeforeMaximize(task.taskId)).isNull() @@ -217,16 +210,15 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.onTransitionReady( + controller.onTransitionReady( transition = mock(IBinder::class.java), info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { - taskInfo = task - setRotation(/* start= */ Surface.ROTATION_0, /* end= */ Surface.ROTATION_90) - } - ) - ) + changes = listOf(createChange(task).apply { + setRotation(/* start= */ Surface.ROTATION_0, /* end= */ Surface.ROTATION_90) + }) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse() @@ -236,28 +228,28 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { fun enterImmersive_inProgress_ignores() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) - immersiveHandler.moveTaskToImmersive(task) - immersiveHandler.moveTaskToImmersive(task) + controller.moveTaskToImmersive(task) + controller.moveTaskToImmersive(task) verify(mockTransitions, times(1)) - .startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler)) + .startTransition(eq(TRANSIT_CHANGE), any(), eq(controller)) } @Test fun exitImmersive_inProgress_ignores() { val task = createFreeformTask() val mockBinder = mock(IBinder::class.java) - whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler))) + whenever(mockTransitions.startTransition(eq(TRANSIT_CHANGE), any(), eq(controller))) .thenReturn(mockBinder) - immersiveHandler.moveTaskToNonImmersive(task) - immersiveHandler.moveTaskToNonImmersive(task) + controller.moveTaskToNonImmersive(task) + controller.moveTaskToNonImmersive(task) verify(mockTransitions, times(1)) - .startTransition(eq(TRANSIT_CHANGE), any(), eq(immersiveHandler)) + .startTransition(eq(TRANSIT_CHANGE), any(), eq(controller)) } @Test @@ -273,9 +265,9 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isTrue() @@ -294,9 +286,9 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isFalse() @@ -315,7 +307,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) assertThat(wct.hasBoundsChange(task.token)).isTrue() } @@ -333,7 +325,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) assertThat(wct.hasBoundsChange(task.token)).isFalse() } @@ -351,13 +343,13 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable( + controller.exitImmersiveIfApplicable( wct = wct, displayId = DEFAULT_DISPLAY, excludeTaskId = task.taskId )?.invoke(transition) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isFalse() @@ -375,7 +367,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct = wct, taskInfo = task) + controller.exitImmersiveIfApplicable(wct = wct, taskInfo = task) assertThat(wct.hasBoundsChange(task.token)).isTrue() } @@ -392,7 +384,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(wct, task) + controller.exitImmersiveIfApplicable(wct, task) assertThat(wct.hasBoundsChange(task.token)).isFalse() } @@ -410,9 +402,9 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(transition) + controller.exitImmersiveIfApplicable(wct, task)?.invoke(transition) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isTrue() @@ -431,9 +423,9 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = false ) - immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(transition) + controller.exitImmersiveIfApplicable(wct, task)?.invoke(transition) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isFalse() @@ -441,7 +433,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) - fun onTransitionReady_pendingExit_removesPendingExit() { + fun onTransitionReady_pendingExit_removesPendingExitOnFinish() { val task = createFreeformTask() whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) val wct = WindowContainerTransaction() @@ -451,23 +443,60 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { taskId = task.taskId, immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - immersiveHandler.onTransitionReady( + controller.onTransitionReady( transition = transition, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { taskInfo = task } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) + controller.onTransitionFinished(transition, aborted = false) - assertThat(immersiveHandler.pendingExternalExitTransitions.any { exit -> + assertThat(controller.pendingExternalExitTransitions.any { exit -> exit.transition == transition && exit.displayId == DEFAULT_DISPLAY && exit.taskId == task.taskId }).isFalse() } + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun onTransitionReady_pendingExit_withMerge_removesPendingExitOnFinish() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + val mergedToTransition = Binder() + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + controller.onTransitionReady( + transition = transition, + info = createTransitionInfo( + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), + ) + controller.onTransitionMerged(transition, mergedToTransition) + controller.onTransitionFinished(mergedToTransition, aborted = false) + + assertThat(controller.pendingExternalExitTransitions.any { exit -> + exit.transition == transition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + assertThat(controller.pendingExternalExitTransitions.any { exit -> + exit.transition == mergedToTransition && exit.displayId == DEFAULT_DISPLAY + && exit.taskId == task.taskId + }).isFalse() + } + @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) fun onTransitionReady_pendingExit_updatesRepository() { @@ -480,15 +509,15 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { taskId = task.taskId, immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - immersiveHandler.onTransitionReady( + controller.onTransitionReady( transition = transition, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { taskInfo = task } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.isTaskInFullImmersiveState(task.taskId)).isFalse() @@ -510,15 +539,15 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) desktopRepository.saveBoundsBeforeFullImmersive(task.taskId, Rect(100, 100, 600, 600)) - immersiveHandler.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) - immersiveHandler.onTransitionReady( + controller.onTransitionReady( transition = transition, info = createTransitionInfo( - changes = listOf( - TransitionInfo.Change(task.token, SurfaceControl()).apply { taskInfo = task } - ) - ) + changes = listOf(createChange(task)) + ), + startTransaction = SurfaceControl.Transaction(), + finishTransaction = SurfaceControl.Transaction(), ) assertThat(desktopRepository.removeBoundsBeforeMaximize(task.taskId)).isNull() @@ -537,7 +566,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct = wct, taskInfo = task) + controller.exitImmersiveIfApplicable(wct = wct, taskInfo = task) assertThat( wct.hasBoundsChange(task.token, calculateMaximizeBounds(mockDisplayLayout, task)) @@ -561,7 +590,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { val preImmersiveBounds = Rect(100, 100, 500, 500) desktopRepository.saveBoundsBeforeFullImmersive(task.taskId, preImmersiveBounds) - immersiveHandler.exitImmersiveIfApplicable(wct = wct, taskInfo = task) + controller.exitImmersiveIfApplicable(wct = wct, taskInfo = task) assertThat( wct.hasBoundsChange(task.token, preImmersiveBounds) @@ -584,7 +613,7 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct = wct, taskInfo = task) + controller.exitImmersiveIfApplicable(wct = wct, taskInfo = task) assertThat( wct.hasBoundsChange(task.token, calculateInitialBounds(mockDisplayLayout, task)) @@ -602,13 +631,32 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { taskId = task.taskId, immersive = true ) - immersiveHandler.exitImmersiveIfApplicable(wct, task)?.invoke(Binder()) + controller.exitImmersiveIfApplicable(wct, task)?.invoke(Binder()) - immersiveHandler.moveTaskToNonImmersive(task) + controller.moveTaskToNonImmersive(task) verify(mockTransitions, never()).startTransition(any(), any(), any()) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun exitImmersiveIfApplicable_inImmersive_isImmersiveChange() { + val task = createFreeformTask() + whenever(mockShellTaskOrganizer.getRunningTaskInfo(task.taskId)).thenReturn(task) + val wct = WindowContainerTransaction() + val transition = Binder() + val change = createChange(task) + desktopRepository.setTaskInFullImmersiveState( + displayId = DEFAULT_DISPLAY, + taskId = task.taskId, + immersive = true + ) + + controller.exitImmersiveIfApplicable(transition, wct, DEFAULT_DISPLAY) + + assertThat(controller.isImmersiveChange(transition, change)).isTrue() + } + private fun createTransitionInfo( @TransitionType type: Int = TRANSIT_CHANGE, @TransitionFlags flags: Int = 0, @@ -617,6 +665,11 @@ class DesktopFullImmersiveTransitionHandlerTest : ShellTestCase() { changes.forEach { change -> addChange(change) } } + private fun createChange(task: RunningTaskInfo): TransitionInfo.Change = + TransitionInfo.Change(task.token, SurfaceControl()).apply { + taskInfo = task + } + private fun WindowContainerTransaction.hasBoundsChange(token: WindowContainerToken): Boolean = this.changes.any { change -> change.key == token.asBinder() diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt index 7a3d44bded8e..bc2b36ccd835 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopTasksControllerTest.kt @@ -201,7 +201,7 @@ class DesktopTasksControllerTest : ShellTestCase() { lateinit var toggleResizeDesktopTaskTransitionHandler: ToggleResizeDesktopTaskTransitionHandler @Mock lateinit var dragToDesktopTransitionHandler: DragToDesktopTransitionHandler @Mock - lateinit var mockDesktopFullImmersiveTransitionHandler: DesktopFullImmersiveTransitionHandler + lateinit var mMockDesktopImmersiveController: DesktopImmersiveController @Mock lateinit var launchAdjacentController: LaunchAdjacentController @Mock lateinit var splitScreenController: SplitScreenController @Mock lateinit var recentsTransitionHandler: RecentsTransitionHandler @@ -322,7 +322,7 @@ class DesktopTasksControllerTest : ShellTestCase() { dragAndDropTransitionHandler, toggleResizeDesktopTaskTransitionHandler, dragToDesktopTransitionHandler, - mockDesktopFullImmersiveTransitionHandler, + mMockDesktopImmersiveController, taskRepository, desktopModeLoggerTransitionObserver, launchAdjacentController, @@ -1773,7 +1773,7 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.minimizeTask(task) - verify(mockDesktopFullImmersiveTransitionHandler).exitImmersiveIfApplicable(any(), eq(task)) + verify(mMockDesktopImmersiveController).exitImmersiveIfApplicable(any(), eq(task)) } @Test @@ -1783,7 +1783,7 @@ class DesktopTasksControllerTest : ShellTestCase() { val runOnTransit = RunOnStartTransitionCallback() whenever(freeformTaskTransitionStarter.startMinimizedModeTransition(any())) .thenReturn(transition) - whenever(mockDesktopFullImmersiveTransitionHandler.exitImmersiveIfApplicable(any(), eq(task))) + whenever(mMockDesktopImmersiveController.exitImmersiveIfApplicable(any(), eq(task))) .thenReturn(runOnTransit) controller.minimizeTask(task) @@ -3092,13 +3092,13 @@ class DesktopTasksControllerTest : ShellTestCase() { val transition = Binder() whenever(transitions.startTransition(eq(TRANSIT_OPEN), any(), anyOrNull())) .thenReturn(transition) - whenever(mockDesktopFullImmersiveTransitionHandler + whenever(mMockDesktopImmersiveController .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId), eq(freeformTask.taskId))) .thenReturn(runOnStartTransit) runOpenInstance(immersiveTask, freeformTask.taskId) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(any(), eq(immersiveTask.displayId), eq(freeformTask.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3446,7 +3446,7 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.toggleDesktopTaskFullImmersiveState(task) - verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToImmersive(task) + verify(mMockDesktopImmersiveController).moveTaskToImmersive(task) } @Test @@ -3456,7 +3456,7 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.toggleDesktopTaskFullImmersiveState(task) - verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToNonImmersive(task) + verify(mMockDesktopImmersiveController).moveTaskToNonImmersive(task) } @Test @@ -3468,7 +3468,7 @@ class DesktopTasksControllerTest : ShellTestCase() { task.requestedVisibleTypes = WindowInsets.Type.statusBars() controller.onTaskInfoChanged(task) - verify(mockDesktopFullImmersiveTransitionHandler).moveTaskToNonImmersive(task) + verify(mMockDesktopImmersiveController).moveTaskToNonImmersive(task) } @Test @@ -3480,7 +3480,7 @@ class DesktopTasksControllerTest : ShellTestCase() { task.requestedVisibleTypes = WindowInsets.Type.statusBars() controller.onTaskInfoChanged(task) - verify(mockDesktopFullImmersiveTransitionHandler, never()).moveTaskToNonImmersive(task) + verify(mMockDesktopImmersiveController, never()).moveTaskToNonImmersive(task) } @Test @@ -3489,13 +3489,13 @@ class DesktopTasksControllerTest : ShellTestCase() { val wct = WindowContainerTransaction() val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() - whenever(mockDesktopFullImmersiveTransitionHandler + whenever(mMockDesktopImmersiveController .exitImmersiveIfApplicable(wct, task.displayId, task.taskId)).thenReturn(runOnStartTransit) whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(wct, task.displayId, task.taskId) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3506,13 +3506,13 @@ class DesktopTasksControllerTest : ShellTestCase() { val wct = WindowContainerTransaction() val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() - whenever(mockDesktopFullImmersiveTransitionHandler + whenever(mMockDesktopImmersiveController .exitImmersiveIfApplicable(wct, task.displayId, task.taskId)).thenReturn(runOnStartTransit) whenever(enterDesktopTransitionHandler.moveToDesktop(wct, UNKNOWN)).thenReturn(transition) controller.moveTaskToDesktop(taskId = task.taskId, wct = wct, transitionSource = UNKNOWN) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(wct, task.displayId, task.taskId) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3522,14 +3522,14 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFreeformTask(background = true) val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() - whenever(mockDesktopFullImmersiveTransitionHandler + whenever(mMockDesktopImmersiveController .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId))) .thenReturn(runOnStartTransit) whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) controller.moveTaskToFront(task.taskId, remoteTransition = null) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3539,14 +3539,14 @@ class DesktopTasksControllerTest : ShellTestCase() { val task = setUpFreeformTask(background = false) val runOnStartTransit = RunOnStartTransitionCallback() val transition = Binder() - whenever(mockDesktopFullImmersiveTransitionHandler + whenever(mMockDesktopImmersiveController .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId))) .thenReturn(runOnStartTransit) whenever(transitions.startTransition(any(), any(), anyOrNull())).thenReturn(transition) controller.moveTaskToFront(task.taskId, remoteTransition = null) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(any(), eq(task.displayId), eq(task.taskId)) runOnStartTransit.assertOnlyInvocation(transition) } @@ -3560,7 +3560,7 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.handleRequest(binder, createTransition(task)) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(eq(binder), any(), eq(task.displayId)) } @@ -3572,10 +3572,117 @@ class DesktopTasksControllerTest : ShellTestCase() { controller.handleRequest(binder, createTransition(task)) - verify(mockDesktopFullImmersiveTransitionHandler) + verify(mMockDesktopImmersiveController) .exitImmersiveIfApplicable(eq(binder), any(), eq(task.displayId)) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_notShowingDesktop_doesNotPlay() { + val triggerTask = setUpFullscreenTask(displayId = 5) + taskRepository.setTaskInFullImmersiveState( + displayId = triggerTask.displayId, + taskId = triggerTask.taskId, + immersive = true + ) + + assertThat(controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + )).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_notOpening_doesNotPlay() { + val triggerTask = setUpFreeformTask(displayId = 5) + taskRepository.setTaskInFullImmersiveState( + displayId = triggerTask.displayId, + taskId = triggerTask.taskId, + immersive = true + ) + + assertThat(controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_CHANGE, triggerTask, /* remoteTransition= */ null) + )).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_notImmersive_doesNotPlay() { + val triggerTask = setUpFreeformTask(displayId = 5) + taskRepository.setTaskInFullImmersiveState( + displayId = triggerTask.displayId, + taskId = triggerTask.taskId, + immersive = false + ) + + assertThat(controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + )).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_fullscreenEntersDesktop_plays() { + // At least one freeform task to be in a desktop. + val existingTask = setUpFreeformTask(displayId = 5) + val triggerTask = setUpFullscreenTask(displayId = 5) + assertThat(controller.isDesktopModeShowing(triggerTask.displayId)).isTrue() + taskRepository.setTaskInFullImmersiveState( + displayId = existingTask.displayId, + taskId = existingTask.taskId, + immersive = true + ) + + assertThat( + controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + ) + ).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_fullscreenStaysFullscreen_doesNotPlay() { + val triggerTask = setUpFullscreenTask(displayId = 5) + assertThat(controller.isDesktopModeShowing(triggerTask.displayId)).isFalse() + + assertThat(controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + )).isFalse() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_freeformStaysInDesktop_plays() { + // At least one freeform task to be in a desktop. + val existingTask = setUpFreeformTask(displayId = 5) + val triggerTask = setUpFreeformTask(displayId = 5, active = false) + assertThat(controller.isDesktopModeShowing(triggerTask.displayId)).isTrue() + taskRepository.setTaskInFullImmersiveState( + displayId = existingTask.displayId, + taskId = existingTask.taskId, + immersive = true + ) + + assertThat( + controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + ) + ).isTrue() + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + fun shouldPlayDesktopAnimation_freeformExitsDesktop_doesNotPlay() { + val triggerTask = setUpFreeformTask(displayId = 5, active = false) + assertThat(controller.isDesktopModeShowing(triggerTask.displayId)).isFalse() + + assertThat(controller.shouldPlayDesktopAnimation( + TransitionRequestInfo(TRANSIT_OPEN, triggerTask, /* remoteTransition= */ null) + )).isFalse() + } + private class RunOnStartTransitionCallback : ((IBinder) -> Unit) { var invocations = 0 private set diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java index 7ae0bcd13681..90ab2b8285cd 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/freeform/FreeformTaskTransitionObserverTest.java @@ -43,7 +43,7 @@ import android.window.WindowContainerToken; import androidx.test.filters.SmallTest; import com.android.window.flags.Flags; -import com.android.wm.shell.desktopmode.DesktopFullImmersiveTransitionHandler; +import com.android.wm.shell.desktopmode.DesktopImmersiveController; import com.android.wm.shell.sysui.ShellInit; import com.android.wm.shell.transition.FocusTransitionObserver; import com.android.wm.shell.transition.TransitionInfoBuilder; @@ -70,7 +70,7 @@ public class FreeformTaskTransitionObserverTest { @Mock private Transitions mTransitions; @Mock - private DesktopFullImmersiveTransitionHandler mDesktopFullImmersiveTransitionHandler; + private DesktopImmersiveController mDesktopImmersiveController; @Mock private WindowDecorViewModel mWindowDecorViewModel; @Mock @@ -92,7 +92,7 @@ public class FreeformTaskTransitionObserverTest { mTransitionObserver = new FreeformTaskTransitionObserver( context, mShellInit, mTransitions, - Optional.of(mDesktopFullImmersiveTransitionHandler), + Optional.of(mDesktopImmersiveController), mWindowDecorViewModel, Optional.of(mTaskChangeListener), mFocusTransitionObserver); final ArgumentCaptor initRunnableCaptor = ArgumentCaptor.forClass( @@ -321,7 +321,7 @@ public class FreeformTaskTransitionObserverTest { @Test @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) - public void onTransitionReady_forwardsToDesktopImmersiveHandler() { + public void onTransitionReady_forwardsToDesktopImmersiveController() { final IBinder transition = mock(IBinder.class); final TransitionInfo info = new TransitionInfoBuilder(TRANSIT_CHANGE, 0).build(); final SurfaceControl.Transaction startT = mock(SurfaceControl.Transaction.class); @@ -329,7 +329,38 @@ public class FreeformTaskTransitionObserverTest { mTransitionObserver.onTransitionReady(transition, info, startT, finishT); - verify(mDesktopFullImmersiveTransitionHandler).onTransitionReady(transition, info); + verify(mDesktopImmersiveController).onTransitionReady(transition, info, startT, finishT); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + public void onTransitionMerged_forwardsToDesktopImmersiveController() { + final IBinder merged = mock(IBinder.class); + final IBinder playing = mock(IBinder.class); + + mTransitionObserver.onTransitionMerged(merged, playing); + + verify(mDesktopImmersiveController).onTransitionMerged(merged, playing); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + public void onTransitionStarting_forwardsToDesktopImmersiveController() { + final IBinder transition = mock(IBinder.class); + + mTransitionObserver.onTransitionStarting(transition); + + verify(mDesktopImmersiveController).onTransitionStarting(transition); + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_FULLY_IMMERSIVE_IN_DESKTOP) + public void onTransitionFinished_forwardsToDesktopImmersiveController() { + final IBinder transition = mock(IBinder.class); + + mTransitionObserver.onTransitionFinished(transition, /* aborted= */ false); + + verify(mDesktopImmersiveController).onTransitionFinished(transition, /* aborted= */ false); } private static TransitionInfo.Change createChange(int mode, int taskId, int windowingMode) { -- GitLab From dc0e0d26b5ae3452f933c590fcce1fc9f554f36f Mon Sep 17 00:00:00 2001 From: Jorge Gil Date: Mon, 21 Oct 2024 18:04:45 +0000 Subject: [PATCH 273/459] Move exit transitions flag check to DesktopMixedTransitionHandler To allow other mixed transitions to use the same handler but with different flags. Flag: EXEMPT refactor Bug: 372319492 Test: exit transition still works behind the flag Change-Id: Iee3b71a886618127fa802046f825c2242eed140d --- .../wm/shell/dagger/WMShellModule.java | 4 +--- .../DesktopMixedTransitionHandler.kt | 4 ++++ .../DesktopMixedTransitionHandlerTest.kt | 20 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java index b700a5455f1a..7f547868b3e2 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/dagger/WMShellModule.java @@ -17,7 +17,6 @@ package com.android.wm.shell.dagger; import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_ENTER_TRANSITIONS; -import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS; import static android.window.DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_TASK_LIMIT; import android.annotation.Nullable; @@ -848,8 +847,7 @@ public abstract class WMShellModule { InteractionJankMonitor interactionJankMonitor, @ShellMainThread Handler handler ) { - if (!DesktopModeStatus.canEnterDesktopMode(context) - || !ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue()) { + if (!DesktopModeStatus.canEnterDesktopMode(context)) { return Optional.empty(); } return Optional.of( diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt index df9fc59b925e..d6dee0dec8ed 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandler.kt @@ -23,6 +23,7 @@ import android.os.Handler import android.os.IBinder import android.view.SurfaceControl import android.view.WindowManager +import android.window.DesktopModeFlags import android.window.TransitionInfo import android.window.TransitionRequestInfo import android.window.WindowContainerTransaction @@ -59,6 +60,9 @@ class DesktopMixedTransitionHandler( /** Starts close transition and handles or delegates desktop task close animation. */ override fun startRemoveTransition(wct: WindowContainerTransaction?): IBinder { + if (!DesktopModeFlags.ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS.isTrue) { + return freeformTaskTransitionHandler.startRemoveTransition(wct) + } requireNotNull(wct) return transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, /* handler= */ this) } diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt index 81d59d586dd3..46cc5163bdf6 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/DesktopMixedTransitionHandlerTest.kt @@ -24,6 +24,9 @@ import android.app.WindowConfiguration.WindowingMode import android.os.Binder import android.os.Handler import android.os.IBinder +import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule import android.testing.AndroidTestingRunner import android.testing.TestableLooper.RunWithLooper import android.view.SurfaceControl @@ -33,6 +36,7 @@ import android.window.WindowContainerTransaction import androidx.test.filters.SmallTest import com.android.internal.jank.Cuj.CUJ_DESKTOP_MODE_EXIT_MODE_ON_LAST_WINDOW_CLOSE import com.android.internal.jank.InteractionJankMonitor +import com.android.window.flags.Flags import com.android.wm.shell.ShellTestCase import com.android.wm.shell.TestRunningTaskInfoBuilder import com.android.wm.shell.freeform.FreeformTaskTransitionHandler @@ -41,6 +45,7 @@ import org.junit.Assert.assertFalse import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock @@ -60,6 +65,8 @@ import org.mockito.kotlin.whenever @RunWith(AndroidTestingRunner::class) class DesktopMixedTransitionHandlerTest : ShellTestCase() { + @JvmField @Rule val setFlagsRule = SetFlagsRule() + @Mock lateinit var transitions: Transitions @Mock lateinit var desktopRepository: DesktopRepository @Mock lateinit var freeformTaskTransitionHandler: FreeformTaskTransitionHandler @@ -106,6 +113,19 @@ class DesktopMixedTransitionHandlerTest : ShellTestCase() { } @Test + @DisableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS) + fun startRemoveTransition_callsFreeformTaskTransitionHandler() { + val wct = WindowContainerTransaction() + whenever(freeformTaskTransitionHandler.startRemoveTransition(wct)) + .thenReturn(mock()) + + mixedHandler.startRemoveTransition(wct) + + verify(freeformTaskTransitionHandler).startRemoveTransition(wct) + } + + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_EXIT_TRANSITIONS) fun startRemoveTransition_startsCloseTransition() { val wct = WindowContainerTransaction() whenever(transitions.startTransition(WindowManager.TRANSIT_CLOSE, wct, mixedHandler)) -- GitLab From a21a24f1b89436855189675d15f0d50d25736aa9 Mon Sep 17 00:00:00 2001 From: Eric Lin Date: Mon, 21 Oct 2024 17:57:06 +0800 Subject: [PATCH 274/459] Implement getCurrentWindowLayoutInfo() API. This commit implements the getCurrentWindowLayoutInfo() API in window extension v9, targeting the 25Q2 release. It enables access to window layout information during the onCreate lifecycle callback. Check ag/29908303 for API definition and more details. Bug: 337820752 Flag: com.android.window.flags.wlinfo_oncreate Test: atest WMJetpackUnitTests:WindowLayoutComponentImplTest Change-Id: I43403a633e9a396ab9ce2cc1aef4ff4c70547573 --- .../common/layout/CommonFoldingFeature.java | 4 +- .../extensions/WindowExtensionsImpl.java | 5 ++ .../layout/WindowLayoutComponentImpl.java | 15 ++++ .../layout/WindowLayoutComponentImplTest.java | 84 +++++++++++++++++-- 4 files changed, 99 insertions(+), 9 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/common/layout/CommonFoldingFeature.java b/libs/WindowManager/Jetpack/src/androidx/window/common/layout/CommonFoldingFeature.java index 85c4fe1193ee..252974dd474e 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/common/layout/CommonFoldingFeature.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/common/layout/CommonFoldingFeature.java @@ -25,6 +25,7 @@ import android.hardware.devicestate.DeviceStateManager; import android.util.Log; import androidx.annotation.NonNull; +import androidx.annotation.VisibleForTesting; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -212,7 +213,8 @@ public final class CommonFoldingFeature { @NonNull private final Rect mRect; - CommonFoldingFeature(int type, @State int state, @NonNull Rect rect) { + @VisibleForTesting + public CommonFoldingFeature(int type, @State int state, @NonNull Rect rect) { assertReportableState(state); this.mType = type; this.mState = state; diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java index 2ab0310d6789..fcf3a3759f7a 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/WindowExtensionsImpl.java @@ -57,6 +57,8 @@ class WindowExtensionsImpl implements WindowExtensions { */ private static final int NO_LEVEL_OVERRIDE = -1; + private static final int EXTENSIONS_VERSION_V9 = 9; + private static final int EXTENSIONS_VERSION_V8 = 8; private static final int EXTENSIONS_VERSION_V7 = 7; @@ -80,6 +82,9 @@ class WindowExtensionsImpl implements WindowExtensions { */ @VisibleForTesting static int getExtensionsVersionCurrentPlatform() { + if (Flags.wlinfoOncreate()) { + return EXTENSIONS_VERSION_V9; + } if (Flags.aeBackStackRestore()) { return EXTENSIONS_VERSION_V8; } diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java index f1ea19a60f97..556da3798df5 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/layout/WindowLayoutComponentImpl.java @@ -74,6 +74,12 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { @GuardedBy("mLock") private final DeviceStateManagerFoldingFeatureProducer mFoldingFeatureProducer; + /** + * The last reported folding features from the device. This is initialized in the constructor + * because the data change callback added to {@link #mFoldingFeatureProducer} is immediately + * called. This is due to current device state from the device state manager already being + * available in the {@link DeviceStateManagerFoldingFeatureProducer}. + */ @GuardedBy("mLock") private final List mLastReportedFoldingFeatures = new ArrayList<>(); @@ -308,6 +314,7 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { * @param context a proxy for the {@link android.view.Window} that contains the * {@link DisplayFeature}. */ + @NonNull private WindowLayoutInfo getWindowLayoutInfo(@NonNull @UiContext Context context, List storedFeatures) { List displayFeatureList = getDisplayFeatures(context, storedFeatures); @@ -329,6 +336,14 @@ public class WindowLayoutComponentImpl implements WindowLayoutComponent { } } + @Override + @NonNull + public WindowLayoutInfo getCurrentWindowLayoutInfo(@NonNull @UiContext Context context) { + synchronized (mLock) { + return getWindowLayoutInfo(context, mLastReportedFoldingFeatures); + } + } + /** * Returns the {@link SupportedWindowFeatures} for the device. This list does not change over * time. diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/layout/WindowLayoutComponentImplTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/layout/WindowLayoutComponentImplTest.java index ff0a82fe05d6..ed4eddf7c209 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/layout/WindowLayoutComponentImplTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/layout/WindowLayoutComponentImplTest.java @@ -16,22 +16,30 @@ package androidx.window.extensions.layout; +import static com.google.common.truth.Truth.assertThat; + import static org.mockito.Mockito.mock; +import android.app.WindowConfiguration; import android.content.Context; import android.content.ContextWrapper; +import android.graphics.Rect; import android.platform.test.annotations.Presubmit; +import android.view.Display; +import androidx.annotation.NonNull; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import androidx.window.common.DeviceStateManagerFoldingFeatureProducer; +import androidx.window.common.layout.CommonFoldingFeature; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.Collections; +import java.util.List; /** * Test class for {@link WindowLayoutComponentImpl}. @@ -44,31 +52,91 @@ import java.util.Collections; @RunWith(AndroidJUnit4.class) public class WindowLayoutComponentImplTest { + private final Context mAppContext = ApplicationProvider.getApplicationContext(); + + @NonNull private WindowLayoutComponentImpl mWindowLayoutComponent; @Before public void setUp() { - mWindowLayoutComponent = new WindowLayoutComponentImpl( - ApplicationProvider.getApplicationContext(), + mWindowLayoutComponent = new WindowLayoutComponentImpl(mAppContext, mock(DeviceStateManagerFoldingFeatureProducer.class)); } @Test - public void testAddWindowLayoutListenerOnFakeUiContext_noCrash() { - final Context fakeUiContext = createTestContext(); + public void testAddWindowLayoutListener_onFakeUiContext_noCrash() { + final Context fakeUiContext = new FakeUiContext(mAppContext); mWindowLayoutComponent.addWindowLayoutInfoListener(fakeUiContext, info -> {}); mWindowLayoutComponent.onDisplayFeaturesChanged(Collections.emptyList()); } - private static Context createTestContext() { - return new FakeUiContext(ApplicationProvider.getApplicationContext()); + @Test + public void testGetCurrentWindowLayoutInfo_noFoldingFeature_returnsEmptyList() { + final Context testUiContext = new TestUiContext(mAppContext); + + final WindowLayoutInfo layoutInfo = + mWindowLayoutComponent.getCurrentWindowLayoutInfo(testUiContext); + + assertThat(layoutInfo.getDisplayFeatures()).isEmpty(); + } + + @Test + public void testGetCurrentWindowLayoutInfo_hasFoldingFeature_returnsWindowLayoutInfo() { + final Context testUiContext = new TestUiContext(mAppContext); + final WindowConfiguration windowConfiguration = + testUiContext.getResources().getConfiguration().windowConfiguration; + final Rect featureRect = windowConfiguration.getBounds(); + final CommonFoldingFeature foldingFeature = new CommonFoldingFeature( + CommonFoldingFeature.COMMON_TYPE_HINGE, + CommonFoldingFeature.COMMON_STATE_FLAT, + featureRect + ); + mWindowLayoutComponent.onDisplayFeaturesChanged(List.of(foldingFeature)); + + final WindowLayoutInfo layoutInfo = + mWindowLayoutComponent.getCurrentWindowLayoutInfo(testUiContext); + + assertThat(layoutInfo.getDisplayFeatures()).containsExactly(new FoldingFeature( + featureRect, FoldingFeature.TYPE_HINGE, FoldingFeature.STATE_FLAT)); + } + + @Test + public void testGetCurrentWindowLayoutInfo_nonUiContext_returnsEmptyList() { + final WindowLayoutInfo layoutInfo = + mWindowLayoutComponent.getCurrentWindowLayoutInfo(mAppContext); + + assertThat(layoutInfo.getDisplayFeatures()).isEmpty(); + } + + /** + * A {@link Context} that simulates a UI context specifically for testing purposes. + * This class overrides {@link Context#getAssociatedDisplayId()} to return + * {@link Display#DEFAULT_DISPLAY}, ensuring the context is tied to the default display, + * and {@link Context#isUiContext()} to always return {@code true}, simulating a UI context. + */ + private static class TestUiContext extends ContextWrapper { + + TestUiContext(Context base) { + super(base); + } + + @Override + public int getAssociatedDisplayId() { + return Display.DEFAULT_DISPLAY; + } + + @Override + public boolean isUiContext() { + return true; + } } /** - * A {@link android.content.Context} overrides {@link android.content.Context#isUiContext} to - * {@code true}. + * A {@link Context} that cheats by overriding {@link Context#isUiContext} to always + * return {@code true}. This is useful for scenarios where a UI context is needed, + * but the underlying context isn't actually a UI one. */ private static class FakeUiContext extends ContextWrapper { -- GitLab From 7490b43a898fc99048980cd84802f176d044c014 Mon Sep 17 00:00:00 2001 From: Hiroki Sato Date: Wed, 23 Oct 2024 14:37:28 +0900 Subject: [PATCH 275/459] Move magnification_enlarge_pointer aconfig to bugfix flag This is now rolled out as a bugfix. Bug: 355734856 Test: atest com.android.server.accessibility.magnification (with/without flag enabled) Flag: com.android.server.accessibility.magnification_enlarge_pointer_bugfix Change-Id: Ia08e3192577e991acda9a1293fe40a39b2f32f70 --- services/accessibility/accessibility.aconfig | 5 ++++- .../FullScreenMagnificationController.java | 2 +- .../FullScreenMagnificationControllerTest.java | 14 +++++++------- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index cb4e9949a8ff..2808056f72c9 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -175,10 +175,13 @@ flag { } flag { - name: "magnification_enlarge_pointer" + name: "magnification_enlarge_pointer_bugfix" namespace: "accessibility" description: "When fullscreen magnification is enabled, pointer icon is enlarged" bug: "355734856" + metadata { + purpose: PURPOSE_BUGFIX + } } flag { diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java index ce1a292fb069..d3d80e12313f 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/FullScreenMagnificationController.java @@ -1759,7 +1759,7 @@ public class FullScreenMagnificationController implements * @param scale The new scale factor. */ public void notifyScaleForInput(int displayId, float scale) { - if (Flags.magnificationEnlargePointer()) { + if (Flags.magnificationEnlargePointerBugfix()) { mControllerCtx.getInputManager() .setAccessibilityPointerIconScaleFactor(displayId, scale); } diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java index 5985abc344a2..7e0c12a5a545 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/FullScreenMagnificationControllerTest.java @@ -18,7 +18,7 @@ package com.android.server.accessibility.magnification; import static android.accessibilityservice.MagnificationConfig.MAGNIFICATION_MODE_FULLSCREEN; -import static com.android.server.accessibility.Flags.FLAG_MAGNIFICATION_ENLARGE_POINTER; +import static com.android.server.accessibility.Flags.FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX; import static com.android.server.accessibility.magnification.FullScreenMagnificationController.MagnificationInfoChangedCallback; import static com.android.server.accessibility.magnification.MockMagnificationConnection.TEST_DISPLAY; import static com.android.window.flags.Flags.FLAG_ALWAYS_DRAW_MAGNIFICATION_FULLSCREEN_BORDER; @@ -1484,7 +1484,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void persistScale_setValue_notifyInput() { register(TEST_DISPLAY); @@ -1504,7 +1504,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void setScale_setNonTransientScale_notifyInput() { register(TEST_DISPLAY); @@ -1516,7 +1516,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void setScaleAndCenter_setTransientScale_notNotifyInput() { register(TEST_DISPLAY); @@ -1531,7 +1531,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void setScaleAndCenter_setNonTransientScale_notifyInput() { register(TEST_DISPLAY); @@ -1543,7 +1543,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void setCenter_notNotifyInput() { register(TEST_DISPLAY); @@ -1561,7 +1561,7 @@ public class FullScreenMagnificationControllerTest { } @Test - @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER) + @RequiresFlagsEnabled(FLAG_MAGNIFICATION_ENLARGE_POINTER_BUGFIX) public void offsetMagnifiedRegion_notNotifyInput() { register(TEST_DISPLAY); -- GitLab From 2f8edea084d89df50d844c6e23f68ffadc3d56a5 Mon Sep 17 00:00:00 2001 From: Gustav Sennton Date: Thu, 12 Sep 2024 09:46:12 +0000 Subject: [PATCH 276/459] Add perf traces for Transitions calls to handlers and observers. Add Traces for common Transitions calls to be able to debug performance issues quicker. Test: Perfetto traces Bug: 366191871 Flag: EXEMPT tracing only update Change-Id: Ie2a72114d02d0d4299f1ab18ebfd73045aeac61a --- .../wm/shell/transition/Transitions.java | 68 +++++++++++++++++-- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java index 346f21b86e65..7c9cd0862b69 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/transition/Transitions.java @@ -18,6 +18,7 @@ package com.android.wm.shell.transition; import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN; +import static android.os.Trace.TRACE_TAG_WINDOW_MANAGER; import static android.view.WindowManager.TRANSIT_CHANGE; import static android.view.WindowManager.TRANSIT_CLOSE; import static android.view.WindowManager.TRANSIT_FIRST_CUSTOM; @@ -58,6 +59,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemProperties; +import android.os.Trace; import android.provider.Settings; import android.util.ArrayMap; import android.util.Log; @@ -800,8 +802,17 @@ public class Transitions implements RemoteCallable, track.mReadyTransitions.add(active); for (int i = 0; i < mObservers.size(); ++i) { + final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER); + if (useTrace) { + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, + mObservers.get(i).getClass().getSimpleName() + "#onTransitionReady: " + + transitTypeToString(info.getType())); + } mObservers.get(i).onTransitionReady( active.mToken, info, active.mStartT, active.mFinishT); + if (useTrace) { + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); + } } /* @@ -931,7 +942,7 @@ public class Transitions implements RemoteCallable, onFinish(ready.mToken, null); return; } - playTransition(ready); + playTransitionWithTracing(ready); // Attempt to merge any more queued-up transitions. processReadyQueue(track); return; @@ -1003,6 +1014,18 @@ public class Transitions implements RemoteCallable, processReadyQueue(track); } + private void playTransitionWithTracing(@NonNull ActiveTransition active) { + final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER); + if (useTrace) { + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, + "playTransition: " + transitTypeToString(active.mInfo.getType())); + } + playTransition(active); + if (useTrace) { + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); + } + } + private void playTransition(@NonNull ActiveTransition active) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, "Playing animation for %s", active); final var token = active.mToken; @@ -1022,6 +1045,12 @@ public class Transitions implements RemoteCallable, if (consumed) { ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by firstHandler"); mTransitionTracer.logDispatched(active.mInfo.getDebugId(), active.mHandler); + if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) { + Trace.instant(TRACE_TAG_WINDOW_MANAGER, + active.mHandler.getClass().getSimpleName() + + "#startAnimation animated " + + transitTypeToString(active.mInfo.getType())); + } return; } } @@ -1052,6 +1081,12 @@ public class Transitions implements RemoteCallable, ProtoLog.v(ShellProtoLogGroup.WM_SHELL_TRANSITIONS, " animated by %s", mHandlers.get(i)); mTransitionTracer.logDispatched(info.getDebugId(), mHandlers.get(i)); + if (Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER)) { + Trace.instant(TRACE_TAG_WINDOW_MANAGER, + mHandlers.get(i).getClass().getSimpleName() + + "#startAnimation animated " + + transitTypeToString(info.getType())); + } return mHandlers.get(i); } } @@ -1059,6 +1094,26 @@ public class Transitions implements RemoteCallable, "This shouldn't happen, maybe the default handler is broken."); } + private Pair dispatchRequestWithTracing( + @NonNull IBinder transition, @NonNull TransitionRequestInfo request, + @Nullable TransitionHandler skip) { + final boolean useTrace = Trace.isTagEnabled(TRACE_TAG_WINDOW_MANAGER); + if (useTrace) { + Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, + "dispatchRequest: " + transitTypeToString(request.getType())); + } + Pair result = + dispatchRequest(transition, request, skip); + if (useTrace) { + if (result != null) { + Trace.instant(TRACE_TAG_WINDOW_MANAGER, result.first.getClass().getSimpleName() + + "#handleRequest handled " + transitTypeToString(request.getType())); + } + Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); + } + return result; + } + /** * Gives every handler (in order) a chance to handle request until one consumes the transition. * @return the WindowContainerTransaction given by the handler which consumed the transition. @@ -1197,12 +1252,11 @@ public class Transitions implements RemoteCallable, mSleepHandler.handleRequest(transitionToken, request); active.mHandler = mSleepHandler; } else { - for (int i = mHandlers.size() - 1; i >= 0; --i) { - wct = mHandlers.get(i).handleRequest(transitionToken, request); - if (wct != null) { - active.mHandler = mHandlers.get(i); - break; - } + Pair requestResult = + dispatchRequestWithTracing(transitionToken, request, /* skip= */ null); + if (requestResult != null) { + active.mHandler = requestResult.first; + wct = requestResult.second; } if (request.getDisplayChange() != null) { TransitionRequestInfo.DisplayChange change = request.getDisplayChange(); -- GitLab From 8c2acf8c3a15b26f307fb8a0ba0b514161f447eb Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Thu, 5 Sep 2024 17:51:38 +0200 Subject: [PATCH 277/459] Introduce sharedElement.elevateInContent (1/2) This CL introduces a new elevateInContent parameter to draw an element above all other composables in its content (scene/overlay). It allows to prevent elements from being clipped by a parent (like a scrollable list) while still being drawn in the same content, therefore keeping a relatively similar zIndex in the whole SceneTransitionLayout compared to other scenes and overlays. The first version of this CL had `elevateInContent` be a simple `Boolean`. However, doing so would require us to instrument all scenes and overlays to always use Modifier.container(), and all elements to use Modifier.drawInContainer(), which are most of the time not necessary. Making elevateInContent by a `ContentKey?` allows to only compose these modifiers when necessary. Note that using this parameter can currently lead to some strange issues where text is not drawn (see b/374257277). I expect this to be fixed in the Compose libraries directly in the future. Bug: 373799480 Test: atest ElevateInContentScreenshotTest Flag: com.android.systemui.scene_container Change-Id: Ifa9e65ade0bc7bab01c80c0eb77c5424db13047f --- packages/SystemUI/compose/scene/Android.bp | 2 + .../compose/animation/scene/Element.kt | 53 ++++++++++++++++++- .../scene/SceneTransitionLayoutState.kt | 47 ++++++++++++++++ .../compose/animation/scene/TransitionDsl.kt | 11 +++- .../animation/scene/TransitionDslImpl.kt | 18 ++++++- .../animation/scene/content/Content.kt | 7 +++ .../scene/transformation/Transformation.kt | 1 + 7 files changed, 135 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/compose/scene/Android.bp b/packages/SystemUI/compose/scene/Android.bp index af1172bddfc8..682c49cfd19c 100644 --- a/packages/SystemUI/compose/scene/Android.bp +++ b/packages/SystemUI/compose/scene/Android.bp @@ -40,6 +40,8 @@ android_library { static_libs: [ "androidx.compose.runtime_runtime", "androidx.compose.material3_material3", + + "PlatformComposeCore", ], kotlincflags: ["-Xjvm-default=all"], diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt index ebe1df4bf55f..f14622fe7b65 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/Element.kt @@ -48,10 +48,13 @@ import androidx.compose.ui.unit.round import androidx.compose.ui.util.fastCoerceIn import androidx.compose.ui.util.fastForEachReversed import androidx.compose.ui.util.lerp +import com.android.compose.animation.scene.Element.State import com.android.compose.animation.scene.content.Content import com.android.compose.animation.scene.content.state.TransitionState import com.android.compose.animation.scene.transformation.PropertyTransformation import com.android.compose.animation.scene.transformation.SharedElementTransformation +import com.android.compose.modifiers.thenIf +import com.android.compose.ui.graphics.drawInContainer import com.android.compose.ui.util.lerp import kotlin.math.roundToInt import kotlinx.coroutines.launch @@ -146,10 +149,58 @@ internal fun Modifier.element( // TODO(b/341072461): Revert this and read the current transitions in ElementNode directly once // we can ensure that SceneTransitionLayoutImpl will compose new contents first. val currentTransitionStates = layoutImpl.state.transitionStates - return then(ElementModifier(layoutImpl, currentTransitionStates, content, key)) + return thenIf(layoutImpl.state.isElevationPossible(content.key, key)) { + Modifier.maybeElevateInContent(layoutImpl, content, key, currentTransitionStates) + } + .then(ElementModifier(layoutImpl, currentTransitionStates, content, key)) .testTag(key.testTag) } +private fun Modifier.maybeElevateInContent( + layoutImpl: SceneTransitionLayoutImpl, + content: Content, + key: ElementKey, + transitionStates: List, +): Modifier { + fun isSharedElement( + stateByContent: Map, + transition: TransitionState.Transition, + ): Boolean { + fun inFromContent() = transition.fromContent in stateByContent + fun inToContent() = transition.toContent in stateByContent + fun inCurrentScene() = transition.currentScene in stateByContent + + return if (transition is TransitionState.Transition.ReplaceOverlay) { + (inFromContent() && (inToContent() || inCurrentScene())) || + (inToContent() && inCurrentScene()) + } else { + inFromContent() && inToContent() + } + } + + return drawInContainer( + content.containerState, + enabled = { + val stateByContent = layoutImpl.elements.getValue(key).stateByContent + val state = elementState(transitionStates, isInContent = { it in stateByContent }) + + state is TransitionState.Transition && + state.transformationSpec + .transformations(key, content.key) + .shared + ?.elevateInContent == content.key && + isSharedElement(stateByContent, state) && + isSharedElementEnabled(key, state) && + shouldPlaceElement( + layoutImpl, + content.key, + layoutImpl.elements.getValue(key), + state, + ) + }, + ) +} + /** * An element associated to [ElementNode]. Note that this element does not support updates as its * arguments should always be the same. diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt index a9a8668bd304..e1e2411da080 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutState.kt @@ -19,13 +19,16 @@ package com.android.compose.animation.scene import android.util.Log import androidx.annotation.VisibleForTesting import androidx.compose.runtime.Stable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.util.fastAll +import androidx.compose.ui.util.fastAny import androidx.compose.ui.util.fastFilter import androidx.compose.ui.util.fastForEach import com.android.compose.animation.scene.content.state.TransitionState +import com.android.compose.animation.scene.transformation.SharedElementTransformation import com.android.compose.animation.scene.transition.link.LinkedTransition import com.android.compose.animation.scene.transition.link.StateLink import kotlin.math.absoluteValue @@ -271,6 +274,14 @@ internal class MutableSceneTransitionLayoutStateImpl( mutableStateOf(listOf(TransitionState.Idle(initialScene, initialOverlays))) private set + /** + * The flattened list of [SharedElementTransformation] within all the transitions in + * [transitionStates]. + */ + private val transformationsWithElevation: List by derivedStateOf { + transformationsWithElevation(transitionStates) + } + override val currentScene: SceneKey get() = transitionState.currentScene @@ -743,6 +754,42 @@ internal class MutableSceneTransitionLayoutStateImpl( animate() } + + private fun transformationsWithElevation( + transitionStates: List + ): List { + return buildList { + transitionStates.fastForEach { state -> + if (state !is TransitionState.Transition) { + return@fastForEach + } + + state.transformationSpec.transformations.fastForEach { transformation -> + if ( + transformation is SharedElementTransformation && + transformation.elevateInContent != null + ) { + add(transformation) + } + } + } + } + } + + /** + * Return whether we might need to elevate [element] (or any element if [element] is `null`) in + * [content]. + * + * This is used to compose `Modifier.container()` and `Modifier.drawInContainer()` only when + * necessary, for performance. + */ + internal fun isElevationPossible(content: ContentKey, element: ElementKey?): Boolean { + if (transformationsWithElevation.isEmpty()) return false + return transformationsWithElevation.fastAny { transformation -> + transformation.elevateInContent == content && + (element == null || transformation.matcher.matches(element, content)) + } + } } private const val TAG = "SceneTransitionLayoutState" diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt index e825c6e271ed..dc26b6b382b4 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDsl.kt @@ -204,8 +204,17 @@ interface TransitionBuilder : BaseTransitionBuilder { * * @param enabled whether the matched element(s) should actually be shared in this transition. * Defaults to true. + * @param elevateInContent the content in which we should elevate the element when it is shared, + * drawing above all other composables of that content. If `null` (the default), we will + * simply draw this element in its original location. If not `null`, it has to be either the + * [fromContent][TransitionState.Transition.fromContent] or + * [toContent][TransitionState.Transition.toContent] of the transition. */ - fun sharedElement(matcher: ElementMatcher, enabled: Boolean = true) + fun sharedElement( + matcher: ElementMatcher, + enabled: Boolean = true, + elevateInContent: ContentKey? = null, + ) /** * Adds the transformations in [builder] but in reversed order. This allows you to partially diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt index a5ad999f7a64..269d91b02e7d 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/TransitionDslImpl.kt @@ -249,8 +249,22 @@ internal class TransitionBuilderImpl(override val transition: TransitionState.Tr reversed = false } - override fun sharedElement(matcher: ElementMatcher, enabled: Boolean) { - transformations.add(SharedElementTransformation(matcher, enabled)) + override fun sharedElement( + matcher: ElementMatcher, + enabled: Boolean, + elevateInContent: ContentKey?, + ) { + check( + elevateInContent == null || + elevateInContent == transition.fromContent || + elevateInContent == transition.toContent + ) { + "elevateInContent (${elevateInContent?.debugName}) should be either fromContent " + + "(${transition.fromContent.debugName}) or toContent " + + "(${transition.toContent.debugName})" + } + + transformations.add(SharedElementTransformation(matcher, enabled, elevateInContent)) } override fun timestampRange( diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt index c8407b13db66..8187e3932975 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/content/Content.kt @@ -51,6 +51,9 @@ import com.android.compose.animation.scene.animateSharedValueAsState import com.android.compose.animation.scene.element import com.android.compose.animation.scene.modifiers.noResizeDuringTransitions import com.android.compose.animation.scene.nestedScrollToScene +import com.android.compose.modifiers.thenIf +import com.android.compose.ui.graphics.ContainerState +import com.android.compose.ui.graphics.container /** A content defined in a [SceneTransitionLayout], i.e. a scene or an overlay. */ @Stable @@ -62,6 +65,7 @@ internal sealed class Content( zIndex: Float, ) { internal val scope = ContentScopeImpl(layoutImpl, content = this) + val containerState = ContainerState() var content by mutableStateOf(content) var zIndex by mutableFloatStateOf(zIndex) @@ -82,6 +86,9 @@ internal sealed class Content( val placeable = measurable.measure(constraints) layout(placeable.width, placeable.height) { placeable.place(0, 0) } } + .thenIf(layoutImpl.state.isElevationPossible(content = key, element = null)) { + Modifier.container(containerState) + } .testTag(key.testTag) ) { scope.content() diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt index 9bb302307359..de7f418f219a 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/transformation/Transformation.kt @@ -52,6 +52,7 @@ sealed interface Transformation { internal class SharedElementTransformation( override val matcher: ElementMatcher, internal val enabled: Boolean, + internal val elevateInContent: ContentKey?, ) : Transformation /** A transformation that changes the value of an element property, like its size or offset. */ -- GitLab From 3064191c6125c33dfbaad4655a5c9cd6614c6dc7 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 23 Oct 2024 10:40:05 +0200 Subject: [PATCH 278/459] Move Grids.kt back to PlatformComposeCore The HorizontalGrid and VerticalGrid (non-lazy grids) were moved to PlatformComposeSceneTransitionLayout in ag/25017678, in order to make that library fully self-contained. After reflection, PlatformComposeCore makes more sense for this file and it's fine to make PlatformComposeSceneTransitionLayout depend on PlatformComposeCore (which was done in ag/29200580). Bug: 375119446 Test: presubmits, pure move. Flag: EXEMPT pure move. Change-Id: I3218a78e811ea8070dec99db52bb231b7689215c --- .../compose/{scene => core}/src/com/android/compose/grid/Grids.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/SystemUI/compose/{scene => core}/src/com/android/compose/grid/Grids.kt (100%) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/grid/Grids.kt b/packages/SystemUI/compose/core/src/com/android/compose/grid/Grids.kt similarity index 100% rename from packages/SystemUI/compose/scene/src/com/android/compose/grid/Grids.kt rename to packages/SystemUI/compose/core/src/com/android/compose/grid/Grids.kt -- GitLab From 613c82b4aa5512b2836de1438048f607d3e8f6bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Chris=20Go=CC=88llner?= Date: Wed, 23 Oct 2024 09:40:33 +0100 Subject: [PATCH 279/459] Introduce StatusBarContentInsetsProviderStore for multiple displays Test: Tested by parent abstract class Test: MultiDisplayStatusBarContentInsetsProviderStoreTest Test: StatusBarContentInsetsProviderTest Test: Build & run Flag: com.android.systemui.status_bar_connected_displays Bug: 362720432 Change-Id: Ib08054879f6b714d640e22153cf7d77aae3a0ef9 --- .../shade/QsBatteryModeControllerTest.kt | 18 +-- ...StatusBarContentInsetsProviderStoreTest.kt | 77 ++++++++++++ .../KeyguardStatusBarViewControllerTest.java | 8 +- .../StatusBarContentInsetsProviderTest.kt | 118 ++++++++++++++--- .../data/repository/PerDisplayStore.kt | 2 +- .../systemui/shade/QsBatteryModeController.kt | 11 +- .../systemui/shade/ShadeHeaderController.kt | 23 ++-- .../data/StatusBarDataLayerModule.kt | 2 + .../StatusBarContentInsetsProviderStore.kt | 119 ++++++++++++++++++ .../events/PrivacyDotViewController.kt | 9 +- .../SystemEventChipAnimationController.kt | 5 +- .../KeyguardStatusBarViewController.java | 5 +- .../phone/PhoneStatusBarViewController.kt | 5 +- .../phone/StatusBarContentInsetsProvider.kt | 32 ++++- .../window/StatusBarWindowController.kt | 2 + .../window/StatusBarWindowControllerImpl.java | 5 +- .../window/StatusBarWindowControllerStore.kt | 5 + .../shade/ShadeHeaderControllerTest.kt | 30 +++-- .../phone/PhoneStatusBarViewControllerTest.kt | 11 +- .../systemui/CameraProtectionLoaderKosmos.kt | 25 ++++ .../FakeCameraProtectionLoaderFactory.kt | 27 ++++ .../FakeSysUICutoutProviderFactory.kt | 30 +++++ .../systemui/SysUICutoutProviderKosmos.kt | 24 ++++ ...keStatusBarConfigurationControllerStore.kt | 32 +++++ ...FakeStatusBarContentInsetsProviderStore.kt | 33 +++++ ...usBarConfigurationControllerStoreKosmos.kt | 26 ++++ ...atusBarContentInsetsProviderStoreKosmos.kt | 44 +++++++ ...keStatusBarContentInsetsProviderFactory.kt | 33 +++++ .../StatusBarContentInsetsProviderKosmos.kt | 6 + .../FakeStatusBarWindowControllerFactory.kt | 2 + 30 files changed, 698 insertions(+), 71 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/CameraProtectionLoaderKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/FakeCameraProtectionLoaderFactory.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarConfigurationControllerStore.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStoreKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QsBatteryModeControllerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QsBatteryModeControllerTest.kt index f38bf13d0bda..ab5fa8ef43fb 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QsBatteryModeControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/QsBatteryModeControllerTest.kt @@ -6,12 +6,11 @@ import android.graphics.Rect import android.view.DisplayCutout import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import com.android.systemui.res.R import com.android.systemui.SysuiTestCase import com.android.systemui.battery.BatteryMeterView -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider -import com.android.systemui.util.mockito.mock -import com.android.systemui.util.mockito.whenever +import com.android.systemui.res.R +import com.android.systemui.statusbar.data.repository.fakeStatusBarContentInsetsProviderStore +import com.android.systemui.testKosmos import com.google.common.truth.Truth.assertThat import org.junit.Before import org.junit.Rule @@ -19,6 +18,8 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.junit.MockitoJUnit +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever @SmallTest @RunWith(AndroidJUnit4::class) @@ -35,9 +36,12 @@ class QsBatteryModeControllerTest : SysuiTestCase() { const val QS_END_FRAME = 58 } + private val kosmos = testKosmos() + private val insetsProviderStore = kosmos.fakeStatusBarContentInsetsProviderStore + private val insetsProvider = insetsProviderStore.defaultDisplay + @JvmField @Rule val mockitoRule = MockitoJUnit.rule()!! - @Mock private lateinit var insetsProvider: StatusBarContentInsetsProvider @Mock private lateinit var mockedContext: Context @Mock private lateinit var mockedResources: Resources @@ -49,8 +53,7 @@ class QsBatteryModeControllerTest : SysuiTestCase() { whenever(mockedResources.getInteger(R.integer.fade_in_start_frame)).thenReturn(QS_END_FRAME) whenever(mockedResources.getInteger(R.integer.fade_out_complete_frame)) .thenReturn(QQS_START_FRAME) - - controller = QsBatteryModeController(mockedContext, insetsProvider) + controller = QsBatteryModeController(mockedContext, insetsProviderStore) } @Test @@ -96,5 +99,6 @@ class QsBatteryModeControllerTest : SysuiTestCase() { } private fun Int.prevFrameToFraction(): Float = (this - 1) / MOTION_LAYOUT_MAX_FRAME.toFloat() + private fun Int.nextFrameToFraction(): Float = (this + 1) / MOTION_LAYOUT_MAX_FRAME.toFloat() } diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt new file mode 100644 index 000000000000..0eebab0de831 --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/data/repository/MultiDisplayStatusBarContentInsetsProviderStoreTest.kt @@ -0,0 +1,77 @@ +/* + * 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.statusbar.data.repository + +import android.view.Display.DEFAULT_DISPLAY +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.display.data.repository.displayRepository +import com.android.systemui.kosmos.testDispatcher +import com.android.systemui.kosmos.testScope +import com.android.systemui.kosmos.unconfinedTestDispatcher +import com.android.systemui.testKosmos +import kotlinx.coroutines.runBlocking +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.kotlin.never +import org.mockito.kotlin.verify + +@SmallTest +@RunWith(AndroidJUnit4::class) +class MultiDisplayStatusBarContentInsetsProviderStoreTest : SysuiTestCase() { + + private val kosmos = testKosmos().also { it.testDispatcher = it.unconfinedTestDispatcher } + private val testScope = kosmos.testScope + private val fakeDisplayRepository = kosmos.displayRepository + private val underTest = kosmos.multiDisplayStatusBarContentInsetsProviderStore + + @Before + fun start() { + underTest.start() + } + + @Before fun addDisplays() = runBlocking { fakeDisplayRepository.addDisplay(DEFAULT_DISPLAY) } + + @Test + fun forDisplay_startsInstances() = + testScope.runTest { + val instance = underTest.forDisplay(DEFAULT_DISPLAY) + + verify(instance).start() + } + + @Test + fun beforeDisplayRemoved_doesNotStopInstances() = + testScope.runTest { + val instance = underTest.forDisplay(DEFAULT_DISPLAY) + + verify(instance, never()).stop() + } + + @Test + fun displayRemoved_stopsInstance() = + testScope.runTest { + val instance = underTest.forDisplay(DEFAULT_DISPLAY) + + fakeDisplayRepository.removeDisplay(DEFAULT_DISPLAY) + + verify(instance).stop() + } +} diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java index 68e17c1b2d73..157f8189276a 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewControllerTest.java @@ -63,6 +63,7 @@ import com.android.systemui.res.R; import com.android.systemui.shade.ShadeViewStateProvider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; import com.android.systemui.statusbar.phone.ui.StatusBarIconController; import com.android.systemui.statusbar.phone.ui.TintedIconManager; @@ -119,6 +120,8 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { @Mock private StatusBarContentInsetsProvider mStatusBarContentInsetsProvider; @Mock + private StatusBarContentInsetsProviderStore mStatusBarContentInsetsProviderStore; + @Mock private UserManager mUserManager; @Mock private StatusBarUserChipViewModel mStatusBarUserChipViewModel; @@ -143,7 +146,8 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mShadeViewStateProvider = new TestShadeViewStateProvider(); MockitoAnnotations.initMocks(this); - + when(mStatusBarContentInsetsProviderStore.getDefaultDisplay()) + .thenReturn(mStatusBarContentInsetsProvider); when(mIconManagerFactory.create(any(), any())).thenReturn(mIconManager); allowTestableLooperAsMainThread(); @@ -175,7 +179,7 @@ public class KeyguardStatusBarViewControllerTest extends SysuiTestCase { mKosmos.getKeyguardStatusBarViewModel(), mBiometricUnlockController, mStatusBarStateController, - mStatusBarContentInsetsProvider, + mStatusBarContentInsetsProviderStore, mUserManager, mStatusBarUserChipViewModel, mSecureSettings, diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt index ba5fb7f8df00..a862fdfeca22 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderTest.kt @@ -36,14 +36,15 @@ import com.android.systemui.util.leak.RotationUtils.ROTATION_NONE import com.android.systemui.util.leak.RotationUtils.ROTATION_SEASCAPE import com.android.systemui.util.leak.RotationUtils.ROTATION_UPSIDE_DOWN import com.android.systemui.util.leak.RotationUtils.Rotation -import com.android.systemui.util.mockito.mock -import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat -import junit.framework.Assert.assertTrue +import com.google.common.truth.Truth.assertWithMessage import org.junit.Before import org.junit.Test import org.junit.runner.RunWith import org.mockito.ArgumentMatchers.any +import org.mockito.kotlin.doReturn +import org.mockito.kotlin.mock +import org.mockito.kotlin.whenever @RunWith(AndroidJUnit4::class) @SmallTest @@ -1018,7 +1019,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { // Regression test for b/245799099 @Test - fun onMaxBoundsChanged_listenerNotified() { + fun onMaxBoundsChanged_afterStart_listenerNotified() { // Start out with an existing configuration with bounds configuration.windowConfiguration.setMaxBounds(0, 0, 100, 100) configurationController.onConfigurationChanged(configuration) @@ -1038,6 +1039,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { triggered = true } } + provider.start() provider.addCallback(listener) // WHEN the config is updated with new bounds @@ -1049,7 +1051,39 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { } @Test - fun onDensityOrFontScaleChanged_listenerNotified() { + fun onMaxBoundsChanged_beforeStart_listenerNotNotified() { + // Start out with an existing configuration with bounds + configuration.windowConfiguration.setMaxBounds(0, 0, 100, 100) + configurationController.onConfigurationChanged(configuration) + val provider = + StatusBarContentInsetsProviderImpl( + contextMock, + configurationController, + mock(), + mock(), + mock(), + ) + val listener = + object : StatusBarContentInsetsChangedListener { + var triggered = false + + override fun onStatusBarContentInsetsChanged() { + triggered = true + } + } + provider.addCallback(listener) + + // WHEN the config is updated with new bounds + // but provider is not started + configuration.windowConfiguration.setMaxBounds(0, 0, 456, 789) + configurationController.onConfigurationChanged(configuration) + + // THEN the listener is not notified + assertThat(listener.triggered).isFalse() + } + + @Test + fun onDensityOrFontScaleChanged_beforeStart_listenerNotNotified() { configuration.densityDpi = 12 val provider = StatusBarContentInsetsProviderImpl( @@ -1069,6 +1103,36 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { } provider.addCallback(listener) + // WHEN the config is updated, but the provider is not started + configuration.densityDpi = 20 + configurationController.onConfigurationChanged(configuration) + + // THEN the listener is NOT notified + assertThat(listener.triggered).isFalse() + } + + @Test + fun onDensityOrFontScaleChanged_afterStart_listenerNotified() { + configuration.densityDpi = 12 + val provider = + StatusBarContentInsetsProviderImpl( + contextMock, + configurationController, + mock(), + mock(), + mock(), + ) + val listener = + object : StatusBarContentInsetsChangedListener { + var triggered = false + + override fun onStatusBarContentInsetsChanged() { + triggered = true + } + } + provider.start() + provider.addCallback(listener) + // WHEN the config is updated configuration.densityDpi = 20 configurationController.onConfigurationChanged(configuration) @@ -1078,7 +1142,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { } @Test - fun onThemeChanged_listenerNotified() { + fun onThemeChanged_afterStart_listenerNotified() { val provider = StatusBarContentInsetsProviderImpl( contextMock, @@ -1095,6 +1159,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { triggered = true } } + provider.start() provider.addCallback(listener) configurationController.notifyThemeChanged() @@ -1103,18 +1168,44 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { assertThat(listener.triggered).isTrue() } + @Test + fun onThemeChanged_beforeStart_listenerNotNotified() { + val provider = + StatusBarContentInsetsProviderImpl( + contextMock, + configurationController, + mock(), + mock(), + mock(), + ) + val listener = + object : StatusBarContentInsetsChangedListener { + var triggered = false + + override fun onStatusBarContentInsetsChanged() { + triggered = true + } + } + provider.addCallback(listener) + + configurationController.notifyThemeChanged() + + assertThat(listener.triggered).isFalse() + } + private fun assertRects( expected: Rect, actual: Rect, @Rotation currentRotation: Int, @Rotation targetRotation: Int, ) { - assertTrue( - "Rects must match. currentRotation=${RotationUtils.toString(currentRotation)}" + - " targetRotation=${RotationUtils.toString(targetRotation)}" + - " expected=$expected actual=$actual", - expected.equals(actual), - ) + assertWithMessage( + "Rects must match. currentRotation=${RotationUtils.toString(currentRotation)}" + + " targetRotation=${RotationUtils.toString(targetRotation)}" + + " expected=$expected actual=$actual" + ) + .that(actual) + .isEqualTo(expected) } private fun setNoCutout() { @@ -1136,8 +1227,7 @@ class StatusBarContentInsetsProviderTest : SysuiTestCase() { } private fun setCameraProtectionBounds(protectionBounds: Rect) { - val protectionInfo = - mock { whenever(this.bounds).thenReturn(protectionBounds) } + val protectionInfo = mock { on { bounds } doReturn protectionBounds } whenever(sysUICutout.cameraProtection).thenReturn(protectionInfo) } diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt index 2ce3e43389fa..2c4345556f15 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt @@ -76,7 +76,7 @@ abstract class PerDisplayStoreImpl( } } - abstract fun createInstanceForDisplay(displayId: Int): T + protected abstract fun createInstanceForDisplay(displayId: Int): T override fun start() { val instanceType = instanceClass.simpleName diff --git a/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt b/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt index 1fcb70c6bc95..91627d63980e 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt @@ -2,9 +2,9 @@ package com.android.systemui.shade import android.content.Context import android.view.DisplayCutout -import com.android.systemui.res.R import com.android.systemui.battery.BatteryMeterView -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.res.R +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import javax.inject.Inject /** @@ -15,9 +15,11 @@ class QsBatteryModeController @Inject constructor( private val context: Context, - private val insetsProvider: StatusBarContentInsetsProvider, + insetsProviderStore: StatusBarContentInsetsProviderStore, ) { + private val insetsProvider = insetsProviderStore.defaultDisplay + private companion object { // MotionLayout frames are in [0, 100]. Where 0 and 100 are reserved for start and end // frames. @@ -65,6 +67,5 @@ constructor( private fun hasCenterCutout(cutout: DisplayCutout?): Boolean = cutout?.let { !insetsProvider.currentRotationHasCornerCutout() && !it.boundingRectTop.isEmpty - } - ?: false + } ?: false } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index cb589aa10cd9..d0f038698a8e 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -57,7 +57,7 @@ import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONS import com.android.systemui.shade.ShadeViewProviderModule.Companion.SHADE_HEADER import com.android.systemui.shade.carrier.ShadeCarrierGroup import com.android.systemui.shade.carrier.ShadeCarrierGroupController -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import com.android.systemui.statusbar.phone.StatusBarLocation import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory @@ -90,7 +90,7 @@ constructor( private val statusBarIconController: StatusBarIconController, private val tintedIconManagerFactory: TintedIconManager.Factory, private val privacyIconsController: HeaderPrivacyIconsController, - private val insetsProvider: StatusBarContentInsetsProvider, + private val insetsProviderStore: StatusBarContentInsetsProviderStore, private val configurationController: ConfigurationController, private val variableDateViewControllerFactory: VariableDateViewController.Factory, @Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController, @@ -104,6 +104,8 @@ constructor( private val statusOverlayHoverListenerFactory: StatusOverlayHoverListenerFactory, ) : ViewController(header), Dumpable { + private val insetsProvider = insetsProviderStore.defaultDisplay + companion object { /** IDs for transitions and constraints for the [MotionLayout]. */ @VisibleForTesting internal val HEADER_TRANSITION_ID = R.id.header_transition @@ -262,7 +264,7 @@ constructor( left, header.paddingTop, header.paddingRight, - header.paddingBottom + header.paddingBottom, ) systemIconsHoverContainer.setPaddingRelative( resources.getDimensionPixelSize( @@ -276,7 +278,7 @@ constructor( ), resources.getDimensionPixelSize( R.dimen.hover_system_icons_container_padding_bottom - ) + ), ) } @@ -317,7 +319,7 @@ constructor( batteryIcon.updateColors( fgColor /* foreground */, bgColor /* background */, - fgColor /* single tone (current default) */ + fgColor, /* single tone (current default) */ ) carrierIconSlots = @@ -426,7 +428,7 @@ constructor( if (view.isLayoutRtl) cutoutRight else cutoutLeft, header.paddingStart, if (view.isLayoutRtl) cutoutLeft else cutoutRight, - header.paddingEnd + header.paddingEnd, ) if (cutout != null) { @@ -437,7 +439,7 @@ constructor( changes += combinedShadeHeadersConstraintManager.centerCutoutConstraints( view.isLayoutRtl, - (view.width - view.paddingLeft - view.paddingRight - topCutout.width()) / 2 + (view.width - view.paddingLeft - view.paddingRight - topCutout.width()) / 2, ) } } else { @@ -563,7 +565,7 @@ constructor( clockPaddingStart, clock.paddingTop, clockPaddingEnd, - clock.paddingBottom + clock.paddingBottom, ) } @@ -602,9 +604,8 @@ constructor( @VisibleForTesting internal fun simulateViewDetached() = this.onViewDetached() - inner class CustomizerAnimationListener( - private val enteringCustomizing: Boolean, - ) : AnimatorListenerAdapter() { + inner class CustomizerAnimationListener(private val enteringCustomizing: Boolean) : + AnimatorListenerAdapter() { override fun onAnimationEnd(animation: Animator) { super.onAnimationEnd(animation) header.animate().setListener(null) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt index e6270b8740a6..c416bf7b4f92 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/StatusBarDataLayerModule.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.data import com.android.systemui.statusbar.data.repository.KeyguardStatusBarRepositoryModule import com.android.systemui.statusbar.data.repository.RemoteInputRepositoryModule import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerModule +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStoreModule import com.android.systemui.statusbar.data.repository.StatusBarModeRepositoryModule import com.android.systemui.statusbar.phone.data.StatusBarPhoneDataLayerModule import dagger.Module @@ -28,6 +29,7 @@ import dagger.Module KeyguardStatusBarRepositoryModule::class, RemoteInputRepositoryModule::class, StatusBarConfigurationControllerModule::class, + StatusBarContentInsetsProviderStoreModule::class, StatusBarModeRepositoryModule::class, StatusBarPhoneDataLayerModule::class, ] diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt new file mode 100644 index 000000000000..e471b12c1d58 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStore.kt @@ -0,0 +1,119 @@ +/* + * 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.statusbar.data.repository + +import android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR +import com.android.systemui.CameraProtectionLoaderImpl +import com.android.systemui.CoreStartable +import com.android.systemui.SysUICutoutProviderImpl +import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.dagger.qualifiers.Background +import com.android.systemui.display.data.repository.DisplayRepository +import com.android.systemui.display.data.repository.DisplayWindowPropertiesRepository +import com.android.systemui.display.data.repository.PerDisplayStore +import com.android.systemui.display.data.repository.PerDisplayStoreImpl +import com.android.systemui.display.data.repository.SingleDisplayStore +import com.android.systemui.statusbar.core.StatusBarConnectedDisplays +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProviderImpl +import dagger.Lazy +import dagger.Module +import dagger.Provides +import dagger.multibindings.ClassKey +import dagger.multibindings.IntoMap +import javax.inject.Inject +import kotlinx.coroutines.CoroutineScope + +/** Provides per display instances of [StatusBarContentInsetsProvider]. */ +interface StatusBarContentInsetsProviderStore : PerDisplayStore + +@SysUISingleton +class MultiDisplayStatusBarContentInsetsProviderStore +@Inject +constructor( + @Background backgroundApplicationScope: CoroutineScope, + displayRepository: DisplayRepository, + private val factory: StatusBarContentInsetsProviderImpl.Factory, + private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, + private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + private val sysUICutoutProviderFactory: SysUICutoutProviderImpl.Factory, + private val cameraProtectionLoaderFactory: CameraProtectionLoaderImpl.Factory, +) : + StatusBarContentInsetsProviderStore, + PerDisplayStoreImpl( + backgroundApplicationScope, + displayRepository, + ) { + + override fun createInstanceForDisplay(displayId: Int): StatusBarContentInsetsProvider { + val context = displayWindowPropertiesRepository.get(displayId, TYPE_STATUS_BAR).context + val cameraProtectionLoader = cameraProtectionLoaderFactory.create(context) + return factory + .create( + context, + statusBarConfigurationControllerStore.forDisplay(displayId), + sysUICutoutProviderFactory.create(context, cameraProtectionLoader), + ) + .also { it.start() } + } + + override suspend fun onDisplayRemovalAction(instance: StatusBarContentInsetsProvider) { + instance.stop() + } + + override val instanceClass = StatusBarContentInsetsProvider::class.java +} + +@SysUISingleton +class SingleDisplayStatusBarContentInsetsProviderStore +@Inject +constructor(statusBarContentInsetsProvider: StatusBarContentInsetsProvider) : + StatusBarContentInsetsProviderStore, + PerDisplayStore by SingleDisplayStore( + defaultInstance = statusBarContentInsetsProvider + ) + +@Module +object StatusBarContentInsetsProviderStoreModule { + + @Provides + @SysUISingleton + @IntoMap + @ClassKey(StatusBarContentInsetsProviderStore::class) + fun storeAsCoreStartable( + multiDisplayLazy: Lazy + ): CoreStartable { + return if (StatusBarConnectedDisplays.isEnabled) { + return multiDisplayLazy.get() + } else { + CoreStartable.NOP + } + } + + @Provides + @SysUISingleton + fun store( + singleDisplayLazy: Lazy, + multiDisplayLazy: Lazy, + ): StatusBarContentInsetsProviderStore { + return if (StatusBarConnectedDisplays.isEnabled) { + multiDisplayLazy.get() + } else { + singleDisplayLazy.get() + } + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 0eef8d63c2d1..2506c95ad800 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -34,6 +34,7 @@ import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeInteractor import com.android.systemui.statusbar.StatusBarState.SHADE import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.policy.ConfigurationController @@ -730,8 +731,12 @@ object PrivacyDotViewControllerModule { factory: PrivacyDotViewControllerImpl.Factory, @Application scope: CoroutineScope, configurationController: ConfigurationController, - contentInsetsProvider: StatusBarContentInsetsProvider, + contentInsetsProviderStore: StatusBarContentInsetsProviderStore, ): PrivacyDotViewController { - return factory.create(scope, configurationController, contentInsetsProvider) + return factory.create( + scope, + configurationController, + contentInsetsProviderStore.defaultDisplay, + ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt index 35816c25e976..b28660590ad0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemEventChipAnimationController.kt @@ -33,6 +33,7 @@ import androidx.core.animation.ValueAnimator import com.android.internal.annotations.VisibleForTesting import com.android.systemui.dagger.SysUISingleton import com.android.systemui.res.R +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import com.android.systemui.statusbar.phone.StatusBarContentInsetsChangedListener import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import com.android.systemui.statusbar.window.StatusBarWindowController @@ -453,12 +454,12 @@ object SystemEventChipAnimationControllerModule { factory: SystemEventChipAnimationControllerImpl.Factory, context: Context, statusBarWindowControllerStore: StatusBarWindowControllerStore, - contentInsetsProvider: StatusBarContentInsetsProvider, + contentInsetsProviderStore: StatusBarContentInsetsProviderStore, ): SystemEventChipAnimationController { return factory.create( context, statusBarWindowControllerStore.defaultDisplay, - contentInsetsProvider, + contentInsetsProviderStore.defaultDisplay, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java index cd59d4ebfd73..be2fb68ab88d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarViewController.java @@ -58,6 +58,7 @@ import com.android.systemui.shade.ShadeViewStateProvider; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.SysuiStatusBarStateController; +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore; import com.android.systemui.statusbar.disableflags.DisableStateTracker; import com.android.systemui.statusbar.events.SystemStatusAnimationCallback; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; @@ -300,7 +301,7 @@ public class KeyguardStatusBarViewController extends ViewController { + /** + * Called when the [StatusBarContentInsetsProvider] should start doing its work and allocate its + * resources. + */ + fun start() + + /** + * Called when the [StatusBarContentInsetsProvider] should stop and do any required clean up. + */ + fun stop() + /** * Some views may need to care about whether or not the current top display cutout is located in * the corner rather than somewhere in the center. In the case of a corner cutout, the status @@ -157,10 +169,15 @@ constructor( context.resources.getBoolean(R.bool.config_enablePrivacyDot) } - init { + private val nameSuffix = + if (context.displayId == DEFAULT_DISPLAY) "" else context.displayId.toString() + private val dumpableName = TAG + nameSuffix + private val commandName = StatusBarInsetsCommand.NAME + nameSuffix + + override fun start() { configurationController.addCallback(this) - dumpManager.registerDumpable(TAG, this) - commandRegistry.registerCommand(StatusBarInsetsCommand.NAME) { + dumpManager.registerDumpable(dumpableName, this) + commandRegistry.registerCommand(commandName) { StatusBarInsetsCommand( object : StatusBarInsetsCommand.Callback { override fun onExecute( @@ -174,6 +191,13 @@ constructor( } } + override fun stop() { + StatusBarConnectedDisplays.assertInNewMode() + configurationController.removeCallback(this) + dumpManager.unregisterDumpable(dumpableName) + commandRegistry.unregisterCommand(commandName) + } + override fun addCallback(listener: StatusBarContentInsetsChangedListener) { listeners.add(listener) } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt index ae0e76f01faa..584cd3b00a57 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowController.kt @@ -23,6 +23,7 @@ import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.animation.ActivityTransitionAnimator import com.android.systemui.fragments.FragmentHostManager import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider import java.util.Optional /** Encapsulates all logic for the status bar window state management. */ @@ -82,6 +83,7 @@ interface StatusBarWindowController { context: Context, viewCaptureAwareWindowManager: ViewCaptureAwareWindowManager, statusBarConfigurationController: StatusBarConfigurationController, + contentInsetsProvider: StatusBarContentInsetsProvider, ): StatusBarWindowController } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java index e4c6737856f0..6953bbf735f1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerImpl.java @@ -99,7 +99,7 @@ public class StatusBarWindowControllerImpl implements StatusBarWindowController @Assisted ViewCaptureAwareWindowManager viewCaptureAwareWindowManager, @Assisted StatusBarConfigurationController statusBarConfigurationController, IWindowManager iWindowManager, - StatusBarContentInsetsProvider contentInsetsProvider, + @Assisted StatusBarContentInsetsProvider contentInsetsProvider, FragmentService fragmentService, Optional unfoldTransitionProgressProvider) { mContext = context; @@ -370,7 +370,8 @@ public class StatusBarWindowControllerImpl implements StatusBarWindowController StatusBarWindowControllerImpl create( @NonNull Context context, @NonNull ViewCaptureAwareWindowManager viewCaptureAwareWindowManager, - @NonNull StatusBarConfigurationController statusBarConfigurationController); + @NonNull StatusBarConfigurationController statusBarConfigurationController, + @NonNull StatusBarContentInsetsProvider contentInsetsProvider); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt index d83a2371ec92..051d463a8b97 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowControllerStore.kt @@ -28,6 +28,7 @@ import com.android.systemui.display.data.repository.PerDisplayStoreImpl import com.android.systemui.display.data.repository.SingleDisplayStore import com.android.systemui.statusbar.core.StatusBarConnectedDisplays import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore +import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore import javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -43,6 +44,7 @@ constructor( private val displayWindowPropertiesRepository: DisplayWindowPropertiesRepository, private val viewCaptureAwareWindowManagerFactory: ViewCaptureAwareWindowManager.Factory, private val statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + private val statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore, displayRepository: DisplayRepository, ) : StatusBarWindowControllerStore, @@ -64,6 +66,7 @@ constructor( statusBarDisplayContext.context, viewCaptureAwareWindowManager, statusBarConfigurationControllerStore.forDisplay(displayId), + statusBarContentInsetsProviderStore.forDisplay(displayId), ) } @@ -78,6 +81,7 @@ constructor( viewCaptureAwareWindowManager: ViewCaptureAwareWindowManager, factory: StatusBarWindowControllerImpl.Factory, statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore, + statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore, ) : StatusBarWindowControllerStore, PerDisplayStore by SingleDisplayStore( @@ -85,6 +89,7 @@ constructor( context, viewCaptureAwareWindowManager, statusBarConfigurationControllerStore.defaultDisplay, + statusBarContentInsetsProviderStore.defaultDisplay, ) ) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt index fc2ad60cfa72..eae828562223 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/shade/ShadeHeaderControllerTest.kt @@ -53,7 +53,7 @@ import com.android.systemui.shade.ShadeHeaderController.Companion.QQS_HEADER_CON import com.android.systemui.shade.ShadeHeaderController.Companion.QS_HEADER_CONSTRAINT import com.android.systemui.shade.carrier.ShadeCarrierGroup import com.android.systemui.shade.carrier.ShadeCarrierGroupController -import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import com.android.systemui.statusbar.data.repository.fakeStatusBarContentInsetsProviderStore import com.android.systemui.statusbar.phone.StatusIconContainer import com.android.systemui.statusbar.phone.StatusOverlayHoverListenerFactory import com.android.systemui.statusbar.phone.ui.StatusBarIconController @@ -63,6 +63,7 @@ import com.android.systemui.statusbar.policy.FakeConfigurationController import com.android.systemui.statusbar.policy.NextAlarmController import com.android.systemui.statusbar.policy.VariableDateView import com.android.systemui.statusbar.policy.VariableDateViewController +import com.android.systemui.testKosmos import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.capture @@ -93,6 +94,10 @@ private val EMPTY_CHANGES = ConstraintsChanges() @RunWith(AndroidTestingRunner::class) class ShadeHeaderControllerTest : SysuiTestCase() { + private val kosmos = testKosmos() + private val insetsProviderStore = kosmos.fakeStatusBarContentInsetsProviderStore + private val insetsProvider = insetsProviderStore.defaultDisplay + @Mock(answer = Answers.RETURNS_MOCKS) private lateinit var view: MotionLayout @Mock private lateinit var statusIcons: StatusIconContainer @Mock private lateinit var statusBarIconController: StatusBarIconController @@ -107,7 +112,6 @@ class ShadeHeaderControllerTest : SysuiTestCase() { @Mock private lateinit var batteryMeterView: BatteryMeterView @Mock private lateinit var batteryMeterViewController: BatteryMeterViewController @Mock private lateinit var privacyIconsController: HeaderPrivacyIconsController - @Mock private lateinit var insetsProvider: StatusBarContentInsetsProvider @Mock private lateinit var variableDateViewControllerFactory: VariableDateViewController.Factory @Mock private lateinit var variableDateViewController: VariableDateViewController @Mock private lateinit var dumpManager: DumpManager @@ -190,7 +194,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { statusBarIconController, iconManagerFactory, privacyIconsController, - insetsProvider, + insetsProviderStore, configurationController, variableDateViewControllerFactory, batteryMeterViewController, @@ -201,7 +205,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { qsBatteryModeController, nextAlarmController, activityStarter, - mStatusOverlayHoverListenerFactory + mStatusOverlayHoverListenerFactory, ) whenever(view.isAttachedToWindow).thenReturn(true) shadeHeaderController.init() @@ -597,7 +601,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { anyInt(), anyInt(), anyInt(), - anyInt() + anyInt(), ) ) .thenReturn(mockConstraintsChanges) @@ -631,7 +635,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { anyInt(), anyInt(), anyInt(), - anyInt() + anyInt(), ) ) .thenReturn(mockConstraintsChanges) @@ -751,7 +755,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { whenever( combinedShadeHeadersConstraintManager.centerCutoutConstraints( Mockito.anyBoolean(), - anyInt() + anyInt(), ) ) .thenReturn(mockConstraintsChanges) @@ -788,7 +792,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { whenever( combinedShadeHeadersConstraintManager.centerCutoutConstraints( Mockito.anyBoolean(), - anyInt() + anyInt(), ) ) .thenReturn(mockConstraintsChanges) @@ -899,7 +903,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { top: Int, right: Int, bottom: Int, - listener: View.OnLayoutChangeListener + listener: View.OnLayoutChangeListener, ) { val oldLeft = this.left val oldTop = this.top @@ -920,7 +924,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { left, top, right, - bottom + bottom, ) } @@ -941,7 +945,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { /* left= */ insets.first, /* top= */ 0, /* right= */ insets.second, - /* bottom= */ 0 + /* bottom= */ 0, ) ) whenever(insetsProvider.currentRotationHasCornerCutout()).thenReturn(cornerCutout) @@ -968,7 +972,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { anyInt(), anyInt(), anyInt(), - anyInt() + anyInt(), ) ) .thenReturn(EMPTY_CHANGES) @@ -977,7 +981,7 @@ class ShadeHeaderControllerTest : SysuiTestCase() { whenever( combinedShadeHeadersConstraintManager.centerCutoutConstraints( Mockito.anyBoolean(), - anyInt() + anyInt(), ) ) .thenReturn(EMPTY_CHANGES) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt index 83d0bcc55cb0..008e8ce92736 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt @@ -37,7 +37,6 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.battery.BatteryMeterView import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags -import com.android.systemui.kosmos.Kosmos import com.android.systemui.plugins.fakeDarkIconDispatcher import com.android.systemui.res.R import com.android.systemui.scene.ui.view.WindowRootView @@ -46,9 +45,12 @@ import com.android.systemui.shade.ShadeLogger import com.android.systemui.shade.ShadeViewController import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor import com.android.systemui.statusbar.CommandQueue +import com.android.systemui.statusbar.data.repository.fakeStatusBarContentInsetsProviderStore +import com.android.systemui.statusbar.data.repository.statusBarContentInsetsProviderStore import com.android.systemui.statusbar.policy.Clock import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.window.StatusBarWindowStateController +import com.android.systemui.testKosmos import com.android.systemui.unfold.SysUIUnfoldComponent import com.android.systemui.unfold.config.UnfoldTransitionConfig import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider @@ -75,7 +77,9 @@ import org.mockito.MockitoAnnotations @SmallTest @RunWith(AndroidJUnit4::class) class PhoneStatusBarViewControllerTest : SysuiTestCase() { - private val kosmos = Kosmos() + private val kosmos = testKosmos() + private val statusBarContentInsetsProviderStore = kosmos.fakeStatusBarContentInsetsProviderStore + private val statusBarContentInsetsProvider = statusBarContentInsetsProviderStore.defaultDisplay private val fakeDarkIconDispatcher = kosmos.fakeDarkIconDispatcher @Mock private lateinit var shadeViewController: ShadeViewController @@ -93,7 +97,6 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { @Mock private lateinit var windowRootView: Provider @Mock private lateinit var shadeLogger: ShadeLogger @Mock private lateinit var viewUtil: ViewUtil - @Mock private lateinit var statusBarContentInsetsProvider: StatusBarContentInsetsProvider private lateinit var statusBarWindowStateController: StatusBarWindowStateController private lateinit var view: PhoneStatusBarView @@ -396,7 +399,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() { configurationController, mStatusOverlayHoverListenerFactory, fakeDarkIconDispatcher, - statusBarContentInsetsProvider, + statusBarContentInsetsProviderStore, ) .create(view) .also { it.init() } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/CameraProtectionLoaderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/CameraProtectionLoaderKosmos.kt new file mode 100644 index 000000000000..7625049594a4 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/CameraProtectionLoaderKosmos.kt @@ -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. + */ + +package com.android.systemui + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeCameraProtectionLoaderFactory by + Kosmos.Fixture { FakeCameraProtectionLoaderFactory() } + +var Kosmos.cameraProtectionLoaderFactory: CameraProtectionLoaderImpl.Factory by + Kosmos.Fixture { fakeCameraProtectionLoaderFactory } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/FakeCameraProtectionLoaderFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/FakeCameraProtectionLoaderFactory.kt new file mode 100644 index 000000000000..87428b0679ba --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/FakeCameraProtectionLoaderFactory.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 + +import android.content.Context +import org.mockito.kotlin.mock + +class FakeCameraProtectionLoaderFactory : CameraProtectionLoaderImpl.Factory { + + override fun create(context: Context): CameraProtectionLoaderImpl { + return mock() + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt new file mode 100644 index 000000000000..4eb3780d7663 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/FakeSysUICutoutProviderFactory.kt @@ -0,0 +1,30 @@ +/* + * 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 + +import android.content.Context +import org.mockito.kotlin.mock + +class FakeSysUICutoutProviderFactory : SysUICutoutProviderImpl.Factory { + + override fun create( + context: Context, + cameraProtectionLoader: CameraProtectionLoader, + ): SysUICutoutProviderImpl { + return mock() + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt new file mode 100644 index 000000000000..412ed72e89f7 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/SysUICutoutProviderKosmos.kt @@ -0,0 +1,24 @@ +/* + * 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 + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeSysUICutoutProviderFactory by Kosmos.Fixture { FakeSysUICutoutProviderFactory() } + +var Kosmos.sysUICutoutProviderFactory: SysUICutoutProviderImpl.Factory by + Kosmos.Fixture { fakeSysUICutoutProviderFactory } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarConfigurationControllerStore.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarConfigurationControllerStore.kt new file mode 100644 index 000000000000..46bb2c169731 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarConfigurationControllerStore.kt @@ -0,0 +1,32 @@ +/* + * 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.statusbar.data.repository + +import android.view.Display +import org.mockito.kotlin.mock + +class FakeStatusBarConfigurationControllerStore : StatusBarConfigurationControllerStore { + + private val perDisplayMockControllers = mutableMapOf() + + override val defaultDisplay: StatusBarConfigurationController + get() = forDisplay(Display.DEFAULT_DISPLAY) + + override fun forDisplay(displayId: Int): StatusBarConfigurationController { + return perDisplayMockControllers.computeIfAbsent(displayId) { mock() } + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt new file mode 100644 index 000000000000..642c2ff38338 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/FakeStatusBarContentInsetsProviderStore.kt @@ -0,0 +1,33 @@ +/* + * 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.statusbar.data.repository + +import android.view.Display +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider +import org.mockito.kotlin.mock + +class FakeStatusBarContentInsetsProviderStore() : StatusBarContentInsetsProviderStore { + + private val perDisplayMockProviders = mutableMapOf() + + override val defaultDisplay: StatusBarContentInsetsProvider + get() = forDisplay(Display.DEFAULT_DISPLAY) + + override fun forDisplay(displayId: Int): StatusBarContentInsetsProvider { + return perDisplayMockProviders.computeIfAbsent(displayId) { mock() } + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStoreKosmos.kt new file mode 100644 index 000000000000..03b63c2a8757 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarConfigurationControllerStoreKosmos.kt @@ -0,0 +1,26 @@ +/* + * 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.statusbar.data.repository + +import com.android.systemui.kosmos.Kosmos + +val Kosmos.fakeStatusBarConfigurationControllerStore by Kosmos.Fixture { + FakeStatusBarConfigurationControllerStore() +} + +var Kosmos.statusBarConfigurationControllerStore: StatusBarConfigurationControllerStore by + Kosmos.Fixture { fakeStatusBarConfigurationControllerStore } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt new file mode 100644 index 000000000000..a34fb0998c79 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/data/repository/StatusBarContentInsetsProviderStoreKosmos.kt @@ -0,0 +1,44 @@ +/* + * 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.statusbar.data.repository + +import com.android.systemui.cameraProtectionLoaderFactory +import com.android.systemui.display.data.repository.displayRepository +import com.android.systemui.display.data.repository.displayWindowPropertiesRepository +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.kosmos.applicationCoroutineScope +import com.android.systemui.statusbar.phone.statusBarContentInsetsProviderFactory +import com.android.systemui.sysUICutoutProviderFactory + +val Kosmos.fakeStatusBarContentInsetsProviderStore by + Kosmos.Fixture { FakeStatusBarContentInsetsProviderStore() } + +val Kosmos.multiDisplayStatusBarContentInsetsProviderStore by + Kosmos.Fixture { + MultiDisplayStatusBarContentInsetsProviderStore( + applicationCoroutineScope, + displayRepository, + statusBarContentInsetsProviderFactory, + displayWindowPropertiesRepository, + statusBarConfigurationControllerStore, + sysUICutoutProviderFactory, + cameraProtectionLoaderFactory, + ) + } + +var Kosmos.statusBarContentInsetsProviderStore: StatusBarContentInsetsProviderStore by + Kosmos.Fixture { fakeStatusBarContentInsetsProviderStore } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt new file mode 100644 index 000000000000..4fb8cf4a328b --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/FakeStatusBarContentInsetsProviderFactory.kt @@ -0,0 +1,33 @@ +/* + * 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.statusbar.phone + +import android.content.Context +import com.android.systemui.SysUICutoutProvider +import com.android.systemui.statusbar.policy.ConfigurationController +import org.mockito.kotlin.mock + +class FakeStatusBarContentInsetsProviderFactory : StatusBarContentInsetsProviderImpl.Factory { + + override fun create( + context: Context, + configurationController: ConfigurationController, + sysUICutoutProvider: SysUICutoutProvider, + ): StatusBarContentInsetsProviderImpl { + return mock() + } +} diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt index 9c9673c3a924..705df3c15d18 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProviderKosmos.kt @@ -23,3 +23,9 @@ val Kosmos.mockStatusBarContentInsetsProvider by Kosmos.Fixture { mock() } var Kosmos.statusBarContentInsetsProvider by Kosmos.Fixture { mockStatusBarContentInsetsProvider } + +val Kosmos.fakeStatusBarContentInsetsProviderFactory by + Kosmos.Fixture { FakeStatusBarContentInsetsProviderFactory() } + +var Kosmos.statusBarContentInsetsProviderFactory: StatusBarContentInsetsProviderImpl.Factory by + Kosmos.Fixture { fakeStatusBarContentInsetsProviderFactory } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt index 65247a55348d..7eaecb1c4544 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/statusbar/window/FakeStatusBarWindowControllerFactory.kt @@ -19,11 +19,13 @@ package com.android.systemui.statusbar.window import android.content.Context import com.android.app.viewcapture.ViewCaptureAwareWindowManager import com.android.systemui.statusbar.data.repository.StatusBarConfigurationController +import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider class FakeStatusBarWindowControllerFactory : StatusBarWindowController.Factory { override fun create( context: Context, viewCaptureAwareWindowManager: ViewCaptureAwareWindowManager, statusBarConfigurationController: StatusBarConfigurationController, + contentInsetsProvider: StatusBarContentInsetsProvider, ) = FakeStatusBarWindowController() } -- GitLab From 0a639219fdde238a9ace21735063366882dadc88 Mon Sep 17 00:00:00 2001 From: "ELIYAZ MOMIN (xWF)" Date: Wed, 23 Oct 2024 08:57:11 +0000 Subject: [PATCH 280/459] Revert "Add view models for volume dialog ringer drawer" This reverts commit e030378448c602adfa8229a92903aae619a67b5d. Reason for revert: Change-Id: Ife5e5c72a4cd4df6bcddcae5276d49ee45490bcb --- .../VolumeDialogRingerDrawerViewModelTest.kt | 144 --------------- .../ui/viewmodel/RingerButtonViewModel.kt | 33 ---- .../ringer/ui/viewmodel/RingerDrawerState.kt | 34 ---- .../ringer/ui/viewmodel/RingerViewModel.kt | 27 --- .../VolumeDialogRingerDrawerViewModel.kt | 172 ------------------ .../dialog/shared/VolumeDialogLogger.kt | 10 - ...VolumeDialogRingerDrawerViewModelKosmos.kt | 35 ---- .../dialog/shared/VolumeDialogLoggerKosmos.kt | 22 --- 8 files changed, 477 deletions(-) delete mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt deleted file mode 100644 index faf01eddbcc3..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelTest.kt +++ /dev/null @@ -1,144 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -import android.media.AudioManager.RINGER_MODE_NORMAL -import android.media.AudioManager.RINGER_MODE_SILENT -import android.media.AudioManager.RINGER_MODE_VIBRATE -import android.media.AudioManager.STREAM_RING -import android.testing.TestableLooper -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.settingslib.volume.shared.model.RingerMode -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.haptics.fakeVibratorHelper -import com.android.systemui.kosmos.testScope -import com.android.systemui.plugins.fakeVolumeDialogController -import com.android.systemui.testKosmos -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.TestScope -import kotlinx.coroutines.test.runCurrent -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -@OptIn(ExperimentalCoroutinesApi::class) -@SmallTest -@RunWith(AndroidJUnit4::class) -@TestableLooper.RunWithLooper -class VolumeDialogRingerDrawerViewModelTest : SysuiTestCase() { - - private val kosmos = testKosmos() - private val testScope = kosmos.testScope - private val controller = kosmos.fakeVolumeDialogController - private val vibratorHelper = kosmos.fakeVibratorHelper - - private lateinit var underTest: VolumeDialogRingerDrawerViewModel - - @Before - fun setUp() { - underTest = kosmos.volumeDialogRingerDrawerViewModel - } - - @Test - fun onSelectedRingerNormalModeButtonClicked_openDrawer() = - testScope.runTest { - val ringerViewModel by collectLastValue(underTest.ringerViewModel) - val normalRingerMode = RingerMode(RINGER_MODE_NORMAL) - - setUpRingerModeAndOpenDrawer(normalRingerMode) - - assertThat(ringerViewModel).isNotNull() - assertThat(ringerViewModel?.drawerState) - .isEqualTo(RingerDrawerState.Open(normalRingerMode)) - } - - @Test - fun onSelectedRingerButtonClicked_drawerOpened_closeDrawer() = - testScope.runTest { - val ringerViewModel by collectLastValue(underTest.ringerViewModel) - val normalRingerMode = RingerMode(RINGER_MODE_NORMAL) - - setUpRingerModeAndOpenDrawer(normalRingerMode) - underTest.onRingerButtonClicked(normalRingerMode) - controller.getState() - - assertThat(ringerViewModel).isNotNull() - assertThat(ringerViewModel?.drawerState) - .isEqualTo(RingerDrawerState.Closed(normalRingerMode)) - } - - @Test - fun onNewRingerButtonClicked_drawerOpened_updateRingerMode_closeDrawer() = - testScope.runTest { - val ringerViewModel by collectLastValue(underTest.ringerViewModel) - val vibrateRingerMode = RingerMode(RINGER_MODE_VIBRATE) - - setUpRingerModeAndOpenDrawer(RingerMode(RINGER_MODE_NORMAL)) - // Select vibrate ringer mode. - underTest.onRingerButtonClicked(vibrateRingerMode) - controller.getState() - runCurrent() - - assertThat(ringerViewModel).isNotNull() - assertThat( - ringerViewModel - ?.availableButtons - ?.get(ringerViewModel!!.currentButtonIndex) - ?.ringerMode - ) - .isEqualTo(vibrateRingerMode) - assertThat(ringerViewModel?.drawerState) - .isEqualTo(RingerDrawerState.Closed(vibrateRingerMode)) - - val silentRingerMode = RingerMode(RINGER_MODE_SILENT) - // Open drawer - underTest.onRingerButtonClicked(vibrateRingerMode) - controller.getState() - - // Select silent ringer mode. - underTest.onRingerButtonClicked(silentRingerMode) - controller.getState() - runCurrent() - - assertThat(ringerViewModel).isNotNull() - assertThat( - ringerViewModel - ?.availableButtons - ?.get(ringerViewModel!!.currentButtonIndex) - ?.ringerMode - ) - .isEqualTo(silentRingerMode) - assertThat(ringerViewModel?.drawerState) - .isEqualTo(RingerDrawerState.Closed(silentRingerMode)) - assertThat(controller.hasScheduledTouchFeedback).isFalse() - assertThat(vibratorHelper.totalVibrations).isEqualTo(2) - } - - private fun TestScope.setUpRingerModeAndOpenDrawer(selectedRingerMode: RingerMode) { - controller.setStreamVolume(STREAM_RING, 50) - controller.setRingerMode(selectedRingerMode.value, false) - runCurrent() - - underTest.onRingerButtonClicked(RingerMode(selectedRingerMode.value)) - controller.getState() - runCurrent() - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt deleted file mode 100644 index 78d2d1686096..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerButtonViewModel.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -import android.annotation.DrawableRes -import android.annotation.StringRes -import com.android.settingslib.volume.shared.model.RingerMode - -/** Models ringer button that corresponds to each ringer mode. */ -data class RingerButtonViewModel( - /** Image resource id for the image button. */ - @DrawableRes val imageResId: Int, - /** Content description for a11y. */ - @StringRes val contentDescriptionResId: Int, - /** Hint label for accessibility use. */ - @StringRes val hintLabelResId: Int, - /** Used to notify view model when button is clicked. */ - val ringerMode: RingerMode, -) diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt deleted file mode 100644 index f3218370c4dd..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerDrawerState.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -import com.android.settingslib.volume.shared.model.RingerMode - -/** Models volume dialog ringer drawer state */ -sealed interface RingerDrawerState { - - /** When clicked to open drawer */ - data class Open(val mode: RingerMode) : RingerDrawerState - - /** When clicked to close drawer */ - data class Closed(val mode: RingerMode) : RingerDrawerState - - /** Initial state when volume dialog is shown with a closed drawer. */ - interface Initial : RingerDrawerState { - companion object : Initial - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt deleted file mode 100644 index a09bfebfd3e3..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/RingerViewModel.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -/** Models volume dialog ringer */ -data class RingerViewModel( - /** List of the available buttons according to the available modes */ - val availableButtons: List, - /** The index of the currently selected button */ - val currentButtonIndex: Int, - /** For open and close animations */ - val drawerState: RingerDrawerState, -) diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt deleted file mode 100644 index ac82ae39ba5c..000000000000 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModel.kt +++ /dev/null @@ -1,172 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -import android.media.AudioAttributes -import android.media.AudioManager.RINGER_MODE_NORMAL -import android.media.AudioManager.RINGER_MODE_SILENT -import android.media.AudioManager.RINGER_MODE_VIBRATE -import android.os.VibrationEffect -import com.android.settingslib.volume.shared.model.RingerMode -import com.android.systemui.dagger.qualifiers.Background -import com.android.systemui.res.R -import com.android.systemui.statusbar.VibratorHelper -import com.android.systemui.volume.Events -import com.android.systemui.volume.dialog.dagger.scope.VolumeDialog -import com.android.systemui.volume.dialog.ringer.domain.VolumeDialogRingerInteractor -import com.android.systemui.volume.dialog.ringer.shared.model.VolumeDialogRingerModel -import com.android.systemui.volume.dialog.shared.VolumeDialogLogger -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.flow.flowOn -import kotlinx.coroutines.flow.stateIn - -private const val TAG = "VolumeDialogRingerDrawerViewModel" - -class VolumeDialogRingerDrawerViewModel -@AssistedInject -constructor( - @VolumeDialog private val coroutineScope: CoroutineScope, - @Background private val backgroundDispatcher: CoroutineDispatcher, - private val interactor: VolumeDialogRingerInteractor, - private val vibrator: VibratorHelper, - private val volumeDialogLogger: VolumeDialogLogger, -) { - - private val drawerState = MutableStateFlow(RingerDrawerState.Initial) - - val ringerViewModel: Flow = - combine(interactor.ringerModel, drawerState) { ringerModel, state -> - ringerModel.toViewModel(state) - } - .flowOn(backgroundDispatcher) - .stateIn(coroutineScope, SharingStarted.Eagerly, null) - .filterNotNull() - - // Vibration attributes. - private val sonificiationVibrationAttributes = - AudioAttributes.Builder() - .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) - .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION) - .build() - - fun onRingerButtonClicked(ringerMode: RingerMode) { - if (drawerState.value is RingerDrawerState.Open) { - Events.writeEvent(Events.EVENT_RINGER_TOGGLE, ringerMode.value) - provideTouchFeedback(ringerMode) - interactor.setRingerMode(ringerMode) - } - drawerState.value = - when (drawerState.value) { - is RingerDrawerState.Initial -> { - RingerDrawerState.Open(ringerMode) - } - is RingerDrawerState.Open -> { - RingerDrawerState.Closed(ringerMode) - } - is RingerDrawerState.Closed -> { - RingerDrawerState.Open(ringerMode) - } - } - } - - private fun provideTouchFeedback(ringerMode: RingerMode) { - when (ringerMode.value) { - RINGER_MODE_NORMAL -> { - interactor.scheduleTouchFeedback() - null - } - RINGER_MODE_SILENT -> VibrationEffect.get(VibrationEffect.EFFECT_CLICK) - RINGER_MODE_VIBRATE -> VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK) - else -> VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK) - }?.let { vibrator.vibrate(it, sonificiationVibrationAttributes) } - } - - private fun VolumeDialogRingerModel.toViewModel( - drawerState: RingerDrawerState - ): RingerViewModel { - val currentIndex = availableModes.indexOf(currentRingerMode) - if (currentIndex == -1) { - volumeDialogLogger.onCurrentRingerModeIsUnsupported(currentRingerMode) - } - return RingerViewModel( - availableButtons = availableModes.map { mode -> toButtonViewModel(mode) }, - currentButtonIndex = currentIndex, - drawerState = drawerState, - ) - } - - private fun VolumeDialogRingerModel.toButtonViewModel( - ringerMode: RingerMode - ): RingerButtonViewModel? { - return when (ringerMode.value) { - RINGER_MODE_SILENT -> - RingerButtonViewModel( - imageResId = R.drawable.ic_speaker_mute, - contentDescriptionResId = R.string.volume_ringer_status_silent, - hintLabelResId = R.string.volume_ringer_hint_unmute, - ringerMode = ringerMode, - ) - RINGER_MODE_VIBRATE -> - RingerButtonViewModel( - imageResId = R.drawable.ic_volume_ringer_vibrate, - contentDescriptionResId = R.string.volume_ringer_status_vibrate, - hintLabelResId = R.string.volume_ringer_hint_vibrate, - ringerMode = ringerMode, - ) - RINGER_MODE_NORMAL -> - when { - isMuted && isEnabled -> - RingerButtonViewModel( - imageResId = R.drawable.ic_speaker_mute, - contentDescriptionResId = R.string.volume_ringer_status_normal, - hintLabelResId = R.string.volume_ringer_hint_unmute, - ringerMode = ringerMode, - ) - - availableModes.contains(RingerMode(RINGER_MODE_VIBRATE)) -> - RingerButtonViewModel( - imageResId = R.drawable.ic_speaker_on, - contentDescriptionResId = R.string.volume_ringer_status_normal, - hintLabelResId = R.string.volume_ringer_hint_vibrate, - ringerMode = ringerMode, - ) - - else -> - RingerButtonViewModel( - imageResId = R.drawable.ic_speaker_on, - contentDescriptionResId = R.string.volume_ringer_status_normal, - hintLabelResId = R.string.volume_ringer_hint_mute, - ringerMode = ringerMode, - ) - } - else -> null - } - } - - @AssistedFactory - interface Factory { - fun create(): VolumeDialogRingerDrawerViewModel - } -} diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt index 9a3aa7e3d79f..59c38c019823 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/shared/VolumeDialogLogger.kt @@ -15,7 +15,6 @@ */ package com.android.systemui.volume.dialog.shared -import com.android.settingslib.volume.shared.model.RingerMode import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel import com.android.systemui.log.dagger.VolumeLog @@ -44,13 +43,4 @@ class VolumeDialogLogger @Inject constructor(@VolumeLog private val logBuffer: L { "Dismiss: ${Events.DISMISS_REASONS[int1]}" }, ) } - - fun onCurrentRingerModeIsUnsupported(ringerMode: RingerMode) { - logBuffer.log( - TAG, - LogLevel.DEBUG, - { int1 = ringerMode.value }, - { "Current ringer mode: $int1, ringer mode is unsupported in ringer drawer options" }, - ) - } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt deleted file mode 100644 index db1c01a8698c..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/ringer/ui/viewmodel/VolumeDialogRingerDrawerViewModelKosmos.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.volume.dialog.ringer.ui.viewmodel - -import com.android.systemui.haptics.vibratorHelper -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.kosmos.applicationCoroutineScope -import com.android.systemui.kosmos.testDispatcher -import com.android.systemui.volume.dialog.ringer.domain.volumeDialogRingerInteractor -import com.android.systemui.volume.dialog.shared.volumeDialogLogger - -val Kosmos.volumeDialogRingerDrawerViewModel by - Kosmos.Fixture { - VolumeDialogRingerDrawerViewModel( - backgroundDispatcher = testDispatcher, - coroutineScope = applicationCoroutineScope, - interactor = volumeDialogRingerInteractor, - vibrator = vibratorHelper, - volumeDialogLogger = volumeDialogLogger, - ) - } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt deleted file mode 100644 index f9d4a992cd63..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/shared/VolumeDialogLoggerKosmos.kt +++ /dev/null @@ -1,22 +0,0 @@ -/* - * 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.volume.dialog.shared - -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.log.logcatLogBuffer - -val Kosmos.volumeDialogLogger by Kosmos.Fixture { VolumeDialogLogger(logcatLogBuffer()) } -- GitLab From fa5591c608f3a4d37286c7d67d23cec91f7f09ce Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 23 Oct 2024 10:57:43 +0200 Subject: [PATCH 281/459] Move ConditionalModifiers.kt to PlatformCompose Core The Modifier.thenIf(condition) { ... } was moved to PlatformComposeSceneTransitionLayout in ag/25017678, in order to make that library fully self-contained. After reflection, PlatformComposeCore makes more sense for this file and it's fine to make PlatformComposeSceneTransitionLayout depend on PlatformComposeCore (which was done in ag/29200580). Bug: 375119446 Test: presubmits, pure move. Flag: EXEMPT pure move. Change-Id: Id5012d3124e9ad7dda319e5cb16b0e5b5b7c9fe1 --- .../src/com/android/compose/modifiers/ConditionalModifiers.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/SystemUI/compose/{scene => core}/src/com/android/compose/modifiers/ConditionalModifiers.kt (100%) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/modifiers/ConditionalModifiers.kt b/packages/SystemUI/compose/core/src/com/android/compose/modifiers/ConditionalModifiers.kt similarity index 100% rename from packages/SystemUI/compose/scene/src/com/android/compose/modifiers/ConditionalModifiers.kt rename to packages/SystemUI/compose/core/src/com/android/compose/modifiers/ConditionalModifiers.kt -- GitLab From 68df5a3c2546380bad63cb244aed2603a42f1e68 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 23 Oct 2024 11:00:49 +0200 Subject: [PATCH 282/459] Move CommunalSwipeDetector to SystemUI/src/.../communal/ This CL moves CommunalSwipeDetector to the SystemUI/src/ directory, closer to other communal specific sources. This file was introduced by mistake in the STL library in ag/27499252 and moved (but still kept in the STL library) in ag/28220116. Bug: 375119446 Test: N/A pure move Flag: EXEMPT pure move Change-Id: I808715dd3bf2b2cf52db12f072c99eaef7778d78 --- .../android/systemui/communal/ui/compose/CommunalSwipeDetector.kt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/SystemUI/{compose/scene => }/src/com/android/systemui/communal/ui/compose/CommunalSwipeDetector.kt (100%) diff --git a/packages/SystemUI/compose/scene/src/com/android/systemui/communal/ui/compose/CommunalSwipeDetector.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/compose/CommunalSwipeDetector.kt similarity index 100% rename from packages/SystemUI/compose/scene/src/com/android/systemui/communal/ui/compose/CommunalSwipeDetector.kt rename to packages/SystemUI/src/com/android/systemui/communal/ui/compose/CommunalSwipeDetector.kt -- GitLab From 1a6bda04fbe7d774250aa2665d7f8844032b673c Mon Sep 17 00:00:00 2001 From: Massimo Carli Date: Fri, 18 Oct 2024 16:16:30 +0000 Subject: [PATCH 283/459] Add Cache to Settings access for CompatUI Flag: com.android.window.flags.enable_compat_ui_visibility_status Fix: 374684062 Test: atest WMShellUnitTests:CompatUIControllerTest Test: atest WMShellUnitTests:CompatUIStatusManagerTest Test: atest SettingsProviderTest:SettingsBackupTest Change-Id: I86d2859359ea4a3ee17690811a6b7fdcda4d1870 --- .../shell/compatui/CompatUIStatusManager.java | 27 +++++-- .../compatui/CompatUIStatusManagerTest.java | 73 ++++++++++++++++++- 2 files changed, 91 insertions(+), 9 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java index 915a8a149d54..37369d1f3047 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/compatui/CompatUIStatusManager.java @@ -24,6 +24,7 @@ import java.util.function.IntSupplier; /** Handle the visibility state of the Compat UI components. */ public class CompatUIStatusManager { + private static final int COMPAT_UI_EDUCATION_UNDEFINED = -1; public static final int COMPAT_UI_EDUCATION_HIDDEN = 0; public static final int COMPAT_UI_EDUCATION_VISIBLE = 1; @@ -32,24 +33,40 @@ public class CompatUIStatusManager { @NonNull private final IntSupplier mReader; + private int mCurrentValue = COMPAT_UI_EDUCATION_UNDEFINED; + public CompatUIStatusManager(@NonNull IntConsumer writer, @NonNull IntSupplier reader) { mWriter = writer; mReader = reader; } public CompatUIStatusManager() { - this(i -> { }, () -> COMPAT_UI_EDUCATION_HIDDEN); + this(i -> { + }, () -> COMPAT_UI_EDUCATION_HIDDEN); } void onEducationShown() { - mWriter.accept(COMPAT_UI_EDUCATION_VISIBLE); + if (mCurrentValue != COMPAT_UI_EDUCATION_VISIBLE) { + mCurrentValue = COMPAT_UI_EDUCATION_VISIBLE; + mWriter.accept(mCurrentValue); + } } void onEducationHidden() { - mWriter.accept(COMPAT_UI_EDUCATION_HIDDEN); + if (mCurrentValue != COMPAT_UI_EDUCATION_HIDDEN) { + mCurrentValue = COMPAT_UI_EDUCATION_HIDDEN; + mWriter.accept(mCurrentValue); + } } boolean isEducationVisible() { - return mReader.getAsInt() == COMPAT_UI_EDUCATION_VISIBLE; + return getCurrentValue() == COMPAT_UI_EDUCATION_VISIBLE; + } + + private int getCurrentValue() { + if (mCurrentValue == COMPAT_UI_EDUCATION_UNDEFINED) { + mCurrentValue = mReader.getAsInt(); + } + return mCurrentValue; } -} +} \ No newline at end of file diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java index d6059a88e9c7..8fd7c0ec3099 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/compatui/CompatUIStatusManagerTest.java @@ -16,6 +16,10 @@ package com.android.wm.shell.compatui; +import static com.android.wm.shell.compatui.CompatUIStatusManager.COMPAT_UI_EDUCATION_HIDDEN; + +import static junit.framework.Assert.assertEquals; + import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -25,7 +29,6 @@ import androidx.test.filters.SmallTest; import com.android.wm.shell.ShellTestCase; - import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -63,13 +66,75 @@ public class CompatUIStatusManagerTest extends ShellTestCase { assertFalse(mStatusManager.isEducationVisible()); } + @Test + public void valuesAreCached() { + // At the beginning the value is not read or written because + // we access the reader in lazy way. + mTestState.assertReaderInvocations(0); + mTestState.assertWriterInvocations(0); + + // We read the value when we start. Initial value is hidden. + assertFalse(mStatusManager.isEducationVisible()); + mTestState.assertReaderInvocations(1); + mTestState.assertWriterInvocations(0); + + // We send the event for the same state which is not written. + mStatusManager.onEducationHidden(); + assertFalse(mStatusManager.isEducationVisible()); + mTestState.assertReaderInvocations(1); + mTestState.assertWriterInvocations(0); + + // We send the event for the different state which is written but + // not read again. + mStatusManager.onEducationShown(); + assertTrue(mStatusManager.isEducationVisible()); + mTestState.assertReaderInvocations(1); + mTestState.assertWriterInvocations(1); + + // We read multiple times and we don't read the value again + mStatusManager.isEducationVisible(); + mStatusManager.isEducationVisible(); + mStatusManager.isEducationVisible(); + mTestState.assertReaderInvocations(1); + mTestState.assertWriterInvocations(1); + + // We write different values. Writer is only accessed when + // the value changes. + mStatusManager.onEducationHidden(); // change + mStatusManager.onEducationHidden(); + mStatusManager.onEducationShown(); // change + mStatusManager.onEducationShown(); + mStatusManager.onEducationHidden(); // change + mStatusManager.onEducationShown(); // change + mTestState.assertReaderInvocations(1); + mTestState.assertWriterInvocations(5); + } + static class FakeCompatUIStatusManagerTest { - int mCurrentStatus = 0; + int mCurrentStatus = COMPAT_UI_EDUCATION_HIDDEN; + + int mReaderInvocations; + + int mWriterInvocations; + + final IntSupplier mReader = () -> { + mReaderInvocations++; + return mCurrentStatus; + }; + + final IntConsumer mWriter = newStatus -> { + mWriterInvocations++; + mCurrentStatus = newStatus; + }; - final IntSupplier mReader = () -> mCurrentStatus; + void assertWriterInvocations(int expected) { + assertEquals(expected, mWriterInvocations); + } - final IntConsumer mWriter = newStatus -> mCurrentStatus = newStatus; + void assertReaderInvocations(int expected) { + assertEquals(expected, mReaderInvocations); + } } } -- GitLab From 98f15b4367b2e473575368525b425e77fbf8cc9b Mon Sep 17 00:00:00 2001 From: Chris Li Date: Wed, 23 Oct 2024 00:10:12 +0000 Subject: [PATCH 284/459] Cleanup scheduleTransactionAndLifecycleItems We no longer need to distinguish ActivityLifecycleItem Bug: 323801078 Test: pass presubmit for refactor Flag: EXEMPT refactor Change-Id: I7472e3a1319ed5f7419d501fd3786fe66f84566a --- .../com/android/server/wm/ActivityRecord.java | 4 +- .../android/server/wm/ActivityRefresher.java | 2 +- .../server/wm/ActivityTaskSupervisor.java | 7 ++-- .../server/wm/ClientLifecycleManager.java | 42 ++++++++++--------- .../server/wm/ActivityRefresherTests.java | 2 +- .../wm/CameraCompatFreeformPolicyTests.java | 2 +- .../wm/ClientLifecycleManagerTests.java | 13 +++--- .../wm/DisplayRotationCompatPolicyTests.java | 2 +- .../wm/WindowProcessControllerTests.java | 1 + 9 files changed, 41 insertions(+), 34 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 460de01a7d1d..78bf9104ae70 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -4916,7 +4916,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A final ActivityLifecycleItem lifecycleItem = getLifecycleItemForCurrentStateForResult(); try { if (lifecycleItem != null) { - mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( + mAtmService.getLifecycleManager().scheduleTransactionItems( app.getThread(), activityResultItem, lifecycleItem); } else { Slog.w(TAG, "Unable to get the lifecycle item for state " + mState @@ -9628,7 +9628,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } else { lifecycleItem = new PauseActivityItem(token); } - mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( + mAtmService.getLifecycleManager().scheduleTransactionItems( app.getThread(), callbackItem, lifecycleItem); startRelaunching(); // Note: don't need to call pauseIfSleepingLocked() here, because the caller will only diff --git a/services/core/java/com/android/server/wm/ActivityRefresher.java b/services/core/java/com/android/server/wm/ActivityRefresher.java index 5243a1069bed..ed8b6890b2d3 100644 --- a/services/core/java/com/android/server/wm/ActivityRefresher.java +++ b/services/core/java/com/android/server/wm/ActivityRefresher.java @@ -89,7 +89,7 @@ class ActivityRefresher { final ResumeActivityItem resumeActivityItem = new ResumeActivityItem( activity.token, /* isForward */ false, /* shouldSendCompatFakeFocus */ false); try { - activity.mAtmService.getLifecycleManager().scheduleTransactionAndLifecycleItems( + activity.mAtmService.getLifecycleManager().scheduleTransactionItems( activity.app.getThread(), refreshCallbackItem, resumeActivityItem); mHandler.postDelayed(() -> { synchronized (mWmService.mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4f71719006f5..0cf8ac995741 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -964,11 +964,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { // transaction. mService.getLifecycleManager().dispatchPendingTransaction(proc.getThread()); } - mService.getLifecycleManager().scheduleTransactionAndLifecycleItems( - proc.getThread(), launchActivityItem, lifecycleItem, + mService.getLifecycleManager().scheduleTransactionItems( + proc.getThread(), // Immediately dispatch the transaction, so that if it fails, the server can // restart the process and retry now. - true /* shouldDispatchImmediately */); + true /* shouldDispatchImmediately */, + launchActivityItem, lifecycleItem); if (procConfig.seq > mRootWindowContainer.getConfiguration().seq) { // If the seq is increased, there should be something changed (e.g. registered diff --git a/services/core/java/com/android/server/wm/ClientLifecycleManager.java b/services/core/java/com/android/server/wm/ClientLifecycleManager.java index 0acc6610a218..d291d99f2a7a 100644 --- a/services/core/java/com/android/server/wm/ClientLifecycleManager.java +++ b/services/core/java/com/android/server/wm/ClientLifecycleManager.java @@ -19,7 +19,6 @@ package com.android.server.wm; import android.annotation.NonNull; import android.app.IApplicationThread; import android.app.compat.CompatChanges; -import android.app.servertransaction.ActivityLifecycleItem; import android.app.servertransaction.ClientTransaction; import android.app.servertransaction.ClientTransactionItem; import android.app.servertransaction.LaunchActivityItem; @@ -97,31 +96,34 @@ class ClientLifecycleManager { } /** - * Schedules a single transaction item, either a callback or a lifecycle request, delivery to - * client application. + * Schedules a transaction with the given item, delivery to client application. + * * @throws RemoteException * @see ClientTransactionItem */ void scheduleTransactionItem(@NonNull IApplicationThread client, - @NonNull ClientTransactionItem transactionItem) throws RemoteException { + @NonNull ClientTransactionItem item) throws RemoteException { // Wait until RootWindowContainer#performSurfacePlacementNoTrace to dispatch all pending // transactions at once. final ClientTransaction clientTransaction = getOrCreatePendingTransaction(client); - clientTransaction.addTransactionItem(transactionItem); + clientTransaction.addTransactionItem(item); - onClientTransactionItemScheduled(clientTransaction, - false /* shouldDispatchImmediately */); + onClientTransactionItemScheduled(clientTransaction, false /* shouldDispatchImmediately */); } - void scheduleTransactionAndLifecycleItems(@NonNull IApplicationThread client, - @NonNull ClientTransactionItem transactionItem, - @NonNull ActivityLifecycleItem lifecycleItem) throws RemoteException { - scheduleTransactionAndLifecycleItems(client, transactionItem, lifecycleItem, - false /* shouldDispatchImmediately */); + /** + * Schedules a transaction with the given items, delivery to client application. + * + * @throws RemoteException + * @see ClientTransactionItem + */ + void scheduleTransactionItems(@NonNull IApplicationThread client, + @NonNull ClientTransactionItem... items) throws RemoteException { + scheduleTransactionItems(client, false /* shouldDispatchImmediately */, items); } /** - * Schedules a single transaction item with a lifecycle request, delivery to client application. + * Schedules a transaction with the given items, delivery to client application. * * @param shouldDispatchImmediately whether or not to dispatch the transaction immediately. This * should only be {@code true} when it is important to know the @@ -133,15 +135,17 @@ class ClientLifecycleManager { * @throws RemoteException * @see ClientTransactionItem */ - void scheduleTransactionAndLifecycleItems(@NonNull IApplicationThread client, - @NonNull ClientTransactionItem transactionItem, - @NonNull ActivityLifecycleItem lifecycleItem, - boolean shouldDispatchImmediately) throws RemoteException { + void scheduleTransactionItems(@NonNull IApplicationThread client, + boolean shouldDispatchImmediately, + @NonNull ClientTransactionItem... items) throws RemoteException { // Wait until RootWindowContainer#performSurfacePlacementNoTrace to dispatch all pending // transactions at once. final ClientTransaction clientTransaction = getOrCreatePendingTransaction(client); - clientTransaction.addTransactionItem(transactionItem); - clientTransaction.addTransactionItem(lifecycleItem); + + final int size = items.length; + for (int i = 0; i < size; i++) { + clientTransaction.addTransactionItem(items[i]); + } onClientTransactionItemScheduled(clientTransaction, shouldDispatchImmediately); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java index cb17f35f64d7..63dafcd0b5a8 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityRefresherTests.java @@ -197,7 +197,7 @@ public class ActivityRefresherTests extends WindowTestsBase { /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) - .scheduleTransactionAndLifecycleItems(mActivity.app.getThread(), + .scheduleTransactionItems(mActivity.app.getThread(), refreshCallbackItem, resumeActivityItem); } diff --git a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java index a07fd235d14f..e447565a55bd 100644 --- a/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/CameraCompatFreeformPolicyTests.java @@ -453,7 +453,7 @@ public class CameraCompatFreeformPolicyTests extends WindowTestsBase { /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) - .scheduleTransactionAndLifecycleItems(mActivity.app.getThread(), + .scheduleTransactionItems(mActivity.app.getThread(), refreshCallbackItem, resumeActivityItem); } diff --git a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java index 3ddf8da18d16..02ad9dbfda8e 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ClientLifecycleManagerTests.java @@ -123,7 +123,7 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { } @Test - public void testScheduleTransactionItemUnlocked() throws RemoteException { + public void testScheduleTransactionItemNow() throws RemoteException { // Use non binder client to get non-recycled ClientTransaction. mLifecycleManager.scheduleTransactionItemNow(mNonBinderClient, mTransactionItem); @@ -133,12 +133,12 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { } @Test - public void testScheduleTransactionAndLifecycleItems() throws RemoteException { + public void testScheduleTransactionItems() throws RemoteException { spyOn(mWms.mWindowPlacerLocked); doReturn(true).when(mWms.mWindowPlacerLocked).isTraversalScheduled(); // Use non binder client to get non-recycled ClientTransaction. - mLifecycleManager.scheduleTransactionAndLifecycleItems(mNonBinderClient, mTransactionItem, + mLifecycleManager.scheduleTransactionItems(mNonBinderClient, mTransactionItem, mLifecycleItem); assertEquals(1, mLifecycleManager.mPendingTransactions.size()); @@ -155,14 +155,15 @@ public class ClientLifecycleManagerTests extends SystemServiceTestsBase { } @Test - public void testScheduleTransactionAndLifecycleItems_shouldDispatchImmediately() + public void testScheduleTransactionItems_shouldDispatchImmediately() throws RemoteException { spyOn(mWms.mWindowPlacerLocked); doReturn(true).when(mWms.mWindowPlacerLocked).isTraversalScheduled(); // Use non binder client to get non-recycled ClientTransaction. - mLifecycleManager.scheduleTransactionAndLifecycleItems(mNonBinderClient, mTransactionItem, - mLifecycleItem, true /* shouldDispatchImmediately */); + mLifecycleManager.scheduleTransactionItems(mNonBinderClient, + true /* shouldDispatchImmediately */, + mTransactionItem, mLifecycleItem); verify(mLifecycleManager).scheduleTransaction(any()); assertTrue(mLifecycleManager.mPendingTransactions.isEmpty()); diff --git a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java index 35c9e3fb3aaf..9055353162a9 100644 --- a/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/DisplayRotationCompatPolicyTests.java @@ -614,7 +614,7 @@ public final class DisplayRotationCompatPolicyTests extends WindowTestsBase { /* isForward */ false, /* shouldSendCompatFakeFocus */ false); verify(mActivity.mAtmService.getLifecycleManager(), times(refreshRequested ? 1 : 0)) - .scheduleTransactionAndLifecycleItems(mActivity.app.getThread(), + .scheduleTransactionItems(mActivity.app.getThread(), refreshCallbackItem, resumeActivityItem); } diff --git a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java index 9bad2ec2ca2a..1dfb20a41816 100644 --- a/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/WindowProcessControllerTests.java @@ -309,6 +309,7 @@ public class WindowProcessControllerTests extends WindowTestsBase { newConfig.densityDpi += 100; mWpc.onConfigurationChanged(newConfig); verify(mClientLifecycleManager, never()).scheduleTransactionItem(eq(thread), any()); + verify(mClientLifecycleManager, never()).scheduleTransactionItems(eq(thread), any()); verify(mClientLifecycleManager, never()).scheduleTransactionItemNow(eq(thread), any()); // Cached -> non-cached will send the previous deferred config immediately. -- GitLab From 11420c435fafd98884af3e47007b453206e68589 Mon Sep 17 00:00:00 2001 From: Johannes Gallmann Date: Wed, 16 Oct 2024 12:26:03 +0000 Subject: [PATCH 285/459] Add millis suffix to BackEvent#getFrameTime API Bug: 373656418 Test: OnBackInvokedCallbackGestureTest Test: WindowOnBackInvokedDispatcherTest Flag: com.android.window.flags.predictive_back_timestamp_api Change-Id: I143a343ad0eedd63f40533c8adecb81be3e06066 --- core/api/current.txt | 2 +- core/java/android/window/BackEvent.java | 20 +++++++++---------- core/java/android/window/BackMotionEvent.java | 18 ++++++++--------- .../java/android/window/BackTouchTracker.java | 4 ++-- .../window/ImeOnBackInvokedDispatcher.java | 4 ++-- .../WindowOnBackInvokedDispatcherTest.java | 2 +- .../wm/shell/back/CrossTaskBackAnimation.java | 4 ++-- .../back/FlingOnBackAnimationCallback.kt | 8 ++++---- 8 files changed, 31 insertions(+), 31 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index 9298ca247659..73b35b211f25 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -61775,7 +61775,7 @@ package android.window { public final class BackEvent { ctor public BackEvent(float, float, float, int); ctor @FlaggedApi("com.android.window.flags.predictive_back_timestamp_api") public BackEvent(float, float, float, int, long); - method @FlaggedApi("com.android.window.flags.predictive_back_timestamp_api") public long getFrameTime(); + method @FlaggedApi("com.android.window.flags.predictive_back_timestamp_api") public long getFrameTimeMillis(); method @FloatRange(from=0, to=1) public float getProgress(); method public int getSwipeEdge(); method public float getTouchX(); diff --git a/core/java/android/window/BackEvent.java b/core/java/android/window/BackEvent.java index 90fac361c966..1b9235b21369 100644 --- a/core/java/android/window/BackEvent.java +++ b/core/java/android/window/BackEvent.java @@ -58,7 +58,7 @@ public final class BackEvent { private final float mTouchX; private final float mTouchY; private final float mProgress; - private final long mFrameTime; + private final long mFrameTimeMillis; @SwipeEdge private final int mSwipeEdge; @@ -68,7 +68,7 @@ public final class BackEvent { if (predictiveBackTimestampApi()) { return new BackEvent(backMotionEvent.getTouchX(), backMotionEvent.getTouchY(), backMotionEvent.getProgress(), backMotionEvent.getSwipeEdge(), - backMotionEvent.getFrameTime()); + backMotionEvent.getFrameTimeMillis()); } else { return new BackEvent(backMotionEvent.getTouchX(), backMotionEvent.getTouchY(), backMotionEvent.getProgress(), backMotionEvent.getSwipeEdge()); @@ -88,7 +88,7 @@ public final class BackEvent { mTouchY = touchY; mProgress = progress; mSwipeEdge = swipeEdge; - mFrameTime = System.nanoTime() / TimeUtils.NANOS_PER_MS; + mFrameTimeMillis = System.nanoTime() / TimeUtils.NANOS_PER_MS; } /** @@ -98,16 +98,16 @@ public final class BackEvent { * @param touchY Absolute Y location of the touch point of this event. * @param progress Value between 0 and 1 on how far along the back gesture is. * @param swipeEdge Indicates which edge the swipe starts from. - * @param frameTime frame time of the back event. + * @param frameTimeMillis frame time of the back event. */ @FlaggedApi(FLAG_PREDICTIVE_BACK_TIMESTAMP_API) public BackEvent(float touchX, float touchY, float progress, @SwipeEdge int swipeEdge, - long frameTime) { + long frameTimeMillis) { mTouchX = touchX; mTouchY = touchY; mProgress = progress; mSwipeEdge = swipeEdge; - mFrameTime = frameTime; + mFrameTimeMillis = frameTimeMillis; } /** @@ -160,8 +160,8 @@ public final class BackEvent { * Returns the frameTime of the BackEvent in milliseconds. Useful for calculating velocity. */ @FlaggedApi(FLAG_PREDICTIVE_BACK_TIMESTAMP_API) - public long getFrameTime() { - return mFrameTime; + public long getFrameTimeMillis() { + return mFrameTimeMillis; } @Override @@ -177,7 +177,7 @@ public final class BackEvent { && mTouchY == that.mTouchY && mProgress == that.mProgress && mSwipeEdge == that.mSwipeEdge - && mFrameTime == that.mFrameTime; + && mFrameTimeMillis == that.mFrameTimeMillis; } @Override @@ -187,7 +187,7 @@ public final class BackEvent { + ", mTouchY=" + mTouchY + ", mProgress=" + mProgress + ", mSwipeEdge=" + mSwipeEdge - + ", mFrameTime=" + mFrameTime + "ms" + + ", mFrameTimeMillis=" + mFrameTimeMillis + "}"; } } diff --git a/core/java/android/window/BackMotionEvent.java b/core/java/android/window/BackMotionEvent.java index a8ec4eeb039a..cc2afbc6aaa3 100644 --- a/core/java/android/window/BackMotionEvent.java +++ b/core/java/android/window/BackMotionEvent.java @@ -33,7 +33,7 @@ import android.view.RemoteAnimationTarget; public final class BackMotionEvent implements Parcelable { private final float mTouchX; private final float mTouchY; - private final long mFrameTime; + private final long mFrameTimeMillis; private final float mProgress; private final boolean mTriggerBack; @@ -49,7 +49,7 @@ public final class BackMotionEvent implements Parcelable { * * @param touchX Absolute X location of the touch point of this event. * @param touchY Absolute Y location of the touch point of this event. - * @param frameTime Event time of the corresponding touch event. + * @param frameTimeMillis Event time of the corresponding touch event. * @param progress Value between 0 and 1 on how far along the back gesture is. * @param triggerBack Indicates whether the back arrow is in the triggered state or not * @param swipeEdge Indicates which edge the swipe starts from. @@ -59,14 +59,14 @@ public final class BackMotionEvent implements Parcelable { public BackMotionEvent( float touchX, float touchY, - long frameTime, + long frameTimeMillis, float progress, boolean triggerBack, @BackEvent.SwipeEdge int swipeEdge, @Nullable RemoteAnimationTarget departingAnimationTarget) { mTouchX = touchX; mTouchY = touchY; - mFrameTime = frameTime; + mFrameTimeMillis = frameTimeMillis; mProgress = progress; mTriggerBack = triggerBack; mSwipeEdge = swipeEdge; @@ -80,7 +80,7 @@ public final class BackMotionEvent implements Parcelable { mTriggerBack = in.readBoolean(); mSwipeEdge = in.readInt(); mDepartingAnimationTarget = in.readTypedObject(RemoteAnimationTarget.CREATOR); - mFrameTime = in.readLong(); + mFrameTimeMillis = in.readLong(); } @NonNull @@ -109,7 +109,7 @@ public final class BackMotionEvent implements Parcelable { dest.writeBoolean(mTriggerBack); dest.writeInt(mSwipeEdge); dest.writeTypedObject(mDepartingAnimationTarget, flags); - dest.writeLong(mFrameTime); + dest.writeLong(mFrameTimeMillis); } /** @@ -156,8 +156,8 @@ public final class BackMotionEvent implements Parcelable { /** * Returns the frame time of the BackMotionEvent in milliseconds. */ - public long getFrameTime() { - return mFrameTime; + public long getFrameTimeMillis() { + return mFrameTimeMillis; } /** @@ -175,7 +175,7 @@ public final class BackMotionEvent implements Parcelable { return "BackMotionEvent{" + "mTouchX=" + mTouchX + ", mTouchY=" + mTouchY - + ", mFrameTime=" + mFrameTime + "ms" + + ", mFrameTimeMillis=" + mFrameTimeMillis + ", mProgress=" + mProgress + ", mTriggerBack=" + mTriggerBack + ", mSwipeEdge=" + mSwipeEdge diff --git a/core/java/android/window/BackTouchTracker.java b/core/java/android/window/BackTouchTracker.java index 39a30253adbd..4908068d51e4 100644 --- a/core/java/android/window/BackTouchTracker.java +++ b/core/java/android/window/BackTouchTracker.java @@ -151,7 +151,7 @@ public class BackTouchTracker { return new BackMotionEvent( /* touchX = */ mInitTouchX, /* touchY = */ mInitTouchY, - /* frameTime = */ 0, + /* frameTimeMillis = */ 0, /* progress = */ 0, /* triggerBack = */ mTriggerBack, /* swipeEdge = */ mSwipeEdge, @@ -236,7 +236,7 @@ public class BackTouchTracker { return new BackMotionEvent( /* touchX = */ mLatestTouchX, /* touchY = */ mLatestTouchY, - /* frameTime = */ 0, + /* frameTimeMillis = */ 0, /* progress = */ progress, /* triggerBack = */ mTriggerBack, /* swipeEdge = */ mSwipeEdge, diff --git a/core/java/android/window/ImeOnBackInvokedDispatcher.java b/core/java/android/window/ImeOnBackInvokedDispatcher.java index 8db1f9509757..bd01899a649b 100644 --- a/core/java/android/window/ImeOnBackInvokedDispatcher.java +++ b/core/java/android/window/ImeOnBackInvokedDispatcher.java @@ -238,7 +238,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc try { long frameTime = 0; if (predictiveBackTimestampApi()) { - frameTime = backEvent.getFrameTime(); + frameTime = backEvent.getFrameTimeMillis(); } mIOnBackInvokedCallback.onBackStarted( new BackMotionEvent(backEvent.getTouchX(), backEvent.getTouchY(), frameTime, @@ -254,7 +254,7 @@ public class ImeOnBackInvokedDispatcher implements OnBackInvokedDispatcher, Parc try { long frameTime = 0; if (predictiveBackTimestampApi()) { - frameTime = backEvent.getFrameTime(); + frameTime = backEvent.getFrameTimeMillis(); } mIOnBackInvokedCallback.onBackProgressed( new BackMotionEvent(backEvent.getTouchX(), backEvent.getTouchY(), frameTime, diff --git a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java index 46bd73e316f6..4d6c30ebbe2b 100644 --- a/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java +++ b/core/tests/coretests/src/android/window/WindowOnBackInvokedDispatcherTest.java @@ -686,7 +686,7 @@ public class WindowOnBackInvokedDispatcherTest { return new BackMotionEvent( /* touchX = */ 0, /* touchY = */ 0, - /* frameTime = */ 0, + /* frameTimeMillis = */ 0, /* progress = */ progress, /* triggerBack = */ false, /* swipeEdge = */ BackEvent.EDGE_LEFT, diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java index 52391d2f5a79..dc50fdbd1af3 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/CrossTaskBackAnimation.java @@ -333,7 +333,7 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { private void onGestureProgress(@NonNull BackEvent backEvent) { if (!mBackInProgress) { mBackInProgress = true; - mDownTime = backEvent.getFrameTime(); + mDownTime = backEvent.getFrameTimeMillis(); } float progress = backEvent.getProgress(); mTouchPos.set(backEvent.getTouchX(), backEvent.getTouchY()); @@ -342,7 +342,7 @@ public class CrossTaskBackAnimation extends ShellBackAnimation { mVelocityTracker.addMovement( MotionEvent.obtain( /* downTime */ mDownTime, - /* eventTime */ backEvent.getFrameTime(), + /* eventTime */ backEvent.getFrameTimeMillis(), /* action */ ACTION_MOVE, /* x */ interpolatedProgress * SPRING_SCALE, /* y */ 0f, diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt index 6da06d0711d8..cd2dd04568a7 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/back/FlingOnBackAnimationCallback.kt @@ -60,7 +60,7 @@ abstract class FlingOnBackAnimationCallback( it.touchY, progress / SCALE_FACTOR, it.swipeEdge, - it.frameTime, + it.frameTimeMillis, ) onBackProgressedCompat(backEvent) } @@ -87,7 +87,7 @@ abstract class FlingOnBackAnimationCallback( } reset() if (predictiveBackTimestampApi()) { - downTime = backEvent.frameTime + downTime = backEvent.frameTimeMillis } onBackStartedCompat(backEvent) } @@ -98,7 +98,7 @@ abstract class FlingOnBackAnimationCallback( velocityTracker.addMovement( MotionEvent.obtain( /* downTime */ downTime!!, - /* eventTime */ backEvent.frameTime, + /* eventTime */ backEvent.frameTimeMillis, /* action */ ACTION_MOVE, /* x */ interpolatedProgress * SCALE_FACTOR, /* y */ 0f, @@ -111,7 +111,7 @@ abstract class FlingOnBackAnimationCallback( backEvent.touchY, interpolatedProgress, backEvent.swipeEdge, - backEvent.frameTime, + backEvent.frameTimeMillis, ) } else { lastBackEvent = -- GitLab From f0c4532941861d5057e3b7b86742065412aaec84 Mon Sep 17 00:00:00 2001 From: Samiul Islam Date: Thu, 17 Oct 2024 16:20:41 +0000 Subject: [PATCH 286/459] Extract uses-sdk-library information into ApkLite The APIs are similar to what is available on PackageImpl. Bug: 372862145 Test: atest ApkLiteParseUtilsTest FLAG: android.content.pm.sdk_dependency_installer Change-Id: I1d33ca48d998f11ec04ddc5f856b4a060d8e1d4f --- core/java/android/content/pm/flags.aconfig | 7 + .../android/content/pm/parsing/ApkLite.java | 54 +++- .../content/pm/parsing/ApkLiteParseUtils.java | 64 +++- .../content/pm/parsing/PackageLite.java | 28 +- core/tests/coretests/Android.bp | 4 + core/tests/coretests/AndroidTest.xml | 12 + .../pm/parsing/ApkLiteParseUtilsTest.java | 301 ++++++++++++++++++ 7 files changed, 462 insertions(+), 8 deletions(-) create mode 100644 core/tests/coretests/src/android/content/pm/parsing/ApkLiteParseUtilsTest.java diff --git a/core/java/android/content/pm/flags.aconfig b/core/java/android/content/pm/flags.aconfig index 5b38942d468d..82505a03f87f 100644 --- a/core/java/android/content/pm/flags.aconfig +++ b/core/java/android/content/pm/flags.aconfig @@ -327,6 +327,13 @@ flag { is_fixed_read_only: true } +flag { + name: "sdk_dependency_installer" + namespace: "package_manager_service" + description: "Feature flag to enable installation of missing sdk dependency of app" + bug: "370822870" +} + flag { name: "include_feature_flags_in_package_cacher" namespace: "package_manager_service" diff --git a/core/java/android/content/pm/parsing/ApkLite.java b/core/java/android/content/pm/parsing/ApkLite.java index 19a13db15b05..4220590a6943 100644 --- a/core/java/android/content/pm/parsing/ApkLite.java +++ b/core/java/android/content/pm/parsing/ApkLite.java @@ -28,6 +28,7 @@ import android.content.pm.VerifierInfo; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DataClass; +import java.util.Collections; import java.util.List; import java.util.Set; @@ -140,6 +141,21 @@ public class ApkLite { */ private final boolean mIsSdkLibrary; + /** + * List of SDK names used by this apk. + */ + private final @NonNull List mUsesSdkLibraries; + + /** + * List of SDK major versions used by this apk. + */ + private final @Nullable long[] mUsesSdkLibrariesVersionsMajor; + + /** + * List of SDK certificates used by this apk. + */ + private final @Nullable String[][] mUsesSdkLibrariesCertDigests; + /** * Indicates if this system app can be updated. */ @@ -167,7 +183,9 @@ public class ApkLite { String requiredSystemPropertyName, String requiredSystemPropertyValue, int minSdkVersion, int targetSdkVersion, int rollbackDataPolicy, Set requiredSplitTypes, Set splitTypes, - boolean hasDeviceAdminReceiver, boolean isSdkLibrary, boolean updatableSystem, + boolean hasDeviceAdminReceiver, boolean isSdkLibrary, + List usesSdkLibraries, long[] usesSdkLibrariesVersionsMajor, + String[][] usesSdkLibrariesCertDigests, boolean updatableSystem, String emergencyInstaller, List declaredLibraries) { mPath = path; mPackageName = packageName; @@ -202,6 +220,9 @@ public class ApkLite { mRollbackDataPolicy = rollbackDataPolicy; mHasDeviceAdminReceiver = hasDeviceAdminReceiver; mIsSdkLibrary = isSdkLibrary; + mUsesSdkLibraries = usesSdkLibraries; + mUsesSdkLibrariesVersionsMajor = usesSdkLibrariesVersionsMajor; + mUsesSdkLibrariesCertDigests = usesSdkLibrariesCertDigests; mUpdatableSystem = updatableSystem; mEmergencyInstaller = emergencyInstaller; mArchivedPackage = null; @@ -242,6 +263,9 @@ public class ApkLite { mRollbackDataPolicy = 0; mHasDeviceAdminReceiver = false; mIsSdkLibrary = false; + mUsesSdkLibraries = Collections.emptyList(); + mUsesSdkLibrariesVersionsMajor = null; + mUsesSdkLibrariesCertDigests = null; mUpdatableSystem = true; mEmergencyInstaller = null; mArchivedPackage = archivedPackage; @@ -554,6 +578,30 @@ public class ApkLite { return mIsSdkLibrary; } + /** + * List of SDK names used by this apk. + */ + @DataClass.Generated.Member + public @NonNull List getUsesSdkLibraries() { + return mUsesSdkLibraries; + } + + /** + * List of SDK major versions used by this apk. + */ + @DataClass.Generated.Member + public @Nullable long[] getUsesSdkLibrariesVersionsMajor() { + return mUsesSdkLibrariesVersionsMajor; + } + + /** + * List of SDK certificates used by this apk. + */ + @DataClass.Generated.Member + public @Nullable String[][] getUsesSdkLibrariesCertDigests() { + return mUsesSdkLibrariesCertDigests; + } + /** * Indicates if this system app can be updated. */ @@ -584,10 +632,10 @@ public class ApkLite { } @DataClass.Generated( - time = 1728333566322L, + time = 1729247366948L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/parsing/ApkLite.java", - inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mRevisionCode\nprivate final int mInstallLocation\nprivate final int mMinSdkVersion\nprivate final int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final boolean mFeatureSplit\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mProfileableByShell\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final boolean mOverlayIsStatic\nprivate final int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final int mRollbackDataPolicy\nprivate final boolean mHasDeviceAdminReceiver\nprivate final boolean mIsSdkLibrary\nprivate final boolean mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.NonNull java.util.List mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") + inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.Nullable java.lang.String mSplitName\nprivate final @android.annotation.Nullable java.lang.String mUsesSplitName\nprivate final @android.annotation.Nullable java.lang.String mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mRevisionCode\nprivate final int mInstallLocation\nprivate final int mMinSdkVersion\nprivate final int mTargetSdkVersion\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final boolean mFeatureSplit\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mProfileableByShell\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mUseEmbeddedDex\nprivate final @android.annotation.Nullable java.lang.String mTargetPackageName\nprivate final boolean mOverlayIsStatic\nprivate final int mOverlayPriority\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyName\nprivate final @android.annotation.Nullable java.lang.String mRequiredSystemPropertyValue\nprivate final int mRollbackDataPolicy\nprivate final boolean mHasDeviceAdminReceiver\nprivate final boolean mIsSdkLibrary\nprivate final @android.annotation.NonNull java.util.List mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final boolean mUpdatableSystem\nprivate final @android.annotation.Nullable java.lang.String mEmergencyInstaller\nprivate final @android.annotation.NonNull java.util.List mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass ApkLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") @Deprecated private void __metadata() {} diff --git a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java index 1a7f628ae61c..50d875845b2f 100644 --- a/core/java/android/content/pm/parsing/ApkLiteParseUtils.java +++ b/core/java/android/content/pm/parsing/ApkLiteParseUtils.java @@ -32,6 +32,7 @@ import android.content.pm.parsing.result.ParseResult; import android.content.res.ApkAssets; import android.content.res.XmlResourceParser; import android.os.Build; +import android.os.SystemProperties; import android.os.Trace; import android.text.TextUtils; import android.util.ArrayMap; @@ -44,6 +45,7 @@ import com.android.internal.pm.pkg.component.flags.Flags; import com.android.internal.util.ArrayUtils; import libcore.io.IoUtils; +import libcore.util.HexEncoding; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -88,6 +90,7 @@ public class ApkLiteParseUtils { private static final String TAG_USES_SDK = "uses-sdk"; private static final String TAG_USES_SPLIT = "uses-split"; private static final String TAG_MANIFEST = "manifest"; + private static final String TAG_USES_SDK_LIBRARY = "uses-sdk-library"; private static final String TAG_SDK_LIBRARY = "sdk-library"; private static final int SDK_VERSION = Build.VERSION.SDK_INT; private static final String[] SDK_CODENAMES = Build.VERSION.ACTIVE_CODENAMES; @@ -460,6 +463,9 @@ public class ApkLiteParseUtils { boolean hasDeviceAdminReceiver = false; boolean isSdkLibrary = false; + List usesSdkLibraries = new ArrayList<>(); + long[] usesSdkLibrariesVersionsMajor = new long[0]; + String[][] usesSdkLibrariesCertDigests = new String[0][0]; List declaredLibraries = new ArrayList<>(); // Only search the tree when the tag is the direct child of tag @@ -523,6 +529,57 @@ public class ApkLiteParseUtils { hasDeviceAdminReceiver |= isDeviceAdminReceiver(parser, hasBindDeviceAdminPermission); break; + case TAG_USES_SDK_LIBRARY: + String usesSdkLibName = parser.getAttributeValue( + ANDROID_RES_NAMESPACE, "name"); + long usesSdkLibVersionMajor = parser.getAttributeIntValue( + ANDROID_RES_NAMESPACE, "versionMajor", -1); + String usesSdkCertDigest = parser.getAttributeValue( + ANDROID_RES_NAMESPACE, "certDigest"); + + if (usesSdkLibName == null || usesSdkLibName.isBlank() + || usesSdkLibVersionMajor < 0) { + return input.error( + PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Bad uses-sdk-library declaration name: " + + usesSdkLibName + + " version: " + usesSdkLibVersionMajor); + } + + if (usesSdkLibraries.contains(usesSdkLibName)) { + return input.error( + PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, + "Bad uses-sdk-library declaration. Depending on" + + " multiple versions of SDK library: " + + usesSdkLibName); + } + + usesSdkLibraries.add(usesSdkLibName); + usesSdkLibrariesVersionsMajor = ArrayUtils.appendLong( + usesSdkLibrariesVersionsMajor, usesSdkLibVersionMajor, + /*allowDuplicates=*/ true); + + // We allow ":" delimiters in the SHA declaration as this is the format + // emitted by the certtool making it easy for developers to copy/paste. + // TODO(372862145): Add test for this replacement + usesSdkCertDigest = usesSdkCertDigest.replace(":", "").toLowerCase(); + + if ("".equals(usesSdkCertDigest)) { + // Test-only uses-sdk-library empty certificate digest override. + usesSdkCertDigest = SystemProperties.get( + "debug.pm.uses_sdk_library_default_cert_digest", ""); + // Validate the overridden digest. + try { + HexEncoding.decode(usesSdkCertDigest, false); + } catch (IllegalArgumentException e) { + usesSdkCertDigest = ""; + } + } + // TODO(372862145): Add support for multiple signer + usesSdkLibrariesCertDigests = ArrayUtils.appendElement(String[].class, + usesSdkLibrariesCertDigests, new String[]{usesSdkCertDigest}, + /*allowDuplicates=*/ true); + break; case TAG_SDK_LIBRARY: isSdkLibrary = true; // Mirrors ParsingPackageUtils#parseSdkLibrary until lite and full @@ -534,7 +591,7 @@ public class ApkLiteParseUtils { if (sdkLibName == null || sdkLibVersionMajor < 0) { return input.error( PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED, - "Bad uses-sdk-library declaration name: " + sdkLibName + "Bad sdk-library declaration name: " + sdkLibName + " version: " + sdkLibVersionMajor); } declaredLibraries.add(new SharedLibraryInfo( @@ -694,8 +751,9 @@ public class ApkLiteParseUtils { overlayIsStatic, overlayPriority, requiredSystemPropertyName, requiredSystemPropertyValue, minSdkVersion, targetSdkVersion, rollbackDataPolicy, requiredSplitTypes.first, requiredSplitTypes.second, - hasDeviceAdminReceiver, isSdkLibrary, updatableSystem, emergencyInstaller, - declaredLibraries)); + hasDeviceAdminReceiver, isSdkLibrary, usesSdkLibraries, + usesSdkLibrariesVersionsMajor, usesSdkLibrariesCertDigests, + updatableSystem, emergencyInstaller, declaredLibraries)); } private static boolean isDeviceAdminReceiver( diff --git a/core/java/android/content/pm/parsing/PackageLite.java b/core/java/android/content/pm/parsing/PackageLite.java index 9a2ee7fe4cc6..79c597327f5a 100644 --- a/core/java/android/content/pm/parsing/PackageLite.java +++ b/core/java/android/content/pm/parsing/PackageLite.java @@ -115,6 +115,12 @@ public class PackageLite { */ private final boolean mIsSdkLibrary; + private final @NonNull List mUsesSdkLibraries; + + private final @Nullable long[] mUsesSdkLibrariesVersionsMajor; + + private final @Nullable String[][] mUsesSdkLibrariesCertDigests; + private final @NonNull List mDeclaredLibraries; /** @@ -149,6 +155,9 @@ public class PackageLite { mSplitRequired = (baseApk.isSplitRequired() || hasAnyRequiredSplitTypes()); mProfileableByShell = baseApk.isProfileableByShell(); mIsSdkLibrary = baseApk.isIsSdkLibrary(); + mUsesSdkLibraries = baseApk.getUsesSdkLibraries(); + mUsesSdkLibrariesVersionsMajor = baseApk.getUsesSdkLibrariesVersionsMajor(); + mUsesSdkLibrariesCertDigests = baseApk.getUsesSdkLibrariesCertDigests(); mSplitNames = splitNames; mSplitTypes = splitTypes; mIsFeatureSplits = isFeatureSplits; @@ -437,6 +446,21 @@ public class PackageLite { return mIsSdkLibrary; } + @DataClass.Generated.Member + public @NonNull List getUsesSdkLibraries() { + return mUsesSdkLibraries; + } + + @DataClass.Generated.Member + public @Nullable long[] getUsesSdkLibrariesVersionsMajor() { + return mUsesSdkLibrariesVersionsMajor; + } + + @DataClass.Generated.Member + public @Nullable String[][] getUsesSdkLibrariesCertDigests() { + return mUsesSdkLibrariesCertDigests; + } + @DataClass.Generated.Member public @NonNull List getDeclaredLibraries() { return mDeclaredLibraries; @@ -451,10 +475,10 @@ public class PackageLite { } @DataClass.Generated( - time = 1728333569917L, + time = 1729248757933L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/core/java/android/content/pm/parsing/PackageLite.java", - inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set[] mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mTargetSdk\nprivate final int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mProfileableByShell\nprivate final boolean mUseEmbeddedDex\nprivate final boolean mIsSdkLibrary\nprivate final @android.annotation.NonNull java.util.List mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic java.util.List getAllApkPaths()\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") + inputSignatures = "private final @android.annotation.NonNull java.lang.String mPackageName\nprivate final @android.annotation.NonNull java.lang.String mPath\nprivate final @android.annotation.NonNull java.lang.String mBaseApkPath\nprivate final @android.annotation.Nullable java.lang.String[] mSplitApkPaths\nprivate final @android.annotation.Nullable java.lang.String[] mSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mUsesSplitNames\nprivate final @android.annotation.Nullable java.lang.String[] mConfigForSplit\nprivate final @android.annotation.Nullable java.util.Set mBaseRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set[] mRequiredSplitTypes\nprivate final @android.annotation.Nullable java.util.Set[] mSplitTypes\nprivate final int mVersionCodeMajor\nprivate final int mVersionCode\nprivate final int mTargetSdk\nprivate final int mBaseRevisionCode\nprivate final @android.annotation.Nullable int[] mSplitRevisionCodes\nprivate final int mInstallLocation\nprivate final @android.annotation.NonNull android.content.pm.VerifierInfo[] mVerifiers\nprivate final @android.annotation.NonNull android.content.pm.SigningDetails mSigningDetails\nprivate final @android.annotation.Nullable boolean[] mIsFeatureSplits\nprivate final boolean mIsolatedSplits\nprivate final boolean mSplitRequired\nprivate final boolean mCoreApp\nprivate final boolean mDebuggable\nprivate final boolean mMultiArch\nprivate final boolean mUse32bitAbi\nprivate final boolean mExtractNativeLibs\nprivate final boolean mProfileableByShell\nprivate final boolean mUseEmbeddedDex\nprivate final boolean mIsSdkLibrary\nprivate final @android.annotation.NonNull java.util.List mUsesSdkLibraries\nprivate final @android.annotation.Nullable long[] mUsesSdkLibrariesVersionsMajor\nprivate final @android.annotation.Nullable java.lang.String[][] mUsesSdkLibrariesCertDigests\nprivate final @android.annotation.NonNull java.util.List mDeclaredLibraries\nprivate final @android.annotation.Nullable android.content.pm.ArchivedPackageParcel mArchivedPackage\npublic java.util.List getAllApkPaths()\npublic long getLongVersionCode()\nprivate boolean hasAnyRequiredSplitTypes()\nclass PackageLite extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genConstDefs=false)") @Deprecated private void __metadata() {} diff --git a/core/tests/coretests/Android.bp b/core/tests/coretests/Android.bp index 56e18e6c443f..aee1c3b2f28c 100644 --- a/core/tests/coretests/Android.bp +++ b/core/tests/coretests/Android.bp @@ -146,6 +146,10 @@ android_test { ":BinderProxyCountingTestService", ":AppThatUsesAppOps", ":AppThatCallsBinderMethods", + ":HelloWorldSdk1", + ":HelloWorldUsingSdk1AndSdk1", + ":HelloWorldUsingSdk1And2", + ":HelloWorldUsingSdkMalformedNegativeVersion", ], } diff --git a/core/tests/coretests/AndroidTest.xml b/core/tests/coretests/AndroidTest.xml index 05ab783c01bb..3bc81724bc0a 100644 --- a/core/tests/coretests/AndroidTest.xml +++ b/core/tests/coretests/AndroidTest.xml @@ -29,6 +29,18 @@

    Used to fail early if there are no rules (so we don't need to parse the apk at all). - */ - public boolean initialized() { - return new File(mRulesDir, RULES_FILE).exists() - && new File(mRulesDir, METADATA_FILE).exists() - && new File(mRulesDir, INDEXING_FILE).exists(); - } - - /** Write rules to persistent storage. */ - public void writeRules(String version, String ruleProvider, List rules) - throws IOException, RuleSerializeException { - try { - writeMetadata(mStagingDir, ruleProvider, version); - } catch (IOException e) { - Slog.e(TAG, "Error writing metadata.", e); - // We don't consider this fatal so we continue execution. - } - - try (FileOutputStream ruleFileOutputStream = - new FileOutputStream(new File(mStagingDir, RULES_FILE)); - FileOutputStream indexingFileOutputStream = - new FileOutputStream(new File(mStagingDir, INDEXING_FILE))) { - mRuleSerializer.serialize( - rules, Optional.empty(), ruleFileOutputStream, indexingFileOutputStream); - } - - switchStagingRulesDir(); - - // Update object holding the indexing information. - updateRuleIndexingController(); - } - - /** - * Read rules from persistent storage. - * - * @param appInstallMetadata information about the install used to select rules to read. If - * null, all rules will be read. - */ - public List readRules(@Nullable AppInstallMetadata appInstallMetadata) - throws IOException, RuleParseException { - synchronized (RULES_LOCK) { - // Try to identify indexes from the index file. - List ruleReadingIndexes = Collections.emptyList(); - if (appInstallMetadata != null) { - try { - ruleReadingIndexes = - mRuleIndexingController.identifyRulesToEvaluate(appInstallMetadata); - } catch (Exception e) { - Slog.w(TAG, "Error identifying the rule indexes. Trying unindexed.", e); - } - } - - // Read the rules based on the index information when available. - File ruleFile = new File(mRulesDir, RULES_FILE); - List rules = - mRuleParser.parse(RandomAccessObject.ofFile(ruleFile), ruleReadingIndexes); - return rules; - } - } - - /** Read the metadata of the current rules in storage. */ - @Nullable - public RuleMetadata readMetadata() { - return mRuleMetadataCache; - } - - private void switchStagingRulesDir() throws IOException { - synchronized (RULES_LOCK) { - File tmpDir = new File(mDataDir, "temp"); - - if (!(mRulesDir.renameTo(tmpDir) - && mStagingDir.renameTo(mRulesDir) - && tmpDir.renameTo(mStagingDir))) { - throw new IOException("Error switching staging/rules directory"); - } - - for (File file : mStagingDir.listFiles()) { - file.delete(); - } - } - } - - private void updateRuleIndexingController() { - File ruleIndexingFile = new File(mRulesDir, INDEXING_FILE); - if (ruleIndexingFile.exists()) { - try (FileInputStream inputStream = new FileInputStream(ruleIndexingFile)) { - mRuleIndexingController = new RuleIndexingController(inputStream); - } catch (Exception e) { - Slog.e(TAG, "Error parsing the rule indexing file.", e); - } - } - } - - private void writeMetadata(File directory, String ruleProvider, String version) - throws IOException { - mRuleMetadataCache = new RuleMetadata(ruleProvider, version); - - File metadataFile = new File(directory, METADATA_FILE); - - try (FileOutputStream outputStream = new FileOutputStream(metadataFile)) { - RuleMetadataSerializer.serialize(mRuleMetadataCache, outputStream); - } - } -} diff --git a/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java b/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java deleted file mode 100644 index 096c80b13b89..000000000000 --- a/services/tests/servicestests/src/com/android/server/integrity/IntegrityFileManagerTest.java +++ /dev/null @@ -1,243 +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.server.integrity; - -import static com.android.server.integrity.model.IndexingFileConstants.INDEXING_BLOCK_SIZE; - -import static com.google.common.truth.Truth.assertThat; - -import android.content.integrity.AppInstallMetadata; -import android.content.integrity.AtomicFormula; -import android.content.integrity.AtomicFormula.LongAtomicFormula; -import android.content.integrity.AtomicFormula.StringAtomicFormula; -import android.content.integrity.CompoundFormula; -import android.content.integrity.Rule; -import android.util.Slog; - -import com.android.server.integrity.parser.RuleBinaryParser; -import com.android.server.integrity.serializer.RuleBinarySerializer; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import java.io.File; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; - -/** Unit test for {@link IntegrityFileManager} */ -@RunWith(JUnit4.class) -public class IntegrityFileManagerTest { - private static final String TAG = "IntegrityFileManagerTest"; - - private static final String VERSION = "version"; - private static final String RULE_PROVIDER = "rule_provider"; - - private File mTmpDir; - - // under test - private IntegrityFileManager mIntegrityFileManager; - - @Before - public void setUp() throws Exception { - mTmpDir = Files.createTempDirectory("IntegrityFileManagerTest").toFile(); - Slog.i(TAG, "Using temp directory " + mTmpDir); - - // Use Xml Parser/Serializer to help with debugging since we can just print the file. - mIntegrityFileManager = - new IntegrityFileManager( - new RuleBinaryParser(), new RuleBinarySerializer(), mTmpDir); - Files.walk(mTmpDir.toPath()) - .forEach( - path -> { - Slog.i(TAG, "before " + path); - }); - } - - @After - public void tearDown() throws Exception { - Files.walk(mTmpDir.toPath()) - .forEach( - path -> { - Slog.i(TAG, "after " + path); - }); - // Sorting paths in reverse order guarantees that we delete inside files before deleting - // directory. - Files.walk(mTmpDir.toPath()) - .sorted(Comparator.reverseOrder()) - .map(Path::toFile) - .forEach(File::delete); - } - - @Test - public void testGetMetadata() throws Exception { - assertThat(mIntegrityFileManager.readMetadata()).isNull(); - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, Collections.EMPTY_LIST); - - assertThat(mIntegrityFileManager.readMetadata()).isNotNull(); - assertThat(mIntegrityFileManager.readMetadata().getVersion()).isEqualTo(VERSION); - assertThat(mIntegrityFileManager.readMetadata().getRuleProvider()).isEqualTo(RULE_PROVIDER); - } - - @Test - public void testIsInitialized() throws Exception { - assertThat(mIntegrityFileManager.initialized()).isFalse(); - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, Collections.EMPTY_LIST); - assertThat(mIntegrityFileManager.initialized()).isTrue(); - } - - @Test - public void testGetRules() throws Exception { - String packageName = "package"; - String packageCert = "cert"; - int version = 123; - Rule packageNameRule = getPackageNameIndexedRule(packageName); - Rule packageCertRule = getAppCertificateIndexedRule(packageCert); - Rule versionCodeRule = - new Rule( - new LongAtomicFormula( - AtomicFormula.VERSION_CODE, AtomicFormula.EQ, version), - Rule.DENY); - Rule randomRule = - new Rule( - new CompoundFormula( - CompoundFormula.OR, - Arrays.asList( - new StringAtomicFormula( - AtomicFormula.PACKAGE_NAME, - "abc", - /* isHashedValue= */ false), - new LongAtomicFormula( - AtomicFormula.VERSION_CODE, - AtomicFormula.EQ, - version))), - Rule.DENY); - - List rules = - Arrays.asList(packageNameRule, packageCertRule, versionCodeRule, randomRule); - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, rules); - - AppInstallMetadata appInstallMetadata = - new AppInstallMetadata.Builder() - .setPackageName(packageName) - .setAppCertificates(Collections.singletonList(packageCert)) - .setAppCertificateLineage(Collections.singletonList(packageCert)) - .setVersionCode(version) - .setInstallerName("abc") - .setInstallerCertificates(Collections.singletonList("abc")) - .setIsPreInstalled(true) - .build(); - List rulesFetched = mIntegrityFileManager.readRules(appInstallMetadata); - - assertThat(rulesFetched) - .containsExactly(packageNameRule, packageCertRule, versionCodeRule, randomRule); - } - - @Test - public void testGetRules_indexedForManyRules() throws Exception { - String packageName = "package"; - String installerName = "installer"; - String appCertificate = "cert"; - - // Create a rule set with 2500 package name indexed, 2500 app certificate indexed and - // 500 unindexed rules. - List rules = new ArrayList<>(); - int unindexedRuleCount = 70; - - for (int i = 0; i < 2500; i++) { - rules.add(getPackageNameIndexedRule(String.format("%s%04d", packageName, i))); - rules.add(getAppCertificateIndexedRule(String.format("%s%04d", appCertificate, i))); - } - - for (int i = 0; i < unindexedRuleCount; i++) { - rules.add(getInstallerCertificateRule(String.format("%s%04d", installerName, i))); - } - - // Write the rules and get them indexed. - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, rules); - - // Read the rules for a specific rule. - String installedPackageName = String.format("%s%04d", packageName, 264); - String installedAppCertificate = String.format("%s%04d", appCertificate, 1264); - AppInstallMetadata appInstallMetadata = - new AppInstallMetadata.Builder() - .setPackageName(installedPackageName) - .setAppCertificates(Collections.singletonList(installedAppCertificate)) - .setAppCertificateLineage( - Collections.singletonList(installedAppCertificate)) - .setVersionCode(250) - .setInstallerName("abc") - .setInstallerCertificates(Collections.singletonList("abc")) - .setIsPreInstalled(true) - .build(); - List rulesFetched = mIntegrityFileManager.readRules(appInstallMetadata); - - // Verify that we do not load all the rules and we have the necessary rules to evaluate. - assertThat(rulesFetched.size()) - .isEqualTo(INDEXING_BLOCK_SIZE * 2 + unindexedRuleCount); - assertThat(rulesFetched) - .containsAtLeast( - getPackageNameIndexedRule(installedPackageName), - getAppCertificateIndexedRule(installedAppCertificate)); - } - - private Rule getPackageNameIndexedRule(String packageName) { - return new Rule( - new StringAtomicFormula( - AtomicFormula.PACKAGE_NAME, packageName, /* isHashedValue= */false), - Rule.DENY); - } - - private Rule getAppCertificateIndexedRule(String appCertificate) { - return new Rule( - new StringAtomicFormula( - AtomicFormula.APP_CERTIFICATE, - appCertificate, /* isHashedValue= */ false), - Rule.DENY); - } - - private Rule getInstallerCertificateRule(String installerCert) { - return new Rule( - new StringAtomicFormula( - AtomicFormula.INSTALLER_NAME, installerCert, /* isHashedValue= */false), - Rule.DENY); - } - - @Test - public void testStagingDirectoryCleared() throws Exception { - // We must push rules two times to ensure that staging directory is empty because we cleared - // it, rather than because original rules directory is empty. - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, Collections.EMPTY_LIST); - mIntegrityFileManager.writeRules(VERSION, RULE_PROVIDER, Collections.EMPTY_LIST); - - assertStagingDirectoryCleared(); - } - - private void assertStagingDirectoryCleared() { - File stagingDir = new File(mTmpDir, "integrity_staging"); - assertThat(stagingDir.exists()).isTrue(); - assertThat(stagingDir.isDirectory()).isTrue(); - assertThat(stagingDir.listFiles()).isEmpty(); - } -} -- GitLab From abde7fe5dfb7504419d6d2244cdc1e9f55347d87 Mon Sep 17 00:00:00 2001 From: Felix Stern Date: Mon, 21 Oct 2024 13:28:11 +0000 Subject: [PATCH 294/459] IMM#hideSoftInputFromWindow: Post on handler thread if needed Also, adding some more ImeTracker phases for better draggability in case of cancelling a request, because of missing the servedView, view's handler, or reposting to our thread. Test: atest android.autofillservice.cts.dialog.LoginActivityTest#testShowFillDialog_onlyShowOnce Fix: 374215831 Flag: android.view.inputmethod.refactor_insets_controller Change-Id: I02e833561b89311a3fe3606e14fe6283efe5cb48 --- .../android/view/inputmethod/ImeTracker.java | 6 ++++++ .../view/inputmethod/InputMethodManager.java | 21 ++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/core/java/android/view/inputmethod/ImeTracker.java b/core/java/android/view/inputmethod/ImeTracker.java index d90455ab971d..2ca62a0725df 100644 --- a/core/java/android/view/inputmethod/ImeTracker.java +++ b/core/java/android/view/inputmethod/ImeTracker.java @@ -220,6 +220,7 @@ public interface ImeTracker { PHASE_WM_POSTING_CHANGED_IME_VISIBILITY, PHASE_WM_INVOKING_IME_REQUESTED_LISTENER, PHASE_CLIENT_ALREADY_HIDDEN, + PHASE_CLIENT_VIEW_HANDLER_AVAILABLE, }) @Retention(RetentionPolicy.SOURCE) @interface Phase {} @@ -424,6 +425,11 @@ public interface ImeTracker { ImeProtoEnums.PHASE_WM_INVOKING_IME_REQUESTED_LISTENER; /** IME is requested to be hidden, but already hidden. Don't hide to avoid another animation. */ int PHASE_CLIENT_ALREADY_HIDDEN = ImeProtoEnums.PHASE_CLIENT_ALREADY_HIDDEN; + /** + * The view's handler is needed to check if we're running on a different thread. We can't + * continue without. + */ + int PHASE_CLIENT_VIEW_HANDLER_AVAILABLE = ImeProtoEnums.PHASE_CLIENT_VIEW_HANDLER_AVAILABLE; /** * Called when an IME request is started. diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 47fc43735c4d..9001251914d6 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -2591,6 +2591,17 @@ public final class InputMethodManager { // TODO(b/322992891) handle case of HIDE_IMPLICIT_ONLY final var viewRootImpl = servedView.getViewRootImpl(); if (viewRootImpl != null) { + Handler vh = servedView.getHandler(); + if (vh == null) { + // If the view doesn't have a handler, something has changed out from + // under us. The current input has been closed before (from checkFocus). + ImeTracker.forLogging().onFailed(statsToken, + ImeTracker.PHASE_CLIENT_VIEW_HANDLER_AVAILABLE); + return false; + } + ImeTracker.forLogging().onProgress(statsToken, + ImeTracker.PHASE_CLIENT_VIEW_HANDLER_AVAILABLE); + if (resultReceiver != null) { final boolean imeReqVisible = (viewRootImpl.getInsetsController().getRequestedVisibleTypes() @@ -2599,7 +2610,15 @@ public final class InputMethodManager { !imeReqVisible ? InputMethodManager.RESULT_UNCHANGED_HIDDEN : InputMethodManager.RESULT_HIDDEN, null); } - viewRootImpl.getInsetsController().hide(WindowInsets.Type.ime()); + if (vh.getLooper() != Looper.myLooper()) { + // The view is running on a different thread than our own, so + // we need to reschedule our work for over there. + if (DEBUG) Log.v(TAG, "Hiding soft input: reschedule to view thread"); + vh.post(() -> viewRootImpl.getInsetsController().hide( + WindowInsets.Type.ime())); + } else { + viewRootImpl.getInsetsController().hide(WindowInsets.Type.ime()); + } } return true; } else { -- GitLab From 2c0d3a729f920b9b4b64020c547e99e783ed4ded Mon Sep 17 00:00:00 2001 From: Seigo Nonaka Date: Tue, 22 Oct 2024 13:25:42 +0900 Subject: [PATCH 295/459] Update fontchain_lint to work with multiple emoji fonts This change include following fix for fontlint_chaing: - Validate font_fallback.xml instead of fonts.xml. The fonts.xml is deprecated and font_fallback.xml is the latest font config file. - Remove PostScript name validation. This is now validated in the CTS. So no need to validate it in fontchain_lint - Skip the coverage check if the Unicode version is ahead of the given font version. Bug: 358182138 Test: lunch aosp_husky-trunk_staging-eng && m fontchain_lint Test: lunch aosp_husky-trunk-eng && m fontchain_lint Flag: None build config change Change-Id: I8ab5ffb586855d6677a820af89b2d56f910c70e1 --- tools/fonts/fontchain_linter.py | 162 +++++++++++++++++++++----------- 1 file changed, 105 insertions(+), 57 deletions(-) diff --git a/tools/fonts/fontchain_linter.py b/tools/fonts/fontchain_linter.py index 006a02908643..3bde92909cd5 100755 --- a/tools/fonts/fontchain_linter.py +++ b/tools/fonts/fontchain_linter.py @@ -10,6 +10,14 @@ from xml.etree import ElementTree from fontTools import ttLib +# TODO(nona): Remove hard coded font version and unicode versions. +# Figure out a way of giving this information with command lines. +EMOJI_FONT_TO_UNICODE_MAP = { + '2.034': 15.0, + '2.042': 15.1, + '2.047': 16.0, +} + EMOJI_VS = 0xFE0F LANG_TO_SCRIPT = { @@ -217,9 +225,8 @@ def check_hyphens(hyphens_dir): class FontRecord(object): - def __init__(self, name, psName, scripts, variant, weight, style, fallback_for, font): + def __init__(self, name, scripts, variant, weight, style, fallback_for, font): self.name = name - self.psName = psName self.scripts = scripts self.variant = variant self.weight = weight @@ -282,13 +289,23 @@ def parse_fonts_xml(fonts_xml_path): m = trim_re.match(font_file) font_file = m.group(1) - weight = int(child.get('weight')) - assert weight % 100 == 0, ( - 'Font weight "%d" is not a multiple of 100.' % weight) - - style = child.get('style') - assert style in {'normal', 'italic'}, ( - 'Unknown style "%s"' % style) + # In case of variable font and it supports `wght` axis, the weight attribute can be + # dropped which is automatically adjusted at runtime. + if 'weight' in child: + weight = int(child.get('weight')) + assert weight % 100 == 0, ( + 'Font weight "%d" is not a multiple of 100.' % weight) + else: + weight = None + + # In case of variable font and it supports `ital` or `slnt` axes, the style attribute + # can be dropped which is automatically adjusted at runtime. + if 'style' in child: + style = child.get('style') + assert style in {'normal', 'italic'}, ( + 'Unknown style "%s"' % style) + else: + style = None fallback_for = child.get('fallbackFor') @@ -306,7 +323,6 @@ def parse_fonts_xml(fonts_xml_path): record = FontRecord( name, - child.get('postScriptName'), frozenset(scripts), variant, weight, @@ -357,6 +373,11 @@ def is_regional_indicator(x): # regional indicator A..Z return 0x1F1E6 <= x <= 0x1F1FF +def is_flag_sequence(seq): + if type(seq) == int: + return False + len(seq) == 2 and is_regional_indicator(seq[0]) and is_regional_indicator(seq[1]) + def is_tag(x): # tag block return 0xE0000 <= x <= 0xE007F @@ -391,17 +412,43 @@ def check_emoji_not_compat(all_emoji, equivalent_emoji): if "meta" in ttf: assert 'Emji' not in ttf["meta"].data, 'NotoColorEmoji MUST be a compat font' +def is_flag_emoji(font): + return 0x1F1E6 in get_best_cmap(font) + +def emoji_font_version_to_unicode_version(font_version): + version_str = '%.3f' % font_version + assert version_str in EMOJI_FONT_TO_UNICODE_MAP, 'Unknown emoji font verion: %s' % version_str + return EMOJI_FONT_TO_UNICODE_MAP[version_str] + def check_emoji_font_coverage(emoji_fonts, all_emoji, equivalent_emoji): coverages = [] + emoji_font_version = 0 + emoji_flag_font_version = 0 for emoji_font in emoji_fonts: coverages.append(get_emoji_map(emoji_font)) + # Find the largest version of the installed emoji font. + version = open_font(emoji_font)['head'].fontRevision + if is_flag_emoji(emoji_font): + emoji_flag_font_version = max(emoji_flag_font_version, version) + else: + emoji_font_version = max(emoji_font_version, version) + + emoji_flag_unicode_version = emoji_font_version_to_unicode_version(emoji_flag_font_version) + emoji_unicode_version = emoji_font_version_to_unicode_version(emoji_font_version) + errors = [] for sequence in all_emoji: if all([sequence not in coverage for coverage in coverages]): - errors.append('%s is not supported in the emoji font.' % printable(sequence)) + sequence_version = float(_age_by_chars[sequence]) + if is_flag_sequence(sequence): + if sequence_version <= emoji_flag_unicode_version: + errors.append('%s is not supported in the emoji font.' % printable(sequence)) + else: + if sequence_version <= emoji_unicode_version: + errors.append('%s is not supported in the emoji font.' % printable(sequence)) for coverage in coverages: for sequence in coverage: @@ -480,6 +527,19 @@ def check_emoji_defaults(default_emoji): repr(missing_text_chars)) +def parse_unicode_seq(chars): + if ' ' in chars: # character sequence + sequence = [int(ch, 16) for ch in chars.split(' ')] + additions = [tuple(sequence)] + elif '..' in chars: # character range + char_start, char_end = chars.split('..') + char_start = int(char_start, 16) + char_end = int(char_end, 16) + additions = range(char_start, char_end+1) + else: # single character + additions = [int(chars, 16)] + return additions + # Setting reverse to true returns a dictionary that maps the values to sets of # characters, useful for some binary properties. Otherwise, we get a # dictionary that maps characters to the property values, assuming there's only @@ -501,16 +561,8 @@ def parse_unicode_datafile(file_path, reverse=False): chars = chars.strip() prop = prop.strip() - if ' ' in chars: # character sequence - sequence = [int(ch, 16) for ch in chars.split(' ')] - additions = [tuple(sequence)] - elif '..' in chars: # character range - char_start, char_end = chars.split('..') - char_start = int(char_start, 16) - char_end = int(char_end, 16) - additions = range(char_start, char_end+1) - else: # singe character - additions = [int(chars, 16)] + additions = parse_unicode_seq(chars) + if reverse: output_dict[prop].update(additions) else: @@ -519,6 +571,32 @@ def parse_unicode_datafile(file_path, reverse=False): output_dict[addition] = prop return output_dict +def parse_sequence_age(file_path): + VERSION_RE = re.compile(r'E([\d\.]+)') + output_dict = {} + with open(file_path) as datafile: + for line in datafile: + comment = '' + if '#' in line: + hash_pos = line.index('#') + comment = line[hash_pos + 1:].strip() + line = line[:hash_pos] + line = line.strip() + if not line: + continue + + chars = line[:line.index(';')].strip() + + m = VERSION_RE.match(comment) + assert m, 'Version not found: unknown format: %s' % line + version = m.group(1) + + additions = parse_unicode_seq(chars) + + for addition in additions: + assert addition not in output_dict + output_dict[addition] = version + return output_dict def parse_emoji_variants(file_path): emoji_set = set() @@ -543,7 +621,7 @@ def parse_emoji_variants(file_path): def parse_ucd(ucd_path): - global _emoji_properties, _chars_by_age + global _emoji_properties, _chars_by_age, _age_by_chars global _text_variation_sequences, _emoji_variation_sequences global _emoji_sequences, _emoji_zwj_sequences _emoji_properties = parse_unicode_datafile( @@ -555,6 +633,10 @@ def parse_ucd(ucd_path): _chars_by_age = parse_unicode_datafile( path.join(ucd_path, 'DerivedAge.txt'), reverse=True) + _age_by_chars = parse_unicode_datafile( + path.join(ucd_path, 'DerivedAge.txt')) + _age_by_chars.update(parse_sequence_age( + path.join(ucd_path, 'emoji-sequences.txt'))) sequences = parse_emoji_variants( path.join(ucd_path, 'emoji-variation-sequences.txt')) _text_variation_sequences, _emoji_variation_sequences = sequences @@ -743,44 +825,12 @@ def check_cjk_punctuation(): break assert_font_supports_none_of_chars(record.font, cjk_punctuation, name) -def getPostScriptName(font): - font_file, index = font - font_path = path.join(_fonts_dir, font_file) - if index is not None: - # Use the first font file in the collection for resolving post script name. - ttf = ttLib.TTFont(font_path, fontNumber=0) - else: - ttf = ttLib.TTFont(font_path) - - nameTable = ttf['name'] - for name in nameTable.names: - if (name.nameID == 6 and name.platformID == 3 and name.platEncID == 1 - and name.langID == 0x0409): - return str(name) - -def check_canonical_name(): - for record in _all_fonts: - file_name, index = record.font - - psName = getPostScriptName(record.font) - if record.psName: - # If fonts element has postScriptName attribute, it should match with the PostScript - # name in the name table. - assert psName == record.psName, ('postScriptName attribute %s should match with %s' % ( - record.psName, psName)) - else: - # If fonts element doesn't have postScriptName attribute, the file name should match - # with the PostScript name in the name table. - assert psName == file_name[:-4], ('file name %s should match with %s' % ( - file_name, psName)) - - def main(): global _fonts_dir target_out = sys.argv[1] _fonts_dir = path.join(target_out, 'fonts') - fonts_xml_path = path.join(target_out, 'etc', 'fonts.xml') + fonts_xml_path = path.join(target_out, 'etc', 'font_fallback.xml') parse_fonts_xml(fonts_xml_path) @@ -793,8 +843,6 @@ def main(): check_cjk_punctuation() - check_canonical_name() - check_emoji = sys.argv[2] if check_emoji == 'true': ucd_path = sys.argv[3] -- GitLab From accca6bad4ca4eeb56094eab233e6bb96cc0f496 Mon Sep 17 00:00:00 2001 From: Shivangi Dubey Date: Tue, 1 Oct 2024 17:46:43 +0000 Subject: [PATCH 296/459] Add SystemProperty to override education prerequisite conditions Having SystemProperty will help us override pre-conditions using adb command. This will facilitate testing of education during PTE testing and Bugbashes. Test: atest AppHandleEducationControllerTest Test: atest AppHandleEducationFilterTest Fixes: 370772025 Flag: com.android.window.flags.enable_desktop_windowing_app_handle_education Change-Id: Ic4b246af6daa19ab36cf83ee0f793d8c5a6e49b9 --- .../education/AppHandleEducationController.kt | 12 ++++++- .../education/AppHandleEducationFilter.kt | 11 ++++++- .../AppHandleEducationControllerTest.kt | 32 ++++++++++++++++-- .../education/AppHandleEducationFilterTest.kt | 33 +++++++++++++++++-- 4 files changed, 82 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt index 334dc5aca19d..f21a124f0b8b 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationController.kt @@ -325,10 +325,15 @@ class AppHandleEducationController( /** * Listens to the changes to [WindowingEducationProto#hasEducationViewedTimestampMillis()] in * datastore proto object. + * + * If [SHOULD_OVERRIDE_EDUCATION_CONDITIONS] is true, this flow will always emit false. That means + * it will emit education has not been viewed yet always. */ private fun isEducationViewedFlow(): Flow = appHandleEducationDatastoreRepository.dataStoreFlow - .map { preferences -> preferences.hasEducationViewedTimestampMillis() } + .map { preferences -> + preferences.hasEducationViewedTimestampMillis() && !SHOULD_OVERRIDE_EDUCATION_CONDITIONS + } .distinctUntilChanged() /** @@ -352,5 +357,10 @@ class AppHandleEducationController( val APP_HANDLE_EDUCATION_TIMEOUT_MILLIS: Long get() = SystemProperties.getLong("persist.windowing_app_handle_education_timeout", 400L) + + val SHOULD_OVERRIDE_EDUCATION_CONDITIONS: Boolean + get() = + SystemProperties.getBoolean( + "persist.desktop_windowing_app_handle_education_override_conditions", false) } } diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt index 15f4c249cf22..144370d76060 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilter.kt @@ -23,10 +23,12 @@ import android.os.SystemClock import android.provider.Settings.Secure import com.android.wm.shell.R import com.android.wm.shell.desktopmode.CaptionState +import com.android.wm.shell.desktopmode.education.AppHandleEducationController.Companion.SHOULD_OVERRIDE_EDUCATION_CONDITIONS import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository import com.android.wm.shell.desktopmode.education.data.WindowingEducationProto import java.time.Duration +@kotlinx.coroutines.ExperimentalCoroutinesApi /** Filters incoming app handle education triggers based on set conditions. */ class AppHandleEducationFilter( private val context: Context, @@ -35,9 +37,16 @@ class AppHandleEducationFilter( private val usageStatsManager = context.getSystemService(Context.USAGE_STATS_SERVICE) as UsageStatsManager - /** Returns true if conditions to show app handle education are met, returns false otherwise. */ + /** + * Returns true if conditions to show app handle education are met, returns false otherwise. + * + * If [SHOULD_OVERRIDE_EDUCATION_CONDITIONS] is true, this method will always return + * ![captionState.isHandleMenuExpanded]. + */ suspend fun shouldShowAppHandleEducation(captionState: CaptionState): Boolean { if ((captionState as CaptionState.AppHandle).isHandleMenuExpanded) return false + if (SHOULD_OVERRIDE_EDUCATION_CONDITIONS) return true + val focusAppPackageName = captionState.runningTaskInfo.topActivityInfo?.packageName ?: return false val windowingEducationProto = appHandleEducationDatastoreRepository.windowingEducationProto() diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt index 1e105d9588ab..7dbadc9d9083 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationControllerTest.kt @@ -16,6 +16,7 @@ package com.android.wm.shell.desktopmode.education +import android.os.SystemProperties import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.platform.test.flag.junit.SetFlagsRule @@ -50,6 +51,7 @@ import org.junit.Ignore import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.Mock import org.mockito.MockitoAnnotations import org.mockito.kotlin.any @@ -70,7 +72,10 @@ class AppHandleEducationControllerTest : ShellTestCase() { @JvmField @Rule val extendedMockitoRule = - ExtendedMockitoRule.Builder(this).mockStatic(DesktopModeStatus::class.java).build()!! + ExtendedMockitoRule.Builder(this) + .mockStatic(DesktopModeStatus::class.java) + .mockStatic(SystemProperties::class.java) + .build()!! @JvmField @Rule val setFlagsRule = SetFlagsRule() private lateinit var educationController: AppHandleEducationController @@ -187,6 +192,29 @@ class AppHandleEducationControllerTest : ShellTestCase() { verify(mockTooltipController, never()).showEducationTooltip(any(), any()) } + @Test + @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION) + fun overridePrerequisite_educationViewedAlready_shouldCallShowEducationTooltip() = + testScope.runTest { + // App handle is visible but education has been viewed before. But as we are overriding + // prerequisite conditions, we should show education tooltip. + // Mark education viewed. + testDataStoreFlow.value = + createWindowingEducationProto(educationViewedTimestampMillis = 123L) + val systemPropertiesKey = + "persist.desktop_windowing_app_handle_education_override_conditions" + whenever(SystemProperties.getBoolean(eq(systemPropertiesKey), anyBoolean())) + .thenReturn(true) + setShouldShowAppHandleEducation(true) + + // Simulate app handle visible. + testCaptionStateFlow.value = createAppHandleState(isHandleMenuExpanded = false) + // Wait for first tooltip to showup. + waitForBufferDelay() + + verify(mockTooltipController, times(1)).showEducationTooltip(any(), any()) + } + @Test @EnableFlags(Flags.FLAG_ENABLE_DESKTOP_WINDOWING_APP_HANDLE_EDUCATION) fun init_appHandleExpanded_shouldMarkFeatureViewed() = @@ -454,7 +482,7 @@ class AppHandleEducationControllerTest : ShellTestCase() { .thenReturn(shouldShowAppHandleEducation) /** - * Class under test waits for some seconds before showing education, simulate advance time before + * Class under test waits for some time before showing education, simulate advance time before * verifying or moving forward */ private fun TestScope.waitForBufferDelay() { diff --git a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt index ac994248c962..a3e74e8aed5d 100644 --- a/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt +++ b/libs/WindowManager/Shell/tests/unittest/src/com/android/wm/shell/desktopmode/education/AppHandleEducationFilterTest.kt @@ -19,10 +19,12 @@ package com.android.wm.shell.desktopmode.education import android.app.usage.UsageStats import android.app.usage.UsageStatsManager import android.content.Context +import android.os.SystemProperties import android.testing.AndroidTestingRunner import android.testing.TestableContext import android.testing.TestableResources import androidx.test.filters.SmallTest +import com.android.modules.utils.testing.ExtendedMockitoRule import com.android.wm.shell.R import com.android.wm.shell.ShellTestCase import com.android.wm.shell.desktopmode.education.data.AppHandleEducationDatastoreRepository @@ -35,18 +37,26 @@ import com.google.common.truth.Truth.assertThat import kotlin.Int.Companion.MAX_VALUE import kotlinx.coroutines.test.runTest import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyLong import org.mockito.Mock import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations +import org.mockito.kotlin.eq +import org.mockito.kotlin.whenever -/** Tests of [AppHandleEducationFilter] - * Usage: atest AppHandleEducationFilterTest */ +/** Tests of [AppHandleEducationFilter] Usage: atest AppHandleEducationFilterTest */ @SmallTest @RunWith(AndroidTestingRunner::class) +@kotlinx.coroutines.ExperimentalCoroutinesApi class AppHandleEducationFilterTest : ShellTestCase() { + @JvmField + @Rule + val extendedMockitoRule = + ExtendedMockitoRule.Builder(this).mockStatic(SystemProperties::class.java).build()!! @Mock private lateinit var datastoreRepository: AppHandleEducationDatastoreRepository @Mock private lateinit var mockUsageStatsManager: UsageStatsManager private lateinit var educationFilter: AppHandleEducationFilter @@ -209,4 +219,23 @@ class AppHandleEducationFilterTest : ShellTestCase() { // We should not show app handle education if app menu is expanded assertThat(result).isFalse() } + + @Test + fun shouldShowAppHandleEducation_overridePrerequisite_returnsTrue() = runTest { + // Simulate that gmail app has been launched twice before, minimum app launch count is 3, hence + // #shouldShowAppHandleEducation should return false. But as we are overriding prerequisite + // conditions, #shouldShowAppHandleEducation should return true. + testableResources.addOverride(R.integer.desktop_windowing_education_min_app_launch_count, 3) + val systemPropertiesKey = "persist.desktop_windowing_app_handle_education_override_conditions" + whenever(SystemProperties.getBoolean(eq(systemPropertiesKey), anyBoolean())).thenReturn(true) + val windowingEducationProto = + createWindowingEducationProto( + appUsageStats = mapOf(GMAIL_PACKAGE_NAME to 2), + appUsageStatsLastUpdateTimestampMillis = Long.MAX_VALUE) + `when`(datastoreRepository.windowingEducationProto()).thenReturn(windowingEducationProto) + + val result = educationFilter.shouldShowAppHandleEducation(createAppHandleState()) + + assertThat(result).isTrue() + } } -- GitLab From f33db37dd9f7496738f329d6538813f388ea182f Mon Sep 17 00:00:00 2001 From: Julia Reynolds Date: Tue, 22 Oct 2024 17:22:28 -0400 Subject: [PATCH 297/459] Clean up created data when flag rolled back Test: PreferencesHelperTest Bug: 375032330 Flag: EXEMPT intentionally unflagged Change-Id: I54f37b0558c0de8217a017d9fa2535ddd5be7589 --- .../notification/PreferencesHelper.java | 4 ++++ .../notification/PreferencesHelperTest.java | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/services/core/java/com/android/server/notification/PreferencesHelper.java b/services/core/java/com/android/server/notification/PreferencesHelper.java index c9edc4106943..964a5d002bf2 100644 --- a/services/core/java/com/android/server/notification/PreferencesHelper.java +++ b/services/core/java/com/android/server/notification/PreferencesHelper.java @@ -440,6 +440,10 @@ public class PreferencesHelper implements RankingConfig { PackagePreferences r) { try { String id = parser.getAttributeValue(null, ATT_ID); + if (!notificationClassification() && SYSTEM_RESERVED_IDS.contains(id)) { + // delete bundle channels if flag is rolled back + return; + } String channelName = parser.getAttributeValue(null, ATT_NAME); int channelImportance = parser.getAttributeInt( null, ATT_IMPORTANCE, DEFAULT_IMPORTANCE); 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 b92bdb5f3e6e..36fa1b82fe69 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/PreferencesHelperTest.java @@ -6390,6 +6390,30 @@ public class PreferencesHelperTest extends UiServiceTestCase { .isEqualTo(IMPORTANCE_LOW); } + @Test + @DisableFlags(FLAG_NOTIFICATION_CLASSIFICATION) + public void testNotificationBundles_off_deletesData() throws Exception { + String xml = "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n"; + + loadByteArrayXml(xml.getBytes(), false, USER_SYSTEM); + + // verify 4 reserved channels are created + assertThat(mXmlHelper.getNotificationChannel(PKG_P, UID_P, NEWS_ID, true)).isNull(); + assertThat(mXmlHelper.getNotificationChannel(PKG_P, UID_P, PROMOTIONS_ID, true)).isNull(); + assertThat(mXmlHelper.getNotificationChannel(PKG_P, UID_P, SOCIAL_MEDIA_ID, true)).isNull(); + assertThat(mXmlHelper.getNotificationChannel(PKG_P, UID_P, RECS_ID, true)).isNull(); + assertThat(mXmlHelper.getNotificationChannel(PKG_P, UID_P, "keep.me", false) + .getImportance()).isEqualTo(IMPORTANCE_LOW); + } + @Test @EnableFlags(FLAG_NOTIFICATION_CLASSIFICATION) public void testNotificationBundles_appsCannotUpdate() { -- GitLab From db82c35b0061e3d89edc749f9b76ff55fda521bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mat=C3=ADas=20Hern=C3=A1ndez?= Date: Wed, 23 Oct 2024 15:49:25 +0200 Subject: [PATCH 298/459] EventConditionProvider: Ensure that reloadTrackers precedes evaluateSubscriptions A previous (luckily, flagged) change to this class delayed the first call to reloadTrackers() to onUserSwitched(). This works well on HSUM devices; however on devices where user 0 is also a proper user and has event-based Zen Rules, we would try to do the first evaluation when onSubscribe() is called, before creating the trackers, which would eventually NPE. Therefore we change the approach slightly: * We restore the call to reloadTrackers() for the system user. This is pointless on HSUM (but also harmless, because user 0 will have no event rules). * We only reload trackers on user switch when actually switching to a different user. This prevents wasting work during boot on non-HSUM devices. * Although it should no longer be triggered, we early-exit when no trackers produced a result from the evaluation. Fixes: 374683409 Test: atest EventConditionProviderTest + manual on non-HSUM and HSUM devices Flag: android.app.modes_hsum Change-Id: I543bdec20ec2858c2cbe7c7a6bc4e7f19a728ab0 --- .../notification/EventConditionProvider.java | 37 +++++++++++++------ .../EventConditionProviderTest.java | 24 +++++++++++- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/notification/EventConditionProvider.java b/services/core/java/com/android/server/notification/EventConditionProvider.java index ecc4cf72a1c3..308f299a117b 100644 --- a/services/core/java/com/android/server/notification/EventConditionProvider.java +++ b/services/core/java/com/android/server/notification/EventConditionProvider.java @@ -16,7 +16,6 @@ package com.android.server.notification; -import android.annotation.Nullable; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -68,7 +67,7 @@ public class EventConditionProvider extends SystemConditionProviderService { private final Handler mWorker; private final HandlerThread mThread; - @Nullable private UserHandle mCurrentUser; + private UserHandle mCurrentUser = UserHandle.SYSTEM; private boolean mConnected; private boolean mRegistered; private boolean mBootComplete; // don't hammer the calendar provider until boot completes. @@ -119,18 +118,19 @@ public class EventConditionProvider extends SystemConditionProviderService { @Override public void onReceive(Context context, Intent intent) { if (android.app.Flags.modesHsum()) { - if (mCurrentUser != null) { - // Possibly the intent signals a profile added on a different user, but it - // doesn't matter (except for a bit of wasted work here). We will reload - // trackers for that user when we switch. - reloadTrackers(mCurrentUser); - } + // Possibly the intent signals a profile added on a different user, but it + // doesn't matter (except for a bit of wasted work here). We will reload + // trackers for that user when we switch. + reloadTrackers(mCurrentUser); } else { reloadTrackers(); } } }, filter); - if (!android.app.Flags.modesHsum()) { + + if (android.app.Flags.modesHsum()) { + reloadTrackers(UserHandle.SYSTEM); + } else { reloadTrackers(); } } @@ -138,8 +138,10 @@ public class EventConditionProvider extends SystemConditionProviderService { @Override public void onUserSwitched(UserHandle user) { if (DEBUG) Slog.d(TAG, "onUserSwitched: " + user); - mCurrentUser = user; - reloadTrackers(user); + if (mCurrentUser.getIdentifier() != user.getIdentifier()) { + mCurrentUser = user; + reloadTrackers(user); + } } @Override @@ -274,12 +276,23 @@ public class EventConditionProvider extends SystemConditionProviderService { final int userId = EventInfo.resolveUserId(event.userId); final CalendarTracker tracker = mTrackers.get(userId); if (tracker == null) { - Slog.w(TAG, "No calendar tracker found for user " + userId); + Slog.w(TAG, + "No calendar tracker found for user " + userId + " and calendar = " + + event.calName); conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE)); continue; } result = tracker.checkEvent(event, now); } + + if (result == null) { + Slog.e(TAG, "No CheckEventResult for userId=" + event.userId + ", calId=" + + event.calendarId + ", calName=" + event.calName + + "; trackers count is " + mTrackers.size()); + conditionsToNotify.add(createCondition(conditionId, Condition.STATE_FALSE)); + continue; + } + if (result.recheckAt != 0 && (reevaluateAt == 0 || result.recheckAt < reevaluateAt)) { reevaluateAt = result.recheckAt; diff --git a/services/tests/uiservicestests/src/com/android/server/notification/EventConditionProviderTest.java b/services/tests/uiservicestests/src/com/android/server/notification/EventConditionProviderTest.java index 05210aca19dd..fa1372d9f4ef 100644 --- a/services/tests/uiservicestests/src/com/android/server/notification/EventConditionProviderTest.java +++ b/services/tests/uiservicestests/src/com/android/server/notification/EventConditionProviderTest.java @@ -124,9 +124,12 @@ public class EventConditionProviderTest extends UiServiceTestCase { @Test @EnableFlags(android.app.Flags.FLAG_MODES_HSUM) - public void onBootComplete_waitsForUserSwitched() { + public void onBootComplete_loadsTrackersForSystemUser() { mService.onBootComplete(); - assertThat(mService.getTrackers().size()).isEqualTo(0); + + assertThat(mService.getTrackers().size()).isEqualTo(1); + assertThat(mService.getTrackers().keyAt(0)).isEqualTo(UserHandle.USER_SYSTEM); + assertThat(mService.getTrackers().valueAt(0).getUserId()).isEqualTo(UserHandle.USER_SYSTEM); } @Test @@ -158,4 +161,21 @@ public class EventConditionProviderTest extends UiServiceTestCase { assertThat(mService.getTrackers().keyAt(1)).isEqualTo(43); assertThat(mService.getTrackers().valueAt(1).getUserId()).isEqualTo(43); } + + @Test + @EnableFlags(android.app.Flags.FLAG_MODES_HSUM) + public void onUserSwitched_sameUser_doesNothing() { + UserHandle someUser = UserHandle.of(42); + when(mUserManager.getProfiles(eq(42))).thenReturn(List.of(new UserInfo(42, "user 42", 0))); + + mService.onUserSwitched(someUser); + assertThat(mService.getTrackers().size()).isEqualTo(1); + assertThat(mService.getTrackers().keyAt(0)).isEqualTo(42); + CalendarTracker originalTracker = mService.getTrackers().valueAt(0); + + mService.onUserSwitched(someUser); + assertThat(mService.getTrackers().size()).isEqualTo(1); + assertThat(mService.getTrackers().keyAt(0)).isEqualTo(42); + assertThat(mService.getTrackers().valueAt(0)).isSameInstanceAs(originalTracker); + } } -- GitLab From 0bbf1b1c6ff7fb18554dc67334029adf32a95966 Mon Sep 17 00:00:00 2001 From: pajacechen Date: Wed, 23 Oct 2024 19:13:36 +0800 Subject: [PATCH 299/459] Fix pending intent for multi-user issue Fix: 375114850 Flag: EXEMPT bug fix Test: Manual Test Change-Id: I2aaa4bf81bbcf02dfeb664e70354f6cfc48cc3cd --- .../server/power/batterysaver/BatterySaverStateMachine.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java index 68760aae8d9d..4d63fdf45704 100644 --- a/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java +++ b/services/core/java/com/android/server/power/batterysaver/BatterySaverStateMachine.java @@ -959,9 +959,10 @@ public class BatterySaverStateMachine { .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK) .putExtra(EXTRA_SHOW_FRAGMENT_TITLE, highlightBundle); - PendingIntent batterySaverIntent = PendingIntent.getActivity( + PendingIntent batterySaverIntent = PendingIntent.getActivityAsUser( mContext, 0 /* requestCode */, intent, - PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); + PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT, + null /* options */, UserHandle.CURRENT); final String title = res.getString(titleId); final String summary = res.getString(summaryId); -- GitLab From db5e8570e7a126be284b364d1f6267d1c9b8ce68 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Wed, 23 Oct 2024 15:15:37 +0100 Subject: [PATCH 300/459] Adding live progress tracking for touchpad home and recent gestures Modifying lottie animations so they contain markers and change when animations is cut. Passing those markers in GestureUiState. Back gesture tracking will be done in follow-up CL as it's more complicated - it needs to support 2 directions of live tracking. Bug: 369817369 Fixes: 361291970 Fixes: 346576895 Test: manual Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: I5db2082f26bcf920312f4bfc4364ed554febab99 --- packages/SystemUI/res/raw/trackpad_home_edu.json | 2 +- packages/SystemUI/res/raw/trackpad_home_success.json | 2 +- packages/SystemUI/res/raw/trackpad_recent_apps_edu.json | 2 +- packages/SystemUI/res/raw/trackpad_recent_apps_success.json | 2 +- .../tutorial/ui/composable/HomeGestureTutorialScreen.kt | 4 ++-- .../tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/res/raw/trackpad_home_edu.json b/packages/SystemUI/res/raw/trackpad_home_edu.json index 27db9fd752e3..94a138812a6f 100644 --- a/packages/SystemUI/res/raw/trackpad_home_edu.json +++ b/packages/SystemUI/res/raw/trackpad_home_edu.json @@ -1 +1 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":426,"w":554,"h":564,"nm":"Trackpad-JSON_HomeGesture-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Home_Dismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"gesture:scale","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"s":[277,197.321,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.13,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.036,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.921,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.779,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.606,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.39,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.122,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.786,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.354,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.78,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.975,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.883,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.652,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,190.304,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.897,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,187.507,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,186.208,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.036,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.998,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.082,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,182.274,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,181.557,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.918,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.344,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.824,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.353,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.924,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.532,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.174,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.843,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.538,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.256,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.995,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.752,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.527,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.319,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.124,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.943,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.776,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.619,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.474,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.339,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.213,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.095,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.985,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.884,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.789,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.62,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.476,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.353,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.209,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.039,0],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.212,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.896,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.197,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.536,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.4,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.939,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.375,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.791,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.751,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.459,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.006,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.442,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.798,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.092,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.339,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.546,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.721,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.87,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.995,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.191,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.378,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":197,"s":[100]},{"t":203,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,29.984,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.965,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.936,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.894,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.84,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.77,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.682,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.574,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.445,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.294,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.121,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.925,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.746,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.548,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.33,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.092,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.832,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.548,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.239,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.903,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.536,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.14,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.709,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.241,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.73,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.171,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,23.563,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.898,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.171,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,21.373,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,20.496,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,19.524,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,18.451,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,17.263,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,15.943,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,14.475,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,12.841,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,11.018,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,9.023,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,6.87,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,4.614,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,2.333,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0.106,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-1.975,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-3.877,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-5.591,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-7.125,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-8.492,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-9.714,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-10.799,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-11.771,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-12.643,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-13.428,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.138,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.777,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.355,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.879,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.354,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.784,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.177,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.532,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.854,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.146,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.409,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.645,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.858,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.048,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.217,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.366,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.496,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.61,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.707,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.788,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.856,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.911,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.954,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.984,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}]}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"right circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[-41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"left circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"size","bm":0,"hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":198,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":201,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":2}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.321],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.13],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.036],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.921],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.779],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.606],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.39],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.122],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.786],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.354],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.781],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.975],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.883],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.652],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,190.304],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.897],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,187.507],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,186.208],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.036],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.998],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.082],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,182.274],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,181.557],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.918],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.344],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.824],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.353],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.924],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.532],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.174],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.843],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.538],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.256],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.995],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.752],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.528],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.319],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.124],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.943],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.776],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.619],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.474],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.339],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.213],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.095],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.985],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.638],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.587],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.09],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.793],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,201.516],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,207.702],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,212.767],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,217.041],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,220.728],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,223.965],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,226.837],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,229.392],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,231.662],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,233.68],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,235.467],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,237.042],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,238.421],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.622],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.66],"t":214,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.55],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.299],"t":216,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.916],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.407],"t":218,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.572],"t":220,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.29],"t":221,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.866],"t":222,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.351],"t":223,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.782],"t":224,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.175],"t":225,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.597],"t":226,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.08],"t":227,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.638],"t":228,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.281],"t":229,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.017],"t":230,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.165],"t":238,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.365],"t":240,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.555],"t":242,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.785],"t":245,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.579],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.389],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.278],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,234.833],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,221.896],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,215.604],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,211.894],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,209.347],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,207.439],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,205.933],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,204.711],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,203.696],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,202.839],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,202.106],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,201.474],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.925],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.444],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.022],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.649],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.32],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.03],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.776],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.552],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.355],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.183],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.034],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.902],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.787],"t":410,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.62],"t":412,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":195,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":225,"s":[0,82.5,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[0,82.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[0,49.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":200,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":218,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":232,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":252,"s":[0,0,0]}]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Home_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":195,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":225,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}]}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705890417,0.258823543787,0,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Home_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":25,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":450,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Home_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,140,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Home_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,117.5,0]},"a":{"a":0,"k":[252,275,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[300,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[132,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets weather","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets clock","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 7","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":195,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":201,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":231,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Home_Dismiss","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,282,0]},"a":{"a":0,"k":[277,282,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":554,"h":564,"ip":0,"op":426,"st":-25,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":60,"ip":0,"op":426,"w":554,"h":564,"nm":"Trackpad-JSON_HomeGesture-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Home_Dismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"gesture:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[277,197.321,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.13,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.036,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.921,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.779,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.606,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.39,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.122,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.786,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.354,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.78,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.975,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.883,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.652,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,190.304,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.897,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,187.507,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,186.208,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.036,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.998,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.082,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,182.274,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,181.557,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.918,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.344,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.824,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.353,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.924,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.532,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.174,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.843,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.538,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.256,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.995,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.752,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.527,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.319,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.124,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.943,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.776,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.619,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.474,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.339,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.213,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.095,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.985,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.884,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.789,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.62,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.476,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.353,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.209,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.039,0],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.212,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.896,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.197,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.536,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.4,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.939,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.375,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.791,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.751,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.459,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.006,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.442,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.798,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.092,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.339,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.546,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.721,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.87,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.995,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.191,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.378,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":197,"s":[100]},{"t":203,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,29.984,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.965,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.936,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.894,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.84,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.77,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.682,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.574,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.445,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.294,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.121,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.925,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.746,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.548,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.33,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.092,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.832,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.548,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.239,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.903,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.536,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.14,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.709,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.241,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.73,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.171,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,23.563,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.898,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.171,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,21.373,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,20.496,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,19.524,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,18.451,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,17.263,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,15.943,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,14.475,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,12.841,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,11.018,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,9.023,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,6.87,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,4.614,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,2.333,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0.106,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-1.975,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-3.877,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-5.591,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-7.125,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-8.492,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-9.714,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-10.799,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-11.771,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-12.643,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-13.428,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.138,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.777,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.355,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.879,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.354,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.784,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.177,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.532,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.854,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.146,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.409,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.645,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.858,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.048,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.217,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.366,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.496,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.61,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.707,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.788,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.856,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.911,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.954,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.984,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":198,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":201,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.321],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.13],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.036],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.921],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.779],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.606],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.39],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,196.122],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.786],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,195.354],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,194.781],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.975],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,192.883],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,191.652],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,190.304],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,188.897],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,187.507],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,186.208],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.036],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.998],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,183.082],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,182.274],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,181.557],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.918],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,180.344],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.824],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,179.353],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.924],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.532],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.174],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.843],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.538],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,177.256],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.995],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.752],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.528],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.319],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,176.124],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.943],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.776],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.619],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.474],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.339],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.213],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.095],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.985],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.638],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.587],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.09],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.793],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,201.516],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,207.702],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,212.767],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,217.041],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,220.728],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,223.965],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,226.837],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,229.392],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,231.662],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,233.68],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,235.467],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,237.042],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,238.421],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.622],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.66],"t":214,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.55],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.299],"t":216,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.916],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.407],"t":218,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.572],"t":220,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.29],"t":221,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.866],"t":222,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.351],"t":223,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.782],"t":224,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.175],"t":225,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.597],"t":226,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.08],"t":227,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.638],"t":228,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.281],"t":229,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.017],"t":230,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.165],"t":238,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.365],"t":240,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.555],"t":242,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.785],"t":245,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.579],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.389],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.278],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,234.833],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,221.896],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,215.604],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,211.894],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,209.347],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,207.439],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,205.933],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,204.711],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,203.696],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,202.839],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,202.106],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,201.474],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.925],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.444],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,200.022],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.649],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.32],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,199.03],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.776],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.552],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.355],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.183],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,198.034],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.902],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.787],"t":410,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.62],"t":412,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":195,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":225,"s":[0,82.5,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[0,82.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[0,49.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":200,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":218,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":232,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":252,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Home_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":195,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":225,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705890417,0.258823543787,0,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Home_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":25,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":450,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Home_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,140,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Home_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,117.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[300,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 1","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[132,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets weather","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets clock","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":195,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":201,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":231,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Home_Dismiss","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":0,"op":426,"st":-25,"ct":1,"bm":0}],"markers":[{"tm":117,"cm":"drag with gesture","dr":53},{"tm":170,"cm":"release playback realtime","dr":80}],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_home_success.json b/packages/SystemUI/res/raw/trackpad_home_success.json index f14fde5a397e..8d0a339ba032 100644 --- a/packages/SystemUI/res/raw/trackpad_home_success.json +++ b/packages/SystemUI/res/raw/trackpad_home_success.json @@ -1 +1 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":50,"w":554,"h":564,"nm":"Trackpad-JSON_HomeGesture-Success","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadHome_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}]},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[95.049,95.049,100]}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}]},"p":{"a":0,"k":[81,127,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":-0.289},"p":{"a":0,"k":[14.364,-33.591,0]},"a":{"a":0,"k":[-0.125,0,0]},"s":{"a":0,"k":[104.744,104.744,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[95,95,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":88},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Checkbox - Widget","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Home_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82.5,140.5,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadHome_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,198.5,0]},"a":{"a":0,"k":[95,95,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":190,"h":190,"ip":6,"op":50,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Home_LofiApp","tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":49,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":60,"ip":0,"op":91,"w":554,"h":564,"nm":"Trackpad-JSON_HomeGesture-Success","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadHome_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[95.049,95.049,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}],"ix":10},"p":{"a":0,"k":[81,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.289,"ix":10},"p":{"a":0,"k":[14.364,-33.591,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.125,0,0],"ix":1,"l":2},"s":{"a":0,"k":[104.744,104.744,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":11,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,95,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":88,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Checkbox - Widget","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Home_Dismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"gesture:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[277,174.884,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.789,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.62,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.476,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.353,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.209,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,174.039,0],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":197,"s":[100]},{"t":203,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-19.366,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.496,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.61,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.707,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.788,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.856,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.911,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.954,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.984,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":195,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":205,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":195,"s":[28,28]},{"t":205,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":198,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":201,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":2,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,174.985],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,175.638],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,178.587],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,185.09],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,193.793],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,201.516],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,207.702],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,212.767],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,217.041],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,220.728],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,223.965],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,226.837],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,229.392],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,231.662],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,233.68],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,235.467],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,237.042],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,238.421],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.622],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.66],"t":214,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.55],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.299],"t":216,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.916],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.407],"t":218,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.572],"t":220,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,243.29],"t":221,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.866],"t":222,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,242.351],"t":223,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.782],"t":224,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,241.175],"t":225,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.597],"t":226,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,240.08],"t":227,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.638],"t":228,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.281],"t":229,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.017],"t":230,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.165],"t":238,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.365],"t":240,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.555],"t":242,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,239.785],"t":245,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":2,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":195,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":225,"s":[0,82.5,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[0,82.5,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[0,49.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":200,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":218,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":232,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":252,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":195,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":225,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":195,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":225,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Home_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":195,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":225,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705890417,0.258823543787,0,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":0,"nm":"Home_LofiLauncher","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":285,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Home_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,140,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Home_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,117.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[300,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 1","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[132,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets weather","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets clock","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":195,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":204,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":195,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":201,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":231,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onPrimaryFixedVariant","cl":"onPrimaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.364705882353,0.258823529412,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadHome_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,198.5,0],"ix":2,"l":2},"a":{"a":0,"k":[95,95,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":190,"h":190,"ip":47,"op":91,"st":47,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onPrimaryFixed","cl":"onPrimaryFixed","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":430,"s":[100]},{"t":433,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.149019607843,0.098039215686,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":41,"op":91,"st":41,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Home_Dismiss","tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":0,"op":91,"st":-195,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".primaryFixedDim","cl":"primaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":90,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.925490196078,0.752941176471,0.423529411765,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_recent_apps_edu.json b/packages/SystemUI/res/raw/trackpad_recent_apps_edu.json index c2e945d38a70..10768fccd4ad 100644 --- a/packages/SystemUI/res/raw/trackpad_recent_apps_edu.json +++ b/packages/SystemUI/res/raw/trackpad_recent_apps_edu.json @@ -1 +1 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":511,"w":554,"h":564,"nm":"Trackpad-JSON_Recents-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Recents_EDU Loop","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"CNTL || playback","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":0},"y":{"a":0,"k":0}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Picker","np":3,"mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ","ix":1,"en":1,"ef":[{"ty":7,"nm":"Menu","mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ-0001","ix":1,"v":{"a":0,"k":2}}]},{"ty":5,"nm":"OUTPUT","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"k":[{"s":[0],"t":142,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.001],"t":143,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.002],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.003],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.004],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.006],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.008],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.01],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.012],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.016],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.02],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.025],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.031],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.038],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.047],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.059],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.073],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.091],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.116],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.15],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.196],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.249],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.306],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.366],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.425],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.481],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.53],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.575],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.614],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.648],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.678],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.706],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.73],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.752],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.772],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.79],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.807],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.822],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.836],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.849],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.861],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.873],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.883],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.892],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.901],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.91],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.917],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.925],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.931],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.937],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.943],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.949],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.954],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.958],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.963],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.967],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.97],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.974],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.977],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.98],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.983],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.985],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.987],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.989],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.991],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.993],"t":207,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.994],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.996],"t":209,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.997],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.998],"t":211,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.998],"t":212,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.999],"t":213,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1],"t":215,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.009],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.038],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.093],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.193],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.4],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.636],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.739],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.8],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.84],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.871],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.894],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.912],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.928],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.94],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.951],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.959],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.967],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.973],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.979],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.983],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.987],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.99],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.993],"t":273,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.995],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.997],"t":275,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.998],"t":276,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.999],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.009],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.038],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.093],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.193],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.4],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.636],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.739],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.8],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.84],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.871],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.894],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.912],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.928],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.94],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.951],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.959],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.967],"t":397,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.973],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.979],"t":399,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.983],"t":400,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.987],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.99],"t":402,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.993],"t":403,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.995],"t":404,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.997],"t":405,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.999],"t":408,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}}]},{"ty":5,"nm":"Keys","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.831],"y":[0.109]},"o":{"x":[0.458],"y":[0.053]},"t":142,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.15],"y":[0.43]},"t":161,"s":[0.15]},{"t":217,"s":[1],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[1]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[1.4]},{"t":280,"s":[2],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[2]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":385,"s":[2.4]},{"t":410,"s":[3]}]}}]},{"ty":5,"nm":"State (holds)","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":0}}]}],"shapes":[],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null :: Taskbar drop","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"s":[252,278,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,278.45,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,279.615,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,281.252,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,283.166,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,287.233,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,289.181,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,290.982,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,292.599,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,294.012,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,295.216,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,296.216,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,297.023,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,297.655,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.131,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.474,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.705,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.465,0],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.226,0],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298,0],"t":377,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.382,0],"t":378,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,299.372,0],"t":379,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,300.764,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,302.391,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,305.848,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,307.504,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,309.035,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,310.409,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,311.611,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,312.634,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,313.483,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,314.169,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,314.706,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.112,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.403,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.717,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.474,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.192,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Taskbar Lofi","parent":3,"refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":134,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":432,"s":[100]},{"t":444,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":0},"y":{"k":[{"s":[26.984],"t":127,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.971],"t":128,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.95],"t":129,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.921],"t":130,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.882],"t":131,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.83],"t":132,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.765],"t":133,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.685],"t":134,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.589],"t":135,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.478],"t":136,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.349],"t":137,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.205],"t":138,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.072],"t":139,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.926],"t":140,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.764],"t":141,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.589],"t":142,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.397],"t":143,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.187],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.959],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.711],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.44],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.146],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.826],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.479],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.1],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.686],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.236],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.745],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.207],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.616],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.967],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.248],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.457],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.578],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.602],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.514],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.303],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[12.954],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[11.477],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[9.885],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[8.215],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[6.526],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[4.878],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[3.338],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.928],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.659],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-0.475],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-1.485],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-2.388],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-3.192],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-3.911],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-4.556],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-5.136],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-5.662],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.135],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.563],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.951],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.303],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.622],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.913],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.175],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.413],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.628],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.823],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.998],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.155],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.296],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.42],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.531],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.627],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.711],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.783],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.843],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.893],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.933],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.963],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.984],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.996],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[91,15,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}]}}]}],"w":182,"h":30,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"Focus Task :: Lift & Drop","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":252},"y":{"k":[{"s":[157.385],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.28],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.128],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.026],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.901],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.75],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.564],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.335],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.054],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.706],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.275],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.73],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.03],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[153.103],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[151.8],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[150.035],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[148.047],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.867],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[143.589],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[141.341],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[139.241],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[137.346],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[135.666],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[134.185],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[132.878],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[131.718],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[130.684],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[129.755],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[128.916],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[128.155],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[127.462],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[126.829],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[126.249],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[125.715],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[125.221],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.765],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.343],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.951],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.587],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.249],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.934],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.641],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.369],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.114],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.877],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.657],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.452],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.26],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.082],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.918],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.764],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.623],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.492],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.371],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.261],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.158],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.065],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.98],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.903],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.835],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.718],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.629],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.51],"t":215,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.5],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.746],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.54],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.071],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.808],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[130.5],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[136.982],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[139.835],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[141.489],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[142.613],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[143.442],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.082],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.593],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.01],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.354],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.642],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.884],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.089],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.262],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.409],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.534],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.638],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.725],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.857],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.094],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.397],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.982],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[149.027],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[151.2],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[153.675],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.764],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.396],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.825],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.141],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.386],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.581],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.74],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.871],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.981],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.074],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.218],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.362],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"k":[{"s":[503.613,314.758],"t":144,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.134,314.459],"t":146,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.832,314.27],"t":147,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.464,314.04],"t":148,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.025,313.765],"t":149,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.487,313.429],"t":150,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.824,313.015],"t":151,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.023,312.514],"t":152,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[499.032,311.895],"t":153,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[497.818,311.136],"t":154,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[496.328,310.205],"t":155,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[494.484,309.053],"t":156,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[492.194,307.621],"t":157,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[489.307,305.817],"t":158,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[485.592,303.495],"t":159,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[480.67,300.419],"t":160,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[473.76,296.1],"t":161,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[464.395,290.247],"t":162,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[453.849,283.656],"t":163,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[442.286,276.429],"t":164,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[430.198,268.874],"t":165,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[418.274,261.421],"t":166,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[407.131,254.457],"t":167,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[397.077,248.173],"t":168,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[388.165,242.603],"t":169,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[380.31,237.694],"t":170,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[373.373,233.358],"t":171,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[367.218,229.511],"t":172,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[361.732,226.082],"t":173,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[356.803,223.002],"t":174,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[352.354,220.221],"t":175,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[348.318,217.699],"t":176,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[344.643,215.402],"t":177,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[341.283,213.302],"t":178,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[338.205,211.378],"t":179,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[335.37,209.606],"t":180,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[332.752,207.97],"t":181,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[330.33,206.456],"t":182,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[328.092,205.058],"t":183,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[326.012,203.757],"t":184,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[324.082,202.552],"t":185,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[322.291,201.432],"t":186,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[320.617,200.386],"t":187,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[319.062,199.414],"t":188,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[317.618,198.512],"t":189,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[316.267,197.667],"t":190,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[315.013,196.883],"t":191,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[313.845,196.153],"t":192,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[312.756,195.472],"t":193,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[311.738,194.837],"t":194,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[310.793,194.246],"t":195,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[309.921,193.7],"t":196,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[309.107,193.192],"t":197,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[308.359,192.724],"t":198,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[307.663,192.289],"t":199,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[307.02,191.888],"t":200,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[306.436,191.522],"t":201,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.891,191.182],"t":202,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.399,190.874],"t":203,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.946,190.591],"t":204,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.539,190.337],"t":205,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.178,190.112],"t":206,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.85,189.906],"t":207,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.555,189.722],"t":208,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.306,189.566],"t":209,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.082,189.427],"t":210,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.892,189.308],"t":211,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.617,189.135],"t":213,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.4,189],"t":250,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.247,188.904],"t":251,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[301.752,188.595],"t":252,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[300.798,187.999],"t":253,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[299.093,186.933],"t":254,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[295.546,184.716],"t":255,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[291.506,182.192],"t":256,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[289.729,181.08],"t":257,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[288.698,180.436],"t":258,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.998,179.999],"t":259,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.481,179.676],"t":260,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.082,179.427],"t":261,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.764,179.227],"t":262,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.504,179.065],"t":263,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.29,178.931],"t":264,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.11,178.819],"t":265,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.832,178.645],"t":267,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.555,178.472],"t":270,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.272,178.295],"t":278,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.264,178.29],"t":380,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.222,179.514],"t":381,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[293.538,183.461],"t":382,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.714,191.071],"t":383,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[327.48,204.675],"t":384,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[372.758,232.974],"t":385,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[424.317,265.198],"t":386,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[447.009,279.381],"t":387,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[460.167,287.605],"t":388,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[469.103,293.19],"t":389,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[475.697,297.31],"t":390,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[480.788,300.492],"t":391,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[484.853,303.033],"t":392,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[488.172,305.107],"t":393,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[490.906,306.816],"t":394,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[493.198,308.249],"t":395,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[495.121,309.451],"t":396,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[496.752,310.47],"t":397,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[498.133,311.333],"t":398,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[499.301,312.063],"t":399,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.29,312.681],"t":400,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.123,313.202],"t":401,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.814,313.634],"t":402,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.391,313.994],"t":403,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.861,314.288],"t":404,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.238,314.524],"t":405,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.53,314.706],"t":406,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0]},"r":{"k":[{"s":[27.974],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.959],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.942],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.922],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.898],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.869],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.833],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.789],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.736],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.67],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.589],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.49],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.368],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.216],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.024],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.777],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.45],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.991],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.37],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.669],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.901],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.098],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.306],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.566],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.898],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.306],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.785],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.324],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.915],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.551],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.223],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.928],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.66],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.416],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.193],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.988],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.8],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.626],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.465],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.316],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.178],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.05],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.931],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.82],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.717],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.621],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.531],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.448],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.37],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.298],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.23],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.167],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.11],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.055],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.006],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.96],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.917],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.878],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.842],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.809],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.779],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.752],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.728],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.706],"t":207,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.687],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.67],"t":209,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.655],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.643],"t":211,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.633],"t":212,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.624],"t":213,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.61],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.603],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.579],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.532],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.45],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.278],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.082],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.996],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.946],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.912],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.887],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.868],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.853],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.84],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.83],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.821],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.808],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.794],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.78],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.78],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.907],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.318],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.109],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.524],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.468],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.82],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.295],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.15],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.731],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.16],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.491],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.755],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.971],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.149],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.298],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.423],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.529],"t":397,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.619],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.694],"t":399,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.759],"t":400,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.813],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.858],"t":402,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.895],"t":403,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.926],"t":404,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.95],"t":405,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.969],"t":406,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.993],"t":408,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Recents_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"k":[{"s":[99.923,99.923,100],"t":144,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.828,99.828,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.768,99.768,100],"t":147,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.695,99.695,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.608,99.608,100],"t":149,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.501,99.501,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.37,99.37,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.211,99.211,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.014,99.014,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.773,98.773,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.478,98.478,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.112,98.112,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.658,97.658,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.085,97.085,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.348,96.348,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.371,95.371,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94,94,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.142,92.142,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.049,90.049,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.755,87.755,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.357,85.357,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.991,82.991,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.78,80.78,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[78.785,78.785,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[77.017,77.017,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[75.458,75.458,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[74.082,74.082,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[72.861,72.861,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[71.772,71.772,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70.794,70.794,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[69.911,69.911,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[69.111,69.111,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.382,68.382,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[67.715,67.715,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[67.104,67.104,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[66.542,66.542,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[66.022,66.022,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[65.542,65.542,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[65.098,65.098,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.685,64.685,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.302,64.302,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.947,63.947,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.615,63.615,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.306,63.306,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.02,63.02,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.751,62.751,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.503,62.503,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.271,62.271,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.055,62.055,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.853,61.853,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.665,61.665,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.492,61.492,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.331,61.331,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.182,61.182,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.044,61.044,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.917,60.917,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.801,60.801,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.693,60.693,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.595,60.595,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.505,60.505,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.424,60.424,100],"t":205,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.353,60.353,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.288,60.288,100],"t":207,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.229,60.229,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.18,60.18,100],"t":209,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.135,60.135,100],"t":210,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.098,60.098,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.043,60.043,100],"t":213,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60,60,100],"t":250,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.97,59.97,100],"t":251,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.871,59.871,100],"t":252,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.682,59.682,100],"t":253,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.344,59.344,100],"t":254,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[58.64,58.64,100],"t":255,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.839,57.839,100],"t":256,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.486,57.486,100],"t":257,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.281,57.281,100],"t":258,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.142,57.142,100],"t":259,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.04,57.04,100],"t":260,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.961,56.961,100],"t":261,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.898,56.898,100],"t":262,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.846,56.846,100],"t":263,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.804,56.804,100],"t":264,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.768,56.768,100],"t":265,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.713,56.713,100],"t":267,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.658,56.658,100],"t":270,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.602,56.602,100],"t":278,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.6,56.6,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.989,56.989,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[58.242,58.242,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.657,60.657,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.976,64.976,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[73.96,73.96,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.19,84.19,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.692,88.692,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.303,91.303,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.076,93.076,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.384,94.384,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.394,95.394,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.201,96.201,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.859,96.859,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.402,97.402,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.857,97.857,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.238,98.238,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.562,98.562,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.836,98.836,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.068,99.068,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.264,99.264,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.429,99.429,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.566,99.566,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.681,99.681,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.774,99.774,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.849,99.849,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.907,99.907,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"t":277,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,-30.035,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[176.678,176.678,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"second Tasks Zoom back","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":385,"s":[98,98,100]},{"t":410,"s":[95,95,100]}]}},"ao":0,"shapes":[],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Null :: Reposition Side Task","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-318.4,-38,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-277.34,-48.1,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,-63.25,0]}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,-111.72,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-111.197,0],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-109.514,0],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-106.268,0],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-100.462,0],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-88.39,0],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-74.643,0],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-68.591,0],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-65.083,0],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-62.7,0],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-60.943,0],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-59.584,0],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-58.5,0],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-57.616,0],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.886,0],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.276,0],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.762,0],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.328,0],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.96,0],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.648,0],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.385,0],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.163,0],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.977,0],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.824,0],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.698,0],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.598,0],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.521,0],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.463,0],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.424,0],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":10,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.963},"t":217,"s":[-84.8,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":250,"s":[0,0,0]}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":250,"s":[302.4,189]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":255,"s":[227.56,142.34]},{"t":280,"s":[115.3,72.35]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[14.6]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[14.272]},{"t":280,"s":[13.78]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,-53.175,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.175,0],"t":510,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-411.95,20.325,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-333.47,29.183,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,42.47,0]}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[115.3,72.35]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":13.78},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Taskbar Lofi","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"app - 5","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[51.5,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.652,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.136,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.013,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.449,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.806,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.3,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[66.437,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[68.94,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[70.432,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[71.462,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[72.229,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[72.83,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.314,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.714,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.048,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.334,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.578,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.789,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.971,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.131,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.269,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.389,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.493,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.584,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.663,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.731,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.789,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.839,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.915,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.982,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[76,0,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.779,0,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.066,0,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.709,0,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[71.271,0,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[66.2,0,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[60.425,0,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.886,0,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.41,0,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.409,0,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.67,0,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.1,0,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.646,0,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.275,0,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.968,0,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.711,0,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.495,0,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.312,0,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.157,0,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.026,0,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.916,0,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.822,0,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.745,0,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.68,0,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.628,0,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.585,0,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.552,0,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.501,0,0],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[167,15,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 7511","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[167,15]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 5","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"app - 4","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[123.341,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.654,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.223,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.146,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.662,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.549,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.838,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.455,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.421,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.083,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.576,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.962,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.272,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.528,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.742,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.924,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.08,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.216,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.334,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.437,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.527,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.606,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.734,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.869,15,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.864,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.402,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.527,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.96,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.701,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.002,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.358,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.406,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.763,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.288,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.923,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.633,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.396,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.199,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.034,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.895,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.776,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.675,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.589,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.516,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.403,15,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.299,15,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[139,15,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 7508","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[139,15]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 4","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"app - 3","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[104.041,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.182,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.436,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.844,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.517,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.808,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.265,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.981,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.409,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.703,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.923,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.092,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.228,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.341,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.436,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.517,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.587,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.648,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.746,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.853,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.956,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.938,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.73,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.34,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.649,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.197,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.559,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.828,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.403,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.117,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.906,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.745,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.616,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.511,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.424,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.35,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.288,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.19,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.091,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[111,15,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 7507","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[111,15]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 3","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"app - 2","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[84.704,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.639,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.537,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.371,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.048,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.684,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.505,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.398,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.324,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.271,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.195,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.123,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.045,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.068,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.166,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.338,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.702,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.112,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.294,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.399,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.47,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.521,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.593,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.676,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[83,15,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 7506","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[83,15]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"app - 1","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[65.439,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.229,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.849,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.236,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.226,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.296,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.111,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[58.033,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.388,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.945,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.616,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.359,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.154,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.984,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.842,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.72,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.616,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.525,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.447,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.378,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.317,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.265,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.219,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.178,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.143,15,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.113,15,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.066,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.012,15,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55,15,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.092,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.403,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.986,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.027,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.212,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.67,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[62.762,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.396,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.825,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.141,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.385,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.578,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.736,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.867,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.977,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.07,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.149,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.217,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.274,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.323,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.364,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.426,15,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.491,15,0],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[55,15,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 7505","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[55,15]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"divider","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":90},"p":{"k":[{"s":[51,15,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.913,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.615,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.073,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.194,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.751,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.001,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.869,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.328,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.409,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.778,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.309,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.941,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.645,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.402,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.199,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.025,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.876,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.747,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.635,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.536,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.451,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.376,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.31,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.253,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.203,15,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.161,15,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.124,15,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.093,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.068,15,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.047,15,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.017,15,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36,15,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.129,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.569,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.403,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.895,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.999,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.522,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.088,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.994,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.607,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.059,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.407,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.683,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.909,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.096,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.253,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.386,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.499,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.596,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.677,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.747,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.806,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.854,15,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.895,15,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.927,15,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.973,15,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"k":[{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2,-0.5],[2,-0.5]],"c":false}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.019,-0.5],[2.019,-0.5]],"c":false}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.077,-0.5],[2.077,-0.5]],"c":false}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.185,-0.5],[2.185,-0.5]],"c":false}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.361,-0.5],[2.361,-0.5]],"c":false}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.65,-0.5],[2.65,-0.5]],"c":false}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.2,-0.5],[3.2,-0.5]],"c":false}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.829,-0.5],[3.829,-0.5]],"c":false}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.136,-0.5],[4.136,-0.5]],"c":false}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.318,-0.5],[4.318,-0.5]],"c":false}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.444,-0.5],[4.444,-0.5]],"c":false}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.538,-0.5],[4.538,-0.5]],"c":false}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.612,-0.5],[4.612,-0.5]],"c":false}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.671,-0.5],[4.671,-0.5]],"c":false}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.72,-0.5],[4.72,-0.5]],"c":false}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.761,-0.5],[4.761,-0.5]],"c":false}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.796,-0.5],[4.796,-0.5]],"c":false}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.826,-0.5],[4.826,-0.5]],"c":false}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.852,-0.5],[4.852,-0.5]],"c":false}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.874,-0.5],[4.874,-0.5]],"c":false}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.894,-0.5],[4.894,-0.5]],"c":false}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.91,-0.5],[4.91,-0.5]],"c":false}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.925,-0.5],[4.925,-0.5]],"c":false}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.938,-0.5],[4.938,-0.5]],"c":false}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.949,-0.5],[4.949,-0.5]],"c":false}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.959,-0.5],[4.959,-0.5]],"c":false}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.967,-0.5],[4.967,-0.5]],"c":false}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.974,-0.5],[4.974,-0.5]],"c":false}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.98,-0.5],[4.98,-0.5]],"c":false}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.99,-0.5],[4.99,-0.5]],"c":false}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.996,-0.5],[4.996,-0.5]],"c":false}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5,-0.5],[5,-0.5]],"c":false}],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.973,-0.5],[4.973,-0.5]],"c":false}],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.887,-0.5],[4.887,-0.5]],"c":false}],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.72,-0.5],[4.72,-0.5]],"c":false}],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.421,-0.5],[4.421,-0.5]],"c":false}],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.8,-0.5],[3.8,-0.5]],"c":false}],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.093,-0.5],[3.093,-0.5]],"c":false}],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.782,-0.5],[2.782,-0.5]],"c":false}],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.601,-0.5],[2.601,-0.5]],"c":false}],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.479,-0.5],[2.479,-0.5]],"c":false}],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.388,-0.5],[2.388,-0.5]],"c":false}],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.318,-0.5],[2.318,-0.5]],"c":false}],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.263,-0.5],[2.263,-0.5]],"c":false}],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.217,-0.5],[2.217,-0.5]],"c":false}],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.18,-0.5],[2.18,-0.5]],"c":false}],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.148,-0.5],[2.148,-0.5]],"c":false}],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.122,-0.5],[2.122,-0.5]],"c":false}],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.099,-0.5],[2.099,-0.5]],"c":false}],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.081,-0.5],[2.081,-0.5]],"c":false}],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.064,-0.5],[2.064,-0.5]],"c":false}],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.051,-0.5],[2.051,-0.5]],"c":false}],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.039,-0.5],[2.039,-0.5]],"c":false}],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.03,-0.5],[2.03,-0.5]],"c":false}],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.022,-0.5],[2.022,-0.5]],"c":false}],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.01,-0.5],[2.01,-0.5]],"c":false}],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.006,-0.5],[2.006,-0.5]],"c":false}],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.004,-0.5],[2.004,-0.5]],"c":false}],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.001,-0.5],[2.001,-0.5]],"c":false}],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":1},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"divider","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[-52.349,0.652,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.453,0.652,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.813,0.652,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.464,0.652,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.515,0.652,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.247,0.652,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-59.565,0.652,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.323,0.652,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-65.162,0.652,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-66.258,0.652,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-67.015,0.652,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-67.578,0.652,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.019,0.652,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.375,0.652,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.668,0.652,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.914,0.652,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.122,0.652,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.301,0.652,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.456,0.652,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.59,0.652,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.708,0.652,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.81,0.652,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.9,0.652,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.978,0.652,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.047,0.652,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.106,0.652,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.157,0.652,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.2,0.652,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.268,0.652,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.328,0.652,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.349,0.652,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.193,0.652,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.662,0.652,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.662,0.652,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-66.874,0.652,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.132,0.652,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-58.906,0.652,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.04,0.652,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.956,0.652,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.22,0.652,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.678,0.652,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.259,0.652,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.925,0.652,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.654,0.652,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.43,0.652,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.241,0.652,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.082,0.652,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.947,0.652,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.831,0.652,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.734,0.652,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.65,0.652,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.58,0.652,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.522,0.652,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.474,0.652,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.435,0.652,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.404,0.652,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.354,0.652,0],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[6.826,6.826,0]},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 12","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,9.501]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 12","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 11","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,2.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 11","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true}},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 5","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[9.5,2.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Ellipse 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[-0.185,0.148],[0,0],[0,0],[0,0],[-0.086,0.24],[0,0.271],[0.468,0.462],[0.671,0],[0.468,-0.468],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.24,0.086]],"o":[[0,0],[0,0],[0,0],[0.148,-0.185],[0.086,-0.24],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.462,0.462],[0,0.671],[0.468,0.462],[0.271,0],[0.24,-0.086]],"v":[[0.48,0.998],[2.809,3.326],[3.326,2.809],[0.998,0.48],[1.349,-0.157],[1.478,-0.924],[0.776,-2.624],[-0.924,-3.326],[-2.633,-2.624],[-3.326,-0.924],[-2.633,0.785],[-0.924,1.478],[-0.157,1.349]],"c":true}},"nm":"Path 1","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 1","hd":false},{"ind":2,"ty":"sh","ks":{"a":0,"k":{"i":[[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462],[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462]],"o":[[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462],[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462]],"v":[[0.249,0.259],[-0.924,0.739],[-2.106,0.259],[-2.587,-0.924],[-2.106,-2.097],[-0.924,-2.587],[0.249,-2.097],[0.739,-0.924]],"c":true}},"nm":"Path 2","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 2","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":0.4},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"icon","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[10.326,10.326]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"icon","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[91,15,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[{"s":[120,4],"t":155,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.383,4.161],"t":156,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.592,4.668],"t":157,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.818,5.601],"t":158,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[127.463,7.13],"t":159,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[133.427,9.631],"t":160,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[144.8,14.4],"t":161,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[157.801,19.852],"t":162,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[164.141,22.511],"t":163,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[167.915,24.093],"t":164,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[170.516,25.184],"t":165,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[172.458,25.999],"t":166,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[173.978,26.636],"t":167,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[175.203,27.15],"t":168,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[176.216,27.574],"t":169,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[177.065,27.931],"t":170,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[177.788,28.234],"t":171,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[178.406,28.493],"t":172,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[178.938,28.716],"t":173,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.399,28.909],"t":174,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.8,29.078],"t":175,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.149,29.224],"t":176,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.454,29.352],"t":177,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.718,29.463],"t":178,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.949,29.559],"t":179,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.148,29.643],"t":180,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.32,29.715],"t":181,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.467,29.777],"t":182,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.592,29.829],"t":183,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.697,29.873],"t":184,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.784,29.91],"t":185,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.855,29.939],"t":186,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.909,29.962],"t":187,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.978,29.991],"t":189,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[182,30],"t":380,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.445,29.767],"t":381,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.655,29.017],"t":382,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[176.204,27.569],"t":383,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[170.034,24.982],"t":384,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[157.2,19.6],"t":385,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[142.586,13.472],"t":386,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[136.154,10.774],"t":387,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[132.424,9.21],"t":388,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[129.891,8.148],"t":389,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[128.022,7.364],"t":390,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[126.579,6.759],"t":391,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[125.427,6.276],"t":392,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[124.487,5.881],"t":393,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.712,5.556],"t":394,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.062,5.284],"t":395,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[122.517,5.055],"t":396,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[122.055,4.862],"t":397,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.663,4.697],"t":398,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.332,4.559],"t":399,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.051,4.441],"t":400,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.815,4.342],"t":401,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.62,4.26],"t":402,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.456,4.191],"t":403,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.323,4.135],"t":404,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.216,4.091],"t":405,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.133,4.056],"t":406,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.073,4.03],"t":407,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.03,4.013],"t":408,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.008,4.003],"t":409,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":32.672},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Taskbar Lofi","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Recents_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82.5,140.5,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[100]},{"t":256,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,29.984,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.965,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.936,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.894,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.84,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.77,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.682,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.574,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.445,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.294,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.121,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.925,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.746,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.548,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.33,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.092,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.832,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.548,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.239,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.903,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.536,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.14,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.709,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.241,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.73,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.171,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,23.563,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.898,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.171,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,21.373,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,20.496,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,19.524,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,18.451,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,17.263,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,15.943,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,14.475,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,12.841,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,11.018,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,9.023,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,6.87,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,4.614,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,2.333,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0.106,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-1.975,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-3.877,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-5.591,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-7.125,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-8.492,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-9.714,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-10.799,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-11.771,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-12.643,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-13.428,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.138,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.777,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.355,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.879,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.354,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.784,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.177,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.532,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.854,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.146,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.409,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.645,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.858,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.048,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.217,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.366,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.496,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.61,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.707,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.788,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.856,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.911,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.954,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.984,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}]}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"right circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[-41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"left circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"size","bm":0,"hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Recents_EDU Loop","parent":4,"tt":1,"tp":4,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.768627464771,0.627451002598,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":511,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}],"markers":[{"tm":121,"cm":"start","dr":0},{"tm":142,"cm":"gesture","dr":75},{"tm":250,"cm":"release","dr":36},{"tm":356,"cm":"FLIP","dr":0},{"tm":392,"cm":"launch","dr":66}],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":60,"ip":0,"op":511,"w":554,"h":564,"nm":"Trackpad-JSON_Recents-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Recents_EDU Loop","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"CNTL || playback","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Picker","np":3,"mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ","ix":1,"en":1,"ef":[{"ty":7,"nm":"Menu","mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ-0001","ix":1,"v":{"a":0,"k":2,"ix":1}}]},{"ty":5,"nm":"OUTPUT","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"k":[{"s":[0],"t":142,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.001],"t":143,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.002],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.003],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.004],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.006],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.008],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.01],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.012],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.016],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.02],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.025],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.031],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.038],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.047],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.059],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.073],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.091],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.116],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.15],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.196],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.249],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.306],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.366],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.425],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.481],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.53],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.575],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.614],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.648],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.678],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.706],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.73],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.752],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.772],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.79],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.807],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.822],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.836],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.849],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.861],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.873],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.883],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.892],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.901],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.91],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.917],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.925],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.931],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.937],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.943],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.949],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.954],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.958],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.963],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.967],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.97],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.974],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.977],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.98],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.983],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.985],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.987],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.989],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.991],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.993],"t":207,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.994],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.996],"t":209,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.997],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.998],"t":211,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.998],"t":212,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.999],"t":213,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1],"t":215,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.009],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.038],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.093],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.193],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.4],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.636],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.739],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.8],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.84],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.871],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.894],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.912],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.928],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.94],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.951],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.959],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.967],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.973],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.979],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.983],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.987],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.99],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.993],"t":273,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.995],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.997],"t":275,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.998],"t":276,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.999],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.009],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.038],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.093],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.193],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.4],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.636],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.739],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.8],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.84],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.871],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.894],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.912],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.928],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.94],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.951],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.959],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.967],"t":397,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.973],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.979],"t":399,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.983],"t":400,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.987],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.99],"t":402,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.993],"t":403,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.995],"t":404,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.997],"t":405,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[2.999],"t":408,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}}]},{"ty":5,"nm":"Keys","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.831],"y":[0.109]},"o":{"x":[0.458],"y":[0.053]},"t":142,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.15],"y":[0.43]},"t":161,"s":[0.15]},{"t":217,"s":[1],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[1]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[1.4]},{"t":280,"s":[2],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[2]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":385,"s":[2.4]},{"t":410,"s":[3]}],"ix":1}}]},{"ty":5,"nm":"State (holds)","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":0,"ix":1}}]}],"shapes":[],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null :: Taskbar drop","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[252,278,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,278.45,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,279.615,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,281.252,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,283.166,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,287.233,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,289.181,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,290.982,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,292.599,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,294.012,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,295.216,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,296.216,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,297.023,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,297.655,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.131,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.474,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.705,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.465,0],"t":212,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.226,0],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298,0],"t":377,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298.382,0],"t":378,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,299.372,0],"t":379,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,300.764,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,302.391,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,305.848,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,307.504,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,309.035,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,310.409,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,311.611,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,312.634,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,313.483,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,314.169,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,314.706,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.112,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.403,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.717,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.474,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,315.192,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Taskbar Lofi","parent":3,"refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":134,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":432,"s":[100]},{"t":444,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"k":[{"s":[26.984],"t":127,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.971],"t":128,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.95],"t":129,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.921],"t":130,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.882],"t":131,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.83],"t":132,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.765],"t":133,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.685],"t":134,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.589],"t":135,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.478],"t":136,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.349],"t":137,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.205],"t":138,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.072],"t":139,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.926],"t":140,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.764],"t":141,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.589],"t":142,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.397],"t":143,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.187],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.959],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.711],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.44],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.146],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.826],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.479],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.1],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.686],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.236],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.745],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.207],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.616],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.967],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.248],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.457],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.578],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.602],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.514],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.303],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[12.954],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[11.477],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[9.885],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[8.215],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[6.526],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[4.878],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[3.338],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.928],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.659],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-0.475],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-1.485],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-2.388],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-3.192],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-3.911],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-4.556],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-5.136],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-5.662],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.135],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.563],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-6.951],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.303],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.622],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-7.913],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.175],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.413],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.628],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.823],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-8.998],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.155],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.296],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.42],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.531],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.627],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.711],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.783],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.843],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.893],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.933],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.963],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.984],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-9.996],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[91,15,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"w":182,"h":30,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"Focus Task :: Lift & Drop","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":252,"ix":3},"y":{"k":[{"s":[157.385],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.28],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.128],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.026],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.901],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.75],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.564],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.335],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.054],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.706],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.275],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.73],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.03],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[153.103],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[151.8],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[150.035],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[148.047],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.867],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[143.589],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[141.341],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[139.241],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[137.346],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[135.666],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[134.185],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[132.878],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[131.718],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[130.684],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[129.755],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[128.916],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[128.155],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[127.462],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[126.829],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[126.249],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[125.715],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[125.221],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.765],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.343],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.951],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.587],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[123.249],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.934],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.641],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.369],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.114],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.877],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.657],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.452],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.26],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[121.082],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.918],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.764],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.623],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.492],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.371],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.261],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.158],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.065],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.98],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.903],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.835],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.718],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.629],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.51],"t":215,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.5],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.746],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.54],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.071],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.808],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[130.5],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[136.982],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[139.835],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[141.489],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[142.613],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[143.442],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.082],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.593],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.01],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.354],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.642],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.884],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.089],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.262],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.409],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.534],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.638],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.725],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.857],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.094],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.397],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[147.982],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[149.027],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[151.2],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[153.675],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[154.764],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.396],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[155.825],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.141],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.386],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.581],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.74],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.871],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[156.981],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.074],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.218],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[157.362],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"k":[{"s":[503.613,314.758],"t":144,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.134,314.459],"t":146,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.832,314.27],"t":147,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.464,314.04],"t":148,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.025,313.765],"t":149,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.487,313.429],"t":150,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.824,313.015],"t":151,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.023,312.514],"t":152,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[499.032,311.895],"t":153,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[497.818,311.136],"t":154,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[496.328,310.205],"t":155,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[494.484,309.053],"t":156,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[492.194,307.621],"t":157,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[489.307,305.817],"t":158,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[485.592,303.495],"t":159,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[480.67,300.419],"t":160,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[473.76,296.1],"t":161,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[464.395,290.247],"t":162,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[453.849,283.656],"t":163,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[442.286,276.429],"t":164,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[430.198,268.874],"t":165,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[418.274,261.421],"t":166,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[407.131,254.457],"t":167,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[397.077,248.173],"t":168,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[388.165,242.603],"t":169,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[380.31,237.694],"t":170,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[373.373,233.358],"t":171,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[367.218,229.511],"t":172,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[361.732,226.082],"t":173,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[356.803,223.002],"t":174,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[352.354,220.221],"t":175,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[348.318,217.699],"t":176,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[344.643,215.402],"t":177,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[341.283,213.302],"t":178,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[338.205,211.378],"t":179,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[335.37,209.606],"t":180,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[332.752,207.97],"t":181,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[330.33,206.456],"t":182,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[328.092,205.058],"t":183,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[326.012,203.757],"t":184,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[324.082,202.552],"t":185,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[322.291,201.432],"t":186,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[320.617,200.386],"t":187,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[319.062,199.414],"t":188,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[317.618,198.512],"t":189,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[316.267,197.667],"t":190,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[315.013,196.883],"t":191,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[313.845,196.153],"t":192,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[312.756,195.472],"t":193,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[311.738,194.837],"t":194,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[310.793,194.246],"t":195,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[309.921,193.7],"t":196,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[309.107,193.192],"t":197,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[308.359,192.724],"t":198,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[307.663,192.289],"t":199,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[307.02,191.888],"t":200,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[306.436,191.522],"t":201,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.891,191.182],"t":202,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.399,190.874],"t":203,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.946,190.591],"t":204,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.539,190.337],"t":205,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[304.178,190.112],"t":206,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.85,189.906],"t":207,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.555,189.722],"t":208,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.306,189.566],"t":209,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[303.082,189.427],"t":210,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.892,189.308],"t":211,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.617,189.135],"t":213,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.4,189],"t":250,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[302.247,188.904],"t":251,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[301.752,188.595],"t":252,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[300.798,187.999],"t":253,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[299.093,186.933],"t":254,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[295.546,184.716],"t":255,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[291.506,182.192],"t":256,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[289.729,181.08],"t":257,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[288.698,180.436],"t":258,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.998,179.999],"t":259,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.481,179.676],"t":260,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.082,179.427],"t":261,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.764,179.227],"t":262,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.504,179.065],"t":263,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.29,178.931],"t":264,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.11,178.819],"t":265,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.832,178.645],"t":267,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.555,178.472],"t":270,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.272,178.295],"t":278,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.264,178.29],"t":380,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.222,179.514],"t":381,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[293.538,183.461],"t":382,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[305.714,191.071],"t":383,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[327.48,204.675],"t":384,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[372.758,232.974],"t":385,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[424.317,265.198],"t":386,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[447.009,279.381],"t":387,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[460.167,287.605],"t":388,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[469.103,293.19],"t":389,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[475.697,297.31],"t":390,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[480.788,300.492],"t":391,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[484.853,303.033],"t":392,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[488.172,305.107],"t":393,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[490.906,306.816],"t":394,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[493.198,308.249],"t":395,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[495.121,309.451],"t":396,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[496.752,310.47],"t":397,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[498.133,311.333],"t":398,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[499.301,312.063],"t":399,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[500.29,312.681],"t":400,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.123,313.202],"t":401,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[501.814,313.634],"t":402,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.391,313.994],"t":403,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[502.861,314.288],"t":404,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.238,314.524],"t":405,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[503.53,314.706],"t":406,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0],"ix":3},"r":{"k":[{"s":[27.974],"t":144,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.959],"t":145,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.942],"t":146,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.922],"t":147,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.898],"t":148,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.869],"t":149,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.833],"t":150,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.789],"t":151,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.736],"t":152,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.67],"t":153,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.589],"t":154,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.49],"t":155,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.368],"t":156,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.216],"t":157,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.024],"t":158,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.777],"t":159,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.45],"t":160,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.991],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.37],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.669],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.901],"t":164,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[23.098],"t":165,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.306],"t":166,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[21.566],"t":167,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.898],"t":168,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[20.306],"t":169,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.785],"t":170,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.324],"t":171,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.915],"t":172,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.551],"t":173,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[18.223],"t":174,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.928],"t":175,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.66],"t":176,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.416],"t":177,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[17.193],"t":178,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.988],"t":179,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.8],"t":180,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.626],"t":181,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.465],"t":182,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.316],"t":183,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.178],"t":184,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.05],"t":185,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.931],"t":186,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.82],"t":187,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.717],"t":188,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.621],"t":189,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.531],"t":190,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.448],"t":191,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.37],"t":192,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.298],"t":193,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.23],"t":194,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.167],"t":195,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.11],"t":196,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.055],"t":197,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.006],"t":198,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.96],"t":199,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.917],"t":200,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.878],"t":201,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.842],"t":202,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.809],"t":203,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.779],"t":204,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.752],"t":205,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.728],"t":206,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.706],"t":207,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.687],"t":208,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.67],"t":209,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.655],"t":210,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.643],"t":211,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.633],"t":212,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.624],"t":213,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.61],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.603],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.579],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.532],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.45],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.278],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.082],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.996],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.946],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.912],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.887],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.868],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.853],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.84],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.83],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.821],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.808],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.794],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.78],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.78],"t":380,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.907],"t":381,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.318],"t":382,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[15.109],"t":383,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[16.524],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[19.468],"t":385,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[22.82],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[24.295],"t":387,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.15],"t":388,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[25.731],"t":389,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.16],"t":390,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.491],"t":391,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.755],"t":392,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[26.971],"t":393,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.149],"t":394,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.298],"t":395,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.423],"t":396,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.529],"t":397,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.619],"t":398,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.694],"t":399,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.759],"t":400,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.813],"t":401,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.858],"t":402,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.895],"t":403,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.926],"t":404,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.95],"t":405,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.969],"t":406,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[27.993],"t":408,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Recents_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"k":[{"s":[99.923,99.923,100],"t":144,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.828,99.828,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.768,99.768,100],"t":147,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.695,99.695,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.608,99.608,100],"t":149,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.501,99.501,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.37,99.37,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.211,99.211,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.014,99.014,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.773,98.773,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.478,98.478,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.112,98.112,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.658,97.658,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.085,97.085,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.348,96.348,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.371,95.371,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94,94,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.142,92.142,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.049,90.049,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.755,87.755,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.357,85.357,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.991,82.991,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.78,80.78,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[78.785,78.785,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[77.017,77.017,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[75.458,75.458,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[74.082,74.082,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[72.861,72.861,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[71.772,71.772,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70.794,70.794,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[69.911,69.911,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[69.111,69.111,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.382,68.382,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[67.715,67.715,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[67.104,67.104,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[66.542,66.542,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[66.022,66.022,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[65.542,65.542,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[65.098,65.098,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.685,64.685,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.302,64.302,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.947,63.947,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.615,63.615,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.306,63.306,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.02,63.02,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.751,62.751,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.503,62.503,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.271,62.271,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[62.055,62.055,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.853,61.853,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.665,61.665,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.492,61.492,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.331,61.331,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.182,61.182,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[61.044,61.044,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.917,60.917,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.801,60.801,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.693,60.693,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.595,60.595,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.505,60.505,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.424,60.424,100],"t":205,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.353,60.353,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.288,60.288,100],"t":207,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.229,60.229,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.18,60.18,100],"t":209,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.135,60.135,100],"t":210,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.098,60.098,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.043,60.043,100],"t":213,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60,60,100],"t":250,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.97,59.97,100],"t":251,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.871,59.871,100],"t":252,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.682,59.682,100],"t":253,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.344,59.344,100],"t":254,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[58.64,58.64,100],"t":255,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.839,57.839,100],"t":256,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.486,57.486,100],"t":257,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.281,57.281,100],"t":258,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.142,57.142,100],"t":259,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.04,57.04,100],"t":260,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.961,56.961,100],"t":261,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.898,56.898,100],"t":262,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.846,56.846,100],"t":263,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.804,56.804,100],"t":264,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.768,56.768,100],"t":265,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.713,56.713,100],"t":267,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.658,56.658,100],"t":270,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.602,56.602,100],"t":278,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.6,56.6,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.989,56.989,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[58.242,58.242,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.657,60.657,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[64.976,64.976,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[73.96,73.96,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.19,84.19,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.692,88.692,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.303,91.303,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.076,93.076,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.384,94.384,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.394,95.394,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.201,96.201,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.859,96.859,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.402,97.402,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.857,97.857,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.238,98.238,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.562,98.562,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.836,98.836,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.068,99.068,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.264,99.264,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.429,99.429,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.566,99.566,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.681,99.681,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.774,99.774,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.849,99.849,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.907,99.907,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"t":277,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,-30.035,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[176.678,176.678,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"second Tasks Zoom back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":385,"s":[98,98,100]},{"t":410,"s":[95,95,100]}],"ix":6,"l":2}},"ao":0,"shapes":[],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Null :: Reposition Side Task","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-318.4,-38,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-277.34,-48.1,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,-63.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-111.72,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-111.197,0],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-109.514,0],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-106.268,0],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-100.462,0],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-88.39,0],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-74.643,0],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-68.591,0],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-65.083,0],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-62.7,0],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-60.943,0],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-59.584,0],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-58.5,0],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-57.616,0],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.886,0],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.276,0],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.762,0],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.328,0],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.96,0],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.648,0],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.385,0],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.163,0],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.977,0],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.824,0],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.698,0],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.598,0],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.521,0],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.463,0],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.424,0],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":10,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.963},"t":217,"s":[-84.8,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":250,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":250,"s":[302.4,189]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":255,"s":[227.56,142.34]},{"t":280,"s":[115.3,72.35]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[14.6]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[14.272]},{"t":280,"s":[13.78]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-53.175,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.175,0],"t":510,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-411.95,20.325,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-333.47,29.183,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,42.47,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[115.3,72.35],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":13.78,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Taskbar Lofi","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"app - 5","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[51.5,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.652,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.136,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.013,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.449,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.806,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.3,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[66.437,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[68.94,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[70.432,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[71.462,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[72.229,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[72.83,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.314,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.714,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.048,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.334,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.578,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.789,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[74.971,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.131,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.269,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.389,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.493,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.584,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.663,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.731,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.789,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.839,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.915,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.982,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[76,0,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.779,0,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[75.066,0,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[73.709,0,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[71.271,0,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[66.2,0,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[60.425,0,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.886,0,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.41,0,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.409,0,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.67,0,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[54.1,0,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.646,0,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[53.275,0,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.968,0,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.711,0,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.495,0,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.312,0,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.157,0,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[52.026,0,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.916,0,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.822,0,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.745,0,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.68,0,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.628,0,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.585,0,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.552,0,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[51.501,0,0],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[167,15,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7511","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[167,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"app - 4","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[123.341,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.654,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.223,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.146,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.662,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.549,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.838,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[134.455,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.421,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.083,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.576,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[136.962,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.272,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.528,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.742,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.924,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.08,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.216,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.334,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.437,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.527,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.606,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.734,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.869,15,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.864,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[138.402,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[137.527,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[135.96,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[132.701,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[129.002,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[127.358,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[126.406,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.763,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[125.288,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.923,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.633,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.396,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.199,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[124.034,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.895,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.776,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.675,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.589,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.516,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.403,15,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[123.299,15,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[139,15,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7508","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[139,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"app - 3","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[104.041,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.182,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.436,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.844,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.517,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.808,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.265,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.981,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.409,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.703,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.923,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.092,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.228,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.341,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.436,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.517,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.587,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.648,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.746,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.853,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.956,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.938,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.73,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[110.34,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[109.649,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[108.197,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[106.559,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.828,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.403,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[105.117,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.906,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.745,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.616,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.511,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.424,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.35,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.288,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.19,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[104.091,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[111,15,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[111,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"app - 2","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[84.704,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.639,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.537,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.371,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.048,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.684,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.505,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.398,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.324,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.271,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.195,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.123,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.045,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.068,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.166,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.338,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83.702,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.112,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.294,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.399,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.47,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.521,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.593,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[84.676,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[83,15,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7506","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[83,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"app - 1","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[65.439,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.229,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.849,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.236,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.226,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.296,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.111,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[58.033,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.388,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.945,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.616,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.359,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[56.154,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.984,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.842,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.72,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.616,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.525,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.447,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.378,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.317,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.265,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.219,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.178,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.143,15,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.113,15,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.066,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.012,15,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55,15,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.092,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.403,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55.986,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[57.027,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[59.212,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[61.67,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[62.762,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.396,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[63.825,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.141,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.385,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.578,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.736,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.867,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[64.977,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.07,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.149,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.217,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.274,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.323,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.364,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.426,15,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[65.491,15,0],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[55,15,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[55,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"divider","sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":90,"ix":10},"p":{"k":[{"s":[51,15,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.913,15,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.615,15,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.073,15,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.194,15,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.751,15,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.001,15,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.869,15,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.328,15,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.409,15,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.778,15,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.309,15,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.941,15,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.645,15,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.402,15,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.199,15,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.025,15,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.876,15,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.747,15,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.635,15,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.536,15,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.451,15,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.376,15,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.31,15,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.253,15,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.203,15,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.161,15,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.124,15,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.093,15,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.068,15,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.047,15,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.017,15,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36,15,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.129,15,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.569,15,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.403,15,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.895,15,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.999,15,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[45.522,15,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.088,15,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[47.994,15,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[48.607,15,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.059,15,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.407,15,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.683,15,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[49.909,15,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.096,15,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.253,15,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.386,15,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.499,15,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.596,15,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.677,15,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.747,15,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.806,15,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.854,15,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.895,15,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.927,15,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[50.973,15,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2,-0.5],[2,-0.5]],"c":false}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.019,-0.5],[2.019,-0.5]],"c":false}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.077,-0.5],[2.077,-0.5]],"c":false}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.185,-0.5],[2.185,-0.5]],"c":false}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.361,-0.5],[2.361,-0.5]],"c":false}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.65,-0.5],[2.65,-0.5]],"c":false}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.2,-0.5],[3.2,-0.5]],"c":false}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.829,-0.5],[3.829,-0.5]],"c":false}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.136,-0.5],[4.136,-0.5]],"c":false}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.318,-0.5],[4.318,-0.5]],"c":false}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.444,-0.5],[4.444,-0.5]],"c":false}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.538,-0.5],[4.538,-0.5]],"c":false}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.612,-0.5],[4.612,-0.5]],"c":false}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.671,-0.5],[4.671,-0.5]],"c":false}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.72,-0.5],[4.72,-0.5]],"c":false}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.761,-0.5],[4.761,-0.5]],"c":false}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.796,-0.5],[4.796,-0.5]],"c":false}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.826,-0.5],[4.826,-0.5]],"c":false}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.852,-0.5],[4.852,-0.5]],"c":false}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.874,-0.5],[4.874,-0.5]],"c":false}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.894,-0.5],[4.894,-0.5]],"c":false}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.91,-0.5],[4.91,-0.5]],"c":false}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.925,-0.5],[4.925,-0.5]],"c":false}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.938,-0.5],[4.938,-0.5]],"c":false}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.949,-0.5],[4.949,-0.5]],"c":false}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.959,-0.5],[4.959,-0.5]],"c":false}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.967,-0.5],[4.967,-0.5]],"c":false}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.974,-0.5],[4.974,-0.5]],"c":false}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.98,-0.5],[4.98,-0.5]],"c":false}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.99,-0.5],[4.99,-0.5]],"c":false}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.996,-0.5],[4.996,-0.5]],"c":false}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5,-0.5],[5,-0.5]],"c":false}],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.973,-0.5],[4.973,-0.5]],"c":false}],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.887,-0.5],[4.887,-0.5]],"c":false}],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.72,-0.5],[4.72,-0.5]],"c":false}],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-4.421,-0.5],[4.421,-0.5]],"c":false}],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.8,-0.5],[3.8,-0.5]],"c":false}],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-3.093,-0.5],[3.093,-0.5]],"c":false}],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.782,-0.5],[2.782,-0.5]],"c":false}],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.601,-0.5],[2.601,-0.5]],"c":false}],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.479,-0.5],[2.479,-0.5]],"c":false}],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.388,-0.5],[2.388,-0.5]],"c":false}],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.318,-0.5],[2.318,-0.5]],"c":false}],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.263,-0.5],[2.263,-0.5]],"c":false}],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.217,-0.5],[2.217,-0.5]],"c":false}],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.18,-0.5],[2.18,-0.5]],"c":false}],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.148,-0.5],[2.148,-0.5]],"c":false}],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.122,-0.5],[2.122,-0.5]],"c":false}],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.099,-0.5],[2.099,-0.5]],"c":false}],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.081,-0.5],[2.081,-0.5]],"c":false}],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.064,-0.5],[2.064,-0.5]],"c":false}],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.051,-0.5],[2.051,-0.5]],"c":false}],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.039,-0.5],[2.039,-0.5]],"c":false}],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.03,-0.5],[2.03,-0.5]],"c":false}],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.022,-0.5],[2.022,-0.5]],"c":false}],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.01,-0.5],[2.01,-0.5]],"c":false}],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.006,-0.5],[2.006,-0.5]],"c":false}],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.004,-0.5],[2.004,-0.5]],"c":false}],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-2.001,-0.5],[2.001,-0.5]],"c":false}],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"divider","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[0],"t":161,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[54.85],"t":162,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":163,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":384,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0],"t":386,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-52.349,0.652,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.453,0.652,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.813,0.652,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.464,0.652,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.515,0.652,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-56.247,0.652,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-59.565,0.652,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.323,0.652,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-65.162,0.652,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-66.258,0.652,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-67.015,0.652,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-67.578,0.652,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.019,0.652,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.375,0.652,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.668,0.652,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.914,0.652,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.122,0.652,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.301,0.652,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.456,0.652,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.59,0.652,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.708,0.652,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.81,0.652,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.9,0.652,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.978,0.652,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.047,0.652,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.106,0.652,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.157,0.652,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.2,0.652,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.268,0.652,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.328,0.652,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.349,0.652,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.193,0.652,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-69.662,0.652,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-68.662,0.652,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-66.874,0.652,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-63.132,0.652,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-58.906,0.652,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-57.04,0.652,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.956,0.652,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-55.22,0.652,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.678,0.652,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-54.259,0.652,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.925,0.652,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.654,0.652,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.43,0.652,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.241,0.652,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-53.082,0.652,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.947,0.652,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.831,0.652,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.734,0.652,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.65,0.652,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.58,0.652,0],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.522,0.652,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.474,0.652,0],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.435,0.652,0],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.404,0.652,0],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-52.354,0.652,0],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[6.826,6.826,0],"ix":1,"l":2},"s":{"k":[{"s":[50,50,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.309,50.309,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.284,51.284,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.079,53.079,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.019,56.019,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.828,60.828,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[70,70,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.485,80.485,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.597,85.597,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.641,88.641,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.739,90.739,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.305,92.305,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.53,93.53,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.518,94.518,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.335,95.335,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.021,96.021,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.603,96.603,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.101,97.101,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.531,97.531,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.902,97.902,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.226,98.226,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.507,98.507,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.753,98.753,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.966,98.966,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.152,99.152,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.313,99.313,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.451,99.451,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.671,99.671,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.756,99.756,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.826,99.826,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.883,99.883,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.982,99.982,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.552,99.552,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.109,98.109,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.326,95.326,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.35,90.35,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[68.215,68.215,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[63.027,63.027,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[60.02,60.02,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.977,57.977,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.47,56.47,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[55.306,55.306,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[54.377,54.377,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[53.618,53.618,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.993,52.993,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.469,52.469,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[52.03,52.03,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.657,51.657,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.341,51.341,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[51.074,51.074,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.848,50.848,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.658,50.658,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.5,50.5,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.368,50.368,100],"t":403,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.26,50.26,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.174,50.174,100],"t":405,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.107,50.107,100],"t":406,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.059,50.059,100],"t":407,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[50.024,50.024,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,9.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,2.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[9.5,2.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.185,0.148],[0,0],[0,0],[0,0],[-0.086,0.24],[0,0.271],[0.468,0.462],[0.671,0],[0.468,-0.468],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.24,0.086]],"o":[[0,0],[0,0],[0,0],[0.148,-0.185],[0.086,-0.24],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.462,0.462],[0,0.671],[0.468,0.462],[0.271,0],[0.24,-0.086]],"v":[[0.48,0.998],[2.809,3.326],[3.326,2.809],[0.998,0.48],[1.349,-0.157],[1.478,-0.924],[0.776,-2.624],[-0.924,-3.326],[-2.633,-2.624],[-3.326,-0.924],[-2.633,0.785],[-0.924,1.478],[-0.157,1.349]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462],[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462]],"o":[[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462],[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462]],"v":[[0.249,0.259],[-0.924,0.739],[-2.106,0.259],[-2.587,-0.924],[-2.106,-2.097],[-0.924,-2.587],[0.249,-2.097],[0.739,-0.924]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.4,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"icon","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[10.326,10.326],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"icon","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[{"s":[120,4],"t":155,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.383,4.161],"t":156,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.592,4.668],"t":157,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.818,5.601],"t":158,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[127.463,7.13],"t":159,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[133.427,9.631],"t":160,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[144.8,14.4],"t":161,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[157.801,19.852],"t":162,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[164.141,22.511],"t":163,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[167.915,24.093],"t":164,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[170.516,25.184],"t":165,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[172.458,25.999],"t":166,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[173.978,26.636],"t":167,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[175.203,27.15],"t":168,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[176.216,27.574],"t":169,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[177.065,27.931],"t":170,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[177.788,28.234],"t":171,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[178.406,28.493],"t":172,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[178.938,28.716],"t":173,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.399,28.909],"t":174,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.8,29.078],"t":175,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.149,29.224],"t":176,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.454,29.352],"t":177,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.718,29.463],"t":178,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[180.949,29.559],"t":179,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.148,29.643],"t":180,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.32,29.715],"t":181,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.467,29.777],"t":182,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.592,29.829],"t":183,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.697,29.873],"t":184,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.784,29.91],"t":185,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.855,29.939],"t":186,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.909,29.962],"t":187,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.978,29.991],"t":189,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[182,30],"t":380,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[181.445,29.767],"t":381,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[179.655,29.017],"t":382,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[176.204,27.569],"t":383,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[170.034,24.982],"t":384,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[157.2,19.6],"t":385,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[142.586,13.472],"t":386,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[136.154,10.774],"t":387,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[132.424,9.21],"t":388,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[129.891,8.148],"t":389,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[128.022,7.364],"t":390,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[126.579,6.759],"t":391,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[125.427,6.276],"t":392,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[124.487,5.881],"t":393,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.712,5.556],"t":394,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[123.062,5.284],"t":395,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[122.517,5.055],"t":396,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[122.055,4.862],"t":397,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.663,4.697],"t":398,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.332,4.559],"t":399,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[121.051,4.441],"t":400,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.815,4.342],"t":401,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.62,4.26],"t":402,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.456,4.191],"t":403,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.323,4.135],"t":404,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.216,4.091],"t":405,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.133,4.056],"t":406,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.073,4.03],"t":407,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.03,4.013],"t":408,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[120.008,4.003],"t":409,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":32.672,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Taskbar Lofi","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Recents_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.5,140.5,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":2,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[100]},{"t":256,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,29.984,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.965,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.936,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.894,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.84,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.77,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.682,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.574,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.445,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.294,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,29.121,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.925,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.746,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.548,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.33,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,28.092,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.832,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.548,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,27.239,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.903,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.536,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,26.14,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.709,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,25.241,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.73,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,24.171,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,23.563,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.898,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,22.171,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,21.373,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,20.496,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,19.524,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,18.451,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,17.263,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,15.943,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,14.475,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,12.841,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,11.018,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,9.023,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,6.87,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,4.614,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,2.333,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0.106,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-1.975,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-3.877,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-5.591,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-7.125,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-8.492,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-9.714,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-10.799,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-11.771,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-12.643,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-13.428,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.138,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-14.777,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.355,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-15.879,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.354,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-16.784,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.177,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.532,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-17.854,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.146,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.409,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.645,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-18.858,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.048,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.217,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.366,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.496,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.61,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.707,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.788,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.856,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.911,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.954,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-19.984,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Recents_EDU Loop","parent":5,"tt":1,"tp":5,"refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.768627464771,0.627451002598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":511,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}],"markers":[{"tm":142,"cm":"drag with gesture","dr":108},{"tm":217,"cm":"onPause","dr":0},{"tm":250,"cm":"release playback realtime","dr":36}],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_recent_apps_success.json b/packages/SystemUI/res/raw/trackpad_recent_apps_success.json index bec6f353f380..1703c41df33a 100644 --- a/packages/SystemUI/res/raw/trackpad_recent_apps_success.json +++ b/packages/SystemUI/res/raw/trackpad_recent_apps_success.json @@ -1 +1 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":50,"w":554,"h":564,"nm":"Trackpad-JSON_Recents-Success","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadAK_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}]},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[95.049,95.049,100]}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}]},"p":{"a":0,"k":[81,127,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":-0.289},"p":{"a":0,"k":[14.364,-33.591,0]},"a":{"a":0,"k":[-0.125,0,0]},"s":{"a":0,"k":[104.744,104.744,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[95,95,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":88},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Checkbox - Widget","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Recents_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82.5,140.5,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"TrackpadAK_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,198.5,0]},"a":{"a":0,"k":[95,95,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":190,"h":190,"ip":6,"op":50,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":2}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Recents_LofiApp","tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":2}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1]},"o":{"a":0,"k":50},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.768627464771,0.627451002598,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":49,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":60,"ip":0,"op":97,"w":554,"h":564,"nm":"Trackpad-JSON_Recents-Success","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadAK_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[95.049,95.049,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}],"ix":10},"p":{"a":0,"k":[81,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.289,"ix":10},"p":{"a":0,"k":[14.364,-33.591,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.125,0,0],"ix":1,"l":2},"s":{"a":0,"k":[104.744,104.744,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":11,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,95,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":88,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Checkbox - Widget","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Trackpad-JSON_Recents-EDU","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[100]},{"t":256,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-20,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-20,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":248,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":258,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":248,"s":[28,28]},{"t":258,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Recents_EDU Loop","parent":5,"tt":1,"tp":5,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.768627464771,0.627451002598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Recents_EDU Loop","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"CNTL || playback","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Picker","np":3,"mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ","ix":1,"en":1,"ef":[{"ty":7,"nm":"Menu","mn":"Pseudo/@@WcSiov6sT3a4/s0XPKYEOQ-0001","ix":1,"v":{"a":0,"k":2,"ix":1}}]},{"ty":5,"nm":"OUTPUT","np":3,"mn":"ADBE Slider Control","ix":2,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"k":[{"s":[1],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.009],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.038],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.093],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.193],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.4],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.636],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.739],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.8],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.84],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.871],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.894],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.912],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.928],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.94],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.951],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.959],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.967],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.973],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.979],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.983],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.987],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.99],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.993],"t":273,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.995],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.997],"t":275,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.998],"t":276,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[1.999],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}}]},{"ty":5,"nm":"Keys","np":3,"mn":"ADBE Slider Control","ix":3,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.831],"y":[0.109]},"o":{"x":[0.458],"y":[0.053]},"t":142,"s":[0]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.15],"y":[0.43]},"t":161,"s":[0.15]},{"t":217,"s":[1],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[1]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[1.4]},{"t":280,"s":[2],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[2]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":385,"s":[2.4]},{"t":410,"s":[3]}],"ix":1}}]},{"ty":5,"nm":"State (holds)","np":3,"mn":"ADBE Slider Control","ix":4,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":0,"k":0,"ix":1}}]}],"shapes":[],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":3,"nm":"Null :: Taskbar drop","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[252,298.112,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252,298,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":0,"nm":"Taskbar Lofi","parent":3,"refId":"comp_3","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":134,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":143,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":432,"s":[100]},{"t":444,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":0,"ix":3},"y":{"k":[{"s":[-10],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[-10],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[91,15,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"w":182,"h":30,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":3,"nm":"Focus Task :: Lift & Drop","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":252,"ix":3},"y":{"k":[{"s":[119.5],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[119.746],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[120.54],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[122.071],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[124.808],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[130.5],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[136.982],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[139.835],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[141.489],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[142.613],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[143.442],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.082],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[144.593],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.01],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.354],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.642],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[145.884],"t":266,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.089],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.262],"t":268,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.409],"t":269,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.534],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.638],"t":271,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.725],"t":272,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[146.857],"t":274,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"matte","parent":5,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"k":[{"s":[302.247,188.904],"t":251,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[301.752,188.595],"t":252,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[300.798,187.999],"t":253,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[299.093,186.933],"t":254,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[295.546,184.716],"t":255,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[291.506,182.192],"t":256,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[289.729,181.08],"t":257,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[288.698,180.436],"t":258,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.998,179.999],"t":259,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.481,179.676],"t":260,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[287.082,179.427],"t":261,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.764,179.227],"t":262,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.504,179.065],"t":263,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.29,178.931],"t":264,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[286.11,178.819],"t":265,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.832,178.645],"t":267,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.555,178.472],"t":270,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[285.272,178.295],"t":278,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0],"ix":3},"r":{"k":[{"s":[14.603],"t":251,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.579],"t":252,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.532],"t":253,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.45],"t":254,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.278],"t":255,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[14.082],"t":256,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.996],"t":257,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.946],"t":258,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.912],"t":259,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.887],"t":260,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.868],"t":261,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.853],"t":262,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.84],"t":263,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.83],"t":264,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.821],"t":265,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.808],"t":267,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.794],"t":270,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[13.78],"t":278,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Recents_LofiApp","parent":6,"tt":1,"tp":6,"refId":"comp_4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"k":[{"s":[59.97,59.97,100],"t":251,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.871,59.871,100],"t":252,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.682,59.682,100],"t":253,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[59.344,59.344,100],"t":254,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[58.64,58.64,100],"t":255,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.839,57.839,100],"t":256,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.486,57.486,100],"t":257,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.281,57.281,100],"t":258,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.142,57.142,100],"t":259,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[57.04,57.04,100],"t":260,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.961,56.961,100],"t":261,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.898,56.898,100],"t":262,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.846,56.846,100],"t":263,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.804,56.804,100],"t":264,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.768,56.768,100],"t":265,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.713,56.713,100],"t":267,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.658,56.658,100],"t":270,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[56.602,56.602,100],"t":278,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"t":277,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,-30.035,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[176.678,176.678,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"second Tasks Zoom back","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":385,"s":[98,98,100]},{"t":410,"s":[95,95,100]}],"ix":6,"l":2}},"ao":0,"shapes":[],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"Null :: Reposition Side Task","parent":9,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-318.4,-38,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-277.34,-48.1,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,-63.25,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":12,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-111.72,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-111.197,0],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-109.514,0],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-106.268,0],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-100.462,0],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-88.39,0],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-74.643,0],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-68.591,0],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-65.083,0],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-62.7,0],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-60.943,0],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-59.584,0],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-58.5,0],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-57.616,0],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.886,0],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-56.276,0],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.762,0],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-55.328,0],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.96,0],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.648,0],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.385,0],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-54.163,0],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.977,0],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.824,0],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.698,0],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.598,0],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.521,0],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.463,0],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.424,0],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":10,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.963},"t":217,"s":[-84.8,0,0],"to":[0,0,0],"ti":[0,0,0]},{"t":250,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":250,"s":[302.4,189]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":255,"s":[227.56,142.34]},{"t":280,"s":[115.3,72.35]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":250,"s":[14.6]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":255,"s":[14.272]},{"t":280,"s":[13.78]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":14,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":268,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":277,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,-53.175,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,-53.175,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":250,"s":[-411.95,20.325,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":255,"s":[-333.47,29.183,0],"to":[0,0,0],"ti":[0,0,0]},{"t":280,"s":[-215.75,42.47,0]}],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[115.3,72.35],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":13.78,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":197,"op":511,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Taskbar Lofi","fr":60,"layers":[{"ddd":0,"ind":2,"ty":4,"nm":"app - 5","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[76,0,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[76,0,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[167,15,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7511","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[167,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"app - 4","sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[139,15,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[139,15,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[139,15,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7508","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[139,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"app - 3","sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[111,15,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[111,15,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[111,15,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7507","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[111,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"app - 2","sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[83,15,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[83,15,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[83,15,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7506","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[83,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"app - 1","sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[55,15,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[55,15,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[55,15,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 7505","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[55,15],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"divider","sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":90,"ix":10},"p":{"k":[{"s":[36,15,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36,15,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5,-0.5],[5,-0.5]],"c":false}],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[-5,-0.5],[5,-0.5]],"c":false}],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":1,"ix":5},"lc":2,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"divider","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"k":[{"s":[100],"t":217,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[100],"t":292,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-70.349,0.652,0],"t":217,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-70.349,0.652,0],"t":292,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[6.826,6.826,0],"ix":1,"l":2},"s":{"k":[{"s":[100,100,100],"t":217,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[100,100,100],"t":292,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,9.501],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 12","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[2.5,2.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 11","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-1.381,0],[0,1.381],[1.381,0],[0,-1.381]],"o":[[1.381,0],[0,-1.381],[-1.381,0],[0,1.381]],"v":[[0,2.5],[2.5,0],[0,-2.5],[-2.5,0]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[9.5,2.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-0.185,0.148],[0,0],[0,0],[0,0],[-0.086,0.24],[0,0.271],[0.468,0.462],[0.671,0],[0.468,-0.468],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.24,0.086]],"o":[[0,0],[0,0],[0,0],[0.148,-0.185],[0.086,-0.24],[0,-0.671],[-0.462,-0.468],[-0.671,0],[-0.462,0.462],[0,0.671],[0.468,0.462],[0.271,0],[0.24,-0.086]],"v":[[0.48,0.998],[2.809,3.326],[3.326,2.809],[0.998,0.48],[1.349,-0.157],[1.478,-0.924],[0.776,-2.624],[-0.924,-3.326],[-2.633,-2.624],[-3.326,-0.924],[-2.633,0.785],[-0.924,1.478],[-0.157,1.349]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462],[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462]],"o":[[-0.32,0.32],[-0.462,0],[-0.32,-0.326],[0,-0.462],[0.326,-0.326],[0.462,0],[0.326,0.32],[0,0.462]],"v":[[0.249,0.259],[-0.924,0.739],[-2.106,0.259],[-2.587,-0.924],[-2.106,-2.097],[-0.924,-2.587],[0.249,-2.097],[0.739,-0.924]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"mm","mm":5,"nm":"Merge Paths 2","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"st","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0.4,"ix":5},"lc":1,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"icon","np":6,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[10.326,10.326],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"icon","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[91,15,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"k":[{"s":[182,30],"t":217,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}},{"s":[182,30],"t":292,"i":{"x":[1,1],"y":[1,1]},"o":{"x":[0,0],"y":[0,0]}}]},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":32.672,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Taskbar Lofi","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_4","nm":"Recents_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82.5,140.5,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.32549020648,0.270588248968,0.164705887437,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadAK_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,198.5,0],"ix":2,"l":2},"a":{"a":0,"k":[95,95,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":190,"h":190,"ip":53,"op":97,"st":53,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"track matte 3","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onSecondaryFixed","cl":"onSecondaryFixed","tt":1,"tp":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":54,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":436,"s":[100]},{"t":439,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":47,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":96,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.145098039216,0.101960784314,0.01568627451,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":47,"op":97,"st":47,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"track matte 2","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":0,"nm":"Trackpad-JSON_Recents-EDU","tt":1,"tp":5,"refId":"comp_1","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":12,"s":[0]},{"t":15,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":12,"op":58,"st":-235,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":"track matte 1","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":511,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":0,"nm":"Trackpad-JSON_Recents-EDU","tt":1,"tp":7,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":-217,"op":33,"st":-217,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".onSecondaryFixedVariant","cl":"onSecondaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277,197.5],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277,197.5],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.325490196078,0.270588235294,0.164705882353,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980401039,0.768627464771,0.627451002598,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".secondaryFixedDim","cl":"secondaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":96,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.850980392157,0.76862745098,0.627450980392,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":221,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt index 1d5ee77055ac..bcf4bad9991d 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/HomeGestureTutorialScreen.kt @@ -50,8 +50,8 @@ fun HomeGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni remember(recognizer) { GestureFlowAdapter(recognizer).gestureStateAsFlow.map { it.toGestureUiState( - progressStartMarker = "", - progressEndMarker = "", + progressStartMarker = "drag with gesture", + progressEndMarker = "release playback realtime", successAnimation = R.raw.trackpad_home_success, ) } diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt index 4dc38c2ecb43..680b670f4d97 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/RecentAppsGestureTutorialScreen.kt @@ -51,8 +51,8 @@ fun RecentAppsGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () remember(recognizer) { GestureFlowAdapter(recognizer).gestureStateAsFlow.map { it.toGestureUiState( - progressStartMarker = "", - progressEndMarker = "", + progressStartMarker = "drag with gesture", + progressEndMarker = "onPause", successAnimation = R.raw.trackpad_recent_apps_success, ) } -- GitLab From bc766493aa27f293405315a3f915b4ff43d7c2f8 Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Wed, 23 Oct 2024 14:51:23 +0000 Subject: [PATCH 301/459] Fix lint in HeadsUpCoordinatorLogger. Future CL will change this class, so pre-running the formatter. Bug: 364360986 Flag: EXEMPT formatting change only Test: EXEMPT formatting change only Change-Id: Id35384f9380bce0920ff7b6388a513592df49473 --- .../coordinator/HeadsUpCoordinatorLogger.kt | 159 +++++++++++------- 1 file changed, 100 insertions(+), 59 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt index 496fb83c1cf9..1a521d767438 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/HeadsUpCoordinatorLogger.kt @@ -1,100 +1,141 @@ +/* + * 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.statusbar.notification.collection.coordinator import android.util.Log - -import com.android.systemui.log.dagger.NotificationHeadsUpLog import com.android.systemui.log.LogBuffer import com.android.systemui.log.core.LogLevel +import com.android.systemui.log.dagger.NotificationHeadsUpLog import javax.inject.Inject private const val TAG = "HeadsUpCoordinator" -class HeadsUpCoordinatorLogger constructor( - private val buffer: LogBuffer, - private val verbose: Boolean, -) { +class HeadsUpCoordinatorLogger(private val buffer: LogBuffer, private val verbose: Boolean) { @Inject - constructor(@NotificationHeadsUpLog buffer: LogBuffer) : - this(buffer, Log.isLoggable(TAG, Log.VERBOSE)) + constructor( + @NotificationHeadsUpLog buffer: LogBuffer + ) : this(buffer, Log.isLoggable(TAG, Log.VERBOSE)) fun logPostedEntryWillEvaluate(posted: HeadsUpCoordinator.PostedEntry, reason: String) { if (!verbose) return - buffer.log(TAG, LogLevel.VERBOSE, { - str1 = posted.key - str2 = reason - bool1 = posted.shouldHeadsUpEver - bool2 = posted.shouldHeadsUpAgain - }, { - "will evaluate posted entry $str1:" + + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = posted.key + str2 = reason + bool1 = posted.shouldHeadsUpEver + bool2 = posted.shouldHeadsUpAgain + }, + { + "will evaluate posted entry $str1:" + " reason=$str2 shouldHeadsUpEver=$bool1 shouldHeadsUpAgain=$bool2" - }) + }, + ) } fun logPostedEntryWillNotEvaluate(posted: HeadsUpCoordinator.PostedEntry, reason: String) { if (!verbose) return - buffer.log(TAG, LogLevel.VERBOSE, { - str1 = posted.key - str2 = reason - }, { - "will not evaluate posted entry $str1: reason=$str2" - }) + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = posted.key + str2 = reason + }, + { "will not evaluate posted entry $str1: reason=$str2" }, + ) } fun logEvaluatingGroups(numGroups: Int) { if (!verbose) return - buffer.log(TAG, LogLevel.VERBOSE, { - int1 = numGroups - }, { - "evaluating groups for alert transfer: $int1" - }) + buffer.log( + TAG, + LogLevel.VERBOSE, + { int1 = numGroups }, + { "evaluating groups for alert transfer: $int1" }, + ) } fun logEvaluatingGroup(groupKey: String, numPostedEntries: Int, logicalGroupSize: Int) { if (!verbose) return - buffer.log(TAG, LogLevel.VERBOSE, { - str1 = groupKey - int1 = numPostedEntries - int2 = logicalGroupSize - }, { - "evaluating group for alert transfer: $str1" + + buffer.log( + TAG, + LogLevel.VERBOSE, + { + str1 = groupKey + int1 = numPostedEntries + int2 = logicalGroupSize + }, + { + "evaluating group for alert transfer: $str1" + " numPostedEntries=$int1 logicalGroupSize=$int2" - }) + }, + ) } fun logEntryUpdatedByRanking(key: String, shouldHun: Boolean, reason: String) { - buffer.log(TAG, LogLevel.DEBUG, { - str1 = key - bool1 = shouldHun - str2 = reason - }, { - "updating entry via ranking applied: $str1 updated shouldHeadsUp=$bool1 because $str2" - }) + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = key + bool1 = shouldHun + str2 = reason + }, + { + "updating entry via ranking applied: $str1 updated shouldHeadsUp=$bool1 because $str2" + }, + ) } fun logEntryUpdatedToFullScreen(key: String, reason: String) { - buffer.log(TAG, LogLevel.DEBUG, { - str1 = key - str2 = reason - }, { - "updating entry to launch full screen intent: $str1 because $str2" - }) + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = key + str2 = reason + }, + { "updating entry to launch full screen intent: $str1 because $str2" }, + ) } fun logEntryDisqualifiedFromFullScreen(key: String, reason: String) { - buffer.log(TAG, LogLevel.DEBUG, { - str1 = key - str2 = reason - }, { - "updated entry no longer qualifies for full screen intent: $str1 because $str2" - }) + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = key + str2 = reason + }, + { "updated entry no longer qualifies for full screen intent: $str1 because $str2" }, + ) } fun logSummaryMarkedInterrupted(summaryKey: String, childKey: String) { - buffer.log(TAG, LogLevel.DEBUG, { - str1 = summaryKey - str2 = childKey - }, { - "marked group summary as interrupted: $str1 for alert transfer to child: $str2" - }) + buffer.log( + TAG, + LogLevel.DEBUG, + { + str1 = summaryKey + str2 = childKey + }, + { "marked group summary as interrupted: $str1 for alert transfer to child: $str2" }, + ) } } -- GitLab From 8cd5cb68e195acb7ef34e8d1852fcc6cfd388f2d Mon Sep 17 00:00:00 2001 From: Felix Stern Date: Wed, 23 Oct 2024 14:48:50 +0000 Subject: [PATCH 302/459] Fix a race when an editText was removed and added immediately again In some rare cases, the hide request that was triggered by removing a view was applied in InsetsController too late. A following show request could have been applied before, resulting in the IME not being shown. This was caused by InputMethodManager, as some methods (e.g., closeCurrentInput()) did not call into InsetsController#hide, but into IMMS. This CL fixes this race condition by calling directly into InsetsController#hide, instead of using IInputMethodManagerGlobalInvoker. Test: atest WindowInsetsControllerTests#testShowIme_immediatelyAfterDetachAndReattach --rerun-until-failure 100 Fix: 373971329 Flag: android.view.inputmethod.refactor_insets_controller Change-Id: Ib2dc444d3d08b23e36df1c2c72e630115804f80f --- .../view/inputmethod/InputMethodManager.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java index 47fc43735c4d..d34f86c8e0d7 100644 --- a/core/java/android/view/inputmethod/InputMethodManager.java +++ b/core/java/android/view/inputmethod/InputMethodManager.java @@ -2557,21 +2557,24 @@ public final class InputMethodManager { public boolean hideSoftInputFromWindow(IBinder windowToken, @HideFlags int flags, ResultReceiver resultReceiver) { return hideSoftInputFromWindow(windowToken, flags, resultReceiver, - SoftInputShowHideReason.HIDE_SOFT_INPUT); + SoftInputShowHideReason.HIDE_SOFT_INPUT, null); } private boolean hideSoftInputFromWindow(IBinder windowToken, @HideFlags int flags, - ResultReceiver resultReceiver, @SoftInputShowHideReason int reason) { + ResultReceiver resultReceiver, @SoftInputShowHideReason int reason, + @Nullable ImeTracker.Token statsToken) { // Get served view initially for statsToken creation. final View initialServedView; synchronized (mH) { initialServedView = getServedViewLocked(); } - final var statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, - ImeTracker.ORIGIN_CLIENT, reason, ImeTracker.isFromUser(initialServedView)); - ImeTracker.forLatency().onRequestHide(statsToken, - ImeTracker.ORIGIN_CLIENT, reason, ActivityThread::currentApplication); + if (statsToken == null) { + statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, + ImeTracker.ORIGIN_CLIENT, reason, ImeTracker.isFromUser(initialServedView)); + ImeTracker.forLatency().onRequestHide(statsToken, ImeTracker.ORIGIN_CLIENT, reason, + ActivityThread::currentApplication); + } ImeTracing.getInstance().triggerClientDump("InputMethodManager#hideSoftInputFromWindow", this, null /* icProto */); checkFocus(); @@ -2646,8 +2649,14 @@ public final class InputMethodManager { ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_CLIENT_VIEW_SERVED); - return IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, view.getWindowToken(), - statsToken, flags, null, reason, mAsyncShowHideMethodEnabled); + if (Flags.refactorInsetsController()) { + return hideSoftInputFromWindow(view.getWindowToken(), flags, + null /* resultReceiver */, reason, statsToken); + } else { + return IInputMethodManagerGlobalInvoker.hideSoftInput(mClient, + view.getWindowToken(), statsToken, flags, null, reason, + mAsyncShowHideMethodEnabled); + } } } @@ -3143,7 +3152,7 @@ public final class InputMethodManager { if (rootInsets != null && rootInsets.isVisible(WindowInsets.Type.ime())) { hideSoftInputFromWindow(view.getWindowToken(), hideFlags, null /* resultReceiver */, - SoftInputShowHideReason.HIDE_TOGGLE_SOFT_INPUT); + SoftInputShowHideReason.HIDE_TOGGLE_SOFT_INPUT, null); } else { showSoftInput(view, showFlags, null /* resultReceiver */, SoftInputShowHideReason.SHOW_TOGGLE_SOFT_INPUT); @@ -3721,14 +3730,19 @@ public final class InputMethodManager { ImeTracker.forLogging().onProgress(statsToken, ImeTracker.PHASE_CLIENT_VIEW_SERVED); - IInputMethodManagerGlobalInvoker.hideSoftInput( - mClient, - rootView.getWindowToken(), - statsToken, - HIDE_NOT_ALWAYS, - null, - reason, - true /*async */); + if (Flags.refactorInsetsController()) { + mCurRootView.getInsetsController().hide(WindowInsets.Type.ime(), + false /* fromIme */, statsToken); + } else { + IInputMethodManagerGlobalInvoker.hideSoftInput( + mClient, + rootView.getWindowToken(), + statsToken, + HIDE_NOT_ALWAYS, + null, + reason, + true /*async */); + } } } -- GitLab From 5d48fe60dea193dee5caded559a6735d2cbd4cf2 Mon Sep 17 00:00:00 2001 From: Olivier St-Onge Date: Wed, 23 Oct 2024 11:03:40 -0400 Subject: [PATCH 303/459] Cleanup unused icon labels shared preferences Icon labels are displayed for available tiles in Edit mode Test: manually Flag: com.android.systemui.qs_ui_refactor_compose_fragment Fixes: 369357366 Change-Id: I5612f804c4d0069a607f73ffe791db843a059808 --- .../IconLabelVisibilityInteractorTest.kt | 90 ------------------- .../systemui/qs/panels/dagger/PanelsModule.kt | 7 -- .../IconLabelVisibilityInteractor.kt | 60 ------------- .../interactor/QSPreferencesInteractor.kt | 5 -- .../viewmodel/IconLabelVisibilityViewModel.kt | 41 --------- .../ui/viewmodel/PaginatedGridViewModel.kt | 6 +- .../IconLabelVisibilityInteractorKosmos.kt | 30 ------- .../IconLabelVisibilityViewModelKosmos.kt | 23 ----- .../viewmodel/PaginatedGridViewModelKosmos.kt | 1 - 9 files changed, 1 insertion(+), 262 deletions(-) delete mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorTest.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractor.kt delete mode 100644 packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModel.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorKosmos.kt delete mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModelKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorTest.kt deleted file mode 100644 index 7ad904e9b436..000000000000 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorTest.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * 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.qs.panels.domain.interactor - -import android.content.pm.UserInfo -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import com.android.systemui.kosmos.testScope -import com.android.systemui.testKosmos -import com.android.systemui.user.data.repository.fakeUserRepository -import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.test.runCurrent -import kotlinx.coroutines.test.runTest -import org.junit.Before -import org.junit.Test -import org.junit.runner.RunWith - -@OptIn(ExperimentalCoroutinesApi::class) -@SmallTest -@RunWith(AndroidJUnit4::class) -class IconLabelVisibilityInteractorTest : SysuiTestCase() { - private val kosmos = testKosmos() - private val underTest = with(kosmos) { iconLabelVisibilityInteractor } - - @Before - fun setUp() { - with(kosmos) { fakeUserRepository.setUserInfos(USERS) } - } - - @Test - fun changingShowLabels_receivesCorrectShowLabels() = - with(kosmos) { - testScope.runTest { - val showLabels by collectLastValue(underTest.showLabels) - - underTest.setShowLabels(false) - runCurrent() - assertThat(showLabels).isFalse() - - underTest.setShowLabels(true) - runCurrent() - assertThat(showLabels).isTrue() - } - } - - @Test - fun changingUser_receivesCorrectShowLabels() = - with(kosmos) { - testScope.runTest { - val showLabels by collectLastValue(underTest.showLabels) - - fakeUserRepository.setSelectedUserInfo(PRIMARY_USER) - underTest.setShowLabels(false) - runCurrent() - assertThat(showLabels).isFalse() - - fakeUserRepository.setSelectedUserInfo(ANOTHER_USER) - underTest.setShowLabels(true) - runCurrent() - assertThat(showLabels).isTrue() - - fakeUserRepository.setSelectedUserInfo(PRIMARY_USER) - runCurrent() - assertThat(showLabels).isFalse() - } - } - - companion object { - private val PRIMARY_USER = UserInfo(0, "user 0", UserInfo.FLAG_MAIN) - private val ANOTHER_USER = UserInfo(1, "user 1", UserInfo.FLAG_FULL) - private val USERS = listOf(PRIMARY_USER, ANOTHER_USER) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt index ef30cbfd55e5..43fd0f5feec7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/dagger/PanelsModule.kt @@ -33,8 +33,6 @@ import com.android.systemui.qs.panels.ui.compose.GridLayout import com.android.systemui.qs.panels.ui.compose.PaginatableGridLayout import com.android.systemui.qs.panels.ui.compose.PaginatedGridLayout import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout -import com.android.systemui.qs.panels.ui.viewmodel.IconLabelVisibilityViewModel -import com.android.systemui.qs.panels.ui.viewmodel.IconLabelVisibilityViewModelImpl import com.android.systemui.qs.panels.ui.viewmodel.IconTilesViewModel import com.android.systemui.qs.panels.ui.viewmodel.IconTilesViewModelImpl import com.android.systemui.qs.panels.ui.viewmodel.QSColumnsSizeViewModelImpl @@ -62,11 +60,6 @@ interface PanelsModule { @Binds fun bindQSColumnsViewModel(impl: QSColumnsSizeViewModelImpl): QSColumnsViewModel - @Binds - fun bindIconLabelVisibilityViewModel( - impl: IconLabelVisibilityViewModelImpl - ): IconLabelVisibilityViewModel - @Binds @PaginatedBaseLayoutType fun bindPaginatedBaseGridLayout(impl: InfiniteGridLayout): PaginatableGridLayout diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractor.kt deleted file mode 100644 index fe4012787394..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractor.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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.qs.panels.domain.interactor - -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.dagger.qualifiers.Application -import com.android.systemui.log.LogBuffer -import com.android.systemui.log.core.LogLevel -import com.android.systemui.qs.panels.shared.model.PanelsLog -import javax.inject.Inject -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.flow.SharingStarted -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.stateIn - -@SysUISingleton -class IconLabelVisibilityInteractor -@Inject -constructor( - private val preferencesInteractor: QSPreferencesInteractor, - @PanelsLog private val logBuffer: LogBuffer, - @Application scope: CoroutineScope, -) { - val showLabels: StateFlow = - preferencesInteractor.showLabels - .onEach { logChange(it) } - .stateIn(scope, SharingStarted.WhileSubscribed(), false) - - fun setShowLabels(showLabels: Boolean) { - preferencesInteractor.setShowLabels(showLabels) - } - - private fun logChange(showLabels: Boolean) { - logBuffer.log( - LOG_BUFFER_ICON_TILE_LABEL_VISIBILITY_CHANGE_TAG, - LogLevel.DEBUG, - { bool1 = showLabels }, - { "Icon tile label visibility changed: $bool1" } - ) - } - - private companion object { - const val LOG_BUFFER_ICON_TILE_LABEL_VISIBILITY_CHANGE_TAG = "IconLabelVisibilityChange" - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSPreferencesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSPreferencesInteractor.kt index 854e23f16a13..22543b12b93c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSPreferencesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/domain/interactor/QSPreferencesInteractor.kt @@ -24,13 +24,8 @@ import kotlinx.coroutines.flow.Flow @SysUISingleton class QSPreferencesInteractor @Inject constructor(private val repo: QSPreferencesRepository) { - val showLabels: Flow = repo.showLabels val largeTilesSpecs: Flow> = repo.largeTilesSpecs - fun setShowLabels(showLabels: Boolean) { - repo.setShowLabels(showLabels) - } - fun setLargeTilesSpecs(specs: Set) { repo.setLargeTilesSpecs(specs) } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModel.kt deleted file mode 100644 index 12cbde2cbc91..000000000000 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModel.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.qs.panels.ui.viewmodel - -import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.qs.panels.domain.interactor.IconLabelVisibilityInteractor -import javax.inject.Inject -import kotlinx.coroutines.flow.StateFlow - -interface IconLabelVisibilityViewModel { - val showLabels: StateFlow - - fun setShowLabels(showLabels: Boolean) -} - -@SysUISingleton -class IconLabelVisibilityViewModelImpl -@Inject -constructor( - private val interactor: IconLabelVisibilityInteractor, -) : IconLabelVisibilityViewModel { - override val showLabels: StateFlow = interactor.showLabels - - override fun setShowLabels(showLabels: Boolean) { - interactor.setShowLabels(showLabels) - } -} diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt index 78212b2ac3cc..0f7dafcd941c 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModel.kt @@ -30,13 +30,9 @@ class PaginatedGridViewModel constructor( iconTilesViewModel: IconTilesViewModel, gridSizeViewModel: QSColumnsViewModel, - iconLabelVisibilityViewModel: IconLabelVisibilityViewModel, paginatedGridInteractor: PaginatedGridInteractor, @Application applicationScope: CoroutineScope, -) : - IconTilesViewModel by iconTilesViewModel, - QSColumnsViewModel by gridSizeViewModel, - IconLabelVisibilityViewModel by iconLabelVisibilityViewModel { +) : IconTilesViewModel by iconTilesViewModel, QSColumnsViewModel by gridSizeViewModel { val rows = paginatedGridInteractor.rows.stateIn( applicationScope, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorKosmos.kt deleted file mode 100644 index 954084b874a0..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/IconLabelVisibilityInteractorKosmos.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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.qs.panels.domain.interactor - -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.kosmos.applicationCoroutineScope -import com.android.systemui.log.core.FakeLogBuffer - -val Kosmos.iconLabelVisibilityInteractor by - Kosmos.Fixture { - IconLabelVisibilityInteractor( - qsPreferencesInteractor, - FakeLogBuffer.Factory.create(), - applicationCoroutineScope - ) - } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModelKosmos.kt deleted file mode 100644 index daf6087c2d6f..000000000000 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/IconLabelVisibilityViewModelKosmos.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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.qs.panels.ui.viewmodel - -import com.android.systemui.kosmos.Kosmos -import com.android.systemui.qs.panels.domain.interactor.iconLabelVisibilityInteractor - -val Kosmos.iconLabelVisibilityViewModel by - Kosmos.Fixture { IconLabelVisibilityViewModelImpl(iconLabelVisibilityInteractor) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt index 10d8e1e22487..48ef57e9a62c 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/PaginatedGridViewModelKosmos.kt @@ -25,7 +25,6 @@ val Kosmos.paginatedGridViewModel by PaginatedGridViewModel( iconTilesViewModel, qsColumnsViewModel, - iconLabelVisibilityViewModel, paginatedGridInteractor, applicationCoroutineScope, ) -- GitLab From 2c8511ece10c8441a3ed9b44aa6473cc59fe8255 Mon Sep 17 00:00:00 2001 From: Kevin Jeon Date: Mon, 21 Oct 2024 17:56:28 -0400 Subject: [PATCH 304/459] Make tiered cached adj UI tier size configurable This change makes the UI tier size configurable through overlays. By default, the UI tier can contain 10 processes. Test: - atest MockingOomAdjusterTests - device_config put activity_manager tiered_cached_adj_ui_tier_size, followed by dumpsys activity settings to check that the size was updated - build with a device-specific config to check that the size is non-default Bug: 373863708 Bug: 374541382 Flag: com.android.server.am.oomadjuster_cached_app_tiers Change-Id: Iadca88f79c232a8fb5f6a5a69807a30029bb8a8c --- core/res/res/values/config.xml | 3 ++ core/res/res/values/symbols.xml | 3 ++ .../server/am/ActivityManagerConstants.java | 20 +++++++++++ .../com/android/server/am/OomAdjuster.java | 14 ++++---- .../server/am/MockingOomAdjusterTests.java | 36 ++++++++++--------- 5 files changed, 54 insertions(+), 22 deletions(-) diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index 41981715a855..454db21ee3ae 100644 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -7054,6 +7054,9 @@ RSS is being collected instead. --> 1.5 + + 10 + false diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index b4249557b4c9..e784e7521a9e 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -5498,6 +5498,9 @@ + + + diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java index 65a2c187f1c8..4944cafeb83d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerConstants.java +++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java @@ -163,6 +163,7 @@ final class ActivityManagerConstants extends ContentObserver { static final String KEY_USE_TIERED_CACHED_ADJ = "use_tiered_cached_adj"; static final String KEY_TIERED_CACHED_ADJ_DECAY_TIME = "tiered_cached_adj_decay_time"; + static final String KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE = "tiered_cached_adj_ui_tier_size"; /** * Whether or not to enable the new oom adjuster implementation. @@ -248,6 +249,8 @@ final class ActivityManagerConstants extends ContentObserver { private static final boolean DEFAULT_USE_TIERED_CACHED_ADJ = Flags.oomadjusterCachedAppTiers(); private static final long DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME = 60 * 1000; + private static final int TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE = 50; + private final int mDefaultTieredCachedAdjUiTierSize; /** * The default value to {@link #KEY_ENABLE_NEW_OOMADJ}. @@ -1154,6 +1157,9 @@ final class ActivityManagerConstants extends ContentObserver { /** @see #KEY_TIERED_CACHED_ADJ_DECAY_TIME */ public long TIERED_CACHED_ADJ_DECAY_TIME = DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME; + /** @see #KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE */ + public int TIERED_CACHED_ADJ_UI_TIER_SIZE; + /** @see #KEY_ENABLE_NEW_OOMADJ */ public boolean ENABLE_NEW_OOMADJ = DEFAULT_ENABLE_NEW_OOM_ADJ; @@ -1363,6 +1369,7 @@ final class ActivityManagerConstants extends ContentObserver { break; case KEY_USE_TIERED_CACHED_ADJ: case KEY_TIERED_CACHED_ADJ_DECAY_TIME: + case KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE: updateUseTieredCachedAdj(); break; case KEY_DISABLE_APP_PROFILER_PSS_PROFILING: @@ -1466,6 +1473,11 @@ final class ActivityManagerConstants extends ContentObserver { mDefaultPssToRssThresholdModifier = context.getResources().getFloat( com.android.internal.R.dimen.config_am_pssToRssThresholdModifier); PSS_TO_RSS_THRESHOLD_MODIFIER = mDefaultPssToRssThresholdModifier; + + mDefaultTieredCachedAdjUiTierSize = context.getResources().getInteger( + com.android.internal.R.integer.config_am_tieredCachedAdjUiTierSize); + TIERED_CACHED_ADJ_UI_TIER_SIZE = Math.min( + mDefaultTieredCachedAdjUiTierSize, TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE); } public void start(ContentResolver resolver) { @@ -2255,6 +2267,12 @@ final class ActivityManagerConstants extends ContentObserver { DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, KEY_TIERED_CACHED_ADJ_DECAY_TIME, DEFAULT_TIERED_CACHED_ADJ_DECAY_TIME); + TIERED_CACHED_ADJ_UI_TIER_SIZE = Math.min( + DeviceConfig.getInt( + DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE, + mDefaultTieredCachedAdjUiTierSize), + TIERED_CACHED_ADJ_MAX_UI_TIER_SIZE); } private void updateEnableNewOomAdj() { @@ -2510,6 +2528,8 @@ final class ActivityManagerConstants extends ContentObserver { pw.print("="); pw.println(USE_TIERED_CACHED_ADJ); pw.print(" "); pw.print(KEY_TIERED_CACHED_ADJ_DECAY_TIME); pw.print("="); pw.println(TIERED_CACHED_ADJ_DECAY_TIME); + pw.print(" "); pw.print(KEY_TIERED_CACHED_ADJ_UI_TIER_SIZE); + pw.print("="); pw.println(TIERED_CACHED_ADJ_UI_TIER_SIZE); pw.print(" "); pw.print(KEY_ENABLE_NEW_OOMADJ); pw.print("="); pw.println(ENABLE_NEW_OOMADJ); diff --git a/services/core/java/com/android/server/am/OomAdjuster.java b/services/core/java/com/android/server/am/OomAdjuster.java index 70517145575a..8d16eb5fc95a 100644 --- a/services/core/java/com/android/server/am/OomAdjuster.java +++ b/services/core/java/com/android/server/am/OomAdjuster.java @@ -1149,6 +1149,8 @@ public class OomAdjuster { if (mConstants.USE_TIERED_CACHED_ADJ) { final long now = mInjector.getUptimeMillis(); int uiTargetAdj = 10; + // mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE is 10 by default, but is configurable. + final int uiTierMaxAdj = 10 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE; for (int i = numLru - 1; i >= 0; i--) { ProcessRecord app = lruList.get(i); final ProcessStateRecord state = app.mState; @@ -1162,17 +1164,17 @@ public class OomAdjuster { if (opt != null && opt.isFreezeExempt()) { // BIND_WAIVE_PRIORITY and the like get oom_adj 900 targetAdj += 0; - } else if (state.hasShownUi() && uiTargetAdj < 20) { - // The most recent 10 apps that have shown UI get 910-919 + } else if (state.hasShownUi() && uiTargetAdj < uiTierMaxAdj) { + // The most recent UI-showing apps get [910, 910 + ui tier size). targetAdj += uiTargetAdj++; } else if ((state.getSetAdj() >= CACHED_APP_MIN_ADJ) && (state.getLastStateTime() + mConstants.TIERED_CACHED_ADJ_DECAY_TIME) < now) { - // Older cached apps get 950 - targetAdj += 50; + // Older cached apps get 940 + ui tier size (950 by default). + targetAdj += 40 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE; } else { - // Newer cached apps get 920 - targetAdj += 20; + // Newer cached apps get 910 + ui tier size (920 by default). + targetAdj += 10 + mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE; } state.setCurRawAdj(targetAdj); state.setCurAdj(psr.modifyRawOomAdj(targetAdj)); diff --git a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java index 250c2f93e70e..6ab72cd33042 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/MockingOomAdjusterTests.java @@ -167,8 +167,6 @@ public class MockingOomAdjusterTests { private static int sFirstCachedAdj = ProcessList.CACHED_APP_MIN_ADJ + ProcessList.CACHED_APP_IMPORTANCE_LEVELS; private static int sFirstUiCachedAdj = ProcessList.CACHED_APP_MIN_ADJ + 10; - private static int sFirstNonUiCachedAdj = ProcessList.CACHED_APP_MIN_ADJ + 20; - private static int sUiTierSize = 10; private Context mContext; private ProcessStateController mProcessStateController; @@ -177,6 +175,9 @@ public class MockingOomAdjusterTests { private ActivityManagerService mService; private OomAdjusterInjector mInjector = new OomAdjusterInjector(); + private int mUiTierSize; + private int mFirstNonUiCachedAdj; + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); @@ -247,6 +248,9 @@ public class MockingOomAdjusterTests { mService.mOomAdjuster.mAdjSeq = 10000; mService.mWakefulness = new AtomicInteger(PowerManagerInternal.WAKEFULNESS_AWAKE); mSetFlagsRule.enableFlags(Flags.FLAG_NEW_FGS_RESTRICTION_LOGIC); + + mUiTierSize = mService.mConstants.TIERED_CACHED_ADJ_UI_TIER_SIZE; + mFirstNonUiCachedAdj = sFirstUiCachedAdj + mUiTierSize; } @SuppressWarnings("GuardedBy") @@ -927,8 +931,8 @@ public class MockingOomAdjusterTests { final int mruIndex = numberOfApps - i - 1; int expectedAdj; if (mService.mConstants.USE_TIERED_CACHED_ADJ) { - expectedAdj = (i < numberOfApps - sUiTierSize) - ? sFirstNonUiCachedAdj : sFirstUiCachedAdj + mruIndex; + expectedAdj = (i < numberOfApps - mUiTierSize) + ? mFirstNonUiCachedAdj : sFirstUiCachedAdj + mruIndex; } else { expectedAdj = CACHED_APP_MIN_ADJ + (mruIndex * 2 * CACHED_APP_IMPORTANCE_LEVELS); if (expectedAdj > CACHED_APP_MAX_ADJ) { @@ -1108,7 +1112,7 @@ public class MockingOomAdjusterTests { updateOomAdj(app); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND); } @@ -1545,7 +1549,7 @@ public class MockingOomAdjusterTests { updateOomAdj(app); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND); } @@ -1563,7 +1567,7 @@ public class MockingOomAdjusterTests { updateOomAdj(app, client); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND); } @@ -1694,7 +1698,7 @@ public class MockingOomAdjusterTests { mProcessStateController.runFollowUpUpdate(); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND, "cch-empty"); // Follow up should not have been called again. @@ -2741,7 +2745,7 @@ public class MockingOomAdjusterTests { final int userOther = 1; // cachedAdj1 and cachedAdj2 will be read if USE_TIERED_CACHED_ADJ is disabled. Otherwise, - // sFirstUiCachedAdj and sFirstNonUiCachedAdj are used instead. + // sFirstUiCachedAdj and mFirstNonUiCachedAdj are used instead. final int cachedAdj1 = CACHED_APP_MIN_ADJ + CACHED_APP_IMPORTANCE_LEVELS; final int cachedAdj2 = cachedAdj1 + CACHED_APP_IMPORTANCE_LEVELS * 2; doReturn(userOwner).when(mService.mUserController).getCurrentUserId(); @@ -2789,7 +2793,7 @@ public class MockingOomAdjusterTests { mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstUiCachedAdj : cachedAdj1, SCHED_GROUP_BACKGROUND, "cch-started-ui-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, - mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj2, + mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj2, SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); @@ -2809,7 +2813,7 @@ public class MockingOomAdjusterTests { updateOomAdj(); assertProcStates(app, PROCESS_STATE_SERVICE, - mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, + mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1, SCHED_GROUP_BACKGROUND, "cch-started-services", true); mProcessStateController.stopService(app.mServices, s); @@ -2831,7 +2835,7 @@ public class MockingOomAdjusterTests { assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); assertProcStates(app2, PROCESS_STATE_SERVICE, - mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, + mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1, SCHED_GROUP_BACKGROUND, "cch-started-services", true); app.mState.setSetProcState(PROCESS_STATE_NONEXISTENT); @@ -2845,7 +2849,7 @@ public class MockingOomAdjusterTests { assertProcStates(app, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); assertProcStates(app2, PROCESS_STATE_SERVICE, - mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, + mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1, SCHED_GROUP_BACKGROUND, "cch-started-services", true); doReturn(userOther).when(mService.mUserController).getCurrentUserId(); @@ -2853,7 +2857,7 @@ public class MockingOomAdjusterTests { updateOomAdj(); assertProcStates(app, PROCESS_STATE_SERVICE, - mService.mConstants.USE_TIERED_CACHED_ADJ ? sFirstNonUiCachedAdj : cachedAdj1, + mService.mConstants.USE_TIERED_CACHED_ADJ ? mFirstNonUiCachedAdj : cachedAdj1, SCHED_GROUP_BACKGROUND, "cch-started-services", true); assertProcStates(app2, PROCESS_STATE_SERVICE, SERVICE_ADJ, SCHED_GROUP_BACKGROUND, "started-services", false); @@ -3157,7 +3161,7 @@ public class MockingOomAdjusterTests { mProcessStateController.runFollowUpUpdate(); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app, PROCESS_STATE_SERVICE, expectedAdj, SCHED_GROUP_BACKGROUND, "cch-started-services"); // Follow up should not have been called again. @@ -3192,7 +3196,7 @@ public class MockingOomAdjusterTests { mProcessStateController.runFollowUpUpdate(); final int expectedAdj = mService.mConstants.USE_TIERED_CACHED_ADJ - ? sFirstNonUiCachedAdj : sFirstCachedAdj; + ? mFirstNonUiCachedAdj : sFirstCachedAdj; assertProcStates(app1, PROCESS_STATE_CACHED_EMPTY, expectedAdj, SCHED_GROUP_BACKGROUND, "cch-empty"); -- GitLab From 9bd93474747d58d4271718b40df9b2e61465da92 Mon Sep 17 00:00:00 2001 From: Jordan Demeulenaere Date: Wed, 23 Oct 2024 17:15:09 +0200 Subject: [PATCH 305/459] Support contents (overlays) in ElementStateScope Bug: 373799480 Test: N/A Flag: com.android.systemui.scene_container Change-Id: I65bedb3fb4972a7e237e318298a8c148684ed1fa --- .../animation/scene/SceneTransitionLayout.kt | 19 ++++++++++--------- .../scene/SceneTransitionLayoutImpl.kt | 7 ++++++- .../scene/UserActionDistanceScopeImpl.kt | 12 ++++++------ 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt index c9a4d5808cac..504240390674 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayout.kt @@ -127,22 +127,23 @@ interface SceneTransitionLayoutScope { /** A scope that can be used to query the target state of an element or scene. */ interface ElementStateScope { /** - * Return the *target* size of [this] element in the given [scene], i.e. the size of the element - * when idle, or `null` if the element is not composed and measured in that scene (yet). + * Return the *target* size of [this] element in the given [content], i.e. the size of the + * element when idle, or `null` if the element is not composed and measured in that content + * (yet). */ - fun ElementKey.targetSize(scene: SceneKey): IntSize? + fun ElementKey.targetSize(content: ContentKey): IntSize? /** - * Return the *target* offset of [this] element in the given [scene], i.e. the size of the - * element when idle, or `null` if the element is not composed and placed in that scene (yet). + * Return the *target* offset of [this] element in the given [content], i.e. the size of the + * element when idle, or `null` if the element is not composed and placed in that content (yet). */ - fun ElementKey.targetOffset(scene: SceneKey): Offset? + fun ElementKey.targetOffset(content: ContentKey): Offset? /** - * Return the *target* size of [this] scene, i.e. the size of the scene when idle, or `null` if - * the scene was never composed. + * Return the *target* size of [this] content, i.e. the size of the content when idle, or `null` + * if the content was not composed (yet). */ - fun SceneKey.targetSize(): IntSize? + fun ContentKey.targetSize(): IntSize? } @Stable diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt index 65c404387734..d58d3f24862f 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/SceneTransitionLayoutImpl.kt @@ -172,7 +172,12 @@ internal class SceneTransitionLayoutImpl( return scenes[key] ?: error("Scene $key is not configured") } - internal fun sceneOrNull(key: SceneKey): Scene? = scenes[key] + internal fun contentOrNull(key: ContentKey): Content? { + return when (key) { + is SceneKey -> scenes[key] + is OverlayKey -> overlays[key] + } + } internal fun overlay(key: OverlayKey): Overlay { return overlays[key] ?: error("Overlay $key is not configured") diff --git a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/UserActionDistanceScopeImpl.kt b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/UserActionDistanceScopeImpl.kt index b7fa0d497200..690c809aa56d 100644 --- a/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/UserActionDistanceScopeImpl.kt +++ b/packages/SystemUI/compose/scene/src/com/android/compose/animation/scene/UserActionDistanceScopeImpl.kt @@ -21,20 +21,20 @@ import androidx.compose.ui.unit.IntSize internal class ElementStateScopeImpl(private val layoutImpl: SceneTransitionLayoutImpl) : ElementStateScope { - override fun ElementKey.targetSize(scene: SceneKey): IntSize? { - return layoutImpl.elements[this]?.stateByContent?.get(scene)?.targetSize.takeIf { + override fun ElementKey.targetSize(content: ContentKey): IntSize? { + return layoutImpl.elements[this]?.stateByContent?.get(content)?.targetSize.takeIf { it != Element.SizeUnspecified } } - override fun ElementKey.targetOffset(scene: SceneKey): Offset? { - return layoutImpl.elements[this]?.stateByContent?.get(scene)?.targetOffset.takeIf { + override fun ElementKey.targetOffset(content: ContentKey): Offset? { + return layoutImpl.elements[this]?.stateByContent?.get(content)?.targetOffset.takeIf { it != Offset.Unspecified } } - override fun SceneKey.targetSize(): IntSize? { - return layoutImpl.sceneOrNull(this)?.targetSize.takeIf { it != IntSize.Zero } + override fun ContentKey.targetSize(): IntSize? { + return layoutImpl.contentOrNull(this)?.targetSize.takeIf { it != IntSize.Zero } } } -- GitLab From 0248b5c81e77966bb8ffbac498a60f2bfd6c00c5 Mon Sep 17 00:00:00 2001 From: Jeff DeCew Date: Wed, 9 Oct 2024 15:54:08 +0000 Subject: [PATCH 306/459] NotifCollection.dismissNotifications will now remove hidden summaries. Previously we would take the list of notifications exactly, but that left room that a notification's summary, if it was not included in the list, would be left in the shade. We now check if each entry is the sole logic child of a single summary, and if so we include that summary in the dismissal (assuming it was not already included), and generate the necessary stats object. Bug: 355967751 Flag: com.android.systemui.notifications_dismiss_pruned_summaries Test: atest NotifCollectionTest Change-Id: Id3eda2f7a36227e4d5a921888735dd898d33a61a --- packages/SystemUI/aconfig/systemui.aconfig | 7 +++ .../collection/NotifCollection.java | 57 +++++++++++++++---- .../collection/NotifCollectionTest.java | 44 +++++++++++++- 3 files changed, 97 insertions(+), 11 deletions(-) diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 1c29db128a8c..2047919eb9f8 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -128,6 +128,13 @@ flag { bug: "308623704" } +flag { + name: "notifications_dismiss_pruned_summaries" + namespace: "systemui" + description: "NotifCollection.dismissNotifications will now dismiss summaries that are pruned from the shade." + bug: "355967751" +} + flag { name: "notification_transparent_header_fix" namespace: "systemui" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java index 7b3a93a4a094..b5c6c252e50f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotifCollection.java @@ -39,6 +39,7 @@ import static android.service.notification.NotificationListenerService.REASON_TI import static android.service.notification.NotificationListenerService.REASON_UNAUTOBUNDLED; import static android.service.notification.NotificationListenerService.REASON_USER_STOPPED; +import static com.android.systemui.Flags.notificationsDismissPrunedSummaries; import static com.android.systemui.statusbar.notification.NotificationUtils.logKey; import static com.android.systemui.statusbar.notification.collection.NotificationEntry.DismissState.DISMISSED; import static com.android.systemui.statusbar.notification.collection.NotificationEntry.DismissState.NOT_DISMISSED; @@ -69,6 +70,7 @@ import androidx.annotation.Nullable; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.statusbar.IStatusBarService; +import com.android.internal.statusbar.NotificationVisibility; import com.android.systemui.Dumpable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Background; @@ -111,6 +113,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; @@ -277,6 +280,10 @@ public class NotifCollection implements Dumpable, PipelineDumpable { Assert.isMainThread(); checkForReentrantCall(); + if (notificationsDismissPrunedSummaries()) { + entriesToDismiss = includeSummariesToDismiss(entriesToDismiss); + } + final int entryCount = entriesToDismiss.size(); final List entriesToLocallyDismiss = new ArrayList<>(); for (int i = 0; i < entriesToDismiss.size(); i++) { @@ -336,6 +343,36 @@ public class NotifCollection implements Dumpable, PipelineDumpable { dispatchEventsAndRebuildList("dismissNotifications"); } + private List> includeSummariesToDismiss( + List> entriesToDismiss) { + final HashSet entriesSet = new HashSet<>(entriesToDismiss.size()); + for (Pair entryToStats : entriesToDismiss) { + entriesSet.add(entryToStats.first); + } + + final List> entriesPlusSummaries = + new ArrayList<>(entriesToDismiss.size() + 1); + for (Pair entryToStats : entriesToDismiss) { + entriesPlusSummaries.add(entryToStats); + NotificationEntry summary = fetchSummaryToDismiss(entryToStats.first); + if (summary != null && !entriesSet.contains(summary)) { + DismissedByUserStats currentStats = entryToStats.second; + NotificationVisibility summaryVisibility = NotificationVisibility.obtain( + summary.getKey(), + summary.getRanking().getRank(), + currentStats.notificationVisibility.count, + /* visible= */ false); + DismissedByUserStats summaryStats = new DismissedByUserStats( + currentStats.dismissalSurface, + currentStats.dismissalSentiment, + summaryVisibility + ); + entriesPlusSummaries.add(new Pair<>(summary, summaryStats)); + } + } + return entriesPlusSummaries; + } + /** * Dismisses a single notification on behalf of the user. */ @@ -1062,6 +1099,16 @@ public class NotifCollection implements Dumpable, PipelineDumpable { } } + @Nullable + private NotificationEntry fetchSummaryToDismiss(NotificationEntry entry) { + if (isOnlyChildInGroup(entry)) { + String group = entry.getSbn().getGroupKey(); + NotificationEntry summary = getGroupSummary(group); + if (summary != null && isDismissable(summary)) return summary; + } + return null; + } + /** A single method interface that callers can pass in when registering future dismissals */ public interface DismissedByUserStatsCreator { DismissedByUserStats createDismissedByUserStats(NotificationEntry entry); @@ -1092,16 +1139,6 @@ public class NotifCollection implements Dumpable, PipelineDumpable { + ">"; } - @Nullable - private NotificationEntry fetchSummaryToDismiss(NotificationEntry entry) { - if (isOnlyChildInGroup(entry)) { - String group = entry.getSbn().getGroupKey(); - NotificationEntry summary = getGroupSummary(group); - if (summary != null && isDismissable(summary)) return summary; - } - return null; - } - /** called when the entry has been removed from the collection */ public void onSystemServerCancel(@CancellationReason int cancellationReason) { Assert.isMainThread(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java index 2cf599a99c63..3893c9b05bd3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/collection/NotifCollectionTest.java @@ -45,6 +45,7 @@ import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.clearInvocations; +import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.inOrder; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -63,6 +64,7 @@ import android.app.NotificationChannel; import android.app.NotificationManager; import android.os.Handler; import android.os.RemoteException; +import android.platform.test.annotations.EnableFlags; import android.service.notification.NotificationListenerService.Ranking; import android.service.notification.NotificationListenerService.RankingMap; import android.service.notification.StatusBarNotification; @@ -77,6 +79,7 @@ import androidx.test.filters.SmallTest; import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.NotificationVisibility; +import com.android.systemui.Flags; import com.android.systemui.SysuiTestCase; import com.android.systemui.dump.DumpManager; import com.android.systemui.dump.LogBufferEulogizer; @@ -129,6 +132,7 @@ public class NotifCollectionTest extends SysuiTestCase { @Mock private GroupCoalescer mGroupCoalescer; @Spy private RecordingCollectionListener mCollectionListener; @Mock private CollectionReadyForBuildListener mBuildListener; + @Mock private NotificationDismissibilityProvider mDismissibilityProvider; @Spy private RecordingLifetimeExtender mExtender1 = new RecordingLifetimeExtender("Extender1"); @Spy private RecordingLifetimeExtender mExtender2 = new RecordingLifetimeExtender("Extender2"); @@ -160,6 +164,7 @@ public class NotifCollectionTest extends SysuiTestCase { allowTestableLooperAsMainThread(); when(mEulogizer.record(any(Exception.class))).thenAnswer(i -> i.getArguments()[0]); + doReturn(Boolean.TRUE).when(mDismissibilityProvider).isDismissable(any()); mListenerInOrder = inOrder(mCollectionListener); @@ -172,7 +177,7 @@ public class NotifCollectionTest extends SysuiTestCase { mBgExecutor, mEulogizer, mock(DumpManager.class), - mock(NotificationDismissibilityProvider.class)); + mDismissibilityProvider); mCollection.attach(mGroupCoalescer); mCollection.addCollectionListener(mCollectionListener); mCollection.setBuildListener(mBuildListener); @@ -1378,6 +1383,43 @@ public class NotifCollectionTest extends SysuiTestCase { assertEquals(List.of(mInterceptor1, mInterceptor2), entry2.mDismissInterceptors); } + @Test + @EnableFlags(Flags.FLAG_NOTIFICATIONS_DISMISS_PRUNED_SUMMARIES) + public void testDismissNotificationsIncludesPrunedParents() { + // GIVEN a collection with 2 groups; one has a single child, one has two. + mCollection.addNotificationDismissInterceptor(mInterceptor1); + + NotifEvent notif1summary = mNoMan.postNotif( + buildNotif(TEST_PACKAGE, 1, "notif1summary").setGroup(mContext, "group1") + .setGroupSummary(mContext, true)); + NotifEvent notif1child = mNoMan.postNotif( + buildNotif(TEST_PACKAGE, 1, "notif1child").setGroup(mContext, "group1")); + NotifEvent notif2summary = mNoMan.postNotif( + buildNotif(TEST_PACKAGE2, 2, "notif2summary").setGroup(mContext, "group2") + .setGroupSummary(mContext, true)); + NotifEvent notif2child1 = mNoMan.postNotif( + buildNotif(TEST_PACKAGE2, 2, "notif2child1").setGroup(mContext, "group2")); + NotifEvent notif2child2 = mNoMan.postNotif( + buildNotif(TEST_PACKAGE2, 2, "notif2child2").setGroup(mContext, "group2")); + NotificationEntry entry1summary = mCollectionListener.getEntry(notif1summary.key); + NotificationEntry entry1child = mCollectionListener.getEntry(notif1child.key); + NotificationEntry entry2summary = mCollectionListener.getEntry(notif2summary.key); + NotificationEntry entry2child1 = mCollectionListener.getEntry(notif2child1.key); + NotificationEntry entry2child2 = mCollectionListener.getEntry(notif2child2.key); + + // WHEN one child from each group are manually dismissed together + mCollection.dismissNotifications( + List.of(new Pair<>(entry1child, defaultStats(entry1child)), + new Pair<>(entry2child1, defaultStats(entry2child1)))); + + // THEN the summary for the singleton child is dismissed, but not the other summary + verify(mInterceptor1).shouldInterceptDismissal(entry1summary); + verify(mInterceptor1).shouldInterceptDismissal(entry1child); + verify(mInterceptor1, never()).shouldInterceptDismissal(entry2summary); + verify(mInterceptor1).shouldInterceptDismissal(entry2child1); + verify(mInterceptor1, never()).shouldInterceptDismissal(entry2child2); + } + @Test public void testDismissAllNotificationsCallsRebuildOnce() { // GIVEN a collection with a couple notifications -- GitLab From d546921745510b926bb138db6b2207e083e17682 Mon Sep 17 00:00:00 2001 From: Alina Zaidi Date: Wed, 23 Oct 2024 15:50:50 +0000 Subject: [PATCH 307/459] Correct status bar background on connected displays Test: Manually tested Bug: 373373792 Flag: EXEMPT minor bug fix Change-Id: I725dfd2dadbe36434b92540c90379929f003f26d --- .../phone/fragment/dagger/HomeStatusBarModule.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java index f6f8adb851e9..45c53b05d478 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/HomeStatusBarModule.java @@ -31,6 +31,7 @@ import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.PhoneStatusBarViewController; import com.android.systemui.statusbar.phone.StatusBarLocation; import com.android.systemui.statusbar.policy.Clock; +import com.android.systemui.statusbar.window.StatusBarWindowController; import com.android.systemui.statusbar.window.StatusBarWindowControllerStore; import dagger.Module; @@ -128,9 +129,8 @@ public interface HomeStatusBarModule { @HomeStatusBarScope static PhoneStatusBarTransitions providePhoneStatusBarTransitions( @RootView PhoneStatusBarView view, - StatusBarWindowControllerStore statusBarWindowControllerStore) { - return new PhoneStatusBarTransitions( - view, statusBarWindowControllerStore.getDefaultDisplay().getBackgroundView()); + StatusBarWindowController statusBarWindowController) { + return new PhoneStatusBarTransitions(view, statusBarWindowController.getBackgroundView()); } /** */ @@ -156,4 +156,12 @@ public interface HomeStatusBarModule { return store.forDisplay(displayId); } + /** */ + @Provides + @HomeStatusBarScope + static StatusBarWindowController provideWindowController( + @DisplaySpecific int displayId, StatusBarWindowControllerStore store) { + return store.forDisplay(displayId); + } + } -- GitLab From 83fec28f3d77444906583ae70d8e546a34870b66 Mon Sep 17 00:00:00 2001 From: Paul Lawrence Date: Wed, 23 Oct 2024 16:06:31 +0000 Subject: [PATCH 308/459] Set OWNERS of TradeInModeService.java to trade in mode team Test: none Bug: 307713521 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:3d0af44ddc3349c3c8235917a45eacb065fcca3f) Merged-In: I27c7407f50cffe3a73c9ca544e7209d938e257ea Change-Id: I27c7407f50cffe3a73c9ca544e7209d938e257ea --- services/core/java/com/android/server/OWNERS | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index 37dddc61a976..c15cf34b8955 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -48,3 +48,6 @@ per-file SystemConfig.java = file:/PACKAGE_MANAGER_OWNERS # CertBlocklister per-file Cert*.java = tweek@google.com, brambonne@google.com, prb@google.com, miguelaranda@google.com + +# TradeInMode +per-file TradeInModeService.java = dvander@google.com, paullawrence@google.com -- GitLab From ce9d5f919a7b509a089ff278ed9f57dca540aa9e Mon Sep 17 00:00:00 2001 From: heyoukang Date: Thu, 24 Oct 2024 00:17:21 +0800 Subject: [PATCH 309/459] fix RemoteView's content loss in some case in some case, constantly calling AppWidgetHostView.updateAppWidget(remoteView), it will create uncancellable AsyncApplyTask when prev AsyncApplyTask goes wrong which will cause RemoteView's content loss after next AsyncApplyTask finish. so make sure every AsyncApplyTask is cancellable Bug:375093288 Test: constantly refresh AppWidgetHostView, make sure RemoteView's content is visible Change-Id: I52e0d84b8a23c7383eee7163d814cfd8d885010a Signed-off-by: heyoukang --- core/java/android/appwidget/AppWidgetHostView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 1f19f817a0b3..5f61a9195209 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -713,8 +713,8 @@ public class AppWidgetHostView extends FrameLayout implements AppWidgetHost.AppW mCurrentSize); } else { applyContent(null, false, e); + mLastExecutionSignal = null; } - mLastExecutionSignal = null; } } -- GitLab From 7b3070e5f6ea7994aa6904e2675766f367147e00 Mon Sep 17 00:00:00 2001 From: Ioana Alexandru Date: Wed, 23 Oct 2024 17:57:00 +0200 Subject: [PATCH 310/459] Fix footer flashing on screen when HUN is dismissed When I fixed b/332430751, I made it so the stack scroll algorithm skips updating the footer in the transitory state when it's either the first view in the list, or we know the empty shade is also visible (to prevent it from flashing/jumping around on the screen during the transition). This had the unfortunate additional effect of not only skipping the positioning change, but also not setting the "hidden" bit on the viewState. So although the footer should be hidden, there's a transitory state while a HUN is dismissed (when it's the only notification) that causes the footer to briefly flash on the screen. We can't revert the fix I described above without re-introducing that bug, but what we can do is partially revert what it does - i.e. make sure we still update the viewState.hidden bit appropriately. This is safe to do, since this is what would've happened without that other fix anyway (sans the positioning updates). It fixes the HUN issue, and it doesn't re-introduce the jumping issue. Fix: 356552869 Test: post HUN while there are no other notifs, and dismiss it manually (footer doesn't flicker) Test: dismiss single notification in the shade (both manually and with clear all) - footer doesn't jump or flicker Flag: com.android.systemui.notifications_footer_visibility_fix Change-Id: Icf60e76f44846106dfe4b04b92729d5ce3c4225d --- packages/SystemUI/aconfig/systemui.aconfig | 10 ++++++++++ .../notification/stack/StackScrollAlgorithm.java | 13 ++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 426b24dfe070..324767d50a44 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -80,6 +80,16 @@ flag { bug: "294347738" } +flag { + name: "notifications_footer_visibility_fix" + namespace: "systemui" + description: "Fixes a bug where the footer would briefly appear when dismissing a HUN" + bug: "356552869" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "notifications_footer_view_refactor" namespace: "systemui" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java index 109f0ae41d76..b251b078826b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/StackScrollAlgorithm.java @@ -27,6 +27,7 @@ import android.view.ViewGroup; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.policy.SystemBarUtils; import com.android.keyguard.BouncerPanelExpansionCalculator; +import com.android.systemui.Flags; import com.android.systemui.animation.ShadeInterpolation; import com.android.systemui.res.R; import com.android.systemui.scene.shared.flag.SceneContainerFlag; @@ -467,10 +468,20 @@ public class StackScrollAlgorithm { if (v instanceof EmptyShadeView) { emptyShadeVisible = true; } - if (v instanceof FooterView) { + if (v instanceof FooterView footerView) { if (emptyShadeVisible || notGoneIndex == 0) { // if the empty shade is visible or the footer is the first visible // view, we're in a transitory state so let's leave the footer alone. + if (Flags.notificationsFooterVisibilityFix() + && !SceneContainerFlag.isEnabled()) { + // ...except for the hidden state, to prevent it from flashing on + // the screen (this piece is copied from updateChild, and is not + // necessary in flexiglass). + if (footerView.shouldBeHidden() + || !ambientState.isShadeExpanded()) { + footerView.getViewState().hidden = true; + } + } continue; } } -- GitLab From 33517b07adefba61640e395abea2da96f32d0c1d Mon Sep 17 00:00:00 2001 From: Parth Sane Date: Tue, 22 Oct 2024 16:13:08 +0000 Subject: [PATCH 311/459] Do not remove User Manager and AppOps from Java cache Test: v2/android-virtual-infra/avd/avd_boot_test Bug: 333854840 Flag: android.server.Flags.removeJavaServiceManagerCache Change-Id: I239eab54c744c0a04290ac17bda17c40e3a0c6bc --- .../java/com/android/server/am/ActivityManagerService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 4efe62c49213..f549c7b2d303 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -2884,23 +2884,24 @@ public class ActivityManagerService extends IActivityManager.Stub addServiceToMap(mAppBindArgs, Context.INPUT_METHOD_SERVICE); addServiceToMap(mAppBindArgs, Context.INPUT_SERVICE); addServiceToMap(mAppBindArgs, "graphicsstats"); - addServiceToMap(mAppBindArgs, Context.APP_OPS_SERVICE); addServiceToMap(mAppBindArgs, "content"); addServiceToMap(mAppBindArgs, Context.JOB_SCHEDULER_SERVICE); addServiceToMap(mAppBindArgs, Context.NOTIFICATION_SERVICE); addServiceToMap(mAppBindArgs, Context.VIBRATOR_SERVICE); addServiceToMap(mAppBindArgs, Context.ACCOUNT_SERVICE); addServiceToMap(mAppBindArgs, Context.POWER_SERVICE); - addServiceToMap(mAppBindArgs, Context.USER_SERVICE); addServiceToMap(mAppBindArgs, "mount"); addServiceToMap(mAppBindArgs, Context.PLATFORM_COMPAT_SERVICE); } // See b/79378449 // Getting the window service and package service binder from servicemanager // is blocked for Apps. However they are necessary for apps. + // Removing User Service and App Ops Service from cache breaks boot for auto. // TODO: remove exception + addServiceToMap(mAppBindArgs, Context.APP_OPS_SERVICE); addServiceToMap(mAppBindArgs, "package"); addServiceToMap(mAppBindArgs, Context.WINDOW_SERVICE); + addServiceToMap(mAppBindArgs, Context.USER_SERVICE); } return mAppBindArgs; } -- GitLab From a87bd83dc8e9bdaa7a1f513d1d70d03d430e4436 Mon Sep 17 00:00:00 2001 From: Eric Miao Date: Wed, 23 Oct 2024 09:59:17 -0700 Subject: [PATCH 312/459] Use readonly version of aconfig flag native_metrics Bug: 375072865 Flag: EXEMPT bugfix This has the same root cause as b/368409430. Use the readonly version of aconfig flag native_metrics, so there will be no I/O involved in Isolated Processes which do not have permission for I/O. Change-Id: Ib4d58e47a7b7244f55b7bd2c3d4d5241187875e7 --- .../com/android/internal/os/logging/MetricsLoggerWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java index e2237f61dfbb..0e0098ebf074 100644 --- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java +++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java @@ -57,7 +57,7 @@ public class MetricsLoggerWrapper { } public static void logPostGcMemorySnapshot() { - if (!com.android.libcore.Flags.nativeMetrics()) { + if (!com.android.libcore.readonly.Flags.nativeMetrics()) { return; } int pid = Process.myPid(); -- GitLab From b2c0762824b115a398b298f38e28cb2951c9c1bd Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Tue, 22 Oct 2024 11:36:04 +0000 Subject: [PATCH 313/459] Introduce Shade configuration controller This introduces a new configuration controller for the Shade, enabling it to adapt to per-display settings. Previously, the Shade relied on global configuration from SystemUIApplication, which is unsuitable for multi-display environments. Now, the Shade obtains configuration from its associated window's root view. This ensures that when the Shade is moved to an external display, the correct configuration is applied. This change is guarded by a feature flag. When disabled, the existing global configuration mechanism remains active. This commit focuses on migrating Shade components within the /systemui/shade directory to the new per-display configuration controller. Further changes will address remaining components in subsequent commits. Bug: 362719719 Bug: 374267505 Test: NotificationShadeWindowViewTest + presubmits Flag: com.android.systemui.shade_window_goes_around Change-Id: Id5a97ac717674e1c610f53b7a129c386d192a558 --- ...tificationShadeWindowViewControllerTest.kt | 2 ++ .../shade/NotificationShadeWindowViewTest.kt | 34 ++++++++++++++++--- .../systemui/dagger/SystemUIModule.java | 2 ++ .../NotificationPanelViewController.java | 2 +- ...NotificationShadeWindowControllerImpl.java | 2 +- .../shade/NotificationShadeWindowView.java | 15 ++++++++ ...NotificationShadeWindowViewController.java | 7 +++- .../systemui/shade/ShadeDisplayAwareModule.kt | 33 ++++++++++++++++++ .../systemui/shade/ShadeHeaderController.kt | 2 +- .../com/android/systemui/shade/ShadeModule.kt | 2 +- .../systemui/shade/ShadeViewProviderModule.kt | 2 +- .../LargeScreenShadeInterpolatorImpl.kt | 5 +-- 12 files changed, 95 insertions(+), 13 deletions(-) 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 adc336d18245..47eebf60f59f 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewControllerTest.kt @@ -65,6 +65,7 @@ import com.android.systemui.statusbar.notification.domain.interactor.Notificatio import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.phone.ConfigurationForwarder import com.android.systemui.statusbar.phone.DozeScrimController import com.android.systemui.statusbar.phone.DozeServiceHost import com.android.systemui.statusbar.phone.PhoneStatusBarViewController @@ -219,6 +220,7 @@ class NotificationShadeWindowViewControllerTest(flags: FlagsParameterization) : primaryBouncerInteractor, alternateBouncerInteractor, mock(BouncerViewBinder::class.java), + mock(ConfigurationForwarder::class.java), ) underTest.setupExpandedStatusBar() underTest.setDragDownHelper(dragDownHelper) 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 d61320e22e14..1c196c0eca4d 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/NotificationShadeWindowViewTest.kt @@ -15,8 +15,10 @@ */ package com.android.systemui.shade +import android.content.res.Configuration import android.os.SystemClock import android.platform.test.annotations.DisableFlags +import android.platform.test.annotations.EnableFlags import android.testing.TestableLooper.RunWithLooper import android.view.MotionEvent import android.widget.FrameLayout @@ -54,6 +56,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController import com.android.systemui.statusbar.phone.CentralSurfaces +import com.android.systemui.statusbar.phone.ConfigurationForwarder import com.android.systemui.statusbar.phone.DozeScrimController import com.android.systemui.statusbar.phone.DozeServiceHost import com.android.systemui.statusbar.window.StatusBarWindowStateController @@ -76,9 +79,11 @@ import org.mockito.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock import org.mockito.Mockito +import org.mockito.Mockito.never import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import org.mockito.kotlin.eq @ExperimentalCoroutinesApi @RunWith(AndroidJUnit4::class) @@ -101,7 +106,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { @Mock private lateinit var quickSettingsController: QuickSettingsController @Mock private lateinit var notificationStackScrollLayoutController: - NotificationStackScrollLayoutController + NotificationStackScrollLayoutController @Mock private lateinit var statusBarWindowStateController: StatusBarWindowStateController @Mock private lateinit var lockscreenShadeTransitionController: LockscreenShadeTransitionController @@ -117,12 +122,13 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { private lateinit var keyguardSecurityContainerController: KeyguardSecurityContainerController @Mock private lateinit var unfoldTransitionProgressProvider: - Optional + Optional @Mock private lateinit var notificationInsetsController: NotificationInsetsController @Mock private lateinit var mGlanceableHubContainerController: GlanceableHubContainerController @Mock private lateinit var keyguardTransitionInteractor: KeyguardTransitionInteractor @Mock lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor @Mock lateinit var alternateBouncerInteractor: AlternateBouncerInteractor + @Mock lateinit var configurationForwarder: ConfigurationForwarder @Captor private lateinit var interactionEventHandlerCaptor: ArgumentCaptor @@ -136,10 +142,10 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { MockitoAnnotations.initMocks(this) underTest = spy(NotificationShadeWindowView(context, null)) whenever( - underTest.findViewById( - R.id.notification_stack_scroller - ) + underTest.findViewById( + R.id.notification_stack_scroller ) + ) .thenReturn(notificationStackScrollLayout) whenever(underTest.findViewById(R.id.keyguard_bouncer_container)) .thenReturn(mock()) @@ -191,6 +197,7 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { primaryBouncerInteractor, alternateBouncerInteractor, mock(), + configurationForwarder, ) controller.setupExpandedStatusBar() @@ -222,6 +229,23 @@ class NotificationShadeWindowViewTest : SysuiTestCase() { assertThat(interactionEventHandler.shouldInterceptTouchEvent(mock())).isFalse() } + @Test + @DisableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) + fun onConfigurationChanged_configForwarderNotSet() { + underTest.onConfigurationChanged(Configuration()) + + verify(configurationForwarder, never()).onConfigurationChanged(any()) + } + + @Test + @EnableFlags(AConfigFlags.FLAG_SHADE_WINDOW_GOES_AROUND) + fun onConfigurationChanged_configForwarderSet_propagatesConfig() { + val config = Configuration() + underTest.onConfigurationChanged(config) + + verify(configurationForwarder).onConfigurationChanged(eq(config)) + } + private fun captureInteractionEventHandler() { verify(underTest).setInteractionEventHandler(interactionEventHandlerCaptor.capture()) interactionEventHandler = interactionEventHandlerCaptor.value diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index 450863fb53c9..59c8f06a40ad 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -107,6 +107,7 @@ import com.android.systemui.security.data.repository.SecurityRepositoryModule; import com.android.systemui.settings.DisplayTracker; import com.android.systemui.settings.UserTracker; import com.android.systemui.shade.ShadeController; +import com.android.systemui.shade.ShadeDisplayAwareModule; import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl; import com.android.systemui.shared.condition.Monitor; @@ -265,6 +266,7 @@ import javax.inject.Named; CommonSystemUIUnfoldModule.class, TelephonyRepositoryModule.class, TemporaryDisplayModule.class, + ShadeDisplayAwareModule.class, TouchpadModule.class, TunerModule.class, UserDomainLayerModule.class, diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 750f5ad62bab..67d162b4aa1b 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -689,7 +689,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump KeyguardUpdateMonitor keyguardUpdateMonitor, MetricsLogger metricsLogger, ShadeLogger shadeLogger, - ConfigurationController configurationController, + @ShadeDisplayAware ConfigurationController configurationController, Provider flingAnimationUtilsBuilder, StatusBarTouchableRegionManager statusBarTouchableRegionManager, ConversationNotificationManager conversationNotificationManager, diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java index f83548ddbf45..5b6696bb60df 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java @@ -154,7 +154,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW IActivityManager activityManager, DozeParameters dozeParameters, StatusBarStateController statusBarStateController, - ConfigurationController configurationController, + @ShadeDisplayAware ConfigurationController configurationController, KeyguardViewMediator keyguardViewMediator, KeyguardBypassController keyguardBypassController, @Main Executor mainExecutor, diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java index 64085fdef961..dc2f8d4c4266 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java @@ -24,6 +24,7 @@ import static com.android.systemui.statusbar.phone.CentralSurfaces.DEBUG; import android.annotation.ColorInt; import android.annotation.DrawableRes; import android.annotation.LayoutRes; +import android.annotation.Nullable; import android.content.Context; import android.content.res.Configuration; import android.graphics.Canvas; @@ -53,6 +54,7 @@ import com.android.app.viewcapture.ViewCaptureFactory; import com.android.internal.view.FloatingActionMode; import com.android.internal.widget.floatingtoolbar.FloatingToolbar; import com.android.systemui.scene.ui.view.WindowRootView; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; /** * Combined keyguard and notification panel view. Also holding backdrop and scrims. This view can @@ -68,6 +70,7 @@ public class NotificationShadeWindowView extends WindowRootView { private ActionMode mFloatingActionMode; private FloatingToolbar mFloatingToolbar; private ViewTreeObserver.OnPreDrawListener mFloatingToolbarPreDrawListener; + @Nullable private ConfigurationForwarder mConfigurationForwarder; private InteractionEventHandler mInteractionEventHandler; @@ -161,6 +164,18 @@ public class NotificationShadeWindowView extends WindowRootView { return handled; } + @Override + protected void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + if (mConfigurationForwarder != null) { + mConfigurationForwarder.onConfigurationChanged(newConfig); + } + } + + public void setConfigurationForwarder(ConfigurationForwarder configurationForwarder) { + mConfigurationForwarder = configurationForwarder; + } + @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 36449bee8bf6..13e65243d0e9 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -69,6 +69,7 @@ import com.android.systemui.statusbar.notification.stack.AmbientState; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; import com.android.systemui.statusbar.phone.CentralSurfaces; +import com.android.systemui.statusbar.phone.ConfigurationForwarder; import com.android.systemui.statusbar.phone.DozeScrimController; import com.android.systemui.statusbar.phone.DozeServiceHost; import com.android.systemui.statusbar.phone.PhoneStatusBarViewController; @@ -188,7 +189,8 @@ public class NotificationShadeWindowViewController implements Dumpable { QuickSettingsController quickSettingsController, PrimaryBouncerInteractor primaryBouncerInteractor, AlternateBouncerInteractor alternateBouncerInteractor, - BouncerViewBinder bouncerViewBinder) { + BouncerViewBinder bouncerViewBinder, + @ShadeDisplayAware ConfigurationForwarder configurationForwarder) { mLockscreenShadeTransitionController = transitionController; mFalsingCollector = falsingCollector; mStatusBarStateController = statusBarStateController; @@ -245,6 +247,9 @@ public class NotificationShadeWindowViewController implements Dumpable { mDisableSubpixelTextTransitionListener)); } + if (com.android.systemui.Flags.shadeWindowGoesAround()) { + mView.setConfigurationForwarder(configurationForwarder); + } dumpManager.registerDumpable(this); } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt index c72db56a822f..312f5b3dbb2a 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt @@ -21,8 +21,12 @@ import android.content.res.Resources import android.view.LayoutInflater import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY import com.android.systemui.Flags +import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton import com.android.systemui.res.R +import com.android.systemui.statusbar.phone.ConfigurationControllerImpl +import com.android.systemui.statusbar.phone.ConfigurationForwarder +import com.android.systemui.statusbar.policy.ConfigurationController import dagger.Module import dagger.Provides @@ -68,4 +72,33 @@ object ShadeDisplayAwareModule { fun providesDisplayAwareLayoutInflater(@ShadeDisplayAware context: Context): LayoutInflater { return LayoutInflater.from(context) } + + @Provides + @ShadeDisplayAware + @SysUISingleton + fun provideShadeWindowConfigurationController( + @ShadeDisplayAware shadeContext: Context, + factory: ConfigurationControllerImpl.Factory, + @GlobalConfig globalConfigConfigController: ConfigurationController, + ): ConfigurationController { + return if (Flags.shadeWindowGoesAround()) { + factory.create(shadeContext) + } else { + globalConfigConfigController + } + } + + @Provides + @ShadeDisplayAware + @SysUISingleton + fun provideShadeWindowConfigurationForwarder( + @ShadeDisplayAware shadeConfigurationController: ConfigurationController, + @GlobalConfig globalConfigController: ConfigurationController, + ): ConfigurationForwarder { + return if (Flags.shadeWindowGoesAround()) { + shadeConfigurationController + } else { + globalConfigController + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt index d0f038698a8e..e8a792c30aa2 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeHeaderController.kt @@ -91,7 +91,7 @@ constructor( private val tintedIconManagerFactory: TintedIconManager.Factory, private val privacyIconsController: HeaderPrivacyIconsController, private val insetsProviderStore: StatusBarContentInsetsProviderStore, - private val configurationController: ConfigurationController, + @ShadeDisplayAware private val configurationController: ConfigurationController, private val variableDateViewControllerFactory: VariableDateViewController.Factory, @Named(SHADE_HEADER) private val batteryMeterViewController: BatteryMeterViewController, private val dumpManager: DumpManager, diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt index 6f5547a62472..72a465030bf5 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeModule.kt @@ -51,7 +51,7 @@ import javax.inject.Provider /** Module for classes related to the notification shade. */ @Module( includes = - [StartShadeModule::class, ShadeViewProviderModule::class, ShadeDisplayAwareModule::class] + [StartShadeModule::class, ShadeViewProviderModule::class] ) abstract class ShadeModule { companion object { diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt index 5afc5398d401..1918094cceee 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt @@ -250,7 +250,7 @@ abstract class ShadeViewProviderModule { fun providesBatteryMeterViewController( @Named(SHADE_HEADER) batteryMeterView: BatteryMeterView, userTracker: UserTracker, - configurationController: ConfigurationController, + @ShadeDisplayAware configurationController: ConfigurationController, tunerService: TunerService, @Main mainHandler: Handler, contentResolver: ContentResolver, diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt index 4ba56749de91..823742af49d2 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt @@ -19,6 +19,7 @@ package com.android.systemui.shade.transition import android.content.Context import android.content.res.Configuration import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.statusbar.policy.SplitShadeStateController import javax.inject.Inject @@ -28,11 +29,11 @@ import javax.inject.Inject internal class LargeScreenShadeInterpolatorImpl @Inject internal constructor( - configurationController: ConfigurationController, + @ShadeDisplayAware configurationController: ConfigurationController, private val context: Context, private val splitShadeInterpolator: SplitShadeInterpolator, private val portraitShadeInterpolator: LargeScreenPortraitShadeInterpolator, - private val splitShadeStateController: SplitShadeStateController + private val splitShadeStateController: SplitShadeStateController, ) : LargeScreenShadeInterpolator { private var inSplitShade = false -- GitLab From 599b72088d935ab94148502dd3c0fe662a0520cc Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Tue, 22 Oct 2024 12:07:28 +0000 Subject: [PATCH 314/459] Use ShadeWindowGoesAround helper class instead of just reading the flag This also provides some methods to assert whether the flag is on or off. Bug: 362719719 Bug: 374267505 Test: presubmits Flag: com.android.systemui.shade_window_goes_around Change-Id: I41dba24c2404835c7756b7fc0659fcd49cc8fdc6 --- .../shade/NotificationShadeWindowView.java | 3 + ...NotificationShadeWindowViewController.java | 3 +- .../systemui/shade/ShadeDisplayAwareModule.kt | 8 +-- .../shared/flag/ShadeWindowGoesAround.kt | 61 +++++++++++++++++++ 4 files changed, 70 insertions(+), 5 deletions(-) create mode 100644 packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java index dc2f8d4c4266..f5fc1f414f82 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowView.java @@ -54,6 +54,7 @@ import com.android.app.viewcapture.ViewCaptureFactory; import com.android.internal.view.FloatingActionMode; import com.android.internal.widget.floatingtoolbar.FloatingToolbar; import com.android.systemui.scene.ui.view.WindowRootView; +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround; import com.android.systemui.statusbar.phone.ConfigurationForwarder; /** @@ -168,11 +169,13 @@ public class NotificationShadeWindowView extends WindowRootView { protected void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (mConfigurationForwarder != null) { + ShadeWindowGoesAround.isUnexpectedlyInLegacyMode(); mConfigurationForwarder.onConfigurationChanged(newConfig); } } public void setConfigurationForwarder(ConfigurationForwarder configurationForwarder) { + ShadeWindowGoesAround.isUnexpectedlyInLegacyMode(); mConfigurationForwarder = configurationForwarder; } diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java index 13e65243d0e9..365666df7540 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowViewController.java @@ -57,6 +57,7 @@ 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.domain.interactor.PanelExpansionInteractor; +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround; import com.android.systemui.shared.animation.DisableSubpixelTextTransitionListener; import com.android.systemui.statusbar.DragDownHelper; import com.android.systemui.statusbar.LockscreenShadeTransitionController; @@ -247,7 +248,7 @@ public class NotificationShadeWindowViewController implements Dumpable { mDisableSubpixelTextTransitionListener)); } - if (com.android.systemui.Flags.shadeWindowGoesAround()) { + if (ShadeWindowGoesAround.isEnabled()) { mView.setConfigurationForwarder(configurationForwarder); } dumpManager.registerDumpable(this); diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt index 312f5b3dbb2a..51f1f81ab1f0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeDisplayAwareModule.kt @@ -20,10 +20,10 @@ import android.content.Context import android.content.res.Resources import android.view.LayoutInflater import android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY -import com.android.systemui.Flags import com.android.systemui.common.ui.GlobalConfig import com.android.systemui.dagger.SysUISingleton import com.android.systemui.res.R +import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround import com.android.systemui.statusbar.phone.ConfigurationControllerImpl import com.android.systemui.statusbar.phone.ConfigurationForwarder import com.android.systemui.statusbar.policy.ConfigurationController @@ -50,7 +50,7 @@ object ShadeDisplayAwareModule { @ShadeDisplayAware @SysUISingleton fun provideShadeDisplayAwareContext(context: Context): Context { - return if (Flags.shadeWindowGoesAround()) { + return if (ShadeWindowGoesAround.isEnabled) { context .createWindowContext(context.display, TYPE_APPLICATION_OVERLAY, /* options= */ null) .apply { setTheme(R.style.Theme_SystemUI) } @@ -81,7 +81,7 @@ object ShadeDisplayAwareModule { factory: ConfigurationControllerImpl.Factory, @GlobalConfig globalConfigConfigController: ConfigurationController, ): ConfigurationController { - return if (Flags.shadeWindowGoesAround()) { + return if (ShadeWindowGoesAround.isEnabled) { factory.create(shadeContext) } else { globalConfigConfigController @@ -95,7 +95,7 @@ object ShadeDisplayAwareModule { @ShadeDisplayAware shadeConfigurationController: ConfigurationController, @GlobalConfig globalConfigController: ConfigurationController, ): ConfigurationForwarder { - return if (Flags.shadeWindowGoesAround()) { + return if (ShadeWindowGoesAround.isEnabled) { shadeConfigurationController } else { globalConfigController diff --git a/packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt b/packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt new file mode 100644 index 000000000000..6f492cfaa6c3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/shade/shared/flag/ShadeWindowGoesAround.kt @@ -0,0 +1,61 @@ +/* + * 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.shade.shared.flag + +import com.android.systemui.Flags +import com.android.systemui.flags.FlagToken +import com.android.systemui.flags.RefactorFlagUtils + +/** Helper for reading or using the shade window goes around flag state. */ +@Suppress("NOTHING_TO_INLINE") +object ShadeWindowGoesAround { + /** The aconfig flag name */ + const val FLAG_NAME = Flags.FLAG_SHADE_WINDOW_GOES_AROUND + + /** A token used for dependency declaration */ + val token: FlagToken + get() = FlagToken(FLAG_NAME, isEnabled) + + /** Is the refactor enabled */ + @JvmStatic + inline val isEnabled + get() = Flags.shadeWindowGoesAround() + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is enabled. This will throw an exception if + * the flag is not enabled to ensure that the refactor author catches issues in testing. + * Caution!! Using this check incorrectly will cause crashes in nextfood builds! + */ + @JvmStatic + inline fun assertInNewMode() = RefactorFlagUtils.assertInNewMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) +} -- GitLab From e7571aefc501bd8415d28090b2d19148b190a218 Mon Sep 17 00:00:00 2001 From: ziyiw Date: Wed, 23 Oct 2024 17:10:32 +0000 Subject: [PATCH 315/459] [framework] Handle more possible route string from service. There are more possible values for routing status. Should only check if the return value has these prefixes. Bug: 356419585 Test: atest CtsNfcTestCases Change-Id: I7626573dce4bcb59ee7ac6aa35dd162f60d2fbae --- nfc/java/android/nfc/NfcOemExtension.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/nfc/java/android/nfc/NfcOemExtension.java b/nfc/java/android/nfc/NfcOemExtension.java index 905d6f68a8a0..520ba896f01f 100644 --- a/nfc/java/android/nfc/NfcOemExtension.java +++ b/nfc/java/android/nfc/NfcOemExtension.java @@ -923,12 +923,15 @@ public final class NfcOemExtension { } private @CardEmulation.ProtocolAndTechnologyRoute int routeStringToInt(String route) { - return switch (route) { - case "DH" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_DH; - case "eSE" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE; - case "SIM" -> PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC; - default -> throw new IllegalStateException("Unexpected value: " + route); - }; + if (route.equals("DH")) { + return PROTOCOL_AND_TECHNOLOGY_ROUTE_DH; + } else if (route.startsWith("eSE")) { + return PROTOCOL_AND_TECHNOLOGY_ROUTE_ESE; + } else if (route.startsWith("SIM")) { + return PROTOCOL_AND_TECHNOLOGY_ROUTE_UICC; + } else { + throw new IllegalStateException("Unexpected value: " + route); + } } private class ReceiverWrapper implements Consumer { -- GitLab From 6dbe6f55cfa0ce29fa34558865472e99ce1a27c0 Mon Sep 17 00:00:00 2001 From: Nicolo' Mazzucato Date: Wed, 23 Oct 2024 10:37:30 +0000 Subject: [PATCH 316/459] Use display aware context, resources, configController and Layout inflater in shade dir Only when the new flag is on, this will make all shade/ classes use the correct context and receive the configuration from the root view. Bug: 362719719 Bug: 374267505 Test: sysui unit tests Flag: com.android.systemui.shade_window_goes_around Change-Id: Ibe582db7125fd303d77219753cc3cfe36e7f6e3c --- .../shade/data/repository/ShadeRepositoryImplTest.kt | 2 +- .../com/android/systemui/shade/LargeScreenHeaderHelper.kt | 2 +- .../shade/NotificationPanelUnfoldAnimationController.kt | 2 +- .../systemui/shade/NotificationPanelViewController.java | 2 +- .../shade/NotificationShadeWindowControllerImpl.java | 2 +- .../com/android/systemui/shade/QsBatteryModeController.kt | 2 +- .../com/android/systemui/shade/ShadeViewProviderModule.kt | 4 ++-- .../systemui/shade/carrier/ShadeCarrierGroupController.java | 5 +++-- .../systemui/shade/data/repository/ShadeRepository.kt | 2 +- .../systemui/shade/domain/startable/ShadeStartable.kt | 5 +++-- .../shade/transition/LargeScreenShadeInterpolatorImpl.kt | 2 +- .../systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt | 3 ++- .../systemui/shade/domain/startable/ShadeStartableKosmos.kt | 2 +- 13 files changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt index 7d4918a30d9c..b5043ce700f1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/data/repository/ShadeRepositoryImplTest.kt @@ -39,7 +39,7 @@ class ShadeRepositoryImplTest : SysuiTestCase() { @Before fun setUp() { - underTest = ShadeRepositoryImpl(getContext()) + underTest = ShadeRepositoryImpl() } @Test diff --git a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenHeaderHelper.kt b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenHeaderHelper.kt index c74f038ebea4..38de17eb7fd8 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/LargeScreenHeaderHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/LargeScreenHeaderHelper.kt @@ -22,7 +22,7 @@ import com.android.systemui.res.R import javax.inject.Inject import kotlin.math.max -class LargeScreenHeaderHelper @Inject constructor(private val context: Context) { +class LargeScreenHeaderHelper @Inject constructor(@ShadeDisplayAware private val context: Context) { fun getLargeScreenHeaderHeight(): Int = getLargeScreenHeaderHeight(context) diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt index f463cb5bcbd6..6e63446d88d8 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelUnfoldAnimationController.kt @@ -34,7 +34,7 @@ import javax.inject.Inject class NotificationPanelUnfoldAnimationController @Inject constructor( - private val context: Context, + @ShadeDisplayAware private val context: Context, statusBarStateController: StatusBarStateController, progressProvider: NaturalRotationUnfoldProgressProvider, ) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java index 67d162b4aa1b..083cf1fc8b17 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java @@ -668,7 +668,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump @Inject public NotificationPanelViewController(NotificationPanelView view, @Main Handler handler, - LayoutInflater layoutInflater, + @ShadeDisplayAware LayoutInflater layoutInflater, FeatureFlags featureFlags, NotificationWakeUpCoordinator coordinator, PulseExpansionHandler pulseExpansionHandler, diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java index 5b6696bb60df..24dba59a1d54 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationShadeWindowControllerImpl.java @@ -148,7 +148,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW @Inject public NotificationShadeWindowControllerImpl( - Context context, + @ShadeDisplayAware Context context, WindowRootViewComponent.Factory windowRootViewComponentFactory, ViewCaptureAwareWindowManager viewCaptureAwareWindowManager, IActivityManager activityManager, diff --git a/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt b/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt index 91627d63980e..7a70966c2b12 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/QsBatteryModeController.kt @@ -14,7 +14,7 @@ import javax.inject.Inject class QsBatteryModeController @Inject constructor( - private val context: Context, + @ShadeDisplayAware private val context: Context, insetsProviderStore: StatusBarContentInsetsProviderStore, ) { diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt index 1918094cceee..15b22700072f 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeViewProviderModule.kt @@ -83,7 +83,7 @@ abstract class ShadeViewProviderModule { @Provides @SysUISingleton fun providesWindowRootView( - layoutInflater: LayoutInflater, + @ShadeDisplayAware layoutInflater: LayoutInflater, viewModelFactory: SceneContainerViewModel.Factory, containerConfigProvider: Provider, scenesProvider: Provider>, @@ -156,7 +156,7 @@ abstract class ShadeViewProviderModule { @Provides fun providesKeyguardBottomAreaView( npv: NotificationPanelView, - layoutInflater: LayoutInflater, + @ShadeDisplayAware layoutInflater: LayoutInflater, ): KeyguardBottomAreaView { return layoutInflater.inflate(R.layout.keyguard_bottom_area, npv, false) as KeyguardBottomAreaView diff --git a/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java b/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java index a171d33ddb47..4b8cc00e1c28 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java +++ b/packages/SystemUI/src/com/android/systemui/shade/carrier/ShadeCarrierGroupController.java @@ -44,6 +44,7 @@ import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.res.R; +import com.android.systemui.shade.ShadeDisplayAware; import com.android.systemui.statusbar.connectivity.MobileDataIndicators; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.connectivity.SignalCallback; @@ -153,7 +154,7 @@ public class ShadeCarrierGroupController { ShadeCarrierGroupControllerLogger logger, NetworkController networkController, CarrierTextManager.Builder carrierTextManagerBuilder, - Context context, + @ShadeDisplayAware Context context, CarrierConfigTracker carrierConfigTracker, SlotIndexResolver slotIndexResolver, MobileUiAdapter mobileUiAdapter, @@ -497,7 +498,7 @@ public class ShadeCarrierGroupController { ShadeCarrierGroupControllerLogger logger, NetworkController networkController, CarrierTextManager.Builder carrierTextControllerBuilder, - Context context, + @ShadeDisplayAware Context context, CarrierConfigTracker carrierConfigTracker, SlotIndexResolver slotIndexResolver, MobileUiAdapter mobileUiAdapter, diff --git a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt index 193056c19d4e..5629938deeb0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/data/repository/ShadeRepository.kt @@ -182,7 +182,7 @@ interface ShadeRepository { /** Business logic for shade interactions */ @SysUISingleton -class ShadeRepositoryImpl @Inject constructor(@Application applicationContext: Context) : +class ShadeRepositoryImpl @Inject constructor() : ShadeRepository { private val _qsExpansion = MutableStateFlow(0f) @Deprecated("Use ShadeInteractor.qsExpansion instead") diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt index 330f53fc3701..c456f6c50fbe 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt @@ -26,6 +26,7 @@ import com.android.systemui.log.LogBuffer import com.android.systemui.log.dagger.ShadeTouchLog import com.android.systemui.scene.domain.interactor.SceneInteractor import com.android.systemui.scene.shared.flag.SceneContainerFlag +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.ShadeExpansionStateManager import com.android.systemui.shade.TouchLogger.Companion.logTouchesTo import com.android.systemui.shade.data.repository.ShadeRepository @@ -48,7 +49,7 @@ class ShadeStartable @Inject constructor( @Application private val applicationScope: CoroutineScope, - @Application private val applicationContext: Context, + @ShadeDisplayAware private val context: Context, @ShadeTouchLog private val touchLog: LogBuffer, private val configurationRepository: ConfigurationRepository, private val shadeRepository: ShadeRepository, @@ -94,7 +95,7 @@ constructor( // Force initial collection. .onStart { emit(Unit) } .collect { - val resources = applicationContext.resources + val resources = context.resources // The configuration for 'shouldUseSplitNotificationShade' dictates the width of // the shade in both split-shade and dual-shade modes. shadeRepository.setShadeLayoutWide( diff --git a/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt index 823742af49d2..a5caa0963bc0 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/transition/LargeScreenShadeInterpolatorImpl.kt @@ -30,7 +30,7 @@ internal class LargeScreenShadeInterpolatorImpl @Inject internal constructor( @ShadeDisplayAware configurationController: ConfigurationController, - private val context: Context, + @ShadeDisplayAware private val context: Context, private val splitShadeInterpolator: SplitShadeInterpolator, private val portraitShadeInterpolator: LargeScreenPortraitShadeInterpolator, private val splitShadeStateController: SplitShadeStateController, diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt index bd4ed5b45dc7..c096872f4bf1 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt @@ -30,6 +30,7 @@ import com.android.systemui.privacy.OngoingPrivacyChip import com.android.systemui.privacy.PrivacyItem import com.android.systemui.res.R import com.android.systemui.scene.shared.model.TransitionKeys.SlightlyFasterShadeCollapse +import com.android.systemui.shade.ShadeDisplayAware import com.android.systemui.shade.domain.interactor.PrivacyChipInteractor import com.android.systemui.shade.domain.interactor.ShadeHeaderClockInteractor import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -53,7 +54,7 @@ import kotlinx.coroutines.launch class ShadeHeaderViewModel @AssistedInject constructor( - context: Context, + @ShadeDisplayAware context: Context, private val activityStarter: ActivityStarter, private val shadeInteractor: ShadeInteractor, private val mobileIconsInteractor: MobileIconsInteractor, diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt index a1f157f13210..10534a02bfe7 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/shade/domain/startable/ShadeStartableKosmos.kt @@ -40,7 +40,7 @@ val Kosmos.shadeExpansionStateManager by Fixture { ShadeExpansionStateManager() val Kosmos.shadeStartable by Fixture { ShadeStartable( applicationScope = applicationCoroutineScope, - applicationContext = applicationContext, + context = applicationContext, touchLog = mock(), configurationRepository = configurationRepository, shadeRepository = shadeRepository, -- GitLab From 183a5803f253ad57be29e22e0c6c827a8d39a881 Mon Sep 17 00:00:00 2001 From: Michal Brzezinski Date: Wed, 23 Oct 2024 18:21:01 +0100 Subject: [PATCH 317/459] Adding live progress tracking for touchpad back gesture Passing different lottie progress markers and success animation depending on to which side the back swipe was done. Fixes: 369817369 Test: manual Flag: com.android.systemui.shared.new_touchpad_gestures_tutorial Change-Id: Ia427b5015d34a9c7cf4b6ff75eacf893439a44e6 --- .../SystemUI/res/raw/trackpad_back_edu.json | 2 +- .../res/raw/trackpad_back_success.json | 1 - .../res/raw/trackpad_back_success_left.json | 1 + .../res/raw/trackpad_back_success_right.json | 1 + .../composable/BackGestureTutorialScreen.kt | 29 +++++++++++++++---- 5 files changed, 26 insertions(+), 8 deletions(-) delete mode 100644 packages/SystemUI/res/raw/trackpad_back_success.json create mode 100644 packages/SystemUI/res/raw/trackpad_back_success_left.json create mode 100644 packages/SystemUI/res/raw/trackpad_back_success_right.json diff --git a/packages/SystemUI/res/raw/trackpad_back_edu.json b/packages/SystemUI/res/raw/trackpad_back_edu.json index 908d26ff40cd..e705d4aef8a0 100644 --- a/packages/SystemUI/res/raw/trackpad_back_edu.json +++ b/packages/SystemUI/res/raw/trackpad_back_edu.json @@ -1 +1 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":900,"w":554,"h":564,"nm":"Trackpad-JSON_BackGesture-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Back_LeftDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":79},"y":{"a":0,"k":197}},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}]}},"ao":0,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[-0.692,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.308,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.009,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.291,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.138,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.452,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.757,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.542,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.002,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.238,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.308,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.331,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.006,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.308,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.382,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.657,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.165,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.794,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.403,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.942,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.411,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.822,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.186,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.511,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.803,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.069,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.311,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.534,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.739,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.928,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.103,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.267,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.419,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.56,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.693,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.816,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.932,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.041,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.142,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.238,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.327,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.411,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.489,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.563,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.632,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.696,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.756,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.812,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.864,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.913,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.958,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.039,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.074,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.107,0,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.137,0,0],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.164,0,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.188,0,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.21,0,0],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.23,0,0],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.247,0,0],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.274,0,0],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.305,0,0],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Vector 1","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[0.15]},"t":160,"s":[-14]},{"t":189,"s":[0]}]},"y":{"a":0,"k":0}},"a":{"a":0,"k":[32,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":8}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}]}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}]}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"k":[{"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-24],[0,-24],[0,-24],[0,-24],[0,24],[0,24],[0,24],[0,24]],"c":true}],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.208,0],[0,0],[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208]],"o":[[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208],[0,0],[-2.208,0],[0,0]],"v":[[0,-20],[4,-24],[4,-24],[8,-20],[8,20],[4,24],[4,24],[0,20]],"c":true}],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.594,0],[0,0],[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594]],"o":[[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594],[0,0],[-2.594,0],[0,0]],"v":[[0,-19.3],[4.7,-24],[4.7,-24],[9.401,-19.3],[9.401,19.3],[4.7,24],[4.7,24],[0,19.3]],"c":true}],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-4.958,0],[0,0],[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958]],"o":[[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958],[0,0],[-4.958,0],[0,0]],"v":[[0,-15.017],[8.983,-24],[8.983,-24],[17.967,-15.017],[17.967,15.017],[8.983,24],[8.983,24],[0,15.017]],"c":true}],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-7.632,0],[0,0],[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632]],"o":[[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632],[0,0],[-7.632,0],[0,0]],"v":[[0,-10.171],[13.829,-24],[13.829,-24],[27.659,-10.171],[27.659,10.171],[13.829,24],[13.829,24],[0,10.171]],"c":true}],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-8.91,0],[0,0],[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91]],"o":[[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91],[0,0],[-8.91,0],[0,0]],"v":[[0,-7.856],[16.144,-24],[16.144,-24],[32.287,-7.856],[32.287,7.856],[16.144,24],[16.144,24],[0,7.856]],"c":true}],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-9.63,0],[0,0],[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63]],"o":[[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63],[0,0],[-9.63,0],[0,0]],"v":[[0,-6.551],[17.449,-24],[17.449,-24],[34.898,-6.551],[34.898,6.551],[17.449,24],[17.449,24],[0,6.551]],"c":true}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.063,0],[0,0],[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063]],"o":[[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063],[0,0],[-10.063,0],[0,0]],"v":[[0,-5.766],[18.234,-24],[18.234,-24],[36.467,-5.766],[36.467,5.766],[18.234,24],[18.234,24],[0,5.766]],"c":true}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.317,0],[0,0],[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317]],"o":[[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317],[0,0],[-10.317,0],[0,0]],"v":[[0,-5.306],[18.694,-24],[18.694,-24],[37.388,-5.306],[37.388,5.306],[18.694,24],[18.694,24],[0,5.306]],"c":true}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.448,0],[0,0],[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448]],"o":[[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448],[0,0],[-10.448,0],[0,0]],"v":[[0,-5.07],[18.93,-24],[18.93,-24],[37.861,-5.07],[37.861,5.07],[18.93,24],[18.93,24],[0,5.07]],"c":true}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.486,0],[0,0],[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486]],"o":[[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486],[0,0],[-10.486,0],[0,0]],"v":[[0,-5],[19,-24],[19,-24],[38,-5],[38,5],[19,24],[19,24],[0,5]],"c":true}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-12.154,0],[0,0],[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154]],"o":[[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154],[0,0],[-12.154,0],[0,0]],"v":[[0,-1.977],[22.023,-24],[22.023,-24],[44.045,-1.977],[44.045,1.977],[22.023,24],[22.023,24],[0,1.977]],"c":true}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.079,0],[0,0],[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079]],"o":[[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079],[0,0],[-13.079,0],[0,0]],"v":[[0,-0.302],[23.698,-24],[23.698,-24],[47.396,-0.302],[47.396,0.302],[23.698,24],[23.698,24],[0,0.302]],"c":true}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24,-24],[48,0],[48,0],[24,24],[24,24],[0,0]],"c":true}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24.149,-24],[48.149,0],[48.149,0],[24.149,24],[24,24],[0,0]],"c":true}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24.698,-24],[48.698,0],[48.698,0],[24.698,24],[24,24],[0,0]],"c":true}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[25.714,-24],[49.714,0],[49.714,0],[25.714,24],[24,24],[0,0]],"c":true}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[26.973,-24],[50.973,0],[50.973,0],[26.973,24],[24,24],[0,0]],"c":true}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[28.19,-24],[52.19,0],[52.19,0],[28.19,24],[24,24],[0,0]],"c":true}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[29.268,-24],[53.268,0],[53.268,0],[29.268,24],[24,24],[0,0]],"c":true}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[30.206,-24],[54.206,0],[54.206,0],[30.206,24],[24,24],[0,0]],"c":true}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[31.028,-24],[55.028,0],[55.028,0],[31.028,24],[24,24],[0,0]],"c":true}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[31.755,-24],[55.755,0],[55.755,0],[31.755,24],[24,24],[0,0]],"c":true}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[32.405,-24],[56.405,0],[56.405,0],[32.405,24],[24,24],[0,0]],"c":true}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[32.99,-24],[56.99,0],[56.99,0],[32.99,24],[24,24],[0,0]],"c":true}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[33.522,-24],[57.522,0],[57.522,0],[33.522,24],[24,24],[0,0]],"c":true}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.006,-24],[58.006,0],[58.006,0],[34.006,24],[24,24],[0,0]],"c":true}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.451,-24],[58.451,0],[58.451,0],[34.451,24],[24,24],[0,0]],"c":true}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.861,-24],[58.861,0],[58.861,0],[34.861,24],[24,24],[0,0]],"c":true}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.24,-24],[59.24,0],[59.24,0],[35.24,24],[24,24],[0,0]],"c":true}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.591,-24],[59.591,0],[59.591,0],[35.591,24],[24,24],[0,0]],"c":true}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.917,-24],[59.917,0],[59.917,0],[35.917,24],[24,24],[0,0]],"c":true}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.221,-24],[60.221,0],[60.221,0],[36.221,24],[24,24],[0,0]],"c":true}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.504,-24],[60.504,0],[60.504,0],[36.504,24],[24,24],[0,0]],"c":true}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.769,-24],[60.769,0],[60.769,0],[36.769,24],[24,24],[0,0]],"c":true}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.017,-24],[61.017,0],[61.017,0],[37.017,24],[24,24],[0,0]],"c":true}],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.248,-24],[61.248,0],[61.248,0],[37.248,24],[24,24],[0,0]],"c":true}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.465,-24],[61.465,0],[61.465,0],[37.465,24],[24,24],[0,0]],"c":true}],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.669,-24],[61.669,0],[61.669,0],[37.669,24],[24,24],[0,0]],"c":true}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.859,-24],[61.859,0],[61.859,0],[37.859,24],[24,24],[0,0]],"c":true}],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.038,-24],[62.038,0],[62.038,0],[38.038,24],[24,24],[0,0]],"c":true}],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.205,-24],[62.205,0],[62.205,0],[38.205,24],[24,24],[0,0]],"c":true}],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.362,-24],[62.362,0],[62.362,0],[38.362,24],[24,24],[0,0]],"c":true}],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.509,-24],[62.509,0],[62.509,0],[38.509,24],[24,24],[0,0]],"c":true}],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.647,-24],[62.647,0],[62.647,0],[38.647,24],[24,24],[0,0]],"c":true}],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.776,-24],[62.776,0],[62.776,0],[38.776,24],[24,24],[0,0]],"c":true}],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.896,-24],[62.896,0],[62.896,0],[38.896,24],[24,24],[0,0]],"c":true}],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.008,-24],[63.008,0],[63.008,0],[39.008,24],[24,24],[0,0]],"c":true}],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.113,-24],[63.113,0],[63.113,0],[39.113,24],[24,24],[0,0]],"c":true}],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.21,-24],[63.21,0],[63.21,0],[39.21,24],[24,24],[0,0]],"c":true}],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.3,-24],[63.3,0],[63.3,0],[39.3,24],[24,24],[0,0]],"c":true}],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.384,-24],[63.384,0],[63.384,0],[39.384,24],[24,24],[0,0]],"c":true}],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.461,-24],[63.461,0],[63.461,0],[39.461,24],[24,24],[0,0]],"c":true}],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.532,-24],[63.532,0],[63.532,0],[39.532,24],[24,24],[0,0]],"c":true}],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.597,-24],[63.597,0],[63.597,0],[39.597,24],[24,24],[0,0]],"c":true}],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.657,-24],[63.657,0],[63.657,0],[39.657,24],[24,24],[0,0]],"c":true}],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.711,-24],[63.711,0],[63.711,0],[39.711,24],[24,24],[0,0]],"c":true}],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.76,-24],[63.76,0],[63.76,0],[39.76,24],[24,24],[0,0]],"c":true}],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.804,-24],[63.804,0],[63.804,0],[39.804,24],[24,24],[0,0]],"c":true}],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.843,-24],[63.843,0],[63.843,0],[39.843,24],[24,24],[0,0]],"c":true}],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.877,-24],[63.877,0],[63.877,0],[39.877,24],[24,24],[0,0]],"c":true}],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.907,-24],[63.907,0],[63.907,0],[39.907,24],[24,24],[0,0]],"c":true}],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.932,-24],[63.932,0],[63.932,0],[39.932,24],[24,24],[0,0]],"c":true}],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.971,-24],[63.971,0],[63.971,0],[39.971,24],[24,24],[0,0]],"c":true}],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"k":[{"s":[0,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":450,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"IndieCorners Shape","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,0,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.001,0,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.005,0,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.013,0,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.029,0,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.054,0,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.089,0,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.134,0,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.193,0,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.267,0,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.358,0,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.466,0,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.593,0,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.739,0,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.903,0,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.054,0,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.22,0,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.403,0,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.602,0,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.821,0,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.059,0,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.319,0,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.601,0,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.909,0,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.242,0,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.604,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.998,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.427,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.897,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.407,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.965,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.576,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.246,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.983,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.8,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.701,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.699,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.808,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.041,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.414,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.945,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.621,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.429,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.324,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.241,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.111,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.859,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.457,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.897,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.185,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.333,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.36,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.272,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.088,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.82,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.479,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.076,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.613,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.099,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.538,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.937,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.299,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.629,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.927,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.198,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.442,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.663,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.862,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.041,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.2,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.342,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.467,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.577,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.672,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.754,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.822,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.879,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.925,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.961,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}]}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"right circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"left circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"size","bm":0,"hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"s":[277.263,197.5,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.43,197.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.681,197.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.85,197.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.058,197.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.313,197.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.63,197.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.023,197.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.517,197.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.151,197.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.992,197.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.175,197.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.778,197.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.586,197.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[287.564,197.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.63,197.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[291.671,197.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.578,197.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[295.298,197.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[296.823,197.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.167,197.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.353,197.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.405,197.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.343,197.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.187,197.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.949,197.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.641,197.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.271,197.5,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.846,197.5,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.373,197.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.858,197.5,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.306,197.5,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.72,197.5,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.103,197.5,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.459,197.5,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.789,197.5,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.096,197.5,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.382,197.5,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.648,197.5,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.895,197.5,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.126,197.5,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.34,197.5,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.54,197.5,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.726,197.5,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.901,197.5,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.063,197.5,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.352,197.5,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.599,197.5,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.903,197.5,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.196,197.5,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.191,197.5,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.194,197.5,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.275,197.5,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.841,197.5,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.7,197.5,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.568,197.5,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.993,197.5,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.914,197.5,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.504,197.5,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.464,197.5,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.661,197.5,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.021,197.5,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.499,197.5,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.068,197.5,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.705,197.5,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.401,197.5,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.143,197.5,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.925,197.5,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.741,197.5,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.585,197.5,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.345,197.5,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.074,197.5,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":7}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277.263,197.5],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.43,197.5],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.681,197.5],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.85,197.5],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.058,197.5],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.313,197.5],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.63,197.5],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.023,197.5],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.517,197.5],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.151,197.5],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.992,197.5],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.175,197.5],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.778,197.5],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.586,197.5],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[287.564,197.5],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.63,197.5],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[291.671,197.5],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.578,197.5],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[295.298,197.5],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[296.823,197.5],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.167,197.5],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.353,197.5],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.405,197.5],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.343,197.5],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.187,197.5],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.949,197.5],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.641,197.5],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.271,197.5],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.846,197.5],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.373,197.5],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.858,197.5],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.306,197.5],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.72,197.5],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.103,197.5],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.459,197.5],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.789,197.5],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.096,197.5],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.382,197.5],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.648,197.5],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.895,197.5],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.126,197.5],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.34,197.5],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.54,197.5],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.726,197.5],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.901,197.5],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.063,197.5],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.352,197.5],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.599,197.5],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.903,197.5],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.196,197.5],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.936,197.788],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.7,199.014],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.071,202.033],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.438,206.77],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.978,211.581],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[290.807,215.785],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[288.487,219.444],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[286.718,222.659],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.317,225.519],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[284.171,228.085],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.211,230.396],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.392,232.474],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.682,234.334],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.059,235.992],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.506,237.461],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.012,238.754],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.568,239.881],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.169,240.855],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.809,241.684],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.487,242.379],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.199,242.951],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.943,243.409],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.72,243.76],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.528,243.874],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.369,243.701],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.24,243.336],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.142,242.847],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.073,242.284],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.033,241.684],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.85,239.729],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.285,239.199],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.162,238.218],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.05,236.594],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[267.986,234.04],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[265.592,226.983],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.166,217.207],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.184,212.309],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.238,209.328],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.904,207.237],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.379,205.654],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.741,204.399],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.029,203.375],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.267,202.521],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.466,201.799],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.638,201.182],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.788,200.65],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.921,200.189],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.041,199.789],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.149,199.439],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.246,199.134],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.337,198.867],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.419,198.634],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.495,198.431],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.566,198.255],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.632,198.103],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.692,197.973],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.748,197.862],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.86,197.692],"t":410,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450982481,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"matte","parent":7,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[-28.906,14.531,0],"ti":[7.183,-8.833,0]},{"t":280,"s":[-43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[-43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[-25.86,31.8,0],"to":[7.183,-8.833,0],"ti":[-7.167,9.833,0]},{"t":416,"s":[0,0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Back_LofiApp","parent":9,"tt":1,"tp":9,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}]}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"behindApp","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":386,"s":[0]},{"t":397,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":25,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":450,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Back_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,140,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Back_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,117.5,0]},"a":{"a":0,"k":[252,275,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[300,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[132,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets weather","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets clock","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 7","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":250,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":256,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":286,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Back_RightDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":0,"k":476},"y":{"a":0,"k":197}},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[-0.692,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.692,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.392,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-9.675,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-14.521,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-16.835,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-18.141,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-18.925,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.386,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.622,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.692,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-22.714,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.39,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.692,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.766,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.041,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.549,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.178,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.787,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-27.326,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-27.795,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.206,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.57,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.894,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.187,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.453,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.695,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.917,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.122,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.312,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.487,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.65,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.802,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.944,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.076,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.2,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.316,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.424,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.526,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.621,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.711,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.795,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.873,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.947,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.015,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.08,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.14,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.196,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.248,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.297,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.342,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.384,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.422,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.458,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.49,0,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.52,0,0],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.547,0,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.572,0,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.594,0,0],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.613,0,0],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.645,0,0],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.677,0,0],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}]},"nm":"Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":4},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Vector 1","bm":0,"hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}]},"r":{"a":0,"k":0},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[-0.15]},"t":160,"s":[13.981]},{"t":189,"s":[-0.019]}]},"y":{"a":0,"k":0}},"a":{"a":0,"k":[-31.019,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":4}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}]}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}]}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"k":[{"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-24],[0,-24],[0,-24],[0,-24],[0,24],[0,24],[0,24],[0,24]],"c":true}],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.208,0],[0,0],[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208]],"o":[[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208],[0,0],[-2.208,0],[0,0]],"v":[[-8,-20],[-4,-24],[-4,-24],[0,-20],[0,20],[-4,24],[-4,24],[-8,20]],"c":true}],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.594,0],[0,0],[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594]],"o":[[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594],[0,0],[-2.594,0],[0,0]],"v":[[-9.401,-19.3],[-4.7,-24],[-4.7,-24],[0,-19.3],[0,19.3],[-4.7,24],[-4.7,24],[-9.401,19.3]],"c":true}],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-4.958,0],[0,0],[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958]],"o":[[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958],[0,0],[-4.958,0],[0,0]],"v":[[-17.967,-15.017],[-8.983,-24],[-8.983,-24],[0,-15.017],[0,15.017],[-8.983,24],[-8.983,24],[-17.967,15.017]],"c":true}],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-7.632,0],[0,0],[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632]],"o":[[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632],[0,0],[-7.632,0],[0,0]],"v":[[-27.659,-10.171],[-13.829,-24],[-13.829,-24],[0,-10.171],[0,10.171],[-13.829,24],[-13.829,24],[-27.659,10.171]],"c":true}],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-8.91,0],[0,0],[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91]],"o":[[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91],[0,0],[-8.91,0],[0,0]],"v":[[-32.287,-7.856],[-16.144,-24],[-16.144,-24],[0,-7.856],[0,7.856],[-16.144,24],[-16.144,24],[-32.287,7.856]],"c":true}],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-9.63,0],[0,0],[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63]],"o":[[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63],[0,0],[-9.63,0],[0,0]],"v":[[-34.898,-6.551],[-17.449,-24],[-17.449,-24],[0,-6.551],[0,6.551],[-17.449,24],[-17.449,24],[-34.898,6.551]],"c":true}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.063,0],[0,0],[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063]],"o":[[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063],[0,0],[-10.063,0],[0,0]],"v":[[-36.467,-5.766],[-18.234,-24],[-18.234,-24],[0,-5.766],[0,5.766],[-18.234,24],[-18.234,24],[-36.467,5.766]],"c":true}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.317,0],[0,0],[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317]],"o":[[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317],[0,0],[-10.317,0],[0,0]],"v":[[-37.388,-5.306],[-18.694,-24],[-18.694,-24],[0,-5.306],[0,5.306],[-18.694,24],[-18.694,24],[-37.388,5.306]],"c":true}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.448,0],[0,0],[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448]],"o":[[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448],[0,0],[-10.448,0],[0,0]],"v":[[-37.861,-5.07],[-18.93,-24],[-18.93,-24],[0,-5.07],[0,5.07],[-18.93,24],[-18.93,24],[-37.861,5.07]],"c":true}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.486,0],[0,0],[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486]],"o":[[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486],[0,0],[-10.486,0],[0,0]],"v":[[-38,-5],[-19,-24],[-19,-24],[0,-5],[0,5],[-19,24],[-19,24],[-38,5]],"c":true}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-12.154,0],[0,0],[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154]],"o":[[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154],[0,0],[-12.154,0],[0,0]],"v":[[-44.045,-1.977],[-22.023,-24],[-22.023,-24],[0,-1.977],[0,1.977],[-22.023,24],[-22.023,24],[-44.045,1.977]],"c":true}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.079,0],[0,0],[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079]],"o":[[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079],[0,0],[-13.079,0],[0,0]],"v":[[-47.396,-0.302],[-23.698,-24],[-23.698,-24],[0,-0.302],[0,0.302],[-23.698,24],[-23.698,24],[-47.396,0.302]],"c":true}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48,0],[-24,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24,24],[-48,0]],"c":true}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48.149,0],[-24.149,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24.149,24],[-48.149,0]],"c":true}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48.698,0],[-24.698,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24.698,24],[-48.698,0]],"c":true}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-49.714,0],[-25.714,-24],[-24,-24],[0,0],[0,0],[-24,24],[-25.714,24],[-49.714,0]],"c":true}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-50.973,0],[-26.973,-24],[-24,-24],[0,0],[0,0],[-24,24],[-26.973,24],[-50.973,0]],"c":true}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-52.19,0],[-28.19,-24],[-24,-24],[0,0],[0,0],[-24,24],[-28.19,24],[-52.19,0]],"c":true}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-53.268,0],[-29.268,-24],[-24,-24],[0,0],[0,0],[-24,24],[-29.268,24],[-53.268,0]],"c":true}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-54.206,0],[-30.206,-24],[-24,-24],[0,0],[0,0],[-24,24],[-30.206,24],[-54.206,0]],"c":true}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-55.028,0],[-31.028,-24],[-24,-24],[0,0],[0,0],[-24,24],[-31.028,24],[-55.028,0]],"c":true}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-55.755,0],[-31.755,-24],[-24,-24],[0,0],[0,0],[-24,24],[-31.755,24],[-55.755,0]],"c":true}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-56.405,0],[-32.405,-24],[-24,-24],[0,0],[0,0],[-24,24],[-32.405,24],[-56.405,0]],"c":true}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-56.99,0],[-32.99,-24],[-24,-24],[0,0],[0,0],[-24,24],[-32.99,24],[-56.99,0]],"c":true}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-57.522,0],[-33.522,-24],[-24,-24],[0,0],[0,0],[-24,24],[-33.522,24],[-57.522,0]],"c":true}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.006,0],[-34.006,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.006,24],[-58.006,0]],"c":true}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.451,0],[-34.451,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.451,24],[-58.451,0]],"c":true}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.861,0],[-34.861,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.861,24],[-58.861,0]],"c":true}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.24,0],[-35.24,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.24,24],[-59.24,0]],"c":true}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.591,0],[-35.591,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.591,24],[-59.591,0]],"c":true}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.917,0],[-35.917,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.917,24],[-59.917,0]],"c":true}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.221,0],[-36.221,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.221,24],[-60.221,0]],"c":true}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.504,0],[-36.504,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.504,24],[-60.504,0]],"c":true}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.769,0],[-36.769,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.769,24],[-60.769,0]],"c":true}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.017,0],[-37.017,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.017,24],[-61.017,0]],"c":true}],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.248,0],[-37.248,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.248,24],[-61.248,0]],"c":true}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.465,0],[-37.465,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.465,24],[-61.465,0]],"c":true}],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.669,0],[-37.669,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.669,24],[-61.669,0]],"c":true}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.859,0],[-37.859,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.859,24],[-61.859,0]],"c":true}],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.038,0],[-38.038,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.038,24],[-62.038,0]],"c":true}],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.205,0],[-38.205,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.205,24],[-62.205,0]],"c":true}],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.362,0],[-38.362,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.362,24],[-62.362,0]],"c":true}],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.509,0],[-38.509,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.509,24],[-62.509,0]],"c":true}],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.647,0],[-38.647,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.647,24],[-62.647,0]],"c":true}],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.776,0],[-38.776,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.776,24],[-62.776,0]],"c":true}],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.896,0],[-38.896,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.896,24],[-62.896,0]],"c":true}],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.008,0],[-39.008,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.008,24],[-63.008,0]],"c":true}],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.113,0],[-39.113,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.113,24],[-63.113,0]],"c":true}],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.21,0],[-39.21,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.21,24],[-63.21,0]],"c":true}],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.3,0],[-39.3,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.3,24],[-63.3,0]],"c":true}],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.384,0],[-39.384,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.384,24],[-63.384,0]],"c":true}],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.461,0],[-39.461,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.461,24],[-63.461,0]],"c":true}],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.532,0],[-39.532,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.532,24],[-63.532,0]],"c":true}],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.597,0],[-39.597,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.597,24],[-63.597,0]],"c":true}],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.657,0],[-39.657,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.657,24],[-63.657,0]],"c":true}],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.711,0],[-39.711,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.711,24],[-63.711,0]],"c":true}],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.76,0],[-39.76,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.76,24],[-63.76,0]],"c":true}],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.804,0],[-39.804,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.804,24],[-63.804,0]],"c":true}],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.843,0],[-39.843,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.843,24],[-63.843,0]],"c":true}],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.877,0],[-39.877,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.877,24],[-63.877,0]],"c":true}],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.907,0],[-39.907,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.907,24],[-63.907,0]],"c":true}],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.932,0],[-39.932,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.932,24],[-63.932,0]],"c":true}],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.971,0],[-39.971,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.971,24],[-63.971,0]],"c":true}],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"k":[{"s":[0,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":498,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"IndieCorners Shape","bm":0,"hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}]},"r":{"a":0,"k":0},"p":{"k":[{"s":[0,0,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.001,0,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.005,0,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.013,0,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.029,0,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.054,0,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.089,0,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.134,0,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.193,0,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.267,0,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.358,0,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.466,0,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.593,0,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.739,0,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.903,0,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.054,0,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.22,0,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.403,0,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.602,0,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.821,0,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.059,0,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.319,0,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.601,0,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.909,0,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.242,0,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.604,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.998,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.427,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.897,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.407,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.965,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-6.576,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-7.246,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-7.983,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-8.8,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-9.701,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-10.699,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-11.808,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-13.041,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-14.414,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-15.945,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-17.621,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.429,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-21.324,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-23.241,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.111,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.859,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.457,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.897,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.185,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.333,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-33.36,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-34.272,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-35.088,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-35.82,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-36.479,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-37.076,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-37.613,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.099,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.538,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.937,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.299,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.629,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.927,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.198,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.442,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.663,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.862,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.041,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.2,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.342,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.467,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.577,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.672,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.754,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.822,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.879,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.925,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.961,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}]}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"right circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"left circle","bm":0,"hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"size","bm":0,"hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"k":[{"s":[276.737,197.5,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.57,197.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.319,197.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.15,197.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.942,197.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.687,197.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.37,197.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.978,197.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.484,197.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.85,197.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.008,197.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.825,197.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.222,197.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.416,197.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[266.436,197.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.37,197.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.33,197.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.423,197.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.703,197.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.178,197.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[255.833,197.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[254.646,197.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[253.594,197.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252.657,197.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.814,197.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.052,197.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[250.36,197.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.73,197.5,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.154,197.5,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.627,197.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.142,197.5,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.694,197.5,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.28,197.5,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.897,197.5,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.541,197.5,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.211,197.5,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.904,197.5,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.619,197.5,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.353,197.5,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.107,197.5,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.876,197.5,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.661,197.5,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.461,197.5,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.274,197.5,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.099,197.5,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.937,197.5,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.787,197.5,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.648,197.5,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.52,197.5,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.291,197.5,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.098,197.5,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.866,197.5,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.655,197.5,0],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.5,197.5,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.809,197.5,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.805,197.5,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.726,197.5,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.159,197.5,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[256.3,197.5,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.431,197.5,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.009,197.5,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.087,197.5,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.496,197.5,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.536,197.5,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.339,197.5,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.98,197.5,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.502,197.5,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.933,197.5,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.295,197.5,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.599,197.5,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.857,197.5,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.075,197.5,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.259,197.5,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.415,197.5,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.655,197.5,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.926,197.5,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"a":{"a":0,"k":[0,0,0]},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":7}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[276.737,197.5],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.57,197.5],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.319,197.5],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.15,197.5],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.942,197.5],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.687,197.5],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.37,197.5],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.978,197.5],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.484,197.5],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.85,197.5],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.008,197.5],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.825,197.5],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.222,197.5],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.416,197.5],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[266.436,197.5],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.37,197.5],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.33,197.5],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.423,197.5],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.703,197.5],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.178,197.5],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[255.833,197.5],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[254.646,197.5],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[253.594,197.5],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252.657,197.5],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.814,197.5],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.052,197.5],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[250.36,197.5],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.73,197.5],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.154,197.5],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.627,197.5],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.142,197.5],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.694,197.5],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.28,197.5],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.897,197.5],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.541,197.5],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.211,197.5],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.904,197.5],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.619,197.5],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.353,197.5],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.107,197.5],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.876,197.5],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.661,197.5],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.461,197.5],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.274,197.5],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.099,197.5],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.937,197.5],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.787,197.5],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.648,197.5],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.52,197.5],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.291,197.5],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.098,197.5],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.866,197.5],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.655,197.5],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.159,197.525],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.792,197.842],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.233,199.672],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.542,204.005],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.216,208.989],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[265.399,213.457],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[267.667,217.355],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[269.364,220.773],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.685,223.812],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.743,226.538],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.606,228.991],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.321,231.197],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.92,233.179],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.427,234.953],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.858,236.532],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.225,237.926],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.539,239.152],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.808,240.219],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.038,241.138],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.233,241.918],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.398,242.568],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.537,243.099],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.653,243.517],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.824,243.574],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.884,243.254],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.928,242.802],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.959,242.269],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.976,241.685],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.15,239.729],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.715,239.199],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.839,238.218],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.95,236.594],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[286.015,234.04],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[288.407,226.983],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.954,217.108],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.005,212.156],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.975,209.156],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.314,207.064],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.834,205.487],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.461,204.24],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.159,203.226],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.905,202.385],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.691,201.676],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.503,201.072],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.339,200.553],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.193,200.105],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.061,199.716],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.941,199.376],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.831,199.079],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.729,198.82],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.636,198.594],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.551,198.398],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.472,198.228],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.399,198.082],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.333,197.956],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.209,197.759],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.063,197.577],"t":412,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450982481,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"matte","parent":7,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[29.688,0.625,0],"ti":[0,0,0]},{"t":280,"s":[43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[25.86,31.8,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}]},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}]},"p":{"a":0,"k":[0,0]},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}]},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Back_LofiApp","parent":9,"tt":1,"tp":9,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}]}},"ao":0,"w":504,"h":315,"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":"behindApp","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":386,"s":[0]},{"t":397,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":25,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":498,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Back_LeftDismiss","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,282,0]},"a":{"a":0,"k":[277,282,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":554,"h":564,"ip":0,"op":426,"st":-25,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Back_RightDismiss","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,282,0]},"a":{"a":0,"k":[277,282,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":554,"h":564,"ip":426,"op":902,"st":401,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file +{"v":"5.12.1","fr":60,"ip":96,"op":900,"w":554,"h":564,"nm":"Trackpad-JSON_BackGesture-EDU","ddd":0,"assets":[{"id":"comp_0","nm":"Back_LeftDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":79,"ix":3},"y":{"a":0,"k":197,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-0.692,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.308,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.009,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.291,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.138,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.452,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[16.757,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.542,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.002,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.238,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[18.308,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.331,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.006,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.308,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.382,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.657,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.165,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[24.794,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.403,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.942,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.411,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.822,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.186,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.511,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[27.803,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.069,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.311,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.534,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.739,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.928,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.103,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.267,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.419,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.56,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.693,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.816,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.932,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.041,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.142,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.238,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.327,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.411,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.489,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.563,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.632,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.696,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.756,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.812,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.864,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.913,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[30.958,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.039,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.074,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.107,0,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.137,0,0],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.164,0,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.188,0,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.21,0,0],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.23,0,0],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.247,0,0],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.274,0,0],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.305,0,0],"t":215,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[0.15]},"t":160,"s":[-14]},{"t":189,"s":[0]}],"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[32,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":8,"ix":1}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}],"ix":3}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48,"ix":4}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}],"ix":8}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12,"ix":9}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12,"ix":10}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12,"ix":11}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12,"ix":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0,"ix":15}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0,"ix":16}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-24],[0,-24],[0,-24],[0,-24],[0,24],[0,24],[0,24],[0,24]],"c":true}],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.208,0],[0,0],[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208]],"o":[[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208],[0,0],[-2.208,0],[0,0]],"v":[[0,-20],[4,-24],[4,-24],[8,-20],[8,20],[4,24],[4,24],[0,20]],"c":true}],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.594,0],[0,0],[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594]],"o":[[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594],[0,0],[-2.594,0],[0,0]],"v":[[0,-19.3],[4.7,-24],[4.7,-24],[9.401,-19.3],[9.401,19.3],[4.7,24],[4.7,24],[0,19.3]],"c":true}],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-4.958,0],[0,0],[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958]],"o":[[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958],[0,0],[-4.958,0],[0,0]],"v":[[0,-15.017],[8.983,-24],[8.983,-24],[17.967,-15.017],[17.967,15.017],[8.983,24],[8.983,24],[0,15.017]],"c":true}],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-7.632,0],[0,0],[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632]],"o":[[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632],[0,0],[-7.632,0],[0,0]],"v":[[0,-10.171],[13.829,-24],[13.829,-24],[27.659,-10.171],[27.659,10.171],[13.829,24],[13.829,24],[0,10.171]],"c":true}],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-8.91,0],[0,0],[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91]],"o":[[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91],[0,0],[-8.91,0],[0,0]],"v":[[0,-7.856],[16.144,-24],[16.144,-24],[32.287,-7.856],[32.287,7.856],[16.144,24],[16.144,24],[0,7.856]],"c":true}],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-9.63,0],[0,0],[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63]],"o":[[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63],[0,0],[-9.63,0],[0,0]],"v":[[0,-6.551],[17.449,-24],[17.449,-24],[34.898,-6.551],[34.898,6.551],[17.449,24],[17.449,24],[0,6.551]],"c":true}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.063,0],[0,0],[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063]],"o":[[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063],[0,0],[-10.063,0],[0,0]],"v":[[0,-5.766],[18.234,-24],[18.234,-24],[36.467,-5.766],[36.467,5.766],[18.234,24],[18.234,24],[0,5.766]],"c":true}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.317,0],[0,0],[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317]],"o":[[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317],[0,0],[-10.317,0],[0,0]],"v":[[0,-5.306],[18.694,-24],[18.694,-24],[37.388,-5.306],[37.388,5.306],[18.694,24],[18.694,24],[0,5.306]],"c":true}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.448,0],[0,0],[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448]],"o":[[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448],[0,0],[-10.448,0],[0,0]],"v":[[0,-5.07],[18.93,-24],[18.93,-24],[37.861,-5.07],[37.861,5.07],[18.93,24],[18.93,24],[0,5.07]],"c":true}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.486,0],[0,0],[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486]],"o":[[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486],[0,0],[-10.486,0],[0,0]],"v":[[0,-5],[19,-24],[19,-24],[38,-5],[38,5],[19,24],[19,24],[0,5]],"c":true}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-12.154,0],[0,0],[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154]],"o":[[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154],[0,0],[-12.154,0],[0,0]],"v":[[0,-1.977],[22.023,-24],[22.023,-24],[44.045,-1.977],[44.045,1.977],[22.023,24],[22.023,24],[0,1.977]],"c":true}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.079,0],[0,0],[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079]],"o":[[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079],[0,0],[-13.079,0],[0,0]],"v":[[0,-0.302],[23.698,-24],[23.698,-24],[47.396,-0.302],[47.396,0.302],[23.698,24],[23.698,24],[0,0.302]],"c":true}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24,-24],[48,0],[48,0],[24,24],[24,24],[0,0]],"c":true}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24.149,-24],[48.149,0],[48.149,0],[24.149,24],[24,24],[0,0]],"c":true}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[24.698,-24],[48.698,0],[48.698,0],[24.698,24],[24,24],[0,0]],"c":true}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[25.714,-24],[49.714,0],[49.714,0],[25.714,24],[24,24],[0,0]],"c":true}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[26.973,-24],[50.973,0],[50.973,0],[26.973,24],[24,24],[0,0]],"c":true}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[28.19,-24],[52.19,0],[52.19,0],[28.19,24],[24,24],[0,0]],"c":true}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[29.268,-24],[53.268,0],[53.268,0],[29.268,24],[24,24],[0,0]],"c":true}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[30.206,-24],[54.206,0],[54.206,0],[30.206,24],[24,24],[0,0]],"c":true}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[31.028,-24],[55.028,0],[55.028,0],[31.028,24],[24,24],[0,0]],"c":true}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[31.755,-24],[55.755,0],[55.755,0],[31.755,24],[24,24],[0,0]],"c":true}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[32.405,-24],[56.405,0],[56.405,0],[32.405,24],[24,24],[0,0]],"c":true}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[32.99,-24],[56.99,0],[56.99,0],[32.99,24],[24,24],[0,0]],"c":true}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[33.522,-24],[57.522,0],[57.522,0],[33.522,24],[24,24],[0,0]],"c":true}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.006,-24],[58.006,0],[58.006,0],[34.006,24],[24,24],[0,0]],"c":true}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.451,-24],[58.451,0],[58.451,0],[34.451,24],[24,24],[0,0]],"c":true}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[34.861,-24],[58.861,0],[58.861,0],[34.861,24],[24,24],[0,0]],"c":true}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.24,-24],[59.24,0],[59.24,0],[35.24,24],[24,24],[0,0]],"c":true}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.591,-24],[59.591,0],[59.591,0],[35.591,24],[24,24],[0,0]],"c":true}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[35.917,-24],[59.917,0],[59.917,0],[35.917,24],[24,24],[0,0]],"c":true}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.221,-24],[60.221,0],[60.221,0],[36.221,24],[24,24],[0,0]],"c":true}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.504,-24],[60.504,0],[60.504,0],[36.504,24],[24,24],[0,0]],"c":true}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[36.769,-24],[60.769,0],[60.769,0],[36.769,24],[24,24],[0,0]],"c":true}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.017,-24],[61.017,0],[61.017,0],[37.017,24],[24,24],[0,0]],"c":true}],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.248,-24],[61.248,0],[61.248,0],[37.248,24],[24,24],[0,0]],"c":true}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.465,-24],[61.465,0],[61.465,0],[37.465,24],[24,24],[0,0]],"c":true}],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.669,-24],[61.669,0],[61.669,0],[37.669,24],[24,24],[0,0]],"c":true}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[37.859,-24],[61.859,0],[61.859,0],[37.859,24],[24,24],[0,0]],"c":true}],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.038,-24],[62.038,0],[62.038,0],[38.038,24],[24,24],[0,0]],"c":true}],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.205,-24],[62.205,0],[62.205,0],[38.205,24],[24,24],[0,0]],"c":true}],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.362,-24],[62.362,0],[62.362,0],[38.362,24],[24,24],[0,0]],"c":true}],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.509,-24],[62.509,0],[62.509,0],[38.509,24],[24,24],[0,0]],"c":true}],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.647,-24],[62.647,0],[62.647,0],[38.647,24],[24,24],[0,0]],"c":true}],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.776,-24],[62.776,0],[62.776,0],[38.776,24],[24,24],[0,0]],"c":true}],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[38.896,-24],[62.896,0],[62.896,0],[38.896,24],[24,24],[0,0]],"c":true}],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.008,-24],[63.008,0],[63.008,0],[39.008,24],[24,24],[0,0]],"c":true}],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.113,-24],[63.113,0],[63.113,0],[39.113,24],[24,24],[0,0]],"c":true}],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.21,-24],[63.21,0],[63.21,0],[39.21,24],[24,24],[0,0]],"c":true}],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.3,-24],[63.3,0],[63.3,0],[39.3,24],[24,24],[0,0]],"c":true}],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.384,-24],[63.384,0],[63.384,0],[39.384,24],[24,24],[0,0]],"c":true}],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.461,-24],[63.461,0],[63.461,0],[39.461,24],[24,24],[0,0]],"c":true}],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.532,-24],[63.532,0],[63.532,0],[39.532,24],[24,24],[0,0]],"c":true}],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.597,-24],[63.597,0],[63.597,0],[39.597,24],[24,24],[0,0]],"c":true}],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.657,-24],[63.657,0],[63.657,0],[39.657,24],[24,24],[0,0]],"c":true}],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.711,-24],[63.711,0],[63.711,0],[39.711,24],[24,24],[0,0]],"c":true}],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.76,-24],[63.76,0],[63.76,0],[39.76,24],[24,24],[0,0]],"c":true}],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.804,-24],[63.804,0],[63.804,0],[39.804,24],[24,24],[0,0]],"c":true}],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.843,-24],[63.843,0],[63.843,0],[39.843,24],[24,24],[0,0]],"c":true}],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.877,-24],[63.877,0],[63.877,0],[39.877,24],[24,24],[0,0]],"c":true}],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.907,-24],[63.907,0],[63.907,0],[39.907,24],[24,24],[0,0]],"c":true}],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.932,-24],[63.932,0],[63.932,0],[39.932,24],[24,24],[0,0]],"c":true}],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[39.971,-24],[63.971,0],[63.971,0],[39.971,24],[24,24],[0,0]],"c":true}],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"k":[{"s":[0,0],"t":121,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":450,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"IndieCorners Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,0,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.001,0,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.005,0,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.013,0,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.029,0,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.054,0,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.089,0,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.134,0,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.193,0,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.267,0,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.358,0,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.466,0,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.593,0,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.739,0,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0.903,0,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.054,0,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.22,0,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.403,0,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.602,0,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[1.821,0,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.059,0,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.319,0,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.601,0,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[2.909,0,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.242,0,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.604,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[3.998,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.427,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[4.897,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.407,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[5.965,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[6.576,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.246,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[7.983,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[8.8,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[9.701,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[10.699,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[11.808,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[13.041,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[14.414,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[15.945,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[17.621,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[19.429,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[21.324,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[23.241,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[25.111,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[26.859,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[28.457,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[29.897,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.185,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[32.333,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[33.36,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[34.272,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.088,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[35.82,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[36.479,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.076,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[37.613,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.099,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.538,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[38.937,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.299,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.629,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[39.927,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.198,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.442,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.663,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[40.862,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.041,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.2,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.342,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.467,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.577,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.672,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.754,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.822,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.879,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.925,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[41.961,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[277.263,197.5,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.43,197.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.681,197.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.85,197.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.058,197.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.313,197.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.63,197.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.023,197.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.517,197.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.151,197.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.992,197.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.175,197.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.778,197.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.586,197.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[287.564,197.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.63,197.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[291.671,197.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.578,197.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[295.298,197.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[296.823,197.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.167,197.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.353,197.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.405,197.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.343,197.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.187,197.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.949,197.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.641,197.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.271,197.5,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.846,197.5,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.373,197.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.858,197.5,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.306,197.5,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.72,197.5,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.103,197.5,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.459,197.5,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.789,197.5,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.096,197.5,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.382,197.5,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.648,197.5,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.895,197.5,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.126,197.5,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.34,197.5,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.54,197.5,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.726,197.5,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.901,197.5,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.063,197.5,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.352,197.5,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.599,197.5,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.903,197.5,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.196,197.5,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.191,197.5,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.194,197.5,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.275,197.5,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.841,197.5,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[297.7,197.5,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.568,197.5,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.993,197.5,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.914,197.5,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.504,197.5,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.464,197.5,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.661,197.5,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.021,197.5,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.499,197.5,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.068,197.5,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.705,197.5,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.401,197.5,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.143,197.5,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.925,197.5,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.741,197.5,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.585,197.5,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.345,197.5,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.074,197.5,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":7,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[277.263,197.5],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.43,197.5],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.681,197.5],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.85,197.5],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.058,197.5],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.313,197.5],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.63,197.5],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.023,197.5],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.517,197.5],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.151,197.5],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.992,197.5],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.175,197.5],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.778,197.5],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.586,197.5],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[287.564,197.5],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[289.63,197.5],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[291.671,197.5],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.578,197.5],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[295.298,197.5],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[296.823,197.5],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.167,197.5],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[299.353,197.5],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[300.405,197.5],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[301.343,197.5],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.187,197.5],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[302.949,197.5],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[303.641,197.5],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.271,197.5],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.846,197.5],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.373,197.5],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[305.858,197.5],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.306,197.5],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[306.72,197.5],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.103,197.5],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.459,197.5],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[307.789,197.5],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.096,197.5],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.382,197.5],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.648,197.5],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.895,197.5],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.126,197.5],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.34,197.5],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.54,197.5],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.726,197.5],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[309.901,197.5],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.063,197.5],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.352,197.5],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.599,197.5],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.903,197.5],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.196,197.5],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.936,197.788],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.7,199.014],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.071,202.033],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.438,206.77],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.978,211.581],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[290.807,215.785],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[288.487,219.444],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[286.718,222.659],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.317,225.519],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[284.171,228.085],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.211,230.396],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.392,232.474],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.682,234.334],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.059,235.992],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.506,237.461],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.012,238.754],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.568,239.881],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.169,240.855],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.809,241.684],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.487,242.379],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.199,242.951],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.943,243.409],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.72,243.76],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.528,243.874],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.369,243.701],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.24,243.336],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.142,242.847],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.073,242.284],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.033,241.684],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.85,239.729],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.285,239.199],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.162,238.218],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.05,236.594],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[267.986,234.04],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[265.592,226.983],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.166,217.207],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.184,212.309],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.238,209.328],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.904,207.237],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.379,205.654],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.741,204.399],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.029,203.375],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.267,202.521],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.466,201.799],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.638,201.182],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.788,200.65],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.921,200.189],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.041,199.789],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.149,199.439],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.246,199.134],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.337,198.867],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.419,198.634],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.495,198.431],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.566,198.255],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.632,198.103],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.692,197.973],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.748,197.862],"t":408,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.86,197.692],"t":410,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"matte","parent":7,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[-28.906,14.531,0],"ti":[7.183,-8.833,0]},{"t":280,"s":[-43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[-43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[-25.86,31.8,0],"to":[7.183,-8.833,0],"ti":[-7.167,9.833,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":459,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Back_LofiApp","parent":9,"tt":1,"tp":9,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":458,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":458,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":458,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277.5,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"a":0,"k":7,"ix":1},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":457,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Back_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,140,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Back_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,117.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[300,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 1","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[132,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets weather","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets clock","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":250,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":256,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":286,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039215686,0.811764705882,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Back_RightDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":476,"ix":3},"y":{"a":0,"k":197,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-0.692,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.692,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.392,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-9.675,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-14.521,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-16.835,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-18.141,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-18.925,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.386,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.622,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.692,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-22.714,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.39,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.692,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-24.766,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.041,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.549,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.178,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.787,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-27.326,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-27.795,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.206,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.57,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.894,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.187,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.453,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.695,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.917,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.122,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.312,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.487,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.65,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.802,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-30.944,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.076,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.2,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.316,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.424,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.526,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.621,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.711,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.795,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.873,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.947,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.015,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.08,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.14,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.196,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.248,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.297,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.342,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.384,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.422,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.458,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.49,0,0],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.52,0,0],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.547,0,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.572,0,0],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.594,0,0],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.613,0,0],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.645,0,0],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.677,0,0],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[-0.15]},"t":160,"s":[13.981]},{"t":189,"s":[-0.019]}],"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[-31.019,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}],"ix":3}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48,"ix":4}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}],"ix":8}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12,"ix":9}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12,"ix":10}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12,"ix":11}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12,"ix":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0,"ix":15}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0,"ix":16}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[0,-24],[0,-24],[0,-24],[0,-24],[0,24],[0,24],[0,24],[0,24]],"c":true}],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.208,0],[0,0],[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208]],"o":[[0,-2.208],[0,0],[2.208,0],[0,0],[0,2.208],[0,0],[-2.208,0],[0,0]],"v":[[-8,-20],[-4,-24],[-4,-24],[0,-20],[0,20],[-4,24],[-4,24],[-8,20]],"c":true}],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-2.594,0],[0,0],[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594]],"o":[[0,-2.594],[0,0],[2.594,0],[0,0],[0,2.594],[0,0],[-2.594,0],[0,0]],"v":[[-9.401,-19.3],[-4.7,-24],[-4.7,-24],[0,-19.3],[0,19.3],[-4.7,24],[-4.7,24],[-9.401,19.3]],"c":true}],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-4.958,0],[0,0],[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958]],"o":[[0,-4.958],[0,0],[4.958,0],[0,0],[0,4.958],[0,0],[-4.958,0],[0,0]],"v":[[-17.967,-15.017],[-8.983,-24],[-8.983,-24],[0,-15.017],[0,15.017],[-8.983,24],[-8.983,24],[-17.967,15.017]],"c":true}],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-7.632,0],[0,0],[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632]],"o":[[0,-7.632],[0,0],[7.632,0],[0,0],[0,7.632],[0,0],[-7.632,0],[0,0]],"v":[[-27.659,-10.171],[-13.829,-24],[-13.829,-24],[0,-10.171],[0,10.171],[-13.829,24],[-13.829,24],[-27.659,10.171]],"c":true}],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-8.91,0],[0,0],[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91]],"o":[[0,-8.91],[0,0],[8.91,0],[0,0],[0,8.91],[0,0],[-8.91,0],[0,0]],"v":[[-32.287,-7.856],[-16.144,-24],[-16.144,-24],[0,-7.856],[0,7.856],[-16.144,24],[-16.144,24],[-32.287,7.856]],"c":true}],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-9.63,0],[0,0],[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63]],"o":[[0,-9.63],[0,0],[9.63,0],[0,0],[0,9.63],[0,0],[-9.63,0],[0,0]],"v":[[-34.898,-6.551],[-17.449,-24],[-17.449,-24],[0,-6.551],[0,6.551],[-17.449,24],[-17.449,24],[-34.898,6.551]],"c":true}],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.063,0],[0,0],[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063]],"o":[[0,-10.063],[0,0],[10.063,0],[0,0],[0,10.063],[0,0],[-10.063,0],[0,0]],"v":[[-36.467,-5.766],[-18.234,-24],[-18.234,-24],[0,-5.766],[0,5.766],[-18.234,24],[-18.234,24],[-36.467,5.766]],"c":true}],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.317,0],[0,0],[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317]],"o":[[0,-10.317],[0,0],[10.317,0],[0,0],[0,10.317],[0,0],[-10.317,0],[0,0]],"v":[[-37.388,-5.306],[-18.694,-24],[-18.694,-24],[0,-5.306],[0,5.306],[-18.694,24],[-18.694,24],[-37.388,5.306]],"c":true}],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.448,0],[0,0],[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448]],"o":[[0,-10.448],[0,0],[10.448,0],[0,0],[0,10.448],[0,0],[-10.448,0],[0,0]],"v":[[-37.861,-5.07],[-18.93,-24],[-18.93,-24],[0,-5.07],[0,5.07],[-18.93,24],[-18.93,24],[-37.861,5.07]],"c":true}],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-10.486,0],[0,0],[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486]],"o":[[0,-10.486],[0,0],[10.486,0],[0,0],[0,10.486],[0,0],[-10.486,0],[0,0]],"v":[[-38,-5],[-19,-24],[-19,-24],[0,-5],[0,5],[-19,24],[-19,24],[-38,5]],"c":true}],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-12.154,0],[0,0],[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154]],"o":[[0,-12.154],[0,0],[12.154,0],[0,0],[0,12.154],[0,0],[-12.154,0],[0,0]],"v":[[-44.045,-1.977],[-22.023,-24],[-22.023,-24],[0,-1.977],[0,1.977],[-22.023,24],[-22.023,24],[-44.045,1.977]],"c":true}],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.079,0],[0,0],[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079]],"o":[[0,-13.079],[0,0],[13.079,0],[0,0],[0,13.079],[0,0],[-13.079,0],[0,0]],"v":[[-47.396,-0.302],[-23.698,-24],[-23.698,-24],[0,-0.302],[0,0.302],[-23.698,24],[-23.698,24],[-47.396,0.302]],"c":true}],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48,0],[-24,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24,24],[-48,0]],"c":true}],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48.149,0],[-24.149,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24.149,24],[-48.149,0]],"c":true}],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-48.698,0],[-24.698,-24],[-24,-24],[0,0],[0,0],[-24,24],[-24.698,24],[-48.698,0]],"c":true}],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-49.714,0],[-25.714,-24],[-24,-24],[0,0],[0,0],[-24,24],[-25.714,24],[-49.714,0]],"c":true}],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-50.973,0],[-26.973,-24],[-24,-24],[0,0],[0,0],[-24,24],[-26.973,24],[-50.973,0]],"c":true}],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-52.19,0],[-28.19,-24],[-24,-24],[0,0],[0,0],[-24,24],[-28.19,24],[-52.19,0]],"c":true}],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-53.268,0],[-29.268,-24],[-24,-24],[0,0],[0,0],[-24,24],[-29.268,24],[-53.268,0]],"c":true}],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-54.206,0],[-30.206,-24],[-24,-24],[0,0],[0,0],[-24,24],[-30.206,24],[-54.206,0]],"c":true}],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-55.028,0],[-31.028,-24],[-24,-24],[0,0],[0,0],[-24,24],[-31.028,24],[-55.028,0]],"c":true}],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-55.755,0],[-31.755,-24],[-24,-24],[0,0],[0,0],[-24,24],[-31.755,24],[-55.755,0]],"c":true}],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-56.405,0],[-32.405,-24],[-24,-24],[0,0],[0,0],[-24,24],[-32.405,24],[-56.405,0]],"c":true}],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-56.99,0],[-32.99,-24],[-24,-24],[0,0],[0,0],[-24,24],[-32.99,24],[-56.99,0]],"c":true}],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-57.522,0],[-33.522,-24],[-24,-24],[0,0],[0,0],[-24,24],[-33.522,24],[-57.522,0]],"c":true}],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.006,0],[-34.006,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.006,24],[-58.006,0]],"c":true}],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.451,0],[-34.451,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.451,24],[-58.451,0]],"c":true}],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-58.861,0],[-34.861,-24],[-24,-24],[0,0],[0,0],[-24,24],[-34.861,24],[-58.861,0]],"c":true}],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.24,0],[-35.24,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.24,24],[-59.24,0]],"c":true}],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.591,0],[-35.591,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.591,24],[-59.591,0]],"c":true}],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-59.917,0],[-35.917,-24],[-24,-24],[0,0],[0,0],[-24,24],[-35.917,24],[-59.917,0]],"c":true}],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.221,0],[-36.221,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.221,24],[-60.221,0]],"c":true}],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.504,0],[-36.504,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.504,24],[-60.504,0]],"c":true}],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-60.769,0],[-36.769,-24],[-24,-24],[0,0],[0,0],[-24,24],[-36.769,24],[-60.769,0]],"c":true}],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.017,0],[-37.017,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.017,24],[-61.017,0]],"c":true}],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.248,0],[-37.248,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.248,24],[-61.248,0]],"c":true}],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.465,0],[-37.465,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.465,24],[-61.465,0]],"c":true}],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.669,0],[-37.669,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.669,24],[-61.669,0]],"c":true}],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-61.859,0],[-37.859,-24],[-24,-24],[0,0],[0,0],[-24,24],[-37.859,24],[-61.859,0]],"c":true}],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.038,0],[-38.038,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.038,24],[-62.038,0]],"c":true}],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.205,0],[-38.205,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.205,24],[-62.205,0]],"c":true}],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.362,0],[-38.362,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.362,24],[-62.362,0]],"c":true}],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.509,0],[-38.509,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.509,24],[-62.509,0]],"c":true}],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.647,0],[-38.647,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.647,24],[-62.647,0]],"c":true}],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.776,0],[-38.776,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.776,24],[-62.776,0]],"c":true}],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-62.896,0],[-38.896,-24],[-24,-24],[0,0],[0,0],[-24,24],[-38.896,24],[-62.896,0]],"c":true}],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.008,0],[-39.008,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.008,24],[-63.008,0]],"c":true}],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.113,0],[-39.113,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.113,24],[-63.113,0]],"c":true}],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.21,0],[-39.21,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.21,24],[-63.21,0]],"c":true}],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.3,0],[-39.3,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.3,24],[-63.3,0]],"c":true}],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.384,0],[-39.384,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.384,24],[-63.384,0]],"c":true}],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.461,0],[-39.461,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.461,24],[-63.461,0]],"c":true}],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.532,0],[-39.532,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.532,24],[-63.532,0]],"c":true}],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.597,0],[-39.597,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.597,24],[-63.597,0]],"c":true}],"t":203,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.657,0],[-39.657,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.657,24],[-63.657,0]],"c":true}],"t":204,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.711,0],[-39.711,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.711,24],[-63.711,0]],"c":true}],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.76,0],[-39.76,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.76,24],[-63.76,0]],"c":true}],"t":206,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.804,0],[-39.804,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.804,24],[-63.804,0]],"c":true}],"t":207,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.843,0],[-39.843,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.843,24],[-63.843,0]],"c":true}],"t":208,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.877,0],[-39.877,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.877,24],[-63.877,0]],"c":true}],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.907,0],[-39.907,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.907,24],[-63.907,0]],"c":true}],"t":210,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.932,0],[-39.932,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.932,24],[-63.932,0]],"c":true}],"t":211,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-63.971,0],[-39.971,-24],[-24,-24],[0,0],[0,0],[-24,24],[-39.971,24],[-63.971,0]],"c":true}],"t":213,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"k":[{"s":[0,0],"t":25,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":498,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"IndieCorners Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[0,0,0],"t":123,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0,0],"t":124,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.001,0,0],"t":125,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.005,0,0],"t":126,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.013,0,0],"t":127,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.029,0,0],"t":128,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.054,0,0],"t":129,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.089,0,0],"t":130,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.134,0,0],"t":131,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.193,0,0],"t":132,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.267,0,0],"t":133,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.358,0,0],"t":134,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.466,0,0],"t":135,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.593,0,0],"t":136,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.739,0,0],"t":137,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-0.903,0,0],"t":138,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.054,0,0],"t":139,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.22,0,0],"t":140,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.403,0,0],"t":141,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.602,0,0],"t":142,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-1.821,0,0],"t":143,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.059,0,0],"t":144,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.319,0,0],"t":145,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.601,0,0],"t":146,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-2.909,0,0],"t":147,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.242,0,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.604,0,0],"t":149,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-3.998,0,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.427,0,0],"t":151,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-4.897,0,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.407,0,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-5.965,0,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-6.576,0,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-7.246,0,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-7.983,0,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-8.8,0,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-9.701,0,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-10.699,0,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-11.808,0,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-13.041,0,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-14.414,0,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-15.945,0,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-17.621,0,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-19.429,0,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-21.324,0,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-23.241,0,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-25.111,0,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-26.859,0,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-28.457,0,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-29.897,0,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-31.185,0,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.333,0,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-33.36,0,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-34.272,0,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-35.088,0,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-35.82,0,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-36.479,0,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-37.076,0,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-37.613,0,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.099,0,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.538,0,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-38.937,0,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.299,0,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.629,0,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-39.927,0,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.198,0,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.442,0,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.663,0,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-40.862,0,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.041,0,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.2,0,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.342,0,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.467,0,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.577,0,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.672,0,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.754,0,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.822,0,0],"t":199,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.879,0,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.925,0,0],"t":201,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-41.961,0,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[276.737,197.5,0],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.57,197.5,0],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.319,197.5,0],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.15,197.5,0],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.942,197.5,0],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.687,197.5,0],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.37,197.5,0],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.978,197.5,0],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.484,197.5,0],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.85,197.5,0],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.008,197.5,0],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.825,197.5,0],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.222,197.5,0],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.416,197.5,0],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[266.436,197.5,0],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.37,197.5,0],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.33,197.5,0],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.423,197.5,0],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.703,197.5,0],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.178,197.5,0],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[255.833,197.5,0],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[254.646,197.5,0],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[253.594,197.5,0],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252.657,197.5,0],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.814,197.5,0],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.052,197.5,0],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[250.36,197.5,0],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.73,197.5,0],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.154,197.5,0],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.627,197.5,0],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.142,197.5,0],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.694,197.5,0],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.28,197.5,0],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.897,197.5,0],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.541,197.5,0],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.211,197.5,0],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.904,197.5,0],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.619,197.5,0],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.353,197.5,0],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.107,197.5,0],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.876,197.5,0],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.661,197.5,0],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.461,197.5,0],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.274,197.5,0],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.099,197.5,0],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.937,197.5,0],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.787,197.5,0],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.648,197.5,0],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.52,197.5,0],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.291,197.5,0],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.098,197.5,0],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.866,197.5,0],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.655,197.5,0],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.5,197.5,0],"t":380,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.809,197.5,0],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.805,197.5,0],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.726,197.5,0],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.159,197.5,0],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[256.3,197.5,0],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.431,197.5,0],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.009,197.5,0],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.087,197.5,0],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.496,197.5,0],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.536,197.5,0],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.339,197.5,0],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.98,197.5,0],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.502,197.5,0],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.933,197.5,0],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.295,197.5,0],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.599,197.5,0],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.857,197.5,0],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.075,197.5,0],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.259,197.5,0],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.415,197.5,0],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.655,197.5,0],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.926,197.5,0],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[99.914,99.914,100],"t":146,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.848,99.848,100],"t":148,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.751,99.751,100],"t":150,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.685,99.685,100],"t":151,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.605,99.605,100],"t":152,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.507,99.507,100],"t":153,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.387,99.387,100],"t":154,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.239,99.239,100],"t":155,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.056,99.056,100],"t":156,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.829,98.829,100],"t":157,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.542,98.542,100],"t":158,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.174,98.174,100],"t":159,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.686,97.686,100],"t":160,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97,97,100],"t":161,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.071,96.071,100],"t":162,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.025,95.025,100],"t":163,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[93.878,93.878,100],"t":164,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.678,92.678,100],"t":165,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[91.495,91.495,100],"t":166,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[90.39,90.39,100],"t":167,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[89.393,89.393,100],"t":168,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88.508,88.508,100],"t":169,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.729,87.729,100],"t":170,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[87.041,87.041,100],"t":171,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[86.43,86.43,100],"t":172,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.886,85.886,100],"t":173,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[85.397,85.397,100],"t":174,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.956,84.956,100],"t":175,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.555,84.555,100],"t":176,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[84.191,84.191,100],"t":177,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.857,83.857,100],"t":178,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.552,83.552,100],"t":179,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.271,83.271,100],"t":180,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.011,83.011,100],"t":181,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.771,82.771,100],"t":182,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.549,82.549,100],"t":183,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.342,82.342,100],"t":184,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[82.151,82.151,100],"t":185,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.973,81.973,100],"t":186,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.807,81.807,100],"t":187,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.653,81.653,100],"t":188,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.51,81.51,100],"t":189,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.376,81.376,100],"t":190,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.251,81.251,100],"t":191,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.135,81.135,100],"t":192,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.027,81.027,100],"t":193,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.926,80.926,100],"t":194,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.833,80.833,100],"t":195,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.746,80.746,100],"t":196,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.665,80.665,100],"t":197,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.591,80.591,100],"t":198,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.522,80.522,100],"t":199,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.458,80.458,100],"t":200,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.4,80.4,100],"t":201,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.346,80.346,100],"t":202,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.298,80.298,100],"t":203,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.253,80.253,100],"t":204,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.176,80.176,100],"t":206,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.115,80.115,100],"t":208,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.049,80.049,100],"t":211,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":380,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.179,80.179,100],"t":381,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80.757,80.757,100],"t":382,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[81.87,81.87,100],"t":383,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[83.86,83.86,100],"t":384,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[88,88,100],"t":385,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[92.714,92.714,100],"t":386,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[94.789,94.789,100],"t":387,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[95.992,95.992,100],"t":388,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[96.809,96.809,100],"t":389,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.412,97.412,100],"t":390,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[97.878,97.878,100],"t":391,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.249,98.249,100],"t":392,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.553,98.553,100],"t":393,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[98.803,98.803,100],"t":394,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.012,99.012,100],"t":395,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.188,99.188,100],"t":396,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.337,99.337,100],"t":397,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.464,99.464,100],"t":398,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.57,99.57,100],"t":399,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.661,99.661,100],"t":400,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.737,99.737,100],"t":401,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.8,99.8,100],"t":402,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.896,99.896,100],"t":404,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[99.99,99.99,100],"t":408,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":10,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":8,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[276.737,197.5],"t":148,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.57,197.5],"t":150,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.319,197.5],"t":152,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.15,197.5],"t":153,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.942,197.5],"t":154,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.687,197.5],"t":155,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.37,197.5],"t":156,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.978,197.5],"t":157,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.484,197.5],"t":158,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.85,197.5],"t":159,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.008,197.5],"t":160,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.825,197.5],"t":161,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.222,197.5],"t":162,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[268.416,197.5],"t":163,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[266.436,197.5],"t":164,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[264.37,197.5],"t":165,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.33,197.5],"t":166,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[260.423,197.5],"t":167,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[258.703,197.5],"t":168,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.178,197.5],"t":169,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[255.833,197.5],"t":170,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[254.646,197.5],"t":171,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[253.594,197.5],"t":172,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[252.657,197.5],"t":173,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.814,197.5],"t":174,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.052,197.5],"t":175,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[250.36,197.5],"t":176,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.73,197.5],"t":177,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[249.154,197.5],"t":178,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.627,197.5],"t":179,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[248.142,197.5],"t":180,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.694,197.5],"t":181,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[247.28,197.5],"t":182,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.897,197.5],"t":183,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.541,197.5],"t":184,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[246.211,197.5],"t":185,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.904,197.5],"t":186,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.619,197.5],"t":187,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.353,197.5],"t":188,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.107,197.5],"t":189,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.876,197.5],"t":190,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.661,197.5],"t":191,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.461,197.5],"t":192,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.274,197.5],"t":193,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[244.099,197.5],"t":194,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.937,197.5],"t":195,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.787,197.5],"t":196,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.648,197.5],"t":197,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.52,197.5],"t":198,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.291,197.5],"t":200,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.098,197.5],"t":202,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.866,197.5],"t":205,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.655,197.5],"t":209,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.159,197.525],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.792,197.842],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.233,199.672],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.542,204.005],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.216,208.989],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[265.399,213.457],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[267.667,217.355],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[269.364,220.773],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.685,223.812],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.743,226.538],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.606,228.991],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.321,231.197],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.92,233.179],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.427,234.953],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.858,236.532],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.225,237.926],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.539,239.152],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.808,240.219],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.038,241.138],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.233,241.918],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.398,242.568],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.537,243.099],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.653,243.517],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.824,243.574],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.884,243.254],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.928,242.802],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.959,242.269],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.976,241.685],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.15,239.729],"t":381,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.715,239.199],"t":382,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.839,238.218],"t":383,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.95,236.594],"t":384,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[286.015,234.04],"t":385,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[288.407,226.983],"t":386,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.954,217.108],"t":387,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.005,212.156],"t":388,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.975,209.156],"t":389,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.314,207.064],"t":390,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.834,205.487],"t":391,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.461,204.24],"t":392,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.159,203.226],"t":393,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.905,202.385],"t":394,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.691,201.676],"t":395,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.503,201.072],"t":396,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.339,200.553],"t":397,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.193,200.105],"t":398,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.061,199.716],"t":399,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.941,199.376],"t":400,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.831,199.079],"t":401,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.729,198.82],"t":402,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.636,198.594],"t":403,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.551,198.398],"t":404,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.472,198.228],"t":405,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.399,198.082],"t":406,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.333,197.956],"t":407,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.209,197.759],"t":409,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.063,197.577],"t":412,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"matte","parent":8,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[29.688,0.625,0],"ti":[0,0,0]},{"t":280,"s":[43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[25.86,31.8,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Back_LofiApp","parent":10,"tt":1,"tp":10,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":508,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":25,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":498,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":508,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"Back_LeftDismiss","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":0,"op":426,"st":-25,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"Back_RightDismiss","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":426,"op":902,"st":401,"ct":1,"bm":0}],"markers":[{"tm":96,"cm":"start","dr":0},{"tm":117,"cm":"gesture to R","dr":75},{"tm":192,"cm":"end progress R","dr":0},{"tm":543,"cm":"gesture to L","dr":75},{"tm":618,"cm":"end progress L","dr":0},{"tm":781,"cm":"launch","dr":75}],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_back_success.json b/packages/SystemUI/res/raw/trackpad_back_success.json deleted file mode 100644 index 56b6ff17d1f6..000000000000 --- a/packages/SystemUI/res/raw/trackpad_back_success.json +++ /dev/null @@ -1 +0,0 @@ -{"v":"5.12.1","fr":60,"ip":0,"op":50,"w":554,"h":564,"nm":"Trackpad-JSON_Success","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadBack_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}]},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[95.049,95.049,100]}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}]},"p":{"a":0,"k":[81,127,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}]}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":-0.289},"p":{"a":0,"k":[14.364,-33.591,0]},"a":{"a":0,"k":[-0.125,0,0]},"s":{"a":0,"k":[104.744,104.744,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false}},"nm":"Path 1","hd":false},{"ty":"tm","s":{"a":0,"k":0},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}]},"o":{"a":0,"k":0},"m":1,"nm":"Trim Paths 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":11},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Shape 1","bm":0,"hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[95,95,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":88},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"k":[{"s":[0.208,0.302,0.184,1],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.208,0.302,0.184,1],"t":43,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Checkbox - Widget","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Back_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[339.937,151.75,0]},"a":{"a":0,"k":[339.937,151.75,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Triangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Rectangle","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[334,279]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Text field","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Sent","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":14},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Received","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[334,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":16},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,171.125,0]},"a":{"a":0,"k":[82,171.125,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 2","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[82,140,0]},"a":{"a":0,"k":[82,140.938,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":39.375},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Search","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"header","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":12},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Message","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[82,171]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"block","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Line 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":200},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Avatar","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"circle 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app only","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Back_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,117.5,0]},"a":{"a":0,"k":[252,275,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 2","np":8,"mn":"ADBE Drop Shadow","ix":2,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 3","np":8,"mn":"ADBE Drop Shadow","ix":3,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 4","np":8,"mn":"ADBE Drop Shadow","ix":4,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 5","np":8,"mn":"ADBE Drop Shadow","ix":5,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 6","np":8,"mn":"ADBE Drop Shadow","ix":6,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 7","np":8,"mn":"ADBE Drop Shadow","ix":7,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 8","np":8,"mn":"ADBE Drop Shadow","ix":8,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 9","np":8,"mn":"ADBE Drop Shadow","ix":9,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 10","np":8,"mn":"ADBE Drop Shadow","ix":10,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 11","np":8,"mn":"ADBE Drop Shadow","ix":11,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 12","np":8,"mn":"ADBE Drop Shadow","ix":12,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 5","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[300,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"hotseat - 1","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":15},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[132,275]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"qsb","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 2","np":8,"mn":"ADBE Drop Shadow","ix":2,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 3","np":8,"mn":"ADBE Drop Shadow","ix":3,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 4","np":8,"mn":"ADBE Drop Shadow","ix":4,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets weather","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true}},"nm":"Path 1","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"widgets clock","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,-29.497,0]},"a":{"a":0,"k":[252,128.003,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":25,"nm":"Drop Shadow","np":8,"mn":"ADBE Drop Shadow","ix":1,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 2","np":8,"mn":"ADBE Drop Shadow","ix":2,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 3","np":8,"mn":"ADBE Drop Shadow","ix":3,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 4","np":8,"mn":"ADBE Drop Shadow","ix":4,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 5","np":8,"mn":"ADBE Drop Shadow","ix":5,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 6","np":8,"mn":"ADBE Drop Shadow","ix":6,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 7","np":8,"mn":"ADBE Drop Shadow","ix":7,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 8","np":8,"mn":"ADBE Drop Shadow","ix":8,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 9","np":8,"mn":"ADBE Drop Shadow","ix":9,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 10","np":8,"mn":"ADBE Drop Shadow","ix":10,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 11","np":8,"mn":"ADBE Drop Shadow","ix":11,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 12","np":8,"mn":"ADBE Drop Shadow","ix":12,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 13","np":8,"mn":"ADBE Drop Shadow","ix":13,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.039999999106]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":10.2}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0.394}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":1.181}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]},{"ty":25,"nm":"Drop Shadow 14","np":8,"mn":"ADBE Drop Shadow","ix":14,"en":1,"ef":[{"ty":2,"nm":"Shadow Color","mn":"ADBE Drop Shadow-0001","ix":1,"v":{"a":0,"k":[0,0,0,0.029999999329]}},{"ty":0,"nm":"Opacity","mn":"ADBE Drop Shadow-0002","ix":2,"v":{"a":0,"k":7.65}},{"ty":0,"nm":"Direction","mn":"ADBE Drop Shadow-0003","ix":3,"v":{"a":0,"k":180}},{"ty":0,"nm":"Distance","mn":"ADBE Drop Shadow-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Softness","mn":"ADBE Drop Shadow-0005","ix":5,"v":{"a":0,"k":2.362}},{"ty":7,"nm":"Shadow Only","mn":"ADBE Drop Shadow-0006","ix":6,"v":{"a":0,"k":0}}]}],"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 7","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 6","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 4","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 3","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 2","bm":0,"hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24]},"p":{"a":0,"k":[0,0]},"nm":"Ellipse Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215686275,0.125490196078,0.027450980392,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"apps","bm":0,"hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"app - 1","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":250,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":256,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":286,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}]}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[252,157.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"illustrations: action key","bm":0,"hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,459,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":18},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"Frame 1321317559","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadBack_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,198.5,0]},"a":{"a":0,"k":[95,95,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":190,"h":190,"ip":6,"op":50,"st":6,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":1,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":7,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[0,0],"t":0,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":49,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450982481,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Back_LofiApp","parent":4,"tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[0,0,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}]}},"ao":0,"w":504,"h":315,"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"behindApp","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":386,"s":[0]},{"t":397,"s":[100]}]},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[252,157.5,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"w":504,"h":315,"ip":0,"op":50,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100},"r":{"a":0,"k":0},"p":{"a":0,"k":[277,197.5,0]},"a":{"a":0,"k":[0,0,0]},"s":{"a":0,"k":[100,100,100]}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315]},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":28},"nm":"Rectangle Path 1","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"w":{"a":0,"k":14},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":49,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4},"hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1]},"o":{"a":0,"k":100},"r":1,"bm":0,"nm":"Fill 1","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0]},"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"r":{"a":0,"k":0},"o":{"a":0,"k":100},"sk":{"a":0,"k":0},"sa":{"a":0,"k":0},"nm":"Transform"}],"nm":"frame","bm":0,"hd":false}],"ip":0,"op":50,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_back_success_left.json b/packages/SystemUI/res/raw/trackpad_back_success_left.json new file mode 100644 index 000000000000..2e188652d862 --- /dev/null +++ b/packages/SystemUI/res/raw/trackpad_back_success_left.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":91,"w":554,"h":564,"nm":"Trackpad-JSON_BackGesture-rightSuccess","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadBack_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[95.049,95.049,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}],"ix":10},"p":{"a":0,"k":[81,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.289,"ix":10},"p":{"a":0,"k":[14.364,-33.591,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.125,0,0],"ix":1,"l":2},"s":{"a":0,"k":[104.744,104.744,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":11,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,95,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":88,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"k":[{"s":[0.208,0.302,0.184,1],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.208,0.302,0.184,1],"t":43,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Checkbox - Widget","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Back_RightDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":2,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":476,"ix":3},"y":{"a":0,"k":197,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-32.692,0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-32.692,0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":2,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[-0.15]},"t":160,"s":[13.981]},{"t":189,"s":[-0.019]}],"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[-31.019,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":4,"ix":1}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}],"ix":3}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48,"ix":4}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}],"ix":8}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12,"ix":9}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12,"ix":10}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12,"ix":11}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12,"ix":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0,"ix":15}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0,"ix":16}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-64,0],[-40,-24],[-24,-24],[0,0],[0,0],[-24,24],[-40,24],[-64,0]],"c":true}],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[-64,0],[-40,-24],[-24,-24],[0,0],[0,0],[-24,24],[-40,24],[-64,0]],"c":true}],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"k":[{"s":[0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"IndieCorners Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":7,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[-42,0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[-42,0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[242.5,197.5,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[242.5,197.5,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[80,80,100],"t":250,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":340,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":10,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":8,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[242.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[243.159,197.525],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[245.792,197.842],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[251.233,199.672],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[257.542,204.005],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[262.216,208.989],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[265.399,213.457],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[267.667,217.355],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[269.364,220.773],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[270.685,223.812],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[271.743,226.538],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[272.606,228.991],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.321,231.197],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[273.92,233.179],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.427,234.953],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[274.858,236.532],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.225,237.926],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.539,239.152],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[275.808,240.219],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.038,241.138],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.233,241.918],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.398,242.568],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.537,243.099],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.653,243.517],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.824,243.574],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.884,243.254],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.928,242.802],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.959,242.269],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.976,241.685],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[276.98,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":4,"nm":"matte","parent":8,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[29.688,0.625,0],"ti":[0,0,0]},{"t":280,"s":[43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[25.86,31.8,0],"to":[0,0,0],"ti":[0,0,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"t":280,"s":[30,30],"h":1},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"t":280,"s":[30],"h":1},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":0,"nm":"Back_LofiApp","parent":10,"tt":1,"tp":10,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":501,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":14,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":340,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":501,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Back_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,140,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Back_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,117.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[300,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 1","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[132,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets weather","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets clock","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":250,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":256,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":286,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039215686,0.811764705882,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadBack_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,198.5,0],"ix":2,"l":2},"a":{"a":0,"k":[95,95,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":190,"h":190,"ip":47,"op":91,"st":47,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":430,"s":[100]},{"t":433,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[0,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450982481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":41,"op":91,"st":41,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Back_RightDismiss","tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":0,"op":91,"st":-250,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"behindApp","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":386,"s":[0]},{"t":397,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":90,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/res/raw/trackpad_back_success_right.json b/packages/SystemUI/res/raw/trackpad_back_success_right.json new file mode 100644 index 000000000000..d5e4606622d2 --- /dev/null +++ b/packages/SystemUI/res/raw/trackpad_back_success_right.json @@ -0,0 +1 @@ +{"v":"5.12.1","fr":60,"ip":0,"op":91,"w":554,"h":564,"nm":"Trackpad-JSON_BackGesture-leftSuccess","ddd":0,"assets":[{"id":"comp_0","nm":"TrackpadBack_Success_Checkmark","fr":60,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"Check Rotate","parent":2,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":2,"s":[-16]},{"t":20,"s":[6]}],"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[95.049,95.049,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":228,"st":-72,"bm":0},{"ddd":0,"ind":2,"ty":3,"nm":"Bounce","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.12],"y":[1]},"o":{"x":[0.44],"y":[0]},"t":12,"s":[0]},{"t":36,"s":[-6]}],"ix":10},"p":{"a":0,"k":[81,127,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.263,0.263,0.833],"y":[1.126,1.126,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.958,0.958,0]},"t":1,"s":[80,80,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.45,0.45,0.167],"y":[0.325,0.325,0]},"t":20,"s":[105,105,100]},{"t":36,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":300,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":-0.289,"ix":10},"p":{"a":0,"k":[14.364,-33.591,0],"ix":2,"l":2},"a":{"a":0,"k":[-0.125,0,0],"ix":1,"l":2},"s":{"a":0,"k":[104.744,104.744,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[-1.401,-0.007],[-10.033,11.235]],"o":[[5.954,7.288],[1.401,0.007],[0,0]],"v":[[-28.591,4.149],[-10.73,26.013],[31.482,-21.255]],"c":false},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.2],"y":[1]},"o":{"x":[0.4],"y":[0]},"t":3,"s":[0]},{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.001],"y":[0.149]},"t":10,"s":[29]},{"t":27,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":11,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Shape 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":5,"op":44,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[95,95,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.275,0.275,0.21],"y":[1.102,1.102,1]},"o":{"x":[0.037,0.037,0.05],"y":[0.476,0.476,0]},"t":0,"s":[0,0,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.252,0.252,0.47],"y":[0.159,0.159,0]},"t":16,"s":[120,120,100]},{"t":28,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.32,0.32],"y":[0.11,0.11]},"t":16,"s":[148,148]},{"t":28,"s":[136,136]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":88,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"k":[{"s":[0.208,0.302,0.184,1],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[0.208,0.302,0.184,1],"t":43,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Checkbox - Widget","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_1","nm":"Back_LeftDismiss","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":3,"nm":"release Scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":0,"k":79,"ix":3},"y":{"a":0,"k":197,"ix":4}},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.08,0.08,0.08],"y":[0.47,0.47,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.999,0.999,0.999],"y":[1,1,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":254,"s":[105,105,100]},{"t":266,"s":[50,50,100]}],"ix":6,"l":2}},"ao":0,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":3,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":151,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":154,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":255,"s":[100]},{"t":258,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[31.308,0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[31.308,0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":1,"k":[{"i":{"x":0.833,"y":0.833},"o":{"x":0.36,"y":0},"t":150,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[5.459,5.2],[-3.459,0],[5.459,-5.2]],"c":false}]},{"i":{"x":0.02,"y":1},"o":{"x":0.167,"y":0.167},"t":152,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[4.779,4.88],[-3.459,0],[4.779,-4.88]],"c":false}]},{"i":{"x":0.833,"y":0.833},"o":{"x":0.167,"y":0.167},"t":159,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"i":{"x":0,"y":1},"o":{"x":0.12,"y":0},"t":162,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,7.2],[-3.459,0],[3.459,-7.2]],"c":false}]},{"t":217,"s":[{"i":[[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0]],"v":[[3.459,9.2],[-3.459,0],[3.459,-9.2]],"c":false}]}],"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"st","c":{"a":0,"k":[0.121568627656,0.211764708161,0.101960785687,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":4,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Vector 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":1,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":257,"s":[100]},{"t":260,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"s":true,"x":{"a":1,"k":[{"i":{"x":[0.22],"y":[1]},"o":{"x":[0.06],"y":[0.15]},"t":160,"s":[-14]},{"t":189,"s":[0]}],"ix":3},"y":{"a":0,"k":0,"ix":4}},"a":{"a":0,"k":[32,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"IndieCorners","np":21,"mn":"Pseudo/0.20784385308943532","ix":1,"en":1,"ef":[{"ty":7,"nm":"Align","mn":"Pseudo/0.20784385308943532-0001","ix":1,"v":{"a":0,"k":8,"ix":1}},{"ty":6,"nm":"Size","mn":"Pseudo/0.20784385308943532-0002","ix":2,"v":0},{"ty":0,"nm":"w","mn":"Pseudo/0.20784385308943532-0003","ix":3,"v":{"a":1,"k":[{"t":149,"s":[0],"h":1},{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[8]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[38]},{"i":{"x":[0.002],"y":[1]},"o":{"x":[0.119],"y":[0]},"t":162,"s":[48]},{"t":217,"s":[64]}],"ix":3}},{"ty":0,"nm":"h","mn":"Pseudo/0.20784385308943532-0004","ix":4,"v":{"a":0,"k":48,"ix":4}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0005","ix":5,"v":0},{"ty":6,"nm":"Rounding","mn":"Pseudo/0.20784385308943532-0006","ix":6,"v":0},{"ty":7,"nm":"Same for all corners","mn":"Pseudo/0.20784385308943532-0007","ix":7,"v":{"a":0,"k":1,"ix":7}},{"ty":0,"nm":"All corners","mn":"Pseudo/0.20784385308943532-0008","ix":8,"v":{"a":1,"k":[{"i":{"x":[0.02],"y":[1]},"o":{"x":[0.365],"y":[0]},"t":150,"s":[80]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.336],"y":[0]},"t":159,"s":[24]},{"t":162,"s":[80]}],"ix":8}},{"ty":0,"nm":"tl","mn":"Pseudo/0.20784385308943532-0009","ix":9,"v":{"a":0,"k":12,"ix":9}},{"ty":0,"nm":"tr","mn":"Pseudo/0.20784385308943532-0010","ix":10,"v":{"a":0,"k":12,"ix":10}},{"ty":0,"nm":"br","mn":"Pseudo/0.20784385308943532-0011","ix":11,"v":{"a":0,"k":12,"ix":11}},{"ty":0,"nm":"bl","mn":"Pseudo/0.20784385308943532-0012","ix":12,"v":{"a":0,"k":12,"ix":12}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0013","ix":13,"v":0},{"ty":6,"nm":"Alignment","mn":"Pseudo/0.20784385308943532-0014","ix":14,"v":0},{"ty":0,"nm":"X Anchor %","mn":"Pseudo/0.20784385308943532-0015","ix":15,"v":{"a":0,"k":0,"ix":15}},{"ty":0,"nm":"Y Anchor %","mn":"Pseudo/0.20784385308943532-0016","ix":16,"v":{"a":0,"k":0,"ix":16}},{"ty":0,"nm":"X Position","mn":"Pseudo/0.20784385308943532-0017","ix":17,"v":{"a":0,"k":0,"ix":17}},{"ty":0,"nm":"Y Position ","mn":"Pseudo/0.20784385308943532-0018","ix":18,"v":{"a":0,"k":0,"ix":18}},{"ty":6,"nm":"","mn":"Pseudo/0.20784385308943532-0019","ix":19,"v":0}]}],"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"k":[{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[40,-24],[64,0],[64,0],[40,24],[24,24],[0,0]],"c":true}],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[{"i":[[0,0],[-13.246,0],[0,0],[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246]],"o":[[0,-13.246],[0,0],[13.246,0],[0,0],[0,13.246],[0,0],[-13.246,0],[0,0]],"v":[[0,0],[24,-24],[40,-24],[64,0],[64,0],[40,24],[24,24],[0,0]],"c":true}],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"k":[{"s":[0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"IndieCorners Shape","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","parent":6,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":37,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":47,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":249,"s":[100]},{"t":255,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[42,0,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[42,0,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Super Slider","np":3,"mn":"ADBE Slider Control","ix":1,"en":1,"ef":[{"ty":0,"nm":"Slider","mn":"ADBE Slider Control-0001","ix":1,"v":{"a":1,"k":[{"i":{"x":[0.64],"y":[0.48]},"o":{"x":[0.36],"y":[0]},"t":121,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":138,"s":[17.5]},{"t":205,"s":[100]}],"ix":1}}]}],"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"right circle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":1,"k":[{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":62,"s":[-41,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":0.56},"o":{"x":0.44,"y":0.44},"t":72,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"i":{"x":0.56,"y":1},"o":{"x":0.44,"y":0},"t":247,"s":[-33,0],"to":[0,0],"ti":[0,0]},{"t":257,"s":[-41,0]}],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"left circle","np":2,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":1,"k":[{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":62,"s":[36,36]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":72,"s":[28,28]},{"i":{"x":[0.56,0.56],"y":[1,1]},"o":{"x":[0.44,0.44],"y":[0,0]},"t":247,"s":[28,28]},{"t":257,"s":[36,36]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"size","np":2,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":37,"op":345,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":3,"nm":"pb:scale","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"k":[{"s":[311.5,197.5,0],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[311.5,197.5,0],"t":340,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}],"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"k":[{"s":[80,80,100],"t":250,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}},{"s":[80,80,100],"t":340,"i":{"x":[1,1,1],"y":[1,1,1]},"o":{"x":[0,0,0],"y":[0,0,0]}}],"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":9,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":256,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":389,"s":[100]},{"t":392,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":7,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[311.5,197.5],"t":250,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[310.936,197.788],"t":251,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[308.7,199.014],"t":252,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[304.071,202.033],"t":253,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[298.438,206.77],"t":254,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[293.978,211.581],"t":255,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[290.807,215.785],"t":256,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[288.487,219.444],"t":257,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[286.718,222.659],"t":258,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[285.317,225.519],"t":259,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[284.171,228.085],"t":260,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[283.211,230.396],"t":261,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[282.392,232.474],"t":262,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.682,234.334],"t":263,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[281.059,235.992],"t":264,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.506,237.461],"t":265,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[280.012,238.754],"t":266,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.568,239.881],"t":267,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[279.169,240.855],"t":268,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.809,241.684],"t":269,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.487,242.379],"t":270,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[278.199,242.951],"t":271,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.943,243.409],"t":272,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.72,243.76],"t":273,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.528,243.874],"t":274,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.369,243.701],"t":275,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.24,243.336],"t":276,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.142,242.847],"t":277,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.073,242.284],"t":278,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.033,241.684],"t":279,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,241.075],"t":280,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,240.497],"t":281,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.98],"t":282,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.538],"t":283,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.181],"t":284,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,238.917],"t":285,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.065],"t":293,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.265],"t":295,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.455],"t":297,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[277.02,239.685],"t":300,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":9,"ty":4,"nm":"matte","parent":7,"td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":1,"k":[{"i":{"x":0,"y":1},"o":{"x":0.2,"y":0},"t":250,"s":[0,0,0],"to":[-28.906,14.531,0],"ti":[7.183,-8.833,0]},{"t":280,"s":[-43.1,53,0],"h":1},{"i":{"x":0.8,"y":0.15},"o":{"x":0.3,"y":0},"t":380,"s":[-43.1,53,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.1,"y":1},"o":{"x":0.05,"y":0.7},"t":386,"s":[-25.86,31.8,0],"to":[7.183,-8.833,0],"ti":[-7.167,9.833,0]},{"t":416,"s":[0,0,0]}],"ix":2,"l":2},"a":{"a":1,"k":[{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":255,"s":[0,0,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.573,"y":1},"o":{"x":0.236,"y":0},"t":273,"s":[0,-6,0],"to":[0,0,0],"ti":[0,0,0]},{"i":{"x":0.5,"y":1},"o":{"x":0.28,"y":0},"t":287,"s":[0,1.5,0],"to":[0,0,0],"ti":[0,0,0]},{"t":307,"s":[0,0,0]}],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.2,0.2],"y":[0,0]},"t":250,"s":[504,315]},{"i":{"x":[0,0],"y":[1,1]},"o":{"x":[0.167,0.167],"y":[0,0]},"t":280,"s":[30,30]},{"i":{"x":[0.8,0.8],"y":[0.15,0.15]},"o":{"x":[0.3,0.3],"y":[0,0]},"t":380,"s":[30,30]},{"i":{"x":[0.1,0.1],"y":[1,1]},"o":{"x":[0.05,0.05],"y":[0.7,0.7]},"t":386,"s":[219.6,144]},{"t":416,"s":[504,315]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":1,"k":[{"i":{"x":[0],"y":[1]},"o":{"x":[0.2],"y":[0]},"t":250,"s":[28]},{"i":{"x":[0],"y":[1]},"o":{"x":[0.167],"y":[0]},"t":280,"s":[30]},{"i":{"x":[0.8],"y":[0.15]},"o":{"x":[0.3],"y":[0]},"t":380,"s":[30]},{"i":{"x":[0.1],"y":[1]},"o":{"x":[0.05],"y":[0.7]},"t":386,"s":[29.2]},{"t":416,"s":[28]}],"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":10,"ty":0,"nm":"Back_LofiApp","parent":9,"tt":1,"tp":9,"refId":"comp_2","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0,0,0],"y":[1,1,1]},"o":{"x":[0.2,0.2,0.2],"y":[0,0,0]},"t":250,"s":[100,100,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":280,"s":[10,10,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[10,10,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[46,46,100]},{"t":416,"s":[100,100,100]}],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":11,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":50,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":12,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":451,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":13,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":250,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":340,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843152214,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":451,"st":0,"ct":1,"bm":0}]},{"id":"comp_2","nm":"Back_LofiApp","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[339.937,151.75,0],"ix":2,"l":2},"a":{"a":0,"k":[339.937,151.75,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[1.021,-1.766],[0,0],[-2.043,0],[0,0],[1.022,1.767]],"o":[[-1.021,-1.766],[0,0],[-1.022,1.767],[0,0],[2.043,0],[0,0]],"v":[[2.297,-7.675],[-2.297,-7.675],[-9.64,5.025],[-7.343,9],[7.343,9],[9.64,5.025]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":9,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[481.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Triangle","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[18,18],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[457.874,21],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[292,25],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[334,279],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Text field","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[109,28],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[425.5,208.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[160,56],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[400,158.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Sent","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[126,40],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":14,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[251,78.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Received","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[334,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[340,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":16,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,171.125,0],"ix":2,"l":2},"a":{"a":0,"k":[82,171.125,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,177.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 4","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,165.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 3","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,171.125],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 2","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[82,140,0],"ix":2,"l":2},"a":{"a":0,"k":[82,140.938,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,22],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":39.375,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Search","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,31.5],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"header","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,257.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,245.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 5","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,251.375],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 3","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[132,64],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":12,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Message","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[82,171],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"block","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[64,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[80,96.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[92,8],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[94,84.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Line 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[20,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":200,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450980619,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Avatar","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[34,90.875],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"circle 1","np":1,"cix":2,"bm":0,"ix":8,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app only","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]},{"id":"comp_3","nm":"Back_LofiLauncher","fr":60,"pfr":1,"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,117.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,275,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 5","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 4","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 3","np":1,"cix":2,"bm":0,"ix":3,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[300,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 2","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"hotseat - 1","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[168,20],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":15,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[132,275],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"qsb","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[20.144,20.144],[20.144,-20.144],[0,0],[-20.144,-20.144],[-20.144,20.144],[0,0]],"o":[[-20.144,-20.144],[0,0],[-20.144,20.144],[20.144,20.144],[0,0],[20.144,-20.144]],"v":[[44.892,-44.892],[-28.057,-44.892],[-44.892,-28.057],[-44.892,44.892],[28.057,44.892],[44.892,28.057]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[108,152.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets weather","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,0],[4.782,-2.684],[0,0],[2.63,-0.033],[0,0],[2.807,-4.716],[0,0],[2.263,-1.343],[0,0],[0.066,-5.485],[0,0],[1.292,-2.295],[0,0],[-2.683,-4.784],[0,0],[-0.033,-2.63],[0,0],[-4.716,-2.807],[0,0],[-1.338,-2.263],[0,0],[-5.483,-0.066],[0,0],[-2.296,-1.292],[0,0],[-4.782,2.683],[0,0],[-2.63,0.033],[0,0],[-2.807,4.716],[0,0],[-2.263,1.338],[0,0],[-0.066,5.483],[0,0],[-1.292,2.295],[0,0],[2.683,4.784],[0,0],[0.033,2.631],[0,0],[4.716,2.801],[0,0],[1.338,2.262],[0,0],[5.483,0.068],[0,0],[2.296,1.287]],"o":[[-4.782,-2.684],[0,0],[-2.296,1.287],[0,0],[-5.483,0.068],[0,0],[-1.338,2.262],[0,0],[-4.716,2.801],[0,0],[-0.033,2.631],[0,0],[-2.683,4.784],[0,0],[1.292,2.295],[0,0],[0.066,5.483],[0,0],[2.263,1.338],[0,0],[2.807,4.716],[0,0],[2.63,0.033],[0,0],[4.782,2.683],[0,0],[2.296,-1.292],[0,0],[5.483,-0.066],[0,0],[1.338,-2.263],[0,0],[4.716,-2.807],[0,0],[0.033,-2.63],[0,0],[2.683,-4.784],[0,0],[-1.292,-2.295],[0,0],[-0.066,-5.485],[0,0],[-2.263,-1.343],[0,0],[-2.807,-4.716],[0,0],[-2.63,-0.033],[0,0]],"v":[[7.7,-57.989],[-7.7,-57.989],[-11.019,-56.128],[-18.523,-54.117],[-22.327,-54.07],[-35.668,-46.369],[-37.609,-43.1],[-43.099,-37.605],[-46.372,-35.663],[-54.072,-22.324],[-54.118,-18.522],[-56.132,-11.016],[-57.988,-7.7],[-57.988,7.703],[-56.132,11.019],[-54.118,18.524],[-54.072,22.328],[-46.372,35.669],[-43.099,37.611],[-37.609,43.101],[-35.668,46.373],[-22.327,54.074],[-18.523,54.12],[-11.019,56.133],[-7.7,57.99],[7.7,57.99],[11.019,56.133],[18.523,54.12],[22.327,54.074],[35.668,46.373],[37.609,43.101],[43.099,37.611],[46.372,35.669],[54.072,22.328],[54.118,18.524],[56.132,11.019],[57.988,7.703],[57.988,-7.7],[56.132,-11.016],[54.118,-18.522],[54.072,-22.324],[46.372,-35.663],[43.099,-37.605],[37.609,-43.1],[35.668,-46.369],[22.327,-54.07],[18.523,-54.117],[11.019,-56.128]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":15,"ix":1},"ix":2,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[396,104.003],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"widgets clock","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":250,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":383,"s":[100]},{"t":389,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,-29.497,0],"ix":2,"l":2},"a":{"a":0,"k":[252,128.003,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[444,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 7","np":1,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[348,200.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 6","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,128.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 4","np":1,"cix":2,"bm":0,"ix":4,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[252,56.002],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 3","np":1,"cix":2,"bm":0,"ix":5,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[156,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 2","np":1,"cix":2,"bm":0,"ix":6,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[24,24],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843137255,0.301960784314,0.18431372549,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"apps","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"tr","p":{"a":0,"k":[60,56.004],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"app - 1","np":1,"cix":2,"bm":0,"ix":7,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":3,"nm":"Scale Up","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":1,"k":[{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":250,"s":[85,85,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":256,"s":[91,91,100]},{"i":{"x":[0.833,0.833,0.833],"y":[1,1,1]},"o":{"x":[0.167,0.167,0.167],"y":[0,0,0]},"t":286,"s":[100,100,100]},{"i":{"x":[0.8,0.8,0.8],"y":[0.15,0.15,1]},"o":{"x":[0.3,0.3,0.3],"y":[0,0,0]},"t":380,"s":[100,100,100]},{"i":{"x":[0.1,0.1,0.1],"y":[1,1,1]},"o":{"x":[0.05,0.05,0.05],"y":[0.7,0.7,0]},"t":386,"s":[96,96,100]},{"t":416,"s":[90,90,100]}],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Void","np":19,"mn":"Pseudo/250958","ix":1,"en":1,"ef":[{"ty":0,"nm":"Width","mn":"Pseudo/250958-0001","ix":1,"v":{"a":0,"k":100,"ix":1}},{"ty":0,"nm":"Height","mn":"Pseudo/250958-0002","ix":2,"v":{"a":0,"k":100,"ix":2}},{"ty":0,"nm":"Offset X","mn":"Pseudo/250958-0003","ix":3,"v":{"a":0,"k":0,"ix":3}},{"ty":0,"nm":"Offset Y","mn":"Pseudo/250958-0004","ix":4,"v":{"a":0,"k":0,"ix":4}},{"ty":0,"nm":"Roundness","mn":"Pseudo/250958-0005","ix":5,"v":{"a":0,"k":0,"ix":5}},{"ty":6,"nm":"About","mn":"Pseudo/250958-0006","ix":6,"v":0},{"ty":6,"nm":"Plague of null layers.","mn":"Pseudo/250958-0007","ix":7,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0008","ix":8,"v":0},{"ty":6,"nm":"Following projects","mn":"Pseudo/250958-0009","ix":9,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0010","ix":10,"v":0},{"ty":6,"nm":"through time.","mn":"Pseudo/250958-0011","ix":11,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0012","ix":12,"v":0},{"ty":6,"nm":"Be free of the past.","mn":"Pseudo/250958-0013","ix":13,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0014","ix":14,"v":0},{"ty":6,"nm":"Copyright 2023 Battle Axe Inc","mn":"Pseudo/250958-0015","ix":15,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0016","ix":16,"v":0},{"ty":6,"nm":"Void","mn":"Pseudo/250958-0017","ix":17,"v":0}]}],"ip":0,"op":600,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[252,157.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039215686,0.811764705882,0.654901960784,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"illustrations: action key","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":600,"st":0,"ct":1,"bm":0}]}],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":".onTertiaryFixedVariant","cl":"onTertiaryFixedVariant","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,459,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[200,128],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":18,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.207843139768,0.301960796118,0.184313729405,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Frame 1321317559","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":2,"ty":0,"nm":"TrackpadBack_Success_Checkmark","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,198.5,0],"ix":2,"l":2},"a":{"a":0,"k":[95,95,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":190,"h":190,"ip":47,"op":91,"st":47,"ct":1,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":".onTertiaryFixed","cl":"onTertiaryFixed","parent":4,"sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":42,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":48,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":430,"s":[100]},{"t":433,"s":[0]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[0,0,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ef":[{"ty":5,"nm":"Global Position","np":4,"mn":"Pseudo/88900","ix":1,"en":1,"ef":[{"ty":10,"nm":"Master Parent","mn":"Pseudo/88900-0001","ix":1,"v":{"a":0,"k":3,"ix":1}},{"ty":3,"nm":"Global Position","mn":"Pseudo/88900-0002","ix":2,"v":{"k":[{"s":[0,0],"t":41,"i":{"x":1,"y":1},"o":{"x":0,"y":0}},{"s":[0,0],"t":90,"i":{"x":1,"y":1},"o":{"x":0,"y":0}}]}}]}],"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0.039215687662,0.1254902035,0.027450982481,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":41,"op":91,"st":41,"ct":1,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"matte","td":1,"sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":5,"ty":0,"nm":"Back_LeftDismiss","tt":1,"tp":4,"refId":"comp_1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,282,0],"ix":2,"l":2},"a":{"a":0,"k":[277,282,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":554,"h":564,"ip":0,"op":91,"st":-250,"bm":0},{"ddd":0,"ind":6,"ty":4,"nm":"behindApp","sr":1,"ks":{"o":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":253,"s":[100]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":259,"s":[0]},{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":386,"s":[0]},{"t":397,"s":[100]}],"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[503.5,314.5],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"fl","c":{"a":0,"k":[0,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":7,"ty":0,"nm":"Back_LofiLauncher","refId":"comp_3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[252,157.5,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":504,"h":315,"ip":0,"op":91,"st":0,"ct":1,"bm":0},{"ddd":0,"ind":8,"ty":4,"nm":".tertiaryFixedDim","cl":"tertiaryFixedDim","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[277,197.5,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[504,315],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":28,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":14,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"op","nm":"Stroke align: Outside","a":{"k":[{"s":[7],"t":0,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}},{"s":[7],"t":90,"i":{"x":[1],"y":[1]},"o":{"x":[0],"y":[0]}}]},"lj":1,"ml":{"a":0,"k":4,"ix":3},"ix":3,"mn":"ADBE Vector Filter - Offset","hd":false},{"ty":"fl","c":{"a":0,"k":[0.698039233685,0.811764717102,0.654901981354,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"frame","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":91,"st":0,"ct":1,"bm":0}],"markers":[],"props":{}} \ No newline at end of file diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt index be740ed31dba..bfdae626b5e8 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/ui/composable/BackGestureTutorialScreen.kt @@ -27,10 +27,12 @@ import com.android.systemui.inputdevice.tutorial.ui.composable.TutorialScreenCon import com.android.systemui.inputdevice.tutorial.ui.composable.rememberColorFilterProperty import com.android.systemui.res.R import com.android.systemui.touchpad.tutorial.ui.gesture.BackGestureRecognizer +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureDirection import com.android.systemui.touchpad.tutorial.ui.gesture.GestureFlowAdapter import com.android.systemui.touchpad.tutorial.ui.gesture.GestureRecognizer +import com.android.systemui.touchpad.tutorial.ui.gesture.GestureState +import com.android.systemui.util.kotlin.pairwiseBy import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map @Composable fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Unit) { @@ -49,11 +51,14 @@ fun BackGestureTutorialScreen(onDoneButtonClicked: () -> Unit, onBack: () -> Uni val recognizer = rememberBackGestureRecognizer(LocalContext.current.resources) val gestureUiState: Flow = remember(recognizer) { - GestureFlowAdapter(recognizer).gestureStateAsFlow.map { - it.toGestureUiState( - progressStartMarker = "", - progressEndMarker = "", - successAnimation = R.raw.trackpad_back_success, + GestureFlowAdapter(recognizer).gestureStateAsFlow.pairwiseBy(GestureState.NotStarted) { + previous, + current -> + val (startMarker, endMarker) = getMarkers(current) + current.toGestureUiState( + progressStartMarker = startMarker, + progressEndMarker = endMarker, + successAnimation = successAnimation(previous), ) } } @@ -67,6 +72,18 @@ private fun rememberBackGestureRecognizer(resources: Resources): GestureRecogniz return remember(distance) { BackGestureRecognizer(distance) } } +private fun getMarkers(it: GestureState): Pair { + return if (it is GestureState.InProgress && it.direction == GestureDirection.LEFT) { + "gesture to L" to "end progress L" + } else "gesture to R" to "end progress R" +} + +private fun successAnimation(previous: GestureState): Int { + return if (previous is GestureState.InProgress && previous.direction == GestureDirection.LEFT) { + R.raw.trackpad_back_success_left + } else R.raw.trackpad_back_success_right +} + @Composable private fun rememberScreenColors(): TutorialScreenConfig.Colors { val onTertiary = MaterialTheme.colorScheme.onTertiary -- GitLab From 725143ebaad28736042344cfce9464322e72670f Mon Sep 17 00:00:00 2001 From: Juan Sebastian Martinez Date: Wed, 23 Oct 2024 10:29:11 -0700 Subject: [PATCH 318/459] Distinct event logs for clicks on the QSLongPressEffect The logs for when a tile is clicked are now different to indicate which path led to the click: A click from a backwards long-press animation, or a click from the View's onClickListener. Test: presubmit Flag: com.android.systemui.quick_settings_visual_haptics_longpress Bug: 229856884 Change-Id: Ib545a1558eaaab1098004d2ea40ebb4c4f636d64 --- .../com/android/systemui/haptics/qs/QSLongPressEffect.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffect.kt b/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffect.kt index e09e1987698d..2e792497906e 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffect.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/qs/QSLongPressEffect.kt @@ -178,7 +178,11 @@ constructor( State.RUNNING_BACKWARDS_FROM_UP -> { callback?.onEffectFinishedReversing() setState(getStateForClick()) - logEvent(qsTile?.tileSpec, state, "click action triggered") + logEvent( + qsTile?.tileSpec, + state, + "click action triggered from handleAnimationComplete", + ) qsTile?.click(expandable) } State.RUNNING_BACKWARDS_FROM_CANCEL -> { @@ -206,7 +210,7 @@ constructor( if (keyguardStateController.isPrimaryBouncerShowing || !isStateClickable) return false setState(getStateForClick()) - logEvent(qsTile?.tileSpec, state, "click action triggered") + logEvent(qsTile?.tileSpec, state, "click action triggered from onTileClick") qsTile?.click(expandable) return true } -- GitLab From 38855a981092ddf1605c2dccb97740b8e4b9e005 Mon Sep 17 00:00:00 2001 From: Santiago Seifert Date: Wed, 23 Oct 2024 17:43:04 +0000 Subject: [PATCH 319/459] Make isSystemProvider field final Right now it's virtually final, but not quite. This change fixes that. Bug: b/205124386 Test: presubmit Flag: EXEMPT refactor Change-Id: I70ed35ac45dbf22f01cb531bcb55fcc98d88c961 --- .../java/com/android/server/media/MediaRoute2Provider.java | 5 +++-- .../server/media/MediaRoute2ProviderServiceProxy.java | 2 +- .../com/android/server/media/SystemMediaRoute2Provider.java | 3 +-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/media/MediaRoute2Provider.java b/services/core/java/com/android/server/media/MediaRoute2Provider.java index b0fa523da959..58c8450d714d 100644 --- a/services/core/java/com/android/server/media/MediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/MediaRoute2Provider.java @@ -42,15 +42,16 @@ abstract class MediaRoute2Provider { final Object mLock = new Object(); Callback mCallback; - boolean mIsSystemRouteProvider; + public final boolean mIsSystemRouteProvider; private volatile MediaRoute2ProviderInfo mProviderInfo; @GuardedBy("mLock") final List mSessionInfos = new ArrayList<>(); - MediaRoute2Provider(@NonNull ComponentName componentName) { + MediaRoute2Provider(@NonNull ComponentName componentName, boolean isSystemRouteProvider) { mComponentName = Objects.requireNonNull(componentName, "Component name must not be null."); mUniqueId = componentName.flattenToShortString(); + mIsSystemRouteProvider = isSystemRouteProvider; } public void setCallback(Callback callback) { diff --git a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java index 56b93e8ded82..db1e6b465ff8 100644 --- a/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java +++ b/services/core/java/com/android/server/media/MediaRoute2ProviderServiceProxy.java @@ -96,7 +96,7 @@ final class MediaRoute2ProviderServiceProxy extends MediaRoute2Provider { @NonNull ComponentName componentName, boolean isSelfScanOnlyProvider, int userId) { - super(componentName); + super(componentName, /* isSystemRouteProvider= */ false); mContext = Objects.requireNonNull(context, "Context must not be null."); mRequestIdToSessionCreationRequest = new LongSparseArray<>(); mSessionOriginalIdToTransferRequest = new HashMap<>(); diff --git a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java index 8c6273ce959f..49897b9209cc 100644 --- a/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java +++ b/services/core/java/com/android/server/media/SystemMediaRoute2Provider.java @@ -90,8 +90,7 @@ class SystemMediaRoute2Provider extends MediaRoute2Provider { private volatile SessionCreationOrTransferRequest mPendingTransferRequest; SystemMediaRoute2Provider(Context context, UserHandle user, Looper looper) { - super(COMPONENT_NAME); - mIsSystemRouteProvider = true; + super(COMPONENT_NAME, /* isSystemRouteProvider= */ true); mContext = context; mUser = user; mHandler = new Handler(looper); -- GitLab From b6d1c7dfa3e54076b955290f7e7000ce2ac093e2 Mon Sep 17 00:00:00 2001 From: Achim Thesmann Date: Wed, 16 Oct 2024 18:23:51 +0000 Subject: [PATCH 320/459] Use allowBalExemptionForSystemProcess Instead of the existing BackgroundActivityStartPrivileges typed `forcedBalByPiSender` use a simple boolean `allowBalExemptionForSystemProcess` to allow the sender to use the guarded exemption (start if system process) when allowing BAL. The idea is to completely replace this with an upgrade of `MODE_BACKGROUND_ACTIVITY_START_ALLOWED` to `MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS`. Test: atest WmTests CtsWindowManagerBackgroundActivityTestCases Flag: EXEMPT refactoring Bug: 374988683 Change-Id: I4846796722dadcf0c212acf8b547fe6a1da7f676 --- .../server/am/PendingIntentRecord.java | 6 +- .../server/wm/ActivityStartController.java | 29 ++++---- .../android/server/wm/ActivityStarter.java | 14 ++-- .../wm/ActivityTaskManagerInternal.java | 13 ++-- .../server/wm/ActivityTaskManagerService.java | 25 +++---- .../server/wm/ActivityTaskSupervisor.java | 3 +- .../com/android/server/wm/AppTaskImpl.java | 5 +- .../wm/BackgroundActivityStartController.java | 21 +++--- ...ActivityStartControllerExemptionTests.java | 73 +++++++++---------- ...groundActivityStartControllerLogTests.java | 5 +- ...ackgroundActivityStartControllerTests.java | 54 +++++++------- 11 files changed, 122 insertions(+), 126 deletions(-) diff --git a/services/core/java/com/android/server/am/PendingIntentRecord.java b/services/core/java/com/android/server/am/PendingIntentRecord.java index 3fb06a75d79f..4331e0530d4c 100644 --- a/services/core/java/com/android/server/am/PendingIntentRecord.java +++ b/services/core/java/com/android/server/am/PendingIntentRecord.java @@ -629,7 +629,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { allIntents, allResolvedTypes, resultTo, mergedOptions, userId, false /* validateIncomingUser */, this /* originatingPendingIntent */, - getBackgroundStartPrivilegesForActivitySender(allowlistToken)); + getBackgroundStartPrivilegesForActivitySender(allowlistToken) + .allowsBackgroundActivityStarts()); } else { res = controller.mAtmInternal.startActivityInPackage(uid, callingPid, callingUid, key.packageName, key.featureId, finalIntent, @@ -637,7 +638,8 @@ public final class PendingIntentRecord extends IIntentSender.Stub { mergedOptions, userId, null, "PendingIntentRecord", false /* validateIncomingUser */, this /* originatingPendingIntent */, - getBackgroundStartPrivilegesForActivitySender(allowlistToken)); + getBackgroundStartPrivilegesForActivitySender(allowlistToken) + .allowsBackgroundActivityStarts()); } } catch (RuntimeException e) { Slog.w(TAG, "Unable to send startActivity intent", e); diff --git a/services/core/java/com/android/server/wm/ActivityStartController.java b/services/core/java/com/android/server/wm/ActivityStartController.java index a2c2dfc0a5be..a82aae7b710e 100644 --- a/services/core/java/com/android/server/wm/ActivityStartController.java +++ b/services/core/java/com/android/server/wm/ActivityStartController.java @@ -34,7 +34,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.BackgroundStartPrivileges; import android.app.IApplicationThread; import android.content.ComponentName; import android.content.ContentResolver; @@ -280,8 +279,8 @@ public class ActivityStartController { * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to {@code true}, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. */ final int startActivityInPackage(int uid, int realCallingPid, int realCallingUid, @@ -289,7 +288,7 @@ public class ActivityStartController { String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, SafeActivityOptions options, int userId, Task inTask, String reason, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { userId = checkTargetUser(userId, validateIncomingUser, realCallingPid, realCallingUid, reason); @@ -310,7 +309,7 @@ public class ActivityStartController { .setUserId(userId) .setInTask(inTask) .setOriginatingPendingIntent(originatingPendingIntent) - .setBackgroundStartPrivileges(forcedBalByPiSender) + .setAllowBalExemptionForSystemProcess(allowBalExemptionForSystemProcess) .execute(); } @@ -325,18 +324,18 @@ public class ActivityStartController { * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to {@code true}, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. */ final int startActivitiesInPackage(int uid, String callingPackage, @Nullable String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { return startActivitiesInPackage(uid, 0 /* realCallingPid */, -1 /* realCallingUid */, callingPackage, callingFeatureId, intents, resolvedTypes, resultTo, options, userId, - validateIncomingUser, originatingPendingIntent, forcedBalByPiSender); + validateIncomingUser, originatingPendingIntent, allowBalExemptionForSystemProcess); } /** @@ -351,15 +350,15 @@ public class ActivityStartController { * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to {@code true}, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. */ final int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid, String callingPackage, @Nullable String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { final String reason = "startActivityInPackage"; @@ -369,14 +368,14 @@ public class ActivityStartController { // TODO: Switch to user app stacks here. return startActivities(null, uid, realCallingPid, realCallingUid, callingPackage, callingFeatureId, intents, resolvedTypes, resultTo, options, userId, reason, - originatingPendingIntent, forcedBalByPiSender); + originatingPendingIntent, allowBalExemptionForSystemProcess); } int startActivities(IApplicationThread caller, int callingUid, int incomingRealCallingPid, int incomingRealCallingUid, String callingPackage, @Nullable String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, String reason, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { if (intents == null) { throw new NullPointerException("intents is null"); } @@ -518,7 +517,7 @@ public class ActivityStartController { // top one as otherwise an activity below might consume it. .setAllowPendingRemoteAnimationRegistryLookup(top /* allowLookup*/) .setOriginatingPendingIntent(originatingPendingIntent) - .setBackgroundStartPrivileges(forcedBalByPiSender); + .setAllowBalExemptionForSystemProcess(allowBalExemptionForSystemProcess); } // Log if the activities to be started have different uids. if (startingUidPkgs.size() > 1) { diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 2c4179fb6d88..b4efc7cabf4c 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -95,7 +95,6 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.ActivityOptions; -import android.app.BackgroundStartPrivileges; import android.app.IApplicationThread; import android.app.PendingIntent; import android.app.ProfilerInfo; @@ -430,7 +429,7 @@ class ActivityStarter { WaitResult waitResult; int filterCallingUid; PendingIntentRecord originatingPendingIntent; - BackgroundStartPrivileges forcedBalByPiSender; + boolean allowBalExemptionForSystemProcess; boolean freezeScreen; final StringBuilder logMessage = new StringBuilder(); @@ -496,7 +495,7 @@ class ActivityStarter { allowPendingRemoteAnimationRegistryLookup = true; filterCallingUid = UserHandle.USER_NULL; originatingPendingIntent = null; - forcedBalByPiSender = BackgroundStartPrivileges.NONE; + allowBalExemptionForSystemProcess = false; freezeScreen = false; errorCallbackToken = null; } @@ -540,7 +539,7 @@ class ActivityStarter { = request.allowPendingRemoteAnimationRegistryLookup; filterCallingUid = request.filterCallingUid; originatingPendingIntent = request.originatingPendingIntent; - forcedBalByPiSender = request.forcedBalByPiSender; + allowBalExemptionForSystemProcess = request.allowBalExemptionForSystemProcess; freezeScreen = request.freezeScreen; errorCallbackToken = request.errorCallbackToken; } @@ -1298,7 +1297,7 @@ class ActivityStarter { realCallingPid, callerApp, request.originatingPendingIntent, - request.forcedBalByPiSender, + request.allowBalExemptionForSystemProcess, resultRecord, intent, checkedOptions); @@ -3523,8 +3522,9 @@ class ActivityStarter { return this; } - ActivityStarter setBackgroundStartPrivileges(BackgroundStartPrivileges forcedBalByPiSender) { - mRequest.forcedBalByPiSender = forcedBalByPiSender; + ActivityStarter setAllowBalExemptionForSystemProcess( + boolean allowBalExemptionForSystemProcess) { + mRequest.allowBalExemptionForSystemProcess = allowBalExemptionForSystemProcess; return this; } diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java index 3560565ce9cd..0a57cb50d681 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerInternal.java @@ -21,7 +21,6 @@ import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.AppProtoEnums; -import android.app.BackgroundStartPrivileges; import android.app.IActivityManager; import android.app.IAppTask; import android.app.IApplicationThread; @@ -179,15 +178,15 @@ public abstract class ActivityTaskManagerInternal { * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to {@code true}, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. */ public abstract int startActivitiesInPackage(int uid, int realCallingPid, int realCallingUid, String callingPackage, @Nullable String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender); + boolean allowBalExemptionForSystemProcess); /** * Start intent as a package. @@ -202,8 +201,8 @@ public abstract class ActivityTaskManagerInternal { * @param validateIncomingUser Set true to skip checking {@code userId} with the calling UID. * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to {@code true}, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. */ public abstract int startActivityInPackage(int uid, int realCallingPid, int realCallingUid, @@ -211,7 +210,7 @@ public abstract class ActivityTaskManagerInternal { String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, SafeActivityOptions options, int userId, Task inTask, String reason, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender); + boolean allowBalExemptionForSystemProcess); /** * Callback to be called on certain activity start scenarios. diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 111e74e9b590..a32cd659b343 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -145,7 +145,6 @@ import android.app.AlertDialog; import android.app.AnrController; import android.app.AppGlobals; import android.app.AppOpsManager; -import android.app.BackgroundStartPrivileges; import android.app.Dialog; import android.app.IActivityClientController; import android.app.IActivityController; @@ -1251,7 +1250,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { return getActivityStartController().startActivities(caller, -1, 0, -1, callingPackage, callingFeatureId, intents, resolvedTypes, resultTo, SafeActivityOptions.fromBundle(bOptions), userId, reason, - null /* originatingPendingIntent */, BackgroundStartPrivileges.NONE); + null /* originatingPendingIntent */, false); } @Override @@ -1560,7 +1559,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { // To start the dream from background, we need to start it from a persistent // system process. Here we set the real calling uid to the system server uid .setRealCallingUid(Binder.getCallingUid()) - .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) + .setAllowBalExemptionForSystemProcess(true) .execute(); final ActivityRecord started = outActivity[0]; @@ -1711,7 +1710,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setFilterCallingUid(isResolver ? 0 /* system */ : targetUid) // The target may well be in the background, which would normally prevent it // from starting an activity. Here we definitely want the start to succeed. - .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) + .setAllowBalExemptionForSystemProcess(true) .execute(); } catch (SecurityException e) { // XXX need to figure out how to propagate to original app. @@ -1757,7 +1756,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setProfilerInfo(profilerInfo) .setActivityOptions(createSafeActivityOptionsWithBalAllowed(bOptions)) .setUserId(userId) - .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) + .setAllowBalExemptionForSystemProcess(true) .execute(); } @@ -1784,7 +1783,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setResolvedType(resolvedType) .setActivityOptions(createSafeActivityOptionsWithBalAllowed(bOptions)) .setUserId(userId) - .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) + .setAllowBalExemptionForSystemProcess(true) .execute(); } finally { Binder.restoreCallingIdentity(origId); @@ -2256,7 +2255,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { -1, callerApp, null, - BackgroundStartPrivileges.NONE, + false, null, null, null); @@ -6066,7 +6065,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { intents, resolvedTypes, null /* resultTo */, SafeActivityOptions.fromBundle(bOptions), userId, false /* validateIncomingUser */, null /* originatingPendingIntent */, - BackgroundStartPrivileges.NONE); + false); } @Override @@ -6074,12 +6073,12 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { String callingPackage, @Nullable String callingFeatureId, Intent[] intents, String[] resolvedTypes, IBinder resultTo, SafeActivityOptions options, int userId, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { assertPackageMatchesCallingUid(callingPackage); return getActivityStartController().startActivitiesInPackage(uid, realCallingPid, realCallingUid, callingPackage, callingFeatureId, intents, resolvedTypes, resultTo, options, userId, validateIncomingUser, originatingPendingIntent, - forcedBalByPiSender); + allowBalExemptionForSystemProcess); } @Override @@ -6088,13 +6087,13 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, SafeActivityOptions options, int userId, Task inTask, String reason, boolean validateIncomingUser, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender) { + boolean allowBalExemptionForSystemProcess) { assertPackageMatchesCallingUid(callingPackage); return getActivityStartController().startActivityInPackage(uid, realCallingPid, realCallingUid, callingPackage, callingFeatureId, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, options, userId, inTask, reason, validateIncomingUser, originatingPendingIntent, - forcedBalByPiSender); + allowBalExemptionForSystemProcess); } @Override @@ -6125,7 +6124,7 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { .setActivityOptions(createSafeActivityOptionsWithBalAllowed(options)) .setRealCallingUid(Binder.getCallingUid()) .setUserId(userId) - .setBackgroundStartPrivileges(BackgroundStartPrivileges.ALLOW_BAL) + .setAllowBalExemptionForSystemProcess(true) .setFreezeScreen(true) .execute(); } diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4f71719006f5..e79278129d07 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -96,7 +96,6 @@ import android.app.ActivityManagerInternal; import android.app.ActivityOptions; import android.app.AppOpsManager; import android.app.AppOpsManagerInternal; -import android.app.BackgroundStartPrivileges; import android.app.IActivityClientController; import android.app.ProfilerInfo; import android.app.ResultInfo; @@ -2862,7 +2861,7 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { callingPid, callingUid, callingPackage, callingFeatureId, intent, null, null, null, 0, 0, options, userId, task, "startActivityFromRecents", false /* validateIncomingUser */, null /* originatingPendingIntent */, - BackgroundStartPrivileges.NONE); + /* allowBalExemptionForSystemProcess */ false); } finally { SaferIntentUtils.DISABLE_ENFORCE_INTENTS_TO_MATCH_INTENT_FILTERS.set(false); synchronized (mService.mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/AppTaskImpl.java b/services/core/java/com/android/server/wm/AppTaskImpl.java index eee4c86bc483..ef34dab34968 100644 --- a/services/core/java/com/android/server/wm/AppTaskImpl.java +++ b/services/core/java/com/android/server/wm/AppTaskImpl.java @@ -17,12 +17,11 @@ package com.android.server.wm; import static com.android.server.wm.ActivityTaskManagerDebugConfig.DEBUG_ACTIVITY_STARTS; -import static com.android.server.wm.BackgroundActivityStartController.BalVerdict; import static com.android.server.wm.ActivityTaskSupervisor.REMOVE_FROM_RECENTS; +import static com.android.server.wm.BackgroundActivityStartController.BalVerdict; import static com.android.server.wm.RootWindowContainer.MATCH_ATTACHED_TASK_OR_RECENT_TASKS; import android.app.ActivityManager; -import android.app.BackgroundStartPrivileges; import android.app.IAppTask; import android.app.IApplicationThread; import android.content.Intent; @@ -136,7 +135,7 @@ class AppTaskImpl extends IAppTask.Stub { -1, callerApp, null, - BackgroundStartPrivileges.NONE, + false, null, null, null); diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java index f9902cf0db9c..3e553adc44f9 100644 --- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java +++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java @@ -304,7 +304,7 @@ public class BackgroundActivityStartController { private final @ActivityManager.ProcessState int mRealCallingUidProcState; private final boolean mIsRealCallingUidPersistentSystemProcess; private final PendingIntentRecord mOriginatingPendingIntent; - private final BackgroundStartPrivileges mForcedBalByPiSender; + private final boolean mAllowBalExemptionForSystemProcess; private final Intent mIntent; private final WindowProcessController mCallerApp; private final WindowProcessController mRealCallerApp; @@ -319,7 +319,7 @@ public class BackgroundActivityStartController { int realCallingUid, int realCallingPid, WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender, + boolean allowBalExemptionForSystemProcess, ActivityRecord resultRecord, Intent intent, ActivityOptions checkedOptions) { @@ -329,7 +329,7 @@ public class BackgroundActivityStartController { mRealCallingUid = realCallingUid; mRealCallingPid = realCallingPid; mCallerApp = callerApp; - mForcedBalByPiSender = forcedBalByPiSender; + mAllowBalExemptionForSystemProcess = allowBalExemptionForSystemProcess; mOriginatingPendingIntent = originatingPendingIntent; mIntent = intent; mRealCallingPackage = mService.getPackageNameIfUnique(realCallingUid, realCallingPid); @@ -549,7 +549,8 @@ public class BackgroundActivityStartController { ActivityManager.class, "PROCESS_STATE_", mCallingUidProcState)); sb.append("; isCallingUidPersistentSystemProcess: ") .append(mIsCallingUidPersistentSystemProcess); - sb.append("; forcedBalByPiSender: ").append(mForcedBalByPiSender); + sb.append("; allowBalExemptionForSystemProcess: ") + .append(mAllowBalExemptionForSystemProcess); sb.append("; intent: ").append(mIntent); sb.append("; callerApp: ").append(mCallerApp); if (mCallerApp != null) { @@ -704,8 +705,8 @@ public class BackgroundActivityStartController { * @param callerApp The process that calls this method (only if not a PendingIntent) * @param originatingPendingIntent PendingIntentRecord that originated this activity start or * null if not originated by PendingIntent - * @param forcedBalByPiSender If set to allow, the - * PendingIntent's sender will try to force allow background activity starts. + * @param allowBalExemptionForSystemProcess If set to true, the + * PendingIntent's sender will allow additional exemptions. * This is only possible if the sender of the PendingIntent is a system process. * @param resultRecord If not null, this indicates that the caller expects a result. * @param intent Intent that should be started. @@ -722,7 +723,7 @@ public class BackgroundActivityStartController { int realCallingPid, WindowProcessController callerApp, PendingIntentRecord originatingPendingIntent, - BackgroundStartPrivileges forcedBalByPiSender, + boolean allowBalExemptionForSystemProcess, ActivityRecord resultRecord, Intent intent, ActivityOptions checkedOptions) { @@ -734,7 +735,7 @@ public class BackgroundActivityStartController { BalState state = new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, callerApp, originatingPendingIntent, - forcedBalByPiSender, resultRecord, intent, checkedOptions); + allowBalExemptionForSystemProcess, resultRecord, intent, checkedOptions); // In the case of an SDK sandbox calling uid, check if the corresponding app uid has a // visible window. @@ -1069,7 +1070,7 @@ public class BackgroundActivityStartController { // if the realCallingUid is a persistent system process, abort if the IntentSender // wasn't allowed to start an activity - if (state.mForcedBalByPiSender.allowsBackgroundActivityStarts() + if (state.mAllowBalExemptionForSystemProcess && state.mIsRealCallingUidPersistentSystemProcess) { return new BalVerdict(BAL_ALLOW_ALLOWLISTED_UID, /*background*/ false, @@ -1385,7 +1386,7 @@ public class BackgroundActivityStartController { String packageName = mService.mContext.getPackageManager().getNameForUid(callingUid); BalState state = new BalState(callingUid, callingPid, packageName, INVALID_UID, - INVALID_PID, null, null, null, null, null, ActivityOptions.makeBasic()); + INVALID_PID, null, null, false, null, null, ActivityOptions.makeBasic()); @BalCode int balCode = checkBackgroundActivityStartAllowedByCaller(state).mCode; if (balCode == BAL_ALLOW_ALLOWLISTED_UID || balCode == BAL_ALLOW_ALLOWLISTED_COMPONENT diff --git a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java index 750968100e2b..965b65c8f1d1 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerExemptionTests.java @@ -39,7 +39,6 @@ import static org.mockito.Mockito.when; import android.app.ActivityOptions; import android.app.AppOpsManager; -import android.app.BackgroundStartPrivileges; import android.content.ComponentName; import android.content.Context; import android.content.Intent; @@ -223,12 +222,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); assertWithMessage(balState.toString()).that(balState.isPendingIntent()).isTrue(); @@ -263,12 +262,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -295,12 +294,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -328,14 +327,14 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions .setPendingIntentCreatorBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE); BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -363,14 +362,14 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions .setPendingIntentCreatorBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE); BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -405,12 +404,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -441,12 +440,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -490,12 +489,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -526,12 +525,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -563,14 +562,14 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions .setPendingIntentBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_IF_VISIBLE); BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -597,12 +596,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -630,14 +629,14 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; checkedOptions.setPendingIntentBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -664,12 +663,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -697,14 +696,14 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions.setPendingIntentBackgroundActivityStartMode( MODE_BACKGROUND_ACTIVITY_START_ALLOW_ALWAYS); BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -733,12 +732,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -764,12 +763,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -795,12 +794,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call @@ -831,12 +830,12 @@ public class BackgroundActivityStartControllerExemptionTests { // prepare call PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = mCheckedOptions; BackgroundActivityStartController.BalState balState = mController.new BalState(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, null, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // call diff --git a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerLogTests.java b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerLogTests.java index 23b1c4b9e150..7f7462debe8f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerLogTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerLogTests.java @@ -23,7 +23,6 @@ import static com.android.server.wm.BackgroundActivityStartControllerTests.setVi import static com.google.common.truth.Truth.assertThat; import android.app.ActivityOptions; -import android.app.BackgroundStartPrivileges; import android.content.Intent; import android.platform.test.annotations.Presubmit; @@ -189,7 +188,7 @@ public class BackgroundActivityStartControllerLogTests { private void useIntent(int uid) { mState = mController.new BalState(uid, APP1_PID, "calling.package", uid, APP1_PID, null, - null, BackgroundStartPrivileges.NONE, null, new Intent(), + null, false, null, new Intent(), ActivityOptions.makeBasic()); } @@ -200,7 +199,7 @@ public class BackgroundActivityStartControllerLogTests { private void usePendingIntent(int callerUid, int realCallerUid) { mState = mController.new BalState(callerUid, APP1_PID, "calling.package", realCallerUid, APP2_PID, null, - mPendingIntentRecord, BackgroundStartPrivileges.NONE, null, new Intent(), + mPendingIntentRecord, false, null, new Intent(), ActivityOptions.makeBasic()); } } diff --git a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java index 6ec789599482..7bc9f301bcd6 100644 --- a/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/BackgroundActivityStartControllerTests.java @@ -241,14 +241,14 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -276,14 +276,14 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -311,14 +311,14 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -346,14 +346,14 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -380,14 +380,14 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -418,7 +418,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic() .setPendingIntentBackgroundActivityStartMode( @@ -429,7 +429,7 @@ public class BackgroundActivityStartControllerTests { // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -457,7 +457,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic() .setPendingIntentCreatorBackgroundActivityStartMode( @@ -466,7 +466,7 @@ public class BackgroundActivityStartControllerTests { // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -494,7 +494,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic() .setPendingIntentBackgroundActivityStartMode( @@ -503,7 +503,7 @@ public class BackgroundActivityStartControllerTests { // call BalVerdict verdict = mController.checkBackgroundActivityStart(callingUid, callingPid, callingPackage, realCallingUid, realCallingPid, mCallerApp, - originatingPendingIntent, forcedBalByPiSender, mResultRecord, intent, + originatingPendingIntent, allowBalExemptionForSystemProcess, mResultRecord, intent, checkedOptions); // assertions @@ -530,7 +530,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = null; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); WindowProcessController callerApp = mCallerApp; @@ -539,8 +539,8 @@ public class BackgroundActivityStartControllerTests { // call BackgroundActivityStartController.BalState balState = mController .new BalState(callingUid, callingPid, callingPackage, realCallingUid, - realCallingPid, callerApp, originatingPendingIntent, forcedBalByPiSender, - resultRecord, intent, checkedOptions); + realCallingPid, callerApp, originatingPendingIntent, + allowBalExemptionForSystemProcess, resultRecord, intent, checkedOptions); // assertions assertThat(balState.mAutoOptInReason).isEqualTo("notPendingIntent"); @@ -559,7 +559,7 @@ public class BackgroundActivityStartControllerTests { + "callingUidHasAnyVisibleWindow: false; " + "callingUidProcState: NONEXISTENT; " + "isCallingUidPersistentSystemProcess: false; " - + "forcedBalByPiSender: BSP.NONE; " + + "allowBalExemptionForSystemProcess: false; " + "intent: Intent { cmp=package.app3/someClass }; " + "callerApp: mCallerApp; " + "inVisibleTask: false; " @@ -596,7 +596,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); WindowProcessController callerApp = mCallerApp; @@ -605,8 +605,8 @@ public class BackgroundActivityStartControllerTests { // call BackgroundActivityStartController.BalState balState = mController .new BalState(callingUid, callingPid, callingPackage, realCallingUid, - realCallingPid, callerApp, originatingPendingIntent, forcedBalByPiSender, - resultRecord, intent, checkedOptions); + realCallingPid, callerApp, originatingPendingIntent, + allowBalExemptionForSystemProcess, resultRecord, intent, checkedOptions); // assertions assertThat(balState.mAutoOptInReason).isEqualTo("callForResult"); @@ -629,7 +629,7 @@ public class BackgroundActivityStartControllerTests { int realCallingUid = NO_UID; int realCallingPid = NO_PID; PendingIntentRecord originatingPendingIntent = mPendingIntentRecord; - BackgroundStartPrivileges forcedBalByPiSender = BackgroundStartPrivileges.NONE; + boolean allowBalExemptionForSystemProcess = false; Intent intent = TEST_INTENT; ActivityOptions checkedOptions = ActivityOptions.makeBasic(); WindowProcessController callerApp = mCallerApp; @@ -638,8 +638,8 @@ public class BackgroundActivityStartControllerTests { // call BackgroundActivityStartController.BalState balState = mController .new BalState(callingUid, callingPid, callingPackage, realCallingUid, - realCallingPid, callerApp, originatingPendingIntent, forcedBalByPiSender, - resultRecord, intent, checkedOptions); + realCallingPid, callerApp, originatingPendingIntent, + allowBalExemptionForSystemProcess, resultRecord, intent, checkedOptions); // assertions assertThat(balState.mAutoOptInReason).isNull(); @@ -659,7 +659,7 @@ public class BackgroundActivityStartControllerTests { + "callingUidHasAnyVisibleWindow: false; " + "callingUidProcState: NONEXISTENT; " + "isCallingUidPersistentSystemProcess: false; " - + "forcedBalByPiSender: BSP.NONE; " + + "allowBalExemptionForSystemProcess: false; " + "intent: Intent { cmp=package.app3/someClass }; " + "callerApp: mCallerApp; " + "inVisibleTask: false; " -- GitLab From 256735f80bd54760fced44a10c924bef7fd3bf79 Mon Sep 17 00:00:00 2001 From: Dongzhuo Zhang Date: Tue, 22 Oct 2024 17:37:01 +0000 Subject: [PATCH 321/459] Declare move contacts to default account intent in ContactsContract. Bug:372551099 Flag: android.provider.new_default_account_api_enabled Change-Id: I95384da90de8ff24009297e7d50195b0287f8d5a --- core/api/current.txt | 1 + core/java/android/provider/ContactsContract.java | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/core/api/current.txt b/core/api/current.txt index b053c4a0f895..702070252d7b 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -37068,6 +37068,7 @@ package android.provider { @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount { method @FlaggedApi("android.provider.new_default_account_api_enabled") @NonNull public static android.provider.ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState getDefaultAccountForNewContacts(@NonNull android.content.ContentResolver); + field public static final String ACTION_MOVE_CONTACTS_TO_DEFAULT_ACCOUNT = "android.provider.action.MOVE_CONTACTS_TO_DEFAULT_ACCOUNT"; } @FlaggedApi("android.provider.new_default_account_api_enabled") public static final class ContactsContract.RawContacts.DefaultAccount.DefaultAccountAndState { diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java index 5ecf361e83c7..8afc1779ed00 100644 --- a/core/java/android/provider/ContactsContract.java +++ b/core/java/android/provider/ContactsContract.java @@ -3070,6 +3070,14 @@ public final class ContactsContract { public static final String QUERY_DEFAULT_ACCOUNT_FOR_NEW_CONTACTS_METHOD = "queryDefaultAccountForNewContacts"; + /** + * Action used to launch the UI to move contacts to the default account. + */ + @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION) + public static final String ACTION_MOVE_CONTACTS_TO_DEFAULT_ACCOUNT = + "android.provider.action.MOVE_CONTACTS_TO_DEFAULT_ACCOUNT"; + + /** * Represents the state of the default account, and the actual {@link Account} if it's * a cloud account. -- GitLab From fac6f557748af2bb6c265c6cbd68a42783ab7ced Mon Sep 17 00:00:00 2001 From: Guojing Yuan Date: Tue, 22 Oct 2024 17:06:48 +0000 Subject: [PATCH 322/459] [CDM] Check if it's system UID for hidden Perm Sync APIs Bug: 371975420 Test: Manual test Flag: EXEMPT bugfix Change-Id: I9771ce38728d40b026d94cb6785d55f144c66790 Merged-In: I9771ce38728d40b026d94cb6785d55f144c66790 --- .../server/companion/CompanionDeviceManagerService.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java index a3f66655795e..143bdebc2264 100644 --- a/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/CompanionDeviceManagerService.java @@ -798,18 +798,27 @@ public class CompanionDeviceManagerService extends SystemService { @Override public void enablePermissionsSync(int associationId) { getAssociationWithCallerChecks(associationId); + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } mSystemDataTransferProcessor.enablePermissionsSync(associationId); } @Override public void disablePermissionsSync(int associationId) { getAssociationWithCallerChecks(associationId); + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } mSystemDataTransferProcessor.disablePermissionsSync(associationId); } @Override public PermissionSyncRequest getPermissionSyncRequest(int associationId) { getAssociationWithCallerChecks(associationId); + if (getCallingUid() != SYSTEM_UID) { + throw new SecurityException("Caller must be system UID"); + } return mSystemDataTransferProcessor.getPermissionSyncRequest(associationId); } -- GitLab From e7d6f4fadfa4eb3e85c6c7f377c8951552df0e89 Mon Sep 17 00:00:00 2001 From: Dmitri Plotnikov Date: Tue, 22 Oct 2024 18:24:00 -0700 Subject: [PATCH 323/459] Delay processing of BatteryStats events until onSystemReady Bug: 374937737 Test: atest PowerStatsTests Flag: EXEMPT_bugfix Change-Id: I2b5e025d7399d20a11db760165fac3c5483335c7 --- .../android/server/am/BatteryStatsService.java | 4 ++++ .../power/stats/BatteryUsageStatsProvider.java | 18 ++++++++++-------- .../server/am/BatteryStatsServiceTest.java | 1 + 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java index 28b606c931fa..977ea576c11b 100644 --- a/services/core/java/com/android/server/am/BatteryStatsService.java +++ b/services/core/java/com/android/server/am/BatteryStatsService.java @@ -62,6 +62,7 @@ import android.os.BatteryUsageStatsQuery; import android.os.Binder; import android.os.BluetoothBatteryStats; import android.os.Bundle; +import android.os.ConditionVariable; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; @@ -213,6 +214,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub private final HandlerThread mHandlerThread; private final Handler mHandler; private final Object mLock = new Object(); + private final ConditionVariable mSystemReady = new ConditionVariable(false); private final Object mPowerStatsLock = new Object(); @GuardedBy("mPowerStatsLock") @@ -413,6 +415,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub mHandlerThread = new HandlerThread("batterystats-handler"); mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); + mHandler.post(mSystemReady::block); mMonotonicClock = new MonotonicClock(new File(systemDir, "monotonic_clock.xml")); mPowerProfile = new PowerProfile(context); @@ -648,6 +651,7 @@ public final class BatteryStatsService extends IBatteryStats.Stub dataConnectionStats.startMonitoring(); registerStatsCallbacks(); + mSystemReady.open(); } private static boolean isBatteryUsageStatsAccumulationSupported() { diff --git a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java index b996c43d3dd5..600fe59215b6 100644 --- a/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java +++ b/services/core/java/com/android/server/power/stats/BatteryUsageStatsProvider.java @@ -26,6 +26,7 @@ import android.os.BatteryUsageStatsQuery; import android.os.Handler; import android.os.Process; import android.util.Log; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.os.Clock; @@ -350,13 +351,14 @@ public class BatteryUsageStatsProvider { synchronized (stats) { final List powerCalculators = getPowerCalculators(); - if (!powerCalculators.isEmpty()) { - if (monotonicStartTime != MonotonicClock.UNDEFINED - || monotonicEndTime != MonotonicClock.UNDEFINED) { - throw new IllegalStateException("BatteryUsageStatsQuery specifies a time " - + "range that is incompatible with PowerCalculators: " - + powerCalculators); - } + boolean usePowerCalculators = !powerCalculators.isEmpty(); + if (usePowerCalculators + && (monotonicStartTime != MonotonicClock.UNDEFINED + || monotonicEndTime != MonotonicClock.UNDEFINED)) { + Slog.wtfStack(TAG, "BatteryUsageStatsQuery specifies a time " + + "range that is incompatible with PowerCalculators: " + + powerCalculators); + usePowerCalculators = false; } if (monotonicStartTime == MonotonicClock.UNDEFINED) { @@ -371,7 +373,7 @@ public class BatteryUsageStatsProvider { batteryUsageStatsBuilder.setStatsEndTimestamp(currentTimeMs); } - if (!powerCalculators.isEmpty()) { + if (usePowerCalculators) { final long realtimeUs = mClock.elapsedRealtime() * 1000; final long uptimeUs = mClock.uptimeMillis() * 1000; final int[] powerComponents = query.getPowerComponents(); diff --git a/services/tests/servicestests/src/com/android/server/am/BatteryStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/am/BatteryStatsServiceTest.java index ea70287466ff..4d6f5e5df656 100644 --- a/services/tests/servicestests/src/com/android/server/am/BatteryStatsServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/am/BatteryStatsServiceTest.java @@ -56,6 +56,7 @@ public final class BatteryStatsServiceTest { Handler handler = new Handler(mBgThread.getLooper()); mBatteryStatsService = new BatteryStatsService(context, systemDir); mBatteryStatsService.setRailsStatsCollectionEnabled(false); + mBatteryStatsService.systemServicesReady(); } @After -- GitLab From 343bb5b735727012975cb274c80ffa29ea1055af Mon Sep 17 00:00:00 2001 From: Atneya Nair Date: Sat, 17 Aug 2024 15:12:22 -0700 Subject: [PATCH 324/459] appops: Update checkOp docs checkOp (non-raw) actually does evaluate fgdness in most cases, and a previous change adds package validation functionality. Update the docs to reflect this. Test: comment only Flag: EXEMPT DOCS_ONLY Bug: 294609684 Change-Id: I2f08ede6f1a05061688757dc0f26bb51770ce46d --- core/java/android/app/AppOpsManager.java | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index 0472ff8c9f50..ad68e7c9f4e7 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -8748,21 +8748,9 @@ public class AppOpsManager { * Do a quick check for whether an application might be able to perform an operation. * This is not a security check; you must use {@link #noteOp(String, int, String, * String, String)} or {@link #startOp(String, int, String, String, String)} for your actual - * security checks, which also ensure that the given uid and package name are consistent. This - * function can just be used for a quick check to see if an operation has been disabled for the - * application, as an early reject of some work. This does not modify the time stamp or other - * data about the operation. - * - *

    Important things this will not do (which you need to ultimate use - * {@link #noteOp(String, int, String, String, String)} or - * {@link #startOp(String, int, String, String, String)} to cover):

    - *
      - *
    • Verifying the uid and package are consistent, so callers can't spoof - * their identity.
    • - *
    • Taking into account the current foreground/background state of the - * app; apps whose mode varies by this state will always be reported - * as {@link #MODE_ALLOWED}.
    • - *
    + * security checks. This function can just be used for a quick check to see if an operation has + * been disabled for the application, as an early reject of some work. This does not modify the + * time stamp or other data about the operation. * * @param op The operation to check. One of the OPSTR_* constants. * @param uid The user id of the application attempting to perform the operation. -- GitLab From 5241833fb34b8bf8a9c098ec411307aa3d80e278 Mon Sep 17 00:00:00 2001 From: Hawkwood Glazier Date: Mon, 21 Oct 2024 23:28:32 +0000 Subject: [PATCH 325/459] Refactor Clock theme handling This change also removes some unnessecary parts of the copied version of SimpleDigitalClockTextView and AssetLoader. Bug: 364680879 Test: Presubmits & manually checked clock colors Flag: com.android.systemui.clock_reactive_variants Change-Id: I40c3f18277cdca920b76f878d9dc37305f40f696 --- .../systemui/shared/clocks/AssetLoader.kt | 201 +----------------- .../clocks/ComposedDigitalLayerController.kt | 22 +- .../shared/clocks/DefaultClockController.kt | 78 +++---- .../shared/clocks/DefaultClockProvider.kt | 1 + .../shared/clocks/FlexClockController.kt | 42 ++-- .../shared/clocks/FlexClockFaceController.kt | 17 +- .../clocks/SimpleClockLayerController.kt | 4 - .../SimpleDigitalHandLayerController.kt | 32 +-- .../clocks/view/DigitalClockFaceView.kt | 5 +- .../clocks/view/SimpleDigitalClockTextView.kt | 142 ++----------- .../clocks/view/SimpleDigitalClockView.kt | 2 +- .../shared/clocks/DefaultClockProviderTest.kt | 18 +- .../plugins/clocks/ClockProviderPlugin.kt | 25 +-- .../android/keyguard/ClockEventController.kt | 39 ++-- .../android/keyguard/KeyguardClockSwitch.java | 3 +- .../binder/KeyguardPreviewClockViewBinder.kt | 13 +- .../ui/preview/KeyguardPreviewRenderer.kt | 11 +- .../keyguard/ClockEventControllerTest.kt | 11 +- 18 files changed, 163 insertions(+), 503 deletions(-) diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt index 031fbabb239f..2a2d33308d12 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/AssetLoader.kt @@ -17,34 +17,24 @@ package com.android.systemui.shared.clocks import android.content.Context -import android.content.res.ColorStateList import android.content.res.Resources -import android.graphics.Color import android.graphics.Typeface import android.graphics.drawable.Drawable import android.util.TypedValue -import com.android.internal.graphics.ColorUtils -import com.android.internal.graphics.cam.Cam -import com.android.internal.graphics.cam.CamUtils import com.android.internal.policy.SystemBarUtils import com.android.systemui.log.core.Logger import com.android.systemui.log.core.MessageBuffer -import com.android.systemui.monet.ColorScheme import com.android.systemui.monet.Style as MonetStyle -import com.android.systemui.monet.TonalPalette import java.io.IOException -import kotlin.math.abs class AssetLoader private constructor( private val pluginCtx: Context, private val sysuiCtx: Context, private val baseDir: String, - var colorScheme: ColorScheme?, var seedColor: Int?, var overrideChroma: Float?, val typefaceCache: TypefaceCache, - val getThemeSeedColor: (Context) -> Int, messageBuffer: MessageBuffer, ) { val logger = Logger(messageBuffer, TAG) @@ -59,12 +49,10 @@ private constructor( sysuiCtx: Context, baseDir: String, messageBuffer: MessageBuffer, - getThemeSeedColor: ((Context) -> Int)? = null, ) : this( pluginCtx, sysuiCtx, baseDir, - colorScheme = null, seedColor = null, overrideChroma = null, typefaceCache = @@ -72,7 +60,6 @@ private constructor( // TODO(b/364680873): Move constant to config_clockFontFamily when shipping return@TypefaceCache Typeface.create("google-sans-flex-clock", Typeface.NORMAL) }, - getThemeSeedColor = getThemeSeedColor ?: Companion::getThemeSeedColor, messageBuffer = messageBuffer, ) @@ -92,107 +79,6 @@ private constructor( return res.getString(id) } - fun tryReadColor(resStr: String): Int? = tryRead(resStr, ::readColor) - - fun readColor(resStr: String): Int { - if (resStr.startsWith("#")) { - return Color.parseColor(resStr) - } - - val schemeColor = tryParseColorFromScheme(resStr) - if (schemeColor != null) { - logColor("ColorScheme: $resStr", schemeColor) - return checkChroma(schemeColor) - } - - val result = resolveColorResourceId(resStr) - if (result == null) { - throw IOException("Failed to parse color: $resStr") - } - - val (res, colorId, targetTone) = result - val color = res.getColor(colorId) - if (targetTone == null || TonalPalette.SHADE_KEYS.contains(targetTone.toInt())) { - logColor("Resources: $resStr", color) - return checkChroma(color) - } else { - val interpolatedColor = - ColorStateList.valueOf(color) - .withLStar((1000f - targetTone) / 10f) - .getDefaultColor() - logColor("Resources (interpolated tone): $resStr", interpolatedColor) - return checkChroma(interpolatedColor) - } - } - - private fun checkChroma(color: Int): Int { - return overrideChroma?.let { - val cam = Cam.fromInt(color) - val tone = CamUtils.lstarFromInt(color) - val result = ColorUtils.CAMToColor(cam.hue, it, tone) - logColor("Chroma override", result) - result - } ?: color - } - - private fun tryParseColorFromScheme(resStr: String): Int? { - val colorScheme = this.colorScheme - if (colorScheme == null) { - logger.w("No color scheme available") - return null - } - - val (packageName, category, name) = parseResourceId(resStr) - if (packageName != "android" || category != "color") { - logger.w("Failed to parse package from $resStr") - return null - } - - var parts = name.split('_') - if (parts.size != 3) { - logger.w("Failed to find palette and shade from $name") - return null - } - val (_, paletteKey, shadeKeyStr) = parts - - val palette = - when (paletteKey) { - "accent1" -> colorScheme.accent1 - "accent2" -> colorScheme.accent2 - "accent3" -> colorScheme.accent3 - "neutral1" -> colorScheme.neutral1 - "neutral2" -> colorScheme.neutral2 - else -> return null - } - - if (shadeKeyStr.contains("+") || shadeKeyStr.contains("-")) { - val signIndex = shadeKeyStr.indexOfLast { it == '-' || it == '+' } - // Use the tone of the seed color if it was set explicitly. - var baseTone = - if (seedColor != null) colorScheme.seedTone.toFloat() - else shadeKeyStr.substring(0, signIndex).toFloatOrNull() - val diff = shadeKeyStr.substring(signIndex).toFloatOrNull() - - if (baseTone == null) { - logger.w("Failed to parse base tone from $shadeKeyStr") - return null - } - - if (diff == null) { - logger.w("Failed to parse relative tone from $shadeKeyStr") - return null - } - return palette.getAtTone(baseTone + diff) - } else { - val shadeKey = shadeKeyStr.toIntOrNull() - if (shadeKey == null) { - logger.w("Failed to parse tone from $shadeKeyStr") - return null - } - return palette.allShadesMapped.get(shadeKey) ?: palette.getAtTone(shadeKey.toFloat()) - } - } - fun readFontAsset(resStr: String): Typeface = typefaceCache.getTypeface(resStr) fun tryReadTextAsset(path: String?): String? = tryRead(path, ::readTextAsset) @@ -250,52 +136,6 @@ private constructor( } } - fun resolveColorResourceId(resStr: String): Triple? { - var (packageName, category, name) = parseResourceId(resStr) - - // Convert relative tonal specifiers to standard - val relIndex = name.indexOfLast { it == '_' } - val isToneRelative = name.contains("-") || name.contains("+") - val targetTone = - if (packageName != "android") { - null - } else if (isToneRelative) { - val signIndex = name.indexOfLast { it == '-' || it == '+' } - val baseTone = name.substring(relIndex + 1, signIndex).toFloatOrNull() - var diff = name.substring(signIndex).toFloatOrNull() - if (baseTone == null || diff == null) { - logger.w("Failed to parse relative tone from $name") - return null - } - baseTone + diff - } else { - val absTone = name.substring(relIndex + 1).toFloatOrNull() - if (absTone == null) { - logger.w("Failed to parse absolute tone from $name") - return null - } - absTone - } - - if ( - targetTone != null && - (isToneRelative || !TonalPalette.SHADE_KEYS.contains(targetTone.toInt())) - ) { - val closeTone = TonalPalette.SHADE_KEYS.minBy { abs(it - targetTone) } - val prevName = name - name = name.substring(0, relIndex + 1) + closeTone - logger.i("Converted $prevName to $name") - } - - val result = resolveResourceId(packageName, category, name) - if (result == null) { - return null - } - - val (res, resId) = result - return Triple(res, resId, targetTone) - } - fun resolveResourceId(resStr: String): Pair? { val (packageName, category, name) = parseResourceId(resStr) return resolveResourceId(packageName, category, name) @@ -331,8 +171,7 @@ private constructor( try { if (path.startsWith("@")) { val pair = resolveResourceId(path) - val colorPair = resolveColorResourceId(path) - return pair != null || colorPair != null + return pair != null } else { val stream = pluginCtx.resources.assets.open("$baseDir$path") if (stream == null) { @@ -352,37 +191,14 @@ private constructor( pluginCtx, sysuiCtx, baseDir, - colorScheme, seedColor, overrideChroma, typefaceCache, - getThemeSeedColor, messageBuffer ?: logger.buffer, ) fun setSeedColor(seedColor: Int?, style: MonetStyle?) { this.seedColor = seedColor - refreshColorPalette(style) - } - - fun refreshColorPalette(style: MonetStyle?) { - val seedColor = - this.seedColor ?: getThemeSeedColor(sysuiCtx).also { logColor("Theme Seed Color", it) } - this.colorScheme = - ColorScheme( - seedColor, - false, // darkTheme is not used for palette generation - style ?: MonetStyle.CLOCK, - ) - - // Enforce low chroma on output colors if low chroma theme is selected - this.overrideChroma = run { - val cam = colorScheme?.seed?.let { Cam.fromInt(it) } - if (cam != null && cam.chroma < LOW_CHROMA_LIMIT) { - return@run cam.chroma * LOW_CHROMA_SCALE - } - return@run null - } } fun getClockPaddingStart(): Int { @@ -430,22 +246,7 @@ private constructor( throw Exception("Cannot find id of $name from $TAG") } - private fun logColor(name: String, color: Int) { - if (DEBUG_COLOR) { - val cam = Cam.fromInt(color) - val tone = CamUtils.lstarFromInt(color) - logger.i("$name -> (hue: ${cam.hue}, chroma: ${cam.chroma}, tone: $tone)") - } - } - companion object { - private val DEBUG_COLOR = true - private val LOW_CHROMA_LIMIT = 15 - private val LOW_CHROMA_SCALE = 1.5f private val TAG = AssetLoader::class.simpleName!! - - private fun getThemeSeedColor(ctx: Context): Int { - return ctx.resources.getColor(android.R.color.system_palette_key_color_primary_light) - } } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt index eedddb28ff89..a8839779c4e9 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/ComposedDigitalLayerController.kt @@ -28,6 +28,7 @@ import com.android.systemui.plugins.clocks.ClockEvents import com.android.systemui.plugins.clocks.ClockFaceConfig import com.android.systemui.plugins.clocks.ClockFaceEvents import com.android.systemui.plugins.clocks.ClockReactiveSetting +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.shared.clocks.view.FlexClockView @@ -46,7 +47,6 @@ class ComposedDigitalLayerController( val layerControllers = mutableListOf() val dozeState = DefaultClockController.AnimationState(1F) - var isRegionDark = true override val view = FlexClockView(ctx, assets, messageBuffer) @@ -103,10 +103,6 @@ class ComposedDigitalLayerController( view.onZenDataChanged(data) } - override fun onColorPaletteChanged(resources: Resources) {} - - override fun onSeedColorChanged(seedColor: Int?) {} - override fun onReactiveAxesChanged(axes: List) {} override var isReactiveTouchInteractionEnabled @@ -116,10 +112,6 @@ class ComposedDigitalLayerController( } } - override fun updateColors() { - view.updateColors(assets, isRegionDark) - } - override val animations = object : ClockAnimations { override fun enter() { @@ -158,9 +150,15 @@ class ComposedDigitalLayerController( refreshTime() } - override fun onRegionDarknessChanged(isRegionDark: Boolean) { - this@ComposedDigitalLayerController.isRegionDark = isRegionDark - updateColors() + override fun onThemeChanged(theme: ThemeConfig) { + val color = + when { + theme.seedColor != null -> theme.seedColor!! + theme.isDarkTheme -> resources.getColor(android.R.color.system_accent1_100) + else -> resources.getColor(android.R.color.system_accent2_600) + } + + view.updateColor(color) } override fun onFontSettingChanged(fontSizePx: Float) { diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt index 5ed11ad345ad..c5b751820ebd 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockController.kt @@ -37,6 +37,7 @@ import com.android.systemui.plugins.clocks.ClockMessageBuffers import com.android.systemui.plugins.clocks.ClockReactiveSetting import com.android.systemui.plugins.clocks.ClockSettings import com.android.systemui.plugins.clocks.DefaultClockFaceLayout +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import java.io.PrintWriter @@ -100,28 +101,33 @@ class DefaultClockController( events.onLocaleChanged(Locale.getDefault()) } - override fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) { + override fun initialize(isDarkTheme: Boolean, dozeFraction: Float, foldFraction: Float) { largeClock.recomputePadding(null) + largeClock.animations = LargeClockAnimations(largeClock.view, dozeFraction, foldFraction) smallClock.animations = DefaultClockAnimations(smallClock.view, dozeFraction, foldFraction) - events.onColorPaletteChanged(resources) + + val theme = ThemeConfig(isDarkTheme, settings?.seedColor) + largeClock.events.onThemeChanged(theme) + smallClock.events.onThemeChanged(theme) + events.onTimeZoneChanged(TimeZone.getDefault()) + smallClock.events.onTimeTick() largeClock.events.onTimeTick() } open inner class DefaultClockFaceController( override val view: AnimatableClockView, - var seedColor: Int?, + seedColor: Int?, messageBuffer: MessageBuffer?, ) : ClockFaceController { - // MAGENTA is a placeholder, and will be assigned correctly in initialize - private var currentColor = Color.MAGENTA - private var isRegionDark = false + private var currentColor = seedColor ?: Color.MAGENTA protected var targetRegion: Rect? = null override val config = ClockFaceConfig() + override var theme = ThemeConfig(true, seedColor) override val layout = DefaultClockFaceLayout(view).apply { views[0].id = @@ -132,9 +138,6 @@ class DefaultClockController( internal set init { - if (seedColor != null) { - currentColor = seedColor!! - } view.setColors(DOZE_COLOR, currentColor) messageBuffer?.let { view.messageBuffer = it } } @@ -143,9 +146,26 @@ class DefaultClockController( object : ClockFaceEvents { override fun onTimeTick() = view.refreshTime() - override fun onRegionDarknessChanged(isRegionDark: Boolean) { - this@DefaultClockFaceController.isRegionDark = isRegionDark - updateColor() + override fun onThemeChanged(theme: ThemeConfig) { + this@DefaultClockFaceController.theme = theme + + val color = + when { + theme.seedColor != null -> theme.seedColor!! + theme.isDarkTheme -> + resources.getColor(android.R.color.system_accent1_100) + else -> resources.getColor(android.R.color.system_accent2_600) + } + + if (currentColor == color) { + return + } + + currentColor = color + view.setColors(DOZE_COLOR, color) + if (!animations.dozeState.isActive) { + view.animateColorChange() + } } override fun onTargetRegionChanged(targetRegion: Rect?) { @@ -165,27 +185,6 @@ class DefaultClockController( } open fun recomputePadding(targetRegion: Rect?) {} - - fun updateColor() { - val color = - if (seedColor != null) { - seedColor!! - } else if (isRegionDark) { - resources.getColor(android.R.color.system_accent1_100) - } else { - resources.getColor(android.R.color.system_accent2_600) - } - - if (currentColor == color) { - return - } - - currentColor = color - view.setColors(DOZE_COLOR, color) - if (!animations.dozeState.isActive) { - view.animateColorChange() - } - } } inner class LargeClockFaceController( @@ -248,19 +247,6 @@ class DefaultClockController( override fun onTimeZoneChanged(timeZone: TimeZone) = clocks.forEach { it.onTimeZoneChanged(timeZone) } - override fun onColorPaletteChanged(resources: Resources) { - largeClock.updateColor() - smallClock.updateColor() - } - - override fun onSeedColorChanged(seedColor: Int?) { - largeClock.seedColor = seedColor - smallClock.seedColor = seedColor - - largeClock.updateColor() - smallClock.updateColor() - } - override fun onLocaleChanged(locale: Locale) { val nf = NumberFormat.getInstance(locale) if (nf.format(FORMAT_NUMBER.toLong()) == burmeseNumerals) { diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt index 900971bc3927..76ec66f77af6 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt @@ -58,6 +58,7 @@ class DefaultClockProvider( val buffer = messageBuffers?.infraMessageBuffer ?: LogcatOnlyMessageBuffer(LogLevel.INFO) val assets = AssetLoader(ctx, ctx, "clocks/", buffer) + assets.setSeedColor(settings.seedColor, null) FlexClockController(ctx, resources, assets, FLEX_DESIGN, messageBuffers) } else { DefaultClockController( diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt index b8ebd0ff559b..a75022a40422 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockController.kt @@ -25,6 +25,7 @@ import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockEvents import com.android.systemui.plugins.clocks.ClockMessageBuffers import com.android.systemui.plugins.clocks.ClockReactiveSetting +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.shared.clocks.view.FlexClockView @@ -97,24 +98,6 @@ class FlexClockController( largeClock.events.onLocaleChanged(locale) } - override fun onColorPaletteChanged(resources: Resources) { - assets.refreshColorPalette(design.colorPalette) - smallClock.assets.refreshColorPalette(design.colorPalette) - largeClock.assets.refreshColorPalette(design.colorPalette) - - smallClock.events.onColorPaletteChanged(resources) - largeClock.events.onColorPaletteChanged(resources) - } - - override fun onSeedColorChanged(seedColor: Int?) { - assets.setSeedColor(seedColor, design.colorPalette) - smallClock.assets.setSeedColor(seedColor, design.colorPalette) - largeClock.assets.setSeedColor(seedColor, design.colorPalette) - - smallClock.events.onSeedColorChanged(seedColor) - largeClock.events.onSeedColorChanged(seedColor) - } - override fun onWeatherDataChanged(data: WeatherData) { smallClock.events.onWeatherDataChanged(data) largeClock.events.onWeatherDataChanged(data) @@ -136,14 +119,21 @@ class FlexClockController( } } - override fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) { - events.onColorPaletteChanged(resources) - smallClock.animations.doze(dozeFraction) - largeClock.animations.doze(dozeFraction) - smallClock.animations.fold(foldFraction) - largeClock.animations.fold(foldFraction) - smallClock.events.onTimeTick() - largeClock.events.onTimeTick() + override fun initialize(isDarkTheme: Boolean, dozeFraction: Float, foldFraction: Float) { + val theme = ThemeConfig(isDarkTheme, assets.seedColor) + smallClock.run { + events.onThemeChanged(theme) + animations.doze(dozeFraction) + animations.fold(foldFraction) + events.onTimeTick() + } + + largeClock.run { + events.onThemeChanged(theme) + animations.doze(dozeFraction) + animations.fold(foldFraction) + events.onTimeTick() + } } override fun dump(pw: PrintWriter) {} diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt index 9067fb094634..8ffc00de5fe5 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/FlexClockFaceController.kt @@ -34,6 +34,7 @@ import com.android.systemui.plugins.clocks.ClockFaceEvents import com.android.systemui.plugins.clocks.ClockFaceLayout import com.android.systemui.plugins.clocks.ClockReactiveSetting import com.android.systemui.plugins.clocks.DefaultClockFaceLayout +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.shared.clocks.view.FlexClockView @@ -59,6 +60,8 @@ class FlexClockFaceController( hasCustomPositionUpdatedAnimation = false // TODO(b/364673982) ) + override var theme = ThemeConfig(true, assets.seedColor) + private val keyguardLargeClockTopMargin = resources.getDimensionPixelSize(R.dimen.keyguard_large_clock_top_margin) val layerController: SimpleClockLayerController @@ -135,18 +138,8 @@ class FlexClockFaceController( layerController.faceEvents.onFontSettingChanged(fontSizePx) } - override fun onColorPaletteChanged(resources: Resources) { - layerController.events.onColorPaletteChanged(resources) - layerController.updateColors() - } - - override fun onSeedColorChanged(seedColor: Int?) { - layerController.events.onSeedColorChanged(seedColor) - layerController.updateColors() - } - - override fun onRegionDarknessChanged(isRegionDark: Boolean) { - layerController.faceEvents.onRegionDarknessChanged(isRegionDark) + override fun onThemeChanged(theme: ThemeConfig) { + layerController.faceEvents.onThemeChanged(theme) } override fun onReactiveAxesChanged(axes: List) {} diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockLayerController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockLayerController.kt index 5d1a2dbc4209..af00cc264208 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockLayerController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleClockLayerController.kt @@ -31,8 +31,4 @@ interface SimpleClockLayerController { val config: ClockFaceConfig @VisibleForTesting var fakeTimeMills: Long? - - // Called immediately after either onColorPaletteChanged or onSeedColorChanged is called. - // Provided for convience to not duplicate color update logic after state updated. - fun updateColors() {} } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt index ce1eae48546a..7b1960efa1c6 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/SimpleDigitalHandLayerController.kt @@ -32,6 +32,7 @@ import com.android.systemui.plugins.clocks.ClockEvents import com.android.systemui.plugins.clocks.ClockFaceConfig import com.android.systemui.plugins.clocks.ClockFaceEvents import com.android.systemui.plugins.clocks.ClockReactiveSetting +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.shared.clocks.view.SimpleDigitalClockView @@ -63,7 +64,6 @@ open class SimpleDigitalHandLayerController( override val config = ClockFaceConfig() var dozeState: DefaultClockController.AnimationState? = null - var isRegionDark: Boolean = true init { view.layoutParams = @@ -240,10 +240,6 @@ open class SimpleDigitalHandLayerController( refreshTime() } - override fun onColorPaletteChanged(resources: Resources) {} - - override fun onSeedColorChanged(seedColor: Int?) {} - override fun onWeatherDataChanged(data: WeatherData) {} override fun onAlarmDataChanged(data: AlarmData) {} @@ -253,11 +249,6 @@ open class SimpleDigitalHandLayerController( override fun onReactiveAxesChanged(axes: List) {} } - override fun updateColors() { - view.updateColors(assets, isRegionDark) - refreshTime() - } - override val animations = object : ClockAnimations { override fun enter() { @@ -309,21 +300,20 @@ open class SimpleDigitalHandLayerController( applyMargin() } - override fun onRegionDarknessChanged(isRegionDark: Boolean) { - this@SimpleDigitalHandLayerController.isRegionDark = isRegionDark - updateColors() + override fun onThemeChanged(theme: ThemeConfig) { + val color = + when { + theme.seedColor != null -> theme.seedColor!! + theme.isDarkTheme -> resources.getColor(android.R.color.system_accent1_100) + else -> resources.getColor(android.R.color.system_accent2_600) + } + + view.updateColor(color) + refreshTime() } override fun onTargetRegionChanged(targetRegion: Rect?) {} override fun onSecondaryDisplayChanged(onSecondaryDisplay: Boolean) {} } - - companion object { - private val DEFAULT_LIGHT_COLOR = "@android:color/system_accent1_100+0" - private val DEFAULT_DARK_COLOR = "@android:color/system_accent2_600+0" - - fun getDefaultColor(assets: AssetLoader, isRegionDark: Boolean) = - assets.readColor(if (isRegionDark) DEFAULT_LIGHT_COLOR else DEFAULT_DARK_COLOR) - } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt index 81efcb9de4d8..ce4d71cff963 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/DigitalClockFaceView.kt @@ -27,7 +27,6 @@ import com.android.systemui.log.core.MessageBuffer import com.android.systemui.plugins.clocks.AlarmData import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.plugins.clocks.ZenData -import com.android.systemui.shared.clocks.AssetLoader import com.android.systemui.shared.clocks.LogUtil import java.util.Locale @@ -122,8 +121,8 @@ abstract class DigitalClockFaceView(ctx: Context, messageBuffer: MessageBuffer) open fun onPositionUpdated(fromLeft: Int, direction: Int, fraction: Float) {} - fun updateColors(assets: AssetLoader, isRegionDark: Boolean) { - digitalClockTextViewMap.forEach { _, view -> view.updateColors(assets, isRegionDark) } + fun updateColor(color: Int) { + digitalClockTextViewMap.forEach { _, view -> view.updateColor(color) } invalidate() } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt index 74617b1c0c5c..baed3ae5c7b2 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockTextView.kt @@ -50,7 +50,6 @@ import com.android.systemui.shared.clocks.LogUtil import com.android.systemui.shared.clocks.RenderType import com.android.systemui.shared.clocks.TextStyle import java.lang.Thread -import kotlin.math.ceil import kotlin.math.max import kotlin.math.min @@ -94,11 +93,6 @@ open class SimpleDigitalClockTextView( private var aodDozingInterpolator: Interpolator? = null @VisibleForTesting lateinit var textAnimator: TextAnimator - @VisibleForTesting var outlineAnimator: TextAnimator? = null - // used for hollow style for AOD version - // because stroke style for some fonts have some unwanted inner strokes - // we want to draw this layer on top to oclude them - @VisibleForTesting var innerAnimator: TextAnimator? = null lateinit var typefaceCache: TypefaceVariantCache private set @@ -108,8 +102,6 @@ open class SimpleDigitalClockTextView( if (this::textAnimator.isInitialized) { textAnimator.typefaceCache = value } - outlineAnimator?.typefaceCache = value - innerAnimator?.typefaceCache = value } @VisibleForTesting @@ -136,32 +128,14 @@ open class SimpleDigitalClockTextView( set(value) = super.setText(value) var textBorderWidth = 0F - var aodBorderWidth = 0F var baselineFromMeasure = 0 + var lockscreenColor = Color.WHITE - var textFillColor: Int? = null - var textOutlineColor = TEXT_OUTLINE_DEFAULT_COLOR - var aodFillColor = AOD_DEFAULT_COLOR - var aodOutlineColor = AOD_OUTLINE_DEFAULT_COLOR - - override fun updateColors(assets: AssetLoader, isRegionDark: Boolean) { - val fillColor = if (isRegionDark) textStyle.fillColorLight else textStyle.fillColorDark - textFillColor = - fillColor?.let { assets.readColor(it) } - ?: assets.seedColor - ?: getDefaultColor(assets, isRegionDark) - // for NumberOverlapView to read correct color - lockScreenPaint.color = textFillColor as Int - textStyle.outlineColor?.let { textOutlineColor = assets.readColor(it) } - ?: run { textOutlineColor = TEXT_OUTLINE_DEFAULT_COLOR } - (aodStyle.fillColorLight ?: aodStyle.fillColorDark)?.let { - aodFillColor = assets.readColor(it) - } ?: run { aodFillColor = AOD_DEFAULT_COLOR } - aodStyle.outlineColor?.let { aodOutlineColor = assets.readColor(it) } - ?: run { aodOutlineColor = AOD_OUTLINE_DEFAULT_COLOR } + override fun updateColor(color: Int) { + lockscreenColor = color + lockScreenPaint.color = lockscreenColor if (dozeFraction < 1f) { - textAnimator.setTextStyle(color = textFillColor, animate = false) - outlineAnimator?.setTextStyle(color = textOutlineColor, animate = false) + textAnimator.setTextStyle(color = lockscreenColor, animate = false) } invalidate() } @@ -183,13 +157,9 @@ open class SimpleDigitalClockTextView( if (layout != null) { if (!this::textAnimator.isInitialized) { textAnimator = textAnimatorFactory(layout, ::invalidate) - outlineAnimator = textAnimatorFactory(layout) {} - innerAnimator = textAnimatorFactory(layout) {} setInterpolatorPaint() } else { textAnimator.updateLayout(layout) - outlineAnimator?.updateLayout(layout) - innerAnimator?.updateLayout(layout) } baselineFromMeasure = layout.getLineBaseline(0) } else { @@ -248,10 +218,7 @@ open class SimpleDigitalClockTextView( canvas.translate(0F, measuredHeight.toFloat()) canvas.rotate(-90F) } - logger.d({ "onDraw(); ls: $str1; aod: $str2;" }) { - str1 = textAnimator.textInterpolator.shapedText - str2 = outlineAnimator?.textInterpolator?.shapedText - } + logger.d({ "onDraw(); ls: $str1" }) { str1 = textAnimator.textInterpolator.shapedText } val translation = getLocalTranslation() canvas.translate(translation.x.toFloat(), translation.y.toFloat()) digitTranslateAnimator?.let { @@ -266,7 +233,6 @@ open class SimpleDigitalClockTextView( (-translation.y + measuredHeight).toFloat(), null, ) - outlineAnimator?.draw(canvas) canvas.saveLayer( -translation.x.toFloat(), -translation.y.toFloat(), @@ -274,11 +240,8 @@ open class SimpleDigitalClockTextView( (-translation.y + measuredHeight).toFloat(), Paint().also { it.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OUT) }, ) - innerAnimator?.draw(canvas) canvas.restore() canvas.restore() - } else if (aodStyle.renderType != RenderType.CHANGE_WEIGHT) { - outlineAnimator?.draw(canvas) } textAnimator.draw(canvas) @@ -309,30 +272,13 @@ open class SimpleDigitalClockTextView( val fvar = if (isDozing) aodStyle.fontVariation else textStyle.fontVariation textAnimator.setTextStyle( animate = isAnimated && isAnimationEnabled, - color = if (isDozing) aodFillColor else textFillColor, + color = if (isDozing) AOD_COLOR else lockscreenColor, textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize, fvar = fvar, duration = aodStyle.transitionDuration, interpolator = aodDozingInterpolator, ) updateTextBoundsForTextAnimator() - outlineAnimator?.setTextStyle( - animate = isAnimated && isAnimationEnabled, - color = if (isDozing) aodOutlineColor else textOutlineColor, - textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize, - fvar = fvar, - strokeWidth = if (isDozing) aodBorderWidth else textBorderWidth, - duration = aodStyle.transitionDuration, - interpolator = aodDozingInterpolator, - ) - innerAnimator?.setTextStyle( - animate = isAnimated && isAnimationEnabled, - color = Color.WHITE, - textSize = if (isDozing) aodFontSizePx else lockScreenPaint.textSize, - fvar = fvar, - duration = aodStyle.transitionDuration, - interpolator = aodDozingInterpolator, - ) } override fun animateCharge() { @@ -345,8 +291,6 @@ open class SimpleDigitalClockTextView( val endFvar = if (dozeFraction == 0F) textStyle.fontVariation else aodStyle.fontVariation val startAnimPhase2 = Runnable { textAnimator.setTextStyle(fvar = endFvar, animate = isAnimationEnabled) - outlineAnimator?.setTextStyle(fvar = endFvar, animate = isAnimationEnabled) - innerAnimator?.setTextStyle(fvar = endFvar, animate = isAnimationEnabled) updateTextBoundsForTextAnimator() } textAnimator.setTextStyle( @@ -354,8 +298,6 @@ open class SimpleDigitalClockTextView( animate = isAnimationEnabled, onAnimationEnd = startAnimPhase2, ) - outlineAnimator?.setTextStyle(fvar = middleFvar, animate = isAnimationEnabled) - innerAnimator?.setTextStyle(fvar = middleFvar, animate = isAnimationEnabled) updateTextBoundsForTextAnimator() } @@ -373,8 +315,6 @@ open class SimpleDigitalClockTextView( requestLayout() } else { textAnimator.updateLayout(layout) - outlineAnimator?.updateLayout(layout) - innerAnimator?.updateLayout(layout) } } @@ -500,8 +440,7 @@ open class SimpleDigitalClockTextView( this.aodStyle = textStyle.copy() } this.aodStyle.transitionInterpolator?.let { aodDozingInterpolator = it.interpolator } - aodBorderWidth = parser.convert(this.aodStyle.borderWidth ?: DEFAULT_AOD_STROKE_WIDTH) - lockScreenPaint.strokeWidth = ceil(max(textBorderWidth, aodBorderWidth)) + lockScreenPaint.strokeWidth = textBorderWidth measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED) setInterpolatorPaint() recomputeMaxSingleDigitSizes() @@ -524,27 +463,14 @@ open class SimpleDigitalClockTextView( val lastUnconstrainedHeight = textBounds.height() + lockScreenPaint.strokeWidth * 2 fontSizeAdjustFactor = lastUnconstrainedHeight / lastUnconstrainedTextSize } - textStyle.borderWidthScale?.let { - textBorderWidth = fontSizePx * it - if (dozeFraction < 1.0F) { - outlineAnimator?.setTextStyle(strokeWidth = textBorderWidth, animate = false) - } - } - aodStyle.borderWidthScale?.let { - aodBorderWidth = fontSizePx * it - if (dozeFraction > 0.0F) { - outlineAnimator?.setTextStyle(strokeWidth = aodBorderWidth, animate = false) - } - } + textStyle.borderWidthScale?.let { textBorderWidth = fontSizePx * it } - lockScreenPaint.strokeWidth = ceil(max(textBorderWidth, aodBorderWidth)) + lockScreenPaint.strokeWidth = textBorderWidth recomputeMaxSingleDigitSizes() if (this::textAnimator.isInitialized) { textAnimator.setTextStyle(textSize = lockScreenPaint.textSize, animate = false) } - outlineAnimator?.setTextStyle(textSize = lockScreenPaint.textSize, animate = false) - innerAnimator?.setTextStyle(textSize = lockScreenPaint.textSize, animate = false) } private fun recomputeMaxSingleDigitSizes() { @@ -570,42 +496,7 @@ open class SimpleDigitalClockTextView( textAnimator.setTextStyle( fvar = textStyle.fontVariation, textSize = lockScreenPaint.textSize, - color = textFillColor, - animate = false, - ) - } - - if (outlineAnimator != null) { - outlineAnimator!! - .textInterpolator - .targetPaint - .set( - TextPaint(lockScreenPaint).also { - it.style = - if (aodStyle.renderType == RenderType.HOLLOW_TEXT) - Paint.Style.FILL_AND_STROKE - else Paint.Style.STROKE - } - ) - outlineAnimator!!.textInterpolator.onTargetPaintModified() - outlineAnimator!!.setTextStyle( - fvar = aodStyle.fontVariation, - textSize = lockScreenPaint.textSize, - color = Color.TRANSPARENT, - animate = false, - ) - } - - if (innerAnimator != null) { - innerAnimator!! - .textInterpolator - .targetPaint - .set(TextPaint(lockScreenPaint).also { it.style = Paint.Style.FILL }) - innerAnimator!!.textInterpolator.onTargetPaintModified() - innerAnimator!!.setTextStyle( - fvar = aodStyle.fontVariation, - textSize = lockScreenPaint.textSize, - color = Color.WHITE, + color = lockscreenColor, animate = false, ) } @@ -641,14 +532,7 @@ open class SimpleDigitalClockTextView( } companion object { - val DEFAULT_AOD_STROKE_WIDTH = "2dp" - val TEXT_OUTLINE_DEFAULT_COLOR = Color.TRANSPARENT - val AOD_DEFAULT_COLOR = Color.TRANSPARENT - val AOD_OUTLINE_DEFAULT_COLOR = Color.WHITE - private val DEFAULT_LIGHT_COLOR = "@android:color/system_accent1_100+0" - private val DEFAULT_DARK_COLOR = "@android:color/system_accent2_600+0" - - fun getDefaultColor(assets: AssetLoader, isRegionDark: Boolean) = - assets.readColor(if (isRegionDark) DEFAULT_LIGHT_COLOR else DEFAULT_DARK_COLOR) + val AOD_STROKE_WIDTH = "2dp" + val AOD_COLOR = Color.WHITE } } diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt index bbd2d3d1f782..30b54d881d92 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/view/SimpleDigitalClockView.kt @@ -32,7 +32,7 @@ interface SimpleDigitalClockView { fun applyTextSize(targetFontSizePx: Float?, constrainedByHeight: Boolean = false) - fun updateColors(assets: AssetLoader, isRegionDark: Boolean) + fun updateColor(color: Int) fun refreshTime() diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt index bbe03f001b03..7e86ff3e95ac 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/shared/clocks/DefaultClockProviderTest.kt @@ -28,6 +28,7 @@ import com.android.systemui.SysuiTestCase import com.android.systemui.customization.R import com.android.systemui.plugins.clocks.ClockId import com.android.systemui.plugins.clocks.ClockSettings +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.shared.clocks.DefaultClockController.Companion.DOZE_COLOR import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.eq @@ -72,8 +73,7 @@ class DefaultClockProviderTest : SysuiTestCase() { .thenReturn(mockSmallClockView) whenever(layoutInflater.inflate(eq(R.layout.clock_default_large), any(), anyBoolean())) .thenReturn(mockLargeClockView) - whenever(resources.getString(R.string.clock_default_name)) - .thenReturn("DEFAULT_CLOCK_NAME") + whenever(resources.getString(R.string.clock_default_name)).thenReturn("DEFAULT_CLOCK_NAME") whenever(resources.getString(R.string.clock_default_description)) .thenReturn("DEFAULT_CLOCK_DESC") whenever(resources.getDrawable(R.drawable.clock_default_thumbnail, null)) @@ -108,7 +108,7 @@ class DefaultClockProviderTest : SysuiTestCase() { verify(mockSmallClockView).setColors(DOZE_COLOR, Color.MAGENTA) verify(mockLargeClockView).setColors(DOZE_COLOR, Color.MAGENTA) - clock.initialize(resources, 0f, 0f) + clock.initialize(true, 0f, 0f) val expectedColor = 0 verify(mockSmallClockView).setColors(DOZE_COLOR, expectedColor) @@ -167,21 +167,22 @@ class DefaultClockProviderTest : SysuiTestCase() { } @Test - fun defaultClock_events_onColorPaletteChanged() { + fun defaultClock_events_onThemeChanged_noSeed() { val expectedColor = 0 val clock = provider.createClock(DEFAULT_CLOCK_ID) verify(mockSmallClockView).setColors(DOZE_COLOR, Color.MAGENTA) verify(mockLargeClockView).setColors(DOZE_COLOR, Color.MAGENTA) - clock.events.onColorPaletteChanged(resources) + clock.smallClock.events.onThemeChanged(ThemeConfig(true, null)) + clock.largeClock.events.onThemeChanged(ThemeConfig(true, null)) verify(mockSmallClockView).setColors(DOZE_COLOR, expectedColor) verify(mockLargeClockView).setColors(DOZE_COLOR, expectedColor) } @Test - fun defaultClock_events_onSeedColorChanged() { + fun defaultClock_events_onThemeChanged_newSeed() { val initSeedColor = 10 val newSeedColor = 20 val clock = provider.createClock(ClockSettings(DEFAULT_CLOCK_ID, initSeedColor)) @@ -189,7 +190,8 @@ class DefaultClockProviderTest : SysuiTestCase() { verify(mockSmallClockView).setColors(DOZE_COLOR, initSeedColor) verify(mockLargeClockView).setColors(DOZE_COLOR, initSeedColor) - clock.events.onSeedColorChanged(newSeedColor) + clock.smallClock.events.onThemeChanged(ThemeConfig(true, newSeedColor)) + clock.largeClock.events.onThemeChanged(ThemeConfig(true, newSeedColor)) verify(mockSmallClockView).setColors(DOZE_COLOR, newSeedColor) verify(mockLargeClockView).setColors(DOZE_COLOR, newSeedColor) @@ -210,7 +212,7 @@ class DefaultClockProviderTest : SysuiTestCase() { fun test_aodClock_always_whiteColor() { val clock = provider.createClock(DEFAULT_CLOCK_ID) clock.smallClock.animations.doze(0.9f) // set AOD mode to active - clock.smallClock.events.onRegionDarknessChanged(true) + clock.smallClock.events.onThemeChanged(ThemeConfig(true, null)) verify((clock.smallClock.view as AnimatableClockView), never()).animateAppearOnLockscreen() } } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt index 6d27b6f9637b..f975c4f13ff4 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt @@ -13,7 +13,6 @@ */ package com.android.systemui.plugins.clocks -import android.content.res.Resources import android.graphics.Rect import android.graphics.drawable.Drawable import android.view.View @@ -85,7 +84,7 @@ interface ClockController { val events: ClockEvents /** Initializes various rendering parameters. If never called, provides reasonable defaults. */ - fun initialize(resources: Resources, dozeFraction: Float, foldFraction: Float) + fun initialize(isDarkTheme: Boolean, dozeFraction: Float, foldFraction: Float) /** Optional method for dumping debug information */ fun dump(pw: PrintWriter) @@ -107,6 +106,10 @@ interface ClockFaceController { /** Determines the way the hosting app should behave when rendering this clock face */ val config: ClockFaceConfig + @get:SimpleProperty + /** Current theme information the clock is using */ + val theme: ThemeConfig + @get:SimpleProperty /** Events specific to this clock face */ val events: ClockFaceEvents @@ -190,12 +193,6 @@ interface ClockEvents { /** Call whenever the locale changes */ fun onLocaleChanged(locale: Locale) - /** Call whenever the color palette should update */ - fun onColorPaletteChanged(resources: Resources) - - /** Call if the seed color has changed and should be updated */ - fun onSeedColorChanged(seedColor: Int?) - /** Call whenever the weather data should update */ fun onWeatherDataChanged(data: WeatherData) @@ -269,11 +266,13 @@ interface ClockFaceEvents { fun onTimeTick() /** - * Region Darkness specific to the clock face. - * - isRegionDark = dark theme -> clock should be light - * - !isRegionDark = light theme -> clock should be dark + * Call whenever the theme or seedColor is updated + * + * Theme can be specific to the clock face. + * - isDarkTheme -> clock should be light + * - !isDarkTheme -> clock should be dark */ - fun onRegionDarknessChanged(isRegionDark: Boolean) + fun onThemeChanged(theme: ThemeConfig) /** * Call whenever font settings change. Pass in a target font size in pixels. The specific clock @@ -294,6 +293,8 @@ interface ClockFaceEvents { fun onSecondaryDisplayChanged(onSecondaryDisplay: Boolean) } +data class ThemeConfig(val isDarkTheme: Boolean, val seedColor: Int?) + /** Tick rates for clocks */ enum class ClockTickRate(val value: Int) { PER_MINUTE(2), // Update the clock once per minute. diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index e5cf7cf0eeb8..9ec038b18c9e 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -140,7 +140,7 @@ constructor( val clockStr = clock.toString() loggers.forEach { it.d({ "New Clock: $str1" }) { str1 = clockStr } } - clock.initialize(resources, dozeAmount, 0f) + clock.initialize(isDarkTheme(), dozeAmount, 0f) if (!regionSamplingEnabled) { updateColors() @@ -244,30 +244,30 @@ constructor( private val regionSamplingEnabled = featureFlags.isEnabled(REGION_SAMPLING) private var largeClockOnSecondaryDisplay = false + private fun isDarkTheme(): Boolean { + val isLightTheme = TypedValue() + context.theme.resolveAttribute(android.R.attr.isLightTheme, isLightTheme, true) + return isLightTheme.data == 0 + } + private fun updateColors() { + val isDarkTheme = isDarkTheme() if (regionSamplingEnabled) { - clock?.let { clock -> - smallRegionSampler?.let { - val isRegionDark = it.currentRegionDarkness().isDark - clock.smallClock.events.onRegionDarknessChanged(isRegionDark) - } - - largeRegionSampler?.let { - val isRegionDark = it.currentRegionDarkness().isDark - clock.largeClock.events.onRegionDarknessChanged(isRegionDark) - } + clock?.smallClock?.run { + val isDark = smallRegionSampler?.currentRegionDarkness()?.isDark ?: isDarkTheme + events.onThemeChanged(theme.copy(isDarkTheme = isDark)) + } + clock?.largeClock?.run { + val isDark = largeRegionSampler?.currentRegionDarkness()?.isDark ?: isDarkTheme + events.onThemeChanged(theme.copy(isDarkTheme = isDark)) } return } - val isLightTheme = TypedValue() - context.theme.resolveAttribute(android.R.attr.isLightTheme, isLightTheme, true) - val isRegionDark = isLightTheme.data == 0 - clock?.run { - Log.i(TAG, "Region isDark: $isRegionDark") - smallClock.events.onRegionDarknessChanged(isRegionDark) - largeClock.events.onRegionDarknessChanged(isRegionDark) + Log.i(TAG, "isThemeDark: $isDarkTheme") + smallClock.events.onThemeChanged(smallClock.theme.copy(isDarkTheme = isDarkTheme)) + largeClock.events.onThemeChanged(largeClock.theme.copy(isDarkTheme = isDarkTheme)) } } @@ -308,7 +308,6 @@ constructor( private val configListener = object : ConfigurationController.ConfigurationListener { override fun onThemeChanged() { - clock?.run { events.onColorPaletteChanged(resources) } updateColors() } @@ -505,7 +504,7 @@ constructor( largeRegionSampler?.stopRegionSampler() smallTimeListener?.stop() largeTimeListener?.stop() - clock?.apply { + clock?.run { smallClock.view.removeOnAttachStateChangeListener(smallClockOnAttachStateChangeListener) largeClock.view.removeOnAttachStateChangeListener(largeClockOnAttachStateChangeListener) } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index c7ea98052b66..11dde6aa0dfb 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -465,7 +465,8 @@ public class KeyguardClockSwitch extends RelativeLayout { super.onLayout(changed, l, t, r, b); // TODO: b/305022530 if (mClock != null && mClock.getConfig().getId().equals("DIGITAL_CLOCK_METRO")) { - mClock.getEvents().onColorPaletteChanged(mContext.getResources()); + mClock.getSmallClock().getEvents().onThemeChanged(mClock.getSmallClock().getTheme()); + mClock.getLargeClock().getEvents().onThemeChanged(mClock.getLargeClock().getTheme()); } if (changed) { 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 21d1db4a5052..46f5c05092eb 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 @@ -114,7 +114,18 @@ object KeyguardPreviewClockViewBinder { } .invokeOnCompletion { // recover seed color especially for Transit clock - lastClock?.events?.onSeedColorChanged(clockRegistry.seedColor) + lastClock?.apply { + smallClock.run { + events.onThemeChanged( + theme.copy(seedColor = clockRegistry.seedColor) + ) + } + largeClock.run { + events.onThemeChanged( + theme.copy(seedColor = clockRegistry.seedColor) + ) + } + } } } } 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 08d35a72ab12..573ef68b48b6 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 @@ -80,6 +80,7 @@ import com.android.systemui.keyguard.ui.viewmodel.OccludingAppDeviceEntryMessage import com.android.systemui.monet.ColorScheme import com.android.systemui.monet.Style import com.android.systemui.plugins.clocks.ClockController +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.WeatherData import com.android.systemui.res.R import com.android.systemui.shade.domain.interactor.ShadeInteractor @@ -653,9 +654,13 @@ constructor( // Note that when [wallpaperColors] is null, isWallpaperDark is true. val isWallpaperDark: Boolean = (colors.colorHints.and(WallpaperColors.HINT_SUPPORTS_DARK_TEXT)) == 0 - clock.events.onSeedColorChanged( - if (isWallpaperDark) lightClockColor else darkClockColor - ) + val theme = + ThemeConfig( + isWallpaperDark, + if (isWallpaperDark) lightClockColor else darkClockColor, + ) + clock.smallClock.events.onThemeChanged(theme) + clock.largeClock.events.onThemeChanged(theme) } // In clock preview, we should have a seed color for clock // before setting clock to clockEventController to avoid updateColor with seedColor == null diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt index c7b707d02cb3..2b167e4c5da4 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/keyguard/ClockEventControllerTest.kt @@ -52,6 +52,7 @@ import com.android.systemui.plugins.clocks.ClockFaceController import com.android.systemui.plugins.clocks.ClockFaceEvents import com.android.systemui.plugins.clocks.ClockMessageBuffers import com.android.systemui.plugins.clocks.ClockTickRate +import com.android.systemui.plugins.clocks.ThemeConfig import com.android.systemui.plugins.clocks.ZenData import com.android.systemui.plugins.clocks.ZenData.ZenMode import com.android.systemui.res.R @@ -81,7 +82,6 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith -import org.mockito.ArgumentMatchers.anyBoolean import org.mockito.ArgumentMatchers.anyFloat import org.mockito.ArgumentMatchers.anyInt import org.mockito.Mock @@ -151,6 +151,8 @@ class ClockEventControllerTest : SysuiTestCase() { .thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE)) whenever(largeClockController.config) .thenReturn(ClockFaceConfig(tickRate = ClockTickRate.PER_MINUTE)) + whenever(smallClockController.theme).thenReturn(ThemeConfig(true, null)) + whenever(largeClockController.theme).thenReturn(ThemeConfig(true, null)) zenModeRepository.addMode(MANUAL_DND_INACTIVE) @@ -205,14 +207,15 @@ class ClockEventControllerTest : SysuiTestCase() { @Test fun themeChanged_verifyClockPaletteUpdated() = runBlocking(IMMEDIATE) { - verify(smallClockEvents).onRegionDarknessChanged(anyBoolean()) - verify(largeClockEvents).onRegionDarknessChanged(anyBoolean()) + verify(smallClockEvents).onThemeChanged(any()) + verify(largeClockEvents).onThemeChanged(any()) val captor = argumentCaptor() verify(configurationController).addCallback(capture(captor)) captor.value.onThemeChanged() - verify(events).onColorPaletteChanged(any()) + verify(smallClockEvents, times(2)).onThemeChanged(any()) + verify(largeClockEvents, times(2)).onThemeChanged(any()) } @Test -- GitLab From 08cf8963873c041558d95619487a1ff66b174305 Mon Sep 17 00:00:00 2001 From: Biswarup Pal Date: Wed, 23 Oct 2024 18:13:19 +0000 Subject: [PATCH 326/459] Add flag to show all permission dialogs on virtual devices Test: presubmit Flag: android.permission.flags.allow_host_permission_dialogs_on_virtual_devices Bug: 371173672 Change-Id: I882d30ee6628c42bfd1dc2febb76d00e086fa0f6 --- core/java/android/permission/flags.aconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index 3df7ff9e8165..25f3f968a187 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -291,3 +291,11 @@ flag { description: "This fixed read-only flag is used to enable platform support for Oxygen Saturation (SpO2)." bug: "369873227" } + +flag { + name: "allow_host_permission_dialogs_on_virtual_devices" + is_exported: true + namespace: "permissions" + description: "Allow host device permission dialogs (i.e., dialogs for non device-aware permissions) to be shown on virtual devices" + bug: "371173672" +} -- GitLab From 85e8f3e546331249ee0917495284fc653fa6c493 Mon Sep 17 00:00:00 2001 From: helen cheuk Date: Wed, 23 Oct 2024 17:08:08 +0000 Subject: [PATCH 327/459] Return null when resource not found for key glyph Bug: 375193692 Test: Manual Flag: com.android.hardware.input.keyboard_glyph_map Change-Id: I8df428cfadb0e16bb8e6b2d47a4089fa7b522fb0 --- core/java/android/hardware/input/KeyGlyphMap.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/java/android/hardware/input/KeyGlyphMap.java b/core/java/android/hardware/input/KeyGlyphMap.java index 49c47a2ad4c4..b517a635c9c1 100644 --- a/core/java/android/hardware/input/KeyGlyphMap.java +++ b/core/java/android/hardware/input/KeyGlyphMap.java @@ -170,6 +170,8 @@ public final class KeyGlyphMap implements Parcelable { return resources.getDrawable(drawableRes, null); } catch (PackageManager.NameNotFoundException ignored) { Log.e(TAG, "Package name not found for " + mComponentName); + } catch (Resources.NotFoundException ignored) { + Log.e(TAG, "Resource not found for " + mComponentName); } return null; } -- GitLab From a7846d1f199c71810df3f8c419fa643ffee8c92b Mon Sep 17 00:00:00 2001 From: jaeshin Date: Mon, 7 Oct 2024 19:52:19 +0900 Subject: [PATCH 328/459] Google contribution item #12 - subitem #2, base [VZW-Skylo] apply Idle Mode Scanning for Terrestrial Network Telephony Framework - base - Add, Modify APIs, Callback Bug: 374301122 Flag: EXEMPT bugfix Change-Id: I73bcd046ba990c938f26b6c9e13d6c659cafac68 Signed-off-by: jaeshin --- .../telephony/satellite/ISatelliteModemStateCallback.aidl | 7 +++++++ .../android/telephony/satellite/SatelliteManager.java | 6 ++++++ .../telephony/satellite/SatelliteModemStateCallback.java | 8 ++++++++ .../java/android/telephony/satellite/stub/ISatellite.aidl | 8 ++++++-- .../telephony/satellite/stub/ISatelliteListener.aidl | 7 +++++++ .../telephony/satellite/stub/SatelliteImplBase.java | 8 ++++---- 6 files changed, 38 insertions(+), 6 deletions(-) diff --git a/telephony/java/android/telephony/satellite/ISatelliteModemStateCallback.aidl b/telephony/java/android/telephony/satellite/ISatelliteModemStateCallback.aidl index 50e3a0e4a79d..cfa06ee1bd51 100644 --- a/telephony/java/android/telephony/satellite/ISatelliteModemStateCallback.aidl +++ b/telephony/java/android/telephony/satellite/ISatelliteModemStateCallback.aidl @@ -42,4 +42,11 @@ oneway interface ISatelliteModemStateCallback { * For LTE (EMM), cause codes are TS 24.301 Sec 9.9.3.9 */ void onRegistrationFailure(in int causeCode); + + /** + * Indicates that the background search for terrestrial network is finished with result + * + * @param isAvailable True means there's terrestrial network and false means there's not. + */ + void onTerrestrialNetworkAvailableChanged(in boolean isAvailable); } diff --git a/telephony/java/android/telephony/satellite/SatelliteManager.java b/telephony/java/android/telephony/satellite/SatelliteManager.java index 44de65a009ff..5068c52d9283 100644 --- a/telephony/java/android/telephony/satellite/SatelliteManager.java +++ b/telephony/java/android/telephony/satellite/SatelliteManager.java @@ -1601,6 +1601,12 @@ public final class SatelliteManager { executor.execute(() -> Binder.withCleanCallingIdentity(() -> callback.onRegistrationFailure(causeCode))); } + + @Override + public void onTerrestrialNetworkAvailableChanged(boolean isAvailable) { + executor.execute(() -> Binder.withCleanCallingIdentity(() -> + callback.onTerrestrialNetworkAvailableChanged(isAvailable))); + } }; sSatelliteModemStateCallbackMap.put(callback, internalCallback); return telephony.registerForSatelliteModemStateChanged(internalCallback); diff --git a/telephony/java/android/telephony/satellite/SatelliteModemStateCallback.java b/telephony/java/android/telephony/satellite/SatelliteModemStateCallback.java index 13af4694389b..040fbbbb2689 100644 --- a/telephony/java/android/telephony/satellite/SatelliteModemStateCallback.java +++ b/telephony/java/android/telephony/satellite/SatelliteModemStateCallback.java @@ -54,4 +54,12 @@ public interface SatelliteModemStateCallback { * @hide */ default void onRegistrationFailure(int causeCode) {}; + + /** + * Indicates that the background search for terrestrial network is finished with result + * + * @param isAvailable True means there's terrestrial network and false means there's not. + * @hide + */ + default void onTerrestrialNetworkAvailableChanged(boolean isAvailable) {}; } diff --git a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl index 8b51321bc7c4..ac0a5fc320c6 100644 --- a/telephony/java/android/telephony/satellite/stub/ISatellite.aidl +++ b/telephony/java/android/telephony/satellite/stub/ISatellite.aidl @@ -70,12 +70,16 @@ oneway interface ISatellite { in IIntegerConsumer resultCallback); /** - * Allow cellular modem scanning while satellite mode is on. + * Framework will call this API to determine if there are any TN networks available. + * This API will be called if framework identifies that user is inactive i.e. no + * data transfer or no pointing to satellite. + * Modem can send the callback with available for either in service or limited service. + * @param enabled {@code true} to enable cellular modem while satellite mode is on * and {@code false} to disable * @param errorCallback The callback to receive the error code result of the operation. */ - void enableCellularModemWhileSatelliteModeIsOn(in boolean enabled, + void enableTerrestrialNetworkScanWhileSatelliteModeIsOn(in boolean enabled, in IIntegerConsumer errorCallback); /** diff --git a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl index 3f2fce2b9f1d..a2ebd3a11750 100644 --- a/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl +++ b/telephony/java/android/telephony/satellite/stub/ISatelliteListener.aidl @@ -82,4 +82,11 @@ oneway interface ISatelliteListener { * For LTE (EMM), cause codes are TS 24.301 Sec 9.9.3.9 */ void onRegistrationFailure(in int causeCode); + + /** + * Modem can send the callback with available for either in service or limited service. + * + * @param isAvailable True means there's terrestrial network and false means there's not. + */ + void onTerrestrialNetworkAvailableChanged(in boolean isAvailable); } diff --git a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java index 4f472106a329..eaeed2a0a9fa 100644 --- a/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java +++ b/telephony/java/android/telephony/satellite/stub/SatelliteImplBase.java @@ -80,12 +80,12 @@ public class SatelliteImplBase extends SatelliteService { } @Override - public void enableCellularModemWhileSatelliteModeIsOn(boolean enabled, + public void enableTerrestrialNetworkScanWhileSatelliteModeIsOn(boolean enabled, IIntegerConsumer resultCallback) throws RemoteException { executeMethodAsync( () -> SatelliteImplBase.this - .enableCellularModemWhileSatelliteModeIsOn(enabled, resultCallback), - "enableCellularModemWhileSatelliteModeIsOn"); + .enableTerrestrialNetworkScanWhileSatelliteModeIsOn( + enabled, resultCallback), "enableTerrestrialNetworkScanWhileSatelliteModeIsOn"); } @Override @@ -314,7 +314,7 @@ public class SatelliteImplBase extends SatelliteService { * and {@code false} to disable * @param resultCallback The callback to receive the error code result of the operation. */ - public void enableCellularModemWhileSatelliteModeIsOn(boolean enabled, + public void enableTerrestrialNetworkScanWhileSatelliteModeIsOn(boolean enabled, @NonNull IIntegerConsumer resultCallback) { // stub implementation } -- GitLab From 171d4adb586a04597fea69a30a19e0a6a9499c54 Mon Sep 17 00:00:00 2001 From: Rachit Jain Date: Mon, 21 Oct 2024 20:08:19 +0000 Subject: [PATCH 329/459] Reland^2 "Revert "Defer resume of activity while applying wct"" - When the hierarchy is changing, defer resuming the activity until it is ready to let it finish processing the wct. - If the activity does not wait, there will be extra lifecycle states even if they are applied in the same wct. Update test to not defer resume at the start. - Only send wct if the activity is in the resumed state since the activity could have been removed already. Change-Id: I1e2a8d9a26eecee1286967157923b5b3b4fb2ecb Flag: EXEMPT (bug fix) Bug: 369186876 Test: atest CtsWindowManagerDeviceActivity com.android.server.wm.ActivityTaskManagerServiceTests --- services/core/java/com/android/server/wm/ActivityRecord.java | 2 +- .../java/com/android/server/wm/ActivityTaskSupervisor.java | 5 ++++- .../android/server/wm/ActivityTaskManagerServiceTests.java | 2 -- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 0b36c7eb5fdf..15a289ec3519 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -1452,7 +1452,7 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A } boolean scheduleTopResumedActivityChanged(boolean onTop) { - if (!attachedToProcess()) { + if (!attachedToProcess() || isState(DESTROYING, DESTROYED)) { ProtoLog.w(WM_DEBUG_STATES, "Can't report activity position update - client not running, " + "activityRecord=%s", this); diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index 4f71719006f5..cd71ec3b534c 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -2280,6 +2280,9 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { * sent to the new top resumed activity. */ ActivityRecord updateTopResumedActivityIfNeeded(String reason) { + if (!readyToResume()) { + return mTopResumedActivity; + } final ActivityRecord prevTopActivity = mTopResumedActivity; final Task topRootTask = mRootWindowContainer.getTopDisplayFocusedRootTask(); if (topRootTask == null || topRootTask.getTopResumedActivity() == prevTopActivity) { @@ -2340,8 +2343,8 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { && mTopResumedActivity.scheduleTopResumedActivityChanged(false /* onTop */)) { scheduleTopResumedStateLossTimeout(mTopResumedActivity); mTopResumedActivityWaitingForPrev = true; - mTopResumedActivity = null; } + mTopResumedActivity = null; } /** Schedule top resumed state change if previous top activity already reported back. */ diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java index c176658da847..e0b29c937381 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityTaskManagerServiceTests.java @@ -382,13 +382,11 @@ public class ActivityTaskManagerServiceTests extends WindowTestsBase { @Test public void testResumeNextActivityOnCrashedAppDied() { - mSupervisor.beginDeferResume(); final ActivityRecord homeActivity = new ActivityBuilder(mAtm) .setTask(mRootWindowContainer.getDefaultTaskDisplayArea().getOrCreateRootHomeTask()) .build(); final ActivityRecord activity = new ActivityBuilder(mAtm).setCreateTask(true).build(); activity.setState(RESUMED, "test"); - mSupervisor.endDeferResume(); assertEquals(activity.app, mAtm.mInternal.getTopApp()); -- GitLab From a5a63692fc6530f106353a7e0801289b442cebd7 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Martinez Date: Wed, 9 Oct 2024 14:26:50 -0700 Subject: [PATCH 330/459] Adding a TileHapticsViewModel for haptic playback on QS tiles. The view-model handles haptic playback for interactions with large and small quick settings tiles. Test: manual. Verified correct haptic playback when toggling tiles, as well as long-pressing tiles when tiles launch or fail to launch. Test: TileHapticsViewModelTest Flag: com.android.systemui.msdl_feedback Bug: 371193636 Bug: 371193619 Bug: 371193607 Bug: 371193634 Change-Id: I2e01f49ce18504284d2f449f13c257a2950eb7eb --- .../msdl/qs/TileHapticsViewModelTest.kt | 166 +++++++++++++++ .../haptics/msdl/qs/StateAwareExpandable.kt | 93 +++++++++ .../haptics/msdl/qs/TileHapticsViewModel.kt | 190 ++++++++++++++++++ .../panels/ui/compose/QuickQuickSettings.kt | 1 + .../ui/compose/infinitegrid/CommonTile.kt | 2 + .../infinitegrid/InfiniteGridLayout.kt | 3 + .../qs/panels/ui/compose/infinitegrid/Tile.kt | 40 +++- .../viewmodel/QuickQuickSettingsViewModel.kt | 2 + .../msdl/TileHapticsViewModelFactoryKosmos.kt | 33 +++ .../src/com/android/systemui/qs/FakeQSTile.kt | 12 +- .../interactor/InfiniteGridLayoutKosmos.kt | 9 +- .../QuickQuickSettingsViewModelKosmos.kt | 2 + .../ui/viewmodel/TileViewModelKosmos.kt | 25 +++ 13 files changed, 568 insertions(+), 10 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModelTest.kt create mode 100644 packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/StateAwareExpandable.kt create mode 100644 packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModel.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/TileHapticsViewModelFactoryKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModelKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModelTest.kt new file mode 100644 index 000000000000..5efb6171cdde --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModelTest.kt @@ -0,0 +1,166 @@ +/* + * 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.haptics.msdl.qs + +import android.service.quicksettings.Tile +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.haptics.msdl.fakeMSDLPlayer +import com.android.systemui.haptics.msdl.tileHapticsViewModelFactory +import com.android.systemui.kosmos.testScope +import com.android.systemui.lifecycle.activateIn +import com.android.systemui.plugins.qs.QSTile +import com.android.systemui.qs.panels.ui.viewmodel.fakeQsTile +import com.android.systemui.qs.panels.ui.viewmodel.tileViewModel +import com.android.systemui.testKosmos +import com.google.android.msdl.data.model.MSDLToken +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.TestScope +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@OptIn(ExperimentalCoroutinesApi::class) +@RunWith(AndroidJUnit4::class) +class TileHapticsViewModelTest : SysuiTestCase() { + + private val kosmos = testKosmos() + private val testScope = kosmos.testScope + private val qsTile = kosmos.fakeQsTile + private val msdlPlayer = kosmos.fakeMSDLPlayer + private val tileViewModel = kosmos.tileViewModel + + private val underTest = kosmos.tileHapticsViewModelFactory.create(tileViewModel) + + @Before + fun setUp() { + underTest.activateIn(testScope) + } + + @Test + fun whenTileTogglesOnFromClick_playsSwitchOnHaptics() = + testScope.runTest { + // WHEN the tile toggles on after being clicked + underTest.setTileInteractionState(TileHapticsViewModel.TileInteractionState.CLICKED) + toggleOn() + + // THEN the switch on token plays + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWITCH_ON) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun whenTileTogglesOffFromClick_playsSwitchOffHaptics() = + testScope.runTest { + // WHEN the tile toggles off after being clicked + underTest.setTileInteractionState(TileHapticsViewModel.TileInteractionState.CLICKED) + toggleOff() + + // THEN the switch off token plays + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.SWITCH_OFF) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun whenTileTogglesOnWhileIdle_doesNotPlaySwitchOnHaptics() = + testScope.runTest { + // WHEN the tile toggles on without being clicked + toggleOn() + + // THEN no token plays + assertThat(msdlPlayer.latestTokenPlayed).isNull() + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun whenTileTogglesOffWhileIdle_doesNotPlaySwitchOffHaptics() = + testScope.runTest { + // WHEN the tile toggles off without being clicked + toggleOff() + + // THEN no token plays + assertThat(msdlPlayer.latestTokenPlayed).isNull() + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun whenLaunchingFromLongClick_playsLongPressHaptics() = + testScope.runTest { + // WHEN the tile is long-clicked and its action state changes accordingly + underTest.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.LONG_CLICKED + ) + // WHEN the activity transition (from the long-click) starts + underTest.onActivityLaunchTransitionStart() + runCurrent() + + // THEN the long-press token plays + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.LONG_PRESS) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun onLongClick_whenTileDoesNotHandleLongClick_playsFailureHaptics() = + testScope.runTest { + // WHEN the tile is long-clicked but the tile does not handle a long-click + val state = QSTile.State().apply { handlesLongClick = false } + qsTile.changeState(state) + underTest.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.LONG_CLICKED + ) + runCurrent() + + // THEN the failure token plays + assertThat(msdlPlayer.latestTokenPlayed).isEqualTo(MSDLToken.FAILURE) + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + @Test + fun whenLaunchingFromClick_doesNotPlayHaptics() = + testScope.runTest { + // WHEN the tile is clicked and its action state changes accordingly + underTest.setTileInteractionState(TileHapticsViewModel.TileInteractionState.CLICKED) + // WHEN an activity transition starts (from clicking) + underTest.onActivityLaunchTransitionStart() + runCurrent() + + // THEN no haptics play + assertThat(msdlPlayer.latestTokenPlayed).isNull() + assertThat(msdlPlayer.latestPropertiesPlayed).isNull() + } + + private fun TestScope.toggleOn() { + qsTile.changeState(QSTile.State().apply { state = Tile.STATE_INACTIVE }) + runCurrent() + + qsTile.changeState(QSTile.State().apply { state = Tile.STATE_ACTIVE }) + runCurrent() + } + + private fun TestScope.toggleOff() { + qsTile.changeState(QSTile.State().apply { state = Tile.STATE_ACTIVE }) + runCurrent() + + qsTile.changeState(QSTile.State().apply { state = Tile.STATE_INACTIVE }) + runCurrent() + } +} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/StateAwareExpandable.kt b/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/StateAwareExpandable.kt new file mode 100644 index 000000000000..215ceacaef14 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/StateAwareExpandable.kt @@ -0,0 +1,93 @@ +/* + * 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.haptics.msdl.qs + +import android.content.ComponentName +import android.view.ViewGroup +import com.android.systemui.animation.ActivityTransitionAnimator +import com.android.systemui.animation.DialogCuj +import com.android.systemui.animation.DialogTransitionAnimator +import com.android.systemui.animation.Expandable + +private fun ActivityTransitionAnimator.Controller.withStateAwareness( + onActivityLaunchTransitionStart: () -> Unit, + onActivityLaunchTransitionEnd: () -> Unit, +): ActivityTransitionAnimator.Controller { + val delegate = this + return object : ActivityTransitionAnimator.Controller by delegate { + override fun onTransitionAnimationStart(isExpandingFullyAbove: Boolean) { + onActivityLaunchTransitionStart() + delegate.onTransitionAnimationStart(isExpandingFullyAbove) + } + + override fun onTransitionAnimationCancelled(newKeyguardOccludedState: Boolean?) { + onActivityLaunchTransitionEnd() + delegate.onTransitionAnimationCancelled(newKeyguardOccludedState) + } + + override fun onTransitionAnimationEnd(isExpandingFullyAbove: Boolean) { + onActivityLaunchTransitionEnd() + delegate.onTransitionAnimationEnd(isExpandingFullyAbove) + } + } +} + +private fun DialogTransitionAnimator.Controller.withStateAwareness( + onDialogDrawingStart: () -> Unit, + onDialogDrawingEnd: () -> Unit, +): DialogTransitionAnimator.Controller { + val delegate = this + return object : DialogTransitionAnimator.Controller by delegate { + + override fun startDrawingInOverlayOf(viewGroup: ViewGroup) { + onDialogDrawingStart() + delegate.startDrawingInOverlayOf(viewGroup) + } + + override fun stopDrawingInOverlay() { + onDialogDrawingEnd() + delegate.stopDrawingInOverlay() + } + } +} + +fun Expandable.withStateAwareness( + onDialogDrawingStart: () -> Unit, + onDialogDrawingEnd: () -> Unit, + onActivityLaunchTransitionStart: () -> Unit, + onActivityLaunchTransitionEnd: () -> Unit, +): Expandable { + val delegate = this + return object : Expandable { + override fun activityTransitionController( + launchCujType: Int?, + cookie: ActivityTransitionAnimator.TransitionCookie?, + component: ComponentName?, + returnCujType: Int?, + ): ActivityTransitionAnimator.Controller? = + delegate + .activityTransitionController(launchCujType, cookie, component, returnCujType) + ?.withStateAwareness(onActivityLaunchTransitionStart, onActivityLaunchTransitionEnd) + + override fun dialogTransitionController( + cuj: DialogCuj? + ): DialogTransitionAnimator.Controller? = + delegate + .dialogTransitionController(cuj) + ?.withStateAwareness(onDialogDrawingStart, onDialogDrawingEnd) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModel.kt b/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModel.kt new file mode 100644 index 000000000000..79059506b727 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/haptics/msdl/qs/TileHapticsViewModel.kt @@ -0,0 +1,190 @@ +/* + * 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.haptics.msdl.qs + +import android.service.quicksettings.Tile +import com.android.systemui.Flags +import com.android.systemui.animation.Expandable +import com.android.systemui.lifecycle.ExclusiveActivatable +import com.android.systemui.qs.panels.ui.viewmodel.TileViewModel +import com.android.systemui.util.kotlin.pairwise +import com.google.android.msdl.data.model.MSDLToken +import com.google.android.msdl.domain.MSDLPlayer +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import javax.inject.Inject +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.awaitCancellation +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged +import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.merge +import kotlinx.coroutines.flow.transform + +/** A view-model to trigger haptics feedback on Quick Settings tiles */ +@OptIn(ExperimentalCoroutinesApi::class) +class TileHapticsViewModel +@AssistedInject +constructor( + private val msdlPlayer: MSDLPlayer, + @Assisted private val tileViewModel: TileViewModel, +) : ExclusiveActivatable() { + + private val tileInteractionState = MutableStateFlow(TileInteractionState.IDLE) + private val tileAnimationState = MutableStateFlow(TileAnimationState.IDLE) + private val canPlayToggleHaptics: Boolean + get() = + tileAnimationState.value == TileAnimationState.IDLE && + tileInteractionState.value == TileInteractionState.CLICKED + + val isIdle: Boolean + get() = + tileAnimationState.value == TileAnimationState.IDLE && + tileInteractionState.value == TileInteractionState.IDLE + + private val toggleHapticsState: Flow = + tileViewModel.state + .mapLatest { it.state } + .pairwise() + .transform { (previous, current) -> + val toggleState = + when { + !canPlayToggleHaptics -> TileHapticsState.NO_HAPTICS + previous == Tile.STATE_INACTIVE && current == Tile.STATE_ACTIVE -> + TileHapticsState.TOGGLE_ON + previous == Tile.STATE_ACTIVE && current == Tile.STATE_INACTIVE -> + TileHapticsState.TOGGLE_OFF + else -> TileHapticsState.NO_HAPTICS + } + emit(toggleState) + } + .distinctUntilChanged() + + private val interactionHapticsState: Flow = + combine(tileInteractionState, tileAnimationState) { interactionState, animationState -> + when { + interactionState == TileInteractionState.LONG_CLICKED && + animationState == TileAnimationState.ACTIVITY_LAUNCH -> + TileHapticsState.LONG_PRESS + interactionState == TileInteractionState.LONG_CLICKED && + !tileViewModel.currentState.handlesLongClick -> + TileHapticsState.FAILED_LONGPRESS + else -> TileHapticsState.NO_HAPTICS + } + } + .distinctUntilChanged() + + private val hapticsState: Flow = + merge(toggleHapticsState, interactionHapticsState) + + override suspend fun onActivated(): Nothing { + try { + hapticsState.collect { hapticsState -> + val tokenToPlay: MSDLToken? = + when (hapticsState) { + TileHapticsState.TOGGLE_ON -> MSDLToken.SWITCH_ON + TileHapticsState.TOGGLE_OFF -> MSDLToken.SWITCH_OFF + TileHapticsState.LONG_PRESS -> MSDLToken.LONG_PRESS + TileHapticsState.FAILED_LONGPRESS -> MSDLToken.FAILURE + TileHapticsState.NO_HAPTICS -> null + } + tokenToPlay?.let { + msdlPlayer.playToken(it) + resetStates() + } + } + awaitCancellation() + } finally { + resetStates() + } + } + + private fun resetStates() { + tileInteractionState.value = TileInteractionState.IDLE + tileAnimationState.value = TileAnimationState.IDLE + } + + fun onDialogDrawingStart() { + tileAnimationState.value = TileAnimationState.DIALOG_LAUNCH + } + + fun onDialogDrawingEnd() { + tileAnimationState.value = TileAnimationState.IDLE + } + + fun onActivityLaunchTransitionStart() { + tileAnimationState.value = TileAnimationState.ACTIVITY_LAUNCH + } + + fun onActivityLaunchTransitionEnd() { + tileAnimationState.value = TileAnimationState.IDLE + } + + fun setTileInteractionState(actionState: TileInteractionState) { + tileInteractionState.value = actionState + } + + fun createStateAwareExpandable(baseExpandable: Expandable): Expandable = + baseExpandable.withStateAwareness( + onDialogDrawingStart = ::onDialogDrawingStart, + onDialogDrawingEnd = ::onDialogDrawingEnd, + onActivityLaunchTransitionStart = ::onActivityLaunchTransitionStart, + onActivityLaunchTransitionEnd = ::onActivityLaunchTransitionEnd, + ) + + /** Models the state of toggle haptics to play */ + enum class TileHapticsState { + TOGGLE_ON, + TOGGLE_OFF, + LONG_PRESS, + FAILED_LONGPRESS, + NO_HAPTICS, + } + + /** Models the interaction that took place on the tile */ + enum class TileInteractionState { + IDLE, + CLICKED, + LONG_CLICKED, + } + + /** Models the animation state of dialogs and activity launches from a tile */ + enum class TileAnimationState { + IDLE, + DIALOG_LAUNCH, + ACTIVITY_LAUNCH, + } + + @AssistedFactory + interface Factory { + fun create(tileViewModel: TileViewModel): TileHapticsViewModel + } +} + +class TileHapticsViewModelFactoryProvider +@Inject +constructor(private val tileHapticsViewModelFactory: TileHapticsViewModel.Factory) { + fun getHapticsViewModelFactory(): TileHapticsViewModel.Factory? = + if (Flags.msdlFeedback()) { + tileHapticsViewModelFactory + } else { + null + } +} 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 1c7a334d3ef2..99a6cda8cbf5 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 @@ -73,6 +73,7 @@ fun SceneScope.QuickQuickSettings( squishiness = { squishiness }, coroutineScope = scope, bounceableInfo = bounceables.bounceableInfo(it, spanIndex, column, columns), + tileHapticsViewModelFactoryProvider = viewModel.tileHapticsViewModelFactoryProvider, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt index 7b2593952599..da50fa330ba8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/CommonTile.kt @@ -59,6 +59,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import com.android.compose.modifiers.background import com.android.compose.modifiers.thenIf +import com.android.systemui.Flags import com.android.systemui.common.shared.model.Icon import com.android.systemui.common.ui.compose.Icon import com.android.systemui.common.ui.compose.load @@ -97,6 +98,7 @@ fun LargeTileContent( onClick = toggleClick!!, onLongClick = onLongClick, onLongClickLabel = longPressLabel, + hapticFeedbackEnabled = !Flags.msdlFeedback(), ) .thenIf(accessibilityUiState != null) { Modifier.semantics { diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt index 366bc9a7a29a..91f2da2b90f7 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/InfiniteGridLayout.kt @@ -28,6 +28,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.scene.SceneScope import com.android.systemui.dagger.SysUISingleton import com.android.systemui.grid.ui.compose.VerticalSpannedGrid +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModelFactoryProvider import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.qs.panels.shared.model.SizedTileImpl import com.android.systemui.qs.panels.ui.compose.PaginatableGridLayout @@ -49,6 +50,7 @@ class InfiniteGridLayout constructor( private val iconTilesViewModel: IconTilesViewModel, private val viewModelFactory: InfiniteGridViewModel.Factory, + private val tileHapticsViewModelFactoryProvider: TileHapticsViewModelFactoryProvider, ) : PaginatableGridLayout { @Composable @@ -92,6 +94,7 @@ constructor( iconOnly = iconTilesViewModel.isIconTile(it.tile.spec), modifier = Modifier.element(it.tile.spec.toElementKey(spanIndex)), squishiness = { squishiness }, + tileHapticsViewModelFactoryProvider = tileHapticsViewModelFactoryProvider, coroutineScope = scope, bounceableInfo = bounceables.bounceableInfo(it, spanIndex, column, columns), ) diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt index 5f28fe427707..7763d603ccb1 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt @@ -64,9 +64,13 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.android.compose.animation.Expandable import com.android.compose.animation.bounceable import com.android.compose.modifiers.thenIf +import com.android.systemui.Flags import com.android.systemui.animation.Expandable import com.android.systemui.common.shared.model.Icon import com.android.systemui.compose.modifiers.sysuiResTag +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModel +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModelFactoryProvider +import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.plugins.qs.QSTile import com.android.systemui.qs.panels.ui.compose.BounceableInfo import com.android.systemui.qs.panels.ui.compose.infinitegrid.CommonTileDefaults.InactiveCornerRadius @@ -109,6 +113,7 @@ fun Tile( squishiness: () -> Float, coroutineScope: CoroutineScope, bounceableInfo: BounceableInfo, + tileHapticsViewModelFactoryProvider: TileHapticsViewModelFactoryProvider, modifier: Modifier = Modifier, ) { val state by tile.state.collectAsStateWithLifecycle(tile.currentState) @@ -116,6 +121,10 @@ fun Tile( val resources = resources() val uiState = remember(state, resources) { state.toUiState(resources) } val colors = TileDefaults.getColorForState(uiState) + val hapticsViewModel: TileHapticsViewModel? = + rememberViewModel(traceName = "TileHapticsViewModel") { + tileHapticsViewModelFactoryProvider.getHapticsViewModelFactory()?.create(tile) + } // TODO(b/361789146): Draw the shapes instead of clipping val tileShape = TileDefaults.animateTileShape(uiState.state) @@ -129,6 +138,7 @@ fun Tile( }, shape = tileShape, squishiness = squishiness, + hapticsViewModel = hapticsViewModel, modifier = modifier .fillMaxWidth() @@ -143,11 +153,19 @@ fun Tile( TileContainer( onClick = { tile.onClick(expandable) + hapticsViewModel?.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.CLICKED + ) if (uiState.accessibilityUiState.toggleableState != null) { coroutineScope.launch { currentBounceableInfo.bounceable.animateBounce() } } }, - onLongClick = { tile.onLongClick(expandable) }, + onLongClick = { + hapticsViewModel?.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.LONG_CLICKED + ) + tile.onLongClick(expandable) + }, uiState = uiState, iconOnly = iconOnly, ) { @@ -161,9 +179,21 @@ fun Tile( } else { val iconShape = TileDefaults.animateIconShape(uiState.state) val secondaryClick: (() -> Unit)? = - { tile.onSecondaryClick() }.takeIf { uiState.handlesSecondaryClick } + { + hapticsViewModel?.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.CLICKED + ) + tile.onSecondaryClick() + } + .takeIf { uiState.handlesSecondaryClick } val longClick: (() -> Unit)? = - { tile.onLongClick(expandable) }.takeIf { uiState.handlesLongClick } + { + hapticsViewModel?.setTileInteractionState( + TileHapticsViewModel.TileInteractionState.LONG_CLICKED + ) + tile.onLongClick(expandable) + } + .takeIf { uiState.handlesLongClick } LargeTileContent( label = uiState.label, secondaryLabel = uiState.secondaryLabel, @@ -185,6 +215,7 @@ private fun TileExpandable( color: Color, shape: Shape, squishiness: () -> Float, + hapticsViewModel: TileHapticsViewModel?, modifier: Modifier = Modifier, content: @Composable (Expandable) -> Unit, ) { @@ -193,7 +224,7 @@ private fun TileExpandable( shape = shape, modifier = modifier.clip(shape).verticalSquish(squishiness), ) { - content(it) + content(hapticsViewModel?.createStateAwareExpandable(it) ?: it) } } @@ -254,6 +285,7 @@ fun Modifier.tileCombinedClickable( onLongClick = onLongClick, onClickLabel = uiState.accessibilityUiState.clickLabel, onLongClickLabel = longPressLabel, + hapticFeedbackEnabled = !Flags.msdlFeedback(), ) .semantics { role = uiState.accessibilityUiState.accessibilityRole diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt index 72b586a2f4df..887a70f39f6a 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModel.kt @@ -18,6 +18,7 @@ package com.android.systemui.qs.panels.ui.viewmodel import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModelFactoryProvider import com.android.systemui.qs.panels.domain.interactor.QuickQuickSettingsRowInteractor import com.android.systemui.qs.panels.shared.model.SizedTile import com.android.systemui.qs.panels.shared.model.SizedTileImpl @@ -45,6 +46,7 @@ constructor( val squishinessViewModel: TileSquishinessViewModel, private val iconTilesViewModel: IconTilesViewModel, @Application private val applicationScope: CoroutineScope, + val tileHapticsViewModelFactoryProvider: TileHapticsViewModelFactoryProvider, ) { val columns = qsColumnsViewModel.columns diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/TileHapticsViewModelFactoryKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/TileHapticsViewModelFactoryKosmos.kt new file mode 100644 index 000000000000..a798eb746943 --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/haptics/msdl/TileHapticsViewModelFactoryKosmos.kt @@ -0,0 +1,33 @@ +/* + * 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.haptics.msdl + +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModel +import com.android.systemui.haptics.msdl.qs.TileHapticsViewModelFactoryProvider +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.panels.ui.viewmodel.TileViewModel + +val Kosmos.tileHapticsViewModelFactory by + Kosmos.Fixture { + object : TileHapticsViewModel.Factory { + override fun create(tileViewModel: TileViewModel): TileHapticsViewModel = + TileHapticsViewModel(fakeMSDLPlayer, tileViewModel) + } + } + +val Kosmos.tileHapticsViewModelFactoryProvider by + Kosmos.Fixture { TileHapticsViewModelFactoryProvider(tileHapticsViewModelFactory) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeQSTile.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeQSTile.kt index 093ebd6c6b63..562980d43485 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeQSTile.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/FakeQSTile.kt @@ -20,13 +20,10 @@ import com.android.internal.logging.InstanceId import com.android.systemui.animation.Expandable import com.android.systemui.plugins.qs.QSTile -class FakeQSTile( - var user: Int, - var available: Boolean = true, -) : QSTile { +class FakeQSTile(var user: Int, var available: Boolean = true) : QSTile { private var tileSpec: String? = null var destroyed = false - private val state = QSTile.State() + private var state = QSTile.State() val callbacks = mutableListOf() override fun getTileSpec(): String? { @@ -93,4 +90,9 @@ class FakeQSTile( override fun isListening(): Boolean { return false } + + fun changeState(newState: QSTile.State) { + state = newState + callbacks.forEach { it.onStateChanged(state) } + } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt index b6b0a4168c5d..b5a6bf126719 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/domain/interactor/InfiniteGridLayoutKosmos.kt @@ -16,10 +16,17 @@ package com.android.systemui.qs.panels.domain.interactor +import com.android.systemui.haptics.msdl.tileHapticsViewModelFactoryProvider import com.android.systemui.kosmos.Kosmos import com.android.systemui.qs.panels.ui.compose.infinitegrid.InfiniteGridLayout import com.android.systemui.qs.panels.ui.viewmodel.iconTilesViewModel import com.android.systemui.qs.panels.ui.viewmodel.infiniteGridViewModelFactory val Kosmos.infiniteGridLayout by - Kosmos.Fixture { InfiniteGridLayout(iconTilesViewModel, infiniteGridViewModelFactory) } + Kosmos.Fixture { + InfiniteGridLayout( + iconTilesViewModel, + infiniteGridViewModelFactory, + tileHapticsViewModelFactoryProvider, + ) + } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt index 67d9e0ed552b..41ee260fd5dd 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/QuickQuickSettingsViewModelKosmos.kt @@ -16,6 +16,7 @@ package com.android.systemui.qs.panels.ui.viewmodel +import com.android.systemui.haptics.msdl.tileHapticsViewModelFactoryProvider import com.android.systemui.kosmos.Kosmos import com.android.systemui.kosmos.applicationCoroutineScope import com.android.systemui.qs.panels.domain.interactor.quickQuickSettingsRowInteractor @@ -30,5 +31,6 @@ val Kosmos.quickQuickSettingsViewModel by tileSquishinessViewModel, iconTilesViewModel, applicationCoroutineScope, + tileHapticsViewModelFactoryProvider, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModelKosmos.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModelKosmos.kt new file mode 100644 index 000000000000..223755d7636d --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/qs/panels/ui/viewmodel/TileViewModelKosmos.kt @@ -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. + */ + +package com.android.systemui.qs.panels.ui.viewmodel + +import com.android.systemui.kosmos.Kosmos +import com.android.systemui.qs.FakeQSTile +import com.android.systemui.qs.pipeline.shared.TileSpec + +val Kosmos.fakeQsTile by Kosmos.Fixture { FakeQSTile(user = 0, available = true) } +val Kosmos.tileViewModel by + Kosmos.Fixture { TileViewModel(fakeQsTile, TileSpec.Companion.create("test")) } -- GitLab From 2470bdb6f3cae698753c61fcc572d651fb5d0d27 Mon Sep 17 00:00:00 2001 From: Alexander Roederer Date: Tue, 22 Oct 2024 00:05:59 +0000 Subject: [PATCH 331/459] Create new NotificationClassificationUiFlag class Creates a new NotificationClassificationUiFlag.kt class based on android.app.notification_classification_ui; will be used to flag-guard new SystemUI code to show notification bundles in the shade. Bug: 367996732 Flag: android.app.notification_classification_ui Test: EXEMPT adding new flag Change-Id: I545d4e8100b63165cc1a2c0134a5402970b3372b --- .../NotificationClassificationUiFlag.kt | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationClassificationUiFlag.kt diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationClassificationUiFlag.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationClassificationUiFlag.kt new file mode 100644 index 000000000000..9020b7628d31 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/NotificationClassificationUiFlag.kt @@ -0,0 +1,51 @@ +/* + * 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.statusbar.notification.collection + +import android.app.Flags +import com.android.systemui.flags.FlagToken +import com.android.systemui.flags.RefactorFlagUtils + +/** Helper for android.service.notification.Flags.FLAG_NOTIFICATION_CLASSIFICATION */ +@Suppress("NOTHING_TO_INLINE") +object NotificationClassificationUiFlag { + const val FLAG_NAME = Flags.FLAG_NOTIFICATION_CLASSIFICATION_UI + + /** A token used for dependency declaration */ + val token: FlagToken + get() = FlagToken(FLAG_NAME, isEnabled) + + /** Are sections sorted by time? */ + @JvmStatic + inline val isEnabled + get() = Flags.notificationClassificationUi() + + /** + * Called to ensure code is only run when the flag is enabled. This protects users from the + * unintended behaviors caused by accidentally running new logic, while also crashing on an eng + * build to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun isUnexpectedlyInLegacyMode() = + RefactorFlagUtils.isUnexpectedlyInLegacyMode(isEnabled, FLAG_NAME) + + /** + * Called to ensure code is only run when the flag is disabled. This will throw an exception if + * the flag is enabled to ensure that the refactor author catches issues in testing. + */ + @JvmStatic + inline fun assertInLegacyMode() = RefactorFlagUtils.assertInLegacyMode(isEnabled, FLAG_NAME) +} -- GitLab From 2aabf4967a4f31a8c47d667f2fabe3d0c243d307 Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Tue, 22 Oct 2024 13:11:52 -0700 Subject: [PATCH 332/459] Use Assisted Injection for EdgeBackGestureHandler Test: atest SystemUITests Bug: 304583132 Flag: EXEMPT changing from @Inject to @AssistedInject Change-Id: Ic21e4cec8817b196f495ce97dc864b940807f2e5 --- .../navigationbar/NavigationBarModule.java | 9 -- .../gestural/BackPanelController.kt | 50 ++----- .../gestural/EdgeBackGestureHandler.java | 132 +++--------------- 3 files changed, 32 insertions(+), 159 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java index a8b979e05276..914e0f74e4a0 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarModule.java @@ -28,7 +28,6 @@ import com.android.app.viewcapture.ViewCapture; import com.android.app.viewcapture.ViewCaptureAwareWindowManager; import com.android.systemui.dagger.qualifiers.DisplayId; import com.android.systemui.navigationbar.NavigationBarComponent.NavigationBarScope; -import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; import com.android.systemui.navigationbar.views.NavigationBarFrame; import com.android.systemui.navigationbar.views.NavigationBarView; import com.android.systemui.res.R; @@ -64,14 +63,6 @@ public interface NavigationBarModule { return barView.findViewById(R.id.navigation_bar_view); } - /** */ - @Provides - @NavigationBarScope - static EdgeBackGestureHandler provideEdgeBackGestureHandler( - EdgeBackGestureHandler.Factory factory, @DisplayId Context context) { - return factory.create(context); - } - /** A WindowManager specific to the display's context. */ @Provides @NavigationBarScope diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt index 7e07e4d5097f..44c828731e24 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/BackPanelController.kt @@ -41,11 +41,11 @@ import com.android.systemui.plugins.NavigationEdgeBackPlugin import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.ConfigurationController import com.android.systemui.util.ViewController -import com.android.systemui.util.concurrency.BackPanelUiThread -import com.android.systemui.util.concurrency.UiThreadContext import com.android.systemui.util.time.SystemClock +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject import java.io.PrintWriter -import javax.inject.Inject import kotlin.math.abs import kotlin.math.max import kotlin.math.min @@ -82,11 +82,12 @@ private const val POP_ON_INACTIVE_VELOCITY = -1.5f private const val DEBUG = false class BackPanelController -internal constructor( - context: Context, +@AssistedInject +constructor( + @Assisted context: Context, private val windowManager: ViewCaptureAwareWindowManager, private val viewConfiguration: ViewConfiguration, - private val mainHandler: Handler, + @Assisted private val mainHandler: Handler, private val systemClock: SystemClock, private val vibratorHelper: VibratorHelper, private val configurationController: ConfigurationController, @@ -94,40 +95,9 @@ internal constructor( private val interactionJankMonitor: InteractionJankMonitor, ) : ViewController(BackPanel(context, latencyTracker)), NavigationEdgeBackPlugin { - /** - * Injectable instance to create a new BackPanelController. - * - * Necessary because EdgeBackGestureHandler sometimes needs to create new instances of - * BackPanelController, and we need to match EdgeBackGestureHandler's context. - */ - class Factory - @Inject - constructor( - private val windowManager: ViewCaptureAwareWindowManager, - private val viewConfiguration: ViewConfiguration, - @BackPanelUiThread private val uiThreadContext: UiThreadContext, - private val systemClock: SystemClock, - private val vibratorHelper: VibratorHelper, - private val configurationController: ConfigurationController, - private val latencyTracker: LatencyTracker, - private val interactionJankMonitor: InteractionJankMonitor, - ) { - /** Construct a [BackPanelController]. */ - fun create(context: Context): BackPanelController { - uiThreadContext.isCurrentThread() - return BackPanelController( - context, - windowManager, - viewConfiguration, - uiThreadContext.handler, - systemClock, - vibratorHelper, - configurationController, - latencyTracker, - interactionJankMonitor, - ) - .also { it.init() } - } + @AssistedFactory + interface Factory { + fun create(context: Context, handler: Handler): BackPanelController } @VisibleForTesting internal var params: EdgePanelParams = EdgePanelParams(resources) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java index b3463bdc2949..53177de89733 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/EdgeBackGestureHandler.java @@ -103,6 +103,10 @@ import com.android.wm.shell.back.BackAnimation; import com.android.wm.shell.desktopmode.DesktopMode; import com.android.wm.shell.pip.Pip; +import dagger.assisted.Assisted; +import dagger.assisted.AssistedFactory; +import dagger.assisted.AssistedInject; + import kotlinx.coroutines.Job; import java.io.PrintWriter; @@ -117,7 +121,6 @@ import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; -import javax.inject.Inject; import javax.inject.Provider; /** @@ -414,8 +417,21 @@ public class EdgeBackGestureHandler implements PluginListener mPipOptional; - private final Optional mDesktopModeOptional; - private final FalsingManager mFalsingManager; - private final Provider - mBackGestureTfClassifierProviderProvider; - private final Provider mLightBarControllerProvider; - private final NotificationShadeWindowController mNotificationShadeWindowController; - - private final GestureInteractor mGestureInteractor; - - private final JavaAdapter mJavaAdapter; - - @Inject - public Factory(OverviewProxyService overviewProxyService, - SysUiState sysUiState, - PluginManager pluginManager, - @BackPanelUiThread UiThreadContext uiThreadContext, - @Background Executor backgroundExecutor, - @Background Handler bgHandler, - UserTracker userTracker, - NavigationModeController navigationModeController, - BackPanelController.Factory backPanelControllerFactory, - ViewConfiguration viewConfiguration, - WindowManager windowManager, - IWindowManager windowManagerService, - InputManager inputManager, - Optional pipOptional, - Optional desktopModeOptional, - FalsingManager falsingManager, - Provider - backGestureTfClassifierProviderProvider, - Provider lightBarControllerProvider, - NotificationShadeWindowController notificationShadeWindowController, - GestureInteractor gestureInteractor, - JavaAdapter javaAdapter) { - mOverviewProxyService = overviewProxyService; - mSysUiState = sysUiState; - mPluginManager = pluginManager; - mUiThreadContext = uiThreadContext; - mBackgroundExecutor = backgroundExecutor; - mBgHandler = bgHandler; - mUserTracker = userTracker; - mNavigationModeController = navigationModeController; - mBackPanelControllerFactory = backPanelControllerFactory; - mViewConfiguration = viewConfiguration; - mWindowManager = windowManager; - mWindowManagerService = windowManagerService; - mInputManager = inputManager; - mPipOptional = pipOptional; - mDesktopModeOptional = desktopModeOptional; - mFalsingManager = falsingManager; - mBackGestureTfClassifierProviderProvider = backGestureTfClassifierProviderProvider; - mLightBarControllerProvider = lightBarControllerProvider; - mNotificationShadeWindowController = notificationShadeWindowController; - mGestureInteractor = gestureInteractor; - mJavaAdapter = javaAdapter; - } - - /** Construct a {@link EdgeBackGestureHandler}. */ - public EdgeBackGestureHandler create(Context context) { - return mUiThreadContext.runWithScissors( - () -> new EdgeBackGestureHandler( - context, - mOverviewProxyService, - mSysUiState, - mPluginManager, - mUiThreadContext, - mBackgroundExecutor, - mBgHandler, - mUserTracker, - mNavigationModeController, - mBackPanelControllerFactory, - mViewConfiguration, - mWindowManager, - mWindowManagerService, - mInputManager, - mPipOptional, - mDesktopModeOptional, - mFalsingManager, - mBackGestureTfClassifierProviderProvider, - mLightBarControllerProvider, - mNotificationShadeWindowController, - mGestureInteractor, - mJavaAdapter)); - } - } - private static class LogArray extends ArrayDeque { private final int mLength; -- GitLab From 45e499a3f587cc146e21a1c81bd404e4cd41e59d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A5kan=20Kvist?= Date: Mon, 22 Apr 2024 12:43:10 +0200 Subject: [PATCH 333/459] Improve robustness when migrating from appops xml A device failing to create a complete appops.xml with all the attributes needed will cause appops migration to fail when upgrading. AppOpsService is reading its files as part of ActivityManagerService start, which happens before rescue party is started. Upon failure Rescue party is not started, there is no attempt to reboot and the user is stuck with a device trying to boot. A user experiencing this will think the device is bricked. This change will log the actual error, treat the appops xml as not existing instead of throwing an exception. Bug: 323262109 Test: adb root adb shell stop adb shell rm /data/misc/apexdata/com.android.permission/access.abx \ /data/misc_de/0/apexdata/com.android.permission/access.abx adb shell dd if=/dev/urandom of=/data/system/appops_accesses.xml \ bs=4096 count=2 adb shell dd if=/dev/urandom of=/data/system/appops.xml bs=4096 \ count=2 adb shell start Change-Id: Ic24259662e1c7f0cfe23c72bd1c390f9aff80bec --- .../android/server/appop/AppOpsService.java | 12 +------ .../server/appop/LegacyAppOpStateParser.java | 31 ++++++++++++++----- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index d67d3ca620b6..7600855c0f58 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -4973,17 +4973,7 @@ public class AppOpsService extends IAppOpsService.Stub { } success = true; - } catch (IllegalStateException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (NullPointerException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (NumberFormatException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (XmlPullParserException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (IOException e) { - Slog.w(TAG, "Failed parsing " + e); - } catch (IndexOutOfBoundsException e) { + } catch (Exception e) { Slog.w(TAG, "Failed parsing " + e); } finally { if (!success) { diff --git a/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java b/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java index 9ed3a99013ea..b677a1dfc84b 100644 --- a/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java +++ b/services/core/java/com/android/server/appop/LegacyAppOpStateParser.java @@ -50,6 +50,10 @@ class LegacyAppOpStateParser { public int readState(AtomicFile file, SparseArray uidModes, SparseArray> userPackageModes) { try (FileInputStream stream = file.openRead()) { + SparseArray parsedUidModes = new SparseArray<>(); + SparseArray> parsedUserPackageModes = + new SparseArray<>(); + TypedXmlPullParser parser = Xml.resolvePullParser(stream); int type; while ((type = parser.next()) != XmlPullParser.START_TAG @@ -75,26 +79,37 @@ class LegacyAppOpStateParser { // version 2 has the structure pkg -> uid -> op -> // in version 3, since pkg and uid states are kept completely // independent we switch to user -> pkg -> op - readPackage(parser, userPackageModes); + readPackage(parser, parsedUserPackageModes); } else if (tagName.equals("uid")) { - readUidOps(parser, uidModes); + readUidOps(parser, parsedUidModes); } else if (tagName.equals("user")) { - readUser(parser, userPackageModes); + readUser(parser, parsedUserPackageModes); } else { Slog.w(TAG, "Unknown element under : " + parser.getName()); XmlUtils.skipCurrentTag(parser); } } + + // Parsing is complete, copy all parsed values to output + final int parsedUidModesSize = parsedUidModes.size(); + for (int i = 0; i < parsedUidModesSize; i++) { + uidModes.put(parsedUidModes.keyAt(i), parsedUidModes.valueAt(i)); + } + final int parsedUserPackageModesSize = parsedUserPackageModes.size(); + for (int i = 0; i < parsedUserPackageModesSize; i++) { + userPackageModes.put(parsedUserPackageModes.keyAt(i), + parsedUserPackageModes.valueAt(i)); + } + return versionAtBoot; } catch (FileNotFoundException e) { Slog.i(TAG, "No existing app ops " + file.getBaseFile() + "; starting empty"); - return NO_FILE_VERSION; - } catch (XmlPullParserException e) { - throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); + } catch (Exception e) { + // All exceptions must be caught, otherwise device will not be able to boot + Slog.wtf(TAG, "Failed parsing " + e); } + return NO_FILE_VERSION; } private void readPackage(TypedXmlPullParser parser, -- GitLab From 45974dd3f4dad4314d40a8f148bcfaa2ae1bff48 Mon Sep 17 00:00:00 2001 From: Jiaming Liu Date: Wed, 23 Oct 2024 19:58:01 +0000 Subject: [PATCH 334/459] Fix placeholder launch with AvoidMoveToFront flag Placeholder could be dismissed and immediately relaunched if an activity matches a split rule with clear-top flag but ends up launched in a new task. In this case, the current task would be incorrectly placed on top of the new task. Always setting the AvoidMoveToFront flag can prevent this issue, and no animation issue is found in contrast to the previous comment. Bug: 374213115 Test: atest WMJetpackUnitTests:SplitControllerTest Flag: EXEMPT bugfix Change-Id: Ib34b30ff06903a26410eea8521ef51bc17156f0d --- .../extensions/embedding/SplitController.java | 3 -- .../embedding/SplitControllerTest.java | 42 +++++++++++-------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java index 3368e2eab3ad..f04ac8b514fa 100644 --- a/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java +++ b/libs/WindowManager/Jetpack/src/androidx/window/extensions/embedding/SplitController.java @@ -2314,15 +2314,12 @@ public class SplitController implements JetpackTaskFragmentOrganizer.TaskFragmen @GuardedBy("mLock") @Nullable Bundle getPlaceholderOptions(@NonNull Activity primaryActivity, boolean isOnCreated) { - // Setting avoid move to front will also skip the animation. We only want to do that when - // the Task is currently in background. // Check if the primary is resumed or if this is called when the primary is onCreated // (not resumed yet). if (isOnCreated || primaryActivity.isResumed()) { // Only set trigger type if the launch happens in foreground. mTransactionManager.getCurrentTransactionRecord() .setOriginType(TASK_FRAGMENT_TRANSIT_OPEN); - return null; } final ActivityOptions options = ActivityOptions.makeBasic(); options.setAvoidMoveToFront(); diff --git a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java index 05124121fe7b..b8a36eb4d3f5 100644 --- a/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java +++ b/libs/WindowManager/Jetpack/tests/unittest/src/androidx/window/extensions/embedding/SplitControllerTest.java @@ -166,6 +166,8 @@ public class SplitControllerTest { private List mSplitInfos; private TransactionManager mTransactionManager; private ActivityThread mCurrentActivityThread; + private final ArgumentCaptor mBundleArgumentCaptor = + ArgumentCaptor.forClass(Bundle.class); @Before public void setUp() { @@ -685,9 +687,13 @@ public class SplitControllerTest { false /* isOnReparent */); assertTrue(result); - verify(mSplitPresenter).startActivityToSide(mTransaction, mActivity, PLACEHOLDER_INTENT, - mSplitController.getPlaceholderOptions(mActivity, true /* isOnCreated */), - placeholderRule, SPLIT_ATTRIBUTES, true /* isPlaceholder */); + verify(mSplitPresenter).startActivityToSide(eq(mTransaction), eq(mActivity), + eq(PLACEHOLDER_INTENT), mBundleArgumentCaptor.capture(), + eq(placeholderRule), eq(SPLIT_ATTRIBUTES), eq(true) /* isPlaceholder */); + + final ActivityOptions activityOptions = + new ActivityOptions(mBundleArgumentCaptor.getValue()); + assertTrue(activityOptions.getAvoidMoveToFront()); } @Test @@ -720,9 +726,13 @@ public class SplitControllerTest { false /* isOnReparent */); assertTrue(result); - verify(mSplitPresenter).startActivityToSide(mTransaction, mActivity, PLACEHOLDER_INTENT, - mSplitController.getPlaceholderOptions(mActivity, true /* isOnCreated */), - placeholderRule, SPLIT_ATTRIBUTES, true /* isPlaceholder */); + verify(mSplitPresenter).startActivityToSide(eq(mTransaction), eq(mActivity), + eq(PLACEHOLDER_INTENT), mBundleArgumentCaptor.capture(), + eq(placeholderRule), eq(SPLIT_ATTRIBUTES), eq(true) /* isPlaceholder */); + + final ActivityOptions activityOptions = + new ActivityOptions(mBundleArgumentCaptor.getValue()); + assertTrue(activityOptions.getAvoidMoveToFront()); } @Test @@ -755,9 +765,13 @@ public class SplitControllerTest { false /* isOnReparent */); assertTrue(result); - verify(mSplitPresenter).startActivityToSide(mTransaction, mActivity, PLACEHOLDER_INTENT, - mSplitController.getPlaceholderOptions(mActivity, true /* isOnCreated */), - placeholderRule, SPLIT_ATTRIBUTES, true /* isPlaceholder */); + verify(mSplitPresenter).startActivityToSide(eq(mTransaction), eq(mActivity), + eq(PLACEHOLDER_INTENT), mBundleArgumentCaptor.capture(), + eq(placeholderRule), eq(SPLIT_ATTRIBUTES), eq(true) /* isPlaceholder */); + + final ActivityOptions activityOptions = + new ActivityOptions(mBundleArgumentCaptor.getValue()); + assertTrue(activityOptions.getAvoidMoveToFront()); } @Test @@ -1065,16 +1079,8 @@ public class SplitControllerTest { public void testGetPlaceholderOptions() { // Setup to make sure a transaction record is started. mTransactionManager.startNewTransaction(); - doReturn(true).when(mActivity).isResumed(); - - assertNull(mSplitController.getPlaceholderOptions(mActivity, false /* isOnCreated */)); - - doReturn(false).when(mActivity).isResumed(); - - assertNull(mSplitController.getPlaceholderOptions(mActivity, true /* isOnCreated */)); - // Launch placeholder without moving the Task to front if the Task is now in background (not - // resumed or onCreated). + // Launch placeholder without moving the Task to front final Bundle options = mSplitController.getPlaceholderOptions(mActivity, false /* isOnCreated */); -- GitLab From ff1ea8f8f6f89c9ee577bf311c4feb3a16bcb2e0 Mon Sep 17 00:00:00 2001 From: Lucas Silva Date: Wed, 23 Oct 2024 16:00:46 -0400 Subject: [PATCH 335/459] Update drag-drop collision detection Items will now swap places if either element intersects with the center of the other. Bug: 374212953 Test: manually by dragging widgets of different sizes Flag: com.android.systemui.communal_widget_resizing Change-Id: I06545b555e511bc81ef9281dc5adf9f87dad3f3f --- .../android/systemui/communal/ui/compose/GridDragDropState.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt index 5feb63df0bca..1551ca97a2e3 100644 --- a/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt +++ b/packages/SystemUI/compose/features/src/com/android/systemui/communal/ui/compose/GridDragDropState.kt @@ -182,7 +182,8 @@ internal constructor( val itemBoundingBox = IntRect(item.offset, item.size) draggingItemKey != item.key && contentListState.isItemEditable(item.index) && - draggingBoundingBox.contains(itemBoundingBox.center) + (draggingBoundingBox.contains(itemBoundingBox.center) || + itemBoundingBox.contains(draggingBoundingBox.center)) } } else { state.layoutInfo.visibleItemsInfo -- GitLab From f2fd2eb5d0c05e972b260448d82eb7480316b1a8 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 18 Oct 2024 15:00:14 +0000 Subject: [PATCH 336/459] Tweak to isOnLockscreen With numerous notifs on the lockscreen and UDFPS set up, tap a notification to show ALTERNATE_BOUNCER. During the end of this transition, the bounds may flicker. This occurs as there is a tiny gap between conditions in isOnLockscreen flow. Use transitionValue() instead for all checks. Fixes: 372210467 Test: atest SharedNotificationContainerViewModelTest Flag: EXEMPT bugfix Change-Id: Ieaa8d1d6ca380fbd0fdb6552b087215208953974 --- ...haredNotificationContainerViewModelTest.kt | 39 +++++++++++++++++++ .../SharedNotificationContainerViewModel.kt | 16 ++++---- 2 files changed, 48 insertions(+), 7 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt index 25670cb0bb0c..de5dd8f14bf1 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt @@ -635,6 +635,45 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(bounds).isEqualTo(NotificationContainerBounds(top = 1f, bottom = 2f)) } + @Test + @DisableSceneContainer + fun boundsStableWhenGoingToAlternateBouncer() = + testScope.runTest { + val bounds by collectLastValue(underTest.bounds) + + // Start on lockscreen + showLockscreen() + + keyguardInteractor.setNotificationContainerBounds( + NotificationContainerBounds(top = 1f, bottom = 2f) + ) + + assertThat(bounds).isEqualTo(NotificationContainerBounds(top = 1f, bottom = 2f)) + + // Begin transition to AOD + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(LOCKSCREEN, ALTERNATE_BOUNCER, 0f, TransitionState.STARTED) + ) + runCurrent() + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(LOCKSCREEN, ALTERNATE_BOUNCER, 0f, TransitionState.RUNNING) + ) + runCurrent() + + // This is the last step before FINISHED is sent, which could trigger a change in bounds + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(LOCKSCREEN, ALTERNATE_BOUNCER, 1f, TransitionState.RUNNING) + ) + runCurrent() + assertThat(bounds).isEqualTo(NotificationContainerBounds(top = 1f, bottom = 2f)) + + keyguardTransitionRepository.sendTransitionStep( + TransitionStep(LOCKSCREEN, ALTERNATE_BOUNCER, 1f, TransitionState.FINISHED) + ) + runCurrent() + assertThat(bounds).isEqualTo(NotificationContainerBounds(top = 1f, bottom = 2f)) + } + @Test @DisableSceneContainer fun boundsDoNotChangeWhileLockscreenToAodTransitionIsActive() = 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 9515029962ea..5d4b6827f468 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 @@ -221,13 +221,15 @@ constructor( /** If the user is visually on one of the unoccluded lockscreen states. */ val isOnLockscreen: Flow = anyOf( - keyguardTransitionInteractor.isFinishedIn(AOD), - keyguardTransitionInteractor.isFinishedIn(DOZING), - keyguardTransitionInteractor.isFinishedIn(ALTERNATE_BOUNCER), - keyguardTransitionInteractor.isFinishedIn( - scene = Scenes.Bouncer, - stateWithoutSceneContainer = PRIMARY_BOUNCER, - ), + keyguardTransitionInteractor.transitionValue(AOD).map { it > 0f }, + keyguardTransitionInteractor.transitionValue(DOZING).map { it > 0f }, + keyguardTransitionInteractor.transitionValue(ALTERNATE_BOUNCER).map { it > 0f }, + keyguardTransitionInteractor + .transitionValue( + scene = Scenes.Bouncer, + stateWithoutSceneContainer = PRIMARY_BOUNCER, + ) + .map { it > 0f }, keyguardTransitionInteractor.transitionValue(LOCKSCREEN).map { it > 0f }, ) .flowName("isOnLockscreen") -- GitLab From 3d52d212c8a3c651c46aa3291497c323f7a9e201 Mon Sep 17 00:00:00 2001 From: Chris Antol Date: Wed, 23 Oct 2024 20:19:08 +0000 Subject: [PATCH 337/459] Add OWNERS file for android.service.settings This adds Android Settings team members as owners for the settings services directory Bug: 375075504 Change-Id: I9e2f53e86445e1c8c33aae6dfed3a4ee51511127 Flag: EXEMPT Test: N/A --- core/java/android/service/settings/OWNERS | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 core/java/android/service/settings/OWNERS diff --git a/core/java/android/service/settings/OWNERS b/core/java/android/service/settings/OWNERS new file mode 100644 index 000000000000..c70c7380ec0e --- /dev/null +++ b/core/java/android/service/settings/OWNERS @@ -0,0 +1,7 @@ +# Bug component: 27091 + +cantol@google.com +cechkahn@google.com +cipson@google.com +dswliu@google.com +jiannan@google.com -- GitLab From 8cc98babd8a6fab1fc38a81ea237bf3a68d1f670 Mon Sep 17 00:00:00 2001 From: Stefan Andonian Date: Wed, 23 Oct 2024 11:16:01 -0700 Subject: [PATCH 338/459] [Record Issue QS Tile] Remove Share Button Click when generating a bug report. Bug: 375133946 Test: Verified locally that this works as intended. Flag: EXEMPT bug fix Change-Id: If9ee386f06be66bd4a012fd1e93973411f1a49b2 --- .../recordissue/IssueRecordingService.kt | 14 ++++++++++++++ .../systemui/screenrecord/RecordingService.java | 16 ++++++++++------ 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt index 32d9ba822382..1eac0e1a75fa 100644 --- a/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt +++ b/packages/SystemUI/src/com/android/systemui/recordissue/IssueRecordingService.kt @@ -24,6 +24,7 @@ import android.content.res.Resources import android.net.Uri import android.os.Handler import android.os.IBinder +import android.os.UserHandle import android.util.Log import com.android.internal.logging.UiEventLogger import com.android.systemui.animation.DialogTransitionAnimator @@ -34,6 +35,7 @@ import com.android.systemui.res.R import com.android.systemui.screenrecord.RecordingController import com.android.systemui.screenrecord.RecordingService import com.android.systemui.screenrecord.RecordingServiceStrings +import com.android.systemui.screenrecord.ScreenMediaRecorder.SavedRecording import com.android.systemui.settings.UserContextProvider import com.android.systemui.statusbar.phone.KeyguardDismissUtil import com.android.traceur.MessageConstants.INTENT_EXTRA_TRACE_TYPE @@ -144,6 +146,18 @@ constructor( return super.onStartCommand(intent, flags, startId) } + /** + * If the user chooses to create a bugreport, we do not want to make them click share twice. To + * avoid that, the code immediately triggers the bugreport flow which will handle the rest. + */ + override fun onRecordingSaved(recording: SavedRecording?, currentUser: UserHandle) { + if (session.takeBugReport) { + session.share(mNotificationId, recording?.uri) + } else { + super.onRecordingSaved(recording, currentUser) + } + } + companion object { private const val TAG = "IssueRecordingService" private const val CHANNEL_ID = "issue_record" diff --git a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java index 5028c2ea8f0a..6cc9ae4fb674 100644 --- a/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +++ b/packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java @@ -45,6 +45,7 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.mediaprojection.MediaProjectionCaptureTarget; import com.android.systemui.recordissue.ScreenRecordingStartTimeStore; import com.android.systemui.res.R; +import com.android.systemui.screenrecord.ScreenMediaRecorder.SavedRecording; import com.android.systemui.screenrecord.ScreenMediaRecorder.ScreenMediaRecorderListener; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.phone.KeyguardDismissUtil; @@ -384,8 +385,7 @@ public class RecordingService extends Service implements ScreenMediaRecorderList } @VisibleForTesting - protected Notification createSaveNotification( - @Nullable ScreenMediaRecorder.SavedRecording recording) { + protected Notification createSaveNotification(@Nullable SavedRecording recording) { Uri uri = recording != null ? recording.getUri() : null; Intent viewIntent = new Intent(Intent.ACTION_VIEW) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_GRANT_READ_URI_PERMISSION) @@ -506,15 +506,13 @@ public class RecordingService extends Service implements ScreenMediaRecorderList mLongExecutor.execute(() -> { try { Log.d(getTag(), "saving recording"); - Notification notification = createSaveNotification( - getRecorder() != null ? getRecorder().save() : null); + SavedRecording savedRecording = getRecorder() != null ? getRecorder().save() : null; postGroupSummaryNotification( currentUser, strings().getSaveTitle(), GROUP_KEY_SAVED, NOTIF_GROUP_ID_SAVED); - mNotificationManager.notifyAsUser(null, mNotificationId, notification, - currentUser); + onRecordingSaved(savedRecording, currentUser); } catch (IOException | IllegalStateException e) { Log.e(getTag(), "Error saving screen recording: " + e.getMessage()); e.printStackTrace(); @@ -524,6 +522,12 @@ public class RecordingService extends Service implements ScreenMediaRecorderList }); } + protected void onRecordingSaved(ScreenMediaRecorder.SavedRecording savedRecording, + UserHandle currentUser) { + mNotificationManager.notifyAsUser(null, mNotificationId, + createSaveNotification(savedRecording), currentUser); + } + private void setTapsVisible(boolean turnOn) { int value = turnOn ? 1 : 0; Settings.System.putInt(getContentResolver(), Settings.System.SHOW_TOUCHES, value); -- GitLab From b4a843b4a79c70d93952b2e391a837214fc320af Mon Sep 17 00:00:00 2001 From: Vaibhav Devmurari Date: Mon, 21 Oct 2024 17:31:09 +0000 Subject: [PATCH 339/459] Pipe current user to InputManagerService IMS currently doesn't support SystemService lifecycle and doesn't have callbacks for current user changes. For per user shortcut handling we need to know what the current user is. So, pass current user info from WM to IMS temporarily. Bug: 362473586 Test: manual Flag: EXEMPT bugfix Change-Id: I48e6c5ff62909ede06c7d863eea582e590e08011 --- .../server/input/InputManagerInternal.java | 7 +++++++ .../android/server/input/InputManagerService.java | 15 +++++++++++++++ .../android/server/policy/PhoneWindowManager.java | 1 + 3 files changed, 23 insertions(+) diff --git a/services/core/java/com/android/server/input/InputManagerInternal.java b/services/core/java/com/android/server/input/InputManagerInternal.java index e40d855293cd..1c5bd59fa386 100644 --- a/services/core/java/com/android/server/input/InputManagerInternal.java +++ b/services/core/java/com/android/server/input/InputManagerInternal.java @@ -127,6 +127,13 @@ public abstract class InputManagerInternal { */ public abstract void notifyInputMethodConnectionActive(boolean connectionIsActive); + /** + * Notify user id changes to input. + * + * TODO(b/362473586): Cleanup after input shifts to Lifecycle with user change callbacks + */ + public abstract void setCurrentUser(@UserIdInt int newUserId); + /** Callback interface for notifications relating to the lid switch. */ public interface LidSwitchCallback { /** diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index bea520f9429e..a421d044507a 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -175,6 +175,7 @@ public class InputManagerService extends IInputManager.Stub private static final int MSG_DELIVER_INPUT_DEVICES_CHANGED = 1; private static final int MSG_RELOAD_DEVICE_ALIASES = 2; private static final int MSG_DELIVER_TABLET_MODE_CHANGED = 3; + private static final int MSG_CURRENT_USER_CHANGED = 4; private static final int DEFAULT_VIBRATION_MAGNITUDE = 192; private static final AdditionalDisplayInputProperties @@ -184,6 +185,8 @@ public class InputManagerService extends IInputManager.Stub private final Context mContext; private final InputManagerHandler mHandler; + @UserIdInt + private int mCurrentUserId = UserHandle.USER_SYSTEM; private DisplayManagerInternal mDisplayManagerInternal; private WindowManagerInternal mWindowManagerInternal; @@ -2982,6 +2985,10 @@ public class InputManagerService extends IInputManager.Stub mKeyGestureController.unregisterKeyGestureHandler(handler, Binder.getCallingPid()); } + private void handleCurrentUserChanged(@UserIdInt int userId) { + mCurrentUserId = userId; + } + /** * Callback interface implemented by the Window Manager. */ @@ -3150,6 +3157,9 @@ public class InputManagerService extends IInputManager.Stub boolean inTabletMode = (boolean) args.arg1; deliverTabletModeChanged(whenNanos, inTabletMode); break; + case MSG_CURRENT_USER_CHANGED: + handleCurrentUserChanged((int) msg.obj); + break; } } } @@ -3512,6 +3522,11 @@ public class InputManagerService extends IInputManager.Stub InputManagerService.this.setAccessibilityPointerIconScaleFactor(displayId, scaleFactor); } + @Override + public void setCurrentUser(@UserIdInt int newUserId) { + mHandler.obtainMessage(MSG_CURRENT_USER_CHANGED, newUserId).sendToTarget(); + } + @Override public boolean setKernelWakeEnabled(int deviceId, boolean enabled) { return mNative.setKernelWakeEnabled(deviceId, enabled); diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 0b5b0d2a0b26..16fc56e436ac 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6944,6 +6944,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { if (modifierShortcutManagerMultiuser()) { mModifierShortcutManager.setCurrentUser(UserHandle.of(newUserId)); } + mInputManagerInternal.setCurrentUser(newUserId); } @Override -- GitLab From 1fc3eac3061a3efeb1153dd0828b3f6f0846eba5 Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Wed, 23 Oct 2024 13:47:45 -0700 Subject: [PATCH 340/459] Enable stack-walking for default coroutine names If coroutine does not have a trace name, walk the stack to infer a name for it. Test: Capture trace, look for coroutine IDs Flag: com.android.systemui.coroutine_tracing Bug: 289353932 Change-Id: I9e04098e69d12cc06b4c1dd29528f760ffeb26f8 --- .../SystemUI/src/com/android/systemui/coroutines/Tracing.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt b/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt index 5b1c9c8b8020..efbdf4d1533d 100644 --- a/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt +++ b/packages/SystemUI/src/com/android/systemui/coroutines/Tracing.kt @@ -20,7 +20,7 @@ import com.android.app.tracing.coroutines.createCoroutineTracingContext import kotlin.coroutines.CoroutineContext fun newTracingContext(name: String): CoroutineContext { - return createCoroutineTracingContext(name) { className -> + return createCoroutineTracingContext(name, walkStackForDefaultNames = true) { className -> className.startsWith("com.android.systemui.util.kotlin.JavaAdapter") || className.startsWith("com.android.systemui.lifecycle.RepeatWhenAttached") } -- GitLab From f14825b16b41e97e10deff3c39924a518ecba157 Mon Sep 17 00:00:00 2001 From: Mayank Garg Date: Tue, 22 Oct 2024 11:47:30 -0700 Subject: [PATCH 341/459] Always allow System user to change device config in case of Multi-user-multi-display (MUMD) When visible background user (aka MUMD) is enabled, background users are visible on other displays. In this config, some namespaces (right now game_overlay) are not allowed to be updated by any user other than current user. The CL allows SYSTEM user to change that namespace config. Flag: EXEMPT bug fix Bug: 375232833 Bug: 361502556 Bug: 328686115 Test: atest GameManagerStatsTests Test: atest AndroidCarApiTest:android.car.apitest.DeviceConfigTest Test: atest --user-type secondary_user_on_secondary_display AndroidCarApiTest:android.car.apitest.DeviceConfigTest Change-Id: I73cd0fae216ab9aecefc2fdb49a719e919c6437a --- .../com/android/providers/settings/SettingsProvider.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java index a8af43f5cb11..603a91195d04 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java @@ -2479,10 +2479,10 @@ public class SettingsProvider extends ContentProvider { final long identity = Binder.clearCallingIdentity(); try { int currentUser = ActivityManager.getCurrentUser(); - if (callingUser == currentUser) { - // enforce the deny list only if the caller is not current user. Currently only auto - // uses background visible user, and auto doesn't support profiles so profiles of - // current users is not checked here. + if (callingUser == currentUser || callingUser == UserHandle.USER_SYSTEM) { + // enforce the deny list only if the caller is not current user or not a system + // user. Currently only auto uses background visible user, and auto doesn't + // support profiles so profiles of current users is not checked here. return; } } finally { -- GitLab From 0f0c7ec41ff9bdb0ab0691c17b20c06625cf33c1 Mon Sep 17 00:00:00 2001 From: Hawkwood Glazier Date: Wed, 23 Oct 2024 20:00:11 +0000 Subject: [PATCH 342/459] Remove isReactiveToTouch in favor of using axis data Bug: 364675294 Test: Manual Flag: NONE Simple interface rename Change-Id: I2afc49272fb309c48bfb522b09d2b7ce456171de --- .../shared/clocks/DefaultClockProvider.kt | 19 +++++++++++++++++-- .../plugins/clocks/ClockProviderPlugin.kt | 5 +---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt index 8e838f396b64..a89e6fb35fa8 100644 --- a/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt +++ b/packages/SystemUI/customization/src/com/android/systemui/shared/clocks/DefaultClockProvider.kt @@ -19,12 +19,14 @@ import android.view.LayoutInflater import com.android.systemui.customization.R import com.android.systemui.log.core.LogLevel import com.android.systemui.log.core.LogcatOnlyMessageBuffer +import com.android.systemui.plugins.clocks.AxisType import com.android.systemui.plugins.clocks.ClockController import com.android.systemui.plugins.clocks.ClockId import com.android.systemui.plugins.clocks.ClockMessageBuffers import com.android.systemui.plugins.clocks.ClockMetadata import com.android.systemui.plugins.clocks.ClockPickerConfig import com.android.systemui.plugins.clocks.ClockProvider +import com.android.systemui.plugins.clocks.ClockReactiveAxis import com.android.systemui.plugins.clocks.ClockSettings import com.android.systemui.shared.clocks.view.HorizontalAlignment import com.android.systemui.shared.clocks.view.VerticalAlignment @@ -85,8 +87,21 @@ class DefaultClockProvider( // TODO(b/352049256): Update placeholder to actual resource resources.getDrawable(R.drawable.clock_default_thumbnail, null), isReactiveToTone = true, - isReactiveToTouch = isClockReactiveVariantsEnabled, - axes = listOf(), // TODO: Ater some picker definition + // TODO(b/364673969): Populate the rest of this + axes = + if (isClockReactiveVariantsEnabled) + listOf( + ClockReactiveAxis( + key = "wdth", + type = AxisType.Slider, + maxValue = 1000f, + minValue = 100f, + currentValue = 400f, + name = "Width", + description = "Glyph Width", + ) + ) + else listOf(), ) } diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt index f975c4f13ff4..e264264d8c6c 100644 --- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/clocks/ClockProviderPlugin.kt @@ -182,7 +182,7 @@ class DefaultClockFaceLayout(val view: View) : ClockFaceLayout { interface ClockEvents { @get:ProtectedReturn("return false;") /** Set to enable or disable swipe interaction */ - var isReactiveTouchInteractionEnabled: Boolean + var isReactiveTouchInteractionEnabled: Boolean // TODO(b/364664388): Remove/Rename /** Call whenever timezone changes */ fun onTimeZoneChanged(timeZone: TimeZone) @@ -322,9 +322,6 @@ constructor( /** True if the clock will react to tone changes in the seed color */ val isReactiveToTone: Boolean = true, - /** True if the clock is capable of changing style in reaction to touches */ - val isReactiveToTouch: Boolean = false, - /** Font axes that can be modified on this clock */ val axes: List = listOf(), ) -- GitLab From f27a0f43b1208dbc07bae7e24ea9ea5a69eae3f4 Mon Sep 17 00:00:00 2001 From: Mady Mellor Date: Wed, 9 Oct 2024 14:35:16 -0700 Subject: [PATCH 343/459] Update visuals of bubble bar education views - update colours to match spec - update sizes to match spec - update elevation Flag: com.android.wm.shell.enable_bubble_bar Test: manual - flash wipe, get a bubble, tap on it and observe user education, expand the bubble, observe the manage menu user education, repeat with dark theme Bug: 372516663 Fixes: 374856431 Change-Id: I726a71cb0a0528358ccc235fe8eb0778280a79e1 --- .../phone/dark_portrait_bubbles_education.png | Bin 55692 -> 52888 bytes .../light_portrait_bubbles_education.png | Bin 55692 -> 52888 bytes .../phone/dark_portrait_bubbles_education.png | Bin 56774 -> 53224 bytes .../light_portrait_bubbles_education.png | Bin 56774 -> 53224 bytes .../layout/bubble_bar_manage_education.xml | 20 +++++++++------- .../res/layout/bubble_bar_stack_education.xml | 22 ++++++++++-------- libs/WindowManager/Shell/res/values/dimen.xml | 12 ++++++++-- .../wm/shell/bubbles/BubblePopupViewExt.kt | 2 +- 8 files changed, 34 insertions(+), 22 deletions(-) diff --git a/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png b/libs/WindowManager/Shell/multivalentScreenshotTests/goldens/onDevice/phone/dark_portrait_bubbles_education.png index c7b4c65b8c4b2c9c7f4cf3f9b83384bc541483ab..736bca7f5a7c546bbd59ae6bbe65de0c48b67f15 100644 GIT binary patch literal 52888 zcmeAS@N?(olHy`uVBq!ia0y~yU^&FV!1RoRje&t-!7Phi3=9m6#X;^)4C~IxykuZt zU@3O;4B_D5;Hcq9>0n?`VDNNt45^s&=5BdI$ko60fA~vZuA3C0oN%y>Nhzt5mpdz| zbFVb_3>N|J1vgBS%)iaL!K)D=aHLOa;{p-UDRO_9*p_rCY&!7j(7%5t7WZGAdo#5> zt*rdr>#y?F@83Pn6vfiw2KR!f8R)X+`DSG3`0ZD%FkaPJzaV=mW9C~ zR8(C2c=37u?#Rv0L&`NPQ%~z|>#&z8^DxP{uwa)rBf|sMQStbYa?VcU>c0Dy3<1@ghZq{7 zUf+ItdiCy>BR_w=UcY)b3qym~>iD~?3=AP*o}QjNZ|7|Odadxt!}ezjX5GqvvEiX% z>8&qYZm)@W7#PB^;G2;W1;wq?-&cAJ3=1~By0S93F}EndgAEiTdp_U$9r^nI65&4W z^4T@NYMB_OxC*c_T!~t`bgAeKHTKpNhl^dJhR?h8S8Z*B$RAxi5mcNH^}>GzG~DM} zm1=G9<>NZpaBZzw@8mxFby3+Tmfu%raEJs)V`x-V6ePS%GB2q_ZOsZ=Yx?B!dtrtJ zI&!@%16-lK3NL45V3-fvB!$XY9=J1e}L zvom3CKW>|0uEWOQp`dm;FzEQh97Mz5&1X~yxw%+oaTh_ySEq?#5(;76i+>yK}_4Kr>v0nFX6&&V$G-Gl9s&_^V46D|hyWTy0dRVz214HQ6tgEXk z%3f@k@%gCu)mX2%%-v7L3U4U3yBu!gUA0?;p+QTyg^{5$_1YUt!*`4OlaBS&hnH(^ zy;XKQPdK*hos4wujzn<5V+bmE^mQY5ne2=GmRmYKPuZ#D)7g+`Xd15weNQao$SGJ|~PSSTLrkrbZq zJ4@u~(W9bOxtr6@CM};^)-~6vw5w0n`q;O(+xpvhrPKBt%is4?t!uyb?q$!;&T@Zz ztk-y-|AL&;({#Jj=U1EEt9iY4hH<*zmaMBg@YTv zUW-m&a=xR3@p_!JKX2WtGuxu`c3JXSy;#ummfPd4{r{i-bBgoc&oE3rrhjYOjil}! zuluYQhprC08X$S~Z0W9FPcK`Zn4Wxc`eTL_C(j77E%|!Z{QePp_J78FwtqIfsLgv{ z@p0*NBe5n|7f@Kr)x20}@oL86$8YAPAK&ru@!~BZcKkmVELozWx9`g&Bj*hr9W#y7 zk1d@ZFSa^-{kg(a1_qU>?#hiupjMCZc^l#HwgvS%vAayvf6IJ5XKnauZuz4Fd3PVp zDXwy#eQj;=rg#PGV|}vH^7VfTZ{^zk`|()9IxptUuG4y!tGE~%RE(8)ezY1UA3Jh# z`5d9^_bZ&wIc=C<^>yp@M=KWhccss(J@&$2#nENHv%?m?{rC6%Cifmj28U&mf^2_Q z?AT%P@8bjeNB`L6R=f*Zv}1?Gx?R6s&G_+h`Nj4A_cQM8sVtq&vS#Uf?H>|fzu&K) z|I~|t;lX~ELx4V^FJZ#7N=ku!dmif#R+J2{~cuU^Xz>~KgoYvpp zbNQUb-ZR_Od}kfGkUsx(p=-!=vs|rj=C`wgCqHFom>}I`ppbTUmgwH|*5-Eq|9s}! zpSJ(+x9-2+?wXgq+~l3J;UJr6U2JA%X3fW=;)bv01{!|(`CR+Uiz`!B20zkIpD+9U ze)asTPqP|Lmo7Cde|N{|HWxQ{aSZR(%Wx+s^{KZ-0P$mae0~VV)yTIA75#&KPJ2Vu3Wop)s3ju1VO>lS64d2)Neq#@rpLTZE(NgAhy>7iyQ*Xuv z1PIjseI36za&wyHIv$3GB|vreedYgWBo~-jcxk(dinRjmde9roKa=*>5?oh?u zB`<~g?LK+DxpXwcfPtat_~MBZ0=mU?yFQ<@w|}ebEhu<9Z*%UK_xJ6~UR}}5-fEI@ zLE&G)kB1jGI=An5@#vpn=A|V@+pV9ySiJbV<=)L<>=R_)-rCyD{{LeFC^hW+`D}K^ z#YL_;J07-OjTK{H;7oCmP`U8x>gva{7_T4cku<)P_kDMBy?DRPpMo&w4fC@uFZ2EL zxN-k+M|RmS-P_CiR(B8myS}NZN#eux>_sb9Xq4TkYkzTd zbNZFF*$mnY3=E;l9L+3|o6~&n)cuyt+-~`6#p1=!Z>EPwb9`$CMPhFKZqr$2xlwPy z_QKy%f`sfX`p5q14E^Y02^muP>@i4{Rer? z+uU4Sk2amw>uzdlk_ij7UK6oVsjI8&(eC&A``uVs0|NpA9=okt8@X9+U*tDmk@Z@A zS67F-H?#3BTChN2mU;fWjY0p8uL@laa(kGlxcgnJQjkp4mW+v?e=@AT?f-wBw8;v2 zUn%pI8z26jWtyFIv`chj($OwZa2@lNa=)zRt1I_Ocy;*tzSPsxj)IKxn`?D(iRWZc z=dSl>k~-(7moiT-Zw$Fse!uqn9kB(NU?6r76ZE<51K)RR?VM_?uOal-o)o@{`c#(`*A+m#j(4~ zHon%|ePrA1yxErzyaeTcf3+GRVf8vGVf(of!OQ)6A3b^$pL2ah;Nlyr-iBRV7rXmL z-tFAvpSwLr z`t9xQ{ome}cgR}5lUN(IbyZu}=Jbz`j(+_2`#q@4PX6F9UOeu9blKlt_jCD`g|)w5+}N0$v-@q?#@p+5tGz0p zlKZoS@6*c&t;Jimm@M;~EhVhx({VC**^wI?lOK2M@6#y0UH10YQNG*n1)_7ehL+sR zTz;eG^V#CK)xV_zLYoXc8ZKSBRPm_uc<{FTeLtTSUYY3rY{Q~gq3TE3Z@;{}{J1dl ze@W+dKHcs8t=!_rve)kyTfg^Tl#5Hw-mljR!@kRHe82CvTQeK4QPg|>eZSxB1{LJV zH$EhOe6@Og*bCFuVQafO=lk_^&iDKCF&z{ri~H@=_}*O8on?|4v@(i~Pf8?z-_Nv} zx$=EK4W7Q9rWY%fUiLn2VeOonPo5V`=dYW(DnGaO``z-7(>I^@yIFVq?e_H4Ef=0> z20zNL*RKB9rMvBhjo!{5lf1s}&bhg%;^)-q$tN!RFXuf_9}pBI1j?$K!OM?4P;6FK zO4@$6tb1{vh0(XW<@dFEZKC#8mCpIP+x z^}0QqvW})lta|(Br-sLOy35yYIb-noxth-$31PK=-+zUJ`a>@cFh5?Q+~0L> zu66no?#7zkWq(3)E!jmU`X8U!R~t6iTwdneZTI(=+jPCyM_s4acbKh>4&Qo4e(JPo$5sR`e)MerU7^isXIB-~ z+wYmU|9|6eP_h2_K{H>}>p=bZ+OMIv4rtHq+V}3mVgA)2|EC5M$5(Ju2p>v!0Gzq2_= z{>!yBk(0lb@2)!gitGE!rk}FP95nX)ZrD|D2WfwaE0j z|1&4G=;v_i_)@8lBv$HVpfA^yMuHwfo zE%i3OWxn(K*X!}eE1%DopB`UWIn`e0&y_PXjUT^>vrRs*_4=_-Pfr_P%Qrha%T(LX z`tcX7)&%>n4`=W{UJ~rr*KhYvL;3IDE1-P##rRyu?sxlkdnw-VxBYkIap9$t>VMC# z=)Lu9`Sq8o-qVkyPLG$X)qfNI^1`F%_bMLuT73KQIO)P<|1{k-tKLG({Hv3edV`(D zTKg-+lI8cxoyE_OJq?eMdmdjjiY^^7-_IGR}`K0fN0lG`p@7O}{!+4ax= z{Ep*&veL`vSGpZzUiS3#boceeRYzZ3T)g_qc~Dzyi?Lt-^!Q3k=c!ZQUJZ}$l}n#1 zTKxR%=~s0p=KcKq{P;}UUB{#US7~Semas`F_+t0|PEVc0$u>@5^c!V{ij!VlSt*XUBP~~s>^)lPTFW!Z;<`%&5y?~mmj^Izklw>eZ>#kUw=8| z%Dp&zeVk#=j}1NV7cW_&vTpakT{|}Xca`K;{Ok$pa#&4UHNz}7YEId&m!k9H78-%N zDHb1}On$Wayxr;``*+z6W}Jr<&YzuauAg>h#>7p3x9|RM)_(O0kFS(@AE*x6`Fy_k z>1n#BPuYQLk3;{&kIu0y*82ME;$rvXFVp7;7C%3Cwjeciwo$3q7rX7{I#F9R)PE}% zPt%PSdmdX*cWeJ=A4%ghpO_2V{ntc%JYBggt7)cjdfM0jA2+3*espT}`co%9+JAmy z3`#PmVxA}kgZgmdU*1mMD7b3pl_j2&f4o|~eo^}QIMI2#S8R%_d^+_-dE)*b-)`q` z-ZlT0+Wd2lcCy~7;KuB)&-0U>otYVV|N5a;?#JiT|1Z6?IOFd1h8$yei6=W(W~zzg zUfxxjv-|Bf%QefM?fCNPbWmHu*Votk^Vmze{pObS_?rFnHOarGOt15Gu)o_~zxLUKS$4HmbM8NH;^MuYe{qp(iS>f$HyaLr zyO?!3?Bbrv&lwjMIO^zYb%B~7J(8D`@9Zc9b%jp7%?4$qtMTjmZs+gS%@+PQx$^s+ z^8D6)mG3Vsbbhn_{l1M)#iHF#Pt#o-xY!NUs=8nIJNL|7b8|JH83Orxex~Wf?Xk$U zPd?t)dpmExt=`@xuO=6!Uph5a`|+gHdcKkW-K29x?($hE+}fHg{(9|oBPmf4my2Eh z|IPK8X=LiwFBiLTV&r5s->%>C6$*M5|NnSh|8?oK{?X9z_}GQH++18q`)j{<%a+}+ zGrL=IIpf-z$}6j*&AY-xj{f=iIr-I<%#X)r=P%*;-__l{`2W$r$rlbdPF=U%$|U24 z!Mff5eifbfd_K3VOE0#pb6f8Ap3S@)r{XgDUAGZB|M|<1dve^;&d%rG*C_-?-tKqBq#m-dfor$FS)zbV8cGD%k@8RUs}H> z>C20YAD_+6KlbnU`}l>ors+fqiGSU{;*P)?=ilGJCH1}P_p-fpW}F}V-|jpvS9t7Y z`jPs7pXXQ9-T3_RMRNbtohpC$@74W&Tk&mY`r{vu`}}wR2esJjmq&0G9P5$%=+-5w zs;u<%b=|ts*Jh%(^iD4GnJdK1&gZlH?7!ddx`Wp>`qoo8O(Rg=z_c|Ny1?#=De`%~mS z`0ZXi(6D{K=f{)D{*UH2vrYSbA z@2{_qpG@}eQ|9~coU`$$nC5SbM;*$G^5@%qJjgD8#F^hd=G}`a<@c-2-|cyQ?#1=( z@l&(Ti$j`=*RFwzfk)nYdgcdiKi*z_L~{9jInd~K`N7t@+TTZK7$!g3$NtX$_t6Is zh5DWB|Nr%a`tq%>O5>S}90k}a^RB&#)VzIb+g+pb)+-9@_kBBUemHmg9iw&o-~GCg zHal1A%JH!1Tv1S$^7p&l@i9d&RWqAcyUSIZe7l{$pKGm8$a25AH>zH*O+L2&e{5Ry zE)57qsBw85D_dUas*{-0;_7logXE4<*yezbv+`O-S2s^_ugM;U+13+P5~^V#Wp zy>^$|_1az2Zkm61 zhXXf?&)YtJ7M<6(e14_c({22J{x-h2v$ME2vT*g953e3H^YwY_?^NO9=006pJJ+f- z3DiI6leKoczV~})_Bz=KW%K4I9&U4gUwkfdwbXR|cscR-qQYASR!U%(-je@6!|chw zl}$}eH;Vghllt%fGmDe|Srt=#w{*V*W8l@FRYkccCMc%(e!o|JT(0_!p#HuuNipSrzhgHp{(bvTo0#E{hijy4EYi?yviMqxSpVm+#nD`zvfk{&!Oa@k!<)EJA8`|8ULD-4@BGy>h43+Z&p4RUZ~|wI|qb z&A+~`@cG;FC4aw_9BSbdowsB6h7AVmc7NNo)aEqbo|@#8Q{RI9>{R`1pI-6m{grcRiDyjR z&8LNLHXfgL^Iqxvb%oDn-o3u-evH-2C6gbuyGcPW3wfWJ{{`h?Tui#ea4f9t8FZTmg3OrI48lbM#*1B5X>x-+u z@A!Rgx0X!QpOC#(UqLCXdpVn}WbSsK|Ed>!x8ITRo;J&7w+&V~lcjtdA-<)u;sp82*_tjhG z*G%z$t}wq(b?T!>k9K^1w>xOt`rYq#6<(iPe)L*&e(clQ(pwvY?^K_+&D<}t=lQ+r z({GR0@}3ZNlz6i7Q`mvbJ39*dv{ugK;^KOAE1PXeEz5>Qeb(Q0Y?*uz)UnLI`yAAX z?YI4vA@k|?{o@VUY#~{8i$Z3ZWD3>({^t90+1GCUeI1&?r{-JCc{MrDb(5HG)RASg z^P-;Cn&jQF_!W0S9W-3C=hLOrg-=DpkCmC$H1>l0;VK>*@=nHFwD3!yyZhy3zQNo4 zXW8sLRLd)8q~hh}6|{|i$Fo@(`<;JpU8O&Fnr`$lU-NrAt|>ptTC}*|%Brg5{lty@ zD?nr2cPb9^X4aec+kdP8w`hN#W``uGOO-F5PQToDXxFP#tBpQAy~Pje_v^hWPdxQ) z`@gSYKJ)EtbLHPylzeOjy$(tSvNPO%6x2B4%$}#CGgeGZ*^H07r7cfdAaGiM%R!033Uhl zv9BqueR?xz^Vvs#KA$^Xv47{4veUYY1St|8fFB%nwr#a^=ZY8{QI@W`|dyPvo*6Sc`;#A?T?NxpX+x*^U5|afoVaf zr|CXEBJ6h}V}5MeyGh$>4>qw*ePurT@R#rRvfoe1y?pBDvuUrU<}JB&X{opN-~VgP zUT;ZW{$kg8JIS}3o!hT0-m)wt;oR(wj*0m_K0lATBqk=#`8$1o$f|8!7JoJz1`Y0< ziTZ!DEO9^g<$v+(yO?*&&M3Or-_g<7%oh5JyQgL{B*D)8`1ttoDJxU^U#*MZUpJ@l z*vrV9`Ji&5fBC#woBsZMKHvYh>e}B@6SSKQP9#5ls-Asq%}HNH(+i#Ia|Cpwww%bA zzczY%U)tGOOLP9eN?*O>D$Cp3%l}QVPyhBtChX9yTM5m)m+bzTKRPO29N~Mm;7;N3 z)S4y7uSGANXPWl zk+1jX-Q87q?Bz=4#-rWh$CuBqo3-`tbv8&MJ7xUota;Ej*~%vqCFf>6eEtm-g#Dd* zvAay(KAr_jU8Y(d`(H(@TDop>!vDYD&R5I_4gQwh-s*ibPS{<{Bc=5j<384 z%2&JJZOT6NZTGu<+Mr5|PkU9}?(~Pw?{>XjT7PEKiWM5UzaJg#e*E|QegB(vFBIED zR;}B5aclPVi1NE;KtfCoHsixi776+fo#ImOHIz;oE7^%jVwLr*)|| zL+_l^hlrpcq0i6H_n)`>t#hnbTKxUK?|GmBQ^UMJKYqN~d_L*lpPx_rB5tNU?mhkI zr}^n=se9s#UQf9H-!3)U)6;WK{Xy2km#Nc__SFBkZVwIZzgvFaRy)yu@-g2_+oo^V z@LY9#vXT-g?M}AL;^N{;`v3Ra>0fn5D>rN~D0?^O=T5=;b$)ZL3O^iVUz#ItniX;_ zd&Npfe|Jjyub!8h@`^e-Iz4@|)@gg&_%hvQ`_Hw~eVcvvdPB^LUz5BXdatg@+`J-w zf88mCB^i~0N7fg|gz#>->^FC_+551|YAc^_*XX^Z^*uf)NC-5D`S^If$m8Sv{Tm-2 zo3>lS$DSMH4aqVr!jm6LBZZ>oGE6tj|uvNcq9cUETEO%DXlk2lCeW|}*{H$i; zrrh~^gU?@_o(XE|+Wb9ZYD&OuDpZA&W#V0Bvazu1`ykNb}+y1A0f298%`XKS|&@^r{onrod;dRZTkgKdGPh;ZmR?=9 zwrJaWpBww`ezUwCzB+8}BG+!QjXFm)Zd87L=6ZWuZgH5u??iCnvD9XB`gyOLW=Tgn zBqlc>H@>{~pGEe!Hxc`4Do_iPot2f67WbNU?frH~yX@A=;GFw;zca3`Dq~f%&$y)WSGnivQ~Up( zwn{mZea%ir%1Y;M2|V|0D(B8W^%2|i?%qiJE&FKi_xswLYyUN|cJds8Cf(z-+gww$4#^3V_#&#f{IOYCj33lWR&=A&dtJ) zN2eb-;;){TD{q{B?o8DEC+8a3;-m!{v*M96vS8zvlo1qsduwa= z-|x5W%kJlHzmd25?WS)Mh0Ct42hA621n>Gh@#WO)%bwpCZdUtsb$#*gJ9VqW)&{YO zYoCe~P>hFEIGX1lN$qg@dVcMi1LD=7F%?N;uFAaMWh=uCYo6aNKRq|T>($4b>GO}i zOrJCHszA@5P1ob9j|Ml->-oFNLi5)W&&iMatlxJ$_Oq}%_o6Os&#zaj*9nJyIBR}? zNlx~i9fjv!fl~TS8PAy)RND8??&w(N8{Ds3B>sN8y`S&x?c>X4=SlfWng9GK zxDnJ#|GE8i^2h7($JK@HI{WSaS~^lW_?&u2P-{(cm5F88lE{)paeeL^O*1boxmNQd`@)7#pErfNEp}VkJgKWE?xZ`U z)IAj}9aa-J`{(XE*Bf#`DKi?>zyIuKeRRji$ES1Tzn-&h+90)L#}12M@pty$5y-in zyRG+epS9Vpcb840w&g@F+z0CQTwdniZ+^c<8I(c2r|X?{IeEnZ)JzA>-h(h`>ST8Q zUP=8P3D8j0+LHN`)&2Y4+3q^7sXkxm`P}NfwNjBGcdun$RC;>9SkHN-Y4)`vlT^Kn zw(Vc#Wqz~FY>BlvE9=(Bg};1GFE5_pe>`a3C%64uGcT*H{=L4VlbG~VH~0v* zI5Pct_u&3go#_1@XPcjQI{GtxZfQ{cgVU)3(@q{WD@we2>dv*@Nv^LdXJ@@~ z;<-5unm%5Oh`F7a7n^qbvUA&!ZMSn~U;Udt`?u5t&SxCWEH{+To|@o2O{epDyY2kL zSsqJQtkC%P@j-Lu_MOjO?LQX(@6U6s`r?~QJSSUxI-#8WV)OZ{zs!$ry*cY@cG0H! zzrMb9Z~yl8asTppQs3_t=kKw8HMio)!uH2^?mc&F=aap*YW?>6b=Lo?&YDjBbzq`P z>+5y1H|1VjL3;Juh0lA|}QfS_Y)gHHptz_jbu= z)0w}e0z^TR1-<6?EWX{Z|3Bp|zwMubxV@IE*50fAes@d$wd#`hg6=YfE^gmZ#7TNqxpuPwqAeS_By}Awr;kS$^Vt0fm=3P zOO4Z^&)UykvT6G=|NkHL^wKkP&GplNpK7rze)c3Me(BPsnc`}Z^?!Mb!n|FdKDq@f zd1vSC$~?7Af8P(K)xX#Iy~{puOQ6NkX->(ZPR-k5`f)P+wtoWnRxi{^KHlqnbK6BX z>7y@~&z<(Mc3tG=WnRTODz4j}P5-IYuH1C#X2D_J$DoG6yZ!I?RV3c{VDW3k;?uQf z|MJ^RxGd@a%08EM^oPJznL=G>wE0% z^|C*U_>?}qjySdX=d;<%bAJE%{QvZ;ec3|aO%-GvB~)CVpPPHxuj~JX!~Dl@Y)meW z5VSW>doyE7Zo6DjM%c5$+2;9iYiBuFN58u6Z=agBZQAbnKYyNC^Cemo)HjbQeLD5y zkL3QNzh1AOU$h%E#<_a^-dTrFWi2;bdwWTa^v`1_BKB65`n{^CzH;00rvI`%|9-u; z{C&6Q|B5%3Cdx{;w&czIc5C+e>wUM1__UPf_bs(q8@1K%=C}3R|BGf{d-81JpIJw0 zd4E`foI2O4^wAo*^rd&7&B|s!GHI!)zQ|0|?6A`56H4#bevhsB_w%{t?af;^Jy)M! zGihpF_Ux*!ua2&-|NDB%+nYZOcBh@4Rq^}nENQ=zTN{IIzVx$SUgs5cHTBKpgxR^< zJbxbi4w|Ip6jo2!+ZMSw{rWC_t7qqChrc_dIP=r5*UG`$-fq2qFEbv+t+(?w`<`kj zJ2%JDu=dxNHP-`zcdlo&7ie*8db92Iy22BR?Mrh0|M`6W@uP12lef%oO#OIm|Gh3} zK5LVCweN1e(oi69LT4!f(TUGJ$>GVyP@^inep0?lX=C*``O+D}PKRr2VsD1QQ zoaxcD*|}oRzr32dsrJka!>xIyhhnrfG(4=`A5Tzp-V}HE!^6Xy_x0yU%xS)V_R7lO z$7}1C{(G?dwchS2x83dHt+P&BuIQ+-npVQa&7J&y?>DcT{|_xrtG(7@8xO5bb8UR+$fIDdbgpkU$C(D0+d>11>)Nz@%NCQ| z>Si`xqkZQ&h1HI%D8F~IV*krEF*`TiNnWc58eKTGE$7VBDJS`ry{GAQHa4@l{`b~9 z_v3x}_q%2OxBs0rzn@Z4|1)F$-tV3_%^n>UPd;?yig0%L)jO4+lO8N+jC^fByKTRL z%`(5av#!?Kd^}&jEGPTQiolXLH#Xj}%lf=^vCY<}G9fN@vfh=KVv9j@wx2icscGQFTYM) ze>|tS+P$#wW52z0!P~7Le+c)7NBiCkxmWZmUjL`n;@{DGt4i-w->;Q?yIHBLyE{46 zbnTRgdE0Wg``nzC_ix*&8K&7`Zf@#lW|?Z|?SK5u;>CmJ$G@c4^$RMy9cfQCihjMm zZfeyQZw-M4?AIgM;*vWcZ#qKWaO*=bl>dmmAAffU* zmF{8tr$~KyvY_J2#^aB62>12d)&5=+dgDE$bu08@f-|3H`PVt1(yi*-D@jnhr*GA- z^;cJiA7`$wS2(x-L6cGYvil{U&wjjcnE(2XK-Z~PR|GE3xNP;6WxKF?-K>j$L8A}% zs{ilp`S!E`Oh#=%-j9qNCUOXs9=UcXzu{O-GLxAVKjvwybl-c<5#PL|jCGk6GT^=ad zdRi0L_t)62+pAYy|9of3^Vss#61&5T7A@NGr%OBO+#E~I?Uqj_I4^oTZKZqF-;ms0 zWg%g{_Uzfp^ZQiiF7CI|%3V-=bZU57jbJZm`Gl+Zcm2(8&u+ihReauBf8W1dZv@}H z%XZM?JfyI2mT9(_`TdIEoXuy=GPg(XsVMxie@FeC`h!0sXGbpvbqj2NrpQ!&3H*3U zd;OH%fAh=#=f2tfeqZFurB+L4yOba6k<5H9w{pezd-eKyFK#bC^>@kT4T*=h^f&TW z{(33(^M>PWv)o0#v&}SbxAV$}J$01^W%9gTKc8uR6%;JI(8#_t_G{LO35tcs=a#2D zaXwspp5OQ8x7&Bi`>Vdb3aym)ys##6^NY*sfA8OuEx#wY{mWaQWLN*J7l*p_x)z?dkAGSRTD$e)^7i~azwhnV+@5)BOXi%*#$Quz*@w?wCmR|# z`TW6Kr<+?>{*?`LVw3`My?e@nv_O-MP0n z_#UX88Y9%=*t9k0rqR0{Z@+=&3r^qt)@y#hXK}x++ON19`k<9EJ$nQrca>z?{Jyif z@RFwb@zU$@;R_Sr?|#3p`cBE?-iu2-Cu_amzwBo1_q&(ts;hs?Za;2(-Y$6MK5s9t zqz4BYFK!NBKj+NfZP(|m3|}+Lrn2Zx`TyFd|Ky{#WCSid?X@~?Z&l$VPW5GX(?C<_ z7oN|Le|=FFwAQIzuFgVlr^(+xHKL&r5fZlN-_0zW4H0~EDPmhrdPx5CWp_HNTk zy%qtQxCc!he0;n8e%Pz8pv67G{=buNT~JbbG$(Fv(qvz=l?D4jxii%Ct4xTSovgPO zXcV~Q#RbLG>cGIjFILaz?D#!zxAxzA382xrM@PjUU%C8mM%mOWcgt?;^4Y)nFy$>Y zMLsmUnKF6D|9ig|efF~s&G-#!B>UNYonrB5h4SOZ{q_RF_H!fN#c&*w+k}w91mz`TQ+t=)-%C~#kr4LT(UtJljuJ^LO@RsFLrGM7p=Q7jh z$k|qZ?Ex(xo~9E!sp$4p?Ql>H{6cl+P{d%ETN z*Zkn&`)9BAPutD3?YGnf?VEd>nYJDRHP3duKDYZ(n{>X&(5(lez)uQJNf6I zUtQQ&o3sD#w~wpi|7y)L%N6sTZPsa3`szse{aSJF>2<=NpP%msEv9PW6xIq&?tgdp z@tgf~V&BbPaqHcV}*2<)fPgaUuzNFyIzT0^h zx8>djt?4w$x}y=cCPK1XTpzr&B76N_Q1a8?-2dzA>*Ht5?}?^grbb(fUES0tWepEdEi0fbdE^G697XLo9D=!LOE}Q)MtXcn|Lx<%5&jYnk{x$vl z`1ASv&_^gYIT<=u;<-PdWKYi-%0#NI%Gw}T$ zVL`#$x!YrNcAwpLagl5HitzP$I={c&1~qSLzFc&F>NjuS<34M*|J?dr<@am1dns!c zz5MlheLwfFn1E+4pNpTL?bcqm%P4Qx(`OcME;uhvKHj(SX4-7m?q|A-91pW?T$JGo zS`)JD{0zbTynqi}`zf_2Xl+^LjvQG(c;EK@H;9Vq$KKkM%zK{eEBnqD6~le1E!UhGDYX9=oCx zpLsSr@BB5-y=9WO=i#v%1&4W0-@OKz+z}8IJUiRGpYeK(uyyGxk?VI0YIo*~)#V*J z(wV*0rp$Hi{(rv;f2K}%y3$Lo0t8`vdXBfS)!my_|MNb`=|Uiw=Tc8XUFq< z)&HJ@ttxtYYU{th|36*{PM*K_d*tn+pZ~XHURIOa@&4b7tH0-LN&M*VJI`jPle|^^ zy4>5_3P1OnU)^>52wDzRaWXy zNLc8(@%yxlE-7ErWm%81J>T1^ZCoOiE#%uTRlPoA(Z=sxysnM{OFTry#3H}_ZI;(Q zELJu>_l@2BVw>ZVY0vz2em{5j{h2$_QC<6|>l&Z9z4&2b;tczII~!Y@ulL-7S6Oel zD6+oM>RO4;uNU{$TG!3k&yc_8Yg+U7uC6YwoI6_trOk75N_MSVw{C`gxm;3m^47Ta z@1{ydtaVbJE?i0zITpM3A6q4=ZFqypYH@wVm%|bJa%P@oIhb|y*s({u^Y>k?+`DLz z(%R;P^R~Zr;$|({so!@@%CKg~v40LaQ=6Na?S8&UUd%WD->>ZTk0-Xv8=lyXY=KS}tL5(HTeGk8b=O68v{YQ3pCjqyRAW;&W52^{ zb3>iLhzyCkxE&n-{{3_FRW~vcvj6uXdGYVUtgO;@vst%HFC3ZG=PLjA*Vn`T_J271 z{V%gT|MT~6_O5#`F1bE0t&CSzN={bj>6p^e(vtA)`)0%RZ!&AGE}3tUySw}G_xSq5 z>A}kvEzS3yygZ+?jZe0#viP~w(*Nti<11P7_xx+S=Hg zok}+Q|9X0QGYo63j`d5YUwHfN%|&MKe^GZHXl&>;t-PdCWA@c}^?#R}AxzB78#5j% z`BW4(9o%mF?WFq0$NctEf8FT>l=`~UsvKG@XiyY}4$x8U7u zvm!2Ue6iSjx?aS_oShfnpRTR?esI!$vDaVJB5L=n7o2ElDB$Lz)#;+dBWJ>K`hQ%T z<^A(+F)?#4UY4=R5CDZ%x0s&O^>wkm^X4s;wn$KzrWbc9;rPZ|Tzq`TZurXmhph#e zU;n35JibD(tZdoJf3Yz!2CsL&H^_YCGI>e5N9^vhqmS(WJGr>DIBvVXyj*@w%tj{V zwtj;X-(GR^^B_0_D{_W%8)eXss~?b7p#S8LN!^7C)nGc@1cc63o|_lHxb^`&!WFI>2A#^=8| zHD4aKv++lnZr$Z9?fX_LBgyypqW)`Zqm$3Qx%s2!RXRt;-CGN8fBX9N=oNqaqjxNe zA3T44{l(jl``lcP9kM&r;juXF?5xBO4-QJ0WC-ZR?dgc!U7mROSTAqcr!{LYTnOlq zuw!EW_1!%qV};|kOkXEw=Zznhx8B%Uto|=*k3{<9lK1Vp3JMJRJ@t&=@0ZUHw7(g+ zyz=w28Ag>{@1)D*!`8$!nr2@&yYb$Awps3lgDkZVOjK-aWV-+V;m*Fc?&$maKkLHx zy}z|pdtT+Q%rCERpMTMt8y+6+GtY!m*}dn$s;jFv)Ewnn>+Tf1)Z2;aSf6Y+<6rg< znL8(zzPiD=IlZ>uIQ{&i`St$}{^ETd7_p*m%ZXiY-o7=gxS-G@^HZSe`>Ul!^F5aa zZIykxd)KUeaTh@OO>K__6vU-jH+CXzwpE9)9k_H#R04{yF$i%DpmY&9boa zjKwQsnSIy1jQFA`)@@kzC4)!SN<`W`_sFTK+J&mBuJ7NnZqMxwT@5>Ldi1DpuO4H)S%2C_CI7dWiC|S8i9O2);>(uGfgokJBy1C8gQkj=P)d;`Vs^srAx^H7sd9^YdC38_c`2C+5xV?fk#Ly+8i& zaQoGN24w{W4mCA4kCKuv?k<;iad(~hruRma??zCL-o?hdaar<3_tH{Ry_g*h&h7jU z-`rH0V^Qh!m}7HZUYXb)7WUBWYl3@{!T$(pFcG< zb;X1*hp52MDO)2yKPxCIX=!g~x3RIgu&1)v`2EVSD`chql%32C@mSgr!{_eq{^Q4w z1J|!#f5hZ@ZP|(y96x{l)X>#+O-)sOb0leph4tdp)6+hD`egL|-O7--xV}AmY^F?^ z;t&^O50w>D zydFMz!lJIOzGKIZh!E-K@1{zZ*qIYuTwGkj-rbMg{oz&i`c;2!-_GCLn?Aqt*pX_G zOp2WE|JXPsB_*XxFaG@eob_K!{O2jrtp8>? zF9L4d-fZdN;^MNcSyvvUM|rk!xnAA>$K@fRp_+f+-j2M#FnW95htHplD|S_Xf9sr- zwCL9U@9(bOevm07C@2_d^i9wW5i<Z2S!D8?TOw# zVM>WuJD>cqdA8MCZndwRU)SX>SGQ!MJ18AoF#*+!E-oofn&H78>V?&n)YXqa$@HIT z!#Y{b&!ln}I9i)(A&Dgb)Ub&8z}$3un`!2*U^V}P|9xj9Tr%nG=;+Ylg(OF{Yx`=e z|NOiCUc#hc!Nto(rKLy9@7J|^3acMF*XL^wiiX@jCX+xO@>#Wd^~TE6X=mmcv+vxw zlkNV$6@iNlDj%u*`2AbD<~GP`UqOheX<>cHDY1qBCIw7WfA zI8j+pR5W#gEjWhxATb=-aq5(pjCCE4d!NkF#%A^jbLOnMTE)0FdU5{!x);~hY70FQ ze(?5f?h{*8B_*Y-SrQz|AcqAUJ$m%S$&-%v*4lWe2zh8PnQ;1PK}k`|;>E&y_U?Ib z|Canbxp~j-g(@j2Em8xOHK2qG(#R=e)d2%JOb{o7oSz~LF&V6G_5lY8P@V(fn=IgL z2G(;z4HB^+4K8LV#zK4p(lF5%k_N##My+re4JaigrO^~6I6(O#%tvqf>}v6jj#)O> zmWFg!Hm-QN+59`7fS};Shj(`rGVlNUQGL>6{l#1N+s~`Z(n(5MbarpFi;FMU>!4Lf z_c)~3y0HFS%9AN9C>SZ&>C&|QUY+<)R@Sb{Z{NQC__cZ_sKMS-?dEc&WP{$)s59Iy z*IMVh1x;3&=n)VWruHMfGH0cr(Fv+@-c*lhFX-q+A{N7 zN5_hniLqW=XNY&K;kNHxqV{s`cRPo;xOoZpKA*SkPIP{sd!=muzi-hoI|>2~|Gu-% zSG3bx7kFDm$;i}t;;ZK|Wo0%0TwRvvLcDik*M=vPu10LDVddiDI=ffe#U<_fLTC0L zzkhQ-v$V2Wlzm+0XVb#v^CXevw?YZqPN`hxruUh4l z7^qlP@_yO(vhQ#1cJJ8}-SyILZ?)##FC85{x|%O#_RTkD|Nmz<)K4PA1^)e+w2nrDOL`uwA_ zpWkx~4Had0kP{@tCu`RfXInj^rao`_G^MXmTAT9jxnyQ)zIpTJ!J9WMpr#fp>%rTn zPe1vca&pNfuO&;DK6Fb{%e%j?chxGb9Xoa$xO-Pt@nG)7RiWA)E=tWyN}r#TjoDu( zD`}o}X_D8{f}*0P_TAP^O}7*b3!(POn;bL$?_4Jb` zPaZ6Hwbx!YS7z>qZ_)V~S3PzWKj+)`=a+Oyc)0enUMb6<*B4E;tE)XaaWT2;Wuo(Y z*YA0Ew?u`DoBrLId+;AKdq7~|!ZJ&F`FtK}E0Jb4-j?poo9|`j-rK~=&L`L8q7=A$ z&i3izYquw%-c9#QS^hlg6bv#$4d z_8oiNZ`-tCgTd7L{iWLS+;x8f4c>1Jk89h#`<*hU+PfQ_hu!-$mQ{ay(OCUna#5kI z^Rw5#uFSRG8Piw$n?K>{sn8R!7^Ub-lh10!H?(&TJF>~e`rkqH)Q+!_F$FCnNV&DDfoP1+b z>FT6ib#<1t&v@*9C(XK4HEZ4dhsy2~cOlvc^u6Q5?XEVt>; zLVoAxD|ea9&0o1iXm{EBV{N^&10o_;6xF7ur+;~UTU^(`^b(la$QH3QF_-c>2gxHj5+$KNMUPFs|}+mjHdy+169{ZQH4fBe_iFV|i+zxvpQ z=l*Jw6W{Lo8nL--ZrJ?w_jXO~SM~mXY}?z;8Ah2(O3KP5e%W__@k-TmTs@_)ap09{ z_QulNWqT~@WU9Wty7|EB=uy?CV?HrCI!}r$!`4OhZhd{te8<0=OH@?mTDL!+S1Wb6 zjW6`q?*4vrul(ssw#v?i?|*bomaxf4XuiG9TW@;u=V`hp&YlfEBmMcvD5-yKlvc zfDL}x_5azvUl)1GYEU;b@Tka7XZd5Nf=gFg-Dj9EZ(^fm@$-krdVP9dd#ecL`1>4L zcXzkpzn{+y5*+Hgz1G_WUy0p%ru6TZwd&G`MUHbt#6@0RuDABC`L@z`o7$?Pr|(JV z`@B>?cxtYa_n~sBlUjFv#w)Ce+?*y6zy9%`x1H7nZ*Q3{UK$%0*OzIWmUZ{RI&D)^ zUio?}(dqi}VZUb2oh$q3aT4oisb33YUVoWs?Dg4ij)h`{v(MZ`i)+qsoXhy-Y?gesi``olD!`I`^%VcZta&C<+VR=R zM^A-X{oip~U*o{@c%SR5Hpbk4rWu*?o|s)1_(s{-1ot=|0Wt*RM~o-nen@$NTg4cD-D(qDb1Z)L`Of3(!Q>7`z*5YM%A*V0ncv|4-i^mFq>&urhm-F#%)Eku!bTA~!#Oa9Z-RfQZNv!?o|z&K|qD*|X`V(nOBJ zjT=2YI^17h`&W?huEEGt(#R<9!GnX&9y_Z-H~jg+?>i^wsU9?E);I93Den~G{tn~1u<{z0A>HY5_ z_N1&#`t_%kTSG(R%FE3Q54-nqEo1-ke*LFgQr7X=lV(k8b8hG3e%9LBs%WslG-Xp( z%JY=P3mkq}PL0t!erMNT{f)eB}33_KEnD$3H$!zOlJn ze@W2Fq?^s{e9Bf(btiZ4 z{(rmqjL*aVe@DHiDOv2$U8JPE)lPj`!nsdO63fqAF$(>6p?&A4kjO~MeREBvQ%mh? zJG**Zw&%qPN(eBxySq>EJT+n7yvEw!{0h3dz8n7CDt-O%<;$B7(yuP_JAb8g`p$Lp z?Y^cY&wLc2yK~K}rd-+A>$ZPQJ@fgh#I-xy6fd=a8a z#|PX>caGd%*L>-A*2cNkkB^EUJAC|jbmq?=KP-CWz6xAh7u|m~` zGsn(1cS7FVU0=O=FO(@N&M+x#I^~w?Q(_{w4)zu#?|tcl6V*2zacJp7UUG3n3e_j*TbR)%!RTK_-zxZhSQ;@<7s z(iblVdU#o}FIYCQ;?0jjp1t9_Z9uK0zrXo8o~`^Xa_Gj-sL8wXce%Q|Kb*OIzEgno zL+Q>^dvUg`Pj8k!NjbR3(BGzSqH>$|)BXbo7)ts&4<24De`w9kVix-u*Vo4PH!_E? zvtM2pFaG5#Bg4nS!WkBYOn2_ynKG@v<3$U*{0{j}>#|4dk9xECznrcY+a`H=zrYgX zln)9#k~SWOwNG9Ip7~YRmt?iAIDOCmd)8hrCAut6b0^F(3I>-d$Ib=MT62Fx;K%xS zdHFpisYX_1Zx(Ecd0T2%^Mpg}@1NBR&d;#_AJuc>1jkyt>*k?Y%bF{edD^SDOCO%` z+&li+n&Ta3dgr@M3jOru!+{y<^90WPuD)3$a;^H%C5fFoD}FJ4{UPiwzs*!`E6%cb*^HcHG@vNGM#XSQi`@rJawRtNXk?X7-zxBOnvO@lSN z`TOlY8Gx!d1A9|b-?y(nSz20pt)F+?#Xb4e^7$Dxo4Br+Ff6P8I5T1XlOoHy-;ep{ z+FSnE&#C|5Ap5)U-)f7Ros0Jv)X6-0{D|fA_m!2b`{L)@HN9kJ=g-=!KYh|<)}Q;6 zkMn)Vz8REh8T=$W_sgrB%?FJyU#qjCbnk_jh;ue>mx|+)wu7GwJm!b2P3Ab-GBHeTnm#^I=iKzpYn7 zVoV=BzqM=Alut|&`_3>dJ1PHbLyOJR`>RCv{diqP98J3x-lv%@+#|Xt5a)M-ZNuKo}*tI>16AcqQ}!R@#?Ph z6A3LXEZ`8|u;kqG)ZVR?r^ODc&jgk2517Aa@BMe7`n}_FKUvn#uk8M=oGPHdN6_qw z|BaKAmy7=I?|$3!?(QzFW$R-+1#SMWexFvhE#b*ZzqwYgY>NVGXPe~Ep+x*YEwc>Du9}-@kr6`g%Q1)MQ8AofAhk zCLcFlqdG-EzTc5q`rVm06`_X@+gs-=J-NH9^-mMi)7&yohs|kcMJ}H_Ih}R>myDtp z7X%NM{IB~PqL;p^W^L#Cetxw*Ka}3Q-CCV#X&+y)?$vYQ(mQwW7-T$P*s*KZqU7Uz z5=IpUZ(LS=e%#u9sL1@^&*xk3?XUa$OGz!tBEa>px&GOcLZ?7EhIxis{fonQD!o*M z9&QbfZ(H8p9(J0Yo&9lZ;bWH1eR8&KYjm#WE6ldC4Za@xY+v23Ym<8uS0!(~vS}6f zw$hNz)2eoF>?z&%CG}lZ&xtudGF2jVt*xy=Y0K`{kKm)1`~I@?Evo-t=Owy*-Ko>s zEVbo~2WA|Xzx=W^VWLON@Atd;#r5yKo&5U9$;n>x?T#IB;kLVJQT%Pqt%b9e2CaOc z8I_Zx^XG3g=RApd*7b6GtG@>Ath-ywxZsP4SA41v=eIYa^VTn)UlsKFm{dUVJ~y8F z00E9Q|8Lm@T;6~BUhQv|&-0{ytHi{_l-zp0;X(k9oJqh3=NI#1cVAfSUcUC4{J#gx zQOmFDsj%psJJN7r_sR{n>9Z|srSk5bIrjAQ^oixK z#cplkykf=6@Z$P<{&UwVqm7jh8_f%d_Nrv;2~K0U{Di-DhPD4);}nCY=H}9<<>l|= zZfq)*Ubl3a)-zd)3W0vRPa7gH8@u04efN5Kw(U)cWmaL{x~p#`MY|hkuh=eqIs#Ng ztvlXv=46r66BjoDF{xEocD~Es|F`kfsZ(yb--AA>I=0VIR6J;9{((_p(Y?#*oi2;6 z7-kgQ-qsX8ML$ktS?u+r-P2o`*{8OwN?MMs*;)8y8iAe5G;Rp zC(vhm&db%|_mc(ZDt-8o-2dq8_4vbU-tRlOJ-&YFmNTv0(^;-xzkFHv?k+9%+AV?m z{dX2WKgTVl@@mJzzB# z@|9k3oP8~#>=3(cH7nA2?_G&wHu1lVzSnk~m?OcVy!!i(1va&J{kB)Gk(6 zWA}19=Gv5crT*u?di82kVEdlEdj%yV7HpYg_sah4n`>KF$IZ>OvM@RRB9MP!^!9Ze z8F!;nlht>|Mcv(9dUOWyIHh1_sr*1y=k|$DPCf;?^Rj-{L!PP z^m%n$pT+(xn6W+Wt<{$|H<|yfje5ED?3XV*2fysA{r&ab^2K@TQyBuHs-iPzo-;JO zvGuq8(Jw!_#RX#DA7^9$byhz9*DGyGFWk7XD{$GVQ>O~Pz6#xvuV158`nPJ=gS89w zI6tyU|6E$VXndHhh9}wS3hq2{a%=5 zM|W43LHfO#9e-bf661>t3vHd6ngseB!i4>!?+hgBfp{u3$&Uf&AuxQ_j6&@WfO0LX*zsxiSog%<;`p%AtnlE1LEB5Jm^#5yf zTKYLPP1ZxN%4gi%SB3#NE~H)mIT)?bm94^DUb%FF&vF`kAkYnAoCKtGJRj zO7!*hefajtDItM@iJAH0%3${`1-T2a7fQ|sh3AjdV^@AU%P%_iitrZs&IX#p(TWT~D{{^_)62^ZNTf1G!PM#D@ES<+!RaK#&q9U!oww@+OimVCeN>fsruQ;eoeow{(%8lMkG?%nY(y}GgW z6VnX6`WJ^~DpzfsfA#8r8MnJXO+u@lt=YY1t>1+sBFD2%rfyZtc`XqZe2&|BfAI!a~D;QF~Z^ zf0qX}M%R6uyciT}$EL@>{L1Wjb>~)=Z2@svlGc!s*o}>u8|Qw=<*wZNtk$rs>e;H@ zYc~1?9G`MLt1~rJI_I@ST<}?L-%e1Nlo|@SnLS-NQF%lDe@0h(j#gLKh`m+3^J<@E zGB|vGcB?k;!IKvqi>xlsulpmYq{Q=`ZK{^x#fv|xZx$W>vh(wE(ME$#7bS^LwqdUB z2MrA`Mr^I>O|p7<$MVbj>*5R(CKZKVU`(&6ndA6<@4uf}FWxq~Eq(f=WznMDD^1PT z?wT*k)UbGQX4~p~kMr|vSsFLg{{Ei)Wkoy7={Yu~UInr2d=d*bZp`Vc$>q`0(~~eO z(P-n9POaK@-tj6~p(m%S zxtaNx?SGwpzkWp@-IIG;_~QEf_?8xy#gWEuyIQ7i7YB8Tmw9`6@$6ZCs;T)lmlcm) z?XPzn6QAqH2$(P|T0F)25*& z^QWezO=`JtWWK)sQT66FkJs096YXW>_V#BSyt(Qpn1wo7+WTb=o|?KkFyeW;OIn(mS^mwg<8rkw znb!ON{F=RB;frU_+B7Gtak-_0E?=-f;Q!m3&7#`jrk^r+&WD}qwrV>i|H~kK-m3fi zC#)+f{>*YYPxsChoy=MApi-4tZFw3TRK3e4h|l8k*0}BREa~UoZ-SB$H8FD@Om^BC z(-&X&m-p(`t5M%o1ujJW;Eeh^v8l&VMTpa_>CDNqu6}vG><5?o&ksGrpLaX#5xoAH3T+8b6+IV^SskOeQZht?Q-tF+8$i&>5xpdi5)2wRE@b#R_ zqF-8GT4DI*cf7*pYZDijySMMD{cYwqf2XugZ%Q-}U+(z(jVHt6N*M zdG(jLWoBxA`uv&ov(&2)VsUlORPE}NW`mQ(N@~>Z9yrO1aufC-(>wfhrD`x+^zE@daYr|XG zIoJ2@%Vcz@b7Z{q%2coSYe~5L-Cd=kJw03U|JS)DzrXQOxM@4f@9(d#KlpZL>iV-s zj~-qceBS)PG=eCe`+HOF*T?@EY1{zpeu--Ok7VUDn*FmqzcuO~b3OaJH)rRy`S~txZXC;ujq((XwY{JJo#3GovAvENH0`=-)vAXj%1SJ?HmY;2 z+h1Q_&mG6yf9*qLa!AUOgkNWFZr(9vj!s2TnEj13j){VYK2M!Bt1WxwN~`?mkB)j* zJm34>@ZZt@hs!tbJHGI6`_#)_T_ST9zrKEX;+&eu?{nEUq@RyFSW-}6V59q@xKV7~ zx)+lQ%nN4Dp51=s|J>`$?EG5K%(JigtY%og^HXW^iKj(R#6=V|U&?ID^%vo3TiAQx zfI~$!xAi66ow|S4tooN8_G^#f$~+ad+)(M2kCU?X^_QIh_x87z&#!y^{$GB7!mf9- zk3I8(cI|@=;r;ryMBd7Unj4l@^>~P~9XgT5D_y1EbZbkXkGG1@9IM)>)uns)?wJxN z8@D%Y?YZ9*b|kA$TOZNszpSpUP~XSlQQust>E)%RuE+aiMJ}iN%|H0kxZFOwq^vBg z$}3{}?%mdhUj6xdbbf9tM9xK^)0)9 zDQ^gSVX-MFD@$t9q;oH~`2DRtabEvIW^Ha{b)})}zYFb_pF(P9o8^m@Y+Kvwee$G5 z<*O+Paqr`7&(52-^0l7#j=E(@@ZLGkVX03}!3o}9B_?XE5j~N1^Y-oJKR=#-jjR8` z%+CQD*>Cy($~N?}it=MNvz$9CW=!*1n(_Ai{RdU0^V{z0=^lM{Hd^Fz;l_sCYX&yQYN~pB7nyLizRA;-aDnbLT40xV|YaJ_{uGl3QH=QCa57u-p2R zJq*&{*{uD(d|LPB?gT4q>*(hSP21M&+yk0)-5p;#Q_25ocwAf~tNkApiO8_YlO_rM z`El9l;GS;}A2zjXKl3?1rF6P#j6E#PiQcyAP1mhFcXL&J+rFL#-*-BsJL z^0KAdkC(}BH71$9K5n*S-@aWcDjK!>Hhp=Y8nHJmx7pvof4*gNC3l^`8R-lA<^M!& z3)xxI&iD4>^0*J_pQo+;@pJlpDVZdj{RMssE2%S z?|ZrIx;ndQ>mydqC@U`xw(MGA_3YI3UqYQOUa3DmJX8h^^&k5e+Azy+hxnf#lM~`9 zDrQ{Dh?KS3BJL9&7M65z(R}GYZ;Y+2*)K0UE6}5~O!xn_L-G%dX7a2KTOYWKjrVDK zZbUIG`AyMEpFHWq+cobCe}8-1c6qL0@XO;*Z){A~QL_!c7CWuzug^jFe2vMxtxs6J z)4>Vw8?U}o%H3l&A0_(atlNTg=QmyX`shcYhv&{!6~WGW(;t7g|950x?Qg@J8+%{e zSjfC*?_NcrPKAjc1&`g-`sQ0SzU{OQh>To$qc1||*pI^VoWH6Amgfct*x1;F?2{E* z>Uuy~MMWYnFHfs|`t>XOBa%B^lze{e=dAetm!I|E_R!VWAAr^f|KFF`(bLh;-_QT% z&6|Lzu(m5#Lf+imEdHBcMkMF-;ls?y^D1JJs~*p*7Sq(!Y?2T9|L3>9-yECH-|wZ{ zZk#jBxVlPomU({Pr%y#GcXl);AMaBxJkIB_bZS%X*BAGAnSYtzxw&WOmv?uCt;_EH zZCSqP(YyYgb$@@E{g{?e`|QN^Uc;Ohdw-N)&pUXcX!iCT*H2GROBmKzC@EVVJbKi% zP-kalrA6f@5wn~d8ZYAc8RRM}wp{wQckiAHi>u9L?25KCzgv8~@9|=PyQ9hdc1j=fmW@w?aJ?1-p+pL(4h&FCM}xr{rvvj6Q-5L z3T`;JqmcRRY}3P2PEOu(Z=Kb(n7E#~_FoeFY(l5UpPp9gCTrIm9$zo~{k}O5=f{s3 zcXye}$owmxYiv~T;)CFuKhNWrn(vgWc~DpK=7QtZXJ@C)Tlq?_INmN@5VkZ($mxX@nCQH$DdnX?kIho z=e%me1_AH?acxWgSD%ej5z4HIRvXr~r*^wD6PIUweS4dId*0okJM5=Uo!XG~RccMt zUbod>cbC4s^nkylcuD%HU8m<H-gVyh_&FwkbmA*bH^K6B7K=D)&@~Qa9ddE0r!@1Y@s?Q7T`Si)#OIA19t7_S*-DfKQ`kb9|TuLaZ zGBs2_=e0?kM@Q)sR_`?LuM&Z^HOf64rj0Eh&)fHx-~aFM{9-M`g3|1IpZVV`%ijE9 zmp01_`gt=kHff{8-s-PMlKbtL;%%)y^z^(~@}*>b-TlN_F0QVcYwzzY?rAgSS)F@Z z;mjOES?jWQM~?ZQ1JAdDyN2=Z%%kS6qmb!9>hueI);Bm)1N8?D6p^8vvpL=lf zla7ZRTv^Tgr>}LWs@hd#r5p407Cgrb3MKurVP$yw^r=Ai(Tc=B7DtX9OL}>~URm4w z^K;#U2MvtqIEaPc3%ektkb@CeSeI&{;)f9|DAmkKm3C9khf zU$A6}#HCYS7M50rPM_w^y}iw~BxFfslf|@kE1zcXjOpv?;hAGy|FB+JPi*m`MNIGB z<$3O-~ff)-bqwlw8-OCJGv6o_#%fxJu^rN}!A zp!;ar9c3k@OV@g(%|Y$Ql+?Q}b&hs#j(+>_?VHo_KG}==Z;lpm^zIAfCpr>-=NVOX%FjA}~I2NlZYQB`2 zrWd_zMxMM}U*UQC^e?5I9XzVKy1oW~FE}f+ID$60I44`r=-)vJNmfa_SS=y;n7ftHf;t_aevuM!V+iTo+kdYPv3VciWd9 zo+;C&9XxrG^I_sb4nDqX+0{FDR(g1Pf_6@=TD9uIt5;0={`y<;<@xye`J3N=FedYxg%_^NBcHb)K~4ue~@_HTccE?Ks0;f@{4)?QoGs?EgAd;g!= z^kqTkXRn?!t7+w@nLAHST={C(?3*_|yuF?4>KIR*KK<~~Bc}X({gO8q7~j2h3%*?#nB?_cf#|YfT2NN5;LD^jNN( zeW6hFw!BcE_#Fj-AHH8sKlfm>{<4)Z+y8C)x-xoudcWL`@ADL;uCw+O?VJ zEn{{_Nnx2MXDz0vcrfaHc5-U^^MuRKbZ^u@V9?Uix}x{|@#Ee^=k}xv3mOXw%dTn5 z7RMN)E=JW{D=&8Da#b_~sQS_lTX$*3@#IB|LFaWT=;-*o{=5GDt*zM+`xAxx=36k% z^jTK6^TLI)9r-r`zP!3AoU}3GZBeP@rx?jD!%xTStG^|kzqhyR<(xM%OH;30O?g&_JfJy1&-4*VFiOYkyufpAdF$EqnYtBi6XMd0NxAF8NdS>4|2}ydND0A zdf_{JB6QrY>v2k07O~uFZFw=ZZ{w@f(Mq zs7q-xw&wa?_t07kS|+(M@v)kSnAobA`!{b&{{8js=n28YSFhRjF3gv{6?E%hTT)Na zE?YxE_ddB`A8Tvt$5W@rUDAB;<$itjhV=V(N4Ly9!6&S?XTcYTTSDLjr}@fiXG|Y6 zJ73b}X=^>ay@Pkh zm6fd9a{Z62yZb-!P`CbzKgmwem9E?CnvY5Qto_r(v?gw|SoHSXpP$#0a{TWsEWEopee#Ec?(z@c zn%{RRDG^}+HG($po8K#KZe+Ty`rjYcnlC4pSG>JC{o+<{@wMMV&s=sV()&~x8m{h>q4rks!gBvmEW)HseDv8cYEotGm&#FtHTW6K6=w5 zV0utAcz0z%#9)==>A@m}Zub+ytl?pIBj8ou=KoSA98{@}N1E=mW#9dUVcYp?X<`SpCvY+v#X zd}CkSZre7ctRPu(^PF#QFSARV=Q`Ha?Mu3MDs=USFTu%My|mTM#rOaH$iC##?(cIi zE|v@W8QNy~8Cp>NX<|Av*IIu1q{-4T-@d#wwy6EZ^G@1K#J{&z$gj`OYN_kA(|_Kt zo^;T{((>Vxlfg6WKA&c5PAK(U8gyp%euvdw%imdnM(07RYpap|J!nKcIw(ytF+F{w3au|yK^Di ze(P;}P0+juXhH7t&lBg*?|*5$|H#M3>RY^y&$*s+^i(L@?}ck}7cZC=qj&s${hy`5 zzn(sQI>Rh^*|nc*)?K+`QuF6!NX)*P$mgYuhv#YM&a|$V==M-KG~r+~>*uon+uffh zvnW(7=4D{xd9nV}%I#a{d6)XkjQ`Bd_2H-Z<*i&zSGQN54g>q@bJnV=o%@c>@eaNo z`D~4{Zz2B%wmWQjTVQJeK)#u8D?ZyS|DvV5_tL399v+{+q4M;#Ht{e;U0vSb<#p>y ztGQQj-uSblKoGPuA$-=dDRjIeUA~Rjma|(@$@F@jRZzaYLD+ zVnxLljkVt|iu^n?=jjQN(z|EhBIU(Yoyet)9! zEc5(zmw6A!oT=U8-Y4hm<;B%7>wFv=pF~4Ti^Y$MYG9vKlNj>z^Y5(O)x2ekiHh1gmnyfmq`RPvG3SqZ ze|Y%&{mU)$Z-I6uuX+ERmBRS zqenfwtlDqfI2V<_c*hbJb-y_xpux`hmx`{{>Af~it($uK=?v>~JEP5;SU&&#``7Tx zy=nm=86JOq|2r%9H2-O;k+H86s{Zy)wB}#khYN`=?(W%pz|ENThR-iuDV=8d+9UW5 z^O~ctOtTB#{3txQ=T@GBlCtuH*N>Su-jLg#fBnhhyZ_%hrY$pAu%Y5)5DWWu*N~JY z*IrJWI`!f0$jzc}bs0LkVC#q%WYjNTo}O_3AG6o|#I>>8<>t+s7gakggU@&AJo8Y? z-mab_&HQ)tIlh6$kZVkf*<@s|mS=x>zb>|^UFz&?^W)z7zHNK=mf0WooqGOEXrE8u z^{LaQCH?v`Q)A8ceUm3E|N8p2+i$Mbq1&gql_tt^ad8*C3^D>OLf^E>h~dD+B5BYP~yA>90Oq%DRa_G2x-GvA0 zqV9ciN7uZ6uCXlHy8PJh_j?x?$~v#%p7F2ZYHYZ?eEy#Q@2oj^ctU}*1EoS)v81M_IgJeo7q`Er`LYxWs2G!wtN1sh|OiPVe6uFXNce4 zX&hIRXj4@i?OtV=(J3BQQ7XLDtI@dJ%lqqw=ix(O;pT7iiWLu6{xj+*xO_kcybgw4A-)fwGuSUkE!o%?H z>Tv%(zdm_Kt>153$X@sVvH#JMiVBHkwf|;bDq3bYegD62>}7B6teheD`-w!4#J>e$ z$3tH4EPTv5-|gI7Tkg8LRqRrR>2vb(GQ+>`P3<|nhzI`pE$AOH|x>A-+2#jK5w(O z=;xm3?H{h)e$VwQw&r7Np;vyv_0+zaG|i_cB1-SxspOtg_nzm)eSUviQ!(8uUy{Ss zCMNv+Bzj}xXZfl1{G6P}rW-HI_L;6DY~Q=ZX`h`PXum~PbArR!-WBop?S4FY%>VGg zg9S6wH)j29U`f4@v-o6mIo_|e2);`2GBt`+T++5h)rd))lD zGn$slTk*;5{euOSvDMYpJ{5(3{%E~q5{YgJ(DaAZ9ZfDXTiJV(co;*qV+h))5 z`rYg6;-FQ$=h}4_eDmIRa|u`iiTUo|yXM(yUldD@h@VPEaLqp#QRTlBGj{lEkE zr#p-19oVrkxuoy=<2QGB{B7*G@9r)YUSogd!1G6yl|O$xKHu9^YMkzK{7Yu=SH6F@ zmUs%={5bHp;?2eX!fWh{zv--tGksHBd|*%I(tg{i{N7S)%*0N7e5_vLH)qk=eSg_m zPT!Jx9dyz=cTHfNe%vmVh<9Sr-R$x^;@|u9&YL%{;^k5C2T}PSe(l*)v*h)QcX?~8 zBITVwU%FK~ZSR$d(|$=`hybPk4>KII>exj3npP|BKwqd*j!w_V(CRC=9{+m@{V+`96T z%ij2xj1BF(t>3-88=d@jNvH6`_v`;=w_Af|aO$#}XI!g4oys?RJI7}u0|SBLwDV%N z6F&baOcs=tRgEZr@*=SJ?VG2we*XNGbneZ~MfR1~m%D#|Ct*}k(0u!3ijmJ8jWxO`e`>U?k@2c3bJNd)| z$Bc`MSe2BO4RT%tSe)E)ee<jl7Sa zetddr(cGs$`Q(Q`#pgTbwc47Pi1?qGr5aKG=!j=ZYGytp?zZjlcXoC%`1(+@sWiU+ z^V$d9$qUL3%_@HW?%RzI1?9)*-1L7@yK-Uo($h27zE}3XRyx}}Ur@*0%}v5&;)Nxh z!e8oAoch`uH@KyJSkTCO?$@Hc2MzzE@=N*t*SaKIw>mX8e_i&QHS7Mi9XoeQmVoA4 zC9GT`PQJaD9kKX=)SIU@sYa5&zVG+HvhD4yt(R|n-&gn7<*l@olv0G=-pb$@CRdGc z4HLF|bt%tEnwQOqi zb86@RuNxs}k%^eARhz>qL(iZ7b+=o}sPPyQyndCR$`G>jZI zLnn3*$Nc(Vob%>bvrks@bGW_j*8ZmJsRtMmtxsQ=-gvm3*A;ZM)bB5^uZzFElJ+R{ zf6~!uGE3)ee_Csm_eR2zL04a2es%rtwRt;t?2xek`z8LMoxh!>xSX8aqRV0Pp;2(P zR8>{gVx`%_ZpF=7%v)1ap7p$3v|au8afb+H&uZr+5L zuWi1edpADzDOG*Pm3Mz%?DjjWrphPn?vmf}yYIz{3>%wNqqwSvl{Md99{=%Vaca~5 z?bEZbZOIJ&^5){<6^~aHmzTS{xVT@uZEb0}Ff{w2$(^TNMQd-z_3qb_P&Uxfx$=Nb zjKO8~Ue{0!5h>=H*GcF0WOeMF!k_)}{(rlJ%??3DMa{;C!otHJA8>rw+`rB7)6!|v z%Of`LSyg{>clrIggA306y7GSA;_j`lQe%5gdS_pc{1)II^(o&WS!wb~0f7r_&1}3! zo_GrL-m}*T_;H|qaY)Sr$qV;t_b3|8;Cfdb1rV&`qk3QHvjbRD<@BKetv#d zm}k=d_O{w|cj;-GNbno)={J`GaTqma{ z*3BDNglMU#tG>Q@_}81KHLuI_vpV*48r0g^J=%4Gso{?2j`f!5JHq}uEht|f=TmnPLSzt9U0PmJ7C z`g+=n+P!=B2nZ?VZ3`)lwJI0VS-xb6R7s9^(Uhut*S=@24y&8-^~U0+()%^PWy{{( z(w$LjXkZ|4dAYBtR&GP`6yxA`ppvAsv$N^xySuwH@A~m%@8wZGz4=drPKv3ZthLnD z4%V#SA9nBF%`MmP>GNlnShdTSF0=kF$;gio_bHtyDA=_9cI3^QFD@Oe`xSTl^v_qb zyLKvmRd?E;`n7S^;oF&Z5wn~3#u#r*{?eIvX3O`a*Nt0D66<8GN^ZO;><`JBczKgi zVQe-mgnXUbc#hpHe*S9O_xJV6uC2C#t^Q)pN$@V9^Z0c%FNSZ`{>W>Loa`U7}Xk%4KQP*Vj8L ztXZ)mLV)9R`0Mh!tES5PEWG!2@riS6#ZzznjG9yx_v=^Z|5InDJihU2mT7KQjkEjQ zh55&MCQhHP9&t`zspa2G%<0Z+R~$9PtVK(2j8J4r-Pd`^|$i8%ys_O z+ql8)$dz|eujX$KTh%MLG~o5=_m7lh7F_u7nDcx1`>xFFAnSPVOD9f0oAxs5NOszc zPerGD52y6==LhM?`_48y`oNKSW8vjzyGq&l<*rF_SXaH-vEcOG+P}YE$%sUDRc3M* z?Ud2q`@v@0->tIQ*VbMBvAYIz;G2+;(1ZyS8hU4&9X@=Rng5QxoN^n#^W|l}Ti+$G zt-3j9O>Da7+P)l~PoF+*OnYl3V^tIJ`oH#6uPM`~FW$2!=EKp+n(-GScm2)P?h879 z`*iKAcklXkZk~T&Q@_37n)R|B^;1q}ZcMY>e6%*jlWVKqtYu%e6}If3s=~*d*xRwP zSF6`>QC7?S&8zD5a9$&-awtzLa`&CJYrk?7TPZoabHr1G`o>J^FjZ*%6n z`Jb=adDtOBIq8+O%2C~i(xT6w9s0O5CMJeu{_j~;d%Cz1S+l)L?g=d^+c)jWr9GCf z>NWCKZlAj+tu1iB-updU1uk9;H1qCX>bbRsg^fkQNNG`C!IxLBvSh65oDAmHMny>l z1qHGGb}6}HYdk6B^QCEb?%XlRdg9R|WhpduYUqg*Cmf=xtS();G-1MwmMK$2dLP`_ zIz>e1XMv>H-v8^4U6;7FYWmrew@Rm7dFA0gZPKJJS8uy38pjtZD!#b6nZ2orDZBZ< z)`CTwgj`)+PnsfgDW0!VpFBHjw77otqC@}whfT5oRY#Rd%R{g4te;m<|9#rKrd0X-{FL$>7%Vp(&2ebzKFJ-op@Z{9q&|I<`G-qz@zynI^trln=+>1EHB>g`Eu`}pmnSj_Za z$t-4WL3;Ae?RSzFy?qic0^olUR&+a~J1^7-3`c5BzIJJvNde(|nd zQLq2!-`vG}ch}KH!9G0~k8gm5LjC)^dm`qXO=hk~zgf0vO7<~}m?&Le7i(N~e|BoB zhK>lI$_hJ;w19vG36`p+S6@74bO_pHu=n4;e`?xbycnTSG(6ng3_Idaew4bf9tfX4g|si@vKi$&*uw& z{lLd??_OL-pV2>VrQlolQmJ)X%j^H_6ucf3^lF-Q*_)2*ag~u9&Yqfj zf5DzTcU~k%?3#1)m)$0n;%O7Vl>C#;&;eBgn>KASUGz8U=+UE`({BIxy*SnT;Td_^ zTieBT=Gzq?TanD@kQgW!boJkYTeoLttem@EwY8mF{#4J|)3att#q6KAY;(T-`k9GV zB?8Z`&&}K~t*tq||Jm8u$qxVjHI=siw_{?ksDH?mccr@d-t&9a4<4@j-^~*JG)KSC(fSEu27aW+PrB(e#-iu9Xqs}QtSU;lX{yUT{va`%x(MpCr@6V__xje)wJ0r znN5|&>5Hqs=Sdj-csKoetE=mehxYbTwKCq*jic|oPh0Zu`@172gWdjLYvmUA@#VY8 z$#zI;CNn#~*`A4F)!*I->y*D1TfNcOXSsx9_{`VWFAK=ePq^~&Redc3!@`9NKNvj_ zekmo)c0*+MdfU0{7k78|iGi9nT=(X5mOecdy64v~>57_fF*Uz#KDVfPGvkBBo;0@3 zPQke8U%v39q@_y!vF2)J0!7%zkDOM!S#L0}oZjEa%*HY8`&;{lS+k^MY&7PGW_?)T z$op^F+D}2Xb5<`}l+@f;`tDBUVWD(ot*KnCuC6;OJ_`N2wU1f)-;c`+{x&x?nJlZ& z->dmXF9kXMyo!Cu#LQfpvvT&jn;(x@Rh-!I_xoFWg@||e*3R~PDX@6s*5=&G`C(yU ziAPVZXN|w(S6jiw#LUFN06N>Ee|!1e|FZvnbAXz91-IU9fOg9lEpACw(be_6@HTwS zp+!n_?250&oK%udR#-Ff=AP8m2lMwlezfkvo~V-D^QYw*#?71e;^yM^guD8y!(Pwb z={0-NqNJQ#dm=aF-MFAw^*wOD=F$xTe=MbTuh%`lePia`U8YLP$}F$L*8jWv;AZN! zyx-goxyetDoD7zFtomV=H^mP61b?%^J z7pu?9HD5~CW@Tla@&Af(#FiAzx<4=XgO0N~7|&#qt0lu0_BVeaQcVnXHIE58@-K#ZJPMwtQwnhb42Yzva{=FuiCgB6u|$!{eIuHAo};Ww}xq7 zR_sbOH#a{s^K(nW{P+L=GIMdY+!Z;x2^zS6{zfY+Iax4HSg1dPA>nYF{oArMA0rv& z#9p7&RMmY^`umaq2skHTcu)0~`~5nF$mGhYgC z)t{~}?sM|>!*_kZe|^2Wd;aXzvlA@U)!o0yGX;O!diAH7+v8(>f;#a#Dgo5C}`p8-H<~8=tHoK}D9u}swz*ly@B$8T?`3!`Ic{yY;4ewZ?BbaYy zAv<>LcyV{TZ^MWFi9sum+$w!-y6DrbO9`j;ZL_+6Y(;v%oYegF|954XUR!(r!h_pK zi=Ur=yjoP7^)(x>OvAOcQJFcXv(sky%}u(ndHILl_vZKO+TU82nfZ6{7Yc#!a8rRlZsb${4a zUSI#(_Fnw$@*7Wm!gifVF*?{R%phZ3CS(8qQ+6}Ie`;!K#KNbn)3-_9f|kx}j>Wmh z_4XfcKW*n0RAiJlW!j_n%I+IdUK(B04|&`8Yr0%$Xy}i3yWdN{xi@X{-rdYh1afB93cR=0+i4>czXiij*J zt^TSvX}VtQv2U{0Uzd4{drvj4-r2A7bl$zaCQJ>d!|QtY{{Chj;l?NbPx}9#L;IL( zQ!L)DO)T;d6qKDfVFJfguU7BrdXImK#~+$;aq-2?>HI8gEQfCHl+3%ktMzqerbX2k ziL$r%7GJy|YhKpl7S36^S?;gBimEE7*0sCU-yVFKX)Iw}C6cteta1N-`&p)|ZR4uk z*!+``I)^QzI)@$=S5bzvCT5g z?OOiKK66`bZt1?>i9TwFCl^0|u+?0QBkgSD?mXK*S^GZ2#qNq~R#N-+?JFoMa*C|9 z3&A;cku9}7`@|ZuggGVP##Id09hGLsziw?Rm3|~FRPg`D$Bxdv zrrFVNr^{(g<*NMo)1vs9j#=KFmZYuXiIdg*E>!VkUpxIQ<*n6f!|M~R%imqA;PCPG zcaOOvdU5m7o3r}2o4?z;+`LbAzqQA&&dJL+e0W=Kkorlbq^r|$bJ|&kD}L`L%$(WU z+|HNyeBIsB%_p{HUOu+Mu$f^&>FTi3=9c-^<#Olueh@m=BiAZ-cek>F!h&^w=gyng zxA=Hp^7VJNQt@AUq^;Q|3jVr%|JWoi>l?GazdUdMU+Kj?3AuZIkGXIEdRH)$6Xr5H&*v$qt_-?MYUx)`mgUNyh(eh01gaqE-l z>*y0KeY@b%Bq0?wm89qI?(V4h`EE&(?XGh3%tsuX{{hgh{ z&+IMzOPUK#J?V_tR5CLmHmGP*!m9gqwOi}6av^2OiSy_A*YE$vHBIMlz=vnLwzkao z>%Qv;?tl2^O^^7zdNDaUIjijtO^th&FIN}a^HJ*F?*zkBuWH%mPnpy6RC}M;S81b} zJjKt?xa}_cW?lS9Hb`H-nT_v?6o>SxZ>*Cfww*Zr@NnCs6BidZInJKyrMfNWZkulO z_Lq0dkA2C^VD`QRTMJ-O`fH0b%OTLh{!`xiNiW+^vuv(XQ&W3*`Me!_fb@-$vNE^G zo4&p5=d73c%xk%^ZWpr@v?~;ryiQq^tM%L0?Rk-ws>^;Jx0iFQaa#1?o}Z`Z(M|n! zjWK%d^XKblWn~3KL@fCzWMN?;;eT#+v-!Q4j4K;|f8Wo~%F0?A`|;H2(;Lg~R;`KM z9(U#6-s-PgDg+`yCC=UD>i%5JZ3bJR=c z--B9{+*?}?Zi!qx=jJE7O>GAn820=)^!dk&$NsD@`}_R`Oa)ykDy(h3y|9JQnq(c6zL`hNfN@0%O;*|#aT@gHBUzn>*N zJ^fg^Tep`C3b-B^2?`!5x2MsIO zd|#9Bpx#i;=8J+`uT0_vyKQ1(VqM?wSBF1;6PpU^^yplXVwrsU=?t^4i9T~a1T-Jt z2?0je{h$l zuzH8xy)%-RSz}e!$NLM*p4bHGrRi>r-JSHX$(*OIP*_s3(LApHtm5t3C9?ZDvRmHC z+w)z#7zk?T99%x?{CL?}-Z=4{F@1HlzY|V9 z@%(VvNMQTk$yq-qoJ`4Bc5Q;RRY}JSam8B^*7|$*?D+ti6?nVr>y3@Y)9)GjFflWI z=yy-E@-f#h{r7L}$B&zqS`>UxxR(E8@xhzNQj8?4zP#vrd3l+X$c;^~s7RKz%y}WO zWa-kx>+fzkF1Q;L`|(TgXWn;ex%{A$U|$|T{o%9z{znfM9@&}J$UC%OiF4x zXrcbObLTjCctmVH)@%O0m-zN`?wToHs_SBQb{$!wl9H0P=uO(&=WleQb{sr^p8xIb z?d~NZDlun2OzXVvW3x1<^Yrw`6DG{)II~7)%Jiwu&s3Ucua^Gvr$$grtnI}Lj~%OP zBcGgD5@Pqv{wohxcNfDIHotwp9u;q%H{0~{rX@>Qrt8JJIVCA|d3yx}1~!W2<#BLu zIQW#9ELx-_yYBZYJ*}x+FJHdgQDXV7-gy6A2Uk~C8=E^1U%u?Ta6zEt8_=4ieLuhL-u1Mu_V=Tk>GM`auUom&v8IMe@Ay$gV`Jger%xwX zpM3c4o{*xVVn<(>Q$)myO!W+F!?Zy4}&xHDDz#-7ydyPGx_8}mro zoG9ajXlC5UrlzEnllb7@0i$LYIGqk|Q{ywm7qKk`*(4)t1d&A>v zXC^m;7xJrY6!md&xzceWW!L}p(K$NL&duf3_xFFT3NpCkMBj-nuG1mg{6KpjX8PyF z$*qg)bq@>_T(x>NDBf3`@L*wOy=9f@;=-q^smXcVf6kg{K2E-4wco#PPV8D?m}IHE zNe3JlVDmhLEZpFy;(IcIHwA!J;=8CI@1jrvdj~A;G70GzeF`=B=FDYKQi{#W%32Vj z^?KUeIdc@IpU$13q;xuHWyp$k>()i5%~W?!@YxxYe^tZu6TJn^Xt70fP+^SSf{^ot+vwT0(0;$G_g({5)rh((hw` zl$4Y<@j$})#G^SWw`R}v^ULYWIt-EcrwY3GK&iXCqr+jgSuV?K(4>Fd-l|&~uHSlp zy1KZeNXqEU@6dVn=&1LP(yy;}J?)dVO1PHXe@oBN#f2?FHZAVlxw9J{oV~s=>uS~! zbrmIr1-#2_{}}wKsm+~hviry%q5kh$f`XDwjRs1aB#!E`1_cGZo@RT;HfOqok`nVq zK4W|P_;{P|Z;ZG3wH;2V>pWaNwWEXQAUH{aBbvwrzZ2$I6`pqQaIQSb)3lYn`_s+_V%`` zy2p>k3jX=O^YinM_t?8lzP&DfzgNPrCZc)2e!kNB-{pm#od5n53x9ieyM5Ivt+ltS zD=Hp<&ZSu~QMo5?LEP>#-uk>dJ;BTUomYmux}#^aN7k)hs&ilMF9*HpukWneXPkaM z>GQO;rKg?Sc@Eb8{l&y^Zk~1f{p)K)&oqU`PuH9KvA*A?X~6=AgTJD;=RG{%JNv`+ zZ?Y@athur)-^a&9Zl)n~V&cL@mooV*EqC77RI2^Yu1JKd)#-Ve-MxDfHWdOO>%?@U zI{wwhR;~MY=ovpj`W^YVBwjjO#o!iodcHY+# zr|n}ub5QE(w;LaYZ)_}1zgx8ZM#LTax|rtQb1jR-qPOKb$J`NJ5u&yB_KBxOpwlP$ zZ3^sfwYHl6navl#eml4>^7D7;L*LkLOS`x%1Jz1rmMvN0ve+5YeM^q3t5g6C~)<@56L7WFYRfQB_nuV&@k-?;f< zFQbZj{NYcc@yV~Z?f>xQ&rc~{x3@2~MW48DzY%fe%9RJp|Np!5pin<%M~At%-Vts6 zy)EbFS~D^jZQk_Z=JWq9Zf?u&)#}Ih9X_=E{=v`ZZJXn4tGg_$A8Sta%K7ow|If$g zZhLuuTXS`HZOHq}mh(H?8r1u*{ryd_R3^6a=U4Olpk|)i^7|5?@$FBipYD*7zyDwx zXy4h+;^&4{S3J(lF_hIi8|xx}{Lb?=AzB-MZNI-U^|jet{%v2UYKz?1k!if`{f)-s z>1PieVEoH#b?@qr3Z3|mrk_54miD<0I%)xQcA%0exdsMqd~oOY*SFahHkNL5 zkxg4$eIVqT)^=6ZL)qdNmiaQ@p8jC9sCMDYOHbMAqgRGJ0v(f4_J;*D$tQVv`Ac3e z3n$qe|DUP7_r<&4@`9=ipTyt!?>jqOiV6!4-gobN@YvrzdqZH<{hP(lHnh|h6{&x9;ZvFjEmzVkaTJ78TJSH--_5A;zs%H5&vkL0M!@?4u zUcaAk`dTh;{vUhLYT4iNI(Y^h%j)KU#wh=?^GQvyi{A9rR$Tp zr1uKcJ6=C+y@ADhnVo#wO6qPts=C2-TiWSc*tO0MpQHMRI!+{}q^5GqZJTYL->2Bj zuBfKQHgBFBXh7%m>Ejm{A1`>hX~V*KGiJ1`z5Oq1gLh}p$|LIY>-v6FBp&|cSH85P zqYrdjL20RJ-jsU|Nl8L{GBzp|3&J%-KpoYMB_|i{S{IWfV_zub>FLRkwR;Na>Ob46 zlIHdO{94+pC)DUl-rkn$o);H)*G^PaG~(}VsV7gLUp2k)m_5$68npR!`|5mU zQ&UmvvNujqRaJNQfy#P+`~OX>`Fr%NdXuhRx$@xh`G1|<;(A=yPNx`^boaXU%iR?e zxWIPq?3}=L8tzq9Y<)78T}z&%9Q;>AA>}uPvN+>dxy#KhJSwrMMXK~^Yc%n_-SbA9lE;u zqea07fm5eXGcu_A&1>rJ{-K|JWoFU2*Von`KN-B-^P>O73XO{D z>V;7&UE=cO&dsrHPd?s%-PWQ0|N8pbOQn}Az4=Q{;PkbpVd7K0TJ`tG^qpCwbMTj0 z?yUsSwrXzP*6G{D^TO}CB?c<`&9!P~X6NVHl_6_c#WUBs{Mdwp%`UQ+C%#Vbem-4y zUAykay@~r%=XRWs0d=AJK4!Ib$ejBqtp4HV^Y|;e$IIS!na9F_lodrs!w+M>BHZl{dy*Ph**^Zv4dhCepEYy5pY z`B4j}75iV%ROz&}w>SLSexLRA?()}d*W+p zLTzTI=AFBDkIw1Sh_Bn~q@2&rE7LI3IQ@lA@l!6=y5Dch4_1VKZEbCRbXc`}>%aLs z&sl!`Rl4WjF{XplrS9%7J-nx~_`yQu`VcMAvNv~H|Nr~bt+3##o(_+DSvq>wPr&_XTserEBPNc{yzR%Ctg)m z^~am}@f=Ltpgk0)>+9B)%Db;z)}d*In`F8c^XRrQNc=GI3*YR}QHcw&o8M?Y{^FAMJ zZf9}auwsSBo-dC+gO=*%CZt_CAvnW4eOtocty4r);&(4A-XFXBdj`wFWp*~K{pYKE z-p{aNWX%0=t%+5PlO?jr_Ac|U8^Jq6%RgRHJqW7jL2I3>m^J3j1FuwO+1&H&=~Lyq z4SJD%QS8xH`*TWdb9&$M{?>l&;_?jC5waBFFE2kc*E;&j43mu;V+Eyehi-UR6f@`C z+wD1byI#G@I`|JX=QVfRMCCSREv=vpdEe*lUG$wDw3=&C@BaPwa&7M1E%bkXPwKV0 z@0=SCOrD>eZSHQr_2Bl)m(TtV*p&G>>>%^*_3QcP)xVS6+xz?1pFe*-9Qu5oQ*MKi zkhFZ@u3*YnD{b?Qhc)V%N{J{rG_Sd$-lJ&BewxzrO@GwP#hQ z>VJ1|ezWvWR&YdwNzHE@&OB!^)7ZS&w4WCNHf2|Jy}&b?ol4CdZ4ZMw0JdU-!SVZ{b44rl*%?o4dYM zZ*y9B;GlCm%j>jrGx9F*L^-@Y6X)E{BWCiZ{QceT>i2uyzvSEe`H-?>hl%-%9mg~@ zH4mN)Ue5ZOXRfTT+T_G%JufT1el_>;>Nb47r{tqjO8RpJMMcJ+tgIQg!+uNG#j^42 z;1}1sC(G`Az1c4)Nazzc*Q;r%Mv`(fE$=Rm+jQc3BG*}ivs-9MjQVz)MGyO7R( z4c)7|?q2<|y2-Kj@F6EbDXFXkuEvb5=3BU0ostU@V{dKC<<_^otN$wa{kA9fcbV?l zyVvFI>VFQwq3`$jik3gsTD5A`t7&`p?76TzTz_$0_K^<{o1S`4*Xy3QcXj6FWiM_n zZVxZWzA2Xk*PN^a+4`|s!BVW6aBB{i2X`Fy0>WJQGqyllKu9VaKNN$sf* zSYS|4wm9TBb5YD*cC!WBvO`~A`?X)=LfV0be`)gZC+56)Dwol*cS>~ZmHlQncjxba z5$Sf6g=tIS6RR7Sex`Q6PV~;nzmu8|P7|Pg^6j8=hRf&h~W!`;P6*VhiXY}@UQQNaS+IL$YI()eI)^#bkSE|0h(&VVn65-OR`5h}` zS#;%1^3uBxPn2$0`uVij^~2L{+}i<-#|_ykf|fk-%u;#fClvk^xr9sW=<3F9sCjWA zaq;nKK`Xa@Id$qtDQm{PJ3sPj&Ye5w_CDM1>vC`Q2EMnx+z~ErE*$%;PMkXDHeHXm z-!r6sL815Q6K6zp+9f}x{pb6dr_#3JiskAMEsd#O7r!^JW1suxP0qnh>l~*Y<>2LX z44U*!QYH6n+`GoM8{Rvw9zA}XJ^6Ugv1w~>zq&Sc%9ID)>!%(5t6u))%|&KGL0LgD zsjdSD7&iB?zCiZLg|pYdaU=74y@;S^*X-4a$!{c-^zHpO%!v*~zcb2gK( zXfpM%J=cOYYhpIMd6{_Qy4cswx6_ijzZLPD9Em%%*6#9hUsu08J-?N`sbNu3U3-6j zOMJhtmLV&BMfUY|vWt|I1%!or{R|EHZpxkynRZTJGnOCJ;FmH7jlVEVnLa!Hj%+TE zWX-LMnpckL7Zn=jw%LD`WXiw0%HZX99mj>&L@!J+f2((P?ftDE`}XXqSrfUNubof+ z+OPj!ONE|3eX60aFJALirEHJh*Nus@OpWad(ogN1_Dth@gYuN(tyLL%&a&mfjcpNz9JNx0ohmGv-K9OmixWW%y%}Ye8cM1t9k9N$!;(0*_+HS^Hi>2O3~{lPg)9-k0*Rs&}dQe!@zHz zO|N$N`d6~kUmfd}{_+0&{s$i(?*DkHTR&p!>Md&{t@c;g`W*kpCOGje=oAc=14}E5 zr(B7yd%m`{qpxpMWR=X+?rv@`uXoRutkY*ZvTB6@Tbj?$tfN6!PMxV0H@&yEM z%7F&u81~fenK*ZH@b;Kh$+wCxoj-m%+CZZ!F;Vf*;oFjbt65nOeVoQK_vmRUo4q!y zsmG@%_y%sQJXUXXWdFav%?c5Z-@WTwK5tI@jT>$0r8-*hrGLD6w^x;FJ5E3K=1tBP z^P+F=UmNee?F2bGCU5TC*@`xM<|@RCa7uJIfw;W$DUVNnX+eGI)7lXzG6B#g-5k$(x&- z+nCnROSpS>lTk|g^A|UqZ|Tg9-y=8c#yth4O}3zcuB@y#1q(h~CnYUnJ^k{f6Nj-Wj-1BQKGdmyGG-qe$hpFwc%8M7b zq^g4!jG6i&7K{nG?)COdNLbLPTYA~_^pagGPI&CtaYy$4s!f}OW}D@jy@&wyEpL5& z&3o(koFi8f`-=E)6obZ|HFUHN9qpbD8sob0;rM*ExANd~^dC07S!ynw|J~U8`E=zt zaFOF74|0CemE|AxbhiBa;hyxfqB^^TJ$idx^TGX_lb`E>X5jbyeOEo>>k*kZH+G(m z@hss$U9T4C16i-8!!wCT+Um%YFOg0A>$6>4N<`Kee{mFKFw6OI`PJRlStf#fqEU$t z)=bpYT)Cs-0q_|#;NbR2Z@U?DX(;gm_N|p?6w>)K=aQ^AG z1q&EH&#z+Zo~CoO-~O+7_O*4+b#?n3_g~zyazoDQ_|wOZT>ANx<9hR3-j`d=J34$W zRz$P9q!j0^%WHZ%XO7IloUCtYe{O7SdaCT+m$d(uxa6-T%hMAcFY_%uJ$33-j*QF4 za$XjTJU-6(*-%lDadp^#wW|N8PHENbtg+0y%6+P0$L`1b>T1tUb1RlMuG*6D^TEQy z7DZ21y!h)s&#Luq^|u+;k-VS2eihX@9=o$?cIu-vew}cQ4@alROP1{U`1lytKCa-E zAwOPB_Ah+$!f@~JyZdUTK?7%hw$`>g9ygx4v2@1bW0%EL7#MhedAc};++qF}l~)T{ z1jem2)vGl=Y^~Vddc-2IpEGr9za4}6x%b$`dlu;Hz#b(Y`QE-QIu=>Hv82xO(AR|O!yj);hd+M&@!_WaiBsnENH1Ob0# zH^^WEgN^iX}>AI^3@*<&jLl?5aP8Rg~WPox-Wh;XH(q&&Lv^74&+$;%gP zRGWVK#&DHg-bHr@3Tpp?DtP2MiJ-odSU(2oMycWN! zL~^=bEL%YJ|0`FnWYj9mF)!!)#LdNH7oI#LsNM1qC>NJqIU#ssbGbYhH}~snxi@$5 ze&pobQU9mnh>QEdvunR;D@^rj-Sekrj%Bf!w0WM>##_@JCad`wWZ!x-ap~vN_tvxD zmhQWM@5avJ?QV1DPn*}bV~6&lbR#t-p>EK8(F)DU>PaUrr8bp%o;>N{wa+>_cK^O_ zm!F=!d|8{{>ox6McG@Eyy|7uU`Gd$u4$H!m-*;`7(* zAO0;ms-dyt_k)m_n4b9Xwa3=~e;uYg`Q(>+_EnkI&~i z*4zbJ-4am+UEQ)qii5eK{?B84(ps7dJIE)zHzoB=KAe zX${T=L;0DO%T>lwd#k@+;#d?p2~c=tga6*u2^J)Tz8I7XJ4$j4FkacANcc&j1zkG5p)iWoA1a*E!S` zy?xCbA*D%7WxXm&-LGyftnO4N7r>EO|e{)&FV!?ja zpl1U3{Ztl3TE_P$VLFo@4J{V-|2Q6>; z_$%AYGF(1Cf6up5r=u>fK`eiH5R#I@axd7-Mz8!a@v$>ujaps)tkOJ{=OY34F5=dTyUoC6Z&eI zGdTtGA**FPLmH0Axw^YPoZN4Bq|N@{k$1M$g}=Y$&b_@Y=OPoo-46!0eksnKG4~QI zH&5BHA)w~hN25P~POrD9c(LK$gPy8crF)NxFHUaft9UTpa=ZNuFTS|2u=zo^##ftMrRmah*$jPF9+r73x8Zux>-YDi8hH9&YpZ z%AZ~9Zo0TUQ_tHSS6=RVT7EC81E($2r{h4Ih2)@lvW38h(xg;&G+#2 zW>=O0*pvC$vDPeuCBv9XX=1B1G%Yzu!`On>Vcv)|wiz zJ8y5oUE96YGp%QWX1=dYUho%!XS9ekvXdOt_9E)rf(0T&j%1TSIeSi5jZQ8{8I@L%rX?GduWcUX! zUpBtVQuXro7L=dgaJsNiiupDB_T298_p90U^z^Rz*nyUfSXzMkx*aE0d3kwlsCa3# zWa(1Lt@Qx`3ZPY;KYsj}VVMeY<&_&yzby~YfX(uSXnpjZsMyS&{Orujg5uJx39rDx zy)j9lr=z1IN6prj8FY5+#^mFLo7ecfHj9gk+W}gJY?Z=sYa8#TBCgJkj*b-j|W%X(drXHhD$MmT?=A%cnHk_F9QLEg_4p| zHfX{WEYZ=S(g1eTe^f~*BJj06@|Qt}+tFd9mSped%qLufQ0n?`VDNNt45^s&=5G0nkf%TGAEcM1bFbmhxPL@~Hz|Kb#D?rQ zNu5&CSzV@FVH>j7bgFGsn{`A;TC41hlxT84N7=569l8x23Wu~(r~m!C@Q3r=nYqDb z&+mLMeY)$>zV!Q_=h(iPGxz)+Rny0pEqNIk7#J8-*R8q13Su}YavTED9xRR$Ai7h5 zgPDPWK|zou5yVw-+67Xl;#pZ)Ib~|?*T|H^hgt)}!bbdpp_vZVIeNN_So#3V{I-a zCB+pZ%ivHHq0Gae(7$R^OG3A{ws!ZbQ>U0hSQsY6fHiwgpYHBz?6e`j&wsgcY}~x# zAbWiU*cc|LhlYl-{*+^2nB@-QvQM2lb)whOs6Vyc*Lav26uyHzV0rDD!RoDwQVa|? zIS(-~6s@shzbx%Lk%i%et)m2k1K-lqrx)9>bKiTuN}hq?pFLRYX^~2}p4&7=h7bS2 zdQ`4wS4UdNGbn5an>b>ieGh8qNanrK$xvy^DUd6z03+xQzt;Yo;-e$H)F*sDKb1*Yxw0+y97G52>nTKJ4 zvOo(XgUQ0Z?Y?hKmoPJAIa3QA243=0!WU3n#Z z{)J^h@wIg|r;X~}o_3TGnjEkGw);n*^|F>O3C0k(P z)@cfBSWlfgwP?>8om2bot%`X7O1n?IwWj`3YmSIoXY15|se}+>z_c1UqG?cyDeelMiwzd_kS9kB) zWwr1|Ime--jUQI;u{m`rX9*_*14BtnDkRCKy1MGb>@axs>UC>UymyX(+8-tc1_rO# z$jHc$X;V3m?whtkL1(I$>(ND-{fG2H`Nwgec-PgdN1Jx-a(U}CvqM4W>(>bfN?ctd zzJlE5v1`+&O)J){>FGLkYDM%0g=hK^6FMB$ENR{V5?`^RqpQR-UX6i)!D00hrG2OT zw6u~OV`Ft9HY`}O+;>`vQ^>ck2K%=#@PLY!NUcjRS9mO6yl$P|v*{TMVL_gOm6esC zj8<7$xzQVx-Cs<&6u*9bTztIzXK|g5U%!4OO`l?{D%di0X;5Hjs44>}$Df$^>C>kd zA#rkFzkW5$zqcnMf+@SB^oPQlO`D9gw6(foL1mePr}K(5{w8W!eeHMg(w^Yii>FDJ?Bad_9-@*3qzfn^=1PMzwy z{M9Q^z*l~L?(WP!Tkqz=rVXdMx>l@Nqf;gcDtS7$WjOw={QUfQ6Q4=!CTEt!l_6TI zbldnD7#J?B3keN#+qK8$*}2)*72VpWitcV$Hf8#B_ve0dTM|H;-v+p!%DYu65EdCJ zId|1+D<>{<0>xyB&D5z=1Ml@M_u95wFi|$sLKbAo z{cH0!&n**e2@MIE!39bW7Y^#q(u$mz7e86>wlCQ5(5X|8>VblzUkxT82XQUgb0RU~;N%sX*1I=x9s~(Z zTE1qDj+LmUwAKsB;FTdIudb|I;rsw3qp@z&`gCqFD`l++foWQoSV8{0@J~cpTPs2! z&DQ{=L@YckOzdiCXsdO+qMs5A$R7&~pFVvW7#kZqq4=ro+*RvVb$$Busb)UND-C>F zv2k*ttP+ybu7i`srI#gk{-E^bzzIr#n>HD(e|{obAZ((ad#bDJzFi`6ST^M_!TQkU!0U5a`mqdxS zfFgQktP)5_W5cEpEv@LC1$Euc2Ha0T_6GP&T^nPu|ES{(&50n}M543B&gBORq&0$) zCc~}fYdUl8FH%^uHaY|pQx5C4n5@n!1Lv&N)V23ggg}~#R;^jH#&z+bS#xu?mYLRp zgicJKmJ)WB>rm9Jbs(D^6t|>^C2#IqwZ#k^9B)I4-CIp1Tc%E(dQ%f*MnjqQTtD|n zt*cK8ec2L4ud#s~w_xt-jAK2=);LCJP3`I`u}WtJn`IZWzYf3THCF0be9#TAVX8Y_Vg+F3HtzKz2J+Pxe}B)W>yNq6KV%`;|AKvUH{xD91UpPd&GR^U3!n zgT>(F{^Es{^b1vR6J@~@lWB#u+Tb{hn^vgo2?~uD0;i;B%Kcn>#T(rAa#;Bz@7mY5 z3TKplf@G(3Y++j6glLJTE^`9~d4Q6UU$00L$PocqV)CM4*KUY| zI15BfkrK!s4U@j^6->Ow4)Vf+5ZzPzKvg9J!;~%g?1?Kw0=q#v z8)_n_)IxQ78k>TH-^D{$u4SoDFAJ#bcBwTsHJa)LYG*JoXhe2@T5oh2l7LE6SB6Zv zX$aO5G+j%(d(#v_aEolpj!m14l)-H_joOtVT09UJJX!kab*wVT(gjPPHVR2V+^hs@ zU@95H}8JlzGHG&&O@wCec|aEJ(jnsW>c4oaY=3@G$%(jnw8w<~ecE|EDIGkJZ?0jy9MwuW3L#}D|JMoSGCv-nrx!qlS z_moMSUeA&~wsyaSjOo;?NA*}47Mx{CWN>IV&po&1#=}*clMfx27u!8$(w2Wk+DAVy zK6jtK$`7o}S7#bOLrKQg&(B@=XP*;odU`Qi{;zr2@8j=5^_RnJ&O;0hd~fshZG@7S z?TLS53$j$x{ zRTE{s`$nqDu_gZYX219tUR(e>>+7HT$M-HOZ;~_K`|UGR zC^N%^YBz9pn7{!^u0oCi-~@;sIcUxGCIxWXbny`1&A`xbP0QQ#@60%@Al4O2-p>2` z{>G2H!sXA_{#R%Jv+iWF*URUe3>PFEB^WLw>gGh;cw)$VF`&Wg*1O4;n;-4`->03$ zyY$Ov7KV(TmEaOf1!g#?k;uS6rppFSGnO#f7PqpTN4}sgFk55ke02tgWN^f7-H@0# z`M8OTGox1K?*GwACvQ}BZtae8*8FS3$RL%R1!}}Fpm&t$7&wp&xpr$x>2tMy$#2iP z1Ajg{&mG`vRFZq_ybQyFy`U26#fG{|Yuz_`d(4@4w?5#F5CcOLsM}N$5xs6p7)W^j zx;dw90cFpbMlZN}Q+x<+z zS^8|y=jUc7BD*;l8e%G6y}kHxySQ9$`>|fFGELcAb+2;;o45Uo%-Qhg6iBr~Iw%4? ztG-`e`SD@;kr+$E#Pbl5TCuH2nH_rD65AH$Og|-udzA^msRCXXlX6P*-2y=P&Nnu6(ia z%cYNpQ>S&7fVz@w3=9g5EQt=?XJ;5HyY)-TuHXO9t*0W>WshZ5$(h;a>m%>qUg|yl z#qNu48!x&^A7y);FYtQZX1|cIuxERYowxg~lk6M2tEBVXT%x(G+6L= z_1{O`6(5h*A3xl0Bh+v6E91)5t528QPp#YG^JeSyc^^05E$cVE7NM+O>*g}2^xVzD z(`&bz-THQ2dtJxfvb(zJ&zX#VKRC?)$lP5{Quuz=>+0OqYxa2kd3-B7xpkgxcYx&4 zXQjJ-c)gUHa%$_8Q>6@B(ywtaZ~FCS^Z7?@v-5i1mfx`Jv-otP;=w`oVzDMy7oWcs zSuv$wuU^dG9{YI0VZPqL#cr<6HF91~v9Yl{b{~(pIdACb*nYp#+Ry6ek`=4h>ldUl zFsMvb;K{ghXJ_%_V~XZS&2Hz4KmY%(+%Wakl|A!6zf7Ok`Iqm7{BfD`9G_Vxn(v=8 zf66}Mt$$Q|{k~aWXN1Sqn!5GLL@wxJVDPYVl=xt)9494M{eE};obrD^4L@(5$!h;! zx!+F8`u#5NJ9Wop-P#@5%@Pl_q{)82Rxc%Q$i~31Q;mapAE>{-k=4Nhv zGNQrudH+mKTfg6>eXLJbyngSeQ!ln2;?iB$duX;zWzn1Z2aLVju9m!$>9_rLo+;dA zSCKYh7ud6#VY9YwR-C7XX-G&*ha z`?r*o)T6)rb{)&-)oH!k_k3QO?_4SKx)_e&7HaM6+cQnHF1ibB0Z2(Xr%d(Rn*>6(P#N;F*@CqH<@)$H$Kr#Q$3qsTkqw z>nmehkg(^&o8rQ=q2WjGRsY@Nsui7HQ+hxi!_I&^MTh~fHzy_2dPV4Pdu_}FaC8IhtG&JVRaeLS4da+zFk_-%@25 z1bL^fFTb=zqU!dAIdh~ndVJ09sl40sx9>*H=KTI&w@N1aK3;eGeaBg|yIVY_GBQkX zS?1>Cmm^Wx>qMW=sV)0*H)HXht3iQ*g1_JF^ZdB1huZr$~YHy(w>6dv7?dgAQH+v|4Mu7CR={;$2AScUc)~pA4c{|S|m8|*d+!mx!hVi z^Tn;L*`N>z4BxIGSN-Q>N5_w|g6>B&)#nSn{Pd~m8WRJ9L#AMh1KZkk*yecbZcUn7cR+X*3W9l`LwZ{G(72M2$NVqjp<-~}nJxBC`h^Zib- zb+Nm}YHSZAMgRG}YtbU5tgNhCxj#Tdf$=pT zU9Z#yN`Ec=dU0j(^N2;ujy+TCUb%XG|M~Q@T|0}PyJ=1BIycwa{j8Apmf8GelNL;Q z=cpO$oqcw`y?xgH6}|dd`#VakWanCyf|PAPo!OxSQtb*das$VN-7$iC!`)2HC zZ5tMwI+ZExN?q-rkHi*w1QQ7_2>GgYrCad}Wx@UO$Pr=NH`oDG;cbC7vQM37M z@>y;P({Os)Sdxao7uZBhIUVC}h`dVD} z+ZzSVyoDjdSpzE_Wk*E`n~M-dsVMp-*3I%*ZVt9W_He=!Y?l_ zE`G38?DU_XpC4bn9@i@#FC(bG|C84q%U@^R>fLI8ed*-A7HD7f*MRQ8dJ%xuT}tlvq9ii%pUEuZ-F^Yi2T<7*7t?po`} z)jgS*R(pPWe4S+eo{w&OJ|2_4U$fSKzFlF$f99m=v1OgJ&drSuJ?(4G->E*YV$sEI z;_f{se$*P<&z5BW_h>=d+{Y7|`8#E|-QO4bb?X&SkUVhaKY63>Y-qUqbiLT3x_cWR zA3N4spHcIN)p^_=zdJ7Hg~v#+hGc=513`NiAqsk{foSFT>&UHJI;QBe7NZK1QW zQqpPNZ5@BV-_|d?lX%>$*Jjn~_5JaGe}zllUjOU%{l(eW*PVU!`h9q;sQ#bdt!}rC z?k@J6takLP`8|R1JC*5Iu3k-jTmR~K@Z*igm)C7hervV2`nX`byxiYkZ-XXGQ~*_O zxAXVgzT5Tt-Hcx!uc-CMf7xAodhK>Mmm`hrG7|fL9n}XFO8H-YDEHYIWo19FdH>qB z`dg2EOhMx9uJapx)?Y4ucBZpkuFhiJ-gol7Z8PtG{q=hN@z?A3%L&HsHN2O5J$CW` zf4`3(t2IA&lAUSkw_6)`^cC^XT0CW)>h!GrKa}KZJ{;Wfdfx8+JJ&7ikuz3v>zDj| zw*LFe%j)0mrq93eIK6tyul%lO8UE)@7d#ejab)`Q{O$JSD=PveZ?nskhAdjVB5y<>mc&<+A^A z*7_X=_iDf2HT%B(1^-X&e^se-Onw}>QM>(aluhlY$^LdHr7BV{-+6z#`u*PMtM%ES zDl|KmTU_tV>B{|oit>(qUKTC5;@Z{g$7{de6|etsSw8t#k7Vwuw?D<>I-bW@D27E= zPPO>E<#N*O`Tw?r=6{iz_2cHX?GMteQ(sN#sjdAkSNrj(c;VTt*N?@o+q3BA-}>t> z43i(-c--HA_T3I;y*&>O?desUVOw2xr{wd59lvH}FWRfk0!y!#QAG>)?X#1sf7H3-$0hGsq6}%9 zU*vbKUboMx&-&So8`nLCu*zIca{smwmAN`{lBPL4m`Znpc{+b(=Tr0JSCgZ2xSqcs*xx^0_(h`_;1g zK{5BD{sChy*FmxGk2(ZDey;u2H$A>mRsFAS-kTj8FaAHk{P@yoz3gC)Z987)?@;`9 zEB$?b@2wXZV)b+985XC_DLJKCc&709R;w*P)*YW;VN-Vdak}A?XR{aY+h?ah&-wGR9rke?Qec#;c+l9BTmAm) zXO~{K?v58RpRdXv(eJI%{3TzKaE^J|&CTh@6WwLx&hNkQLuB1EP#X=@{QG#}F#ppP zn~vH3IidWqJN}=R-LDsm_snbmGt(&5OXkbz_#+?G=byQ4nI~&y(r5AM#GHMSC)=;b z*V}@PbzUH8oOa~leoLie{qplS+sRjaIC!J_er@udABC2$izkB0f`9B^`s;0{{%oG` zZB4PSuS?C=w8tQa9DXM|?Q=0GVOTz&D}9__YRYDTO;e^^vej6co!QMPtajwz-{0od zm95t#{yq6{Bm4c{$7e4tzI~L2;biqb_PEO zRf#f|2@YpwnQH4lpJARKCu9GjrQ-eH@6liXp5I?Dvf&79Ex-q-FZLe}{P=K~zc?oH zF{t8mmnlv0nQgXK;kj}-sN>|$D>LEicbjmxJtj(Qa>YJZ>OQ*OJAYLwfB)yQxc{=} zXPIh)+V68>{=Y51BY2$OYT-p+y`rb5_4oHQ9+#QBS#VWr$mN~IHJ?tZ7ruDdZeIO% z(Y2}{6Wbqy%7*jy|83Skf0+U5{ao6*>R#RRw|nMigG$W@&U~3)HKNX& zD%@Wq$flb2r{&CI@v5({M6=iKOk-S~Y42zA^hu9mgw@=>*k50}d(G}>OpCAE`QlRQ zNzjaE+L<|$@Av)Av-x}G^2bxF*PB)Lf#NGNeZHvq-Gb!qvU#&D3X^zjp1lC&^vTD| z-rh1TdwE^|T5S5=h{V=;8&jsME?%@r>Difi!kg{piwfVb(st{Uk@UC!>@&I6cZPwY zpZ({a9lzd(Kg~T@U-bTb{ZH@Bc9rq_&;Q!^xX=2?s?}?xY^%O>_|09lIL|S*=HJif zA20s5>k5yrww)*O&&6lHoo%)~D3Sgvxj6sPpW^eUuc|&dA|78SsXnhH=-996v1K=J zEREkEvHZK$#xIw=LG80E=YGEWo^of$$B%!w^-Z!SKW#z-g?DK>;FD{pTa7gQA)@r9^FM3BT9NsHn$l|Nl|vvwX8bE&jgpzF)TsX3x(P z&R)AU?Mp<}%ZQ{-y^RGA53N``S2%cios6)$Ur)X5-;l}jSI+*)Nt5|ETRG`QZ29(z zbWczMU`Y&kgS+ndwhhQzey?-{jEjM3!`K3kGfddu~8vboO!$1AxkH7Bx zG7=!uUgzyld?#7vf34W|{~>O}KPT0bpU*AJ3d=Q4JJa!)eeQ)6j%&;P=Ucp);GDcW zcl+OaN(Z`szr1GOyST16rRKv!_QLbFhabsbkH7w6+K28xuU9UA)Mx#^C;s0f@yPT0 z@9lbhwD7ph?Tp(;w%_YgZ!_PwIK?I9&%XCjg{^mTEdo}7a+EpWPR-Yb*6+6j^T-$& zfSQtz4W*AC+xY$b_rCk{3f*kJe!2Ydx%R(HFUr1j->EsRyU}}p-Nuv0W^dW{WzOyg zhq$HY^6k7+bo%H@_4zW^Is2WDnJ?M>ep~gNs#BUDUuCa9>g$}BRdnmZ)$4J>zu)h# z{}PqhDt6tn?9L5~uU{_DvRN0tKF;vN3dW6xzum6Szxez8ueXxv$2z9F9kE}xTMyK! zzMnncuC_|1_Kl(8>(76B8qT(_Ubpkv?AXfv+H?JmFKm|)`u%RR|C&vov?PDu$iH9v zxaYE8fBpU+Ninr&uln}+Resx<{&>=9z25ut3e#q1>5D?+KI__=NW&LL4*IfHMCWfU zl_`CapR}0QysO0Ocl43_^D5JNBn*}Q6+IP=w3nD;njOYt_wvY&ug{{BPO47N3EMj_ z8?AkvWq!F``TWJj#qP(F%Wl;DzLEI*t#t117mNFi z*b?vVF6}?q%x1bfZBNpsr~;<&ED-U+pvyS-fytT{Lrbps_@(#OT&y0osoxMbaWhSW;-g_E<4ZkNnA{5Xy~7k*Yl5E zi_Vq(U-M?8#qT@C`^=dZt$qDfTbVdbk6$soQT4sqO-61mzI|1Y=66L z%<1fI_;kGppL_3L%}?XE?a@4bQC(rKh_blF*KTofTm9|auiTSyG|FN0N z&GSXpJeLaKxW>^eG(ESrb!u4D%7&?1;-zzUB;F}|eIczqq5F2?Z`nt;R*dSr z_4}{AY2CfM{I%Tl*rLoi_3tY0zupW=y>Hg-1~p-~SG{_)YV{f+=e!+;phEhwA*jt+ z{b|DlgPmIo9v-TA^YOURHu7Y&ZLT_Rym&tMb14bL;D5N**}&ZhODs?>EB- zD;Ra(ZJ)sR^XtLFpQ+PLwOOKLw5E3L{dUKA-H*@lo8-)&JewW8=hy>Y^Sd)jYv-+t z-F@srbYAb{KFe)46>mHWS{d@@()##2_HXXJ*!%64?!SNE@*XrW7XID(Kcg&T?9le7p7fwwE?bS3t%E)Ifs{-g>)Dl79zz z>xy2FEzSjH?p(X;Zqj)Y=5h74*Z5iW|DT>e`_1uUUJVgPi76ZOXWd|2UaajVGiB1M zRjYRVSk%4Qk1=Omyi7^JwWA61Yv0`z`@R#@t!KmjHmd#jj(uJ zf#aIJVZY@vw>;|7K6W#G?%gL+=4T5J{QJ9j*)p}{-#0cU&%S$o?e@E3rKP2kxAk|v zcodPp_iI#0ycwvmp#AU9bFu!8?0&u%_wD=S3=Goq1M0V&G5R?DwEp>Dn|Hozd!2l0 zil(Jyyru>?n@&3G%x^!ZROFhx{vHE$`E|OR?p3`$8kzpjEcy2b_4z%W!s=;n55q#E z^7FIQ-2AgwW(O60InZc1+b$$DRFwVytLu`t-S_?}ntU)NdD^RcwtD-&Y}%u9Z`Z9= ztB)Pre=g?p46&ZFg&#m`$TqIk37xjtyiz)UPa&w+_T%KI+JCt*yOdlHzgf8z`4pzuS;} z?tJwHM|RMN@cA2c@BiMs{{K@9GncCXn`+LxJ3Aw9TbI6zS>SbRzMO5d*XFWjkoz`JenNcmEEbMJTAp_q?5{5;S5CRMBW+Eku;9lVkNeaABrK}l{;u#);qmROwmrL%{(f)rVP3Nn(f@yb zyKP)QyEG&&`pvG>>m<$pc697``Al)`FNVcepasCQr{QsZg^#7>ug>*b{`kawnVHi+ zFFSqu@rT2Fr*G7KzxzGq?}Tg6_}Zk#G^MSTn>)ng_vhE~f3yQ%T86!fBN)kzr4Ks_~-Na=Wp!0KCgP)s&&(D z)a`zoymINZQ@<;V-d=F#JNMhtETaA|sG(}SZU2u)9eb`{m^T&NlRCL<-9Ee5=el>l z-Q^v3K0Y>9*80ta%9J}RrpKSV@oXoXNS6YSS43!N=(TT4*b-N--IcXwPtdd0x3`m4 zE;ZVpInUbs_pIEtf#Koe!OMI)&E5OK1B;u_+e)9e{T|aJWvX>g#@1??&&*3tI;K9I z7QOD`dQh+E`PWI&prYj1wq3h+NfdlJVDa(EWKe5(c|)iusOFqGeZ%r)otjU4eM?W7 z{Yw06_gXxqch;*{uWnQxztjHz=as$D-}kKP{Smt|M62w6?)RRz{!=-md9x`>s4$ z#t|ACdNF;k-9}JOuzI~lSUP9J!R=zg=S_+XRyt<7U&?uAR_a7L!}^F&4CRGdNgy>(;Hk+w^mix_(x_-#dS!?ro{s zo!d^T%|4P_ekX3j=dGdp>;BIAW1t>x_U^WM^6ecTAA?3-RO-`b1$lj6FlF6R&HVj; z{f=#$|F7iriZyG_+}*sy!@8h@sWe^sXxs)k9 zwC3lYXPZLm*lyK+7|hdQ+KJty|Z}UH|>}jqU&c`S$&hF1x?i@XfwzP>Ei4H+A}ripRalbMNghsF-|xxQULUjL`u%yf)nadAc5ZlQ^;+aj z3}{4eUF_~O8P?wq-Q|zITD>-GL)EQr$RLRCOcTw|zvg|vTVLNJ@iFMwx0spx6Y7p_ z1C1@bxw+YR-O5)x*+iNYc)aeM(q2EukfZwf-2cb?xBtsbq?>X7-kG`9=6Sm+ zJ^noH(k`-cdi_ydt{*h&0vaTnVQ>FE*i3VdUG1+U^YwSz^jW^UktQ1-9W7mcx3>IF z>G!*Wf*ap#I(=;0?Hpmyc<}2roBh^YILI{F)v7#i{$fVE9}f=qd1S=yuY{Cc$@9#H^#o}^j!-7%axX9U@4tS(Vy}X= z=Ea)HYQ9~{{Z^}PUKR(n*;3<7pt*xTk9WOJ`Z4+N?JM^eZGBp`es9^FvR9cKf2PfT zy5iE4AD_C^|d&d}gWy|(83=Uer9OHR$Q7du?c zdxG6jV#{rP>g{`hD8Jr|zj z#q{occue}y-|zRkLA~2)F-0eBLSm|RrBxm_FOU1YjQ#1M>1XG3U5OLfb?=tWYcpM` z)Y&G`WO8Y5^!FJez3*jyo^a+r8kN0n>h;ghXFr#kz>a-(pSYS|9)S`>lAt?XQgX|BH7hM@PiRPx!p# z^2-;Om;1}q-AF8a{MG!(>-Br2%I}m#&ndcea%0{6uhCbo@1IwtbDJ{Lc388RN+1da||!32(N)-)Cu? zzCG{mt+#pAo*!H%UXy!uX{mS4rjKfd1qT{-e4kgHbcFkVpM88;WzOEK*UtX>*DhD5 z(RQb%c;0Fq-kZx5Yd;)hXI=exalf6`jh#gg_kO>pe`6y~PQ+RewdmH+$g7kB>dyoz;)K4|#$%WW}G3mw$sfBeq+ zeHUoK%Q5g;8h-m<9*o+rXHxxR0f{CeuN zn3dc+kNW{xBT{Nhg!LBms)^ZDi@;jPVUlv`Qf3z*oH-YnP*L}o%wOB{L_<@AAh}G z|9o$o=VZ0g9sE|Hk$wr=UuT=J?{4z#+-+xX)V=@v{psGeZ)b{m zI|N!BAMsc{Y+12#<;ffW-V~od7MVVO>h@CKs7IiQv*bQ&GbJU^i2jbJ*P^>)0{@xl zBnfLgYbpDwe*H#8Ezmf2FS^50eC)UgQ!sf?jO?qqke3_#2qx%1+_pDCU z12t>(ejIK!tU5Cz?EAx=Y)>XD@CZFqKmA{&uKeE5$o`$*_x(=#;HiG}&CSi+Ay>cu z{k-w`BXf6INzerUv+VS_#bq(|hk0FBYtFYSeKlq4-^()VABTp=%h&IF)HUbZO_|Tn z&T8NC>-3Gxy&7t~tyf~=?aWlrguz&pCVOs`s~O4*Xz3HzuoB$8p+k=`fYo?!AYRSk?HN$=kt8u&HH@eF#l1| zw9{mDf4zXvc+e6I(0nbZZ{pUz?Ekx_`^Q7C$K1_x7u_1R+;8qCy;XnRrmejZo&4g$ z!jE@~&p+LA-gOq&S2h20@6|7^-Rk%Lp5$$}Jtm8M=jZ6JTer_nZ`YGYW_u;8i@&@8 zwbX8uwZDD5YW4bmVHZCB=GH%v*>U&Emb$! zgOgB;Bh%8Ll@^b;Tu#31Yj(Ek&Wh>ree>ULO~3R105fPVV$b!j`~Uyd_meQu(A)cF z)0*RdUoPsl`ZIg?v7AjGk4fGJEmcTYcAHoK@2AD{J;lYB!jp|^x%QsWUcYD7_TueF zU#(t0Z)@#|v*yoLR!A77c-VaV@i_NY@|PDE3-AB^Zhi~2Fz&}=SMjGg=^M)LpWP!C z_&x9L;^^=1EG_+4-p)R6ySeSI`JIyFn9|aBPX9nld*;->v$TA<`i9=lHjsZNiZHQAiE{BCXdv2AO&-7>oL^l7f0yHLr? zORDEA-hNqgJf`I2QP8M#kN&LEaZt<}4h$B*AtzsoGPpI`ee zlE>!RjEZkN(~aeVgM)>e{Uxrvv9rFE?H;}5dG&>$r6syEb#}kmRQSnLJvC?j>ebzc z`z(~^{kgussAwOkC8^jhD-~>iZja-Ulj`%Pe7yN|C!5G51sjR!^VIxZ37gpTGZc-;U4g&g4s!-C6jB>1EBWy4`O#y}KhVSa|pA z_2Z1}vJ%SfeK{ZZZw7U-`s}{V08RVf4ocfy`f26zBR8MV6P{oHuX6Ri|68xech`Qu zZ=anZC|LOD!NHAxKAkq-eZTL^t&3rAzshZK(~R|2WB+EaaP9r%%Eo`UZr!r@WA1(= zb$Yy9@v}3TS1mycHbGUvo9p%e*X&-BxAUmj#`E{8({sMZFmrhduyJnx^Xc^Q3DS8z z`)Yriz5dZIUup5}UithRE93X?_>^DY3tFs|6>U(J`0dTjkMG6fd$|7uYOoK7Z{2S}o|#f5NWo@fYLs9rx$eh8`(V_t!uFu(@}7@Ao;@ z-|rZw+kL-NEOKmGVR`xWA6kp;Or|b(-T%MO{9cXl@ucL5vuAU!4C&gm$tWc~J^6nl z^Nc^=M0DbJ9(wTeQp$q{#)6WPke}Z#T?(qP_^a&m|4H(aB}+1F=7ne-ZRHj>NPNWd z#~{7$(EVm<_QMAcI@%=DOE(Rq*uOq4z zKRzg4GQL#!^ONWt>w3TSkN1ClHoM~e-IY?(flt%wK3ayYi(2|6f4^Q#ha)rl%c=an zc5@AxS6^Qj_-niC{=fWxe}4_$U7wey*VZSo?qmC;?r!d5eUi<3bFGwBR9NET;#P#M zm0A*{`RUWA0%KEAas9X>*K(r^f1Qz>dOY&e_4^%hvc0vxzian!a_r%clTU_f`s_wEqi)r zo2~pC$js3F|A+A2>aUk(ynB4SU+|7f$kY4h=UQ^>>mE-wyk2`(%P8ojDO1DZcD}`q z&1_b(`l_m|kJa|9xSXQ$@a$}59UY!`rgsz5^V{9~KTVi4sp)dMU$%_RUf&dzY5LK9 z^Y&J0*5N$XEtvO44m=x>U1e-?oa3D z+poX;<;Ja5!MpkP{d=W7J9Ea4-Mf?D@fRD^JmJ`STU10O;bVM#;>Y;x%WA(&47(kDX-4Au{lBF6wiu?=D5u?^U4Orx}Pu8eQKVj_I`ge*SdVegXQyCUfbB(1V)6c z`276;EA90Q!q3mMdOm#~2M^DYuBE3xyn4MpQ&wl6i2VAi{eG3cPR<`spXXkE=k=4k zyu2Ca<#NaRsu^$Iyy><5YQJ_@SJwv3G-I=)IqOPx<>lr5c-?Qmm9L5MPn@#SgG+K;af#h2XEf1cQP&2hu^xLVQo zl9eCsEp%>6`eAVOabtv*y1IJJ=db2j$FoGeoqY4Y_k*WTQzw0S zb#--ns`s=-b7x6z41M@rN>EaoIniZ_f`$f1y-rk%ef|H~)s0_x-_Gol-B|WD>&(A* z)mPTV-hT2jy2+85J?W!-y;SO-b^P`-+WPHh<$Z~q_~z}~k5|`3hJNDAo_rzT&)$lS z2kq;{#l_FeH|NjaXLxeK@wZ>j7~j~ExcFFPf_C;R>-S0DzTeOO+hw%!`TOVnqNk@N zpL%kV&HmdFarK0kla{*uznGunJIloJOV?C4Zizm5bH0n(;gUKL5m#UF<%Vp{UeISc zx7+U4*6jAT(c7f{R`1N7z7Ax(pY6dXAFF#idO8~ol!Clegckb0x4R*>nHA(OvxyVk z{5Si*w~N?W!y2X+-}vqAEooa@@9Vq6^>gm+2z-2C<1H>8o+H1uzBc%|c6&npqLl|@ zV`4t+kFP(xJAZ%jq%S-xYj=OUu_4d)&}?(_6CZb#z3h^`y)F62g+w;Xd3)3rE{xcp zrn_w4?{x>+FY;xJwSCRLZfj|_e5$#Iy1Keg^?&9!clOEt{q=3_myc1~aym^fUYzmu zs5sYpXE9Oj`m-l)G_MN}b8uh)xh?a3eZq!hHgmpX^4($&U+eETs<^Of)m7PBE3&RT z$YxuK*Irp4FTY>^m#lq_ef0B>yrv(&em(mAeqH;~`ag}kN?(QissN?gr%Nibgd;2|>nL_iV|Evj&zZtl+>g%hD{8u47awZ(B7cJhH zcetweah=JR@9x3EJ&lV!CtnE2iP$dp`r7*A^4o3_VhoLg)MCc>Vbg_jMn8Z>nU(c23IE#Y$UO7gW{g z#qDbOT==~3=_%2eeMPRTKdwBLKAk6DurEwdS5QFUfT84;kg%|};^*g;zg6gf%EKMp z;vsd zlWk#PS6)+D-2LNWcwl0pV&8m=#>4J>k0Ww)CQX_Yk|%w~LSk>#H@p%8^D=&jPdTskohhI6*^y=x;R=@K$%`40TUtHK{D`lRSvuMtwJ&ztG#d!O; zBqb@WQ;$9V_c#BC7lC?m_Ijx+p&Ksx znlCqGY4(CnPzFAA>QsTIot%5Woa>!di#b-cQK=7PDvUPz-(I0%l7CM|*1E)Hb=X>; zZ*$Lr!kmTeP{#=cIs3YvHEVR9JbmsQ6VvnPQ4)iH6|<$a_2I*pnd9cgt%%#ZYi4nl z?WyH#^QQR)YO0q(2MqaJnPN#?zw!Q zXFKIz?xSvDgV){qK68{0SN{272nvY*2bo30MGv04C#Pqcb>Qe#(XF+$y6cwvg|4wS zSqaO(Q@vD9oI2wYS7*n?&846xc=+Z{wyY}!ZL7OiyKXi7vDeMzSAs%MM@PqrQ*ZBW zmR|24WOw0L`uuYTRiarF9(DIW^ZIXQz8P?1ov$rWceixf_f1j*&*xDm=t;-p5*(8&=E$Su(9>y_=ArprB-A?)_U{%?Sr4 z7ap?vRbj=&#mze_&CQL??&p`_srCGzRANlo*v(0?pnpu~< zJ92vczNXnLS5EbM9aLj;Y>$E1^7C^7clzF5q4DMIM4ozVhz5n>Qup_k6c=OD>GVAoXbt9j2~yy#eK z7=1y-B;<9nu%Mt|Bsbfkj*gBF9~EnB>BYxv`ln10>Ak&c$Bu+29|SY5uak9hc6#vk zZLgG`o&e*C^XJ{`>g+ac+Enn*Nv2QMx~=y2_w1?d@Av=ZOP*K1Z&JFGi;GK$siAW^M>W&W#>J-@$MtNBj{#cWVP4>;I_xj6ZbUD`igK|$fb zl9&6;OSSIJvpKpX6BG}TQr{p!)VyYm&Y2mO!qwm28D?35np}VHewVOFXb8NlsHCK{ ziVGT)!ksQny0^C_y}MJnV|M0`a8>tSna-8(_jFf%eI@zl1}Kh01(_2;blSApv%7hv z&693+J>60K+;3^$(-$u~0+rp9j(ia8$hdgO!BPbjx_mq>pj02(F=>*}9E(CGP}z22 z;$aUDj|*A**?6TERBz9FabX|xEjQPLw{PD*VW|po&@709HU;p@+a0;PyL{r*sjW?i zoJ7RMowcSOx_MLb+&RA$p{J$4zP{c*efjd8o4r6Gr)mHWIgs;Q%nqKrBMFLMP})*5 zVui#LD6USZAuDTyq&|?UO`H(7g4{dN7m|-b8ai^AAbtiJoFWWy8c2iE>;vFD3DO{V z6I9ZHm3MTETH)d{8c<3~qbW*|j`?EEj1Vo;a9;*#Ra#l`*c z+LY}R=hnt=J9qFP<9^*goV-#d2Fd3-I#%&POh2*f!&Q$}leoCJC(fU*|0BI4@06>n zYg6(xFBP^Ex`GokWA|2tUWj0CxO6FKj$QFJA4?^rRaFtwgDj`9D!o1wuDsH#>i680 zC(fJ_S~L60v1|#Of`p}gzn_}le{^YS#m!G^&f7bO%r={9r6xFWWv9!j`NcPHe*P&g zIB^@?4D0D@j(vKnUHJcB?OACd!N{E((tHE=*V!JlN>^7e$+&(G)y^dQ&zmDRpP9?4 z6q|c@n=C6UYg6gcrAv4GS74tz@8yc`h2P)Z?_a}Zdv;gp+ooS%U#+~^+;QT=BfXdd z<@RTe?%!SZ_g(;5pUvtx zv1^0g(jpyhmus!--6n-v);!^;`u^&qWK72jFKrDCm!hIgIX4gAjeVZ{3IR zW0;%=D{_Sl1>C|Oo;8mX*I6ICU9SAnr885c!KJj4(k2(4mWiPm_t)v(a@jUbceNzg`zG|Cu{w+B7DHbH|T9JaIAk#igB-Pkx>} zeR}(A&yybB{?2uAb}mYSF)=X#%l%|oOtM(=-$$vPpR6j}ebmFx^WfU(?H@JX3wp^< zKXmn~sGOV}2N#da-l|eXp-!GjVV<6xd3W}7UWwlR;YFa_ktD-8bLT#M`LNNgS8CD1 z{q}F(@ci#lFg6yxE+jm0=FHaP{ql#;p5@(|Rk<*8vf76)UrZ{hjwSRJ#fF8oz4r9n zQE4pt^XJckvNE@f42~uy=B=ml4_(c!`0#+SsJJ*WKcC;+-2BSwXmLfwg9RleYfAok zsS2s6sXcmk*T?3}+14F9B=q$33W|%J9UPQ@{QfDq)MjSa&UfMmethrIJk@S@CUn`U zQ>P|ODq{9LdGf^Bv#c&kS4xVT_wTotVrP~5^VuM^YT26IXA1vn1^b7!tvq)%=zVDH z#nK>U< zhV?F)G)buD=U4LyQ>LE0)+=S`^!ldB_V+hBlaKeGp2p5E(~)jfb|EW1c1r*AvJVdw zMMT9{-#K^uIQw}%sg8ZMRfmrrb$!1jX&xc6*xd{adhwnIPQA#8*(I{R=zo}Qbkd(48##D61Al$5{{AlU zpT9l#wc0-qO)4rXGN$hDDtq&X-90%u_4Hip(nAOS{k`%o`9zVf|J8K$sa}N-9w@Hq z>2nLaW_!@?-o33GYEItQ>aTqDMe<0_%`WecAGNAmt!~_2T>HCB!m`Ff%AD_#)_T#q zp5BL-`5Ib?Nw3~!vvbFe1@-&)N!-|PUsGEfl2`ueisq4=yK2$X^!3xv&pmwH*e>{n z|J|?FRXSqU|9-k}lM$8de0aER)fs2kV|(Hm9^W^9HDgiDi^CUES1Faw-yWfJY~9`J z4T+c2Y$`rDRL(NZTHxOQPQtQABJ1iU855(@s#Ox3-%U#IdmTQrYLih<ce>zl#}%Bumtet7C{Sm-?O@IGet3Dc(WF`PJg((%iz ztrd^AhWE~@^YrALrW4!u*19}vYwe@2uV;LJ%ycB@Zd>Mi|JMEU=N~fLT3cKA`kL;O zXLgg;dV702H?#4Y$o=;^6nZ3fhekyB`n=e+%!#|dy*bz`ZJv5Me^1tp^Xo&D4(|FY zy&>(b)!MlDz2)!a{>AO$xxMZEf#2`ql z&PL_j-NhTMw!c$vu66bu_2&fACi6Ytwi2c6xk;;(8Byug4vI z;K(fc@7?3a&3oJ{cg&on6G9Ng5CFGAmx?JAfeQWK`9&*aL zzfpL1+53ahlkYjakF(X)vaMXUV)v<;uYbLa_77{*JSVzgPj%@0U0ZDOb6(q|@_yZ> zmwHfU{`7r5rTM~#gJhEXkaP(l62Gl-1{4auTP%TGp#H!Q8DezAE(!B z<*p}Bo}BURVTnr2-c=vWt*xzHwq`0vlm{N>e_E7&er|9?`KKqEQ$k-TF7xv9>r>!( z_Vi_^Td!2s)OBWE-Q6FbUcaC4b=Fp^{)c7y*3$E9?YPzb=3TK`8yR2QYnpvM^Qys` z6$>^9*q@o(pQ;`9%JkZuQ!lPYnUF%4GM2nyQU-8kZ`)E?l|HCpl zeK!{s&lKoB`s3sB){dK-LZAPc*=6}&{J@9rKCa6&hEu->mHBY(ZDDbm&`nG zPnzoc#5}!8!9fCdc5J*=`&d6-P-lDo{c{P)VN<3~eYpE(alyMgl?SWX+1X3pUXolJ zwXJ3SdVLw0Hxp<7=D0q2(uVZ+c6WAv|1y=o)1~Qs`uT(Y+|QI31S)UMthN5lKF3;K zJwjio^Maa@(A(QvUH|_2`tU^rsLkQwySLTZy-&gLwa$W`DS-OvGecm?}d(ke-)Ik@7%MeCT4FL@Bg>AdgsiMIk<1X?k`zg<){OvPkV3J z7rZ?E!}Uo^H$Cm1uJ`cY-``ey%}TyRtV!4zzJ8w9`n4NRZ?*C~scBIZBJqTqm$Pwx zJhO+2P)f?3qkn&YXRV*^wRDDYzTCSzJC!5i_t)9-NEt9VHa4yZT`lG%H(lX(oSEMo ztJd1z{0nv*($;G4mvLP^P50vRa{Z~5-Eo`6j{9@e&#9{5&FepWBx$w)_khS=pena8AnMKRA92O3j=AnXziQJapTc$1YSzDM%9VY+Zu{5NGv`+ut=XCDyo8TAF-7#$l0)S%yBBE?-Vv-*(En+|Dmq z;mxC^-bIypOUtTb*WBI^xNv(^%Ij+t)t_d6_!uaYydXD3x<}4b==HVy1FuZ8Q(t?l z3hDg#DgNirW1FdtyGmc1YnV7moAVvIQhqP&){2~~n^fCuzU%nSw``s-_OGj*U;flT zvAtEihh~{x{bkzPmHO!F^!P)?=lQ}o4sGkq>797E{o(oj|Blt~E<1fqTwFZ)`TqZj zf4GxbZ~v~SUYzQ}@<=a+;lq-N6@QL+@<>@YthSjtb?UWONx{bJakY}YQe4$4VKuQ5409$(;kwxRPrb971NB&G_~1_J@M<@EdkEdo0`dD*3Gc{bcX{ zAEi{`wLj%%(I1oeh_c^b-zryJ{TlJ6u*Up1`^}=1*VlezU3<>;QUYAWSbRToIazvt z&5Oe~QoZJWl{P>1@BQo7&6)4_wr|*w#&vsZ)=eSj`PE|X{YM{7kFOW*k^KDp(S8BJ zdoio8fAyU@PxG~2ah!eatCOb;uI`L_wRe^Fw$gciJpu^7Ndq5)*fRyy~&Z zD{kJr89x>kyji^TbohhDJHpdWoj7ym$gQu^EU)7#GnL|IeOPoWGFwJQ#-Qj(flt+A z(}TY*r=NSUDJFl-EYs{oo*650cCJ{#aq{FL^{1cC9gm&x_x{O~oON~n^(J$yN~7NH zV<>p`Ci3S0w{PDH-rFb0m9QJF8ZuL&wU6#9;<+S+YtNp@dzs^WH&YSo0M&P!ZueVGOUbe4%`SNAc%;kq>x4*P4 zp19|%VKhsxw*7v#iu6+{YvaRZ%}O{99d32B3~gNCJ3E;r^XHEr4<7d~%d}lvmKz^m zWA#_rvHA72x3?_{AGL)2X7*nfecx`cX`Z@Jr@^;q;DCcqUGb!Z*f$>^@0dI-P4MN+UGI#(f4#hQ-Ws0Z zxvQ7nTfHkG+TAjH<#z4U5%Z_-I}_V4I8!*jS7mi-dV0HNzTctW@^vcJw+cU8Nc{5Z zrt`u_*FpmWCnmhnW2h+nV=;FZbGM5UPi2|GBYpe7LRO`(OuSTu4t{yNHfo#5o=t`S z{#5n^7={)X7H(YN9+8rgePw-k{D&hS4juJ=am)3mcHyVT%_r@9FNHfgHXeHZ^^~`M z=G_S9c{Oo|+xbM#94K~OciZMeO3n1z->v>$V(Vx!asM{Utfsx6;%0qNimUyp+I#!& zpT{;!mM<e5keQ-CgIyZU3T{GumVt%2UUB&^z%17T+3$DN{mT?f5u-JqOzp9xkp+ zI~(~K&OV)2ASxoJ#ls^dA))YMk&JwOITd+bRl&mzVZ zB?mU#S^A^GrtVL~wwT>zxm!AO)_yLGYB4|F{W$JGkN>jA{r~@V-LH#XvB9^dX3v9P zRh5;RyuUJ%FEBj(5iPD4Ct~6eQdqveGtGB)*4)0ib7fy$S*aYcTx;&TySq52X|o*- z*;(*W>C>lAsi$SFw}jt{FiYJTwlr#M7S~<{)0N@d*CkYbe`g!@eM+$Ty*O8;i5$GI zuDidFv;BBz#`Drs@(e$Ia~?N6b@uGlpAyFsIKOiz+^Ie$^3+-WnO^YU-Hn+@Wd+F<7dx;hA)~*C0|N5rCM8CZ&`ccf$mg~ zg0HtsmmXhjVUg{y*zLo|kB!ZHZIzVgKYRaW=4P+u*Y&iu5C7b;oO#`^it5An@B42T z4sxtJaJf(R)@#!l%N8$IcI%hw?31-x;MmOOHUHA-MTrtwbpTDn8c z{PH9t-dESJ@6_Hmd-Vs=E0ZQ2_u8HoA;xyuRYG62-uao^RRo%de>9^reWu% zJdK*##``yLvD1SvY1t>If*lhT?S2$k@yS~*x^5AAEWr7l=;K3&l#HLcoDg~^eqhIU zpHL0?Un_iOe){yu$-zN+@1?2r4wL50={dyJd~3F{t@n!EC80B4FZZ|2^t&}LJ9K~e z&1)CWOnaT1To?B&X=SdoQtpSV9-FGxty@>|b?S7(_s3Z`m1bXC>puP5+<^6QwtM?3 zKQG(x`u#s<_AheFowdv#KV7`XrZrb7di$Yww$-Vp#r5NyPIqv$zV(|^WA(T2=!3|R z*&a7n7ykVD(_>GatnX|S!8g^9kMTOLUs(3`mQ>EO>Cr{ZQ`=Zp&)>PpDCp^~)b_TP zkXIFFXPJuHwEB4aJHHNlRekEE`QEK%^S3rPGw&*W+qL%gw$s;+%GodcR2sQ4q9^%y zQtIivygaSyUo&^bXfMt)NSyk+qB{9R@p+}R(_uGv&6y+f$DrKq&Ry}vwY$qQu5Hn5 zVq$*y{Q3cnk)7oZI6Ll)h?MiFS_nKTbEz@rY*4*7yBFJ)xPtInEkwDqIJC!1#6{#!S zzvpR5n=I42ekx?Wfn;yTxRVZ8=~1xp~gF=9=88|G=Cz3`x3_QJY`iD?YSaGx@_+vRy=bGu zV|w?_7c2eb&7k1?XPf-$(?b5>X)CR^YM0M_eQl*OhmY-v$^~WuY2c7FdiwS9_IV~E z$@8*9cZ7!~Mjzj>swgtx*d(^M;YXuxnYr9bQ0U2N@=!T6JAY5#$@hD-t93uz+4jh~X2mzQyEOXnKxnxZ13qGEZ@xQW*F|6V3cJ$LRL z2XF1Kk_)FV3p+YGdid2DJ@{~P@^X=5OcvpZ_0`qYE#~6q=7mbKvL3n~(PMdFeNB|< z9PRJFI{vJg>FWCI{Wn>eI}%@CUw4j*vSN5}?Ck6vwZHlPJUN!d(BSOeve~!v^)1(@ zg}$-tcu(HDCueLovv2L~ZOK<(nQ9%s2wIh=C{uZ`Y1#gt)H=Fcgik=O5cJ=P9s`}0HP=`A-`&SNb*YMvTdmAz1iwk!R$<<0-V zTqV(}zgzO9Rk>SKmoItn@9*ywp|4M#F;-PoZPM(IZfTb;`6KxAymw0a9(_OO<*NTx z^EvPCb5#w6e_ zbyL7paDWIhC#D300-l+j@6@g-_9r02c7LyiGdR3fcRzRT+=-JXC+eR6_f5K`-8_7= z`_rvil8sAG&)19JQQ;}Zp{=1Kvgg){oN0@$t&LKwIvaJf=uRv5i<^tt86Mo)>T=M> zJ$Laf36uAq=1*U>ys9l=aa-bLtx31QqIiz zs`~8wT;&<5TVslfjO>2bOmnK_;^A@lUH10D`{(T8;o=@k8+PoFxXJ%c`K_PTBmMYe zy|c}GD|byz(*Ex4dJHnEbLmR6xA4z<8hw4Q)^FYjZkMbrZ8Cah74E$g+$i}NvUO8H zC@9cW`Wp>4Y5Mv3RTN)(J>%TPMt$rx$&$Hs#OD zCT3=4R%W*Omepb3ws(u`b4oFsV!Oo8$=SAgwf3ja^LaYzf1QbpRCtqAvnL@sw0Y(0 z)2A;7f2d4NPghp4xUnE}%I9@Yb*ob^2xO+7>^=PO<;#`dH}b6Xn|q5R`&!5~?+<=a zQh9fFXiAtrzwq#IQ?1rMwlzJLr?zgiw6aoCv4{v@+xctOt*;!D<-1>|z0wtpmg@6Rar#}Bn|iwZecGdU zch&9r&dsw{kCvB^P^f;oQOVlc`rwpL=~`dJtjgc*$=SPpegCD6%e0*TRcM;$NqzYt z`t$cs&S{f_^Fm%#TwkxwIqmiJ)vJ@dFTcLHcXz_ih&PvSD$3hdwHT+*pVlq*@S#+^ zsFC|lGxq6HrWdyR=j;4>D{hh}qw?c+U;V$(7q8||Dq`*|3O-r?>to4UsV;_q)nU3O z{Kj`?RJWygfA8K_q6_X-?3y=a&G&tkl|Oe(pQ{_OJky{i89YpL=lc06IzMB43)h3j zXg+V;vME3`;?rK=6fT~YiM~~Dr%r$P;)O=EpU z8IRSU9A9cx`l~1IxTd!D;a+L;z_4XiHnX}WvoIVu8N56sXJusBw_26uOE|8vO22%$ z&Tihz8;%CXm;N=kr}XX>R`=(u;{5jNW^7`8#xxPAD z+%$XDd%?6fUwmTAXa4>*Gbq#|JQ>`pI{rszsZI!M=)-$zMrv$_PN@C-^($ddjQPvd z)8PuQ@7b>XmMO^2M;+}N zyBb$luQgoMYH&aO{QTpfZoPWyr-NqB8H&^Mii(UTeR-iMQ2*0t*&b`r^Zl~z`TOSg zD!cb<<_HU3bowB9cSoUcxR8*@w#&!v)&6EV?bz7(Vbg-^tat9*xv-XW~x1%@cnSY;n zXVV8$?fqNg}k)vB@hE8HVz&1YTqZ*f_*xp{btX|`IlUGcX$54L(t zmogQZClvPN;lsuY6PDN87k*OFi`kc{QLWwYk%{fn5L|x^dM)+%%(QG?{gA<*2Kt|9nHB|_5a4> zPj+gabMSeeJlx z)Dzd%vN*15X6JwSVq=8k;oa5S*G0*nk9isuzt7IDY30SGL7LM-=EQ|I_v|j8IB%k2 zMELG)1v;kjJ6B%UKYCnQU*CWAV{s9Ygl~6#Mm=9XXLZa2BV}9X=L${R*8Bt~HS>7U znTvc*YHMj7`on6^oi;60-Tb>?-LJ}p39*ya7B;nOKl3?1rF6P#jD4^ne2`G|3K9XheB)ik?nUv1Uvt@)=r#JJYa{=4Oac+UNu!H+NRx6aJ`@#eEWOK<;# z2?;J+G8P)f{tTDbuFK5)+~u`8?9kuS=@VHRR;=*&d6sus?e1+{>(}eVZj;Hrw(jx| zmd|f?7SFJ*Z%l}NKhHLBdEY0-S+h-ZR|)*NxhGY-?(co2-r%0}^!vx3Z{Fwh=jrLD zufl3Q?!4S{>ULLsebwaldheT@H4!_#w!L}yu8%`?bH}Qrbwz9SCweR?;Fq^8vS$?8a%qq?`foW$zjv42{<-6{mWA{4L+T@&5rw8|w^#S*F=s^7;84E=nRIA`ifWXrDwtvwxE& z3EeD|dGq$;wI${(k8M{730&ZqH*cO-b-Rm82A_oqA6L`vYTu=gRkvJHOjx8n(W7PM z`+dFT%l7GW>{}bPm(9IT_Hc1C`(oGbf*(JA9JqIm57guI@&lE8ph2vI8*OZD4IdsY z%(^`L%dhMmWx9bMoL}AlU-t0H%F7a;-Xv_vyUX?U^;PGuudW70M07-N&r|+(g!9df zpZrIXHa>`$JMU%3J=tc5$Jh%UUYFf9JNkjFQ7wa}oUtm)_<@G5En*xTi zx3_dFY7Np(hpDK<9PLPS7L>auvu@qGO~ohAoH?}e^74&|kJS$TsA4cEJCo7+xVrkf z)ADqyM=v%m-&`bTU&r*m-a__qyhL+{m~Oz{Uy~)%PoFwf@cWzW8~XwV>;FH)%XD8| zU#~vnRh+QCzkf?x3y0dKANkkwmfYFVxb46EhkY}vxUa4bKg|B#_v)`5t0F%CO?m@r z&rDg__3Fw>-Pxr-&fF}n$h{O@k@rDiOSW_?8?V%Xix&l3TU$N$mU6rI$sM-;|8Mz) z$=Nq1JQujOX62^CvvqBQuf{&xSGO$XRPoj$)uG`zuO-?{r?7gbdw-RfXvEVp@oaJV z`p)U`vpVLB|6BEW-@JMAe*8ME|KViMd6vd4M~;A}z)h>|RE0V}oVz_)G)+2ad+qLR zfgpz;{B^9id5hGYE9cJffi}JEF$&sUmTQu6!Qp6JTj1^M;_-EM!t-kly+1s$HT^0k z_V3s1u;T?qMTgWc+c&khx8Hgj6C3;S>h$;rlO>G{*B?^h;Fq&GFe&x)#*~|r^S&uf z^vKO`oF*t(@&0akkKCD+J!!tP7i?R<{*s}|uF{Knf97?a30$Xr`07{vZySvqY%YoL^ewnqkBW`op>c7?{8U394 zecN|HXIy8_g0DsiuDli`rZZRfYO>3xA6Y7b^Ga-|zgJqbw!y8}ApabHQ{(roPoF$# zc`5Jbd|uAB0-}@<@Bar{;B1-jmf9&anPny|*bZE-voJv(=GN z-k=&r9O`Qfi`nM%nB>h`*x{n|<;}{7wm*OWfVu$J4bKLy z(^l5d;3$56rfvTGPeoIwPw%h3dDBb!^tW%{X8d?m(IaW=_4MQ3z1fM^&PaOIPnqJS z;&J|jLt5H0Cuc*QHIn;&Khxf^BWvCohq%|*)_%CuB3^pWKmJ>RFAmG3u8K)a zRJ=FONRs*2_sf;{8~^@J{I!Mu!Gi^VH-`i-OJB9?^qlMGulQ81n^v*@Rdep#Q=6x4 zN;nCsAtxP|OLVCa@~FtZBwbPcs@m%OJ7xynSJ#g>{Vd-2cz*rH!pmyCmrbm1++OTG z{hY-2LlIZLU9Dv}|KYaow+XB;I>k;{QhGtk+!T=H@+emQ3gQ1(nqW|J9uU!^*JoMV|JJEZqK{#Sm$W>#zkqzjvWWCUl;FfZW6e+$MViy-rvmIR%uQ3 z5Rk8zye=eM`1@O~P1To_5B28e;a9$WbNC(g`!Z`PbiP1@l?1&^Qk+SJV8 z-Wb92Tw4l9AI#9*<#==aQsr})*{`hUZBN#pkc-Cc6b{qnqh=Yqn*+CckZ zN;KuR=iPU!tFwFa_HE$iW!6m0Qi^*jXZY>)_MJP=YT2sYX9Cq{bZef!D)c_IcEego zCY=e&q>z=^k%qpFD_6~v1MP~?vv33LjsUOLqt#mL2MO={dh;BbL#0{ zDbr1>zJL}PmMCgzPV+iDmlL|EP)RBI@#=}trHS-k?hJD4gny?_ol=M);`c>dMO3n8;RE zRz5q&1&Y0izDWu_9UUiFjwBiGn`=AU(LiaFWYR{7etCPdEGa%dzJj76qbw;Gmy}rW zQhTGu!|r`breCKe#D>f^llc87!zAZL|E5hwOO`Hu{N&~3f)&Tsrz@@c1zP20{r~6n z6`5aNUgdtj&-mzyOaZ}(rHS6NLAI5>zo{LOcioK3IK75zqK8WK^&N!*Qs#U{rPn~Q z+mXY@oEV}C@`>u{uoKf}n{ghUoxdmVOKoQdk1A;Wg-zBG4o3ly%P-vEQ&S2$;vf;q z$;#U5;paC^w|d9!*(vc#O3o+FpKp)Q5nGdeWyQjoMb0iMQh9lKE8f0dUAX(uBBv)$ zpK7nUo)*7-R$kT9vtb)#eO#7wfOjA$YwL+=uX+67oJ-2vWBU!n9>+_pF0|el(UYj` z&V5Zc{*(Ehz1fo5*)A?Ahu@r;%Lq?|!8kW6Sh&rYI@v?T!^`hjue3R6v;TvW2bS_m zo4Gt*;9y~8C8e`=(j=ifJ1T`i3FhKrn~tMN7S`5>FCS*^l`?g4uCKpwGt&Rf)tKkn zQ@sjbf6I;8Tg7W>X(@2?=E38)rG00$EQ-6kE9<*x_t71bCN$jM{$9b}Uf$2o@57fb zE|=AO1D5;cHa`!IPTDAOQd4tB>1#8&r?yTn9|!H&wd>H~!_1&{HsR~nIi_7Vexhe= z1zQVn-Bep!`|#H#DtGqG?E3Sk#=_cK*~Em!v9YmARv+K0*ob|fKYc2&)s)P9nR(*; z>2?p5rtWU;S65axH@Nlo7?pJ|wAYTk5ha`Ev+Yylti^ktJ$c=-7n;$%Tw(8pqb^p0eXRhULdg?v>5o^7D^*b56c^_w9s(reB>hi4n=jK`^Cj76< z`p()@yiatlT`}A2q-`gr{r>tAwA}U2|NG~XQom#!d}A-VHSem>`n|un{`~#J@|v5Q zdt=>WwVeAKg^wOR>h(QWP_8dLeqP6d1qy3FM@7Drl)NFcnU$Si&S_#-4P!%pKmR;g z6M@>_U)s96yW?KYcs$EizH9uLy>MpI%I1ZtkmfAFqwt zcH~E4vY?dEqSAj)WBt8A{qurHPc%JLgr?qZWnq7O^I-FZoyF=FH*RN_<~Y}dwI%g@ z+E{+S?#-TeB^POkHSy#tfVi%T~ zsk!gZvuN;aZ{D998#%bMmzmWj-^(_P-uCFp%gdXdc71Q(mR9@Kv`hQUgP#w7zh4-p z`_#TgXXT!GR<&#(RY5g2OM+Hj%9VNZ_Ts);>mC_9nO^DF;nSs8$C*7#&pcyw`pV15 zL*)&oJ0?$S^PQapIyN9T_Q|71P5=J>N=o?u@59%x7hm0YwQgbruGP0QPVHK5^d;9h z+ROSzKu_WPy!#u4kN3$>*WG=k;Gp~Ed)GA|Y)OA__r|)wVOx&+ro-03YT7mvwzU+c zt^0jKq;zhG*3pB`?Sh+AwI>A!h2&jV+hpq2E7Q3l&6knk+c%#15!`W}+ChhRvN1e( zwA35a5kJ+nF(xoja9i&E#=F(u9=$!8|ME|=lhVY5v%9`V>`z>LOMeEIMYF5#n5jQs zc&uUCvi+}jE7dy=>QYqj&d0HSBkF?XO{Vb#>kJ zbP`viUFEcZxZBpN*T<4~~`f}!{Yyz(e(%RqS zm}`GC?zrDHWonqca^;W2b2hzi*EV6S<~3cmlDqcyg=v@g*6AeQTYh(U>Ct6p4MC&R z(c6uxOhF4b)?V6GZ7$sX?}zXsF8*Y4WyQmu;N|BNo;}}e!gf$gOHc3E zouBqecYpC(y)}Nldi}<Gv% zZ@-^7bIK_#OzhtOf?db-PZup+y7WilJDVl(?Ek+rV)++tZf?WmXW~)QH+M~% zJlXK=;g=peszRUFG9IoAyJb}V(?D#ZN6Wvzzqqcwy}6rzX%)-$Z||%XBHrCyz5LSh zd)IzNu1Y%fY1Z6YdHM4*R)z}r#GRS8c82wT_qBH6!Bhgy}3x9-!rZ4a&Sh^k`SmV00E$3bDSYdmwUZJXQv{VOOc za&mNJ3<}D7aNwZxj>6B&68?*>Ui9$g%TBw!)hm6MuUW%$|J*;u=jV=dUh8&I+S1wM z0$Px@zpmE8D$E_EH8}s_g^9`@K6~_T)Ez$NTToJRWX8qCTIG-2(%yZx6|0uHE+ouo zQ~7pj`TMwx>tgwKDbJQy(Ep6d~1rPq;*!}*1 zM%PjP2lr323VA5lZfTjo!n8z5Ry1S+U(gzbrURe9>vS||Xk8MVpw;1DtJT#ZvhtE( z$Cth>6POe^JvkahoVYa0cixw;Y;7blK07mOWw_N*4SoINdsw+y_xdz+CGI_6 z^14g?)|N)lQfJwvCr(#4yf)8!u%4N{@cq5V4~>d;%6t~rITC()n!<)iO)!*N`=jE+acxQgUuH7tf;)gF^u2k{tjOp9?S?od7nhil8G9sKaUWa}7 z@}b2itnGJYWk+xK@rBM8Pwc7QUUdJ^BBe94KC@2Kk8Wbyw{OuoUW2z=g-+l4dHBw* z($`({!~Vwnj4t^9uQp~+1?St_TSfoMe*gTb0JO;O#%J4*`yax-XRkan>1XJ|fP{yS zj(T`|3%8hOUXoz`_0_o`Kw!_FJpoZ+U2Cc%ElQv9@X2+F@zmQFeUX@#aoO$l`&~;< zrKTQ>@%Ek`c}+)I_oH+`?3&o^a_at^(kb%3%tDfajG)EPUa}t_IJ(;1tAD@{6x@3L zdjIM=w}1eJMM}!9^4k|I5Qsk$9T0h+sbR$l51X4yjc1vCUB9MYU3K|`_xt%*^Bj)a zpQvnOYwODEy@jn>^SSQVIc~0QNiQBa-UwQ{@%ief+8dI78eJ*8b|*UH{l33V)1|g% zUq9wPS&eJiwu{Gtex8XsKT-A6u0Ma6eCFCQTY7zbePv~{+}-)k6%i79_U=`f=rLjL z+~yfGvMnTJdz+e=7!I7Ayj;sYVdCG(Q^anc)Q$++`2PT-PW;B8x9Rid&6{D8Xan;7 z+vokyp8R-r`#sClXScRyKb|cbzp(J}F{%FDd4JjdeEV(X81ebp!5IesYS)TB*!=w5 z!_}goJ$ipn8FacdRTihemI*5SbHwvZ^oP`^WxKcK8dg6mSzG8MD8Av(&#YbR?d-VlIyvIG$r)}-+ZI7qNU*|Yvy(PbY=H;vBYguP}i;_Gg zl^PKiX6Du_sm*cw>vJ>SYU%f)t}0P`%loqM|mP z+4SY(nvc>6++JQ@247MW&(FBJx=zS;;?J|QJtgc5CoN$2ZvXby@L}`!hwq*(GwX9& zc;MXK-5(G4uV&dhXO=ntv2gDz&yyW~+kX1`_283EVbgOn^dFvy|;BbE3a0JkC)ep{j&6!o56xd?JIs4pHKRC$FgAEr*Dh4Y!Lxf zm=gMr&&f{JTkXFkv$^&2^OrT;cNW%G>%{H}2-p~=A@bwf?*CFIImd-^p4MbvU)Nh% zoVGIe1XF|6xpOm2J~D5$|KjK8_ao_CPH&;Ctn9~sJHCgg8SO1Hbz5)ps>oWI`StaD zffn1}KIUiU{M&iVKH9<6f7|u;y={j1eL^kjYHD2fWNeePzwyf8Pcy5g~R z@_s8Tt4B|##~r!-zs_5r?%N&9BS&H`SNW9sRIc5!ap|8#zr9sl&zUR>AGI874Zia8 z_4?+f+|sFEXBFvQ-RM%cx8mibgx$`+%PM{@72mq<%8Q2&8&}S+WtzUL|9(VzT3VLO zyS$Y}kWWcy-Vja-`?74 zSoz51;FDjs%ijbXjzh5bRxP7nMC!P~=8x+^fn&_eO;K>1&ysk& zPu{)iSMJu|`S&)3et7)!@#AKHyLmcQTc@z?+xH{q)bXaSKWndq%&{u<3aRnlJoR&J z?GJ;sd%rLoxOAMZrFYE|ZUR(Iu!us*dyhBHYR_%Lg)T$f3opasN{rlyQ z^;i3UaXIJQ&g16dvO~e=Cp+(kxz*2Jzi$5c_@40Hr?IpBWUUvJub*f2eX@s&R86HHqM~-4+0<%uY0iGetF1-MM|S7`k1pBw>f&F^snd^7 zUmtVv^$(#=miaX{kzcgl9CUQ7ct3YLYofZ}JeR1dU2(@v&8sz^ul+cOjg>X&iL^3H z;^}GY1-@9YX-Q?An_F*_bolOB-p9xHuKv2TP3_sa^lNo}XCklV-r5zqK~_wxE3isO z#pKV{@U3M=ioXxHZOB^o{Ijiq(4yL_;;HA$->>@=_WZrFd&oC!9j!wLoey36wsGfD*y;AMpBX)N7>La4Nr7{8%79?1|Kgb;T@rZ_w z4ro0XOJcHn|F!I$nVl|8;_V#m4zaowO;HQP4D{><5f2N`Rt zIPaUiw=ZxAx%1+1JL_%RUG~e1>a#9w4M|)1XH|`E@oFCZOQ~O0OpMt7&0J@WJ^$l- zweD}VGNx%w-+J*oI0~j3U5eSyc=hC`rQIL@Zoi*!=*M@%nj6_190B*a<0i}9oiCgd zKG!<5r>?e2*+Ro(y~TOE%f6|q_xAIzzP5ku(YRBU*>=mF+4zM_7Nn-7akWK0d-CML zZ}~c*BQrl7tk|)8ceh`3C^QB_uRVSC?9r4ExePcP5wr|F@rIvQ@V7TB8_uVehG@XGs+4>c*zsbdtpg|P)a+xAGf&_M4z7PV$Fs7svg+vj+wT86->C|5{?fjB`}`c+<=?;0 z=-xZ!^R*g3Ss59F%tI9iReoBRzg;&+T78T2jm*CmJO3`LTK-nB__=Ymo%=JL z*Xv?>1$lnvhzT@=t&QrkyQbXOc=n5z@=Y_dmQZETMtGwI57-;j=LwX3-BYL>xHNnH zC!@`vA}1s@dhUS(X-!unM7UTVO%0pA(Jb2X{;I>XO9J2Rd-M3MuGPAbRWUL%@??3R zX8%l?evYk_v%IM2(CYPjdenE9G|rztKOv8;^!UbWw%i;UUAszsH?Qi6pR883cOz3n z)w)CGDNC28W_|D8sW#{Tp$n%X_g1ab$~QO8OYi8)K9#++d+if`?~h-<24>!{ShINh z!Pa^`CH?n>`4k9duoA~PJm(C{j+QLJ>b7E_l(cM2`5FCzFVv7?8IYr zO?lzMwXFHuFXt~`{8o6I@wZ!H=dMSd4mz{zahLp~B){!bsus3v$yk@@|MiBkX1XnbdTz5LOS5pCM(w6GyYPrUa3s&8@^RkxICJ5Oen&(GhndpCDj*qJkX zvJ0BqHE()b=5wFV?0H6{T!}FHe_HBI^`8H~6k5yjiuYIzY-9d}ef4{q1{Ui77 zd$pf=8=bR#E7z86ocbrx^X={J!h4>aIC=KyQSa#&)~$Uduw&02_NMLEw`N^++P=xO>cRZvPkm_Vz!wgKPc+G4L^_B7uT}9X(xF zZW^Bsdb&xiEe6!(+7{q8>$CX+D{pWA<3G8@3*P-9#WQiIDx)j>7$58{zjtu! z4T~qwo~^1e%evyh!p^?BQ+1x{rYy{a3lV z^XKBQwNWpA{`q`kOQm<}jf2h?v!oC8$yu{iPE{;FZ~M9DnCHaoM_aeBtqkc}Ip6Q# zH~aDj+wWiJe0Ff9m)c}SGd;eIg@re^RC3?Bd-vm~Zs&{Z^X0Fsi;d2e@t%5mS;|YJ z)yt+%yy}>irgm-3U)hWG@?pPs#^`~@Fu1t5ScEI3trjsE)c?I5^=9du?Ngs$IlI>G zSbsJD=4WR_TUO8RxGym6O!~EozB8Vc5-SWB=e~KkebSLc=Ll1!LW6Z50_C(8-?5F@ zS-pDW@nAijuP^PgIZfZzoIQEv`lX=bE8l(hx%)F@?%~4{ZRN)4` z`u}!yKQcuZ@yj23KEH0!x3}Auo=OegR5CO4@+psMacS}POye}kD+iK%W+uP;wSDUi zZ_9k|^O!|s%(t9#lw|>qFo@=#i@3dJT=Dl?PxliXulAe;% zp{++YY+QD;l((<8@?X7U{Go9{6H-d?Tmo?d=#NlA+o`nLV_$a=MPi&}Vi zIFHN)d1m%6?w+2UL3wwbioCccO%4(em+zPE>}-;&bvSy+{Bqj4Lz7&&A1=Bw`#{js zO`4Ir&aBEzU1IC)<8$Qs<@8lg9xqtn04g|q|NedW>J?KflZK|ATbQ5OrOSDbvwV0a zO`6bjA2ik1(K@s-`S{1%x9(32UV3Q$tXXYq zqqip>d3~7me&Wian^SaR)2?nYx-@U?pKsO&=a-vr|24xTvFX&Qov%{T(;pu===|gB z_N{EPx9>nZ7Gm>)XZp0Mp5E8wqZa)8=d|40pqU64S2w8|9`7gMdU?s8>hBK@GV4}n zPoFzCxl3gtZ^He3Sx_Po`P&y`Nb(<-K>&DP7*`Fn&|Z`jVHIA`RBN#?;sZ1z%=hFxn}@ z&Sw{=dnr)Mb$edy*1Gw7<4#|?bSdk%+4ZG)v0vU@6~15h*>skxVR zHQo2*rPMHAZRNLD&(8Mr@Ytcp@%znW%|-wAFgHw}E`I3nAs)MbU!^;Dm0wb@-|vtP z&A_eCOAgD=E?DekmvMKMXqwOOm<{JIt)I4d!GZ%1l4n@YkNjrYcxH@!X9E4{d`_TlWNX}Yba)#lq3A6t;jD5`x_<=!4mj_kzb{6*QI zoY4L3EbHy`bMuT}RG&J1dg7ERYYKDh-_NXz+M1(z!>;htlBq#SlBSmRR|?DA`rn=B zJhX^E{0r0X=kx0e?B9Qs{<3_29oM_Oyr})>qpn{H)OvFwZq4zoIML&$F72H>x45+Q z=n_tOjzgb5f1VikG}j_wCn5>Nsm6%^tK{d%SoK~0ll9DU9=p1zs9C4Dx|3peR=IAt zyCYC}Dk$%t&R@25{^gd}*Ei<}JuP@(C4zrd}+taKO8OjZ*TmA*dh-1U2|Zf+dggoTA!^UodGB_-TkDDQJ1 z`>=b$yFaWJRd04YD86U>*Ts$Fy|>pX-6czxzWi(3>gsyq!*R8k?%t~wItRqAeEGBR zj=;C;jm;YR`o|ACUu^m?@4Wr`&%4)@>c+;juI@`sPk&vyrue!3i|H2Hff^zwPMtb- z)O-4e=Y4Z;Z1~8(_Yu2E?y5~ks^jJrXmlVKlvAgx%Wyq^|9pL-|5-lQ)$y|aHGlT= zc5VN!pZN3o!rJP^mlWMfSF=Zdw$#^+ih-rej;Yd^B!+6KQW%)qT1Tp(&^{snTBpUaq5OZ*x8)B+hijn zfBiMwQS?+xFXo54z_&BTs}3jG*xFp!8SL(OW7Yid)jsD|dzY1&ndRQp;#h4J-fMMA zyF{b>y{UUl_PqSk%PSI{TUuMW4%PiE?Y+19bk6O6>J43|PMw^*Jmg-_$9XT0-@fg= z^z`prrP3yE*4{i9yZhtoS@%C&oZ|oS)d#^FJF~a1oRkq{YFpp3C8P1cfwZZ&EiElA zYMyBL&9e!WytcrR*`;en%8jV&K|lL1FFifob-J?AOrGj*?=EZCUMu>3&$dU(SS)z? z*#qD0|8$sU*I(bQ?yxp$E6eSmrT3kX>e+8zuQc9hu6mzU-r3o?qvGYHz|0$aQdcJ! zDT<^(C<|nOy^&|nq4PsvTG|3=fMTyY+-r3ckN30v*SBUVOZT~ z-FJ6)FE9Va@cEhXE_TNYu(bfu6@6!x7A|(<$h{jSu&wT~+ur@@e~(Zs5z~9fGJxhA|>1or3Fx}`ysU97-{fGq-?LMr(x?XhdzDbjW zbYk{|1nk(gd*{QO>ANy}pTAOi!#bhR+W8BAqhaCN(tTGiPH=2yx&1$8PsiEl?VWw~ zkDhqWvHSc(x5q{4;AMZim7C<>&#Y_X5sO=|?B37ytoxFx>Qk|QH@567+P!0kL|vV) z&osN>)h~Z8&VPTe>FrVP>5gGf{eAcEt98-m&FjsU6jGA$Dt_*#c5be{{;P`F+jEYt zy%KWqgZ@43fJCemSM5e^7Bkx8~0}+TN{N|yog=y|9;Qp<$kx%o;DF`=S{qN;pz;D zGqa4tpZCXPWl7ont&w_nPjuf@iOP+0dsD7;*uUq|b5Cofr=}+V zI&*V}l&~^~yy+|6E1^->Vk3o@$}7)|>APPSzx=hm*@2+?Xe7oAUeq-`=y}9{& zFI~F)@#h!GCaydW5AMZbu14Eu&9mQC`j*Sx{VTVdw~CO>^5gS`vtv#lNIU!Bwf34d z`jOjY%u9V9{dwLu*KFscscJ%Ta9thaG`-;3gG=*T&0u+9 z*Yt^o*OLsBugR#W#2o*-$417kNaS+b8KJ*USH(2Gf6>s@J^E?t{TDL#%B+={=ljmq zi|{=s0ZL^%KR zYmSUtA#eYka#qog+tnj$U7qPXUG3Sa^lhJHW}XiAFAL0Mh}rW+`_2E?4d-lx{(eu? ziP&*s&PiqMfOu)O-6FSknI=7cv>-sE;Nzv#Jzu}=miTiB+_3uhuMRXp7#JuxX;N^( zmluX_Ztf1hAk4tf#wWMLD8%XJ?f>7!9z7OjVSPPs@9% zYinRgNK5qgpu$I2G~e9WDy`}zEN%by%H$U}7q_1){`}>G!|4eEN7Pk9+TPyXE^j`0 z(uI%pkMB$l&RbaaHtI*gBbLcW!LcmV$s%l5A^%w2M`+Eg&$r*dF8K1JkVncwVB$nU z&<^t}2N_veS$9mF(ZS5l|M2}`cb5B4A3kghRCdp>5qm$g?%3YnW{-r0w4~3Aaz}kfk3_?T3)en;{MP28UOTQ+>zT2fGO;DTcF$GhL{L)xA`f1doPeX?P} z1BQ~Yx4o2-W$m*!r#6J{U*i@MqB4t>rNhb|G!SI({!DG62WZ5oXa0}G)O}M< zKaKeJ)$32`0|mA(@7ph2TdVcj(b95fM|c0>b$6=^f1Y}Ll+CL2jlv5~UvR73bxfQ%`7l*#*c#)7ex;V9&S&(btbZDLrcr+rlocBUoNZ5V@-Y(^}1&D zVzzzzW|-DW+08c${_sp!^{H6cnm=w=$}Oy|A79p#KYaIY>|?t<>AyaH_;6rOr16KB zSI$qI|NqDN0;fZzI&r&vyw4n05#l_y|Np#Gr);*ZSoXYs-udqVw*{8nVfN(7jyb)r z_Sb_G6O)@fXQviff|hWty}d2F*E;Qs#vH5CV|r4DVq#+rb6+i=VOP8@A@ux?9~Ecj z?q_gtJ-lr5WMjD}&sYC>Sd(((_2G-_);?q7g%vhd(mK`UbX#L-_fl%EDmm- zJ7Y%2%+1da1!}dfU$6h<>C+RZP6fSuD{*6uq*_nCyu8n^3k#C%zrWeMqx^l`(||oq zO-yTIx65T;Un?%U-+THw3DZx!&3(FIzAM8#zB2hHZxOIl_wW4)9_~vOC!V^s zHMcv?cK-2y`?VgON-@%j+r{H8uDd2D;nFdopJ!&BpQ!rd=g-7f%YzN7&xtpkQ@Ea# z?5fKmcxe&qzrXeQ8x_~gdT`-H)-%v~O)t#dU;b4#UQloEGxN{Fb54IIy75XUy$Er8?wq4^zC8<|Fvf>-g{R|6V8@2VwBG%8^;a4uU zFJG?y?A$!fS8Fxj&#YsbZF=}oYkXIoapcs^n~j&%m`K|0DmQmNb!M^J^Zt$x1v_@{ zpdkglHX|t$hE$hVb}{mGH5KUDGDYT9pKF7MGQ6`|;Og+V<_@X@0X;Z8Hp0 zoBp`Wjm^l|IP~A1_SV*@ynN; zmYdTa-T3(UN9|v>CCgsLt+FsuVp4A7zijy@XfkM8x1oVy&A(FKNs}gr+O3aYzc2C; z(>2Tcue1y{NQUV|H^uJ$o^W}Z?upZv?anuD-faBq%e&UZ_4|S>MLc-!8UOuZn%R`< zEtdHFo$ZY+m7CA~exxyVQS|n85+8pRn0yGG+j0Ba)hmA#Cwe@1@_2u2$PqFO( zwc*RwFJHbKIrQ`MhO)a=Z|-c3el4R`S65e&{YGN9`b!cle1|ll{R}7 zlk1~2aY69$J_*}bynCg#F)`}~>&>3D^z@on5pLh!-sL`d^5l)Z>G})@jvi&5tnPcI zdd3!A4nDqP+qJ_V91q?9AfRN+wYHg6Utc{0rAKaNb_cDgi!OA?74Ub<9SYPsTK#@c z@3*(NlCGX#J#pH+b+&6A9VJYQTCUxjwG31iKCAKD|MOe*!SAf>tPhVabaq+pdspD( z+30PHYIm1)aPVK2x(;1>;M&su&^~_sfnUAS8`Iz0t?lN&vO1i9{hmKUY=7U&ls;A8 zBtPj=(mKYdxvHw_k1s7fy<_H-mfzn$KX{MBJI4S~SGiE3*(((deR-m;}cL|pvv&6}M6>i#WKe`%`r zPI;Q${a0RU(;vUODseDxel1EpEzr{5e)uSh@aj+VI@Kqi zF8ujP^vLn!kHfO0xVX3IzANa*qOQB;`ZcOQ|#S(CA-(G$zc%X zRk#29VXx=;vy-kHnVXA?>&Lpq)Yudi6$Qrp5m>iw-G|Sgol`0-4jn%HChx~8HLli0 zN&l9e4ll4?ob+^i`_ZEX<;BhI?d(m>O`yDaWqtmg;>?ppH$!w{(?Yi!eY&@|`ozhz zpaVhg>ik=Hwway3;M*Nbm3ux;d3kzVTwD)cz2cIWmv3opQ_?az^x&T7Z+@8rpG38_ zx6glhO;p~$&PHa58EbgCY=A56n7Bsi^ll#BI!(XK-Y4?sEZs&jaC`jDS&W?kh+jaH|jotR{LH)dm zE-o&n9$8sZ_v-Rvo|gSC%QehCR-(PEqvJ%~i>w6-My$__l|Da`0joQ)Z~s4`obNBM zp7zpI1g+uTWMc+8ApfcWXo=tE^7yCQ+S}Q!N;2|~ihvf&3r31bgVxb!b@)baTeM@x zj-u)h+{|b9MM;8WC+a3TO9%=E@)kVJ;@OsSH*DwICr?`9Z0B!J>H;rn*Xdv1*xAvs zYNBJ)28Bp zurM}%e*TvB_Ju3=@83Gv%_ZgfBVnO}M@LScdYg83*2A6Y^EW1St*}b6Q#R5EhZo5A zf`PpUEJ1+-a(2fGw**jFfF%U4a^!$-J^;CPkyIl%j$A+>M0tZE=zb2cmMj(&v)aI( z0BKnzctgMqq#T4znZN-8)`4b8-!(r5!HH^5pFRZz<89EmtJl&nAHj*0nj%~$QZ}8+ z?QCY2nfd(WG092!qFk&hLY+G&hvj~#nkoKT+Qr3`Tl!GPi8NV@5{}d1Yu4PUTNWK& zWAoElds)YcJ$kYGdRAUe3(147_5c~1_v^{+Dbd?M-2HCL=%v>7z7{AK3mf}f{EPox;BEMJmvZO%>)Z|}`zmvV&G ziwg=)tb_)~89hBczR1X%O$IZ4+BQEw7p>{Kt@nC&N5=^pXi%i7Ph7FS%*rEDHnbfg z@xvQ*>w-&~xY#Wz-&rPNEmsT6+@|}@T{}hT_OaKlE-oo@b9Cl+oO$+WsdvQJ)9a_+ zUK_pji1q(}_Mpt+VKXgp8EDVl&dq5LpI==qC@tNt<~u9l$_c>_U%zeyyKs6%O;~4# zhdd}UH*4zXI3*<|J>9l@_H5B$XO|`N(-N0GfBm{yQ{H!5nb8}z_0ugN%E5^f6m>2x zcp?vEC@8X(lom-fPJSvpF;-ho&n+iL=F+806X(z8Um3z>Zfuc1WCR`h{qSMqwY55k4-cJp?AmqU_G#(Fg=-(adzZKEu~hXrqn$FGoSZv~)rG%* z{uB@t!y_&(4yutF8_!<2a{qqHcdvy357L5!CQX_&arW%)O`D8%?AW!y^RXJ}pv#z7 z*Gx|q<}_}d$5%;QmcNT?y`1zAt{KLsB=R+Tr z*8a-;^8U8_^Y7MHc6ytNii$UW?DxH~{lET{Y13BSy?^(v?D{=_l-Rz#&o5y8`m0wO z)NPt$Rm)biGv;xfqHffK)<)(FTVG!;nBwJH`~7C|^9_}+x1D-xx3>y3;PdzW=FbtE zzm*@&eU%!jDh>MCQK3;bA#>QgtuI}!u$9j7@4(va+r}M#sgus_3 zt+yp5Z|uso=99N;ID%MBb%WiMC)Jr&6wwN zrp@a+JA3=1ADzNc@27TmbN~AGviD!@??czGyO-=*T@?}2V_W_G;dxo>!uR)VxBj;9 zTKeMOo#KkOTf;9LxGv66@a0C~n_HWg7tL2}j&oSvC(G;Q9QsV>@R`3nGn!OCz1{d& zeM9m0ccX2xMuXkD)u;T9VKrPqj=jML+)UCg$viR=P*|t*- zZY$ZV^Yibn4f_uMViTNb2r38ECeN;pUuv|<=k9ae=q&tYvu^WRY?+dW>_P73&)YQk{OJ8rS{XJje z`#tLy*S4-+@i=4GwA0hpA6WQeKddyB&KZ7Sx_ZSo~9P6tS zE`4p$ZP&N*e5BrV(Avg?*W2Do{l5_w8WGXqJ9~S=@pG{i@8{MpcK`maN>=|_l+HAr z*tRpf%eTH$pL`m$WK_nkN<@B-Js)T_G3dm~o%Xla&W<~N?TAe3jHUA!lOuKRKYPZt zE^+d)-qLsbD_$DK>?w(SUVi#Xk&Ja6)A7Ff2PPbBHh6Y6FiKkW%|f1SOJApUz8CNQ z$_pyrdlLWd`|jeRbaibsdwajk(K-6hUay%FR{HHu<(V0#?pNjqEO?~*{7R;=OSso+ zFCU*HPx_ZBnCbbw-@)+VvA=z{U7n{W=d(IP`I+VKl|H|V_4$?2beT84Q?1LggTJ*(r59;q6Uj>;vvq?lj2ba~^_Q}f?iojV7*f^N|wr3Vk+H6B{z z1ZuTSTztIX<)#gbecy%^9GjojG(J5&Erjo>(BmJSlRNx97y=BJEJ;8A{Nl=F_KNE2 z#Y>j3Twj0xz&88;N9J13oLVR+CZ7CtefETzmD@LMdZ#gUk$eBU7k5?)*X-FF7#7xc zWVZRn;_G=T%a?>4)792K+;6}3(40tP*X4n0K7A^x+4#Ua=Ew6z3NcC(7u4=9dvRx_ z@+^}~CiUgFG<0-ayiVzYQWhuYb=KeiH)a~onKQ@W&DHQPR{wgB%(kd{Gecobst3oP zzkd~`pPo3ekp1S(n{9LFu>JhWIs;Tj78SETEPZvwvH#t9MH?NSd-vidc&MB>ch1r0 zjHygdpPQp2Bg2CyCxfT%72rucV+p!OL*0LFm}mL<=hX^EN=*Cq*%eH&dUUXveMjA6 zwr}zl4Ogz19Qz_y| zy0f#G9kgd=<70KL{|@zk&(>eqIr-yZg|laGoo|S^c5eGD4G}J#m^~7inTKkwE%8j| zd2yZpprhl5PoJDJBQ-a@OMQ4{rm;nZMwEfe>k}7~LEYLfuYT@Xk$kIIGUwgv)ZX8T zzH9PttdBT z-e1^fo8}ijckvTJ-{;RCKW>gRUZ%JpGkEHGP-6Jk)M`=xu<6$OFJHeNJoEC^W6=1? z-z-Z$c}p!0P-E!f^XJPA=e7lu%g#3EKi2Z`y)tNP!N+s+tlQUztvT}d_jm2XDngvk z&d%*U(ZSLCam&-GW`Thfuj7+1=qNY{%$xq5AusQ%>zrOtUJBf~?fmx_ef7PPYYoqf zVp%nuWp8}d^8TKgEgyx|IjgctGVaR>+f~TF%gf8!AHOgl;rY9}KOPNZ=b*4|6T9b zmv>9Q87E5ww?+PvG?=pV^V`0;yFc8muU~QJ-R0fl_v+urPW`JFx2tF6<(BKe&Q8pK zuvEM~>rDL4ojYf2PguAhaiL=~+mDy~@2~7l=1<+QHb&q34uA57eSyWG26Nkk3m!_F ztmj&l9e5*o*)+_HaY1tXw;vUs+M70P+GI2}PCqm?EiLKqF?-N@$o-uc7rSM}{ycT@ zqM-i%FG~0ReUEPXu=)8pMYU(Mwgm@*#!Ao3HulavDzu_P+cxtNd)DR0PoA{sKRa_x z;`+slg75pQ{ZpCVX@@6&@mj1WS^h5JZ(DEE2K8H84j%gXd5akXgXq+sOS{Dn9e@7u z$!o4wru%i@?mC!orVQqW`A1@f|$Ee=Pg2@{>o8nxN}= z(>85+QGJem@nY8AgolZVKmKg?H!*8s6y-H${{8(p`}=<3mis#EZ&Ep1tx^QJdjdCb0l-E{5m2D5ACIr{5`1!sbKHz(HZ*u69H&+o?p(MRT( zfR5|`U6#w52wEPy}bADg#qQ}e!ULS5>xUui# zgu8d|e7G_>Hsmp1weNGI=cRMze(bq)am4 z{Cc!mQ=a=@!d)-lqbq}#fAMNxzn=eCf3^RHU(V5B#^T z-841bK|K28_E#yXshr!C4;^+rT3lZ2ygtr0aQ!^(Lx-F$ZuigMtCq3-y3vh0*H1@% zKRheq{)V%A{9IDFzJ2s|art7ue($%gYxA^DO$m>={6+28!^7=blMDK5l3U_Hqs^Rb z`wapF%ATExytvmwMTm2k{r5F1YNJi^*9m>U81!Nn3o9Gfw$E}l0;2vshZZTx*of$I zNL&B%-5Yj+sbRtdu@`q&FIUJpfA4Qq?ePX?m<&4*btpPe!ijjm$bvTb_53Ppvfy37LLzv0KvLTlY5<{Ilt) z{w^E1`W551SXezP{aRWyM;D$*@;p?8Z2mr(Ty-?_#)gFnzyJNU+4?)Scce#yt_N!_~##|WhvU{8}znK$~O&sm%FL{fBd3w$*EpT*<>%zJDpG*ub+K~KRc=R zv0?P-*Dfy04zw94ZIb?1R~PmCWx(;Z`!+CzhlMRG+dm`w&`wjUE&0piAN^Y%XB!S$ zop{Iyw377o>(`5`m;Vox+w}~#V)e`Hyt7kgWFNY^eqPn4?t}GBOw6-6!wv>%h;)QU z1^Q2JXjrx)d!b@UVc{XpJJw|edl=VE7F?|u^=Z!PRj(f@-O$sjT2Z!tiAtisq4Rvh za&z;REg6XcG2R=X>3SAu`OSp~kr5#+{Pwe&l->Jh)vVj%{$?jQryu*fLG7Bk+~%#| z^!#kTMQg_imoF=Kga*B|T(nPU+8muflj}6BZavt!RHUou;J4;KHGv=J%$>_?73UgL zSj;~&y6e)09n%yQ-D=}AGO``lH-EYPGUIp4JIl^hekOT&D>GL%y?yY&fw%gVm`qAV zO!3^!kQJPNZ8S`D+~%$`@vIBxovhO>C?eAFqlKmU@$AWKZJ2l6@Y;9v$no3K&Fp&{ z*52M0-UeE+ecILg!Lx77R^_i+E?iqHC?mq6&1|E_z##F?)5S5QzTSTF8P<&RsT+2# zpKkiD-E`x=g}UoI?>WJ^zyXV4|mG-mDa=SikFt~Dk)2@V2RjT{ zBhm6&0yK4Pm9))LF*17h;7aDhn6%1D{tfy6<3YVx22tCvD3koY4I2VnTwN55w1oP~ zEM(3{Jlhv%`m%1rK1Y|3y&DyKIyf8}JD=SRJRTQz!l?DoA*F+5cdd@`UJd?d{OQBO zUy0?{LPAt*(v$CPiB2l2_cby$-kA3GeaFAw8*ZI{T4V_t83+ham?04VrY81O{e?L$ zYmO}IG%P%OHf|nc^@;64D@B6s=Qh2qe|I2%|9aswt3#&xs5$4v$Rs^}v?24e*pA)1 zA3qguUlf1eZc*5u)p}=Y_g2{ZG=Jq)QhJ>X8f3e||9q8|dB5S5=O0#_o3eiKk%K!t z&rX$&G~wO7S?#IG)alc+Zv>lX|LyGT?LNFkax+g>ieR;WmgZkZy~!uP*oCFW@D{(n z!Bkzz_D1!-m4!vZi3g4^e%A22{I8Wz_n+(L{9X02PNE;-6s;~)Of-F%~D1CKJG|t`EmhDK@3X%IW;^_xpuaf_Yezo7N%IZpG+rJ-6&zw4C zl-0U_x7TOgm%F>Bt5#H1aC|z)tSpteX>+m9M3ud3{(Q4`Ozxc>UF$Q;fbs3^tyd+@ zt*xcm`Q#3*-@o?i&iun|ysXYzm-Fwtd2}RJDw~>ye)kJY(m&r|`#f4*UA<*XhT@KO zt*)*XWp6C%qJLW#tuirMvTRx6>ub57`I_!!7pKhth4zbfaA-evC{j{l051c4G9^09 ztFt!y)qDLLetTx7T=^cmzs`BX-6b0vV>`~Am{RFpdDO9Zccn2WsHc)Rzt+e#L|G!h zFtfHIV#bPE=2={yk3H26KcX7snVG4%?pTbm#yZs-r;QWN{|u9zzN_@&?r{H_-)FC9 z+_Q=JaP!>V>YSp8t)}3p&o~Aei}(u3Bde$Bvfftro3|y%>rM3OX^Ks6FQ=cA_!Ao$ zdDCN0Ww5}tLml%>pIus1S$y!@%HZXuZ&u!Jt=E&9Ewfi8M%=84mBmE#?uM@?=AN-$ z^o^UFTQo=BvWlmb%}1*C)tAgE)26+WJsh<6s$q8G`S`>0 zX32Ji?LW0-(}oKH2VXTEJ$m%Umde#}$F;Pz58t|f{k7=vDMzLxe*468qiA0!_C<1_ z69pY3;^w_Qr=6}-9Is!!M;_#ZiDsbD(9MByo^Rs9rcDi6G<*B@>8A=dY<+F^;;*fB z`P*abv+EAK2iqN8eb_zW`MSHyycWfN`0~Nwxt}a+;_AA%wMLnn^lsj~d1H&~4UbF9 z%k>vuPUq{DHg(E)eXVK3S84NCe{Elz=WY2>pty2z!K#4T@LnGupCd=Tr@Op;{pL;2 zKCkZ|`p?e(`pS39tLaxgy#23h_Z~A?!n1jL`hjVm-`=hMZjf~*!e_1-^ZoxHltD|o zXL=PceHpYmO!wfnD_+{0qMCNDpKg1H|C)JLTy1m535l!Q!yH_~p1*pebmQEPxrz~* zC$I5H+C*%qeexnu#-hTbEH~m%0%O|fN zE8o~x^mWyXtIVJiQW7o-?d>x!Ig#MF-k{Z~@n-S<0}~e?-*QY_Tl;W*{SVIicQ;mE z|Jak7A(^IszG3aNXwVX{kdw2yTA5bY#pznr9h+;tW9~#nj_eBuuBW`*Z2D|p+_wVz zi2Ez#zV?0=*GqWxr2oS&>BSogJ_dw}skBNGG)k9t*=1#r+T_z8Z@+&XQpFz< zyYbwtTQ07k(ynR4`mmZ_+1+I?-+Y`fZC>B`<>v+d6!LOrHm*3~v3beWX|3DxdY{j$ zbraZ@db@1RpYz+T-j{}jnJqg%r+2lXVbh1e#rGWU?ke@27ZzOk>ZD$Vq|zMetdE!0 zZ}`8S+3K_3m;3D-6CNrRtNANGm2+IWbZNxCPttP_=j5fQJlLFhnN@p!=fj5&8@K;| zuj?2Q87a9hW{X7da^K^flhq6V|EpzisI0Vncjx4hced3Z-|hH#V_z~m18DkjZxI0CukxEdR?nxRx6b!IedgX!a*h)8jwT&jW9i|sqwjZRC1^F|va>T%FBdxrP5fJQWiPkj#6-{%O(PYSkDQ!S6RW?! zJ$`nHN=eRrIftWJo?El8A8Hp?kIueFg_VKfOnf9&gD09(V9nC#b*t(s23|NjM;WnPL{zjNul_ZMY7PoBK7?XSP%kE7nx3qM{;1r1-jR#xu3W#1xvtpD)c z-QU01g*!_Gx7|E!oN)SQS;GIi8{6~uCv@DtmU|mCy)(Uy&(X!jA|^JLF=Wc+nKR1^ zpS_9vvoX`SXi60mul%=Fo|n_Q&(!YC`CGSPU*i9-y|KH?S5Nr~TlzG$r?cZolCy;1 z%&Q#_4;$n@({YS&I#jBnViULa-ORjL-MKowHa0c}>DPE_tiBdMc`hE(rmhlm{L#|W zF1770N(X;@zaJbqb*)-qY3b27;N?7-JIdb|E(Tp;8}@gT)atsG5@E^{J+|!ona18dKd)hooceRYx}(RsX6e{2apnH=`~SU78O{<6drZr8)*U^@ z*|tDMO)cr!o1FzyydJ)O&0Se(xoOj;kY_u&a<1_RAKTy0uU5O_y5WD*G?SRvmTw_Ia+&&86L5%CjsbquOqsHcnXm^V-#`qL-J|b-grBe_S`!Rrb-N z$A;zqm>3-PR;?>2D>~Nvr)KK0!|rZ->}1~F3j1$=5mrEK$OkVF5*Czfc2@2@u?DnQ zZ?SvtmNKI+LO0e(is}CmI?KfLrSJ8dH$9s2zHa^R?w*}s^!w6^L}#7YFRHg(GUe7S zT+6tie*eB1hPj}9w`V8XY|gm8P50TknY`uY<$E8swzejHJM*%jY}22eRn^sr&$g`0 zx~wz#bfL8}^URquwR(dS6Bo`fFE@*ci4A%5QfZ=x!JDn&8-JW;<>2PNy0bnYKtZg| zGCs9pnkp#8fc=Pd_tHzb-OtD57+ODYy2v0 zo^<|Rt%kPt;I)YFLZ4G3R=Z<=;!ANb0#%$i~n<@j2NgOP4O*u|wkAIlm9z zKf51p<6SdXXKhN6rC$8LrXN2l?s)k+J0>#9s0cxitvuV@EGQ_)XKsFbb;9jg1lFcp zU6m9c0XoCtpW~sguTPxW)7{Q5f9U8^y_%XD0XeZQv%o;J>yO_aY-YEpekUW8ucl~j zF3!rzT2NZr+TYKA$jMnyR5J0a$^Sp6vvO{2+FJB`a=*RP_2u(7o!Ho`d-%;m$qiR) zRtIQkJ>%I`!@AvAD~z=!B8I2j+`OWqLcv0V!+%Ss)8Ah@-He~(^`rO8ugSl$y!!h) zMRjxWe|2?cdp-CBZ<>Rb0!)mZ`T1zg9IM)0Mb!tziv9V_ZRNj6O$g(>eLut z7u(#@@_K5bP$x_6?=NPRR-jcKD}EJS*ydsdI!ALQi&^%vO9iD59w?rfXU#ve{C!qW z`TKjeI#HWMqPOJAGGU61PPm7PQ1hYqV2_|I;UdVqLNDbuo=TnMr@s7#SnJJgvF1Hv0Oc zlj@)eck8fq0S-YiD&ZCu1uZIqf`XB5d3k!v&dz9E@+77Ck@?r}$KOO6KY08$_ZDbr zj9}o_u(&wBlZTadI-P=ee8HhbN`Lm{*>3y4llhm=Q^_oS9(-vSL-= zlOjtMe(qGRl_6Pgw+MjN$V{13#BE*v{@BIj;}hr4UtcB<+UgBjr+j&}I1|&XD2rCm zl7W!e6Hkjgy0}ug+#xAKR8xd2B_&1S^SfA^njZo}oy;+@F&7p%GXMBd(foNPC_*M~ zOfiyFab->Aa(8!!gb{eP$cda&DMl7AjP=<;$peHZ#s+CTIFN=|X!1^kp&IN-kZj=B zX24fE!Knk6{VG9>pivf zxx`cQa4+37e!5K$9J*i=1Gg^OtJw1y5e%ja?_4`7hj5Q>=37BF1|zdJuyRl$o;&$u zidNz(-o&gjNT4VwDQ!}JWmOI87($(~O0?BUah1gnzuq5usA zef{e{b{=apaQJ*A3G9CmvCSE=RD2$Qx03+?lOk zv&QGSNqm&_A%+EOwp>X;oH%RL9wewNU24`cRa+#+5$?2{X+CPgTVE_b*Jj`l(=7$@ zoS@)D(~jKTLRSSq*=J@hlJD;g#!Gw`|DP;{XYrTW8r&I#pnrjQf>SqHb3}LJB+o zO^gZWPV@}&^2~iZE1#2rf#HDks;zN`nc`;ytM8=gdbcviXZ zsXIvP2c~D0`+o8rp536V%#3<`!Iv+I?E(#?8A<5$|o=6L*}vIvs4tbk(Sfcby`XAd0eF z+7I8Az8LEqQ6y9O`**f6`#PC&->X{kLu{+RZA?nRxQN zgjqM(%li52N+-UZAg?QS=v-Uk37hlY`XH}1NY8v`dDuW_Z_iWbh)Fz;XBhcHCA77d zrpO#$I(_03N2iES5%F9gH{Cb4yYb<2*-O?Mle5K9?|;5N-oGYn_0s7eqYlWw*qbhK zynVOE$3(S5=d#xR{9RD7Lm#BC;s5s&xz8UuMSS|~b~5PHC2x?oA9Q*QQFet-1dCO}Vvj5=g=R%z4kJWLB+YDEl^P>58q>5@j}Pss8?JXYI%XiplBA zD*Y-a>Q4CobSZb>d)vnr%cc~~6ewO{2TH|(@BbPxemlkZ=FL*)8{)rO`q^dHmiGb&&fQaLnfvu#uwQs>-nG{`+oOX))*pzr@UK7ndCsq< z=k>KmqgyxhXJxNknxdmR`|L9d&1X7>AUCvrQ7N5ge6~1it+#%9;VJ(~QQ28*BYTt0 zZs(TW&NZ8T_R?ukF#J&7dd+9~OZ_^bLv}Atrn(etjY{1cm%jOCO7SmVP|$W{tv!A> zf9tZX-@=~P{pC}9WB=uz{^X?e*+og=keZtC_qJ=dK0e=`emSn*kK=b+{cI`kzQ#8~C;iSxuH9ty z_w671`SGAAiwl2m`}apdXXN~NYxec`qModK{hR%M)>O`&tG1j2g}0n?`VDNNt45^s&=5BdI$ko60fA~vZuA3C0oN%y>Nhzt5mpdz| zbFVb_3>N|J1vgBS%)iaL!K)D=aHLOa;{p-UDRO_9*p_rCY&!7j(7%5t7WZGAdo#5> zt*rdr>#y?F@83Pn6vfiw2KR!f8R)X+`DSG3`0ZD%FkaPJzaV=mW9C~ zR8(C2c=37u?#Rv0L&`NPQ%~z|>#&z8^DxP{uwa)rBf|sMQStbYa?VcU>c0Dy3<1@ghZq{7 zUf+ItdiCy>BR_w=UcY)b3qym~>iD~?3=AP*o}QjNZ|7|Odadxt!}ezjX5GqvvEiX% z>8&qYZm)@W7#PB^;G2;W1;wq?-&cAJ3=1~By0S93F}EndgAEiTdp_U$9r^nI65&4W z^4T@NYMB_OxC*c_T!~t`bgAeKHTKpNhl^dJhR?h8S8Z*B$RAxi5mcNH^}>GzG~DM} zm1=G9<>NZpaBZzw@8mxFby3+Tmfu%raEJs)V`x-V6ePS%GB2q_ZOsZ=Yx?B!dtrtJ zI&!@%16-lK3NL45V3-fvB!$XY9=J1e}L zvom3CKW>|0uEWOQp`dm;FzEQh97Mz5&1X~yxw%+oaTh_ySEq?#5(;76i+>yK}_4Kr>v0nFX6&&V$G-Gl9s&_^V46D|hyWTy0dRVz214HQ6tgEXk z%3f@k@%gCu)mX2%%-v7L3U4U3yBu!gUA0?;p+QTyg^{5$_1YUt!*`4OlaBS&hnH(^ zy;XKQPdK*hos4wujzn<5V+bmE^mQY5ne2=GmRmYKPuZ#D)7g+`Xd15weNQao$SGJ|~PSSTLrkrbZq zJ4@u~(W9bOxtr6@CM};^)-~6vw5w0n`q;O(+xpvhrPKBt%is4?t!uyb?q$!;&T@Zz ztk-y-|AL&;({#Jj=U1EEt9iY4hH<*zmaMBg@YTv zUW-m&a=xR3@p_!JKX2WtGuxu`c3JXSy;#ummfPd4{r{i-bBgoc&oE3rrhjYOjil}! zuluYQhprC08X$S~Z0W9FPcK`Zn4Wxc`eTL_C(j77E%|!Z{QePp_J78FwtqIfsLgv{ z@p0*NBe5n|7f@Kr)x20}@oL86$8YAPAK&ru@!~BZcKkmVELozWx9`g&Bj*hr9W#y7 zk1d@ZFSa^-{kg(a1_qU>?#hiupjMCZc^l#HwgvS%vAayvf6IJ5XKnauZuz4Fd3PVp zDXwy#eQj;=rg#PGV|}vH^7VfTZ{^zk`|()9IxptUuG4y!tGE~%RE(8)ezY1UA3Jh# z`5d9^_bZ&wIc=C<^>yp@M=KWhccss(J@&$2#nENHv%?m?{rC6%Cifmj28U&mf^2_Q z?AT%P@8bjeNB`L6R=f*Zv}1?Gx?R6s&G_+h`Nj4A_cQM8sVtq&vS#Uf?H>|fzu&K) z|I~|t;lX~ELx4V^FJZ#7N=ku!dmif#R+J2{~cuU^Xz>~KgoYvpp zbNQUb-ZR_Od}kfGkUsx(p=-!=vs|rj=C`wgCqHFom>}I`ppbTUmgwH|*5-Eq|9s}! zpSJ(+x9-2+?wXgq+~l3J;UJr6U2JA%X3fW=;)bv01{!|(`CR+Uiz`!B20zkIpD+9U ze)asTPqP|Lmo7Cde|N{|HWxQ{aSZR(%Wx+s^{KZ-0P$mae0~VV)yTIA75#&KPJ2Vu3Wop)s3ju1VO>lS64d2)Neq#@rpLTZE(NgAhy>7iyQ*Xuv z1PIjseI36za&wyHIv$3GB|vreedYgWBo~-jcxk(dinRjmde9roKa=*>5?oh?u zB`<~g?LK+DxpXwcfPtat_~MBZ0=mU?yFQ<@w|}ebEhu<9Z*%UK_xJ6~UR}}5-fEI@ zLE&G)kB1jGI=An5@#vpn=A|V@+pV9ySiJbV<=)L<>=R_)-rCyD{{LeFC^hW+`D}K^ z#YL_;J07-OjTK{H;7oCmP`U8x>gva{7_T4cku<)P_kDMBy?DRPpMo&w4fC@uFZ2EL zxN-k+M|RmS-P_CiR(B8myS}NZN#eux>_sb9Xq4TkYkzTd zbNZFF*$mnY3=E;l9L+3|o6~&n)cuyt+-~`6#p1=!Z>EPwb9`$CMPhFKZqr$2xlwPy z_QKy%f`sfX`p5q14E^Y02^muP>@i4{Rer? z+uU4Sk2amw>uzdlk_ij7UK6oVsjI8&(eC&A``uVs0|NpA9=okt8@X9+U*tDmk@Z@A zS67F-H?#3BTChN2mU;fWjY0p8uL@laa(kGlxcgnJQjkp4mW+v?e=@AT?f-wBw8;v2 zUn%pI8z26jWtyFIv`chj($OwZa2@lNa=)zRt1I_Ocy;*tzSPsxj)IKxn`?D(iRWZc z=dSl>k~-(7moiT-Zw$Fse!uqn9kB(NU?6r76ZE<51K)RR?VM_?uOal-o)o@{`c#(`*A+m#j(4~ zHon%|ePrA1yxErzyaeTcf3+GRVf8vGVf(of!OQ)6A3b^$pL2ah;Nlyr-iBRV7rXmL z-tFAvpSwLr z`t9xQ{ome}cgR}5lUN(IbyZu}=Jbz`j(+_2`#q@4PX6F9UOeu9blKlt_jCD`g|)w5+}N0$v-@q?#@p+5tGz0p zlKZoS@6*c&t;Jimm@M;~EhVhx({VC**^wI?lOK2M@6#y0UH10YQNG*n1)_7ehL+sR zTz;eG^V#CK)xV_zLYoXc8ZKSBRPm_uc<{FTeLtTSUYY3rY{Q~gq3TE3Z@;{}{J1dl ze@W+dKHcs8t=!_rve)kyTfg^Tl#5Hw-mljR!@kRHe82CvTQeK4QPg|>eZSxB1{LJV zH$EhOe6@Og*bCFuVQafO=lk_^&iDKCF&z{ri~H@=_}*O8on?|4v@(i~Pf8?z-_Nv} zx$=EK4W7Q9rWY%fUiLn2VeOonPo5V`=dYW(DnGaO``z-7(>I^@yIFVq?e_H4Ef=0> z20zNL*RKB9rMvBhjo!{5lf1s}&bhg%;^)-q$tN!RFXuf_9}pBI1j?$K!OM?4P;6FK zO4@$6tb1{vh0(XW<@dFEZKC#8mCpIP+x z^}0QqvW})lta|(Br-sLOy35yYIb-noxth-$31PK=-+zUJ`a>@cFh5?Q+~0L> zu66no?#7zkWq(3)E!jmU`X8U!R~t6iTwdneZTI(=+jPCyM_s4acbKh>4&Qo4e(JPo$5sR`e)MerU7^isXIB-~ z+wYmU|9|6eP_h2_K{H>}>p=bZ+OMIv4rtHq+V}3mVgA)2|EC5M$5(Ju2p>v!0Gzq2_= z{>!yBk(0lb@2)!gitGE!rk}FP95nX)ZrD|D2WfwaE0j z|1&4G=;v_i_)@8lBv$HVpfA^yMuHwfo zE%i3OWxn(K*X!}eE1%DopB`UWIn`e0&y_PXjUT^>vrRs*_4=_-Pfr_P%Qrha%T(LX z`tcX7)&%>n4`=W{UJ~rr*KhYvL;3IDE1-P##rRyu?sxlkdnw-VxBYkIap9$t>VMC# z=)Lu9`Sq8o-qVkyPLG$X)qfNI^1`F%_bMLuT73KQIO)P<|1{k-tKLG({Hv3edV`(D zTKg-+lI8cxoyE_OJq?eMdmdjjiY^^7-_IGR}`K0fN0lG`p@7O}{!+4ax= z{Ep*&veL`vSGpZzUiS3#boceeRYzZ3T)g_qc~Dzyi?Lt-^!Q3k=c!ZQUJZ}$l}n#1 zTKxR%=~s0p=KcKq{P;}UUB{#US7~Semas`F_+t0|PEVc0$u>@5^c!V{ij!VlSt*XUBP~~s>^)lPTFW!Z;<`%&5y?~mmj^Izklw>eZ>#kUw=8| z%Dp&zeVk#=j}1NV7cW_&vTpakT{|}Xca`K;{Ok$pa#&4UHNz}7YEId&m!k9H78-%N zDHb1}On$Wayxr;``*+z6W}Jr<&YzuauAg>h#>7p3x9|RM)_(O0kFS(@AE*x6`Fy_k z>1n#BPuYQLk3;{&kIu0y*82ME;$rvXFVp7;7C%3Cwjeciwo$3q7rX7{I#F9R)PE}% zPt%PSdmdX*cWeJ=A4%ghpO_2V{ntc%JYBggt7)cjdfM0jA2+3*espT}`co%9+JAmy z3`#PmVxA}kgZgmdU*1mMD7b3pl_j2&f4o|~eo^}QIMI2#S8R%_d^+_-dE)*b-)`q` z-ZlT0+Wd2lcCy~7;KuB)&-0U>otYVV|N5a;?#JiT|1Z6?IOFd1h8$yei6=W(W~zzg zUfxxjv-|Bf%QefM?fCNPbWmHu*Votk^Vmze{pObS_?rFnHOarGOt15Gu)o_~zxLUKS$4HmbM8NH;^MuYe{qp(iS>f$HyaLr zyO?!3?Bbrv&lwjMIO^zYb%B~7J(8D`@9Zc9b%jp7%?4$qtMTjmZs+gS%@+PQx$^s+ z^8D6)mG3Vsbbhn_{l1M)#iHF#Pt#o-xY!NUs=8nIJNL|7b8|JH83Orxex~Wf?Xk$U zPd?t)dpmExt=`@xuO=6!Uph5a`|+gHdcKkW-K29x?($hE+}fHg{(9|oBPmf4my2Eh z|IPK8X=LiwFBiLTV&r5s->%>C6$*M5|NnSh|8?oK{?X9z_}GQH++18q`)j{<%a+}+ zGrL=IIpf-z$}6j*&AY-xj{f=iIr-I<%#X)r=P%*;-__l{`2W$r$rlbdPF=U%$|U24 z!Mff5eifbfd_K3VOE0#pb6f8Ap3S@)r{XgDUAGZB|M|<1dve^;&d%rG*C_-?-tKqBq#m-dfor$FS)zbV8cGD%k@8RUs}H> z>C20YAD_+6KlbnU`}l>ors+fqiGSU{;*P)?=ilGJCH1}P_p-fpW}F}V-|jpvS9t7Y z`jPs7pXXQ9-T3_RMRNbtohpC$@74W&Tk&mY`r{vu`}}wR2esJjmq&0G9P5$%=+-5w zs;u<%b=|ts*Jh%(^iD4GnJdK1&gZlH?7!ddx`Wp>`qoo8O(Rg=z_c|Ny1?#=De`%~mS z`0ZXi(6D{K=f{)D{*UH2vrYSbA z@2{_qpG@}eQ|9~coU`$$nC5SbM;*$G^5@%qJjgD8#F^hd=G}`a<@c-2-|cyQ?#1=( z@l&(Ti$j`=*RFwzfk)nYdgcdiKi*z_L~{9jInd~K`N7t@+TTZK7$!g3$NtX$_t6Is zh5DWB|Nr%a`tq%>O5>S}90k}a^RB&#)VzIb+g+pb)+-9@_kBBUemHmg9iw&o-~GCg zHal1A%JH!1Tv1S$^7p&l@i9d&RWqAcyUSIZe7l{$pKGm8$a25AH>zH*O+L2&e{5Ry zE)57qsBw85D_dUas*{-0;_7logXE4<*yezbv+`O-S2s^_ugM;U+13+P5~^V#Wp zy>^$|_1az2Zkm61 zhXXf?&)YtJ7M<6(e14_c({22J{x-h2v$ME2vT*g953e3H^YwY_?^NO9=006pJJ+f- z3DiI6leKoczV~})_Bz=KW%K4I9&U4gUwkfdwbXR|cscR-qQYASR!U%(-je@6!|chw zl}$}eH;Vghllt%fGmDe|Srt=#w{*V*W8l@FRYkccCMc%(e!o|JT(0_!p#HuuNipSrzhgHp{(bvTo0#E{hijy4EYi?yviMqxSpVm+#nD`zvfk{&!Oa@k!<)EJA8`|8ULD-4@BGy>h43+Z&p4RUZ~|wI|qb z&A+~`@cG;FC4aw_9BSbdowsB6h7AVmc7NNo)aEqbo|@#8Q{RI9>{R`1pI-6m{grcRiDyjR z&8LNLHXfgL^Iqxvb%oDn-o3u-evH-2C6gbuyGcPW3wfWJ{{`h?Tui#ea4f9t8FZTmg3OrI48lbM#*1B5X>x-+u z@A!Rgx0X!QpOC#(UqLCXdpVn}WbSsK|Ed>!x8ITRo;J&7w+&V~lcjtdA-<)u;sp82*_tjhG z*G%z$t}wq(b?T!>k9K^1w>xOt`rYq#6<(iPe)L*&e(clQ(pwvY?^K_+&D<}t=lQ+r z({GR0@}3ZNlz6i7Q`mvbJ39*dv{ugK;^KOAE1PXeEz5>Qeb(Q0Y?*uz)UnLI`yAAX z?YI4vA@k|?{o@VUY#~{8i$Z3ZWD3>({^t90+1GCUeI1&?r{-JCc{MrDb(5HG)RASg z^P-;Cn&jQF_!W0S9W-3C=hLOrg-=DpkCmC$H1>l0;VK>*@=nHFwD3!yyZhy3zQNo4 zXW8sLRLd)8q~hh}6|{|i$Fo@(`<;JpU8O&Fnr`$lU-NrAt|>ptTC}*|%Brg5{lty@ zD?nr2cPb9^X4aec+kdP8w`hN#W``uGOO-F5PQToDXxFP#tBpQAy~Pje_v^hWPdxQ) z`@gSYKJ)EtbLHPylzeOjy$(tSvNPO%6x2B4%$}#CGgeGZ*^H07r7cfdAaGiM%R!033Uhl zv9BqueR?xz^Vvs#KA$^Xv47{4veUYY1St|8fFB%nwr#a^=ZY8{QI@W`|dyPvo*6Sc`;#A?T?NxpX+x*^U5|afoVaf zr|CXEBJ6h}V}5MeyGh$>4>qw*ePurT@R#rRvfoe1y?pBDvuUrU<}JB&X{opN-~VgP zUT;ZW{$kg8JIS}3o!hT0-m)wt;oR(wj*0m_K0lATBqk=#`8$1o$f|8!7JoJz1`Y0< ziTZ!DEO9^g<$v+(yO?*&&M3Or-_g<7%oh5JyQgL{B*D)8`1ttoDJxU^U#*MZUpJ@l z*vrV9`Ji&5fBC#woBsZMKHvYh>e}B@6SSKQP9#5ls-Asq%}HNH(+i#Ia|Cpwww%bA zzczY%U)tGOOLP9eN?*O>D$Cp3%l}QVPyhBtChX9yTM5m)m+bzTKRPO29N~Mm;7;N3 z)S4y7uSGANXPWl zk+1jX-Q87q?Bz=4#-rWh$CuBqo3-`tbv8&MJ7xUota;Ej*~%vqCFf>6eEtm-g#Dd* zvAay(KAr_jU8Y(d`(H(@TDop>!vDYD&R5I_4gQwh-s*ibPS{<{Bc=5j<384 z%2&JJZOT6NZTGu<+Mr5|PkU9}?(~Pw?{>XjT7PEKiWM5UzaJg#e*E|QegB(vFBIED zR;}B5aclPVi1NE;KtfCoHsixi776+fo#ImOHIz;oE7^%jVwLr*)|| zL+_l^hlrpcq0i6H_n)`>t#hnbTKxUK?|GmBQ^UMJKYqN~d_L*lpPx_rB5tNU?mhkI zr}^n=se9s#UQf9H-!3)U)6;WK{Xy2km#Nc__SFBkZVwIZzgvFaRy)yu@-g2_+oo^V z@LY9#vXT-g?M}AL;^N{;`v3Ra>0fn5D>rN~D0?^O=T5=;b$)ZL3O^iVUz#ItniX;_ zd&Npfe|Jjyub!8h@`^e-Iz4@|)@gg&_%hvQ`_Hw~eVcvvdPB^LUz5BXdatg@+`J-w zf88mCB^i~0N7fg|gz#>->^FC_+551|YAc^_*XX^Z^*uf)NC-5D`S^If$m8Sv{Tm-2 zo3>lS$DSMH4aqVr!jm6LBZZ>oGE6tj|uvNcq9cUETEO%DXlk2lCeW|}*{H$i; zrrh~^gU?@_o(XE|+Wb9ZYD&OuDpZA&W#V0Bvazu1`ykNb}+y1A0f298%`XKS|&@^r{onrod;dRZTkgKdGPh;ZmR?=9 zwrJaWpBww`ezUwCzB+8}BG+!QjXFm)Zd87L=6ZWuZgH5u??iCnvD9XB`gyOLW=Tgn zBqlc>H@>{~pGEe!Hxc`4Do_iPot2f67WbNU?frH~yX@A=;GFw;zca3`Dq~f%&$y)WSGnivQ~Up( zwn{mZea%ir%1Y;M2|V|0D(B8W^%2|i?%qiJE&FKi_xswLYyUN|cJds8Cf(z-+gww$4#^3V_#&#f{IOYCj33lWR&=A&dtJ) zN2eb-;;){TD{q{B?o8DEC+8a3;-m!{v*M96vS8zvlo1qsduwa= z-|x5W%kJlHzmd25?WS)Mh0Ct42hA621n>Gh@#WO)%bwpCZdUtsb$#*gJ9VqW)&{YO zYoCe~P>hFEIGX1lN$qg@dVcMi1LD=7F%?N;uFAaMWh=uCYo6aNKRq|T>($4b>GO}i zOrJCHszA@5P1ob9j|Ml->-oFNLi5)W&&iMatlxJ$_Oq}%_o6Os&#zaj*9nJyIBR}? zNlx~i9fjv!fl~TS8PAy)RND8??&w(N8{Ds3B>sN8y`S&x?c>X4=SlfWng9GK zxDnJ#|GE8i^2h7($JK@HI{WSaS~^lW_?&u2P-{(cm5F88lE{)paeeL^O*1boxmNQd`@)7#pErfNEp}VkJgKWE?xZ`U z)IAj}9aa-J`{(XE*Bf#`DKi?>zyIuKeRRji$ES1Tzn-&h+90)L#}12M@pty$5y-in zyRG+epS9Vpcb840w&g@F+z0CQTwdniZ+^c<8I(c2r|X?{IeEnZ)JzA>-h(h`>ST8Q zUP=8P3D8j0+LHN`)&2Y4+3q^7sXkxm`P}NfwNjBGcdun$RC;>9SkHN-Y4)`vlT^Kn zw(Vc#Wqz~FY>BlvE9=(Bg};1GFE5_pe>`a3C%64uGcT*H{=L4VlbG~VH~0v* zI5Pct_u&3go#_1@XPcjQI{GtxZfQ{cgVU)3(@q{WD@we2>dv*@Nv^LdXJ@@~ z;<-5unm%5Oh`F7a7n^qbvUA&!ZMSn~U;Udt`?u5t&SxCWEH{+To|@o2O{epDyY2kL zSsqJQtkC%P@j-Lu_MOjO?LQX(@6U6s`r?~QJSSUxI-#8WV)OZ{zs!$ry*cY@cG0H! zzrMb9Z~yl8asTppQs3_t=kKw8HMio)!uH2^?mc&F=aap*YW?>6b=Lo?&YDjBbzq`P z>+5y1H|1VjL3;Juh0lA|}QfS_Y)gHHptz_jbu= z)0w}e0z^TR1-<6?EWX{Z|3Bp|zwMubxV@IE*50fAes@d$wd#`hg6=YfE^gmZ#7TNqxpuPwqAeS_By}Awr;kS$^Vt0fm=3P zOO4Z^&)UykvT6G=|NkHL^wKkP&GplNpK7rze)c3Me(BPsnc`}Z^?!Mb!n|FdKDq@f zd1vSC$~?7Af8P(K)xX#Iy~{puOQ6NkX->(ZPR-k5`f)P+wtoWnRxi{^KHlqnbK6BX z>7y@~&z<(Mc3tG=WnRTODz4j}P5-IYuH1C#X2D_J$DoG6yZ!I?RV3c{VDW3k;?uQf z|MJ^RxGd@a%08EM^oPJznL=G>wE0% z^|C*U_>?}qjySdX=d;<%bAJE%{QvZ;ec3|aO%-GvB~)CVpPPHxuj~JX!~Dl@Y)meW z5VSW>doyE7Zo6DjM%c5$+2;9iYiBuFN58u6Z=agBZQAbnKYyNC^Cemo)HjbQeLD5y zkL3QNzh1AOU$h%E#<_a^-dTrFWi2;bdwWTa^v`1_BKB65`n{^CzH;00rvI`%|9-u; z{C&6Q|B5%3Cdx{;w&czIc5C+e>wUM1__UPf_bs(q8@1K%=C}3R|BGf{d-81JpIJw0 zd4E`foI2O4^wAo*^rd&7&B|s!GHI!)zQ|0|?6A`56H4#bevhsB_w%{t?af;^Jy)M! zGihpF_Ux*!ua2&-|NDB%+nYZOcBh@4Rq^}nENQ=zTN{IIzVx$SUgs5cHTBKpgxR^< zJbxbi4w|Ip6jo2!+ZMSw{rWC_t7qqChrc_dIP=r5*UG`$-fq2qFEbv+t+(?w`<`kj zJ2%JDu=dxNHP-`zcdlo&7ie*8db92Iy22BR?Mrh0|M`6W@uP12lef%oO#OIm|Gh3} zK5LVCweN1e(oi69LT4!f(TUGJ$>GVyP@^inep0?lX=C*``O+D}PKRr2VsD1QQ zoaxcD*|}oRzr32dsrJka!>xIyhhnrfG(4=`A5Tzp-V}HE!^6Xy_x0yU%xS)V_R7lO z$7}1C{(G?dwchS2x83dHt+P&BuIQ+-npVQa&7J&y?>DcT{|_xrtG(7@8xO5bb8UR+$fIDdbgpkU$C(D0+d>11>)Nz@%NCQ| z>Si`xqkZQ&h1HI%D8F~IV*krEF*`TiNnWc58eKTGE$7VBDJS`ry{GAQHa4@l{`b~9 z_v3x}_q%2OxBs0rzn@Z4|1)F$-tV3_%^n>UPd;?yig0%L)jO4+lO8N+jC^fByKTRL z%`(5av#!?Kd^}&jEGPTQiolXLH#Xj}%lf=^vCY<}G9fN@vfh=KVv9j@wx2icscGQFTYM) ze>|tS+P$#wW52z0!P~7Le+c)7NBiCkxmWZmUjL`n;@{DGt4i-w->;Q?yIHBLyE{46 zbnTRgdE0Wg``nzC_ix*&8K&7`Zf@#lW|?Z|?SK5u;>CmJ$G@c4^$RMy9cfQCihjMm zZfeyQZw-M4?AIgM;*vWcZ#qKWaO*=bl>dmmAAffU* zmF{8tr$~KyvY_J2#^aB62>12d)&5=+dgDE$bu08@f-|3H`PVt1(yi*-D@jnhr*GA- z^;cJiA7`$wS2(x-L6cGYvil{U&wjjcnE(2XK-Z~PR|GE3xNP;6WxKF?-K>j$L8A}% zs{ilp`S!E`Oh#=%-j9qNCUOXs9=UcXzu{O-GLxAVKjvwybl-c<5#PL|jCGk6GT^=ad zdRi0L_t)62+pAYy|9of3^Vss#61&5T7A@NGr%OBO+#E~I?Uqj_I4^oTZKZqF-;ms0 zWg%g{_Uzfp^ZQiiF7CI|%3V-=bZU57jbJZm`Gl+Zcm2(8&u+ihReauBf8W1dZv@}H z%XZM?JfyI2mT9(_`TdIEoXuy=GPg(XsVMxie@FeC`h!0sXGbpvbqj2NrpQ!&3H*3U zd;OH%fAh=#=f2tfeqZFurB+L4yOba6k<5H9w{pezd-eKyFK#bC^>@kT4T*=h^f&TW z{(33(^M>PWv)o0#v&}SbxAV$}J$01^W%9gTKc8uR6%;JI(8#_t_G{LO35tcs=a#2D zaXwspp5OQ8x7&Bi`>Vdb3aym)ys##6^NY*sfA8OuEx#wY{mWaQWLN*J7l*p_x)z?dkAGSRTD$e)^7i~azwhnV+@5)BOXi%*#$Quz*@w?wCmR|# z`TW6Kr<+?>{*?`LVw3`My?e@nv_O-MP0n z_#UX88Y9%=*t9k0rqR0{Z@+=&3r^qt)@y#hXK}x++ON19`k<9EJ$nQrca>z?{Jyif z@RFwb@zU$@;R_Sr?|#3p`cBE?-iu2-Cu_amzwBo1_q&(ts;hs?Za;2(-Y$6MK5s9t zqz4BYFK!NBKj+NfZP(|m3|}+Lrn2Zx`TyFd|Ky{#WCSid?X@~?Z&l$VPW5GX(?C<_ z7oN|Le|=FFwAQIzuFgVlr^(+xHKL&r5fZlN-_0zW4H0~EDPmhrdPx5CWp_HNTk zy%qtQxCc!he0;n8e%Pz8pv67G{=buNT~JbbG$(Fv(qvz=l?D4jxii%Ct4xTSovgPO zXcV~Q#RbLG>cGIjFILaz?D#!zxAxzA382xrM@PjUU%C8mM%mOWcgt?;^4Y)nFy$>Y zMLsmUnKF6D|9ig|efF~s&G-#!B>UNYonrB5h4SOZ{q_RF_H!fN#c&*w+k}w91mz`TQ+t=)-%C~#kr4LT(UtJljuJ^LO@RsFLrGM7p=Q7jh z$k|qZ?Ex(xo~9E!sp$4p?Ql>H{6cl+P{d%ETN z*Zkn&`)9BAPutD3?YGnf?VEd>nYJDRHP3duKDYZ(n{>X&(5(lez)uQJNf6I zUtQQ&o3sD#w~wpi|7y)L%N6sTZPsa3`szse{aSJF>2<=NpP%msEv9PW6xIq&?tgdp z@tgf~V&BbPaqHcV}*2<)fPgaUuzNFyIzT0^h zx8>djt?4w$x}y=cCPK1XTpzr&B76N_Q1a8?-2dzA>*Ht5?}?^grbb(fUES0tWepEdEi0fbdE^G697XLo9D=!LOE}Q)MtXcn|Lx<%5&jYnk{x$vl z`1ASv&_^gYIT<=u;<-PdWKYi-%0#NI%Gw}T$ zVL`#$x!YrNcAwpLagl5HitzP$I={c&1~qSLzFc&F>NjuS<34M*|J?dr<@am1dns!c zz5MlheLwfFn1E+4pNpTL?bcqm%P4Qx(`OcME;uhvKHj(SX4-7m?q|A-91pW?T$JGo zS`)JD{0zbTynqi}`zf_2Xl+^LjvQG(c;EK@H;9Vq$KKkM%zK{eEBnqD6~le1E!UhGDYX9=oCx zpLsSr@BB5-y=9WO=i#v%1&4W0-@OKz+z}8IJUiRGpYeK(uyyGxk?VI0YIo*~)#V*J z(wV*0rp$Hi{(rv;f2K}%y3$Lo0t8`vdXBfS)!my_|MNb`=|Uiw=Tc8XUFq< z)&HJ@ttxtYYU{th|36*{PM*K_d*tn+pZ~XHURIOa@&4b7tH0-LN&M*VJI`jPle|^^ zy4>5_3P1OnU)^>52wDzRaWXy zNLc8(@%yxlE-7ErWm%81J>T1^ZCoOiE#%uTRlPoA(Z=sxysnM{OFTry#3H}_ZI;(Q zELJu>_l@2BVw>ZVY0vz2em{5j{h2$_QC<6|>l&Z9z4&2b;tczII~!Y@ulL-7S6Oel zD6+oM>RO4;uNU{$TG!3k&yc_8Yg+U7uC6YwoI6_trOk75N_MSVw{C`gxm;3m^47Ta z@1{ydtaVbJE?i0zITpM3A6q4=ZFqypYH@wVm%|bJa%P@oIhb|y*s({u^Y>k?+`DLz z(%R;P^R~Zr;$|({so!@@%CKg~v40LaQ=6Na?S8&UUd%WD->>ZTk0-Xv8=lyXY=KS}tL5(HTeGk8b=O68v{YQ3pCjqyRAW;&W52^{ zb3>iLhzyCkxE&n-{{3_FRW~vcvj6uXdGYVUtgO;@vst%HFC3ZG=PLjA*Vn`T_J271 z{V%gT|MT~6_O5#`F1bE0t&CSzN={bj>6p^e(vtA)`)0%RZ!&AGE}3tUySw}G_xSq5 z>A}kvEzS3yygZ+?jZe0#viP~w(*Nti<11P7_xx+S=Hg zok}+Q|9X0QGYo63j`d5YUwHfN%|&MKe^GZHXl&>;t-PdCWA@c}^?#R}AxzB78#5j% z`BW4(9o%mF?WFq0$NctEf8FT>l=`~UsvKG@XiyY}4$x8U7u zvm!2Ue6iSjx?aS_oShfnpRTR?esI!$vDaVJB5L=n7o2ElDB$Lz)#;+dBWJ>K`hQ%T z<^A(+F)?#4UY4=R5CDZ%x0s&O^>wkm^X4s;wn$KzrWbc9;rPZ|Tzq`TZurXmhph#e zU;n35JibD(tZdoJf3Yz!2CsL&H^_YCGI>e5N9^vhqmS(WJGr>DIBvVXyj*@w%tj{V zwtj;X-(GR^^B_0_D{_W%8)eXss~?b7p#S8LN!^7C)nGc@1cc63o|_lHxb^`&!WFI>2A#^=8| zHD4aKv++lnZr$Z9?fX_LBgyypqW)`Zqm$3Qx%s2!RXRt;-CGN8fBX9N=oNqaqjxNe zA3T44{l(jl``lcP9kM&r;juXF?5xBO4-QJ0WC-ZR?dgc!U7mROSTAqcr!{LYTnOlq zuw!EW_1!%qV};|kOkXEw=Zznhx8B%Uto|=*k3{<9lK1Vp3JMJRJ@t&=@0ZUHw7(g+ zyz=w28Ag>{@1)D*!`8$!nr2@&yYb$Awps3lgDkZVOjK-aWV-+V;m*Fc?&$maKkLHx zy}z|pdtT+Q%rCERpMTMt8y+6+GtY!m*}dn$s;jFv)Ewnn>+Tf1)Z2;aSf6Y+<6rg< znL8(zzPiD=IlZ>uIQ{&i`St$}{^ETd7_p*m%ZXiY-o7=gxS-G@^HZSe`>Ul!^F5aa zZIykxd)KUeaTh@OO>K__6vU-jH+CXzwpE9)9k_H#R04{yF$i%DpmY&9boa zjKwQsnSIy1jQFA`)@@kzC4)!SN<`W`_sFTK+J&mBuJ7NnZqMxwT@5>Ldi1DpuO4H)S%2C_CI7dWiC|S8i9O2);>(uGfgokJBy1C8gQkj=P)d;`Vs^srAx^H7sd9^YdC38_c`2C+5xV?fk#Ly+8i& zaQoGN24w{W4mCA4kCKuv?k<;iad(~hruRma??zCL-o?hdaar<3_tH{Ry_g*h&h7jU z-`rH0V^Qh!m}7HZUYXb)7WUBWYl3@{!T$(pFcG< zb;X1*hp52MDO)2yKPxCIX=!g~x3RIgu&1)v`2EVSD`chql%32C@mSgr!{_eq{^Q4w z1J|!#f5hZ@ZP|(y96x{l)X>#+O-)sOb0leph4tdp)6+hD`egL|-O7--xV}AmY^F?^ z;t&^O50w>D zydFMz!lJIOzGKIZh!E-K@1{zZ*qIYuTwGkj-rbMg{oz&i`c;2!-_GCLn?Aqt*pX_G zOp2WE|JXPsB_*XxFaG@eob_K!{O2jrtp8>? zF9L4d-fZdN;^MNcSyvvUM|rk!xnAA>$K@fRp_+f+-j2M#FnW95htHplD|S_Xf9sr- zwCL9U@9(bOevm07C@2_d^i9wW5i<Z2S!D8?TOw# zVM>WuJD>cqdA8MCZndwRU)SX>SGQ!MJ18AoF#*+!E-oofn&H78>V?&n)YXqa$@HIT z!#Y{b&!ln}I9i)(A&Dgb)Ub&8z}$3un`!2*U^V}P|9xj9Tr%nG=;+Ylg(OF{Yx`=e z|NOiCUc#hc!Nto(rKLy9@7J|^3acMF*XL^wiiX@jCX+xO@>#Wd^~TE6X=mmcv+vxw zlkNV$6@iNlDj%u*`2AbD<~GP`UqOheX<>cHDY1qBCIw7WfA zI8j+pR5W#gEjWhxATb=-aq5(pjCCE4d!NkF#%A^jbLOnMTE)0FdU5{!x);~hY70FQ ze(?5f?h{*8B_*Y-SrQz|AcqAUJ$m%S$&-%v*4lWe2zh8PnQ;1PK}k`|;>E&y_U?Ib z|Canbxp~j-g(@j2Em8xOHK2qG(#R=e)d2%JOb{o7oSz~LF&V6G_5lY8P@V(fn=IgL z2G(;z4HB^+4K8LV#zK4p(lF5%k_N##My+re4JaigrO^~6I6(O#%tvqf>}v6jj#)O> zmWFg!Hm-QN+59`7fS};Shj(`rGVlNUQGL>6{l#1N+s~`Z(n(5MbarpFi;FMU>!4Lf z_c)~3y0HFS%9AN9C>SZ&>C&|QUY+<)R@Sb{Z{NQC__cZ_sKMS-?dEc&WP{$)s59Iy z*IMVh1x;3&=n)VWruHMfGH0cr(Fv+@-c*lhFX-q+A{N7 zN5_hniLqW=XNY&K;kNHxqV{s`cRPo;xOoZpKA*SkPIP{sd!=muzi-hoI|>2~|Gu-% zSG3bx7kFDm$;i}t;;ZK|Wo0%0TwRvvLcDik*M=vPu10LDVddiDI=ffe#U<_fLTC0L zzkhQ-v$V2Wlzm+0XVb#v^CXevw?YZqPN`hxruUh4l z7^qlP@_yO(vhQ#1cJJ8}-SyILZ?)##FC85{x|%O#_RTkD|Nmz<)K4PA1^)e+w2nrDOL`uwA_ zpWkx~4Had0kP{@tCu`RfXInj^rao`_G^MXmTAT9jxnyQ)zIpTJ!J9WMpr#fp>%rTn zPe1vca&pNfuO&;DK6Fb{%e%j?chxGb9Xoa$xO-Pt@nG)7RiWA)E=tWyN}r#TjoDu( zD`}o}X_D8{f}*0P_TAP^O}7*b3!(POn;bL$?_4Jb` zPaZ6Hwbx!YS7z>qZ_)V~S3PzWKj+)`=a+Oyc)0enUMb6<*B4E;tE)XaaWT2;Wuo(Y z*YA0Ew?u`DoBrLId+;AKdq7~|!ZJ&F`FtK}E0Jb4-j?poo9|`j-rK~=&L`L8q7=A$ z&i3izYquw%-c9#QS^hlg6bv#$4d z_8oiNZ`-tCgTd7L{iWLS+;x8f4c>1Jk89h#`<*hU+PfQ_hu!-$mQ{ay(OCUna#5kI z^Rw5#uFSRG8Piw$n?K>{sn8R!7^Ub-lh10!H?(&TJF>~e`rkqH)Q+!_F$FCnNV&DDfoP1+b z>FT6ib#<1t&v@*9C(XK4HEZ4dhsy2~cOlvc^u6Q5?XEVt>; zLVoAxD|ea9&0o1iXm{EBV{N^&10o_;6xF7ur+;~UTU^(`^b(la$QH3QF_-c>2gxHj5+$KNMUPFs|}+mjHdy+169{ZQH4fBe_iFV|i+zxvpQ z=l*Jw6W{Lo8nL--ZrJ?w_jXO~SM~mXY}?z;8Ah2(O3KP5e%W__@k-TmTs@_)ap09{ z_QulNWqT~@WU9Wty7|EB=uy?CV?HrCI!}r$!`4OhZhd{te8<0=OH@?mTDL!+S1Wb6 zjW6`q?*4vrul(ssw#v?i?|*bomaxf4XuiG9TW@;u=V`hp&YlfEBmMcvD5-yKlvc zfDL}x_5azvUl)1GYEU;b@Tka7XZd5Nf=gFg-Dj9EZ(^fm@$-krdVP9dd#ecL`1>4L zcXzkpzn{+y5*+Hgz1G_WUy0p%ru6TZwd&G`MUHbt#6@0RuDABC`L@z`o7$?Pr|(JV z`@B>?cxtYa_n~sBlUjFv#w)Ce+?*y6zy9%`x1H7nZ*Q3{UK$%0*OzIWmUZ{RI&D)^ zUio?}(dqi}VZUb2oh$q3aT4oisb33YUVoWs?Dg4ij)h`{v(MZ`i)+qsoXhy-Y?gesi``olD!`I`^%VcZta&C<+VR=R zM^A-X{oip~U*o{@c%SR5Hpbk4rWu*?o|s)1_(s{-1ot=|0Wt*RM~o-nen@$NTg4cD-D(qDb1Z)L`Of3(!Q>7`z*5YM%A*V0ncv|4-i^mFq>&urhm-F#%)Eku!bTA~!#Oa9Z-RfQZNv!?o|z&K|qD*|X`V(nOBJ zjT=2YI^17h`&W?huEEGt(#R<9!GnX&9y_Z-H~jg+?>i^wsU9?E);I93Den~G{tn~1u<{z0A>HY5_ z_N1&#`t_%kTSG(R%FE3Q54-nqEo1-ke*LFgQr7X=lV(k8b8hG3e%9LBs%WslG-Xp( z%JY=P3mkq}PL0t!erMNT{f)eB}33_KEnD$3H$!zOlJn ze@W2Fq?^s{e9Bf(btiZ4 z{(rmqjL*aVe@DHiDOv2$U8JPE)lPj`!nsdO63fqAF$(>6p?&A4kjO~MeREBvQ%mh? zJG**Zw&%qPN(eBxySq>EJT+n7yvEw!{0h3dz8n7CDt-O%<;$B7(yuP_JAb8g`p$Lp z?Y^cY&wLc2yK~K}rd-+A>$ZPQJ@fgh#I-xy6fd=a8a z#|PX>caGd%*L>-A*2cNkkB^EUJAC|jbmq?=KP-CWz6xAh7u|m~` zGsn(1cS7FVU0=O=FO(@N&M+x#I^~w?Q(_{w4)zu#?|tcl6V*2zacJp7UUG3n3e_j*TbR)%!RTK_-zxZhSQ;@<7s z(iblVdU#o}FIYCQ;?0jjp1t9_Z9uK0zrXo8o~`^Xa_Gj-sL8wXce%Q|Kb*OIzEgno zL+Q>^dvUg`Pj8k!NjbR3(BGzSqH>$|)BXbo7)ts&4<24De`w9kVix-u*Vo4PH!_E? zvtM2pFaG5#Bg4nS!WkBYOn2_ynKG@v<3$U*{0{j}>#|4dk9xECznrcY+a`H=zrYgX zln)9#k~SWOwNG9Ip7~YRmt?iAIDOCmd)8hrCAut6b0^F(3I>-d$Ib=MT62Fx;K%xS zdHFpisYX_1Zx(Ecd0T2%^Mpg}@1NBR&d;#_AJuc>1jkyt>*k?Y%bF{edD^SDOCO%` z+&li+n&Ta3dgr@M3jOru!+{y<^90WPuD)3$a;^H%C5fFoD}FJ4{UPiwzs*!`E6%cb*^HcHG@vNGM#XSQi`@rJawRtNXk?X7-zxBOnvO@lSN z`TOlY8Gx!d1A9|b-?y(nSz20pt)F+?#Xb4e^7$Dxo4Br+Ff6P8I5T1XlOoHy-;ep{ z+FSnE&#C|5Ap5)U-)f7Ros0Jv)X6-0{D|fA_m!2b`{L)@HN9kJ=g-=!KYh|<)}Q;6 zkMn)Vz8REh8T=$W_sgrB%?FJyU#qjCbnk_jh;ue>mx|+)wu7GwJm!b2P3Ab-GBHeTnm#^I=iKzpYn7 zVoV=BzqM=Alut|&`_3>dJ1PHbLyOJR`>RCv{diqP98J3x-lv%@+#|Xt5a)M-ZNuKo}*tI>16AcqQ}!R@#?Ph z6A3LXEZ`8|u;kqG)ZVR?r^ODc&jgk2517Aa@BMe7`n}_FKUvn#uk8M=oGPHdN6_qw z|BaKAmy7=I?|$3!?(QzFW$R-+1#SMWexFvhE#b*ZzqwYgY>NVGXPe~Ep+x*YEwc>Du9}-@kr6`g%Q1)MQ8AofAhk zCLcFlqdG-EzTc5q`rVm06`_X@+gs-=J-NH9^-mMi)7&yohs|kcMJ}H_Ih}R>myDtp z7X%NM{IB~PqL;p^W^L#Cetxw*Ka}3Q-CCV#X&+y)?$vYQ(mQwW7-T$P*s*KZqU7Uz z5=IpUZ(LS=e%#u9sL1@^&*xk3?XUa$OGz!tBEa>px&GOcLZ?7EhIxis{fonQD!o*M z9&QbfZ(H8p9(J0Yo&9lZ;bWH1eR8&KYjm#WE6ldC4Za@xY+v23Ym<8uS0!(~vS}6f zw$hNz)2eoF>?z&%CG}lZ&xtudGF2jVt*xy=Y0K`{kKm)1`~I@?Evo-t=Owy*-Ko>s zEVbo~2WA|Xzx=W^VWLON@Atd;#r5yKo&5U9$;n>x?T#IB;kLVJQT%Pqt%b9e2CaOc z8I_Zx^XG3g=RApd*7b6GtG@>Ath-ywxZsP4SA41v=eIYa^VTn)UlsKFm{dUVJ~y8F z00E9Q|8Lm@T;6~BUhQv|&-0{ytHi{_l-zp0;X(k9oJqh3=NI#1cVAfSUcUC4{J#gx zQOmFDsj%psJJN7r_sR{n>9Z|srSk5bIrjAQ^oixK z#cplkykf=6@Z$P<{&UwVqm7jh8_f%d_Nrv;2~K0U{Di-DhPD4);}nCY=H}9<<>l|= zZfq)*Ubl3a)-zd)3W0vRPa7gH8@u04efN5Kw(U)cWmaL{x~p#`MY|hkuh=eqIs#Ng ztvlXv=46r66BjoDF{xEocD~Es|F`kfsZ(yb--AA>I=0VIR6J;9{((_p(Y?#*oi2;6 z7-kgQ-qsX8ML$ktS?u+r-P2o`*{8OwN?MMs*;)8y8iAe5G;Rp zC(vhm&db%|_mc(ZDt-8o-2dq8_4vbU-tRlOJ-&YFmNTv0(^;-xzkFHv?k+9%+AV?m z{dX2WKgTVl@@mJzzB# z@|9k3oP8~#>=3(cH7nA2?_G&wHu1lVzSnk~m?OcVy!!i(1va&J{kB)Gk(6 zWA}19=Gv5crT*u?di82kVEdlEdj%yV7HpYg_sah4n`>KF$IZ>OvM@RRB9MP!^!9Ze z8F!;nlht>|Mcv(9dUOWyIHh1_sr*1y=k|$DPCf;?^Rj-{L!PP z^m%n$pT+(xn6W+Wt<{$|H<|yfje5ED?3XV*2fysA{r&ab^2K@TQyBuHs-iPzo-;JO zvGuq8(Jw!_#RX#DA7^9$byhz9*DGyGFWk7XD{$GVQ>O~Pz6#xvuV158`nPJ=gS89w zI6tyU|6E$VXndHhh9}wS3hq2{a%=5 zM|W43LHfO#9e-bf661>t3vHd6ngseB!i4>!?+hgBfp{u3$&Uf&AuxQ_j6&@WfO0LX*zsxiSog%<;`p%AtnlE1LEB5Jm^#5yf zTKYLPP1ZxN%4gi%SB3#NE~H)mIT)?bm94^DUb%FF&vF`kAkYnAoCKtGJRj zO7!*hefajtDItM@iJAH0%3${`1-T2a7fQ|sh3AjdV^@AU%P%_iitrZs&IX#p(TWT~D{{^_)62^ZNTf1G!PM#D@ES<+!RaK#&q9U!oww@+OimVCeN>fsruQ;eoeow{(%8lMkG?%nY(y}GgW z6VnX6`WJ^~DpzfsfA#8r8MnJXO+u@lt=YY1t>1+sBFD2%rfyZtc`XqZe2&|BfAI!a~D;QF~Z^ zf0qX}M%R6uyciT}$EL@>{L1Wjb>~)=Z2@svlGc!s*o}>u8|Qw=<*wZNtk$rs>e;H@ zYc~1?9G`MLt1~rJI_I@ST<}?L-%e1Nlo|@SnLS-NQF%lDe@0h(j#gLKh`m+3^J<@E zGB|vGcB?k;!IKvqi>xlsulpmYq{Q=`ZK{^x#fv|xZx$W>vh(wE(ME$#7bS^LwqdUB z2MrA`Mr^I>O|p7<$MVbj>*5R(CKZKVU`(&6ndA6<@4uf}FWxq~Eq(f=WznMDD^1PT z?wT*k)UbGQX4~p~kMr|vSsFLg{{Ei)Wkoy7={Yu~UInr2d=d*bZp`Vc$>q`0(~~eO z(P-n9POaK@-tj6~p(m%S zxtaNx?SGwpzkWp@-IIG;_~QEf_?8xy#gWEuyIQ7i7YB8Tmw9`6@$6ZCs;T)lmlcm) z?XPzn6QAqH2$(P|T0F)25*& z^QWezO=`JtWWK)sQT66FkJs096YXW>_V#BSyt(Qpn1wo7+WTb=o|?KkFyeW;OIn(mS^mwg<8rkw znb!ON{F=RB;frU_+B7Gtak-_0E?=-f;Q!m3&7#`jrk^r+&WD}qwrV>i|H~kK-m3fi zC#)+f{>*YYPxsChoy=MApi-4tZFw3TRK3e4h|l8k*0}BREa~UoZ-SB$H8FD@Om^BC z(-&X&m-p(`t5M%o1ujJW;Eeh^v8l&VMTpa_>CDNqu6}vG><5?o&ksGrpLaX#5xoAH3T+8b6+IV^SskOeQZht?Q-tF+8$i&>5xpdi5)2wRE@b#R_ zqF-8GT4DI*cf7*pYZDijySMMD{cYwqf2XugZ%Q-}U+(z(jVHt6N*M zdG(jLWoBxA`uv&ov(&2)VsUlORPE}NW`mQ(N@~>Z9yrO1aufC-(>wfhrD`x+^zE@daYr|XG zIoJ2@%Vcz@b7Z{q%2coSYe~5L-Cd=kJw03U|JS)DzrXQOxM@4f@9(d#KlpZL>iV-s zj~-qceBS)PG=eCe`+HOF*T?@EY1{zpeu--Ok7VUDn*FmqzcuO~b3OaJH)rRy`S~txZXC;ujq((XwY{JJo#3GovAvENH0`=-)vAXj%1SJ?HmY;2 z+h1Q_&mG6yf9*qLa!AUOgkNWFZr(9vj!s2TnEj13j){VYK2M!Bt1WxwN~`?mkB)j* zJm34>@ZZt@hs!tbJHGI6`_#)_T_ST9zrKEX;+&eu?{nEUq@RyFSW-}6V59q@xKV7~ zx)+lQ%nN4Dp51=s|J>`$?EG5K%(JigtY%og^HXW^iKj(R#6=V|U&?ID^%vo3TiAQx zfI~$!xAi66ow|S4tooN8_G^#f$~+ad+)(M2kCU?X^_QIh_x87z&#!y^{$GB7!mf9- zk3I8(cI|@=;r;ryMBd7Unj4l@^>~P~9XgT5D_y1EbZbkXkGG1@9IM)>)uns)?wJxN z8@D%Y?YZ9*b|kA$TOZNszpSpUP~XSlQQust>E)%RuE+aiMJ}iN%|H0kxZFOwq^vBg z$}3{}?%mdhUj6xdbbf9tM9xK^)0)9 zDQ^gSVX-MFD@$t9q;oH~`2DRtabEvIW^Ha{b)})}zYFb_pF(P9o8^m@Y+Kvwee$G5 z<*O+Paqr`7&(52-^0l7#j=E(@@ZLGkVX03}!3o}9B_?XE5j~N1^Y-oJKR=#-jjR8` z%+CQD*>Cy($~N?}it=MNvz$9CW=!*1n(_Ai{RdU0^V{z0=^lM{Hd^Fz;l_sCYX&yQYN~pB7nyLizRA;-aDnbLT40xV|YaJ_{uGl3QH=QCa57u-p2R zJq*&{*{uD(d|LPB?gT4q>*(hSP21M&+yk0)-5p;#Q_25ocwAf~tNkApiO8_YlO_rM z`El9l;GS;}A2zjXKl3?1rF6P#j6E#PiQcyAP1mhFcXL&J+rFL#-*-BsJL z^0KAdkC(}BH71$9K5n*S-@aWcDjK!>Hhp=Y8nHJmx7pvof4*gNC3l^`8R-lA<^M!& z3)xxI&iD4>^0*J_pQo+;@pJlpDVZdj{RMssE2%S z?|ZrIx;ndQ>mydqC@U`xw(MGA_3YI3UqYQOUa3DmJX8h^^&k5e+Azy+hxnf#lM~`9 zDrQ{Dh?KS3BJL9&7M65z(R}GYZ;Y+2*)K0UE6}5~O!xn_L-G%dX7a2KTOYWKjrVDK zZbUIG`AyMEpFHWq+cobCe}8-1c6qL0@XO;*Z){A~QL_!c7CWuzug^jFe2vMxtxs6J z)4>Vw8?U}o%H3l&A0_(atlNTg=QmyX`shcYhv&{!6~WGW(;t7g|950x?Qg@J8+%{e zSjfC*?_NcrPKAjc1&`g-`sQ0SzU{OQh>To$qc1||*pI^VoWH6Amgfct*x1;F?2{E* z>Uuy~MMWYnFHfs|`t>XOBa%B^lze{e=dAetm!I|E_R!VWAAr^f|KFF`(bLh;-_QT% z&6|Lzu(m5#Lf+imEdHBcMkMF-;ls?y^D1JJs~*p*7Sq(!Y?2T9|L3>9-yECH-|wZ{ zZk#jBxVlPomU({Pr%y#GcXl);AMaBxJkIB_bZS%X*BAGAnSYtzxw&WOmv?uCt;_EH zZCSqP(YyYgb$@@E{g{?e`|QN^Uc;Ohdw-N)&pUXcX!iCT*H2GROBmKzC@EVVJbKi% zP-kalrA6f@5wn~d8ZYAc8RRM}wp{wQckiAHi>u9L?25KCzgv8~@9|=PyQ9hdc1j=fmW@w?aJ?1-p+pL(4h&FCM}xr{rvvj6Q-5L z3T`;JqmcRRY}3P2PEOu(Z=Kb(n7E#~_FoeFY(l5UpPp9gCTrIm9$zo~{k}O5=f{s3 zcXye}$owmxYiv~T;)CFuKhNWrn(vgWc~DpK=7QtZXJ@C)Tlq?_INmN@5VkZ($mxX@nCQH$DdnX?kIho z=e%me1_AH?acxWgSD%ej5z4HIRvXr~r*^wD6PIUweS4dId*0okJM5=Uo!XG~RccMt zUbod>cbC4s^nkylcuD%HU8m<H-gVyh_&FwkbmA*bH^K6B7K=D)&@~Qa9ddE0r!@1Y@s?Q7T`Si)#OIA19t7_S*-DfKQ`kb9|TuLaZ zGBs2_=e0?kM@Q)sR_`?LuM&Z^HOf64rj0Eh&)fHx-~aFM{9-M`g3|1IpZVV`%ijE9 zmp01_`gt=kHff{8-s-PMlKbtL;%%)y^z^(~@}*>b-TlN_F0QVcYwzzY?rAgSS)F@Z z;mjOES?jWQM~?ZQ1JAdDyN2=Z%%kS6qmb!9>hueI);Bm)1N8?D6p^8vvpL=lf zla7ZRTv^Tgr>}LWs@hd#r5p407Cgrb3MKurVP$yw^r=Ai(Tc=B7DtX9OL}>~URm4w z^K;#U2MvtqIEaPc3%ektkb@CeSeI&{;)f9|DAmkKm3C9khf zU$A6}#HCYS7M50rPM_w^y}iw~BxFfslf|@kE1zcXjOpv?;hAGy|FB+JPi*m`MNIGB z<$3O-~ff)-bqwlw8-OCJGv6o_#%fxJu^rN}!A zp!;ar9c3k@OV@g(%|Y$Ql+?Q}b&hs#j(+>_?VHo_KG}==Z;lpm^zIAfCpr>-=NVOX%FjA}~I2NlZYQB`2 zrWd_zMxMM}U*UQC^e?5I9XzVKy1oW~FE}f+ID$60I44`r=-)vJNmfa_SS=y;n7ftHf;t_aevuM!V+iTo+kdYPv3VciWd9 zo+;C&9XxrG^I_sb4nDqX+0{FDR(g1Pf_6@=TD9uIt5;0={`y<;<@xye`J3N=FedYxg%_^NBcHb)K~4ue~@_HTccE?Ks0;f@{4)?QoGs?EgAd;g!= z^kqTkXRn?!t7+w@nLAHST={C(?3*_|yuF?4>KIR*KK<~~Bc}X({gO8q7~j2h3%*?#nB?_cf#|YfT2NN5;LD^jNN( zeW6hFw!BcE_#Fj-AHH8sKlfm>{<4)Z+y8C)x-xoudcWL`@ADL;uCw+O?VJ zEn{{_Nnx2MXDz0vcrfaHc5-U^^MuRKbZ^u@V9?Uix}x{|@#Ee^=k}xv3mOXw%dTn5 z7RMN)E=JW{D=&8Da#b_~sQS_lTX$*3@#IB|LFaWT=;-*o{=5GDt*zM+`xAxx=36k% z^jTK6^TLI)9r-r`zP!3AoU}3GZBeP@rx?jD!%xTStG^|kzqhyR<(xM%OH;30O?g&_JfJy1&-4*VFiOYkyufpAdF$EqnYtBi6XMd0NxAF8NdS>4|2}ydND0A zdf_{JB6QrY>v2k07O~uFZFw=ZZ{w@f(Mq zs7q-xw&wa?_t07kS|+(M@v)kSnAobA`!{b&{{8js=n28YSFhRjF3gv{6?E%hTT)Na zE?YxE_ddB`A8Tvt$5W@rUDAB;<$itjhV=V(N4Ly9!6&S?XTcYTTSDLjr}@fiXG|Y6 zJ73b}X=^>ay@Pkh zm6fd9a{Z62yZb-!P`CbzKgmwem9E?CnvY5Qto_r(v?gw|SoHSXpP$#0a{TWsEWEopee#Ec?(z@c zn%{RRDG^}+HG($po8K#KZe+Ty`rjYcnlC4pSG>JC{o+<{@wMMV&s=sV()&~x8m{h>q4rks!gBvmEW)HseDv8cYEotGm&#FtHTW6K6=w5 zV0utAcz0z%#9)==>A@m}Zub+ytl?pIBj8ou=KoSA98{@}N1E=mW#9dUVcYp?X<`SpCvY+v#X zd}CkSZre7ctRPu(^PF#QFSARV=Q`Ha?Mu3MDs=USFTu%My|mTM#rOaH$iC##?(cIi zE|v@W8QNy~8Cp>NX<|Av*IIu1q{-4T-@d#wwy6EZ^G@1K#J{&z$gj`OYN_kA(|_Kt zo^;T{((>Vxlfg6WKA&c5PAK(U8gyp%euvdw%imdnM(07RYpap|J!nKcIw(ytF+F{w3au|yK^Di ze(P;}P0+juXhH7t&lBg*?|*5$|H#M3>RY^y&$*s+^i(L@?}ck}7cZC=qj&s${hy`5 zzn(sQI>Rh^*|nc*)?K+`QuF6!NX)*P$mgYuhv#YM&a|$V==M-KG~r+~>*uon+uffh zvnW(7=4D{xd9nV}%I#a{d6)XkjQ`Bd_2H-Z<*i&zSGQN54g>q@bJnV=o%@c>@eaNo z`D~4{Zz2B%wmWQjTVQJeK)#u8D?ZyS|DvV5_tL399v+{+q4M;#Ht{e;U0vSb<#p>y ztGQQj-uSblKoGPuA$-=dDRjIeUA~Rjma|(@$@F@jRZzaYLD+ zVnxLljkVt|iu^n?=jjQN(z|EhBIU(Yoyet)9! zEc5(zmw6A!oT=U8-Y4hm<;B%7>wFv=pF~4Ti^Y$MYG9vKlNj>z^Y5(O)x2ekiHh1gmnyfmq`RPvG3SqZ ze|Y%&{mU)$Z-I6uuX+ERmBRS zqenfwtlDqfI2V<_c*hbJb-y_xpux`hmx`{{>Af~it($uK=?v>~JEP5;SU&&#``7Tx zy=nm=86JOq|2r%9H2-O;k+H86s{Zy)wB}#khYN`=?(W%pz|ENThR-iuDV=8d+9UW5 z^O~ctOtTB#{3txQ=T@GBlCtuH*N>Su-jLg#fBnhhyZ_%hrY$pAu%Y5)5DWWu*N~JY z*IrJWI`!f0$jzc}bs0LkVC#q%WYjNTo}O_3AG6o|#I>>8<>t+s7gakggU@&AJo8Y? z-mab_&HQ)tIlh6$kZVkf*<@s|mS=x>zb>|^UFz&?^W)z7zHNK=mf0WooqGOEXrE8u z^{LaQCH?v`Q)A8ceUm3E|N8p2+i$Mbq1&gql_tt^ad8*C3^D>OLf^E>h~dD+B5BYP~yA>90Oq%DRa_G2x-GvA0 zqV9ciN7uZ6uCXlHy8PJh_j?x?$~v#%p7F2ZYHYZ?eEy#Q@2oj^ctU}*1EoS)v81M_IgJeo7q`Er`LYxWs2G!wtN1sh|OiPVe6uFXNce4 zX&hIRXj4@i?OtV=(J3BQQ7XLDtI@dJ%lqqw=ix(O;pT7iiWLu6{xj+*xO_kcybgw4A-)fwGuSUkE!o%?H z>Tv%(zdm_Kt>153$X@sVvH#JMiVBHkwf|;bDq3bYegD62>}7B6teheD`-w!4#J>e$ z$3tH4EPTv5-|gI7Tkg8LRqRrR>2vb(GQ+>`P3<|nhzI`pE$AOH|x>A-+2#jK5w(O z=;xm3?H{h)e$VwQw&r7Np;vyv_0+zaG|i_cB1-SxspOtg_nzm)eSUviQ!(8uUy{Ss zCMNv+Bzj}xXZfl1{G6P}rW-HI_L;6DY~Q=ZX`h`PXum~PbArR!-WBop?S4FY%>VGg zg9S6wH)j29U`f4@v-o6mIo_|e2);`2GBt`+T++5h)rd))lD zGn$slTk*;5{euOSvDMYpJ{5(3{%E~q5{YgJ(DaAZ9ZfDXTiJV(co;*qV+h))5 z`rYg6;-FQ$=h}4_eDmIRa|u`iiTUo|yXM(yUldD@h@VPEaLqp#QRTlBGj{lEkE zr#p-19oVrkxuoy=<2QGB{B7*G@9r)YUSogd!1G6yl|O$xKHu9^YMkzK{7Yu=SH6F@ zmUs%={5bHp;?2eX!fWh{zv--tGksHBd|*%I(tg{i{N7S)%*0N7e5_vLH)qk=eSg_m zPT!Jx9dyz=cTHfNe%vmVh<9Sr-R$x^;@|u9&YL%{;^k5C2T}PSe(l*)v*h)QcX?~8 zBITVwU%FK~ZSR$d(|$=`hybPk4>KII>exj3npP|BKwqd*j!w_V(CRC=9{+m@{V+`96T z%ij2xj1BF(t>3-88=d@jNvH6`_v`;=w_Af|aO$#}XI!g4oys?RJI7}u0|SBLwDV%N z6F&baOcs=tRgEZr@*=SJ?VG2we*XNGbneZ~MfR1~m%D#|Ct*}k(0u!3ijmJ8jWxO`e`>U?k@2c3bJNd)| z$Bc`MSe2BO4RT%tSe)E)ee<jl7Sa zetddr(cGs$`Q(Q`#pgTbwc47Pi1?qGr5aKG=!j=ZYGytp?zZjlcXoC%`1(+@sWiU+ z^V$d9$qUL3%_@HW?%RzI1?9)*-1L7@yK-Uo($h27zE}3XRyx}}Ur@*0%}v5&;)Nxh z!e8oAoch`uH@KyJSkTCO?$@Hc2MzzE@=N*t*SaKIw>mX8e_i&QHS7Mi9XoeQmVoA4 zC9GT`PQJaD9kKX=)SIU@sYa5&zVG+HvhD4yt(R|n-&gn7<*l@olv0G=-pb$@CRdGc z4HLF|bt%tEnwQOqi zb86@RuNxs}k%^eARhz>qL(iZ7b+=o}sPPyQyndCR$`G>jZI zLnn3*$Nc(Vob%>bvrks@bGW_j*8ZmJsRtMmtxsQ=-gvm3*A;ZM)bB5^uZzFElJ+R{ zf6~!uGE3)ee_Csm_eR2zL04a2es%rtwRt;t?2xek`z8LMoxh!>xSX8aqRV0Pp;2(P zR8>{gVx`%_ZpF=7%v)1ap7p$3v|au8afb+H&uZr+5L zuWi1edpADzDOG*Pm3Mz%?DjjWrphPn?vmf}yYIz{3>%wNqqwSvl{Md99{=%Vaca~5 z?bEZbZOIJ&^5){<6^~aHmzTS{xVT@uZEb0}Ff{w2$(^TNMQd-z_3qb_P&Uxfx$=Nb zjKO8~Ue{0!5h>=H*GcF0WOeMF!k_)}{(rlJ%??3DMa{;C!otHJA8>rw+`rB7)6!|v z%Of`LSyg{>clrIggA306y7GSA;_j`lQe%5gdS_pc{1)II^(o&WS!wb~0f7r_&1}3! zo_GrL-m}*T_;H|qaY)Sr$qV;t_b3|8;Cfdb1rV&`qk3QHvjbRD<@BKetv#d zm}k=d_O{w|cj;-GNbno)={J`GaTqma{ z*3BDNglMU#tG>Q@_}81KHLuI_vpV*48r0g^J=%4Gso{?2j`f!5JHq}uEht|f=TmnPLSzt9U0PmJ7C z`g+=n+P!=B2nZ?VZ3`)lwJI0VS-xb6R7s9^(Uhut*S=@24y&8-^~U0+()%^PWy{{( z(w$LjXkZ|4dAYBtR&GP`6yxA`ppvAsv$N^xySuwH@A~m%@8wZGz4=drPKv3ZthLnD z4%V#SA9nBF%`MmP>GNlnShdTSF0=kF$;gio_bHtyDA=_9cI3^QFD@Oe`xSTl^v_qb zyLKvmRd?E;`n7S^;oF&Z5wn~3#u#r*{?eIvX3O`a*Nt0D66<8GN^ZO;><`JBczKgi zVQe-mgnXUbc#hpHe*S9O_xJV6uC2C#t^Q)pN$@V9^Z0c%FNSZ`{>W>Loa`U7}Xk%4KQP*Vj8L ztXZ)mLV)9R`0Mh!tES5PEWG!2@riS6#ZzznjG9yx_v=^Z|5InDJihU2mT7KQjkEjQ zh55&MCQhHP9&t`zspa2G%<0Z+R~$9PtVK(2j8J4r-Pd`^|$i8%ys_O z+ql8)$dz|eujX$KTh%MLG~o5=_m7lh7F_u7nDcx1`>xFFAnSPVOD9f0oAxs5NOszc zPerGD52y6==LhM?`_48y`oNKSW8vjzyGq&l<*rF_SXaH-vEcOG+P}YE$%sUDRc3M* z?Ud2q`@v@0->tIQ*VbMBvAYIz;G2+;(1ZyS8hU4&9X@=Rng5QxoN^n#^W|l}Ti+$G zt-3j9O>Da7+P)l~PoF+*OnYl3V^tIJ`oH#6uPM`~FW$2!=EKp+n(-GScm2)P?h879 z`*iKAcklXkZk~T&Q@_37n)R|B^;1q}ZcMY>e6%*jlWVKqtYu%e6}If3s=~*d*xRwP zSF6`>QC7?S&8zD5a9$&-awtzLa`&CJYrk?7TPZoabHr1G`o>J^FjZ*%6n z`Jb=adDtOBIq8+O%2C~i(xT6w9s0O5CMJeu{_j~;d%Cz1S+l)L?g=d^+c)jWr9GCf z>NWCKZlAj+tu1iB-updU1uk9;H1qCX>bbRsg^fkQNNG`C!IxLBvSh65oDAmHMny>l z1qHGGb}6}HYdk6B^QCEb?%XlRdg9R|WhpduYUqg*Cmf=xtS();G-1MwmMK$2dLP`_ zIz>e1XMv>H-v8^4U6;7FYWmrew@Rm7dFA0gZPKJJS8uy38pjtZD!#b6nZ2orDZBZ< z)`CTwgj`)+PnsfgDW0!VpFBHjw77otqC@}whfT5oRY#Rd%R{g4te;m<|9#rKrd0X-{FL$>7%Vp(&2ebzKFJ-op@Z{9q&|I<`G-qz@zynI^trln=+>1EHB>g`Eu`}pmnSj_Za z$t-4WL3;Ae?RSzFy?qic0^olUR&+a~J1^7-3`c5BzIJJvNde(|nd zQLq2!-`vG}ch}KH!9G0~k8gm5LjC)^dm`qXO=hk~zgf0vO7<~}m?&Le7i(N~e|BoB zhK>lI$_hJ;w19vG36`p+S6@74bO_pHu=n4;e`?xbycnTSG(6ng3_Idaew4bf9tfX4g|si@vKi$&*uw& z{lLd??_OL-pV2>VrQlolQmJ)X%j^H_6ucf3^lF-Q*_)2*ag~u9&Yqfj zf5DzTcU~k%?3#1)m)$0n;%O7Vl>C#;&;eBgn>KASUGz8U=+UE`({BIxy*SnT;Td_^ zTieBT=Gzq?TanD@kQgW!boJkYTeoLttem@EwY8mF{#4J|)3att#q6KAY;(T-`k9GV zB?8Z`&&}K~t*tq||Jm8u$qxVjHI=siw_{?ksDH?mccr@d-t&9a4<4@j-^~*JG)KSC(fSEu27aW+PrB(e#-iu9Xqs}QtSU;lX{yUT{va`%x(MpCr@6V__xje)wJ0r znN5|&>5Hqs=Sdj-csKoetE=mehxYbTwKCq*jic|oPh0Zu`@172gWdjLYvmUA@#VY8 z$#zI;CNn#~*`A4F)!*I->y*D1TfNcOXSsx9_{`VWFAK=ePq^~&Redc3!@`9NKNvj_ zekmo)c0*+MdfU0{7k78|iGi9nT=(X5mOecdy64v~>57_fF*Uz#KDVfPGvkBBo;0@3 zPQke8U%v39q@_y!vF2)J0!7%zkDOM!S#L0}oZjEa%*HY8`&;{lS+k^MY&7PGW_?)T z$op^F+D}2Xb5<`}l+@f;`tDBUVWD(ot*KnCuC6;OJ_`N2wU1f)-;c`+{x&x?nJlZ& z->dmXF9kXMyo!Cu#LQfpvvT&jn;(x@Rh-!I_xoFWg@||e*3R~PDX@6s*5=&G`C(yU ziAPVZXN|w(S6jiw#LUFN06N>Ee|!1e|FZvnbAXz91-IU9fOg9lEpACw(be_6@HTwS zp+!n_?250&oK%udR#-Ff=AP8m2lMwlezfkvo~V-D^QYw*#?71e;^yM^guD8y!(Pwb z={0-NqNJQ#dm=aF-MFAw^*wOD=F$xTe=MbTuh%`lePia`U8YLP$}F$L*8jWv;AZN! zyx-goxyetDoD7zFtomV=H^mP61b?%^J z7pu?9HD5~CW@Tla@&Af(#FiAzx<4=XgO0N~7|&#qt0lu0_BVeaQcVnXHIE58@-K#ZJPMwtQwnhb42Yzva{=FuiCgB6u|$!{eIuHAo};Ww}xq7 zR_sbOH#a{s^K(nW{P+L=GIMdY+!Z;x2^zS6{zfY+Iax4HSg1dPA>nYF{oArMA0rv& z#9p7&RMmY^`umaq2skHTcu)0~`~5nF$mGhYgC z)t{~}?sM|>!*_kZe|^2Wd;aXzvlA@U)!o0yGX;O!diAH7+v8(>f;#a#Dgo5C}`p8-H<~8=tHoK}D9u}swz*ly@B$8T?`3!`Ic{yY;4ewZ?BbaYy zAv<>LcyV{TZ^MWFi9sum+$w!-y6DrbO9`j;ZL_+6Y(;v%oYegF|954XUR!(r!h_pK zi=Ur=yjoP7^)(x>OvAOcQJFcXv(sky%}u(ndHILl_vZKO+TU82nfZ6{7Yc#!a8rRlZsb${4a zUSI#(_Fnw$@*7Wm!gifVF*?{R%phZ3CS(8qQ+6}Ie`;!K#KNbn)3-_9f|kx}j>Wmh z_4XfcKW*n0RAiJlW!j_n%I+IdUK(B04|&`8Yr0%$Xy}i3yWdN{xi@X{-rdYh1afB93cR=0+i4>czXiij*J zt^TSvX}VtQv2U{0Uzd4{drvj4-r2A7bl$zaCQJ>d!|QtY{{Chj;l?NbPx}9#L;IL( zQ!L)DO)T;d6qKDfVFJfguU7BrdXImK#~+$;aq-2?>HI8gEQfCHl+3%ktMzqerbX2k ziL$r%7GJy|YhKpl7S36^S?;gBimEE7*0sCU-yVFKX)Iw}C6cteta1N-`&p)|ZR4uk z*!+``I)^QzI)@$=S5bzvCT5g z?OOiKK66`bZt1?>i9TwFCl^0|u+?0QBkgSD?mXK*S^GZ2#qNq~R#N-+?JFoMa*C|9 z3&A;cku9}7`@|ZuggGVP##Id09hGLsziw?Rm3|~FRPg`D$Bxdv zrrFVNr^{(g<*NMo)1vs9j#=KFmZYuXiIdg*E>!VkUpxIQ<*n6f!|M~R%imqA;PCPG zcaOOvdU5m7o3r}2o4?z;+`LbAzqQA&&dJL+e0W=Kkorlbq^r|$bJ|&kD}L`L%$(WU z+|HNyeBIsB%_p{HUOu+Mu$f^&>FTi3=9c-^<#Olueh@m=BiAZ-cek>F!h&^w=gyng zxA=Hp^7VJNQt@AUq^;Q|3jVr%|JWoi>l?GazdUdMU+Kj?3AuZIkGXIEdRH)$6Xr5H&*v$qt_-?MYUx)`mgUNyh(eh01gaqE-l z>*y0KeY@b%Bq0?wm89qI?(V4h`EE&(?XGh3%tsuX{{hgh{ z&+IMzOPUK#J?V_tR5CLmHmGP*!m9gqwOi}6av^2OiSy_A*YE$vHBIMlz=vnLwzkao z>%Qv;?tl2^O^^7zdNDaUIjijtO^th&FIN}a^HJ*F?*zkBuWH%mPnpy6RC}M;S81b} zJjKt?xa}_cW?lS9Hb`H-nT_v?6o>SxZ>*Cfww*Zr@NnCs6BidZInJKyrMfNWZkulO z_Lq0dkA2C^VD`QRTMJ-O`fH0b%OTLh{!`xiNiW+^vuv(XQ&W3*`Me!_fb@-$vNE^G zo4&p5=d73c%xk%^ZWpr@v?~;ryiQq^tM%L0?Rk-ws>^;Jx0iFQaa#1?o}Z`Z(M|n! zjWK%d^XKblWn~3KL@fCzWMN?;;eT#+v-!Q4j4K;|f8Wo~%F0?A`|;H2(;Lg~R;`KM z9(U#6-s-PgDg+`yCC=UD>i%5JZ3bJR=c z--B9{+*?}?Zi!qx=jJE7O>GAn820=)^!dk&$NsD@`}_R`Oa)ykDy(h3y|9JQnq(c6zL`hNfN@0%O;*|#aT@gHBUzn>*N zJ^fg^Tep`C3b-B^2?`!5x2MsIO zd|#9Bpx#i;=8J+`uT0_vyKQ1(VqM?wSBF1;6PpU^^yplXVwrsU=?t^4i9T~a1T-Jt z2?0je{h$l zuzH8xy)%-RSz}e!$NLM*p4bHGrRi>r-JSHX$(*OIP*_s3(LApHtm5t3C9?ZDvRmHC z+w)z#7zk?T99%x?{CL?}-Z=4{F@1HlzY|V9 z@%(VvNMQTk$yq-qoJ`4Bc5Q;RRY}JSam8B^*7|$*?D+ti6?nVr>y3@Y)9)GjFflWI z=yy-E@-f#h{r7L}$B&zqS`>UxxR(E8@xhzNQj8?4zP#vrd3l+X$c;^~s7RKz%y}WO zWa-kx>+fzkF1Q;L`|(TgXWn;ex%{A$U|$|T{o%9z{znfM9@&}J$UC%OiF4x zXrcbObLTjCctmVH)@%O0m-zN`?wToHs_SBQb{$!wl9H0P=uO(&=WleQb{sr^p8xIb z?d~NZDlun2OzXVvW3x1<^Yrw`6DG{)II~7)%Jiwu&s3Ucua^Gvr$$grtnI}Lj~%OP zBcGgD5@Pqv{wohxcNfDIHotwp9u;q%H{0~{rX@>Qrt8JJIVCA|d3yx}1~!W2<#BLu zIQW#9ELx-_yYBZYJ*}x+FJHdgQDXV7-gy6A2Uk~C8=E^1U%u?Ta6zEt8_=4ieLuhL-u1Mu_V=Tk>GM`auUom&v8IMe@Ay$gV`Jger%xwX zpM3c4o{*xVVn<(>Q$)myO!W+F!?Zy4}&xHDDz#-7ydyPGx_8}mro zoG9ajXlC5UrlzEnllb7@0i$LYIGqk|Q{ywm7qKk`*(4)t1d&A>v zXC^m;7xJrY6!md&xzceWW!L}p(K$NL&duf3_xFFT3NpCkMBj-nuG1mg{6KpjX8PyF z$*qg)bq@>_T(x>NDBf3`@L*wOy=9f@;=-q^smXcVf6kg{K2E-4wco#PPV8D?m}IHE zNe3JlVDmhLEZpFy;(IcIHwA!J;=8CI@1jrvdj~A;G70GzeF`=B=FDYKQi{#W%32Vj z^?KUeIdc@IpU$13q;xuHWyp$k>()i5%~W?!@YxxYe^tZu6TJn^Xt70fP+^SSf{^ot+vwT0(0;$G_g({5)rh((hw` zl$4Y<@j$})#G^SWw`R}v^ULYWIt-EcrwY3GK&iXCqr+jgSuV?K(4>Fd-l|&~uHSlp zy1KZeNXqEU@6dVn=&1LP(yy;}J?)dVO1PHXe@oBN#f2?FHZAVlxw9J{oV~s=>uS~! zbrmIr1-#2_{}}wKsm+~hviry%q5kh$f`XDwjRs1aB#!E`1_cGZo@RT;HfOqok`nVq zK4W|P_;{P|Z;ZG3wH;2V>pWaNwWEXQAUH{aBbvwrzZ2$I6`pqQaIQSb)3lYn`_s+_V%`` zy2p>k3jX=O^YinM_t?8lzP&DfzgNPrCZc)2e!kNB-{pm#od5n53x9ieyM5Ivt+ltS zD=Hp<&ZSu~QMo5?LEP>#-uk>dJ;BTUomYmux}#^aN7k)hs&ilMF9*HpukWneXPkaM z>GQO;rKg?Sc@Eb8{l&y^Zk~1f{p)K)&oqU`PuH9KvA*A?X~6=AgTJD;=RG{%JNv`+ zZ?Y@athur)-^a&9Zl)n~V&cL@mooV*EqC77RI2^Yu1JKd)#-Ve-MxDfHWdOO>%?@U zI{wwhR;~MY=ovpj`W^YVBwjjO#o!iodcHY+# zr|n}ub5QE(w;LaYZ)_}1zgx8ZM#LTax|rtQb1jR-qPOKb$J`NJ5u&yB_KBxOpwlP$ zZ3^sfwYHl6navl#eml4>^7D7;L*LkLOS`x%1Jz1rmMvN0ve+5YeM^q3t5g6C~)<@56L7WFYRfQB_nuV&@k-?;f< zFQbZj{NYcc@yV~Z?f>xQ&rc~{x3@2~MW48DzY%fe%9RJp|Np!5pin<%M~At%-Vts6 zy)EbFS~D^jZQk_Z=JWq9Zf?u&)#}Ih9X_=E{=v`ZZJXn4tGg_$A8Sta%K7ow|If$g zZhLuuTXS`HZOHq}mh(H?8r1u*{ryd_R3^6a=U4Olpk|)i^7|5?@$FBipYD*7zyDwx zXy4h+;^&4{S3J(lF_hIi8|xx}{Lb?=AzB-MZNI-U^|jet{%v2UYKz?1k!if`{f)-s z>1PieVEoH#b?@qr3Z3|mrk_54miD<0I%)xQcA%0exdsMqd~oOY*SFahHkNL5 zkxg4$eIVqT)^=6ZL)qdNmiaQ@p8jC9sCMDYOHbMAqgRGJ0v(f4_J;*D$tQVv`Ac3e z3n$qe|DUP7_r<&4@`9=ipTyt!?>jqOiV6!4-gobN@YvrzdqZH<{hP(lHnh|h6{&x9;ZvFjEmzVkaTJ78TJSH--_5A;zs%H5&vkL0M!@?4u zUcaAk`dTh;{vUhLYT4iNI(Y^h%j)KU#wh=?^GQvyi{A9rR$Tp zr1uKcJ6=C+y@ADhnVo#wO6qPts=C2-TiWSc*tO0MpQHMRI!+{}q^5GqZJTYL->2Bj zuBfKQHgBFBXh7%m>Ejm{A1`>hX~V*KGiJ1`z5Oq1gLh}p$|LIY>-v6FBp&|cSH85P zqYrdjL20RJ-jsU|Nl8L{GBzp|3&J%-KpoYMB_|i{S{IWfV_zub>FLRkwR;Na>Ob46 zlIHdO{94+pC)DUl-rkn$o);H)*G^PaG~(}VsV7gLUp2k)m_5$68npR!`|5mU zQ&UmvvNujqRaJNQfy#P+`~OX>`Fr%NdXuhRx$@xh`G1|<;(A=yPNx`^boaXU%iR?e zxWIPq?3}=L8tzq9Y<)78T}z&%9Q;>AA>}uPvN+>dxy#KhJSwrMMXK~^Yc%n_-SbA9lE;u zqea07fm5eXGcu_A&1>rJ{-K|JWoFU2*Von`KN-B-^P>O73XO{D z>V;7&UE=cO&dsrHPd?s%-PWQ0|N8pbOQn}Az4=Q{;PkbpVd7K0TJ`tG^qpCwbMTj0 z?yUsSwrXzP*6G{D^TO}CB?c<`&9!P~X6NVHl_6_c#WUBs{Mdwp%`UQ+C%#Vbem-4y zUAykay@~r%=XRWs0d=AJK4!Ib$ejBqtp4HV^Y|;e$IIS!na9F_lodrs!w+M>BHZl{dy*Ph**^Zv4dhCepEYy5pY z`B4j}75iV%ROz&}w>SLSexLRA?()}d*W+p zLTzTI=AFBDkIw1Sh_Bn~q@2&rE7LI3IQ@lA@l!6=y5Dch4_1VKZEbCRbXc`}>%aLs z&sl!`Rl4WjF{XplrS9%7J-nx~_`yQu`VcMAvNv~H|Nr~bt+3##o(_+DSvq>wPr&_XTserEBPNc{yzR%Ctg)m z^~am}@f=Ltpgk0)>+9B)%Db;z)}d*In`F8c^XRrQNc=GI3*YR}QHcw&o8M?Y{^FAMJ zZf9}auwsSBo-dC+gO=*%CZt_CAvnW4eOtocty4r);&(4A-XFXBdj`wFWp*~K{pYKE z-p{aNWX%0=t%+5PlO?jr_Ac|U8^Jq6%RgRHJqW7jL2I3>m^J3j1FuwO+1&H&=~Lyq z4SJD%QS8xH`*TWdb9&$M{?>l&;_?jC5waBFFE2kc*E;&j43mu;V+Eyehi-UR6f@`C z+wD1byI#G@I`|JX=QVfRMCCSREv=vpdEe*lUG$wDw3=&C@BaPwa&7M1E%bkXPwKV0 z@0=SCOrD>eZSHQr_2Bl)m(TtV*p&G>>>%^*_3QcP)xVS6+xz?1pFe*-9Qu5oQ*MKi zkhFZ@u3*YnD{b?Qhc)V%N{J{rG_Sd$-lJ&BewxzrO@GwP#hQ z>VJ1|ezWvWR&YdwNzHE@&OB!^)7ZS&w4WCNHf2|Jy}&b?ol4CdZ4ZMw0JdU-!SVZ{b44rl*%?o4dYM zZ*y9B;GlCm%j>jrGx9F*L^-@Y6X)E{BWCiZ{QceT>i2uyzvSEe`H-?>hl%-%9mg~@ zH4mN)Ue5ZOXRfTT+T_G%JufT1el_>;>Nb47r{tqjO8RpJMMcJ+tgIQg!+uNG#j^42 z;1}1sC(G`Az1c4)Nazzc*Q;r%Mv`(fE$=Rm+jQc3BG*}ivs-9MjQVz)MGyO7R( z4c)7|?q2<|y2-Kj@F6EbDXFXkuEvb5=3BU0ostU@V{dKC<<_^otN$wa{kA9fcbV?l zyVvFI>VFQwq3`$jik3gsTD5A`t7&`p?76TzTz_$0_K^<{o1S`4*Xy3QcXj6FWiM_n zZVxZWzA2Xk*PN^a+4`|s!BVW6aBB{i2X`Fy0>WJQGqyllKu9VaKNN$sf* zSYS|4wm9TBb5YD*cC!WBvO`~A`?X)=LfV0be`)gZC+56)Dwol*cS>~ZmHlQncjxba z5$Sf6g=tIS6RR7Sex`Q6PV~;nzmu8|P7|Pg^6j8=hRf&h~W!`;P6*VhiXY}@UQQNaS+IL$YI()eI)^#bkSE|0h(&VVn65-OR`5h}` zS#;%1^3uBxPn2$0`uVij^~2L{+}i<-#|_ykf|fk-%u;#fClvk^xr9sW=<3F9sCjWA zaq;nKK`Xa@Id$qtDQm{PJ3sPj&Ye5w_CDM1>vC`Q2EMnx+z~ErE*$%;PMkXDHeHXm z-!r6sL815Q6K6zp+9f}x{pb6dr_#3JiskAMEsd#O7r!^JW1suxP0qnh>l~*Y<>2LX z44U*!QYH6n+`GoM8{Rvw9zA}XJ^6Ugv1w~>zq&Sc%9ID)>!%(5t6u))%|&KGL0LgD zsjdSD7&iB?zCiZLg|pYdaU=74y@;S^*X-4a$!{c-^zHpO%!v*~zcb2gK( zXfpM%J=cOYYhpIMd6{_Qy4cswx6_ijzZLPD9Em%%*6#9hUsu08J-?N`sbNu3U3-6j zOMJhtmLV&BMfUY|vWt|I1%!or{R|EHZpxkynRZTJGnOCJ;FmH7jlVEVnLa!Hj%+TE zWX-LMnpckL7Zn=jw%LD`WXiw0%HZX99mj>&L@!J+f2((P?ftDE`}XXqSrfUNubof+ z+OPj!ONE|3eX60aFJALirEHJh*Nus@OpWad(ogN1_Dth@gYuN(tyLL%&a&mfjcpNz9JNx0ohmGv-K9OmixWW%y%}Ye8cM1t9k9N$!;(0*_+HS^Hi>2O3~{lPg)9-k0*Rs&}dQe!@zHz zO|N$N`d6~kUmfd}{_+0&{s$i(?*DkHTR&p!>Md&{t@c;g`W*kpCOGje=oAc=14}E5 zr(B7yd%m`{qpxpMWR=X+?rv@`uXoRutkY*ZvTB6@Tbj?$tfN6!PMxV0H@&yEM z%7F&u81~fenK*ZH@b;Kh$+wCxoj-m%+CZZ!F;Vf*;oFjbt65nOeVoQK_vmRUo4q!y zsmG@%_y%sQJXUXXWdFav%?c5Z-@WTwK5tI@jT>$0r8-*hrGLD6w^x;FJ5E3K=1tBP z^P+F=UmNee?F2bGCU5TC*@`xM<|@RCa7uJIfw;W$DUVNnX+eGI)7lXzG6B#g-5k$(x&- z+nCnROSpS>lTk|g^A|UqZ|Tg9-y=8c#yth4O}3zcuB@y#1q(h~CnYUnJ^k{f6Nj-Wj-1BQKGdmyGG-qe$hpFwc%8M7b zq^g4!jG6i&7K{nG?)COdNLbLPTYA~_^pagGPI&CtaYy$4s!f}OW}D@jy@&wyEpL5& z&3o(koFi8f`-=E)6obZ|HFUHN9qpbD8sob0;rM*ExANd~^dC07S!ynw|J~U8`E=zt zaFOF74|0CemE|AxbhiBa;hyxfqB^^TJ$idx^TGX_lb`E>X5jbyeOEo>>k*kZH+G(m z@hss$U9T4C16i-8!!wCT+Um%YFOg0A>$6>4N<`Kee{mFKFw6OI`PJRlStf#fqEU$t z)=bpYT)Cs-0q_|#;NbR2Z@U?DX(;gm_N|p?6w>)K=aQ^AG z1q&EH&#z+Zo~CoO-~O+7_O*4+b#?n3_g~zyazoDQ_|wOZT>ANx<9hR3-j`d=J34$W zRz$P9q!j0^%WHZ%XO7IloUCtYe{O7SdaCT+m$d(uxa6-T%hMAcFY_%uJ$33-j*QF4 za$XjTJU-6(*-%lDadp^#wW|N8PHENbtg+0y%6+P0$L`1b>T1tUb1RlMuG*6D^TEQy z7DZ21y!h)s&#Luq^|u+;k-VS2eihX@9=o$?cIu-vew}cQ4@alROP1{U`1lytKCa-E zAwOPB_Ah+$!f@~JyZdUTK?7%hw$`>g9ygx4v2@1bW0%EL7#MhedAc};++qF}l~)T{ z1jem2)vGl=Y^~Vddc-2IpEGr9za4}6x%b$`dlu;Hz#b(Y`QE-QIu=>Hv82xO(AR|O!yj);hd+M&@!_WaiBsnENH1Ob0# zH^^WEgN^iX}>AI^3@*<&jLl?5aP8Rg~WPox-Wh;XH(q&&Lv^74&+$;%gP zRGWVK#&DHg-bHr@3Tpp?DtP2MiJ-odSU(2oMycWN! zL~^=bEL%YJ|0`FnWYj9mF)!!)#LdNH7oI#LsNM1qC>NJqIU#ssbGbYhH}~snxi@$5 ze&pobQU9mnh>QEdvunR;D@^rj-Sekrj%Bf!w0WM>##_@JCad`wWZ!x-ap~vN_tvxD zmhQWM@5avJ?QV1DPn*}bV~6&lbR#t-p>EK8(F)DU>PaUrr8bp%o;>N{wa+>_cK^O_ zm!F=!d|8{{>ox6McG@Eyy|7uU`Gd$u4$H!m-*;`7(* zAO0;ms-dyt_k)m_n4b9Xwa3=~e;uYg`Q(>+_EnkI&~i z*4zbJ-4am+UEQ)qii5eK{?B84(ps7dJIE)zHzoB=KAe zX${T=L;0DO%T>lwd#k@+;#d?p2~c=tga6*u2^J)Tz8I7XJ4$j4FkacANcc&j1zkG5p)iWoA1a*E!S` zy?xCbA*D%7WxXm&-LGyftnO4N7r>EO|e{)&FV!?ja zpl1U3{Ztl3TE_P$VLFo@4J{V-|2Q6>; z_$%AYGF(1Cf6up5r=u>fK`eiH5R#I@axd7-Mz8!a@v$>ujaps)tkOJ{=OY34F5=dTyUoC6Z&eI zGdTtGA**FPLmH0Axw^YPoZN4Bq|N@{k$1M$g}=Y$&b_@Y=OPoo-46!0eksnKG4~QI zH&5BHA)w~hN25P~POrD9c(LK$gPy8crF)NxFHUaft9UTpa=ZNuFTS|2u=zo^##ftMrRmah*$jPF9+r73x8Zux>-YDi8hH9&YpZ z%AZ~9Zo0TUQ_tHSS6=RVT7EC81E($2r{h4Ih2)@lvW38h(xg;&G+#2 zW>=O0*pvC$vDPeuCBv9XX=1B1G%Yzu!`On>Vcv)|wiz zJ8y5oUE96YGp%QWX1=dYUho%!XS9ekvXdOt_9E)rf(0T&j%1TSIeSi5jZQ8{8I@L%rX?GduWcUX! zUpBtVQuXro7L=dgaJsNiiupDB_T298_p90U^z^Rz*nyUfSXzMkx*aE0d3kwlsCa3# zWa(1Lt@Qx`3ZPY;KYsj}VVMeY<&_&yzby~YfX(uSXnpjZsMyS&{Orujg5uJx39rDx zy)j9lr=z1IN6prj8FY5+#^mFLo7ecfHj9gk+W}gJY?Z=sYa8#TBCgJkj*b-j|W%X(drXHhD$MmT?=A%cnHk_F9QLEg_4p| zHfX{WEYZ=S(g1eTe^f~*BJj06@|Qt}+tFd9mSped%qLufQ0n?`VDNNt45^s&=5G0nkf%TGAEcM1bFbmhxPL@~Hz|Kb#D?rQ zNu5&CSzV@FVH>j7bgFGsn{`A;TC41hlxT84N7=569l8x23Wu~(r~m!C@Q3r=nYqDb z&+mLMeY)$>zV!Q_=h(iPGxz)+Rny0pEqNIk7#J8-*R8q13Su}YavTED9xRR$Ai7h5 zgPDPWK|zou5yVw-+67Xl;#pZ)Ib~|?*T|H^hgt)}!bbdpp_vZVIeNN_So#3V{I-a zCB+pZ%ivHHq0Gae(7$R^OG3A{ws!ZbQ>U0hSQsY6fHiwgpYHBz?6e`j&wsgcY}~x# zAbWiU*cc|LhlYl-{*+^2nB@-QvQM2lb)whOs6Vyc*Lav26uyHzV0rDD!RoDwQVa|? zIS(-~6s@shzbx%Lk%i%et)m2k1K-lqrx)9>bKiTuN}hq?pFLRYX^~2}p4&7=h7bS2 zdQ`4wS4UdNGbn5an>b>ieGh8qNanrK$xvy^DUd6z03+xQzt;Yo;-e$H)F*sDKb1*Yxw0+y97G52>nTKJ4 zvOo(XgUQ0Z?Y?hKmoPJAIa3QA243=0!WU3n#Z z{)J^h@wIg|r;X~}o_3TGnjEkGw);n*^|F>O3C0k(P z)@cfBSWlfgwP?>8om2bot%`X7O1n?IwWj`3YmSIoXY15|se}+>z_c1UqG?cyDeelMiwzd_kS9kB) zWwr1|Ime--jUQI;u{m`rX9*_*14BtnDkRCKy1MGb>@axs>UC>UymyX(+8-tc1_rO# z$jHc$X;V3m?whtkL1(I$>(ND-{fG2H`Nwgec-PgdN1Jx-a(U}CvqM4W>(>bfN?ctd zzJlE5v1`+&O)J){>FGLkYDM%0g=hK^6FMB$ENR{V5?`^RqpQR-UX6i)!D00hrG2OT zw6u~OV`Ft9HY`}O+;>`vQ^>ck2K%=#@PLY!NUcjRS9mO6yl$P|v*{TMVL_gOm6esC zj8<7$xzQVx-Cs<&6u*9bTztIzXK|g5U%!4OO`l?{D%di0X;5Hjs44>}$Df$^>C>kd zA#rkFzkW5$zqcnMf+@SB^oPQlO`D9gw6(foL1mePr}K(5{w8W!eeHMg(w^Yii>FDJ?Bad_9-@*3qzfn^=1PMzwy z{M9Q^z*l~L?(WP!Tkqz=rVXdMx>l@Nqf;gcDtS7$WjOw={QUfQ6Q4=!CTEt!l_6TI zbldnD7#J?B3keN#+qK8$*}2)*72VpWitcV$Hf8#B_ve0dTM|H;-v+p!%DYu65EdCJ zId|1+D<>{<0>xyB&D5z=1Ml@M_u95wFi|$sLKbAo z{cH0!&n**e2@MIE!39bW7Y^#q(u$mz7e86>wlCQ5(5X|8>VblzUkxT82XQUgb0RU~;N%sX*1I=x9s~(Z zTE1qDj+LmUwAKsB;FTdIudb|I;rsw3qp@z&`gCqFD`l++foWQoSV8{0@J~cpTPs2! z&DQ{=L@YckOzdiCXsdO+qMs5A$R7&~pFVvW7#kZqq4=ro+*RvVb$$Busb)UND-C>F zv2k*ttP+ybu7i`srI#gk{-E^bzzIr#n>HD(e|{obAZ((ad#bDJzFi`6ST^M_!TQkU!0U5a`mqdxS zfFgQktP)5_W5cEpEv@LC1$Euc2Ha0T_6GP&T^nPu|ES{(&50n}M543B&gBORq&0$) zCc~}fYdUl8FH%^uHaY|pQx5C4n5@n!1Lv&N)V23ggg}~#R;^jH#&z+bS#xu?mYLRp zgicJKmJ)WB>rm9Jbs(D^6t|>^C2#IqwZ#k^9B)I4-CIp1Tc%E(dQ%f*MnjqQTtD|n zt*cK8ec2L4ud#s~w_xt-jAK2=);LCJP3`I`u}WtJn`IZWzYf3THCF0be9#TAVX8Y_Vg+F3HtzKz2J+Pxe}B)W>yNq6KV%`;|AKvUH{xD91UpPd&GR^U3!n zgT>(F{^Es{^b1vR6J@~@lWB#u+Tb{hn^vgo2?~uD0;i;B%Kcn>#T(rAa#;Bz@7mY5 z3TKplf@G(3Y++j6glLJTE^`9~d4Q6UU$00L$PocqV)CM4*KUY| zI15BfkrK!s4U@j^6->Ow4)Vf+5ZzPzKvg9J!;~%g?1?Kw0=q#v z8)_n_)IxQ78k>TH-^D{$u4SoDFAJ#bcBwTsHJa)LYG*JoXhe2@T5oh2l7LE6SB6Zv zX$aO5G+j%(d(#v_aEolpj!m14l)-H_joOtVT09UJJX!kab*wVT(gjPPHVR2V+^hs@ zU@95H}8JlzGHG&&O@wCec|aEJ(jnsW>c4oaY=3@G$%(jnw8w<~ecE|EDIGkJZ?0jy9MwuW3L#}D|JMoSGCv-nrx!qlS z_moMSUeA&~wsyaSjOo;?NA*}47Mx{CWN>IV&po&1#=}*clMfx27u!8$(w2Wk+DAVy zK6jtK$`7o}S7#bOLrKQg&(B@=XP*;odU`Qi{;zr2@8j=5^_RnJ&O;0hd~fshZG@7S z?TLS53$j$x{ zRTE{s`$nqDu_gZYX219tUR(e>>+7HT$M-HOZ;~_K`|UGR zC^N%^YBz9pn7{!^u0oCi-~@;sIcUxGCIxWXbny`1&A`xbP0QQ#@60%@Al4O2-p>2` z{>G2H!sXA_{#R%Jv+iWF*URUe3>PFEB^WLw>gGh;cw)$VF`&Wg*1O4;n;-4`->03$ zyY$Ov7KV(TmEaOf1!g#?k;uS6rppFSGnO#f7PqpTN4}sgFk55ke02tgWN^f7-H@0# z`M8OTGox1K?*GwACvQ}BZtae8*8FS3$RL%R1!}}Fpm&t$7&wp&xpr$x>2tMy$#2iP z1Ajg{&mG`vRFZq_ybQyFy`U26#fG{|Yuz_`d(4@4w?5#F5CcOLsM}N$5xs6p7)W^j zx;dw90cFpbMlZN}Q+x<+z zS^8|y=jUc7BD*;l8e%G6y}kHxySQ9$`>|fFGELcAb+2;;o45Uo%-Qhg6iBr~Iw%4? ztG-`e`SD@;kr+$E#Pbl5TCuH2nH_rD65AH$Og|-udzA^msRCXXlX6P*-2y=P&Nnu6(ia z%cYNpQ>S&7fVz@w3=9g5EQt=?XJ;5HyY)-TuHXO9t*0W>WshZ5$(h;a>m%>qUg|yl z#qNu48!x&^A7y);FYtQZX1|cIuxERYowxg~lk6M2tEBVXT%x(G+6L= z_1{O`6(5h*A3xl0Bh+v6E91)5t528QPp#YG^JeSyc^^05E$cVE7NM+O>*g}2^xVzD z(`&bz-THQ2dtJxfvb(zJ&zX#VKRC?)$lP5{Quuz=>+0OqYxa2kd3-B7xpkgxcYx&4 zXQjJ-c)gUHa%$_8Q>6@B(ywtaZ~FCS^Z7?@v-5i1mfx`Jv-otP;=w`oVzDMy7oWcs zSuv$wuU^dG9{YI0VZPqL#cr<6HF91~v9Yl{b{~(pIdACb*nYp#+Ry6ek`=4h>ldUl zFsMvb;K{ghXJ_%_V~XZS&2Hz4KmY%(+%Wakl|A!6zf7Ok`Iqm7{BfD`9G_Vxn(v=8 zf66}Mt$$Q|{k~aWXN1Sqn!5GLL@wxJVDPYVl=xt)9494M{eE};obrD^4L@(5$!h;! zx!+F8`u#5NJ9Wop-P#@5%@Pl_q{)82Rxc%Q$i~31Q;mapAE>{-k=4Nhv zGNQrudH+mKTfg6>eXLJbyngSeQ!ln2;?iB$duX;zWzn1Z2aLVju9m!$>9_rLo+;dA zSCKYh7ud6#VY9YwR-C7XX-G&*ha z`?r*o)T6)rb{)&-)oH!k_k3QO?_4SKx)_e&7HaM6+cQnHF1ibB0Z2(Xr%d(Rn*>6(P#N;F*@CqH<@)$H$Kr#Q$3qsTkqw z>nmehkg(^&o8rQ=q2WjGRsY@Nsui7HQ+hxi!_I&^MTh~fHzy_2dPV4Pdu_}FaC8IhtG&JVRaeLS4da+zFk_-%@25 z1bL^fFTb=zqU!dAIdh~ndVJ09sl40sx9>*H=KTI&w@N1aK3;eGeaBg|yIVY_GBQkX zS?1>Cmm^Wx>qMW=sV)0*H)HXht3iQ*g1_JF^ZdB1huZr$~YHy(w>6dv7?dgAQH+v|4Mu7CR={;$2AScUc)~pA4c{|S|m8|*d+!mx!hVi z^Tn;L*`N>z4BxIGSN-Q>N5_w|g6>B&)#nSn{Pd~m8WRJ9L#AMh1KZkk*yecbZcUn7cR+X*3W9l`LwZ{G(72M2$NVqjp<-~}nJxBC`h^Zib- zb+Nm}YHSZAMgRG}YtbU5tgNhCxj#Tdf$=pT zU9Z#yN`Ec=dU0j(^N2;ujy+TCUb%XG|M~Q@T|0}PyJ=1BIycwa{j8Apmf8GelNL;Q z=cpO$oqcw`y?xgH6}|dd`#VakWanCyf|PAPo!OxSQtb*das$VN-7$iC!`)2HC zZ5tMwI+ZExN?q-rkHi*w1QQ7_2>GgYrCad}Wx@UO$Pr=NH`oDG;cbC7vQM37M z@>y;P({Os)Sdxao7uZBhIUVC}h`dVD} z+ZzSVyoDjdSpzE_Wk*E`n~M-dsVMp-*3I%*ZVt9W_He=!Y?l_ zE`G38?DU_XpC4bn9@i@#FC(bG|C84q%U@^R>fLI8ed*-A7HD7f*MRQ8dJ%xuT}tlvq9ii%pUEuZ-F^Yi2T<7*7t?po`} z)jgS*R(pPWe4S+eo{w&OJ|2_4U$fSKzFlF$f99m=v1OgJ&drSuJ?(4G->E*YV$sEI z;_f{se$*P<&z5BW_h>=d+{Y7|`8#E|-QO4bb?X&SkUVhaKY63>Y-qUqbiLT3x_cWR zA3N4spHcIN)p^_=zdJ7Hg~v#+hGc=513`NiAqsk{foSFT>&UHJI;QBe7NZK1QW zQqpPNZ5@BV-_|d?lX%>$*Jjn~_5JaGe}zllUjOU%{l(eW*PVU!`h9q;sQ#bdt!}rC z?k@J6takLP`8|R1JC*5Iu3k-jTmR~K@Z*igm)C7hervV2`nX`byxiYkZ-XXGQ~*_O zxAXVgzT5Tt-Hcx!uc-CMf7xAodhK>Mmm`hrG7|fL9n}XFO8H-YDEHYIWo19FdH>qB z`dg2EOhMx9uJapx)?Y4ucBZpkuFhiJ-gol7Z8PtG{q=hN@z?A3%L&HsHN2O5J$CW` zf4`3(t2IA&lAUSkw_6)`^cC^XT0CW)>h!GrKa}KZJ{;Wfdfx8+JJ&7ikuz3v>zDj| zw*LFe%j)0mrq93eIK6tyul%lO8UE)@7d#ejab)`Q{O$JSD=PveZ?nskhAdjVB5y<>mc&<+A^A z*7_X=_iDf2HT%B(1^-X&e^se-Onw}>QM>(aluhlY$^LdHr7BV{-+6z#`u*PMtM%ES zDl|KmTU_tV>B{|oit>(qUKTC5;@Z{g$7{de6|etsSw8t#k7Vwuw?D<>I-bW@D27E= zPPO>E<#N*O`Tw?r=6{iz_2cHX?GMteQ(sN#sjdAkSNrj(c;VTt*N?@o+q3BA-}>t> z43i(-c--HA_T3I;y*&>O?desUVOw2xr{wd59lvH}FWRfk0!y!#QAG>)?X#1sf7H3-$0hGsq6}%9 zU*vbKUboMx&-&So8`nLCu*zIca{smwmAN`{lBPL4m`Znpc{+b(=Tr0JSCgZ2xSqcs*xx^0_(h`_;1g zK{5BD{sChy*FmxGk2(ZDey;u2H$A>mRsFAS-kTj8FaAHk{P@yoz3gC)Z987)?@;`9 zEB$?b@2wXZV)b+985XC_DLJKCc&709R;w*P)*YW;VN-Vdak}A?XR{aY+h?ah&-wGR9rke?Qec#;c+l9BTmAm) zXO~{K?v58RpRdXv(eJI%{3TzKaE^J|&CTh@6WwLx&hNkQLuB1EP#X=@{QG#}F#ppP zn~vH3IidWqJN}=R-LDsm_snbmGt(&5OXkbz_#+?G=byQ4nI~&y(r5AM#GHMSC)=;b z*V}@PbzUH8oOa~leoLie{qplS+sRjaIC!J_er@udABC2$izkB0f`9B^`s;0{{%oG` zZB4PSuS?C=w8tQa9DXM|?Q=0GVOTz&D}9__YRYDTO;e^^vej6co!QMPtajwz-{0od zm95t#{yq6{Bm4c{$7e4tzI~L2;biqb_PEO zRf#f|2@YpwnQH4lpJARKCu9GjrQ-eH@6liXp5I?Dvf&79Ex-q-FZLe}{P=K~zc?oH zF{t8mmnlv0nQgXK;kj}-sN>|$D>LEicbjmxJtj(Qa>YJZ>OQ*OJAYLwfB)yQxc{=} zXPIh)+V68>{=Y51BY2$OYT-p+y`rb5_4oHQ9+#QBS#VWr$mN~IHJ?tZ7ruDdZeIO% z(Y2}{6Wbqy%7*jy|83Skf0+U5{ao6*>R#RRw|nMigG$W@&U~3)HKNX& zD%@Wq$flb2r{&CI@v5({M6=iKOk-S~Y42zA^hu9mgw@=>*k50}d(G}>OpCAE`QlRQ zNzjaE+L<|$@Av)Av-x}G^2bxF*PB)Lf#NGNeZHvq-Gb!qvU#&D3X^zjp1lC&^vTD| z-rh1TdwE^|T5S5=h{V=;8&jsME?%@r>Difi!kg{piwfVb(st{Uk@UC!>@&I6cZPwY zpZ({a9lzd(Kg~T@U-bTb{ZH@Bc9rq_&;Q!^xX=2?s?}?xY^%O>_|09lIL|S*=HJif zA20s5>k5yrww)*O&&6lHoo%)~D3Sgvxj6sPpW^eUuc|&dA|78SsXnhH=-996v1K=J zEREkEvHZK$#xIw=LG80E=YGEWo^of$$B%!w^-Z!SKW#z-g?DK>;FD{pTa7gQA)@r9^FM3BT9NsHn$l|Nl|vvwX8bE&jgpzF)TsX3x(P z&R)AU?Mp<}%ZQ{-y^RGA53N``S2%cios6)$Ur)X5-;l}jSI+*)Nt5|ETRG`QZ29(z zbWczMU`Y&kgS+ndwhhQzey?-{jEjM3!`K3kGfddu~8vboO!$1AxkH7Bx zG7=!uUgzyld?#7vf34W|{~>O}KPT0bpU*AJ3d=Q4JJa!)eeQ)6j%&;P=Ucp);GDcW zcl+OaN(Z`szr1GOyST16rRKv!_QLbFhabsbkH7w6+K28xuU9UA)Mx#^C;s0f@yPT0 z@9lbhwD7ph?Tp(;w%_YgZ!_PwIK?I9&%XCjg{^mTEdo}7a+EpWPR-Yb*6+6j^T-$& zfSQtz4W*AC+xY$b_rCk{3f*kJe!2Ydx%R(HFUr1j->EsRyU}}p-Nuv0W^dW{WzOyg zhq$HY^6k7+bo%H@_4zW^Is2WDnJ?M>ep~gNs#BUDUuCa9>g$}BRdnmZ)$4J>zu)h# z{}PqhDt6tn?9L5~uU{_DvRN0tKF;vN3dW6xzum6Szxez8ueXxv$2z9F9kE}xTMyK! zzMnncuC_|1_Kl(8>(76B8qT(_Ubpkv?AXfv+H?JmFKm|)`u%RR|C&vov?PDu$iH9v zxaYE8fBpU+Ninr&uln}+Resx<{&>=9z25ut3e#q1>5D?+KI__=NW&LL4*IfHMCWfU zl_`CapR}0QysO0Ocl43_^D5JNBn*}Q6+IP=w3nD;njOYt_wvY&ug{{BPO47N3EMj_ z8?AkvWq!F``TWJj#qP(F%Wl;DzLEI*t#t117mNFi z*b?vVF6}?q%x1bfZBNpsr~;<&ED-U+pvyS-fytT{Lrbps_@(#OT&y0osoxMbaWhSW;-g_E<4ZkNnA{5Xy~7k*Yl5E zi_Vq(U-M?8#qT@C`^=dZt$qDfTbVdbk6$soQT4sqO-61mzI|1Y=66L z%<1fI_;kGppL_3L%}?XE?a@4bQC(rKh_blF*KTofTm9|auiTSyG|FN0N z&GSXpJeLaKxW>^eG(ESrb!u4D%7&?1;-zzUB;F}|eIczqq5F2?Z`nt;R*dSr z_4}{AY2CfM{I%Tl*rLoi_3tY0zupW=y>Hg-1~p-~SG{_)YV{f+=e!+;phEhwA*jt+ z{b|DlgPmIo9v-TA^YOURHu7Y&ZLT_Rym&tMb14bL;D5N**}&ZhODs?>EB- zD;Ra(ZJ)sR^XtLFpQ+PLwOOKLw5E3L{dUKA-H*@lo8-)&JewW8=hy>Y^Sd)jYv-+t z-F@srbYAb{KFe)46>mHWS{d@@()##2_HXXJ*!%64?!SNE@*XrW7XID(Kcg&T?9le7p7fwwE?bS3t%E)Ifs{-g>)Dl79zz z>xy2FEzSjH?p(X;Zqj)Y=5h74*Z5iW|DT>e`_1uUUJVgPi76ZOXWd|2UaajVGiB1M zRjYRVSk%4Qk1=Omyi7^JwWA61Yv0`z`@R#@t!KmjHmd#jj(uJ zf#aIJVZY@vw>;|7K6W#G?%gL+=4T5J{QJ9j*)p}{-#0cU&%S$o?e@E3rKP2kxAk|v zcodPp_iI#0ycwvmp#AU9bFu!8?0&u%_wD=S3=Goq1M0V&G5R?DwEp>Dn|Hozd!2l0 zil(Jyyru>?n@&3G%x^!ZROFhx{vHE$`E|OR?p3`$8kzpjEcy2b_4z%W!s=;n55q#E z^7FIQ-2AgwW(O60InZc1+b$$DRFwVytLu`t-S_?}ntU)NdD^RcwtD-&Y}%u9Z`Z9= ztB)Pre=g?p46&ZFg&#m`$TqIk37xjtyiz)UPa&w+_T%KI+JCt*yOdlHzgf8z`4pzuS;} z?tJwHM|RMN@cA2c@BiMs{{K@9GncCXn`+LxJ3Aw9TbI6zS>SbRzMO5d*XFWjkoz`JenNcmEEbMJTAp_q?5{5;S5CRMBW+Eku;9lVkNeaABrK}l{;u#);qmROwmrL%{(f)rVP3Nn(f@yb zyKP)QyEG&&`pvG>>m<$pc697``Al)`FNVcepasCQr{QsZg^#7>ug>*b{`kawnVHi+ zFFSqu@rT2Fr*G7KzxzGq?}Tg6_}Zk#G^MSTn>)ng_vhE~f3yQ%T86!fBN)kzr4Ks_~-Na=Wp!0KCgP)s&&(D z)a`zoymINZQ@<;V-d=F#JNMhtETaA|sG(}SZU2u)9eb`{m^T&NlRCL<-9Ee5=el>l z-Q^v3K0Y>9*80ta%9J}RrpKSV@oXoXNS6YSS43!N=(TT4*b-N--IcXwPtdd0x3`m4 zE;ZVpInUbs_pIEtf#Koe!OMI)&E5OK1B;u_+e)9e{T|aJWvX>g#@1??&&*3tI;K9I z7QOD`dQh+E`PWI&prYj1wq3h+NfdlJVDa(EWKe5(c|)iusOFqGeZ%r)otjU4eM?W7 z{Yw06_gXxqch;*{uWnQxztjHz=as$D-}kKP{Smt|M62w6?)RRz{!=-md9x`>s4$ z#t|ACdNF;k-9}JOuzI~lSUP9J!R=zg=S_+XRyt<7U&?uAR_a7L!}^F&4CRGdNgy>(;Hk+w^mix_(x_-#dS!?ro{s zo!d^T%|4P_ekX3j=dGdp>;BIAW1t>x_U^WM^6ecTAA?3-RO-`b1$lj6FlF6R&HVj; z{f=#$|F7iriZyG_+}*sy!@8h@sWe^sXxs)k9 zwC3lYXPZLm*lyK+7|hdQ+KJty|Z}UH|>}jqU&c`S$&hF1x?i@XfwzP>Ei4H+A}ripRalbMNghsF-|xxQULUjL`u%yf)nadAc5ZlQ^;+aj z3}{4eUF_~O8P?wq-Q|zITD>-GL)EQr$RLRCOcTw|zvg|vTVLNJ@iFMwx0spx6Y7p_ z1C1@bxw+YR-O5)x*+iNYc)aeM(q2EukfZwf-2cb?xBtsbq?>X7-kG`9=6Sm+ zJ^noH(k`-cdi_ydt{*h&0vaTnVQ>FE*i3VdUG1+U^YwSz^jW^UktQ1-9W7mcx3>IF z>G!*Wf*ap#I(=;0?Hpmyc<}2roBh^YILI{F)v7#i{$fVE9}f=qd1S=yuY{Cc$@9#H^#o}^j!-7%axX9U@4tS(Vy}X= z=Ea)HYQ9~{{Z^}PUKR(n*;3<7pt*xTk9WOJ`Z4+N?JM^eZGBp`es9^FvR9cKf2PfT zy5iE4AD_C^|d&d}gWy|(83=Uer9OHR$Q7du?c zdxG6jV#{rP>g{`hD8Jr|zj z#q{occue}y-|zRkLA~2)F-0eBLSm|RrBxm_FOU1YjQ#1M>1XG3U5OLfb?=tWYcpM` z)Y&G`WO8Y5^!FJez3*jyo^a+r8kN0n>h;ghXFr#kz>a-(pSYS|9)S`>lAt?XQgX|BH7hM@PiRPx!p# z^2-;Om;1}q-AF8a{MG!(>-Br2%I}m#&ndcea%0{6uhCbo@1IwtbDJ{Lc388RN+1da||!32(N)-)Cu? zzCG{mt+#pAo*!H%UXy!uX{mS4rjKfd1qT{-e4kgHbcFkVpM88;WzOEK*UtX>*DhD5 z(RQb%c;0Fq-kZx5Yd;)hXI=exalf6`jh#gg_kO>pe`6y~PQ+RewdmH+$g7kB>dyoz;)K4|#$%WW}G3mw$sfBeq+ zeHUoK%Q5g;8h-m<9*o+rXHxxR0f{CeuN zn3dc+kNW{xBT{Nhg!LBms)^ZDi@;jPVUlv`Qf3z*oH-YnP*L}o%wOB{L_<@AAh}G z|9o$o=VZ0g9sE|Hk$wr=UuT=J?{4z#+-+xX)V=@v{psGeZ)b{m zI|N!BAMsc{Y+12#<;ffW-V~od7MVVO>h@CKs7IiQv*bQ&GbJU^i2jbJ*P^>)0{@xl zBnfLgYbpDwe*H#8Ezmf2FS^50eC)UgQ!sf?jO?qqke3_#2qx%1+_pDCU z12t>(ejIK!tU5Cz?EAx=Y)>XD@CZFqKmA{&uKeE5$o`$*_x(=#;HiG}&CSi+Ay>cu z{k-w`BXf6INzerUv+VS_#bq(|hk0FBYtFYSeKlq4-^()VABTp=%h&IF)HUbZO_|Tn z&T8NC>-3Gxy&7t~tyf~=?aWlrguz&pCVOs`s~O4*Xz3HzuoB$8p+k=`fYo?!AYRSk?HN$=kt8u&HH@eF#l1| zw9{mDf4zXvc+e6I(0nbZZ{pUz?Ekx_`^Q7C$K1_x7u_1R+;8qCy;XnRrmejZo&4g$ z!jE@~&p+LA-gOq&S2h20@6|7^-Rk%Lp5$$}Jtm8M=jZ6JTer_nZ`YGYW_u;8i@&@8 zwbX8uwZDD5YW4bmVHZCB=GH%v*>U&Emb$! zgOgB;Bh%8Ll@^b;Tu#31Yj(Ek&Wh>ree>ULO~3R105fPVV$b!j`~Uyd_meQu(A)cF z)0*RdUoPsl`ZIg?v7AjGk4fGJEmcTYcAHoK@2AD{J;lYB!jp|^x%QsWUcYD7_TueF zU#(t0Z)@#|v*yoLR!A77c-VaV@i_NY@|PDE3-AB^Zhi~2Fz&}=SMjGg=^M)LpWP!C z_&x9L;^^=1EG_+4-p)R6ySeSI`JIyFn9|aBPX9nld*;->v$TA<`i9=lHjsZNiZHQAiE{BCXdv2AO&-7>oL^l7f0yHLr? zORDEA-hNqgJf`I2QP8M#kN&LEaZt<}4h$B*AtzsoGPpI`ee zlE>!RjEZkN(~aeVgM)>e{Uxrvv9rFE?H;}5dG&>$r6syEb#}kmRQSnLJvC?j>ebzc z`z(~^{kgussAwOkC8^jhD-~>iZja-Ulj`%Pe7yN|C!5G51sjR!^VIxZ37gpTGZc-;U4g&g4s!-C6jB>1EBWy4`O#y}KhVSa|pA z_2Z1}vJ%SfeK{ZZZw7U-`s}{V08RVf4ocfy`f26zBR8MV6P{oHuX6Ri|68xech`Qu zZ=anZC|LOD!NHAxKAkq-eZTL^t&3rAzshZK(~R|2WB+EaaP9r%%Eo`UZr!r@WA1(= zb$Yy9@v}3TS1mycHbGUvo9p%e*X&-BxAUmj#`E{8({sMZFmrhduyJnx^Xc^Q3DS8z z`)Yriz5dZIUup5}UithRE93X?_>^DY3tFs|6>U(J`0dTjkMG6fd$|7uYOoK7Z{2S}o|#f5NWo@fYLs9rx$eh8`(V_t!uFu(@}7@Ao;@ z-|rZw+kL-NEOKmGVR`xWA6kp;Or|b(-T%MO{9cXl@ucL5vuAU!4C&gm$tWc~J^6nl z^Nc^=M0DbJ9(wTeQp$q{#)6WPke}Z#T?(qP_^a&m|4H(aB}+1F=7ne-ZRHj>NPNWd z#~{7$(EVm<_QMAcI@%=DOE(Rq*uOq4z zKRzg4GQL#!^ONWt>w3TSkN1ClHoM~e-IY?(flt%wK3ayYi(2|6f4^Q#ha)rl%c=an zc5@AxS6^Qj_-niC{=fWxe}4_$U7wey*VZSo?qmC;?r!d5eUi<3bFGwBR9NET;#P#M zm0A*{`RUWA0%KEAas9X>*K(r^f1Qz>dOY&e_4^%hvc0vxzian!a_r%clTU_f`s_wEqi)r zo2~pC$js3F|A+A2>aUk(ynB4SU+|7f$kY4h=UQ^>>mE-wyk2`(%P8ojDO1DZcD}`q z&1_b(`l_m|kJa|9xSXQ$@a$}59UY!`rgsz5^V{9~KTVi4sp)dMU$%_RUf&dzY5LK9 z^Y&J0*5N$XEtvO44m=x>U1e-?oa3D z+poX;<;Ja5!MpkP{d=W7J9Ea4-Mf?D@fRD^JmJ`STU10O;bVM#;>Y;x%WA(&47(kDX-4Au{lBF6wiu?=D5u?^U4Orx}Pu8eQKVj_I`ge*SdVegXQyCUfbB(1V)6c z`276;EA90Q!q3mMdOm#~2M^DYuBE3xyn4MpQ&wl6i2VAi{eG3cPR<`spXXkE=k=4k zyu2Ca<#NaRsu^$Iyy><5YQJ_@SJwv3G-I=)IqOPx<>lr5c-?Qmm9L5MPn@#SgG+K;af#h2XEf1cQP&2hu^xLVQo zl9eCsEp%>6`eAVOabtv*y1IJJ=db2j$FoGeoqY4Y_k*WTQzw0S zb#--ns`s=-b7x6z41M@rN>EaoIniZ_f`$f1y-rk%ef|H~)s0_x-_Gol-B|WD>&(A* z)mPTV-hT2jy2+85J?W!-y;SO-b^P`-+WPHh<$Z~q_~z}~k5|`3hJNDAo_rzT&)$lS z2kq;{#l_FeH|NjaXLxeK@wZ>j7~j~ExcFFPf_C;R>-S0DzTeOO+hw%!`TOVnqNk@N zpL%kV&HmdFarK0kla{*uznGunJIloJOV?C4Zizm5bH0n(;gUKL5m#UF<%Vp{UeISc zx7+U4*6jAT(c7f{R`1N7z7Ax(pY6dXAFF#idO8~ol!Clegckb0x4R*>nHA(OvxyVk z{5Si*w~N?W!y2X+-}vqAEooa@@9Vq6^>gm+2z-2C<1H>8o+H1uzBc%|c6&npqLl|@ zV`4t+kFP(xJAZ%jq%S-xYj=OUu_4d)&}?(_6CZb#z3h^`y)F62g+w;Xd3)3rE{xcp zrn_w4?{x>+FY;xJwSCRLZfj|_e5$#Iy1Keg^?&9!clOEt{q=3_myc1~aym^fUYzmu zs5sYpXE9Oj`m-l)G_MN}b8uh)xh?a3eZq!hHgmpX^4($&U+eETs<^Of)m7PBE3&RT z$YxuK*Irp4FTY>^m#lq_ef0B>yrv(&em(mAeqH;~`ag}kN?(QissN?gr%Nibgd;2|>nL_iV|Evj&zZtl+>g%hD{8u47awZ(B7cJhH zcetweah=JR@9x3EJ&lV!CtnE2iP$dp`r7*A^4o3_VhoLg)MCc>Vbg_jMn8Z>nU(c23IE#Y$UO7gW{g z#qDbOT==~3=_%2eeMPRTKdwBLKAk6DurEwdS5QFUfT84;kg%|};^*g;zg6gf%EKMp z;vsd zlWk#PS6)+D-2LNWcwl0pV&8m=#>4J>k0Ww)CQX_Yk|%w~LSk>#H@p%8^D=&jPdTskohhI6*^y=x;R=@K$%`40TUtHK{D`lRSvuMtwJ&ztG#d!O; zBqb@WQ;$9V_c#BC7lC?m_Ijx+p&Ksx znlCqGY4(CnPzFAA>QsTIot%5Woa>!di#b-cQK=7PDvUPz-(I0%l7CM|*1E)Hb=X>; zZ*$Lr!kmTeP{#=cIs3YvHEVR9JbmsQ6VvnPQ4)iH6|<$a_2I*pnd9cgt%%#ZYi4nl z?WyH#^QQR)YO0q(2MqaJnPN#?zw!Q zXFKIz?xSvDgV){qK68{0SN{272nvY*2bo30MGv04C#Pqcb>Qe#(XF+$y6cwvg|4wS zSqaO(Q@vD9oI2wYS7*n?&846xc=+Z{wyY}!ZL7OiyKXi7vDeMzSAs%MM@PqrQ*ZBW zmR|24WOw0L`uuYTRiarF9(DIW^ZIXQz8P?1ov$rWceixf_f1j*&*xDm=t;-p5*(8&=E$Su(9>y_=ArprB-A?)_U{%?Sr4 z7ap?vRbj=&#mze_&CQL??&p`_srCGzRANlo*v(0?pnpu~< zJ92vczNXnLS5EbM9aLj;Y>$E1^7C^7clzF5q4DMIM4ozVhz5n>Qup_k6c=OD>GVAoXbt9j2~yy#eK z7=1y-B;<9nu%Mt|Bsbfkj*gBF9~EnB>BYxv`ln10>Ak&c$Bu+29|SY5uak9hc6#vk zZLgG`o&e*C^XJ{`>g+ac+Enn*Nv2QMx~=y2_w1?d@Av=ZOP*K1Z&JFGi;GK$siAW^M>W&W#>J-@$MtNBj{#cWVP4>;I_xj6ZbUD`igK|$fb zl9&6;OSSIJvpKpX6BG}TQr{p!)VyYm&Y2mO!qwm28D?35np}VHewVOFXb8NlsHCK{ ziVGT)!ksQny0^C_y}MJnV|M0`a8>tSna-8(_jFf%eI@zl1}Kh01(_2;blSApv%7hv z&693+J>60K+;3^$(-$u~0+rp9j(ia8$hdgO!BPbjx_mq>pj02(F=>*}9E(CGP}z22 z;$aUDj|*A**?6TERBz9FabX|xEjQPLw{PD*VW|po&@709HU;p@+a0;PyL{r*sjW?i zoJ7RMowcSOx_MLb+&RA$p{J$4zP{c*efjd8o4r6Gr)mHWIgs;Q%nqKrBMFLMP})*5 zVui#LD6USZAuDTyq&|?UO`H(7g4{dN7m|-b8ai^AAbtiJoFWWy8c2iE>;vFD3DO{V z6I9ZHm3MTETH)d{8c<3~qbW*|j`?EEj1Vo;a9;*#Ra#l`*c z+LY}R=hnt=J9qFP<9^*goV-#d2Fd3-I#%&POh2*f!&Q$}leoCJC(fU*|0BI4@06>n zYg6(xFBP^Ex`GokWA|2tUWj0CxO6FKj$QFJA4?^rRaFtwgDj`9D!o1wuDsH#>i680 zC(fJ_S~L60v1|#Of`p}gzn_}le{^YS#m!G^&f7bO%r={9r6xFWWv9!j`NcPHe*P&g zIB^@?4D0D@j(vKnUHJcB?OACd!N{E((tHE=*V!JlN>^7e$+&(G)y^dQ&zmDRpP9?4 z6q|c@n=C6UYg6gcrAv4GS74tz@8yc`h2P)Z?_a}Zdv;gp+ooS%U#+~^+;QT=BfXdd z<@RTe?%!SZ_g(;5pUvtx zv1^0g(jpyhmus!--6n-v);!^;`u^&qWK72jFKrDCm!hIgIX4gAjeVZ{3IR zW0;%=D{_Sl1>C|Oo;8mX*I6ICU9SAnr885c!KJj4(k2(4mWiPm_t)v(a@jUbceNzg`zG|Cu{w+B7DHbH|T9JaIAk#igB-Pkx>} zeR}(A&yybB{?2uAb}mYSF)=X#%l%|oOtM(=-$$vPpR6j}ebmFx^WfU(?H@JX3wp^< zKXmn~sGOV}2N#da-l|eXp-!GjVV<6xd3W}7UWwlR;YFa_ktD-8bLT#M`LNNgS8CD1 z{q}F(@ci#lFg6yxE+jm0=FHaP{ql#;p5@(|Rk<*8vf76)UrZ{hjwSRJ#fF8oz4r9n zQE4pt^XJckvNE@f42~uy=B=ml4_(c!`0#+SsJJ*WKcC;+-2BSwXmLfwg9RleYfAok zsS2s6sXcmk*T?3}+14F9B=q$33W|%J9UPQ@{QfDq)MjSa&UfMmethrIJk@S@CUn`U zQ>P|ODq{9LdGf^Bv#c&kS4xVT_wTotVrP~5^VuM^YT26IXA1vn1^b7!tvq)%=zVDH z#nK>U< zhV?F)G)buD=U4LyQ>LE0)+=S`^!ldB_V+hBlaKeGp2p5E(~)jfb|EW1c1r*AvJVdw zMMT9{-#K^uIQw}%sg8ZMRfmrrb$!1jX&xc6*xd{adhwnIPQA#8*(I{R=zo}Qbkd(48##D61Al$5{{AlU zpT9l#wc0-qO)4rXGN$hDDtq&X-90%u_4Hip(nAOS{k`%o`9zVf|J8K$sa}N-9w@Hq z>2nLaW_!@?-o33GYEItQ>aTqDMe<0_%`WecAGNAmt!~_2T>HCB!m`Ff%AD_#)_T#q zp5BL-`5Ib?Nw3~!vvbFe1@-&)N!-|PUsGEfl2`ueisq4=yK2$X^!3xv&pmwH*e>{n z|J|?FRXSqU|9-k}lM$8de0aER)fs2kV|(Hm9^W^9HDgiDi^CUES1Faw-yWfJY~9`J z4T+c2Y$`rDRL(NZTHxOQPQtQABJ1iU855(@s#Ox3-%U#IdmTQrYLih<ce>zl#}%Bumtet7C{Sm-?O@IGet3Dc(WF`PJg((%iz ztrd^AhWE~@^YrALrW4!u*19}vYwe@2uV;LJ%ycB@Zd>Mi|JMEU=N~fLT3cKA`kL;O zXLgg;dV702H?#4Y$o=;^6nZ3fhekyB`n=e+%!#|dy*bz`ZJv5Me^1tp^Xo&D4(|FY zy&>(b)!MlDz2)!a{>AO$xxMZEf#2`ql z&PL_j-NhTMw!c$vu66bu_2&fACi6Ytwi2c6xk;;(8Byug4vI z;K(fc@7?3a&3oJ{cg&on6G9Ng5CFGAmx?JAfeQWK`9&*aL zzfpL1+53ahlkYjakF(X)vaMXUV)v<;uYbLa_77{*JSVzgPj%@0U0ZDOb6(q|@_yZ> zmwHfU{`7r5rTM~#gJhEXkaP(l62Gl-1{4auTP%TGp#H!Q8DezAE(!B z<*p}Bo}BURVTnr2-c=vWt*xzHwq`0vlm{N>e_E7&er|9?`KKqEQ$k-TF7xv9>r>!( z_Vi_^Td!2s)OBWE-Q6FbUcaC4b=Fp^{)c7y*3$E9?YPzb=3TK`8yR2QYnpvM^Qys` z6$>^9*q@o(pQ;`9%JkZuQ!lPYnUF%4GM2nyQU-8kZ`)E?l|HCpl zeK!{s&lKoB`s3sB){dK-LZAPc*=6}&{J@9rKCa6&hEu->mHBY(ZDDbm&`nG zPnzoc#5}!8!9fCdc5J*=`&d6-P-lDo{c{P)VN<3~eYpE(alyMgl?SWX+1X3pUXolJ zwXJ3SdVLw0Hxp<7=D0q2(uVZ+c6WAv|1y=o)1~Qs`uT(Y+|QI31S)UMthN5lKF3;K zJwjio^Maa@(A(QvUH|_2`tU^rsLkQwySLTZy-&gLwa$W`DS-OvGecm?}d(ke-)Ik@7%MeCT4FL@Bg>AdgsiMIk<1X?k`zg<){OvPkV3J z7rZ?E!}Uo^H$Cm1uJ`cY-``ey%}TyRtV!4zzJ8w9`n4NRZ?*C~scBIZBJqTqm$Pwx zJhO+2P)f?3qkn&YXRV*^wRDDYzTCSzJC!5i_t)9-NEt9VHa4yZT`lG%H(lX(oSEMo ztJd1z{0nv*($;G4mvLP^P50vRa{Z~5-Eo`6j{9@e&#9{5&FepWBx$w)_khS=pena8AnMKRA92O3j=AnXziQJapTc$1YSzDM%9VY+Zu{5NGv`+ut=XCDyo8TAF-7#$l0)S%yBBE?-Vv-*(En+|Dmq z;mxC^-bIypOUtTb*WBI^xNv(^%Ij+t)t_d6_!uaYydXD3x<}4b==HVy1FuZ8Q(t?l z3hDg#DgNirW1FdtyGmc1YnV7moAVvIQhqP&){2~~n^fCuzU%nSw``s-_OGj*U;flT zvAtEihh~{x{bkzPmHO!F^!P)?=lQ}o4sGkq>797E{o(oj|Blt~E<1fqTwFZ)`TqZj zf4GxbZ~v~SUYzQ}@<=a+;lq-N6@QL+@<>@YthSjtb?UWONx{bJakY}YQe4$4VKuQ5409$(;kwxRPrb971NB&G_~1_J@M<@EdkEdo0`dD*3Gc{bcX{ zAEi{`wLj%%(I1oeh_c^b-zryJ{TlJ6u*Up1`^}=1*VlezU3<>;QUYAWSbRToIazvt z&5Oe~QoZJWl{P>1@BQo7&6)4_wr|*w#&vsZ)=eSj`PE|X{YM{7kFOW*k^KDp(S8BJ zdoio8fAyU@PxG~2ah!eatCOb;uI`L_wRe^Fw$gciJpu^7Ndq5)*fRyy~&Z zD{kJr89x>kyji^TbohhDJHpdWoj7ym$gQu^EU)7#GnL|IeOPoWGFwJQ#-Qj(flt+A z(}TY*r=NSUDJFl-EYs{oo*650cCJ{#aq{FL^{1cC9gm&x_x{O~oON~n^(J$yN~7NH zV<>p`Ci3S0w{PDH-rFb0m9QJF8ZuL&wU6#9;<+S+YtNp@dzs^WH&YSo0M&P!ZueVGOUbe4%`SNAc%;kq>x4*P4 zp19|%VKhsxw*7v#iu6+{YvaRZ%}O{99d32B3~gNCJ3E;r^XHEr4<7d~%d}lvmKz^m zWA#_rvHA72x3?_{AGL)2X7*nfecx`cX`Z@Jr@^;q;DCcqUGb!Z*f$>^@0dI-P4MN+UGI#(f4#hQ-Ws0Z zxvQ7nTfHkG+TAjH<#z4U5%Z_-I}_V4I8!*jS7mi-dV0HNzTctW@^vcJw+cU8Nc{5Z zrt`u_*FpmWCnmhnW2h+nV=;FZbGM5UPi2|GBYpe7LRO`(OuSTu4t{yNHfo#5o=t`S z{#5n^7={)X7H(YN9+8rgePw-k{D&hS4juJ=am)3mcHyVT%_r@9FNHfgHXeHZ^^~`M z=G_S9c{Oo|+xbM#94K~OciZMeO3n1z->v>$V(Vx!asM{Utfsx6;%0qNimUyp+I#!& zpT{;!mM<e5keQ-CgIyZU3T{GumVt%2UUB&^z%17T+3$DN{mT?f5u-JqOzp9xkp+ zI~(~K&OV)2ASxoJ#ls^dA))YMk&JwOITd+bRl&mzVZ zB?mU#S^A^GrtVL~wwT>zxm!AO)_yLGYB4|F{W$JGkN>jA{r~@V-LH#XvB9^dX3v9P zRh5;RyuUJ%FEBj(5iPD4Ct~6eQdqveGtGB)*4)0ib7fy$S*aYcTx;&TySq52X|o*- z*;(*W>C>lAsi$SFw}jt{FiYJTwlr#M7S~<{)0N@d*CkYbe`g!@eM+$Ty*O8;i5$GI zuDidFv;BBz#`Drs@(e$Ia~?N6b@uGlpAyFsIKOiz+^Ie$^3+-WnO^YU-Hn+@Wd+F<7dx;hA)~*C0|N5rCM8CZ&`ccf$mg~ zg0HtsmmXhjVUg{y*zLo|kB!ZHZIzVgKYRaW=4P+u*Y&iu5C7b;oO#`^it5An@B42T z4sxtJaJf(R)@#!l%N8$IcI%hw?31-x;MmOOHUHA-MTrtwbpTDn8c z{PH9t-dESJ@6_Hmd-Vs=E0ZQ2_u8HoA;xyuRYG62-uao^RRo%de>9^reWu% zJdK*##``yLvD1SvY1t>If*lhT?S2$k@yS~*x^5AAEWr7l=;K3&l#HLcoDg~^eqhIU zpHL0?Un_iOe){yu$-zN+@1?2r4wL50={dyJd~3F{t@n!EC80B4FZZ|2^t&}LJ9K~e z&1)CWOnaT1To?B&X=SdoQtpSV9-FGxty@>|b?S7(_s3Z`m1bXC>puP5+<^6QwtM?3 zKQG(x`u#s<_AheFowdv#KV7`XrZrb7di$Yww$-Vp#r5NyPIqv$zV(|^WA(T2=!3|R z*&a7n7ykVD(_>GatnX|S!8g^9kMTOLUs(3`mQ>EO>Cr{ZQ`=Zp&)>PpDCp^~)b_TP zkXIFFXPJuHwEB4aJHHNlRekEE`QEK%^S3rPGw&*W+qL%gw$s;+%GodcR2sQ4q9^%y zQtIivygaSyUo&^bXfMt)NSyk+qB{9R@p+}R(_uGv&6y+f$DrKq&Ry}vwY$qQu5Hn5 zVq$*y{Q3cnk)7oZI6Ll)h?MiFS_nKTbEz@rY*4*7yBFJ)xPtInEkwDqIJC!1#6{#!S zzvpR5n=I42ekx?Wfn;yTxRVZ8=~1xp~gF=9=88|G=Cz3`x3_QJY`iD?YSaGx@_+vRy=bGu zV|w?_7c2eb&7k1?XPf-$(?b5>X)CR^YM0M_eQl*OhmY-v$^~WuY2c7FdiwS9_IV~E z$@8*9cZ7!~Mjzj>swgtx*d(^M;YXuxnYr9bQ0U2N@=!T6JAY5#$@hD-t93uz+4jh~X2mzQyEOXnKxnxZ13qGEZ@xQW*F|6V3cJ$LRL z2XF1Kk_)FV3p+YGdid2DJ@{~P@^X=5OcvpZ_0`qYE#~6q=7mbKvL3n~(PMdFeNB|< z9PRJFI{vJg>FWCI{Wn>eI}%@CUw4j*vSN5}?Ck6vwZHlPJUN!d(BSOeve~!v^)1(@ zg}$-tcu(HDCueLovv2L~ZOK<(nQ9%s2wIh=C{uZ`Y1#gt)H=Fcgik=O5cJ=P9s`}0HP=`A-`&SNb*YMvTdmAz1iwk!R$<<0-V zTqV(}zgzO9Rk>SKmoItn@9*ywp|4M#F;-PoZPM(IZfTb;`6KxAymw0a9(_OO<*NTx z^EvPCb5#w6e_ zbyL7paDWIhC#D300-l+j@6@g-_9r02c7LyiGdR3fcRzRT+=-JXC+eR6_f5K`-8_7= z`_rvil8sAG&)19JQQ;}Zp{=1Kvgg){oN0@$t&LKwIvaJf=uRv5i<^tt86Mo)>T=M> zJ$Laf36uAq=1*U>ys9l=aa-bLtx31QqIiz zs`~8wT;&<5TVslfjO>2bOmnK_;^A@lUH10D`{(T8;o=@k8+PoFxXJ%c`K_PTBmMYe zy|c}GD|byz(*Ex4dJHnEbLmR6xA4z<8hw4Q)^FYjZkMbrZ8Cah74E$g+$i}NvUO8H zC@9cW`Wp>4Y5Mv3RTN)(J>%TPMt$rx$&$Hs#OD zCT3=4R%W*Omepb3ws(u`b4oFsV!Oo8$=SAgwf3ja^LaYzf1QbpRCtqAvnL@sw0Y(0 z)2A;7f2d4NPghp4xUnE}%I9@Yb*ob^2xO+7>^=PO<;#`dH}b6Xn|q5R`&!5~?+<=a zQh9fFXiAtrzwq#IQ?1rMwlzJLr?zgiw6aoCv4{v@+xctOt*;!D<-1>|z0wtpmg@6Rar#}Bn|iwZecGdU zch&9r&dsw{kCvB^P^f;oQOVlc`rwpL=~`dJtjgc*$=SPpegCD6%e0*TRcM;$NqzYt z`t$cs&S{f_^Fm%#TwkxwIqmiJ)vJ@dFTcLHcXz_ih&PvSD$3hdwHT+*pVlq*@S#+^ zsFC|lGxq6HrWdyR=j;4>D{hh}qw?c+U;V$(7q8||Dq`*|3O-r?>to4UsV;_q)nU3O z{Kj`?RJWygfA8K_q6_X-?3y=a&G&tkl|Oe(pQ{_OJky{i89YpL=lc06IzMB43)h3j zXg+V;vME3`;?rK=6fT~YiM~~Dr%r$P;)O=EpU z8IRSU9A9cx`l~1IxTd!D;a+L;z_4XiHnX}WvoIVu8N56sXJusBw_26uOE|8vO22%$ z&Tihz8;%CXm;N=kr}XX>R`=(u;{5jNW^7`8#xxPAD z+%$XDd%?6fUwmTAXa4>*Gbq#|JQ>`pI{rszsZI!M=)-$zMrv$_PN@C-^($ddjQPvd z)8PuQ@7b>XmMO^2M;+}N zyBb$luQgoMYH&aO{QTpfZoPWyr-NqB8H&^Mii(UTeR-iMQ2*0t*&b`r^Zl~z`TOSg zD!cb<<_HU3bowB9cSoUcxR8*@w#&!v)&6EV?bz7(Vbg-^tat9*xv-XW~x1%@cnSY;n zXVV8$?fqNg}k)vB@hE8HVz&1YTqZ*f_*xp{btX|`IlUGcX$54L(t zmogQZClvPN;lsuY6PDN87k*OFi`kc{QLWwYk%{fn5L|x^dM)+%%(QG?{gA<*2Kt|9nHB|_5a4> zPj+gabMSeeJlx z)Dzd%vN*15X6JwSVq=8k;oa5S*G0*nk9isuzt7IDY30SGL7LM-=EQ|I_v|j8IB%k2 zMELG)1v;kjJ6B%UKYCnQU*CWAV{s9Ygl~6#Mm=9XXLZa2BV}9X=L${R*8Bt~HS>7U znTvc*YHMj7`on6^oi;60-Tb>?-LJ}p39*ya7B;nOKl3?1rF6P#jD4^ne2`G|3K9XheB)ik?nUv1Uvt@)=r#JJYa{=4Oac+UNu!H+NRx6aJ`@#eEWOK<;# z2?;J+G8P)f{tTDbuFK5)+~u`8?9kuS=@VHRR;=*&d6sus?e1+{>(}eVZj;Hrw(jx| zmd|f?7SFJ*Z%l}NKhHLBdEY0-S+h-ZR|)*NxhGY-?(co2-r%0}^!vx3Z{Fwh=jrLD zufl3Q?!4S{>ULLsebwaldheT@H4!_#w!L}yu8%`?bH}Qrbwz9SCweR?;Fq^8vS$?8a%qq?`foW$zjv42{<-6{mWA{4L+T@&5rw8|w^#S*F=s^7;84E=nRIA`ifWXrDwtvwxE& z3EeD|dGq$;wI${(k8M{730&ZqH*cO-b-Rm82A_oqA6L`vYTu=gRkvJHOjx8n(W7PM z`+dFT%l7GW>{}bPm(9IT_Hc1C`(oGbf*(JA9JqIm57guI@&lE8ph2vI8*OZD4IdsY z%(^`L%dhMmWx9bMoL}AlU-t0H%F7a;-Xv_vyUX?U^;PGuudW70M07-N&r|+(g!9df zpZrIXHa>`$JMU%3J=tc5$Jh%UUYFf9JNkjFQ7wa}oUtm)_<@G5En*xTi zx3_dFY7Np(hpDK<9PLPS7L>auvu@qGO~ohAoH?}e^74&|kJS$TsA4cEJCo7+xVrkf z)ADqyM=v%m-&`bTU&r*m-a__qyhL+{m~Oz{Uy~)%PoFwf@cWzW8~XwV>;FH)%XD8| zU#~vnRh+QCzkf?x3y0dKANkkwmfYFVxb46EhkY}vxUa4bKg|B#_v)`5t0F%CO?m@r z&rDg__3Fw>-Pxr-&fF}n$h{O@k@rDiOSW_?8?V%Xix&l3TU$N$mU6rI$sM-;|8Mz) z$=Nq1JQujOX62^CvvqBQuf{&xSGO$XRPoj$)uG`zuO-?{r?7gbdw-RfXvEVp@oaJV z`p)U`vpVLB|6BEW-@JMAe*8ME|KViMd6vd4M~;A}z)h>|RE0V}oVz_)G)+2ad+qLR zfgpz;{B^9id5hGYE9cJffi}JEF$&sUmTQu6!Qp6JTj1^M;_-EM!t-kly+1s$HT^0k z_V3s1u;T?qMTgWc+c&khx8Hgj6C3;S>h$;rlO>G{*B?^h;Fq&GFe&x)#*~|r^S&uf z^vKO`oF*t(@&0akkKCD+J!!tP7i?R<{*s}|uF{Knf97?a30$Xr`07{vZySvqY%YoL^ewnqkBW`op>c7?{8U394 zecN|HXIy8_g0DsiuDli`rZZRfYO>3xA6Y7b^Ga-|zgJqbw!y8}ApabHQ{(roPoF$# zc`5Jbd|uAB0-}@<@Bar{;B1-jmf9&anPny|*bZE-voJv(=GN z-k=&r9O`Qfi`nM%nB>h`*x{n|<;}{7wm*OWfVu$J4bKLy z(^l5d;3$56rfvTGPeoIwPw%h3dDBb!^tW%{X8d?m(IaW=_4MQ3z1fM^&PaOIPnqJS z;&J|jLt5H0Cuc*QHIn;&Khxf^BWvCohq%|*)_%CuB3^pWKmJ>RFAmG3u8K)a zRJ=FONRs*2_sf;{8~^@J{I!Mu!Gi^VH-`i-OJB9?^qlMGulQ81n^v*@Rdep#Q=6x4 zN;nCsAtxP|OLVCa@~FtZBwbPcs@m%OJ7xynSJ#g>{Vd-2cz*rH!pmyCmrbm1++OTG z{hY-2LlIZLU9Dv}|KYaow+XB;I>k;{QhGtk+!T=H@+emQ3gQ1(nqW|J9uU!^*JoMV|JJEZqK{#Sm$W>#zkqzjvWWCUl;FfZW6e+$MViy-rvmIR%uQ3 z5Rk8zye=eM`1@O~P1To_5B28e;a9$WbNC(g`!Z`PbiP1@l?1&^Qk+SJV8 z-Wb92Tw4l9AI#9*<#==aQsr})*{`hUZBN#pkc-Cc6b{qnqh=Yqn*+CckZ zN;KuR=iPU!tFwFa_HE$iW!6m0Qi^*jXZY>)_MJP=YT2sYX9Cq{bZef!D)c_IcEego zCY=e&q>z=^k%qpFD_6~v1MP~?vv33LjsUOLqt#mL2MO={dh;BbL#0{ zDbr1>zJL}PmMCgzPV+iDmlL|EP)RBI@#=}trHS-k?hJD4gny?_ol=M);`c>dMO3n8;RE zRz5q&1&Y0izDWu_9UUiFjwBiGn`=AU(LiaFWYR{7etCPdEGa%dzJj76qbw;Gmy}rW zQhTGu!|r`breCKe#D>f^llc87!zAZL|E5hwOO`Hu{N&~3f)&Tsrz@@c1zP20{r~6n z6`5aNUgdtj&-mzyOaZ}(rHS6NLAI5>zo{LOcioK3IK75zqK8WK^&N!*Qs#U{rPn~Q z+mXY@oEV}C@`>u{uoKf}n{ghUoxdmVOKoQdk1A;Wg-zBG4o3ly%P-vEQ&S2$;vf;q z$;#U5;paC^w|d9!*(vc#O3o+FpKp)Q5nGdeWyQjoMb0iMQh9lKE8f0dUAX(uBBv)$ zpK7nUo)*7-R$kT9vtb)#eO#7wfOjA$YwL+=uX+67oJ-2vWBU!n9>+_pF0|el(UYj` z&V5Zc{*(Ehz1fo5*)A?Ahu@r;%Lq?|!8kW6Sh&rYI@v?T!^`hjue3R6v;TvW2bS_m zo4Gt*;9y~8C8e`=(j=ifJ1T`i3FhKrn~tMN7S`5>FCS*^l`?g4uCKpwGt&Rf)tKkn zQ@sjbf6I;8Tg7W>X(@2?=E38)rG00$EQ-6kE9<*x_t71bCN$jM{$9b}Uf$2o@57fb zE|=AO1D5;cHa`!IPTDAOQd4tB>1#8&r?yTn9|!H&wd>H~!_1&{HsR~nIi_7Vexhe= z1zQVn-Bep!`|#H#DtGqG?E3Sk#=_cK*~Em!v9YmARv+K0*ob|fKYc2&)s)P9nR(*; z>2?p5rtWU;S65axH@Nlo7?pJ|wAYTk5ha`Ev+Yylti^ktJ$c=-7n;$%Tw(8pqb^p0eXRhULdg?v>5o^7D^*b56c^_w9s(reB>hi4n=jK`^Cj76< z`p()@yiatlT`}A2q-`gr{r>tAwA}U2|NG~XQom#!d}A-VHSem>`n|un{`~#J@|v5Q zdt=>WwVeAKg^wOR>h(QWP_8dLeqP6d1qy3FM@7Drl)NFcnU$Si&S_#-4P!%pKmR;g z6M@>_U)s96yW?KYcs$EizH9uLy>MpI%I1ZtkmfAFqwt zcH~E4vY?dEqSAj)WBt8A{qurHPc%JLgr?qZWnq7O^I-FZoyF=FH*RN_<~Y}dwI%g@ z+E{+S?#-TeB^POkHSy#tfVi%T~ zsk!gZvuN;aZ{D998#%bMmzmWj-^(_P-uCFp%gdXdc71Q(mR9@Kv`hQUgP#w7zh4-p z`_#TgXXT!GR<&#(RY5g2OM+Hj%9VNZ_Ts);>mC_9nO^DF;nSs8$C*7#&pcyw`pV15 zL*)&oJ0?$S^PQapIyN9T_Q|71P5=J>N=o?u@59%x7hm0YwQgbruGP0QPVHK5^d;9h z+ROSzKu_WPy!#u4kN3$>*WG=k;Gp~Ed)GA|Y)OA__r|)wVOx&+ro-03YT7mvwzU+c zt^0jKq;zhG*3pB`?Sh+AwI>A!h2&jV+hpq2E7Q3l&6knk+c%#15!`W}+ChhRvN1e( zwA35a5kJ+nF(xoja9i&E#=F(u9=$!8|ME|=lhVY5v%9`V>`z>LOMeEIMYF5#n5jQs zc&uUCvi+}jE7dy=>QYqj&d0HSBkF?XO{Vb#>kJ zbP`viUFEcZxZBpN*T<4~~`f}!{Yyz(e(%RqS zm}`GC?zrDHWonqca^;W2b2hzi*EV6S<~3cmlDqcyg=v@g*6AeQTYh(U>Ct6p4MC&R z(c6uxOhF4b)?V6GZ7$sX?}zXsF8*Y4WyQmu;N|BNo;}}e!gf$gOHc3E zouBqecYpC(y)}Nldi}<Gv% zZ@-^7bIK_#OzhtOf?db-PZup+y7WilJDVl(?Ek+rV)++tZf?WmXW~)QH+M~% zJlXK=;g=peszRUFG9IoAyJb}V(?D#ZN6Wvzzqqcwy}6rzX%)-$Z||%XBHrCyz5LSh zd)IzNu1Y%fY1Z6YdHM4*R)z}r#GRS8c82wT_qBH6!Bhgy}3x9-!rZ4a&Sh^k`SmV00E$3bDSYdmwUZJXQv{VOOc za&mNJ3<}D7aNwZxj>6B&68?*>Ui9$g%TBw!)hm6MuUW%$|J*;u=jV=dUh8&I+S1wM z0$Px@zpmE8D$E_EH8}s_g^9`@K6~_T)Ez$NTToJRWX8qCTIG-2(%yZx6|0uHE+ouo zQ~7pj`TMwx>tgwKDbJQy(Ep6d~1rPq;*!}*1 zM%PjP2lr323VA5lZfTjo!n8z5Ry1S+U(gzbrURe9>vS||Xk8MVpw;1DtJT#ZvhtE( z$Cth>6POe^JvkahoVYa0cixw;Y;7blK07mOWw_N*4SoINdsw+y_xdz+CGI_6 z^14g?)|N)lQfJwvCr(#4yf)8!u%4N{@cq5V4~>d;%6t~rITC()n!<)iO)!*N`=jE+acxQgUuH7tf;)gF^u2k{tjOp9?S?od7nhil8G9sKaUWa}7 z@}b2itnGJYWk+xK@rBM8Pwc7QUUdJ^BBe94KC@2Kk8Wbyw{OuoUW2z=g-+l4dHBw* z($`({!~Vwnj4t^9uQp~+1?St_TSfoMe*gTb0JO;O#%J4*`yax-XRkan>1XJ|fP{yS zj(T`|3%8hOUXoz`_0_o`Kw!_FJpoZ+U2Cc%ElQv9@X2+F@zmQFeUX@#aoO$l`&~;< zrKTQ>@%Ek`c}+)I_oH+`?3&o^a_at^(kb%3%tDfajG)EPUa}t_IJ(;1tAD@{6x@3L zdjIM=w}1eJMM}!9^4k|I5Qsk$9T0h+sbR$l51X4yjc1vCUB9MYU3K|`_xt%*^Bj)a zpQvnOYwODEy@jn>^SSQVIc~0QNiQBa-UwQ{@%ief+8dI78eJ*8b|*UH{l33V)1|g% zUq9wPS&eJiwu{Gtex8XsKT-A6u0Ma6eCFCQTY7zbePv~{+}-)k6%i79_U=`f=rLjL z+~yfGvMnTJdz+e=7!I7Ayj;sYVdCG(Q^anc)Q$++`2PT-PW;B8x9Rid&6{D8Xan;7 z+vokyp8R-r`#sClXScRyKb|cbzp(J}F{%FDd4JjdeEV(X81ebp!5IesYS)TB*!=w5 z!_}goJ$ipn8FacdRTihemI*5SbHwvZ^oP`^WxKcK8dg6mSzG8MD8Av(&#YbR?d-VlIyvIG$r)}-+ZI7qNU*|Yvy(PbY=H;vBYguP}i;_Gg zl^PKiX6Du_sm*cw>vJ>SYU%f)t}0P`%loqM|mP z+4SY(nvc>6++JQ@247MW&(FBJx=zS;;?J|QJtgc5CoN$2ZvXby@L}`!hwq*(GwX9& zc;MXK-5(G4uV&dhXO=ntv2gDz&yyW~+kX1`_283EVbgOn^dFvy|;BbE3a0JkC)ep{j&6!o56xd?JIs4pHKRC$FgAEr*Dh4Y!Lxf zm=gMr&&f{JTkXFkv$^&2^OrT;cNW%G>%{H}2-p~=A@bwf?*CFIImd-^p4MbvU)Nh% zoVGIe1XF|6xpOm2J~D5$|KjK8_ao_CPH&;Ctn9~sJHCgg8SO1Hbz5)ps>oWI`StaD zffn1}KIUiU{M&iVKH9<6f7|u;y={j1eL^kjYHD2fWNeePzwyf8Pcy5g~R z@_s8Tt4B|##~r!-zs_5r?%N&9BS&H`SNW9sRIc5!ap|8#zr9sl&zUR>AGI874Zia8 z_4?+f+|sFEXBFvQ-RM%cx8mibgx$`+%PM{@72mq<%8Q2&8&}S+WtzUL|9(VzT3VLO zyS$Y}kWWcy-Vja-`?74 zSoz51;FDjs%ijbXjzh5bRxP7nMC!P~=8x+^fn&_eO;K>1&ysk& zPu{)iSMJu|`S&)3et7)!@#AKHyLmcQTc@z?+xH{q)bXaSKWndq%&{u<3aRnlJoR&J z?GJ;sd%rLoxOAMZrFYE|ZUR(Iu!us*dyhBHYR_%Lg)T$f3opasN{rlyQ z^;i3UaXIJQ&g16dvO~e=Cp+(kxz*2Jzi$5c_@40Hr?IpBWUUvJub*f2eX@s&R86HHqM~-4+0<%uY0iGetF1-MM|S7`k1pBw>f&F^snd^7 zUmtVv^$(#=miaX{kzcgl9CUQ7ct3YLYofZ}JeR1dU2(@v&8sz^ul+cOjg>X&iL^3H z;^}GY1-@9YX-Q?An_F*_bolOB-p9xHuKv2TP3_sa^lNo}XCklV-r5zqK~_wxE3isO z#pKV{@U3M=ioXxHZOB^o{Ijiq(4yL_;;HA$->>@=_WZrFd&oC!9j!wLoey36wsGfD*y;AMpBX)N7>La4Nr7{8%79?1|Kgb;T@rZ_w z4ro0XOJcHn|F!I$nVl|8;_V#m4zaowO;HQP4D{><5f2N`Rt zIPaUiw=ZxAx%1+1JL_%RUG~e1>a#9w4M|)1XH|`E@oFCZOQ~O0OpMt7&0J@WJ^$l- zweD}VGNx%w-+J*oI0~j3U5eSyc=hC`rQIL@Zoi*!=*M@%nj6_190B*a<0i}9oiCgd zKG!<5r>?e2*+Ro(y~TOE%f6|q_xAIzzP5ku(YRBU*>=mF+4zM_7Nn-7akWK0d-CML zZ}~c*BQrl7tk|)8ceh`3C^QB_uRVSC?9r4ExePcP5wr|F@rIvQ@V7TB8_uVehG@XGs+4>c*zsbdtpg|P)a+xAGf&_M4z7PV$Fs7svg+vj+wT86->C|5{?fjB`}`c+<=?;0 z=-xZ!^R*g3Ss59F%tI9iReoBRzg;&+T78T2jm*CmJO3`LTK-nB__=Ymo%=JL z*Xv?>1$lnvhzT@=t&QrkyQbXOc=n5z@=Y_dmQZETMtGwI57-;j=LwX3-BYL>xHNnH zC!@`vA}1s@dhUS(X-!unM7UTVO%0pA(Jb2X{;I>XO9J2Rd-M3MuGPAbRWUL%@??3R zX8%l?evYk_v%IM2(CYPjdenE9G|rztKOv8;^!UbWw%i;UUAszsH?Qi6pR883cOz3n z)w)CGDNC28W_|D8sW#{Tp$n%X_g1ab$~QO8OYi8)K9#++d+if`?~h-<24>!{ShINh z!Pa^`CH?n>`4k9duoA~PJm(C{j+QLJ>b7E_l(cM2`5FCzFVv7?8IYr zO?lzMwXFHuFXt~`{8o6I@wZ!H=dMSd4mz{zahLp~B){!bsus3v$yk@@|MiBkX1XnbdTz5LOS5pCM(w6GyYPrUa3s&8@^RkxICJ5Oen&(GhndpCDj*qJkX zvJ0BqHE()b=5wFV?0H6{T!}FHe_HBI^`8H~6k5yjiuYIzY-9d}ef4{q1{Ui77 zd$pf=8=bR#E7z86ocbrx^X={J!h4>aIC=KyQSa#&)~$Uduw&02_NMLEw`N^++P=xO>cRZvPkm_Vz!wgKPc+G4L^_B7uT}9X(xF zZW^Bsdb&xiEe6!(+7{q8>$CX+D{pWA<3G8@3*P-9#WQiIDx)j>7$58{zjtu! z4T~qwo~^1e%evyh!p^?BQ+1x{rYy{a3lV z^XKBQwNWpA{`q`kOQm<}jf2h?v!oC8$yu{iPE{;FZ~M9DnCHaoM_aeBtqkc}Ip6Q# zH~aDj+wWiJe0Ff9m)c}SGd;eIg@re^RC3?Bd-vm~Zs&{Z^X0Fsi;d2e@t%5mS;|YJ z)yt+%yy}>irgm-3U)hWG@?pPs#^`~@Fu1t5ScEI3trjsE)c?I5^=9du?Ngs$IlI>G zSbsJD=4WR_TUO8RxGym6O!~EozB8Vc5-SWB=e~KkebSLc=Ll1!LW6Z50_C(8-?5F@ zS-pDW@nAijuP^PgIZfZzoIQEv`lX=bE8l(hx%)F@?%~4{ZRN)4` z`u}!yKQcuZ@yj23KEH0!x3}Auo=OegR5CO4@+psMacS}POye}kD+iK%W+uP;wSDUi zZ_9k|^O!|s%(t9#lw|>qFo@=#i@3dJT=Dl?PxliXulAe;% zp{++YY+QD;l((<8@?X7U{Go9{6H-d?Tmo?d=#NlA+o`nLV_$a=MPi&}Vi zIFHN)d1m%6?w+2UL3wwbioCccO%4(em+zPE>}-;&bvSy+{Bqj4Lz7&&A1=Bw`#{js zO`4Ir&aBEzU1IC)<8$Qs<@8lg9xqtn04g|q|NedW>J?KflZK|ATbQ5OrOSDbvwV0a zO`6bjA2ik1(K@s-`S{1%x9(32UV3Q$tXXYq zqqip>d3~7me&Wian^SaR)2?nYx-@U?pKsO&=a-vr|24xTvFX&Qov%{T(;pu===|gB z_N{EPx9>nZ7Gm>)XZp0Mp5E8wqZa)8=d|40pqU64S2w8|9`7gMdU?s8>hBK@GV4}n zPoFzCxl3gtZ^He3Sx_Po`P&y`Nb(<-K>&DP7*`Fn&|Z`jVHIA`RBN#?;sZ1z%=hFxn}@ z&Sw{=dnr)Mb$edy*1Gw7<4#|?bSdk%+4ZG)v0vU@6~15h*>skxVR zHQo2*rPMHAZRNLD&(8Mr@Ytcp@%znW%|-wAFgHw}E`I3nAs)MbU!^;Dm0wb@-|vtP z&A_eCOAgD=E?DekmvMKMXqwOOm<{JIt)I4d!GZ%1l4n@YkNjrYcxH@!X9E4{d`_TlWNX}Yba)#lq3A6t;jD5`x_<=!4mj_kzb{6*QI zoY4L3EbHy`bMuT}RG&J1dg7ERYYKDh-_NXz+M1(z!>;htlBq#SlBSmRR|?DA`rn=B zJhX^E{0r0X=kx0e?B9Qs{<3_29oM_Oyr})>qpn{H)OvFwZq4zoIML&$F72H>x45+Q z=n_tOjzgb5f1VikG}j_wCn5>Nsm6%^tK{d%SoK~0ll9DU9=p1zs9C4Dx|3peR=IAt zyCYC}Dk$%t&R@25{^gd}*Ei<}JuP@(C4zrd}+taKO8OjZ*TmA*dh-1U2|Zf+dggoTA!^UodGB_-TkDDQJ1 z`>=b$yFaWJRd04YD86U>*Ts$Fy|>pX-6czxzWi(3>gsyq!*R8k?%t~wItRqAeEGBR zj=;C;jm;YR`o|ACUu^m?@4Wr`&%4)@>c+;juI@`sPk&vyrue!3i|H2Hff^zwPMtb- z)O-4e=Y4Z;Z1~8(_Yu2E?y5~ks^jJrXmlVKlvAgx%Wyq^|9pL-|5-lQ)$y|aHGlT= zc5VN!pZN3o!rJP^mlWMfSF=Zdw$#^+ih-rej;Yd^B!+6KQW%)qT1Tp(&^{snTBpUaq5OZ*x8)B+hijn zfBiMwQS?+xFXo54z_&BTs}3jG*xFp!8SL(OW7Yid)jsD|dzY1&ndRQp;#h4J-fMMA zyF{b>y{UUl_PqSk%PSI{TUuMW4%PiE?Y+19bk6O6>J43|PMw^*Jmg-_$9XT0-@fg= z^z`prrP3yE*4{i9yZhtoS@%C&oZ|oS)d#^FJF~a1oRkq{YFpp3C8P1cfwZZ&EiElA zYMyBL&9e!WytcrR*`;en%8jV&K|lL1FFifob-J?AOrGj*?=EZCUMu>3&$dU(SS)z? z*#qD0|8$sU*I(bQ?yxp$E6eSmrT3kX>e+8zuQc9hu6mzU-r3o?qvGYHz|0$aQdcJ! zDT<^(C<|nOy^&|nq4PsvTG|3=fMTyY+-r3ckN30v*SBUVOZT~ z-FJ6)FE9Va@cEhXE_TNYu(bfu6@6!x7A|(<$h{jSu&wT~+ur@@e~(Zs5z~9fGJxhA|>1or3Fx}`ysU97-{fGq-?LMr(x?XhdzDbjW zbYk{|1nk(gd*{QO>ANy}pTAOi!#bhR+W8BAqhaCN(tTGiPH=2yx&1$8PsiEl?VWw~ zkDhqWvHSc(x5q{4;AMZim7C<>&#Y_X5sO=|?B37ytoxFx>Qk|QH@567+P!0kL|vV) z&osN>)h~Z8&VPTe>FrVP>5gGf{eAcEt98-m&FjsU6jGA$Dt_*#c5be{{;P`F+jEYt zy%KWqgZ@43fJCemSM5e^7Bkx8~0}+TN{N|yog=y|9;Qp<$kx%o;DF`=S{qN;pz;D zGqa4tpZCXPWl7ont&w_nPjuf@iOP+0dsD7;*uUq|b5Cofr=}+V zI&*V}l&~^~yy+|6E1^->Vk3o@$}7)|>APPSzx=hm*@2+?Xe7oAUeq-`=y}9{& zFI~F)@#h!GCaydW5AMZbu14Eu&9mQC`j*Sx{VTVdw~CO>^5gS`vtv#lNIU!Bwf34d z`jOjY%u9V9{dwLu*KFscscJ%Ta9thaG`-;3gG=*T&0u+9 z*Yt^o*OLsBugR#W#2o*-$417kNaS+b8KJ*USH(2Gf6>s@J^E?t{TDL#%B+={=ljmq zi|{=s0ZL^%KR zYmSUtA#eYka#qog+tnj$U7qPXUG3Sa^lhJHW}XiAFAL0Mh}rW+`_2E?4d-lx{(eu? ziP&*s&PiqMfOu)O-6FSknI=7cv>-sE;Nzv#Jzu}=miTiB+_3uhuMRXp7#JuxX;N^( zmluX_Ztf1hAk4tf#wWMLD8%XJ?f>7!9z7OjVSPPs@9% zYinRgNK5qgpu$I2G~e9WDy`}zEN%by%H$U}7q_1){`}>G!|4eEN7Pk9+TPyXE^j`0 z(uI%pkMB$l&RbaaHtI*gBbLcW!LcmV$s%l5A^%w2M`+Eg&$r*dF8K1JkVncwVB$nU z&<^t}2N_veS$9mF(ZS5l|M2}`cb5B4A3kghRCdp>5qm$g?%3YnW{-r0w4~3Aaz}kfk3_?T3)en;{MP28UOTQ+>zT2fGO;DTcF$GhL{L)xA`f1doPeX?P} z1BQ~Yx4o2-W$m*!r#6J{U*i@MqB4t>rNhb|G!SI({!DG62WZ5oXa0}G)O}M< zKaKeJ)$32`0|mA(@7ph2TdVcj(b95fM|c0>b$6=^f1Y}Ll+CL2jlv5~UvR73bxfQ%`7l*#*c#)7ex;V9&S&(btbZDLrcr+rlocBUoNZ5V@-Y(^}1&D zVzzzzW|-DW+08c${_sp!^{H6cnm=w=$}Oy|A79p#KYaIY>|?t<>AyaH_;6rOr16KB zSI$qI|NqDN0;fZzI&r&vyw4n05#l_y|Np#Gr);*ZSoXYs-udqVw*{8nVfN(7jyb)r z_Sb_G6O)@fXQviff|hWty}d2F*E;Qs#vH5CV|r4DVq#+rb6+i=VOP8@A@ux?9~Ecj z?q_gtJ-lr5WMjD}&sYC>Sd(((_2G-_);?q7g%vhd(mK`UbX#L-_fl%EDmm- zJ7Y%2%+1da1!}dfU$6h<>C+RZP6fSuD{*6uq*_nCyu8n^3k#C%zrWeMqx^l`(||oq zO-yTIx65T;Un?%U-+THw3DZx!&3(FIzAM8#zB2hHZxOIl_wW4)9_~vOC!V^s zHMcv?cK-2y`?VgON-@%j+r{H8uDd2D;nFdopJ!&BpQ!rd=g-7f%YzN7&xtpkQ@Ea# z?5fKmcxe&qzrXeQ8x_~gdT`-H)-%v~O)t#dU;b4#UQloEGxN{Fb54IIy75XUy$Er8?wq4^zC8<|Fvf>-g{R|6V8@2VwBG%8^;a4uU zFJG?y?A$!fS8Fxj&#YsbZF=}oYkXIoapcs^n~j&%m`K|0DmQmNb!M^J^Zt$x1v_@{ zpdkglHX|t$hE$hVb}{mGH5KUDGDYT9pKF7MGQ6`|;Og+V<_@X@0X;Z8Hp0 zoBp`Wjm^l|IP~A1_SV*@ynN; zmYdTa-T3(UN9|v>CCgsLt+FsuVp4A7zijy@XfkM8x1oVy&A(FKNs}gr+O3aYzc2C; z(>2Tcue1y{NQUV|H^uJ$o^W}Z?upZv?anuD-faBq%e&UZ_4|S>MLc-!8UOuZn%R`< zEtdHFo$ZY+m7CA~exxyVQS|n85+8pRn0yGG+j0Ba)hmA#Cwe@1@_2u2$PqFO( zwc*RwFJHbKIrQ`MhO)a=Z|-c3el4R`S65e&{YGN9`b!cle1|ll{R}7 zlk1~2aY69$J_*}bynCg#F)`}~>&>3D^z@on5pLh!-sL`d^5l)Z>G})@jvi&5tnPcI zdd3!A4nDqP+qJ_V91q?9AfRN+wYHg6Utc{0rAKaNb_cDgi!OA?74Ub<9SYPsTK#@c z@3*(NlCGX#J#pH+b+&6A9VJYQTCUxjwG31iKCAKD|MOe*!SAf>tPhVabaq+pdspD( z+30PHYIm1)aPVK2x(;1>;M&su&^~_sfnUAS8`Iz0t?lN&vO1i9{hmKUY=7U&ls;A8 zBtPj=(mKYdxvHw_k1s7fy<_H-mfzn$KX{MBJI4S~SGiE3*(((deR-m;}cL|pvv&6}M6>i#WKe`%`r zPI;Q${a0RU(;vUODseDxel1EpEzr{5e)uSh@aj+VI@Kqi zF8ujP^vLn!kHfO0xVX3IzANa*qOQB;`ZcOQ|#S(CA-(G$zc%X zRk#29VXx=;vy-kHnVXA?>&Lpq)Yudi6$Qrp5m>iw-G|Sgol`0-4jn%HChx~8HLli0 zN&l9e4ll4?ob+^i`_ZEX<;BhI?d(m>O`yDaWqtmg;>?ppH$!w{(?Yi!eY&@|`ozhz zpaVhg>ik=Hwway3;M*Nbm3ux;d3kzVTwD)cz2cIWmv3opQ_?az^x&T7Z+@8rpG38_ zx6glhO;p~$&PHa58EbgCY=A56n7Bsi^ll#BI!(XK-Y4?sEZs&jaC`jDS&W?kh+jaH|jotR{LH)dm zE-o&n9$8sZ_v-Rvo|gSC%QehCR-(PEqvJ%~i>w6-My$__l|Da`0joQ)Z~s4`obNBM zp7zpI1g+uTWMc+8ApfcWXo=tE^7yCQ+S}Q!N;2|~ihvf&3r31bgVxb!b@)baTeM@x zj-u)h+{|b9MM;8WC+a3TO9%=E@)kVJ;@OsSH*DwICr?`9Z0B!J>H;rn*Xdv1*xAvs zYNBJ)28Bp zurM}%e*TvB_Ju3=@83Gv%_ZgfBVnO}M@LScdYg83*2A6Y^EW1St*}b6Q#R5EhZo5A zf`PpUEJ1+-a(2fGw**jFfF%U4a^!$-J^;CPkyIl%j$A+>M0tZE=zb2cmMj(&v)aI( z0BKnzctgMqq#T4znZN-8)`4b8-!(r5!HH^5pFRZz<89EmtJl&nAHj*0nj%~$QZ}8+ z?QCY2nfd(WG092!qFk&hLY+G&hvj~#nkoKT+Qr3`Tl!GPi8NV@5{}d1Yu4PUTNWK& zWAoElds)YcJ$kYGdRAUe3(147_5c~1_v^{+Dbd?M-2HCL=%v>7z7{AK3mf}f{EPox;BEMJmvZO%>)Z|}`zmvV&G ziwg=)tb_)~89hBczR1X%O$IZ4+BQEw7p>{Kt@nC&N5=^pXi%i7Ph7FS%*rEDHnbfg z@xvQ*>w-&~xY#Wz-&rPNEmsT6+@|}@T{}hT_OaKlE-oo@b9Cl+oO$+WsdvQJ)9a_+ zUK_pji1q(}_Mpt+VKXgp8EDVl&dq5LpI==qC@tNt<~u9l$_c>_U%zeyyKs6%O;~4# zhdd}UH*4zXI3*<|J>9l@_H5B$XO|`N(-N0GfBm{yQ{H!5nb8}z_0ugN%E5^f6m>2x zcp?vEC@8X(lom-fPJSvpF;-ho&n+iL=F+806X(z8Um3z>Zfuc1WCR`h{qSMqwY55k4-cJp?AmqU_G#(Fg=-(adzZKEu~hXrqn$FGoSZv~)rG%* z{uB@t!y_&(4yutF8_!<2a{qqHcdvy357L5!CQX_&arW%)O`D8%?AW!y^RXJ}pv#z7 z*Gx|q<}_}d$5%;QmcNT?y`1zAt{KLsB=R+Tr z*8a-;^8U8_^Y7MHc6ytNii$UW?DxH~{lET{Y13BSy?^(v?D{=_l-Rz#&o5y8`m0wO z)NPt$Rm)biGv;xfqHffK)<)(FTVG!;nBwJH`~7C|^9_}+x1D-xx3>y3;PdzW=FbtE zzm*@&eU%!jDh>MCQK3;bA#>QgtuI}!u$9j7@4(va+r}M#sgus_3 zt+yp5Z|uso=99N;ID%MBb%WiMC)Jr&6wwN zrp@a+JA3=1ADzNc@27TmbN~AGviD!@??czGyO-=*T@?}2V_W_G;dxo>!uR)VxBj;9 zTKeMOo#KkOTf;9LxGv66@a0C~n_HWg7tL2}j&oSvC(G;Q9QsV>@R`3nGn!OCz1{d& zeM9m0ccX2xMuXkD)u;T9VKrPqj=jML+)UCg$viR=P*|t*- zZY$ZV^Yibn4f_uMViTNb2r38ECeN;pUuv|<=k9ae=q&tYvu^WRY?+dW>_P73&)YQk{OJ8rS{XJje z`#tLy*S4-+@i=4GwA0hpA6WQeKddyB&KZ7Sx_ZSo~9P6tS zE`4p$ZP&N*e5BrV(Avg?*W2Do{l5_w8WGXqJ9~S=@pG{i@8{MpcK`maN>=|_l+HAr z*tRpf%eTH$pL`m$WK_nkN<@B-Js)T_G3dm~o%Xla&W<~N?TAe3jHUA!lOuKRKYPZt zE^+d)-qLsbD_$DK>?w(SUVi#Xk&Ja6)A7Ff2PPbBHh6Y6FiKkW%|f1SOJApUz8CNQ z$_pyrdlLWd`|jeRbaibsdwajk(K-6hUay%FR{HHu<(V0#?pNjqEO?~*{7R;=OSso+ zFCU*HPx_ZBnCbbw-@)+VvA=z{U7n{W=d(IP`I+VKl|H|V_4$?2beT84Q?1LggTJ*(r59;q6Uj>;vvq?lj2ba~^_Q}f?iojV7*f^N|wr3Vk+H6B{z z1ZuTSTztIX<)#gbecy%^9GjojG(J5&Erjo>(BmJSlRNx97y=BJEJ;8A{Nl=F_KNE2 z#Y>j3Twj0xz&88;N9J13oLVR+CZ7CtefETzmD@LMdZ#gUk$eBU7k5?)*X-FF7#7xc zWVZRn;_G=T%a?>4)792K+;6}3(40tP*X4n0K7A^x+4#Ua=Ew6z3NcC(7u4=9dvRx_ z@+^}~CiUgFG<0-ayiVzYQWhuYb=KeiH)a~onKQ@W&DHQPR{wgB%(kd{Gecobst3oP zzkd~`pPo3ekp1S(n{9LFu>JhWIs;Tj78SETEPZvwvH#t9MH?NSd-vidc&MB>ch1r0 zjHygdpPQp2Bg2CyCxfT%72rucV+p!OL*0LFm}mL<=hX^EN=*Cq*%eH&dUUXveMjA6 zwr}zl4Ogz19Qz_y| zy0f#G9kgd=<70KL{|@zk&(>eqIr-yZg|laGoo|S^c5eGD4G}J#m^~7inTKkwE%8j| zd2yZpprhl5PoJDJBQ-a@OMQ4{rm;nZMwEfe>k}7~LEYLfuYT@Xk$kIIGUwgv)ZX8T zzH9PttdBT z-e1^fo8}ijckvTJ-{;RCKW>gRUZ%JpGkEHGP-6Jk)M`=xu<6$OFJHeNJoEC^W6=1? z-z-Z$c}p!0P-E!f^XJPA=e7lu%g#3EKi2Z`y)tNP!N+s+tlQUztvT}d_jm2XDngvk z&d%*U(ZSLCam&-GW`Thfuj7+1=qNY{%$xq5AusQ%>zrOtUJBf~?fmx_ef7PPYYoqf zVp%nuWp8}d^8TKgEgyx|IjgctGVaR>+f~TF%gf8!AHOgl;rY9}KOPNZ=b*4|6T9b zmv>9Q87E5ww?+PvG?=pV^V`0;yFc8muU~QJ-R0fl_v+urPW`JFx2tF6<(BKe&Q8pK zuvEM~>rDL4ojYf2PguAhaiL=~+mDy~@2~7l=1<+QHb&q34uA57eSyWG26Nkk3m!_F ztmj&l9e5*o*)+_HaY1tXw;vUs+M70P+GI2}PCqm?EiLKqF?-N@$o-uc7rSM}{ycT@ zqM-i%FG~0ReUEPXu=)8pMYU(Mwgm@*#!Ao3HulavDzu_P+cxtNd)DR0PoA{sKRa_x z;`+slg75pQ{ZpCVX@@6&@mj1WS^h5JZ(DEE2K8H84j%gXd5akXgXq+sOS{Dn9e@7u z$!o4wru%i@?mC!orVQqW`A1@f|$Ee=Pg2@{>o8nxN}= z(>85+QGJem@nY8AgolZVKmKg?H!*8s6y-H${{8(p`}=<3mis#EZ&Ep1tx^QJdjdCb0l-E{5m2D5ACIr{5`1!sbKHz(HZ*u69H&+o?p(MRT( zfR5|`U6#w52wEPy}bADg#qQ}e!ULS5>xUui# zgu8d|e7G_>Hsmp1weNGI=cRMze(bq)am4 z{Cc!mQ=a=@!d)-lqbq}#fAMNxzn=eCf3^RHU(V5B#^T z-841bK|K28_E#yXshr!C4;^+rT3lZ2ygtr0aQ!^(Lx-F$ZuigMtCq3-y3vh0*H1@% zKRheq{)V%A{9IDFzJ2s|art7ue($%gYxA^DO$m>={6+28!^7=blMDK5l3U_Hqs^Rb z`wapF%ATExytvmwMTm2k{r5F1YNJi^*9m>U81!Nn3o9Gfw$E}l0;2vshZZTx*of$I zNL&B%-5Yj+sbRtdu@`q&FIUJpfA4Qq?ePX?m<&4*btpPe!ijjm$bvTb_53Ppvfy37LLzv0KvLTlY5<{Ilt) z{w^E1`W551SXezP{aRWyM;D$*@;p?8Z2mr(Ty-?_#)gFnzyJNU+4?)Scce#yt_N!_~##|WhvU{8}znK$~O&sm%FL{fBd3w$*EpT*<>%zJDpG*ub+K~KRc=R zv0?P-*Dfy04zw94ZIb?1R~PmCWx(;Z`!+CzhlMRG+dm`w&`wjUE&0piAN^Y%XB!S$ zop{Iyw377o>(`5`m;Vox+w}~#V)e`Hyt7kgWFNY^eqPn4?t}GBOw6-6!wv>%h;)QU z1^Q2JXjrx)d!b@UVc{XpJJw|edl=VE7F?|u^=Z!PRj(f@-O$sjT2Z!tiAtisq4Rvh za&z;REg6XcG2R=X>3SAu`OSp~kr5#+{Pwe&l->Jh)vVj%{$?jQryu*fLG7Bk+~%#| z^!#kTMQg_imoF=Kga*B|T(nPU+8muflj}6BZavt!RHUou;J4;KHGv=J%$>_?73UgL zSj;~&y6e)09n%yQ-D=}AGO``lH-EYPGUIp4JIl^hekOT&D>GL%y?yY&fw%gVm`qAV zO!3^!kQJPNZ8S`D+~%$`@vIBxovhO>C?eAFqlKmU@$AWKZJ2l6@Y;9v$no3K&Fp&{ z*52M0-UeE+ecILg!Lx77R^_i+E?iqHC?mq6&1|E_z##F?)5S5QzTSTF8P<&RsT+2# zpKkiD-E`x=g}UoI?>WJ^zyXV4|mG-mDa=SikFt~Dk)2@V2RjT{ zBhm6&0yK4Pm9))LF*17h;7aDhn6%1D{tfy6<3YVx22tCvD3koY4I2VnTwN55w1oP~ zEM(3{Jlhv%`m%1rK1Y|3y&DyKIyf8}JD=SRJRTQz!l?DoA*F+5cdd@`UJd?d{OQBO zUy0?{LPAt*(v$CPiB2l2_cby$-kA3GeaFAw8*ZI{T4V_t83+ham?04VrY81O{e?L$ zYmO}IG%P%OHf|nc^@;64D@B6s=Qh2qe|I2%|9aswt3#&xs5$4v$Rs^}v?24e*pA)1 zA3qguUlf1eZc*5u)p}=Y_g2{ZG=Jq)QhJ>X8f3e||9q8|dB5S5=O0#_o3eiKk%K!t z&rX$&G~wO7S?#IG)alc+Zv>lX|LyGT?LNFkax+g>ieR;WmgZkZy~!uP*oCFW@D{(n z!Bkzz_D1!-m4!vZi3g4^e%A22{I8Wz_n+(L{9X02PNE;-6s;~)Of-F%~D1CKJG|t`EmhDK@3X%IW;^_xpuaf_Yezo7N%IZpG+rJ-6&zw4C zl-0U_x7TOgm%F>Bt5#H1aC|z)tSpteX>+m9M3ud3{(Q4`Ozxc>UF$Q;fbs3^tyd+@ zt*xcm`Q#3*-@o?i&iun|ysXYzm-Fwtd2}RJDw~>ye)kJY(m&r|`#f4*UA<*XhT@KO zt*)*XWp6C%qJLW#tuirMvTRx6>ub57`I_!!7pKhth4zbfaA-evC{j{l051c4G9^09 ztFt!y)qDLLetTx7T=^cmzs`BX-6b0vV>`~Am{RFpdDO9Zccn2WsHc)Rzt+e#L|G!h zFtfHIV#bPE=2={yk3H26KcX7snVG4%?pTbm#yZs-r;QWN{|u9zzN_@&?r{H_-)FC9 z+_Q=JaP!>V>YSp8t)}3p&o~Aei}(u3Bde$Bvfftro3|y%>rM3OX^Ks6FQ=cA_!Ao$ zdDCN0Ww5}tLml%>pIus1S$y!@%HZXuZ&u!Jt=E&9Ewfi8M%=84mBmE#?uM@?=AN-$ z^o^UFTQo=BvWlmb%}1*C)tAgE)26+WJsh<6s$q8G`S`>0 zX32Ji?LW0-(}oKH2VXTEJ$m%Umde#}$F;Pz58t|f{k7=vDMzLxe*468qiA0!_C<1_ z69pY3;^w_Qr=6}-9Is!!M;_#ZiDsbD(9MByo^Rs9rcDi6G<*B@>8A=dY<+F^;;*fB z`P*abv+EAK2iqN8eb_zW`MSHyycWfN`0~Nwxt}a+;_AA%wMLnn^lsj~d1H&~4UbF9 z%k>vuPUq{DHg(E)eXVK3S84NCe{Elz=WY2>pty2z!K#4T@LnGupCd=Tr@Op;{pL;2 zKCkZ|`p?e(`pS39tLaxgy#23h_Z~A?!n1jL`hjVm-`=hMZjf~*!e_1-^ZoxHltD|o zXL=PceHpYmO!wfnD_+{0qMCNDpKg1H|C)JLTy1m535l!Q!yH_~p1*pebmQEPxrz~* zC$I5H+C*%qeexnu#-hTbEH~m%0%O|fN zE8o~x^mWyXtIVJiQW7o-?d>x!Ig#MF-k{Z~@n-S<0}~e?-*QY_Tl;W*{SVIicQ;mE z|Jak7A(^IszG3aNXwVX{kdw2yTA5bY#pznr9h+;tW9~#nj_eBuuBW`*Z2D|p+_wVz zi2Ez#zV?0=*GqWxr2oS&>BSogJ_dw}skBNGG)k9t*=1#r+T_z8Z@+&XQpFz< zyYbwtTQ07k(ynR4`mmZ_+1+I?-+Y`fZC>B`<>v+d6!LOrHm*3~v3beWX|3DxdY{j$ zbraZ@db@1RpYz+T-j{}jnJqg%r+2lXVbh1e#rGWU?ke@27ZzOk>ZD$Vq|zMetdE!0 zZ}`8S+3K_3m;3D-6CNrRtNANGm2+IWbZNxCPttP_=j5fQJlLFhnN@p!=fj5&8@K;| zuj?2Q87a9hW{X7da^K^flhq6V|EpzisI0Vncjx4hced3Z-|hH#V_z~m18DkjZxI0CukxEdR?nxRx6b!IedgX!a*h)8jwT&jW9i|sqwjZRC1^F|va>T%FBdxrP5fJQWiPkj#6-{%O(PYSkDQ!S6RW?! zJ$`nHN=eRrIftWJo?El8A8Hp?kIueFg_VKfOnf9&gD09(V9nC#b*t(s23|NjM;WnPL{zjNul_ZMY7PoBK7?XSP%kE7nx3qM{;1r1-jR#xu3W#1xvtpD)c z-QU01g*!_Gx7|E!oN)SQS;GIi8{6~uCv@DtmU|mCy)(Uy&(X!jA|^JLF=Wc+nKR1^ zpS_9vvoX`SXi60mul%=Fo|n_Q&(!YC`CGSPU*i9-y|KH?S5Nr~TlzG$r?cZolCy;1 z%&Q#_4;$n@({YS&I#jBnViULa-ORjL-MKowHa0c}>DPE_tiBdMc`hE(rmhlm{L#|W zF1770N(X;@zaJbqb*)-qY3b27;N?7-JIdb|E(Tp;8}@gT)atsG5@E^{J+|!ona18dKd)hooceRYx}(RsX6e{2apnH=`~SU78O{<6drZr8)*U^@ z*|tDMO)cr!o1FzyydJ)O&0Se(xoOj;kY_u&a<1_RAKTy0uU5O_y5WD*G?SRvmTw_Ia+&&86L5%CjsbquOqsHcnXm^V-#`qL-J|b-grBe_S`!Rrb-N z$A;zqm>3-PR;?>2D>~Nvr)KK0!|rZ->}1~F3j1$=5mrEK$OkVF5*Czfc2@2@u?DnQ zZ?SvtmNKI+LO0e(is}CmI?KfLrSJ8dH$9s2zHa^R?w*}s^!w6^L}#7YFRHg(GUe7S zT+6tie*eB1hPj}9w`V8XY|gm8P50TknY`uY<$E8swzejHJM*%jY}22eRn^sr&$g`0 zx~wz#bfL8}^URquwR(dS6Bo`fFE@*ci4A%5QfZ=x!JDn&8-JW;<>2PNy0bnYKtZg| zGCs9pnkp#8fc=Pd_tHzb-OtD57+ODYy2v0 zo^<|Rt%kPt;I)YFLZ4G3R=Z<=;!ANb0#%$i~n<@j2NgOP4O*u|wkAIlm9z zKf51p<6SdXXKhN6rC$8LrXN2l?s)k+J0>#9s0cxitvuV@EGQ_)XKsFbb;9jg1lFcp zU6m9c0XoCtpW~sguTPxW)7{Q5f9U8^y_%XD0XeZQv%o;J>yO_aY-YEpekUW8ucl~j zF3!rzT2NZr+TYKA$jMnyR5J0a$^Sp6vvO{2+FJB`a=*RP_2u(7o!Ho`d-%;m$qiR) zRtIQkJ>%I`!@AvAD~z=!B8I2j+`OWqLcv0V!+%Ss)8Ah@-He~(^`rO8ugSl$y!!h) zMRjxWe|2?cdp-CBZ<>Rb0!)mZ`T1zg9IM)0Mb!tziv9V_ZRNj6O$g(>eLut z7u(#@@_K5bP$x_6?=NPRR-jcKD}EJS*ydsdI!ALQi&^%vO9iD59w?rfXU#ve{C!qW z`TKjeI#HWMqPOJAGGU61PPm7PQ1hYqV2_|I;UdVqLNDbuo=TnMr@s7#SnJJgvF1Hv0Oc zlj@)eck8fq0S-YiD&ZCu1uZIqf`XB5d3k!v&dz9E@+77Ck@?r}$KOO6KY08$_ZDbr zj9}o_u(&wBlZTadI-P=ee8HhbN`Lm{*>3y4llhm=Q^_oS9(-vSL-= zlOjtMe(qGRl_6Pgw+MjN$V{13#BE*v{@BIj;}hr4UtcB<+UgBjr+j&}I1|&XD2rCm zl7W!e6Hkjgy0}ug+#xAKR8xd2B_&1S^SfA^njZo}oy;+@F&7p%GXMBd(foNPC_*M~ zOfiyFab->Aa(8!!gb{eP$cda&DMl7AjP=<;$peHZ#s+CTIFN=|X!1^kp&IN-kZj=B zX24fE!Knk6{VG9>pivf zxx`cQa4+37e!5K$9J*i=1Gg^OtJw1y5e%ja?_4`7hj5Q>=37BF1|zdJuyRl$o;&$u zidNz(-o&gjNT4VwDQ!}JWmOI87($(~O0?BUah1gnzuq5usA zef{e{b{=apaQJ*A3G9CmvCSE=RD2$Qx03+?lOk zv&QGSNqm&_A%+EOwp>X;oH%RL9wewNU24`cRa+#+5$?2{X+CPgTVE_b*Jj`l(=7$@ zoS@)D(~jKTLRSSq*=J@hlJD;g#!Gw`|DP;{XYrTW8r&I#pnrjQf>SqHb3}LJB+o zO^gZWPV@}&^2~iZE1#2rf#HDks;zN`nc`;ytM8=gdbcviXZ zsXIvP2c~D0`+o8rp536V%#3<`!Iv+I?E(#?8A<5$|o=6L*}vIvs4tbk(Sfcby`XAd0eF z+7I8Az8LEqQ6y9O`**f6`#PC&->X{kLu{+RZA?nRxQN zgjqM(%li52N+-UZAg?QS=v-Uk37hlY`XH}1NY8v`dDuW_Z_iWbh)Fz;XBhcHCA77d zrpO#$I(_03N2iES5%F9gH{Cb4yYb<2*-O?Mle5K9?|;5N-oGYn_0s7eqYlWw*qbhK zynVOE$3(S5=d#xR{9RD7Lm#BC;s5s&xz8UuMSS|~b~5PHC2x?oA9Q*QQFet-1dCO}Vvj5=g=R%z4kJWLB+YDEl^P>58q>5@j}Pss8?JXYI%XiplBA zD*Y-a>Q4CobSZb>d)vnr%cc~~6ewO{2TH|(@BbPxemlkZ=FL*)8{)rO`q^dHmiGb&&fQaLnfvu#uwQs>-nG{`+oOX))*pzr@UK7ndCsq< z=k>KmqgyxhXJxNknxdmR`|L9d&1X7>AUCvrQ7N5ge6~1it+#%9;VJ(~QQ28*BYTt0 zZs(TW&NZ8T_R?ukF#J&7dd+9~OZ_^bLv}Atrn(etjY{1cm%jOCO7SmVP|$W{tv!A> zf9tZX-@=~P{pC}9WB=uz{^X?e*+og=keZtC_qJ=dK0e=`emSn*kK=b+{cI`kzQ#8~C;iSxuH9ty z_w671`SGAAiwl2m`}apdXXN~NYxec`qModK{hR%M)>O`&tG1j2g}AMmZdTma0*6h+y)7t31 z@kpC$r|mY0-EJFO6W%B3cg8OM;cb!>a8O8E>jtB0(*hCE#-+Ni5B>Y+&~tI_O|#wB zo4;4~)NwpNvr~Wi+?~evcRru9C;yqA7C!?614G7>StccnAXb1pOCpF?X;R=}U|?u) z5oiI4PvB@W00|2@3a~K*^nd!K^hqh~pSr&Or%zHl6c`#^f!rpYvT)_jl}>(80)X#k9PIk>SeLPgDOt3oZB^ey{xhlH1VjdsU9^AOG5){?_cT3jj&QOq>4w?%X8%JA3+F)(dXS65J*4*T@1& zRwkeR?Ut$kS>E0KRP_hnf|k32)3z5K{QbVX!lYb`fq}uJZK}2Zx+w0we|E>KYm0lj z2uz#4z3ArpPoG2s<(?kW2l?XSr%#_2*_>Lur{-w+|NV{JtJHg~IDWs6e|4%Rm;sbf zKE$uyG->MO=TiUAI`ZWW`uNFtNDXS33{X7{d=S`Ti+kkeg>eb&Xr2(LZPQ(&^ET zGo%lKqJ5K7T-=kGu*uPoR_V`P=AGs*FfH8{lrbBQsm;FDaDE;*(=xo80HzU{ z_p5wMBsa+K4QwYmUfFYOwpIZd!aG55rW7a08??-8PH&qx?AgOJ1(ePhGE)?qR@DlG z#l`*B0y#lpE{{vVR_;S72_W8+j$5pWX|7BR3=9*Lb*6y=9U~_P{8c!^^b@Rl!7KJe zu@j&WQ(&jaBZ^=b`KN+Rb$C0){g;k*t-!SD(@#c$L>8QT;`&SH^c4>f2V4R&FgPrp zm{+s}63lMOcb|AbVij6QEhzLfv=4$5V~-~#)upgHM(k2O3evA&9xBkXG&%?r8w^F0 zS55>8;wWvUmdfXIYJ!Ws1%balPMZKJgr(NY-x0gEWYK+49&2!W$iBVRbma?kQ1~v` zXlM#f(`eC+2x45Dy0g_hmfU@IqZpqe1H z|5Jxr;zUr&Wsusv2hJ8cfEviSlI17qT?`BjyEavPd=#-E!EuUi{JjfHpS1kB8rHqY z%=O};%I-EjR)z(B9ETVh+){t_NPhhHTmIM-|Np|?({yrQ6cq)1es(tL@7HVnc6+N` zm-o$;+9ku#&~x&4+Pg)c+Vq$h7HpfQtKB>C|Mz;sx0_$`#(FK@^zYZ}qx+h__x$;D zReF~QLqn8s3nPPN{>e+K9}hV9AGscXKKDhC)Y87Uw~s5f%gFeKi?=Z{>^z(Flfl7H zTl=?}T-B3&rwvvn+2`g|Jh`~vv_z7DVXGPkGegm>+4=qb`uqQ^T6j9+i{1aEv_0Sd z{pO8jV{ljt^1z&L$99-Y?`kqS}8XBW02^|sP zkmQ7x>|mKi>4`b0d0{$r`t!c~{v>A>CQ#`7exw7Kfgm zc5!F%@-{tYh6Tr15*Zx)ZtwaZ#vALDl(YM6Lz^BW!-6n~@TU0r8Ta?aI#0j&V(sOf z!C&59-o5ZN1H%eYkeQdmqIK=tWGWKY?0hB#%E(tY*8a9A_#Y3+fYZL8z2o|nHt-|wxHT)lo@mGg8ahJfrQ1BL~GGtFwN_WZr} z<447*DQ$YH%X2qa=@Xv0x3_hM=|+R? zlvD?o=n8^3D!8H3&IQ#EL$G;1>TGBNq<>Fp!u<=Z3|FRV{+}uI`_1nBQ{ST9?#S5x zzIp!DMkR*2oJUJM3lB81FUk2HHMeqS&AH;8-#R*Ozu#e-x8vinDQ_R&ud<$HmK)VC z%Ba#0tB=ZC7$pOvqNL($zlNTfXREz$mbLjby;vz#@9A!n)qEF4CVtk)2@}Zey5;u# z+}uU6yURBIdbQfT55-|xGHg>MRvU$bCYePZ?cy<+O~N`ho6 zuLOSl_xpW%PK?6tDO0B&t^Iy?`li~Cla78oALxHQ*_DAorB{Jx#g$2_-bqI~1Pfmz zwjW!)es5U%@tGgawMZ1bP&7hG-+sQt=j&0lI78(M>iHcJT&F4 ztaVwBns1HxWE0=nVgI%*-mqYUoE9U4!b+Az2e07ezTK1k?JSqonyq!~kFS2abG{uYMX@zn=5TwzpCj z*WaJ^@!ReErEfN;{$C49T?~`l1lU4ed_Hf#K8$1AV?OI6=j*?HzESbGcX9D^zrc_y z&wg9ig{_GYJbIKn>Dro`hN-8fR6N}p{&;5kyv|LVHf>4nlm4C-Q*qI?@Z|^Z#S0c> z=Kl9^5VLstWb&gEi~HAo_<4W*{b?I->+Lpk2xVYUX;t9)(b>u^e(YuXyuhUbZzeRi zADN)&yvV&@PV=`(<|UO|TQa3{Z*A%AHNR)^?N;`BkV%gpy36p`=0v$zwZlf{PgbP!RGIM%JtPQCfV24G-|Uj zEHD&qVf?>%&mNm~dw#w8@!>H4Pyfa9eSH&^<^6A`-_G6Ex&PnOc~b2O_E(ns-{0}M@AhKv>3W&JV{6}D z-I#Q=D@vaKgj{QD>&0EA*@_Yj3}4*@*lP0sHT^97YI=Ri+s$9E{eApu^}4=oxz|tJ zDBNBCT5fuLS>>(L1NUk^udR4GHQcDohk=1%lDhy~&HIV&@|`n{)0gGEzp^rzNBY}y ztDA50KgaETG{fr}9{zo-1!!N9s~kQ^6t$3cv5}-m75#=2>vgJ1x z`elO>oJ`q?#LV9|_GLbEuYo$wk5jLEC`{9jm+QCv7jetZUA8i0?-iqr3k!C9`}I0# zoBj7Un?LSO?q5AUs&2)O9TwAcB4w5?z3=wqRF{pU!@9X_J%Z$xRx1djI}?UB6*N_8*)V*mH|E>?HjUEKV)86v=_awPRPM_@$qr;pBB!K7v1ImF7bDCynG{N^4X--y4!nn zx8E`P_4V!aiwhPT?#~NRkv>=H`?Too%z(H!xyknbEbdjkUMpdq7qjR0z1@c8@9xb1 zl6`+)ZO*2T$1ZNq-~ZzB^75Q*FViN@kKZpZx%uTRRujJ_1BJKJuRA(wzu#OwPb)HW z_uFm0k}a+-K65Nqp0nGs_xr!!h41&)_on~*y58&ex!LCW^QvC0ta!C@xsphN6ywNZ|~o2S@wBTH=nmv&;6ad{a)C6#~a7x{revK+bE{~o?QRm z{g~Yaz36Q^Z#SN^`1_@&WTH+a6b>>Ru<)l|zG7VqNOjlA$ zdfaQ))y!{YQFc3bd&b2@u4}WUjMIGX6g=+LynTHC*RrY3w=Cn&c~;Baum8Sx{vF+^ z+~+@@xBIR0Ztwej6*W&D2Zn`B+xGs>&f?@ZH#QoUy}8lR@#22{YKu=Di<2H~yZ!I{ z{J&4@|68}kTkSbyxNhgKS97=yJv;N$NUrY5!-^LV+mkOYYR&wu7ab-gtk%=dDSYhs z+wwbdcXyZeALh5$`6jogTtrOl+OBEGe(VaIm}B+)>eSO)(+_P*U26EPb>qha%=|}M z%GE+{)t{SVX_$U)j>PXn+=7A||NVM>T#=o>)AswF&F9|lJ9R8u?1Dw4GEawie3fQu zbX{HDm-UbNYwfq)T(q93JwbG)VX|9H_1{v%iubjTK*jCT)6>&8 z1W83zR#yJW{<1&mgI#m-iwg@w|2YIs?3}E2v{gJ_gq`2gVqW#Xof`W3=M$EeX5ZYD zdjG$b_`JvW>wf3nsXcGI@&3QxN0s~Sf-*V6CKf)v*K=R?|89%FXN;4+@xQyJ6E~xZ z_e2b+w)nBX{*Udqd*$z@8x`25ml|?eecQzJ&H4R^W_sW7@&-7==*Grk{oU{48rl-&QaO8#rM;=)#6F>XM zJyU``vp^~GV|%cF@596G#~&T-Ha5$PjS_8ndZ@VOU=wTMt(VJ>nqH5aJh9NdUrx4N zwyvV)!$EdI!N5HV+vnd`RXv?_yVFLro*T+RQVMcwb)_m3s_FO8QsJ_+^w zhMdUEnDW10L2-IbE9BQg|K)X3`>p?#7yjinzoN0k|EMW<2FEftr$fHJ8`I8c)&Bmn za=ugDg5=|Ug-=Dpm*t#);|WDLpzha(95{ya1Oi0JfK zxwTQL-_>|dPn-JeNO8@*J^7EO1p9Y?e0=|$L+XFi>Thc-e%(lZ{OxvLH|yu;=_PM| zg+xV3IqSnWxy6pipSRYJ zt9g0UO7ef7_4|(X&(HNPd_FgP^;S3Kn9U7s%Ak0*Dvi4Jjko&Sn)yz33ikH)W%qNp zTiKuc!6^(%&nq`uFZ@^aK0bN(Tef3n%-dFelsIqyzvj=wE5WP3&S+{{c5$Qg@`$KS zCU2X**?)Vrdi}Ad)8pk1xAAV~j^&HmRgyWUFzjyKf{3S2r^okwK4)*gZr`g_5w%~h zzW!5T`t{rG{G;>#+32jE|5#O3wea5sZX>y-wVN_79zAZNo|$E8e6RBTT?xxiom*xLxVZfJd$RsW10!?N z`n})0Zs-4gyS@MGwRro~-=X2LGr#@evHkxizw|){doLQxBfm4 z>uWPMCO_Ku`(3wkzm3u4`ko%E&u^}rpPy6F=k9W+?zn8|zT)Hu2O2m2J-@wQ&bA8F zk4yUc=Z}V7oWSSj`W^ktYlP0*eD-OzW(ZdoIIr5;+Pd-cIqTzQ(fPvJYxjn2(bVc% z#_F4Va?(=6>}zL!d|2H7=;d-FN~Q&ThzU&WuV+0W>% z_5IIN{f#e|%|4p9`(4!Hs@Tm9Z7QI|YO4KLdSBVwTUUcsZzjIq%XWO@aXIO`yGp%p zrazxs);HPD#`0KCrJdgHN1wKoNBLBwJMH=V?Z=Dz`>Uk+rcBZ4?$+O_^0wr}wYAa5 zJ=N!l{C>MTUPMeRxNLdP zG~MWBZ!WJ6U;pB&_Sa=>M~`wp@;}_RH0OTucUzyp6AS$9eyX_LDJs5YSN&$A`<$v% znin@FAAMNXEvCE3`S&+a+rr|@1?R{2e!uUP&flZ?c7}4Eq@eZNEx{#kZ*4uc_4@Xl z%073O9{K-ecj}J6o%-!|-tM=LrcADvm(Jf)c*?GsjkoJ@pQYKo%I|Y`d|W1-d}oLG z>RA7E85j4s&MA1rx$(Z;?`1WzH}{0Ezfn3p_HoO7S^58ep4&g}(q7+l)H`Us@Rp2= zhjx5gwffPo*XxSib66pTuQ|(!qIigq_Nrp7ZwpH?M8Wy?rFd z_U^ve-8QCJMzVrF~wPm*c_Mb~?K0IV! z`8xN$-M^ymwuL7qC~7)ykk7uf#PiLz*Xs(e&nP1u&tl$hMhcpy4!B=?;~%w-;;YjuQ+dO z_9@oCzj7s&9Vi6@9pw4Hw-_%$}Y9{)xQ1& zlI$O^-G0wYde!si&yPUy#&Z~EJ<*SlutNeO~VysY}oyZ=?aK7QeI+p@Qx|I9GFdMh#W zXqRZ={o0lHBgDkSj&;m-JJKed7xC1vent9u-p5S~UuM^RyZNeq!}3HCaq;8#|Nr|w z7$@C+f z$L9;MvR;jzU}bM_&u9B&!j4a$v{!xIk+c2qH|rz4*W=~qT8IC?wdEk2^pOr}cbD&Z zcQ1e2{dt}BqCI=|w27M8L58MYMQmGRqPPFir!BSX_B`s6TD$kwvK78DW;GQ#Q_}X{ zsD8g&Kke+S$ft&}n;UWzIGS0swY9q^O`0_2t>=tg*A`WFOB6otxKXjVH_PT&pY=P5 z+TY*2Z`!4wo3o|--rpPQ^L;u&`7ZT$;c=PS-+VJe-+bwwd+FMrL*4oni)SdS`OTSP z)?!(5V&PT3pt_6;3mm}-?6$amq|E!h|Lb~>ug|{uL#Dr@;={uBOWWS>eqUGkBe6X^ z`;7eU+V6KCZ?O-_-`tzCHLt()vH$d#nANel*Q2t}?kM^3Vaxe;^ZPa0c0Uxp-reCj z30&{4U$=aIrIniBtSOuR-bn82om+lu=ds7zb9cMVDZf{#dHeLKQ%P4=q_47>mn}Ad zmnCsR0;tV*>swRPD&L)_Q`gC{gH@P|6&VPA%IlETo)xGEQm;b+cE2;Zzc5Tn!`mOc1zV+Mx+i~sq z3hkReWaiuae7wba=~m4w;pKlHPI+&>cSUdf|6kWHE?eQd_IPH-^gk~rW!x_7jp_## zZWf=mzZ5?$_xH_v6{E7OI}Fq|M_)&cI_Oyy}y^-bxD6B z?0@9b)6=U>rosG_dit{e)00QqH{@);zwdWy%AB*8bY$cM_r~6yrWY$^yQ|#)XTI;U z%8-=FzL(b58*P>fmd&u}7Ss2-z3v6p+ zFE3k~WB+r>VCPcQv27Xye_UOnPvKei)+@gy5H}DpKe^W==-y+`wuTtoLhBD z-pDHM_&3={4S)GNe#=)ZIP}f3_}P&sCnqOwK5KURMPacgc=TcKE;rlBRbEN2udRJ7 z-prQzCSq?@uH4$_?S4CR4q3n77rfNhHU^w^n1x=a+uznpP8Jmvb#-*S9IH#{-gf>KU#15 zHthd#)bHXl-&e7*lUFR0ZeFtat=a8mJZ4HtYJPKOyim}Ye!f!gdYtUhqenm9DPHOP zbuT-A-!$Fmv^N#4t*jd_`&l19F|j}V#=mpB-yfUM9K8PQ)-F)ekovzzy+I@_JLs=$ z=OxeY54UdF@`(RD@5)VgKd;(#kDYh*ru=RBJHJjll2FoOd&HO=Zp9KZ2-%Z%L`(W71+uQw5ZQFid zE`F&YG*nJZD9N8RJ$#d#^pz`Yuh+|i(%((H!b?jmeohHadUa*x*YFVKsh!U&QfCLK z{M1|WD?7HoxN_anwtN%=rHG5X1ZV7 zcON=*=*11guT1Atu2tCvv9rq8ehHj1Wy%$(pKfRU&v@jndHY&y`Q4t}9UqER;R zjRk>)Iy!L@r^DB*_^|OPx7d~9tyiWVtmf_8sJ}-b`FNl2&E;#>=)BwaeBO@V^Qsr+ z->=*F+0WW_{=L1)&AetlyOpJ8nr2^HGbML+{ypvF?%%;X*WKN*h7Tp}@t>{d(7vBVOVyrLV8;{l~TN((dT4=i=_i zzulBP^<-6y-Se9v)tQ-@w^lZTTJ+3(HVfjielA?KPrmRhlhiB)9-%dvm%ljP`1AAg ztCd2llAfKJ`SHYkxn6g<%8(yN{Yze4FwEQibeqNFHO9$@T2|>s$!z?@e0fFS;-o7p z0tE#@OD810bUSXmyNx;dwC?tPoF+@UG6s*Mb{^MHzMacHt8Wq`x453y&1-8aKUb}3X=?gXK5>fP>R;_utJJ2SuQa>5Z;grd z`ODj{-ch`5%AKJhcDlXg^)A2ZQ*yh-bbFS1PrsII`scZZ^+6^}YUzBt@}WM1{V$k!j|{k*>a(Uagh`QP#%R!jUmazaBha$2L-WKioQbN=zE zcMF};L`B4w7q}cUajlN7P}yDN05#4`o`ktTi(W>`J;3# zKL2mksy6vqrrBw83NCqqhMYrI)+Z(=etESu^2>{jd224OEZ&lFQ;CavwyR^JqshtB zzdipi_4aAK80A9g=}yt3X-wEq8bdrW?9s{|W z4+ky&|M|T5yVzdih+Ly5p&xAiEc_%Q9UWkPO8Ia5H?M!YRy2as(eEy|A5jlyv0hPk zlu(JeUV6>*wq5eE=S>^fHdK6kWbt}Vu{Q6)sO@>O?J_nhY&;SIpwVBG^~bKPnk3{H zAyo4AmZ_h`zZQ#cGm?`Z9qIgdOgjIF_y2$2zjO14Ute-^^5YGM`TL8{TblDp8ZEh0 z(EcA(yNjKTKJrMlTRW$mJ@0SSE|tGO-DnS|8F*DehudM|M=bR_bW?2-k9ufr^#pa;6TRZWx2MYu6m&C z7Pq&`b$#64M=uul_x=3*{OA$S$&VNF+xL{;t5rYNTWy@`5IoUaf49jry+|Q<`PvfM zu)9A*wrYA+&Jz!P{3p0tbt+5$>huTBw*R%k2`cX9#zeWW9o%QYJmL0F>?GD6 zj_-Ka_Bwg**K6If<##r&JDqD{Rq|p+QS+o$?ylE6XQf2%vH08m;@aA%tHG)#C!T(8 zGdoLvP0HR)tw($F(=)H@C`{Iw#?N_uZ}j(!`+8r)E+-$ekw1F$>+gp-x6{dV*RJ8xa-aToU>|g>FR5s z(qzip`15~v-OI|Sduy!bUF@ZIZ+i`{R1lQh0`ztkyh%Jk{S z+2!kIY^v?n-L~RV(~~&!ReHhC_b8?$znz`8$@A1U(3Hvb`15OzXKiZE77GZyS-F+* z)zt<@=0&BiuWbKf|Mg0+VfD8)RV$y)&VP1{TYuk#O?zv1mrbpka3*zXuIRlP|KITH z)_?tCU03`2?e?!Bp5H7}PAF!UD@dEaI}2(Y$!VX8othi)sf@SWZE@8ypP53&X=glc z?mKx*Iy_Tmy>#gGmBsf2Hf{XYYwj!C;_9;J`@P*DV+zkQX(ey0QHa`_BU;TbC-ePo zeSPa&&=A&tX8vQ6%a{Le(-n^U_gy>l`te(t%jYWD@Bg^3q}Dh;?$$Rm*PGV4D%VBL zw0&;x(>Q%iByv-VXH4;1Q_b7#dDaHW+)UykCcS&>cBbE{`kgDfO+Rjv#j~^X#bs}8 zKY!w*)aI|(qV;cyZ0-EX{Ve>(zdN7LA5(O0yHXr_Gxy>mS4sKLXT6s7fYY!Ti=#?U;h7Q zQ_$sQzRAZOn;&(myM^5VO)45bwGU4E`!#6&|KQl-=XH}eZj?Gy`~AN7?)Uquj~$EN zS5x`t^Zfrlx6?2Ct`f_6a_hBQXzFLn^**2$=<9D0=4SUY7SEWG6nj-XzRD0Z`djtw z&W3r~t7l}3P4M;UWr56dc>O-Mam^Z?JgLIqx%&j`A08Edbl4=jV9ox2zc&7S7JcRB z$IXtHo4!OZs<(W;x<~f)`tSctlao!^ve#}6yY;Pe^5y(T0kZ4&{K{H;{KWb5{k`U1 zd*klS&fgpPI{8mPx7f;ZjqZ+&sFNaw|FSReSue@;|Gw14*JjeQ!|8ez@Be;Jet782 z-N>(>_Q&^?U-pr{UDz(W>QAfly1jWJp=R?xpL$aC_Ugpx)5U+k+Z}()Zu^}o@40*P zSLbN9%Y&k+Q-SBly@~EJGq=@VF+RWKui1LDXXodOUyrHI1x==bjg7)wKZSe${~j{G+$;-v6un>;FeozrDhE z>T$oloUppznG+kA`OTG5{{OzSr|0T~cRN1!_4EWsMM;(4t@XcUclG8>bMbidRa(*K zD?>rv+j#oiZWl+#%TwN-xBVYu^E2et+!ficKy8=3-|wos^-6`VJ-#!I@um}K!W%R* zwYbkpD|i0G>3sdm=hs;+J{}7iN7(b?(G0uVs#A8-IU5|`Tx!TSd+nXN{S#=Sv*u^& z+jm^E4H9eS)PB1;^;>jc+~*CeHW>WfWqI`IO-tS4)pgO!a%LMQyYV&HDW=W#xsBKRrEtx$eQuoXckyrJkO))y^+yOU6YdKD!?e zw$!%88JIjfyZY{wW1wXVKb_mJW%c9~ez*Oe^5j><@BZ&whgZ3&_3JsCAFuy@SNimH{qn`3#;G07_^+`)yn0M%8$>VP_*!! zd{kIa(A(rSlk&tbb#!R{|LNa*e4Tgn*ZW$zzdHn#AFW=$Z{5WkOP4M!{L6d&cr(9k z$l~MSDW~hA-L9{T4c^vY^=#&j-|u!W-m_;<*zupYlk2-V-}`vn-1m5aY?f)A&|Bk* z`x!Skg`NV>d$)?m#yoD_-`(B)cuw(oU+bmX*Z+L{^Ev5?@%bx1KKk4JOu19$ezZG% z{ioaa|ENW6_4@lgXktwD-4%T~w$DQ+p57XMe1f9$rF)4{F)=dga|)dH1fRa%1oF|F zjmIBtG4}gE-?#VOuGi}<-hR2f>WlHaS*$7CjuId2ySlm_U9#t2Z&I@B(<$x8{LAM` z1uyqod$AC-f<=Gtmmrz4ABi9Dd_KSQZS{!>iXS)6|GUQR_({{BKYwog{@`Hd@1EL+ ztroA}Y)<|*$1+sz`{wg@-Jl8Bb3Y&N+*on)k(O=R%S*G^6J@PRJZ}H{pv<5C^xD(t z@As{uO#Jt*JF(^bvZFu6=g7y`+is6~>^IlS)X)0wmmR<7eF@H4wR*vVOqu#S?=OAZ z`L6BtSInrWDVq^5H>2Lf2#KYv)wo zlfV2ey87+br2ov{)|bWZ{I)Al_GZ<&)k@Q|*Y|-Y-p|?np0lMEG+B3CwmQb<#|3B8 zUEk{de!a8f!J_U*i@f#L6{Noh6|!B^i>pZd zQ?%Z8wXN@y(^)LJ_ScqrU*A&S79Llr`mg5Y2d?rEP>s?1zG>y!MT-_$JZNCP^sVyg z)bK~!-T#=m^-4|scKGU}qur0UUXSkwO*h6>^MegOe0ANH*XwqJ=D0j>KL^dAF!S4K z$W_1DsP#7K``hjJk7cjlFXk>^UBa`!q~g{-XFe;7sxL1B*UpN3`JkDvPgm7cEor!O`$j z=fuqVdE$C85}>6_?sBCmcPg*Xo!VD@O)}ke_9C;Z>(oKTsP^r1m8DOL-iB^{eQx)W zgY2?Xww-^Z+MWDk>EXvOlKVTS$Jg!jYP|90=H^H5s^4|i)^E)}H8)Q=Y+tzbs}o;d zpQ(#qoh>$jRqFey%MQJ7_x*miG2`N*9Y6f1hur$U@wi;~ak*-pPoF<84qty3)SB)M z(~Um%YPEUqQdRHdlao|G{(Nqn^yrA^)hOvzpz-BZ+UwSo%!*CEyzcI;kH07TulsWL zPI!E+toi+#;yX2;&k71&+?sv;#f62nplKJ&&FR;xY-dVdy(9Rlor{}0=|Z3N5&L;H zMyc~BD$DnS@V~#?yGpIr3NKB)e{6dExz2v|dLd9wmoZB5=RQh0$Rbh{Z3i-mlyYJ z&0b&Cz7|z{_Qd&kTQU7Ok2J2(&NE%7em%}SO9>Y3pvFP^oI1A}!{W3(e?Fbg z{Ovcxz^>2!V@m`mPyc>f-obnAzQVPr?6Vpg8XcD|U5eOJQFvyCo$|ff_j4u8*L|8R zv%BoA)ZupC)g{x9g+j;1f~+1iFfVfL7Bl>EXklnoaYR^{n6O%p|LzSrp?)PZu%sTPT26&isAzLd!nw*O!-><}yDv%9h_TOglSAaw~gZq(B9OaCI;`DBy7y@@nkp=TXadNs80m}L5rocSh|MW?QBTy>-7^V!FHivLSg zR#uwIDT~LOUpm=ZJkLw-dYp7?Yir@r)al1}*8fSKTDNcCuUD@t-fTRcReEM!?CxV{ zmEByX>&346YH?j>!NQqRoJ+PIm#aP!TYgXU^*4|G4Rva7x1Zlv_}SOo^?2XhS8r$B zRI|6Y*W34Ekym-ds+G3i?-=X-{rurZQujU0-#T%dEYi-bsM_!?Ir{ti_{UrC8g0xD z$(5-%z_{`JgT1d)-k7=Of+pq8{@7I>owKjb=g*g~xB1?0SaW0k z;?&dAKtrR;-~PYoE}UJn=4x29?m5fXZ!+$$`&It+YT5A>w@!gZ`Oe$hf4luYTvE1t z@jTnd=d9oN)cxJolXiAiYRQ|9sq#Mmiq6L;_1k_s@#Ds7(EQ)W1GV4X_t!;VyJ`o6koj>7&2w9{H@iCf}c-)p4@Nyt>bpyUfspz#USm5 zkB&(%j@`Z0*eGt@zPvvXdUHR^pMHAFcxmP5XNB)}K0g*39w++t_V)FYlX)y(JlOH~ z+U-Tr+w-9ez*JhVt#v}b{o_F`rG3mUXb91f3Ul;Pqwz#gDlU8(*Rs6_N@z{{ptP{DpxgWPY?(eUDw^QBh z*Sk69+8SqEX4-GO7L|Prv~pzo-KyxN+#AD>tIf_4GLI>*jj2336_k@wa$^2vuU@;Y z>-YP;_Ix%U4n*}{-W&aW$G2J8kD5NWyM2Ck);J{ga76Xm|7?=X+wYpmReg9Eb-#4$ zvsu~4RK??ErpH!Af>!+GdjFB%`D@ol=bdHe>NTckpI@?P&z>8(*JB@VbeHcH_O~%i z&R)y+Vt?tMr|+sC?fHDJd(omrJw2cWb1c~{j8`{-W(Ggl^Y;t;TNuuh{#?`Z@A`|1 z?|aKv+xji{oBK$-ne8ZOUBrQFx35&lu2MO1`gC_}**#UZJZpnvJ(9xxcHbhVUQg84 z$dKCoepmII`Ui}new;T-Ci`AqCvQ>)9zG6S`|iT+C;xBme!oFu-Cq6&_m`Rn&I)qT z5piUFqx(%P*;B{xn2B#srupAzYUW43%$reld9j*QvdOj^)vh9MxI6?`nsrTKowjXH z{f|v=a+1q$-i^HR{&{7MT>1>-^i!7U=l-QV^9d387x9t3F8-r**x#Sa&mCMMZEDi- zJ1a%m+S>ZeEKBaiZhgm|>CWC*_t&cVSo*7LTeZ{9%;>aMyU$nupW)#Bm@|J;j(5A6H&>V>ALBE(h<(rA+FAYyORn9?V_5rnhI!W6+j)F( zarY`7Z9HyReojWlqJ-o2_T0l4e^fAEf7p6*`~AL?lhu{Y)UM^2Yge9CQu3Z8BJO!~ z|64zowYR>$HlI+a$y`~v^Tg@X&Y7N?OQwphSiQD+_HOArckeuW_ppzlzMiF=&n+N8 zpsBg}tdU&b+8tG2xh74TJaO{e=0Dou0by}$Gkw^^)6*+TKR5*xq_?!TDQan5%CdXU z$Dq1Y)uQ&5Ns!($1$}+~piEX78JP#K9yR&>`}acTj%1>(lc1bj;?#o|+uGQkJb9vE zsmeNiv)CBc5&|6u&N+5)aJzeWbX+Yt^7_@Q zf|o&Rn~FD0m_EBb`}+EYPEn0rr@U_5yuC1XcUi{!mz?Lz=DiTQ#G1G;an16u1u;>5 z+~Rr)%8!MLHf;_J3aeVZZugD@o9C)GF)<4Y2{o-);j#9yR$5wG(y!QC^SgfjTt45h zN&@|Srv{9IgIQr=2%C@U!`WgR{@*M9led^x$dXTGIcDk&)` zWgl^n5EK*)ln#xJZI0c&wf=AEgNA=H!R;L#9XVXgi7qZKE=pQ@dQM46iz2VpK6p?U zv%fC(^?mm{W`}fs3JD4dMryMi0@>;k6d2eT9#<>sZ~t58+`P;GxE33pTKe?IzjpZ& zJ>!B04wIjGBDqD#F*jHD-tPysGPYGBL7A5Gs$OZz*w0ItRC@YpQO)PC<|j^^xUlQY zkHW_n*G8L9e&X)p;&LU*K)?-TMj|gS?~iA<^EXs}PCL41(j_6AZ%2|N{$9_za`md@ z-gmopS=D@gyFFs-FaNoxZGRm2>-O9ctlbc*J^R|agO^fIUwL-@>eYvPzu!N8`Mh1T zar$|QJ@-yWMpisLD*o}azWwW%ykA=~U);uB zL>woo1YVK)XIUA1P<$lihZ$z||a5lOq1x7DhvxY}}(xeU9-}Q3t?AUm7`AMtN zHyu~&|FPQJ-xqt!3<`E=@K59@dwZ`{Jgz42{nOf-8UayJ*7ba{3F;f2Q$t1d(qrAK zs&?IbT~Jtf(BJ+~L*3tB(wk3$VrH!zG=^?&F6WP{ep?z65;ntDKRsQ&=HJcd61G`e zZhi*E@}@8uWl+NLPu-K0EFsYmUmtr)0h9!8+Smz#0$0Uorcc{f zX|sfvn^Jd_y`(~)!MlRx-!^YYn$4=vfeSvXJHj%hou ze4nCon}UVK4X0>tP-Im>~JvUh(=^bRp2{ni#K^jJ_0F^Ludlm<1B2X-dby-Ui;v#ZQCbw%nyYD=6uDu|+}-8LKR?|Uz5MuC@6koA{T(}8 zU6$zY1Lb%hR*_`K9>D^XJ`rGhJNPvfU2KIZWr;o8 zA)O_Q7BK~_4EeBr;lhPSU$0%WN@Pv&&yO)mO4(DVO>2DgDCyvyUAwI2*cFE@(N$8) zs=YBSNO>BolG5LgS3S5ZpY0S^nCiv)d0s`0pj*Gx)kRHP*`oFlSXk+qoJ;Cj5 zpkfo$MtPg8;G@DVW}`AAZgZI~7Z;byEh%tWtE9AOTYsa$L>^hA5Cgr4(o){K|9|-f zw?j2{tjK+w@Kb5!^y`Ta4}bnRKRm8AMvt9AWsb*@lfla`?2ota&iBuZ)YMB)dw6PV z_KFn~4&6H^mzS6K;r$g(MMcFApI#+=%-xh`G?OPXGV;Xf)9yRB$b9`;w4-{*;^y?~ zlGoRG=USDvxF}^-+FiYR;^et~Q~h^}m~J&KC@pN9K3#lQONnDZg2J0OXN1r1tNN;C zq?fvA!v=w`U%!6%@S$P*c5x-8Ll^ID-W&PJMAdtG=FXVDFFia@o<3W+Xp>Ohx^*1< z{O;5B4xY_RuZm*x^70CZieq!HX5X>>v%`XVhF#_F`O?#ui{(e>=IUNDHY!-WfZ^%V zrz_U2Y}?&#ZDV_D=3bddr|5O+(=_Cd39R-x`Lrlz*PPBbYjUPcn|jbMiT!-pTLGCn zlCitXS|?9_+25}Ec}vJ{)nh-6xAo?5dcR%1^;)p=#{A1=w{wysv*S0Ie$9RbYA|0? zee&$t!YzAv%7i#?Rc>)En4VB#{L$3q%&yeTq_^45&dfzcMHA;u?3;8c=*I1vhp%53 z7krrb;>O0s=eC4~8ZBA2OzHnA(U7n(t!?HuHa+p>qKwRmN-Ni{buB0`Smrys$#=Gy z_A~w1Z_-t+t_P1EJ*sqj;;dO+zO%PKxU%wcMn=YkT`>_667OczShw-WE!i4)^6cru zmr_rQUY<8^Ud6wg>0fT~tqkc>jj!W;>N~@@+Du9L>+f05mif*ue0C@D=$9`mgD-B+ zUlW(fJ8}B_cHQW0igy1bQm$T&n*RF5^Y)XI^N+s>T>RkKv#b=m+k*1)>y72@?d^MH zjin~5`8Dj`z5Cwle)~GmKw6lO|GruwHeMMHh8+cpoU5;|ajmM_b?wXF-(L^k-JHHK zdiy%5|8@WVu&%kkBhc{e!)J}+aTV8A@O{bO|F>_=9GRnE)<_y(*j=u__VnycKH8Vd z&O9lyj@QH=!Z-cDa(NX=wI5K0ZDPn+%0z z{`1?`DJq`LTfFMdotT^(U-nlPioH2b=u zxp{c!}{$ga6sNxyjf5q#8+1`@fCpH^0n@4hd;lzwe*e%FN8OdePzG?K>8K?68*VpK1K=(A~}HFTXzCzHOVB zcG#LD=k8X2xuv!;r0c7+S<>%svK2WO7fV=`bR2ui#l?Nq%4wC!-@W1MHF{64lDquu zoa5qcLH;HiU49z0?L0Nb$oIJPj;m!gf6s2;QT2A#xi6xkqBk~`N`HHEx81d0@5qNl z=e0)usn7DZOLdn1>&aA(J|y&;Ga}x0Ye;m~>so2wsNzV0#}$&NgGzTVjrnKqQ1k3e zWX<=#{2IEKYlN2uJ~mBxzmK`%(MNZ~iVF(OpN!M*X01CP9u#!xjp-)Kwl9)LbKGCO ze*N*Y{{E!@jm=h<=h>8UojiH6;_1`rBF+k_>CY2RPLF?dYwK&P%kylj`NZ|(j&Ps1 zZNG6tV(+%8QOj~|q;GOvy?Tv_Atp9K)?e}Z_-}i0b z^yN#*o_#-ZQ&zcrWjt{4qToiuLtV2c6$P&UI?uA&FZW)ju=-c8>c78A9R+k06c`x) z{i|Af)jc(p_1^yv%6p~bQqA-39I$@BuYdFNE8qQt?cUcW#MlL8TH3{bQvDaV|K5Ww zyeTX{!k^p`x$M%VOCP@NelL0D=CqS3KYq>5XZ4ScPM$X{Yx@zK z`nGKobrVzh=k8#t6#S^T^kJ%G~T|kQy2~HR99J za5mZMjjyMvcJ5uj|Ie;9Hx(ilYu#M?sp@kY=cmt~H~u)geHL$%>8f?>4vNRu-hITN z{IcD@rPJl7=gdZC_67C->ntiii8MruPmQ0hclgouc;laQ7u~uQRrBTK^Q^h)@$vCJ zver@$7bd>Au+TOu`*lE6RM(X&CNdTk0_NUcBB#BUKK=1z^Z5@Cf4^V7mrF=mTKUD7 zdHV|(mEGkl87dl!6MWFX(^(!}`p_u}~b5kJ^}96ouGQ*^56iF4;1?_6Ab;?yZIo&9BR zt#<6#k@QM-GViVPEiEoF9$rB{?5u1_e|{8leE8n(Zp}Ys`c!3IUD@jI@0}wfcPhO7 zZvU_4#EE$yK70^3v;Xb3hZa)xK8CeVP6VErYkYixk!<;w6$w>G3chYid1tiNH!Di& z(W92z;&O6*3l1<`xpwu@tEt&d?%Q6!e!cO@>GfCk@kxt_w0H`uDX6GO+`D&g#k!S_ ziHV9rLVgcCV&*&$eD#-|Psz$k>Tt=On=w1HM9;1KW06_&#ZJpe=-$111qB=2Gb1ha zQezJ7WBz?r@4|ka*fu@ISOGb)W!E=un6fRxUn+7{jfC?WqtLLhw)6Xc1bvuNSW;rb z#`~gw!2$;hOUwIK=Ob@gl&JW<4Q&lw9e()qX>MirSNqsHCoWgLt-JBu{DrwG-jPZ6 zYj@6*YO0;R?QWX%={d(&t40OyS2H&ke|>Ge_?;tf@2(bSYp2h9i5$R{r&u_ zQbIk>?`X-ry-oYxJElC_m*20?GCi@UCbDpDaY4a>9fpf9ZqJXesIFeTY#ZCm>3Ye> z*UjBg^mLWdS|7E;^Xvb$iqEURw&1PGVNhFk=P3z=&+=6Q&(FsP#3%#@={@@J(4t4m z^w5%@|F(wxt^I#AGYQ|@p&8F zh<*L1Zuq93o9F86+k~8Em*Zz7%ahLDuTTE`Y;D(1Q&ZC)AD_p6_%=H~q zz-C{DVpCJom1+H*eaE(}3@)%yWVHXkNhD}x$j9wdwf{S~R7f0ha{hYn{IR}%7o~$u zKlu|6{V2?0TwV9~SJJP!!5d3n7RlHNEuRq|7}&_n&X@G+ie}T(#lOEawzsz@-R|n@ znlNwT!tbj^T#p{zF=5J@8F}wtt}M(kD4w2~JEi`?*SFH$?C)kTFI(qz+Dr7meeEwE zz4&uNe`^2zVK4lBq%-TQ@{Z#4FTK4-*F+kB_&G_R#eUlL{2ME_Hcy!~YgO6x;u8-X zD@q<7{_r6~{S33i`?$avX1QG3^6vIcT^*+R@7je64WaexjzxF3KK;6{^82HGmEX0N zndjVTxmv$A(8qtC3FqhM-17@emx7b)q8f?AcT&Bk@4s$(cP}pw&ws(xyPwG zhPMrpkI43h|JlEIzWltZPlZRdi%umaFEXsX74qhOJ;Ukxctws0|Gr#4&%w`q)pARZ zD!4Utaj~1^mFLFW&TEueUy@+q=HNJ>{lAj)-@mym_5B?D$7cj8e|-7;&}{Bg{u5YP zSROo`9v4y_YN=x)ve>=IVP_DtMy>|nrD+f4~}@8+3$KNt6&Gk2~*`njAlv#rAo?Ct)|IJW!dspdaZ zr%hATw~v2bHrKj7?qfZFe_4|}|8oDimu80PO@I96=CUt-etsPM=4bED12szTZ3;EW ze{;jI;@{77lQNO1+aLa`{A^IY>_bi5o(jQCDY^OQ&z=pn)(0ikN7v)8-Z)@B$wNiL zsKVf0S8eL^D`fVD-n(xvBffmw zn#GHi-FW2nW|aTg@o&BRD!VlMq$eB}797dnr)gY1D`{LM5?A$+wfDK#&u*_%Ph}X| z_+*<-PF8!#BlP>%j|cblZS-$UzjG%hX8*dMg0Gp``MH-RCoTH;#@K&#so2z;H*Y51 z+M-!eaj@p#pD9zi(`sFB2jp&@XR-;@@-dyVa>4|?isx(1P1%-A`7C4k$!yQJTlK8* zsgpy)li%LjzgElNdt3Cif`4Cfm7@;@{mxwb^@_lo+bgoYbGK>E05y1|ZW$!Au(Cb6 zTYm4F1WR^GdU|`|<71EZum9tIVgK4mCt1u>Ln4Fk8kuL`3^z9~-}CX;>MX|%Ztvc` ztN682JuyFj{WtUQaPvJMZ`E(@yZ-#mo0jA9(H!FG=?DLGuWZ|2D+AyIu->(`pz{AHedOQ#~F{KNyt85V_2_g*gdo!zu9wl#j|&E<(XlNta1=3X{= zatZ&s+D}(rF5B|=SJHuoWnaW6O$v+*U1^$IR>rsF(z1j^pOP(6&Pi){Xa5tFS)X@z z*Q19&`CtCcy1ypU_`>4d1qDAUmWH!#eJU&<(6D@71yf&NU)57#5s{Ace_!E zv#R&*!kily6svf@= zYkTX%gTLR4pRq3a(eYp^>qb!jIFi=FrmQM`Be&=Il==ntuNH`dt3Q zGwJoo4-a#j+zXxLq4ML=XaA2s)8!v;bQe#0XIp$><>Y79;j=tcgnEJ`&#&LP+){Vx zT0|Tz^V#S8`iJwa9$9NP$HvB{%2m0o5tUJ!?rv)PobDl=spI`_x#_iF=MDLbqqFlj z`yPxrep=$%g*M6LPj4p++==|YL2s2>kM#0yTLS+Cer4EfdR4c0^R(L1f`S0=^}gTb zVp%Vjm6cWP|8-~W>{st)R!&nr86v^4*=TQ-Ytj<0#eZL4N^Ls$wYTu0lhCWzuSG8h z22SMQ;<_@?>GU^OPWfg%P0dhg4HF#`o^^V9T`xb2>n+$8_W9fDdoy2N)#kEQuIAEP zlV0NTHdNlX|J`Nx?|d&_9%@xN*x&WwL4u2G=D#`X^)6nlHTXVn_s93*^NvqCZ+CR} z`#q{Zs)HsO%x9>tUu-|K`uCB}rk9t~{TJ`r<#zg#Q(awMR-;<1jI8X#*UB=x9WKW@ zbhxmYYhepY!HPdcSN{tc@7Z*R`^16QAALbU>Id`kSE$}$cw|Jj_ zu!o9J3E!)pjmgIoj>VS0+MC;JwYuaE&&wOLgQM50H>93wH$0*joP4~`%);N=+PY`H zL7c(+FEfq9CN5ukTi5VBxRDl-WxsaoyjR_|(syq;&Au!2%qH%b&~K@fp2FngQgeGQk2;(1rWo3lrPhrl$8!We0MJ- zFDv`?gsDsKSA-w?BM^L!n;~lpi*@^|JDi=?Rcme@Sog|8c-3nLo#0qZ{vo4e`noW{Z3rE`||Sqzi-n#IX4v-T`+aAQ1fzgYkQ!r z{g<8NxLS7SotTFSv)b+`8oT)Qec1Db44PIE_D8J$|WyPuc+A9m}CB$sAXpUKRfjvT+{AZ)o&7i>Wm0a z$^GU2!L#fx9#S~@vsnBJQ=;d|Lmv-rVGZk9_^YdPBcq4&=ggPFxs3n*1=LN5x_|u3 z+c#%_7rb~eQCXzX;K8-)%3J5IPu5!R+9zY^^tfo6-sM##wRe4I|Kzu8I3&$#vHFu& zzNe?=w>LLe|8Utcd9v`X^7nl!PRx5DD%!eYg~#G|O;4XaefVbPW{cu)GV9`Yx6L-s zU$k$ZTv=IJL1}60`t|%)?5qompP%dKdc(=i{`Yw2MwRH5>eKY(k8Mbq`RS|izPnpD zZ+3Ry?{{MVB@;QHOi$0vjRwWfL8<=a=X4+GOs!{k&R+}g-nG2@*iu$jmT~`{u&V0Pu1Zx^bJj+K?3K~e61;zVJxWkG<8|}q&4&-$pFiHe ze($;&CYK1s53p?8@2ssI>9NkH--oE;MH`e=##L zd2nLlvg=B7=ghfK-|$O3g5mV^%;18eqC=9_-;$8B0?)Jv)BepnP7^*67@|z88)O{mwl5b&KVj+cUzl z^|;siW@jFbs^WclVPCU?z_KddjZ=5A-nh1JlEsZ*Q5)ag-Tkod`;SLoFle zwb@#TdU~`+jw{6SAU8&Fnc`^ZSGf|mYq9xaO~^*_;2@n1(Pl9FU=!7eM;ol+}{vrICsjNH5@H> z_e3^%&-7(}q0N3`)+KjsCeS(-i}_P}7B=Ve`pud(OD!U-wBh8mAltZSzlz#duU_r> zIk49B*wLdqU0)k7eYl-Bl;seE!oM4aTODS+%AUA=WsPI#Oo`N6Q*3N)4NFhS&aisQ zcOu2;$+M@5=IY`%EiFB~{f|FA9hoJ&W6Ktknm;d>S7d*b?n>CP>B<(9nlC5SvzSZT zzrASO_cuvUM1sS-yxio3bU>`GbKpncn7vi3nkU64&Yr$}n_YII_tzy8EkP{?o#3lg zHV2oUK08V1;1;{&(iztN-rJ*dxB3RCUaO1pw!JF;+w9rpTc@0|FW$OkP#o`^voi1I zrG1kuBsew~f%-Nt8reTQy?$TgS?--L{B69_T@TL9efVHWyuz8|$Jv*9&F7iswN&kX zSm?rq3kymM9jCqtJ6!zjP2`>O_c06yTDiqVPJ5~dZS_CMynUb2%O_8k>|ieWcE-|G z;f+(!q=cIpQw>i>ojQHmyI@aOSC`DNA3lB)v|+k?sfH`$*!-6dZr*!QIx{LK zXUzf|8Gnx>hxzpzx<9Ywo*1JizDMllLg(r)*FHv;8=l&-bH|Py3OXhti3@$1OTCu{ z$=FKu@4vp*Ju~uhUEIDot+Bhyl7D^4Y$`qRwCK-|%lb{{7KOL-Rs4$o@3cN{;@Lds z#6-n!Z><|jrOjp}^!uEi_Nr5D8EEEiw~wfpsN__>9i^X_xIATdwYHu2#iV@Rw4Cin z?CPf_>HgLXvo&S;Z8q(q)G4Rz1l`ix0%`l(ZUo%jw6s>WFyjA;juu5{Hf}bt>8GDY zY^$-9l9GC`;`t3GM@Pq|%&YqBGn<>6n;&$}fAdD>=;Ykx=S^z2DjRK5x3RIg0xsj! zcD?l6IC;6BmYk`5@wYWebp_AQsa0=XGV#^NQzuVe+>~;<-6^acHVgDz*J@TzAKi`dL>eCO|r4EF(`b*QuFKN z@htIwb9aAVp*w%xyuLqwY7Xw1{{Qo&xVf$mt}QruN`B1-wQV8(Us5xE8noR=)zUUT z{bI}Yb+OL1wR;oh*ex7-<%=^vfbj@pf=1*I(ye;9ro6WT_u_)&3b+>PAc_LNx zHS6r)7Q>HX2yFa?ZCVgGaCgg|bk0X=SeRuWV zI&zF7zIOMFD#6myQj5}EniH<>&yQdG^7k>by`Lh&!urmfIjy0kb!e(~xaep0FYogY z>F!hA(*7Y-^yz`Qil8>)?AfbJ*K~X^c*yWy-G8o;mOR6W)90NN6Bi~$DNS4uy?veA z`tvev{PJ2e?8@Hkc=Z3H*MIhghlg8EuM%4A6CL&Y+q{ZD8(o_!TU%SR%4IKy>V2@S z{$}#y&-2Kas{^)$`SUEyhXjZ6XCbfCUbEu^nvK02%NSnVGIja*W#tS|pGfHUpGdFl z8~(-M4w155wkG#l$LtliS6$Li<(Rk2q~()u9m9)jYghj=J<|4Sn(kZe&gRAqVM+!D z494$v1slBoK2&oITU7C>kM7IAgJ0It=>Tf+4ek_?gqsq|5BZaGC}@J3}zms#ko``Kz@A*H|P+X_1$ zhKTUHS()?K@BDIY%la#3h62~ReCArQ{`)sq@Gt2vunwf{#f{haMQD`syQuXWiQku%cfX*~yTXXllbl}XqZElJw7Y#Cen z`MIt^MMkHlST!zo@69TUO`4jS{N(BL$19i5Kgup&*K88*&^#XU!T6{_+!?J zSK(o@Z(7!So?f+zC#t^4t7}2t%foT0(s^Ri+x&lJz5aSc=;>jJq$!%A(&jlP6*6m$ z)6XlKnuZ$W|Ja}y1|Hzgwy2+$uo670#PKcHXR+>-)@uv4ZcCIl%W;aFndsj-*Q!+N z<;#~%m9y3xfPvVdhDPQqcIm69)j8N7{eM|MRY7s% z%g{+TW@PM*=Qq6)GWGG)0wqD~@^{y){~l~^pE%{pmoKyS?zLs(lUcCs&Xf+t)hQoV9*Q&WGud>;Sx-H&^FBAe#d z{c|eu)8?f3S!^dGJN zd-i|9g9iuGE>jWf(%vPU$t(KTWA$@chRp`i$ZRFdE&q3Qo@g0N4|6l z`e^SDTWKS)egb{@7BVhZbD?cg+3Qe=Im6aA)V{2YdertNTCd zxRm_F(D34ikKe9kgHo>Z&D*z=-$*CA` zHO0mMV2P_M>omRSYj0l9+gVvz@qO=iR(Y)p;Ry>qn6}O~_uf$Zn{VsW6r-89Y@D|~ zg%lTtr>3YK7Z&<(_4@qw|Ud%kKcB`=ib-H!SMauUiWONjjzJIf7cva zl7IRwN2mXOf4)hfl@I>?F8K9DvbjFSOGU`$On(!QVXn`dU8U)Ku1@;?EN&%;<>S{hedcOFuuq8UHUZS3SMG*qwjJu3el=5eL>D zKd^XFRhH*f6&o87y>sU#godyFyVgJdb1m<&bLaT{?LJz>)&Au@xba`|)%hLW)?Ftj zt1D_53EA1%P4H0Bm_F@sQJUB{d5ezZ3T-~Jl)b;F`(up>Lywf@p%)1&m-a}R3QgBf zXJmNw`Zep^S%F^b{mk6g80Ge?3|{u&!9nMy-3MNq51l_&6VA^=027*eisy7pOC7Y%n?$Ntf|of@0X=suUvRzyJ7FP0I@Z( z**S-m4jrC2YZ@DaMdc@vdDRc^&#GpEw6yH#?mm96_V(t=hzsYmaR^9_wLQGF6W!3|NriTE&KNEt9Uwf`iFbf z@?2I9pfwLiyT!jowYw-Coa}G6?)z#rK0dw|*Ui}q-5;}lu6A{OS;~F}w5nm_#w^(l z6DH_2HC{ifsG%XC|M$0R&7YIYo2)-X-n{waU;F$oQSGZ&OUKpxvz*&(v@QRA=k>T+ z$@lxdH$GSwkeH|#wkD!ev??$Ef8E~=A11bcjft{xX5+mUQ5QRB?nVFO;V!0vi+!XQ z*H-)g`F-^H$BXLoIp-O9dhYC)G9~)<%ZCpc)z#HKmIgUi27f!i{9Rcq==1W!;&wLj z>-Fn`FP!x7_Xiyx!o$wa{^RGbMeFv-f!a#4>o>?Ptaxzn_l6&5w|~8-uCA_rW|pP! z>1qGfX4Jp?!+P*XtDxXA$>ZyFuM2xm;ZKg(<)b;{$GRZHdVY9!Lmn&>cOuLKpQot6J|PNL`Pty>chxAQxvoS%2&$N9Az<(CF&URxL2 zzBT*$%eis$vpXb8S1+x#OTN7QX<5sWqv6WYD?1+_=Vn`I?h?@-u;=%;XpRrx%`Mh~ z0b91TKVK}>UW$?QLpU>MetE;Ooz7#!adN_OU^O6@A78aD2 z8dlUMP037dX>Wi0cDoq2UDZM#t*MK4?1)Hizj^Q=Blk1=mX+l`*LMB$n``xOsd)T_ zABUH$TgMl^KGxaMu`w#$aGAgSpYQwsH+FA+c)ae?5l#u?T|fJ!XLv=gQ-7u>e@tMp zkLjvOCqG=7?4R(Y<2H|<_0ztS6`wvH=aFl;HK{Uc(Osd>erLIVBh1ux^&h;QxJJ%) z*W<_h_6PdrT5l}9{Vi?3#Bzl zdIpfTvqE>{&rbAE0WH;gH`h8mJ3TtGqQU~CWKG1*ptqVnp`dZfp55;b9pQWon#VbG zNNMir?A!Z}i`jN{ba1SR-p|O&%9?e$V#n-n!dG*5&YQ8jM&j_L)K!6@siJe{%mD@S zg82LUBDVh0KbqZrtK}=l(L2@e1Erf!M}6MnvRn1q&&?)~36bOt`Io_U|K@Ag+B{W+ z?$}m~{rd8*HMIWU(u&Za*&8+(oZ0F898D`JHEVKImM?kmtM|3W&PcAvQd6rf-(A}IWH0QE zHvjVS^6eLIbu=}Pp1iz#!t}}Ak7k<(hDNfM^Oyhl^;1!6llmg1#Sh-(?Ao1Nv{UA1 z___zjdZoKINeKxt>96NgJMA0_O}Pf?GjHuHUjAU}%fiRUk}e){7rFfP>({R9eV^7n zS-fcx)3`E6+#iwLxSAzCQ zP26GOCIQ|-A}A`j0j;bq^z7(Z_>`KPBJI(qYFQ?x5++t_U(VgCo4RpT|5EncMb@tO4c?j5eP za_{dHK0W>ax*2ljc{*acH7-YVm6W_U?-Q^UoG4~#xijL=HR~0tR*6&xLsp=#5Cv_* zi)uY}imT?|QE{Fo!NA!ek)fQGd+)5Nw6L^1c=F`QHI<-9h_q%q)UhJeqQrvl`np*0 zGtxF00`GPeTQxN`1?aDL{x?Fl}Z2SKW^C|w~*ttVAjuG&^9Y2rA1+&Jx-gd zN=r*moIELdX7}rJ)>E4jTwGjqH<$mfdvkBEyP<8)2?3w^cD^7#`bLCzu2>36r>nz* zqO@jA^HAa7d#7{hntgkAV1E=xofDPXM>rW+GIs-ZSKm-pBmGrE#4Q$SI%Ev@*$@`@9wUJpdD#H zFU?!COUm-*&F!Bwr!QKzjcuKt-iJ@0oTg9Ea z3d+g#>BTnj#$CUx%X3+uPgO_w3y(ASl@PZQfhoZD*IJF5NL_W~=t~ zbqg0caaCJa@7THX;QnCsmX?+Sr&l+h{KVu_-NU08HZ!9;=V?ULt~Jx9O;xhhWmZ*H z)zH;%Uc8t2&h1Kt3-%0mcbB(s-aOg!)5Z{Mo-KbQqBhlTDv9QZST{GH8&tN=o7gDL z%BrES>t5<>ddK$8!RuPZ1r^4%*E zoSk|3=!(V9QdVwK4ZFKBiyOBW?@g~}X=hpNzWtq=_3~-!%6WNtPnj52pUxj2AMeuA zzA*WCpVj5C(32Bp&FTW}?~ROHnQ{Ek;lp44WprC^X}!NRrIM#*t6=5N${U+fr5`=+ zcMOYNTe`Eau5O0S&$1plQ?9(cwtCxFVRpnWyx$qq2U=|QcGp)8Jw34{oLoGICY`sx zm~G2Y@X$#pY<*<+moFu2Z(rOWZx5>Pc9p(f^?loFFJIrI%g#m@yt6z0_`@>JBRQ$gC-DFwquZtALYyBC6`wzN`0(KerJ`b@59{yO>d)Bz;v#6m@cOJ{cfMx-ZR@qDf7p~1 zwKML8v)=T_cfZ>UoT>i!GyUPii++zkT?+`4mXZRkxVydWy-QZss%uYWWMm8~E;#ti zx8sd;-ct8|mdg9KCVIl`+1b5EQ*8|ZBg*$A-e=GWP~ea%IKuU`E1 ztE%SvVSWw0eJf{(i%NFxPCtLCI$BCf>ceII{f};K&F-qSyLYeR(Z}Nn`T6T-r1PeF zui2H{`OQ~v`r`)+58v38Yh6@ayj9P<-~hv&%I796t!+#@N_9=yi?4^WFZ~n~5z)ab z{r})WXZFD8=;ei#>-l62l8?pCFsO@Jy~|8ZMJ?&SxKZS|;M%9%Q`QJGC$5dj&DFiO=CAbsoO_F| ze=_Id`f&Tb_J-Qyet%xCR2LAG%bQli#l`jE`mC)tcIC3mMStnIXTQzc%Zo*PyJ9o@ z;%(db?*DslEfc(pL29$y&X~Tb^=l4Y%e_6@xBk-=%{g|(Y~6CP9fpf%?{CnWd@?2C z-)*ip_5}{>pI*Lv`D196)wb5whbz_Pf_MK|VRY3nOS5=dXVW34t$uy0p8d<~d3SfW zqVeZV3!G<9n9#8?`MAWMbw3s#XSppQBeTYoBW>lc(xom=DgjovVY;u+v?uWRMV{Q zi(R>PE$L|2)Ehgi`{Pb~FAV}s9)ivsNbZ(9dSRjSEZ@a1Wf&dOo~449>aP-ca{;uk zEqYtt;dy(1Z+LOBRl+W3McnOG`pN4}_g1;S^hsW6ws)ydtoz%yZw<@7MC|z-ce!`f zlP4lBE-nhY{PXvIx>5f@;oIBW`ZK;?dt}byXy9-MTGEs)UceAv`<2&7FE*>}<`H4_ z2^Ei6mif2n)>8FoYlH7z|oO<7Y@ zvfqB&i3RQ4M|PN9yMF!g^Z2@>|CrfJm)Tan5}7o4^2bxB^%tg}pU2Sf=8cTb&rjYl zyUSwJZ*5LL|M1b#?uv&yp9@G!Uv0l^4OuPrzWJO{44fchOFKa-ujcoYE-yRl_B7LT z?NVR!aM`z4wS_J(^A$Yv`{D8V0g;gx-&ApTcYXN%zMkXR**S&cO3Kx*w#H7=h)%jD z>%Ar4(sJjI_p9??h_VEKJ8wVxRGmfQlTgFrhc4l?mc1t{Qjf)`>y5)tO+bF<=yw=Rd(~M z1q+YlCF}m3-F>Frzh!IC)~%&Ko@`e2@Z6~}!!`c0_9&cHf`F(dU}2AZazJ|bu+4tr!;>vHr3@VEOcl6eCY6D zK@o|DTf3rS_7?d*U%a7LNJywqQPa~ zuC70luf~HGY+G&5e!1!CidCyZe7?W9Cu^L3=0f&-ozQJZR#{KWxSw}V=U}yb4a3Ti z8TSq!W>$8;)7H^Z09t>)a3SN-qenrbZqDtGMV{;Ez0;5hnRh2!chjcL6DLeqF{7-w z`1p;Div>k*3eS6M8>qPU$k*4`1hE-o)1b~`}W`nSd{ zH*(i3tuLNf>Dkr2zSJ_`xdf3dybEJut|KRQ0-pR9O&5~O4^LKvEy*;4@ z`_s?QtN4A^++A$u4_akfy?%Qmw@jmT!m5uf4Hn~ohCf3jLmwx%xr-rId(~Ipp?EZ-5 zv;2;Hxn+KH7j4^PGg}1%+_czU%v&`?)8cAc&it)Xd^`rku zm%X{ObcUSeBQu+?PlU5hNB)Ya`+fJjMa_?nq+btNKO1H)de=AGXlG1c_4{fEgZJ(4 z|1IBYtQHn&Tlh%D?r%+J!o5E~`5%4j6yC}g6dw`Na(;S^;)?}r?Cg&>``cZb)vtOh zF<92wd#nGnGu}OA_oPx%Vh&~J>xB7i&wt-JzwSqzJJ-T1S3-2^UdtZbqu9*;@M0@} zw(NUzJ9DKRlV-ue_%HnVGlV^v5SAF8)#a zGUy;bw|IJb&99foUu3j3&P3ZaV85cg%5Yu(u?;S=XHT62T?gCv>({dD&;S2Eb-JUs z^V*Johut52c>8}}u#dH+<-^7N_byl6IieALEuj3&&3&~$KB`+3KUB(%)Y?K z3O7&5MHdwiTLKKV}l zhXwa;N5sZ9JGZw!O+7Q?V%F)Kr#4Do~iMYs%n6{3N*&lwb=Dy0NwQm0BZMXA|p4Q*55pi+rx_xr{|NWYM?zxF+bmrx= zUwho#TprBJEa(2T@6W63gX|YydwHM!@V5LA|7`v{_3Qm?H?B8My}PL`{dmaR+aDjR zPiacH{BB-Xq_KQ}Gz)XXx3{++U#u+7edNtz$i^qr@ciH3o?}-H*!d(Hb{5NtJ-K@A z>cbzM!dc%o{Mmi+@L}Q4@s*yb0z4USul_ia+^==^C_BTucXBiSf9lS9u9kiMoM`d$ zGi|dEZMbnp=kD@l7mm!j6;WLCOzCp6!Wp);k-Pmi?DBYiZem5jGv-C=W%G`TUJ#Z>tV&mAbHB-tEd(PRg;c%Jk0vrfc2x3v=F1UV7Upc-!Z14r-GX zofADyI&V(vTDM)zRptzhAvxA^-fn z{Vazo)-N4_Ze>ZNC@aIRvbRl) z%q`lN-`?2gy*$}xwpr+h-nskKdgS%1ZvWU3v112Ed`s8q$8q72k)2m+f3sEwzu)D( ze3R$WpdLwEuL;wqO;h_7&6OOh?7L>A-;Ai=-`*MqEbOViTJk%5OZoZurY{Aehs9-H zMrj$j$A10tL12mYDQ%bczb~wr`Q!cd_=Jal!VP{OjMUoCXc}(4rcVzXA*Neemt{SF z+v=ipkp2Ds_V3em4$Wy#Prh|G_~ORJujH6seUrEGuxJl*OkC)fDq)_sX2s7Bx4b+h zyEa@1aGaMEyIBR4tN!+QEe$#|+nW7dZkW)Wo!R1jvetV3@9hg1*!kopEw8QF^YMc- zf99KmtNS!xPcyZ#UY2!#UChp=FC`DVx{cq>TzA=ag4fa+hRM5Lyj^?o%I;+^O#GK5 z1#DX2@b&MOFS{?^ycxMNHc(y5D(K~&So?a*QPcCzr31OD>g9*G?0$b}|NMXA)ATC&^Y{E)_2Bu-mxn&Lu&}@0 zEAsBeL}k{O$?AOz_w92$d(G)xUfzp&IX{HlMyoNu!hwh1v%X9H%;4-O|$4 zJ$y0w_>;_)AzjgITJ_bhGp>KKD!zL4fxyG|$!l+KTNshj;C#ls=2=#I=*6#6vo?c< ztujuP-J9p3BGl5}s;ru-q2|9U_W9q#hYz!6#xk8{m@vu6<$1B!(jXpr!Z+;Y- zM$ewVcFW6Y6>iontPc-HZf2>x-tG|=67pbn{yyP9Irr{Ze)xJdKO@lVl)&8Y7nkNm ze!6Lx`g_?8V_ii>#+rRKX~-0XJ75F7hC$16t-+~0!M(Ml~q(p z!}`644DNSy%y#*{;Y)~wQ*{0j&&O+*_L^S5zcEFQr{(619-YMPZ~oQ(UUf6b*x%pZ zXPyaX?eA}n5fLjcweRO?6%G9L{k8h8-`f}c_+e2|buU9kT6%WDzdbt&-v(Zs+bdLh z{dw!RjdF0=G^~Qd;N+7e^}Q)da%&hZD#)Qn713W zcEvdtZ}Xp)$L)Lb++|)lE?d3Z>pm^_jmVhcw>RU~t7}`k73R*I+3KdfGk)8pWznxB z_rBd0ZMdM`zH--=H9YtKZ;%1ur@2k+$!@()=jCj_Xie6=qT4)AR(Mdl$55fn{IZGi*eDhV{TJ#NB+7iA+ey+BPBX0{o#GZTWv1emVPns zIaBfaW2Coq_Bv2n-ooFcwtCWh{W%fA)AQR)E|wj&Vd&`V4BEW3ENG=jVd2K6bswhd z#fM2nukYHw{|8%yuzmd3$>FP&8+YhEtmN`8c<<}$n!Ned^o3@AT)kDHQ@`EgJhsd2 zR)qIl1M!t1U4n;$K0H3J{iJet**mu`C;yGx%HG}5^;o`QhKhW_p6trGJ6~mGWN@_c zdLR7u*7`~1(W6HrejRlG@b#?I zs+*T~JkPvs>?W^x@Sw#tHQllqla@^lDN!snihX{3b$IJ_Eqi`Z}%t*B#e|4B}&18)kmL z-@a(|^#Z3v){~ny73JLCCVP8Z?)2%JT3TG71UqR;%aSE7YwsJ)S}hyqdObVi+_#gL zau;geuB@IGAJ8Ct-2cIk&dEDUej0gsdtbbBhi7F7S9y6k3mcn)jSkPlhYvlxd>S@y z{;~6e2rJvm|7$#!29NwPG{_LTqzV_xWhZ&$kpvG zM#jb)tIodv@csMoCAZa+B2EQt)pnn`TGouMc$ZMCf zuU=(^goi&q)M`_?&u;RJ_~#GbEv!}My(6mTwr;iYJsFd>4O7kTUOJ!AFL(FiW_SLj zmOI|fu;H9*?JiYPSA0#^+s1lXNVNKz__uey)GyyDxncd@O<#)B`E!=`s@^{2Fr#3eL>CZC_bSmwBd%vL`hS*r*Ej@vt{&6oMi z)Zr*HH8DvzANMe8;&#n7d{?I}j`J=qE-E_o#B;KNjw);Qw|}jN-TM@@wWA-~B&w>a z{`|Izv@wH3cs{tvc1K6~e_#AJi?-%m7h7us5sYRPuri(X{ru%`1&!#7tY(+`n> z7TbN^Ca8Sg1o4}fg8+Ogv`D)tId9uMlYs7WW{yM*O<@-Ip-_Be*Ki77{ zRI_P0+{}q)$IhPh-LR?EF#Jiz>AQFDu6Q2!X4mUy%j&Z+x-$`-fLeKfUf3%tngT zU2ERt?Acwh@lwhI!;2SR++59m$jSNP!^`7Gk?DPsoOf+V`5?!T^Blji{%IV33U_G zW0mVPd-}hBy_TPulPw}3ps+(dms#oCk-*n2n>QN=wecKXWt#n@vijRQQI2WW7}wGt`@d#)v81LYJY#cz3OU{=$UhKt^0MOw6yPZ*fu4#N&OjP2U2US zQBL=xSvfgQb#?o0?JRnfl+5~4*}eZ&sT_lbhK@sE;6xkUi5@)jM6S*{a+G8G8^3H} zk&WtoG3riD%@?w*^x7A(KAVT#Ds$!p@%S7yI_qoNb;yf?3S z&XkCkSyPTZdi=O|XR(~%6H!r7&95c~;nq1k&vNF=EY;nTYROgqM_onb#hq_bpA>)k zyo;O?J|+8pK3;0<=Y1Ze}7rZ7kpjU+unMa$l4En-qwri|Jv4lYFT)6qcw`(^*lYBzP!9F>2*J# zv+&dV$v?gq>nD6uF8+A1U0zxD?S==>V|R1y-+JoQxnq^Ki{D$9zZF~}EcEE%)2BJhMP6Q|+&QwgWj?>%#MCCA3c*+x7lqEh*jfC1;wYwYeezH{e}!FR!j)A{57f0vHgUFQ4IAZq5W zyvScS4VNx)NnF3}%o(4bdsgh)QSwsg(q-eGP@TCQwPCuA@7)gH^pf`8*4k(wEi70l ztfZ{OQmGyGXVvGze|I)8I=r5=kDX7>rSs5?e-9q?HOUz;Z1{70e#yI?1us9P=G@v6 zIl(;VMZnzC*=L=codx9O^-uh+eQPzhfAhohzCSXLa_upySCp%&&?|d?FMExWRO{mF zopF1s4qg82)}Uf+EWGmfH|}X}@9(XZwko?~cW}+pbxY^ZpRX{t?$?$V#aFLhPkz4c zuGQ4@LR?(jA8!c%Z{L1DvgLh!M4za3_^Utcd%HImSQZ@(-Eamelg->5azlH|x@}?0 z|N5t=Ja`|xoJZ^M`|P^wm3?y_tNSTwYkN;9KYf;&N2^`SkL!F@X6KG=hr{mmKdWkdz`R^zUUS5Z?-c=ICgQ%Pnzbn}^6=(lt-03jTE5&H z!uqQ|zFu|pnC1kIUv{gf9VlP?5LScoO4--VQK)@UAZ3<+Ppj(x-QC~0_H8UIDssBN zuXf6|*%pO+6#jl+862_I>yOHO)2*fv+uj75nBJWcVWObGQ2YCf~*&e&YL>H9VV-M0pD6)#h5jLPNge*fV<$Z}$vg2O^RdHX^kQ`1Lw7p6}SPq?W* zUoxicQx{jw*RS=i^$nW3x`)H#|GQ6^erK(=Rq3mgf=H1{jW4s#TF!1hcFZmC_pMXE zFU~ptB7b!l=d+$yS5^w=g-6t|Ff8+%+r=kqb>i~!Oa95thuT98eImE7d3e)ssbR7^ z_a$lb{9_xFAGQB||5rQoed5|*22UclvQ*cb&uU(~Wn+r91jlB_?RRVfGW%xzul=oi zZS8;O*QfsnL`m)Y)&F6sebJACAHRQV=H9lol&t;rMeNDnZB?fGe*a@XD70-=%-%BI z{QX-w(u-S*weFZdmRmjZ^5Gd(-`};ai)}f))GqFuX4%_o_nOu8_2u8|M5)Yh*_J(B zucNo`;)dy|7FBa4YHllRwg3DntN)(uQU0qNk8JJf>T2pg#XOxk)MCR zkJ$c?zxQ?ox4OFe5*}Hd6Sudf^M|ebd)b_Dh$Ha_;Q#%-p?em(^06 z=t}!puO-i(IU};iTt$fU+1W~#b?er7-QKl(cjCP{?W~pd|MxIeR_^lOlecPDs_yx| zl{|7L9El4Lah{xB_e1d8+v_%WLewTF{{AKlnojeHv{7xdSv@V`{Cl_Jji73_{h8$4 zlUkljgKVtw_2Q~h_bq7r|8e>JiL-X`Cm-u^3QAI9Vq#L5=n)VZ+F88w`Nrbwc`_Cn zbJ!IP3f zeVlMBG3V~C&<#gSE=ajZSX}twEV-u9Md{$4oy8yibnBnq{nXsl^xq=&AN)SFeO9+wT`>zjSFs>T9!u?3&@>;b&?d*meJrOR^}M+tJhEkW<1_bZ%bY zuSl;`0#oZBWGB7Le);NES7Gw;N6SUEpHwbgnp*L3=}!sUDiOAC@B1%o2-sm^y?DzO zk)6-aJ?ytPKh@q_QBiT|W@HyvtL5f3XMYqv-cbEr&hh-Z(CljuO48WWdZgQr9I2=* zSiN*9Yxuet(D6VU^Zv?v?LDaGKX1t=nP)leys78Dot$^uDb)7gxjDAoZ|2A>wJci` znvuaVY4YU4O=q7xsQ&MD^r?0@=&pMOO+!IFJw1k~`MrDg)V#U3Tm1I+{OR=F8euOo;6GTD)mf@rKIJVkxQV zr~5DO4%cs1GZH_2A^qx|H$U%Y_-(szY|`5Vg)?rgt*wu4*4sC`cHbASaW43Gh_&Y5 z(eOom58u6OO#kh9|LaG3w}$L15CzP-E3y;;60 z;K{XZng#{}`g=a;+^hL4dyxI{nKM2qX=z=*i~rn$tp%`Zb5T0Dxc{8#$qD?)gWju3>kaV+Co`O#nXj#l?k|0PE&I;*M)r3{x9Q$qYbWsR z@#Efl`_KA&c2{&R2zPLEQ!_G(n(wNwufJp0u0^X>d0lARR(ikodlpXttik;4mRQ*J zD=W^dzgoCX!F%@K2R?f?B`kbkdG6%NgSX%7G;Q8&+{DCu@yeZ^MT?XUcI{vgkd|%! z{ce6ED|h_m*LRfLmOjYI)8muLkrfJw3v3kKzvf6+d|215|I?!Lj!m)l`M&Vl)vKbx z?{+ZXulYS!;s2BS%L_iem;P*h^!RbDcU%X`?)5LLbDRGEhw-{?Ge6krnD9(izq{`1 zjPm=oqV9ciQ{PuVbdsz4n=6`j$2j)&zGo|$$HJX8!#>_>{Mgk3&SnjIOm?jlXZrxqeO*w92ui_0_gVSHEPIC!fgOo_YU* z*O8+~A8rj7SFniq`iM0&G*m-VGfo2wO_xC??#AWr3TUDiRZU~;Y`@H4UgY4j7VZGRWJ=xdSY1U47e{ZdHT+K(z9b1bp z|Gu-ew6x;Q#mYrt*F#P6-bmP3mG@nGBznv&>j?*stWm`8wk%L~y=Ghp${`fqv^wxFL9>06n zD5%_)_-RS!hl1}HcH~COHZ^T1IH-MN_N*?`?7HJmPls=LH+jySo|WakjyXNay@~r@ zF7vDSK6m?u#K&rXK0aq#`#EIC4vXXqYnuzM&kgo5bDyATku^8q>+y#lrX;e-UcPgE zlXHMTTz#%$*t$QW(c9l&uvmW8*Sz%5-|zRj^X~3ib@y0QDHs3oNk_XkBtO?%6ZzTN z>$J&wE!Bx07xu@;`^-1<&1LWvE#7+gSi-q)C-2=lWSH!xsBh0-{p}ws!-sEq{pxb{ zGIsau#Pnvqd-UkhhLn#=e>T)u27P~feaG7M>-p9EXSGaJZgbX}x@g6Uh{xY%UAcDU z(ABG={kB&8d#k=3@z<`K$e$jpZf3=HdD;E7Cj0wVdZ-AUseF=nZ(W_2$l2@5eS7c6Rr6B!5cz`930a?XKr*G$kH` z+BntbQB9yW&RrGNqoGD`XHV44$jLeKvWMr%9Lwfzas89_J(ZP}iaVU$U5>jbY8rCB zd)HR0tUCGRgxS@6kvDIGPMmg4WtDm*{oviZK8E^w7Z&I1b+R8-XzGz~pN^5sI!^6vHI z@BbS&PtHt-wf{_=$Gp6}ylMQAdOIRIX1&U?u(UjU{I;~&2}} zSFT<^boelHqod=CNi#Z@=y`@2-rQk0FVuU(*5~J>Kqc3;_C^CGC0QBUDxU6p(MtaP zvbJ3OHU<0JY&$w+CT~k%owzSzdq>9!fjP=O9UknrMV{G7+T7UoY`Fqxd9qSb3h2U! z&X9-*jR;;%H8r-069vU|pv&lAHi68ZSQq(owt{WloNuA5ogE->qRK$P%|+$VI@{`k z4;K_GtqcqVYJY#(m;jOP@CZLQO^-ovqUp&~r<~5s-0bo08t>cN+ubW&ErWu;C*J*K z&vN^2{e2z_>&=|1U}tPn{UhS;a>WgFBznZZ#m91geS6vb@9(dfD?z8NgBG~!$Vhp* zENMPBSNY?M#lM$PV~6)FXzRCgFF8JtA6JL$2%s2?xQN3N`63P!D-Pbg#HygA^!oCpOHI$7rB#A<4cwf$ zo@Z0uuPf0reb_o(l3p#k$s4DCIcUw{pp_zietzKSocQdt`h)aKfvb^GKh#q|~}SRgQUYG_7APQ&im(trN^ z>8Z=*O^x=VSV(XHa>xWK;RozI^>FPvm`@bF>g zgR<62N=i(1b^F{b&zF7+IN#ZE!VHwzQjSMOMQx})ANOZxqVlKDpReX!-|jDer|vh) zkz+>~80O49x?k>_yiJF0^tMx%lim8A_V25`cbCmjzZ>}n*K{`_^FzH{xYSy?&vHu26j&v(p> zoOvoYCT5Od#fJo+c_r3N%uEanyUX4mduLny^!6RYOd-&c{cy=!w>G6}f0MV-@Skrt zSMkTsV`paw0_ z(cj-+wvPF5UymN?6c&&a zTv!~r&fb}!Ktq>TyFPa5H>)r2u5y3BTg~s}$7sutQapZuh#ds_iQD< zpWVSe*D90WEBf+Rqw61!8hriy>Ww|1>+AmqE-pTy|0 z3mnbJ$vMJruXFs_+S@L<@u8uuSF`JmAM2fM@O)ysVZj52x#!AXg;?4B{9?S7af9^J ztV7#!Z%_Oct|eDnqWA0T+wMh=k`BJNE&5R~_uSfZTNf!U<-gn&@^_E-bd}!UCT3*Gl%DDXiJ(^L0<$^KbtC zS89LrKRCU9-?bk{85pKaoBFW+eogn6FPCRnKNp-^wdvZ`s}FC#uRCxqcDGCJ{K=D> z`-_S;D4L1&pPjvUtKSVLTXiL+;|V_v`CVL6N-8UVf(8c`HF4&yjovOdzvi3et*zPV z7k<`9?2CD>5RscJE2bZ*WyPU(WBWQj`MNzkx3}er@Ac1mWw+<&H|wb8gs$h6^)K6R z?El|zE_KV2S+lbC{QS0iQFB6WXlUr8zf0vGZNIwOH^4~I`+9Wgy12bvt?TzHYQ0#L z@pabyk5{k%zgW5d|DW&DYY#TQ&Uzg+f9|DAMj~QjNe2&wZ)Ia&w|ag40e1P?9`EV; zuVdUweQNjW6x!qlKuL@Lg$M5mqA;$Z0WeQZ`CTH^?N@qd!Y~! zZE0y)k$N!u#97k8{H)YC(Z>81J0y{USpG!KvZmySn)4$LA^9zEH z_;z&nUX3_*SyD3M+skyX!*zT1>@oPU&C$c7qkaB-`B}4P75qFUDq~s1(|+mFliRib zo=$&p@2pvsn2DKL;>Bw3i8E(vo|x{T^5XJt^Qy0J8XrtZ*s*KJqFu|R#Pyyimfp9U zV_)yM;qUtW>zZcIwm#M`n>?u~YS+D0m+#!^St?)Gl6`$0=cmJm4jE(};c#&&Y1+Tv z{*|;8XfnXLo$vAbD+*&JSPxbsl+@P)nAModgh z0ny>zbBxnBCLVSZ5f?xGedW4!$Mm(smA>Dx{Q3Fmn>Rg)&g~1*&(Hht{kyw!GIP=S zd54$j&My4;NcHDF(Bk%=&*MLQ+5gY~{p*ssE7wm~eb=r!cYgt6JKx=mY8xAyiIa?2 zJUcl*eEaBD8p;b=fOMty_tdubd0zItYooU(Us)k2b^hXw8y)51``3${;NszN@j4}N z$``AnU%f0r~5-_;i^?a-P3grTIcUot$Jq=z3#b-OUi9fpXC+% ze__FiXDib$Cdt^>IZZIHy5e!i_N!k-#fo{aS8m!QWUuo-(BOG!w5MlhgvEc+srI*b zR2uL5`>lGa{p*{X+274BjdKB z-iFHUUb>XE{@+f))AheRC(NHQqaj@UO!!Xz3%5SMnVCLcxMl}a!^Y&}57uc0U*S_d zb^bhP>HInogzW@N_p0kx zD&#*q^V_iMiHC=Z(A494T6)KRd)o`Jh*_1sYEkXJFB&@SwUd(*Xz!Pj#g4_7&aYa% z`s2Od-V-NIT=`}5>)&?&-xzDPufBTS95l|Z^!7ud<3Dxz`W0nKh1omfp6!rtGx$<@ z^~$`m_w#y=%gl@Bt9o~QK4)F-%OtuCYh57S_c}tyS1_B-QCF_>;3H(nsKl( z1g#ViR_i(3yg7~Qld+M}#Q1;(W&3+)n`yEhl&g49XH#&0uavz`*{ds@+~RwhB!pQS zeN^r3BlYBJnx9ce6j+|7X!H%h|WK79YK1x%uHTgDED)-rpCtb%DyjQhS}; z2L~7{-rYZ+5u;i9pn-9Q_47o>xZGITzWEjl)B0a`r*quyXiqzPBsO^23f?BhwWS%a zu2>hI-;&w%=kIU+7bY&3!d_bn3f?qhJJiwf=EN@hYuuM?tG^vsa$CLYUj4BznH~Mz z#yeyZ7cQJ(TD}4-bu5s^^=!sVouPZxk?$~~~GP!?oto2uUfwd=RZGFvh*xuR6>BEgZl?8=`f?Mk&A~fdJ z{3&$2ck@onoB)YKSsK|Zx38KqWeV4&&i_7F*7`a)FtG9N5{-*{J8{aC4ngI%*CGy( z^_~makk@-2uwOlU)#ImE<^KNS6n8kGAF$tPdBn1Panp9mPZJRkXt>FLPH3yvs{@S8 z0-)JHZ~L{oY*`w%W?$#N)xr4pcj6O|v(B2gXBi~QC@HsU7rwiYIL|P8Ex3%Z0M`~f zik@;^y4<>Y^4T5fyN=Bh>RJ+{nRaGIA1imf@d};G%X~#;bwCF_KluASpkkxI%}7g) z^(!2X_pPdCUvazs!-D9ElP4>m*VfPp*_rDWCU#0&>q(}%y80dC+FdV-865%w1k`%u z`|pR%tou~qJZ0)sZQob*|Mwb~M7i=om!kf9e4tUfTmH?BecZOyUktn~*RH&`>e0)G ziXP!p!dKi3y6L<*ZIz7Oir&qejoEl!=x5zt@xnvKswSCFb7hED)w|W_=2|D8zqkL% z%TuScc%!?MU%gK4{GFH?{C*abzP|p&+xLq;I~=S@WMy4-`|zn#UQ6EHUSF_ocZt^Q z5Ury#E-wD?Q#}6U=S!C^eRyz&eM{ZU#M7Y0TaGlSD}9smXj}j%C+7@nk;Mnoy{q^wde3sBQ zo_)U0YtQJ~+QwdZtg2!mVO#aW{NR7o6`#8{PODn&SI}XgvAguPnaK1h9k;@L`aMDy zEne)(Zg)$YN4~FP2j|<{tL204Oj~|v!{sW`?uZwsu3SGY^!@Opn3y>ixBJV_{TBE~ zY2hZP(&~y=Ay%_y&wl!H$r6{A*49@s$3Ro^C6SRkFD0?9x={pbCfz>f0BS9q$h)k} z#ZdK1@(V+Q-QKF#d-Fp|(l_(VehGM?T2!m*==%I~i}2m=FV@AcU$$U@LQCta`N^lH zQZ&{mT;CsWfAO%d=+WcH4_^L!to`J%V`_8k_3PvmeAg_!x9al#`5TUVRl2f1)2|R^ z=a)6Qd12Q9hK~m$S8g`gu{d`{M6_3<;>?Gy)o1>yihNWT5#-{sm3BW)g~`oxl&S3?@?UzE4$}0`${4w@bO=_pCNkFlBrcZl;3g_TV>^;%7R77i@w-R z3(<0oiO~Tq6h6PZE8pdht!{q#=vC;$&C}=4@BdTt*heKkJU)HOV*x?Inc%UTvPIkcejHppclPXi z$BT>;;+AexHo@mszk?ZQq>Nsu@iz-nV1N7U$&T$u@VdTv?NteO7Ar7ip&yy{@l} zR%;He=t|nK@uE`0SZl#L4xmR&hDFf3?m?c$cUfdGlsP`Nt&330w?Gixywp9M0d; z+IHyhW#LU?lCNIB4u}cr@}91z^teRr6E~O3{NslY%bJ>+S2>1+hQIuqxMR~IuitKB zPu{)LTfyJ9ZpyL<^*eWNNtW!9KE82n)$6x!dp|xtmh@-GM$iqJb&iamK7T4y)aSox zX$czL2}&@twwCU`SIxg(Z$|#cd();Ry?TB0_d@%l>F?K?$GQ9XY+(i6)C*c&Ehu=C z(>~sQ%JlFPmqSB;v1fUCd-VpY1V%+geRvxFUy$YCA1q7ABDSXWUdwH^E(5Q5s(pD$ zwSQq_D8_-hOR{nBW=yC$2~T|9SP+rmI!lTiAq>l9L3a zg_X~*Ml5I3Sij?A^<3+6x#(>?CBSeyIGpXIDmkd=|ix$tq_=Brh!`=(D9ck7dB{4S;+#ATCr zZ`WC;rJLfG?TgzZ|Ejf>^LEFdn%8{qgarj9xxqPI$tucXiR#-EfqVN)|2*Mz?pBWK zb81ipEq%9ke^tV>@!;eiM=Bhv&d0A@aXIqywGK1U)S@qwz4+OD-r5+ zd0xGwZ|$|{+?tv_hUMp!oAxYPq$DCL9=*cl+Sx1DyT3a}#>}2q%rK$sNk^-flZ#7A z9BBOYX6F)@ME+H0&iG83Htl829PjCRing))=LP**u|h+9iD)%PXW@r{Su5V|Dt*Z$ zK3#e}jO`E=O@k|S!lKl48*Ate-Y-i8@(suy4Tn{u-f5NZiolK|S!-q{f zSA&|+GmYP0e`&FQT~zL!rp$*rqWijDWo4J%`d{M4_Rp@=>&mvcxHyTL+X*?h_r=cJ z{^@$ChmVJYlT*{Rzo|x&pdOCM?2Y1`lMi`yELDBfnf1fSY7;`eR=2Ruh(uj9di2f`{whfnd#~2cdB0NTIp_h@aT<-M|6^FSh3;P zubWzbFMR(wi*w;Z#g6`d_pq>OHt)Z0eGS_4VkMh?c>e4Uzju`~FqD_`pQ(CK$0KKR zVnwQ|l9G|y@4wkS9VZxjC9R_-+}lxU462i={_m|{s$^O^e`EL3K!<<^h1x$yJg;2o z;BK1=Sp@X5WS{4D|Ay78SKHjZbg8NQUTn{nEr+GPuU@_W`1SvP<;&jPT6*~>&(nu5 z6+NEMIqR65ym&>ex}S``$N$<_B4KNV?$2JkY#ZC@X|-L;mPvCv>{+umBpuaX^nHJUqQ8NoH3N(0mGbJOSFcmKzaO6P{Hl;zpS-$9 zKAx3QoSB*J9}ju!Kc2Yr^M{+y<2l4c6qJ;HgU*AQC@X1`A#lj4Raim)?+4{Kx9c4q z*BQ+OFF{D3U!QpD(aI?j`foZzV`F>&*M9E3rfBw)m9^sW+3oi<7q4bu;P>)$aSRCv z3R-meXH!#?!Q*)^oA&JbRizX8i}7CM7KwI#dB>mjhfSlSq6%JKQq8%whxPoQ-~&uM+u%9D3@Y4M)jtiEht+_nOH zp2|4gh2`(#UffdkobdhQCjX7u-}Bb~e)ja~t6!Eb(jtf)n3@$KS0Vy?N7fTz+E zPnbSmpFbzI{Lc?g8T)%y4|j!Vh5ml{Yh&f-0=4TltKE*dxF5c~+g9t=nba?j&ufF` zEIquuT%4Vi&&@gO>f|J|%xB)3E&r7_rz@L(pQDhlBk{4CjF)wfVY1ue>LT-!Hy0T7 z^z>G&UF#SZXUDfp_Sm(x(HC!M{P|%1W1FLdMM1;GdiU&g+aDkAJ^b!&HH&R$*xJbE z%QGcs805(a2|s>%aLTl4Vlg|5Sl#<%j_&$eukqDxmQCfPz|(2HKDB$-{H>GtwP)6B z#B!y@t5$J2Wc%+vzyAl9b@|(aD<&!n$cuB^+uJj&)qeKux%i`iD5-5ZchxuqcJA7h z^o;p?`>FHv zX6Sp({qdvX%#QS3H<=O{41OP+S&@3s>0tZuIdf$8{5_{+VQsCfVIbgp_N<1MR+EpK z@Ed8wA`;Sowl;cwk#wk|0chz|<&VTKFD~BAX$0|nc0T5-`TVxL z>Cfc)`G-#K&p*>ECNIBwhjzoYtDoZPURLh;`0TcZ_U?@aj)8%Kbw3g<>jWbE?(MBg z{N~L6DyDAZnyvSK{it|+|NI~B_j+-l9S@at-~}>9j9bpxK7aM9Ytb7Y;Boe>n8{{41L`>N}&u_k6fxTu@kQ7BReU`9{K2(zzTn+xXJ**(azEd%lcnMB zQ(_WVU#bY|x6eJFx*|~7J>kWKgSX5>l#v#(+^YYxW8;tO!Twy&!i-t7*KRK?EUb8Y zm6e0<-HK1oVT(^n3K5G>)HG+C8h!n`>D%wb7oW2@H(oTXc)T@SP)KIY=Y8+q$$|DA z8*Zqt7oKuv&#y19mQH#8@@40Y85!JD+B!OXT5Ul?5+Ud1Y&VpgO!~7e%M?^X7oO9V zm(RarSZUb>BP0jPt$jQwePRg_OD;R9(>|C`N>mVtxNTy z$CoTo+4J*Rwnh0n8^3vfq@U~0ad&l9RT1Lcv-kGm;N=A+Z*PejUc5NLL*>)oSyHXn zgI}fWdOr=c*3jmY!K25IH)eg6irHP}n<=gD|5PCf+k%sM=9ZR{!S81^-H`Zv_Gj|i zuiJtvEI@9OwJuLQJL`U6)Urxb(3M61Kz9jl$;@Il`*!Ba_0zN7w;Rq2_uhfFLdCJ) zIutZz^x~T1j@RcjKYagg9IWY^eP%}BiPPr~&)Zwim@$|CQ|EE{_Wtett=?`fF2__f zHP=nbyx-H&krSDks_HlAhje=J`9&|H3}3yKVf(sR0SSqWL-$>* zv)69d)z!7A|HtH)p7P+-Rc#GzUH8~p+nU-v4`09TUU6>j#kJAlQ*C8rC$3yS-Sj?x zvd#Kw7cN|A_;Pu9q1tmDF8x>+-%!&fetsW5d~s-Bz}L~$J)Ay1BUUsoL5yANQYkU}f-f(9)I9@s*OX zyH#G6^c;5YTd;0l+`PV?o`&|_?Hjwjz*GBf$K(=0^W1#$eusCJzMeR{nvY?_qv!D^ zekazgSh$dJb=ZHs6R)qYUmtkd1FT`$LC{>j<&;Kdc8*Jy>E|Epe!oxL)MeAsrL6b$ z{|o;7`SX*Fy1F`#tj&=dMBR;b!t8hw1#Y{fiinCY+_p{3FG#(js%k;<@jea?jtwOrK`SXb zPB?&*1X$lh=Ly@&c$7iQ5!5Jy2Dm2-a-5RVrua?L|5Ff)Lf%Y&a?D_#2XP!`w;N=j681bAo$6uT}iWGt&8Dkz&CHX3vu;W!FeIi;kebm;(x zqQ+t7M5CDxmm&m@a42dFdOxP|w|J@uoj6k)1dR%%O?pC|H~llef#S0HXT2|6T+8Tl z`P4_mtaxd<%5o@Wj?;W-gr9ilu_j|%#cIx$$jh#ZF!LU7Sa!}oOc;^aja0!o9<1qv zVnnGz&tX+q=FDl|dc0_jl|Y(rvIk7e!#KPDDM%SuM@L7;iHIC+0X4>yYqAlLvQ$Z_ zh+~_?;*Dz^X7Egi`W_GrvwOFC^BJ{dlWn3L%xh|vXhL(?#J`grk|rBU&E{^=oXB7l z{ifR;l8{_dlv9i(*VH(A1m@Tas4*`Q;@sT@)g(BxWABl;9D9Mb`ghGszS?KUFPjW? z&~)ELqa>iFo-MmrYobR^(NiXvGrT9CWaxBZ;(W7MJR7X)|$-GMRrhdA& z_yL&|BL*P{CQX$GHc3$Dy9jywP|>EucIb*g zh}_Aq@0!hO|1P(EK7YRPi>2Ibhj{t1(V|(kDGH2ASHHQ=qex2|60n?`VDNNt45^s&=5BgJ$kU(Z52{az%}VHP{c|;eQF>9*dsQt% zwQq4k(t(22ovKp1J2!4$AyIw(hH$h?FKa+o0;{%CnP&Ht)bD>2zHEJSMsIg;+4Gp| z(_Q8npWn%U*zf1t;&kcc3;h@QJ2t<3ZI7)!%P6ZB-0tG>q zL=acSX&XqLil^D+&JruxiCq~P89h6TUoXBWcaMQVRgr_4L8CDz)NIwJ(21V^3mof` zlS|LcGgg0gW@hlRQw$7~oCVkz0#deKHJ!LN>sNBP*3_<9uU?%<+hkaL?M%iN8y8kAP7TlFuk{6ysxzvYW}?RvWU1Or2crK1FcL*vq*l`FCw z<2S^BoawccD?*TgK@g;;Y4yr=dBGE=dM#bFY}v8~QAP#QDzsy8xDAT6sD(FpKYgAX4pMLptiVYV zrrtj(hvg<>=ABZWH{3tWDd2U5^UkZBAA7h${+_UEHZ=2PXnpn;;<8{ z-{JJu{r<%a3~zm^Goen_1?zA_@GsZZZ@mc$dynP86aAJe&-HRocB%P%(^7P0h*r>l zYqfp<|1&b&QkZ?x<+@(%saQ6K3GT_s$tHE5>-YWs-`m?Ocu}IaS8!#=jN3N^dU<&- zUbygMzaf{Wz%{m)C0dtOmMppS@_%dmeU|u_TN1b#7#Mym%ojiIGLO~p{`)^SFIrjR3-a_OZ3usy42?Sxmp!7lRe$l=Jw`< znq8_YXJlYtczegcY2&eDE9M)kKQlYiyR*18>ApHgcSnhu?9CFjO*eCvTsFJJ!oa{_ zwXQ@<^y<~Cf`S(>To5RJ^*Z_8ot+mGmPQmcZz!>noq5LmVYu55Q0@#_P+}!(`k(vg zGcyyH+C$D8U04%WhG?x?y=vd<-yj7OL}r#)8QteT3Uc+$;%6?&$wg%geOv^l`7KwP zy|!yrj#<#JI*{u)r+Y3}p6ustHoMpI>({_|dvz%(Eqj60FBEhp`?+t^k`BGOs%SbW zKrXziss0{Q8X9_L<$U3<#jmuhuAl7UIdo}eNyy)PR&XJ4_P3h%%C29(e$B8=_jCOw zxO&ABjoBw%wyo0IG}C9NH^{yh6E@wO59aAtF3 z02PY?3O9Y!HqG?8lKv|B+MAoA7en?ZvnQ_1pZ4}@NT~aZMt%kchJb>bIc7#PbFN%J z-x;|%efsV>W-m85MyO5hob~FJ$MVZh^*|x9VA0Yb!O+mqi6>K%uC0lb-L|lAQJA(d@GNRGRYa zlgH-#x@lPbZBEhj%Sp0o9IMx^y~-mGD#+)0ELB>ydX@5Auj6MTH=m02>)!HPL1(U? zdv0#-lHgqrL8a#w^P4$lR_R8D#m~-UWIW${_*UuipQ~1_dU0pvWC4&Z3uL{Q2VLA5 zynMyVy!*OqZ$0hW5TYfz)zoxip|%PG1A{|*U}&i5%Mz=!b8{r$ZtShw9W6NRWXhuA z<$g{EAXoBfOg`!I{M=mS$$8})gMV`!+H^CgWYyZqV@IcvG$waN{y3t za~@i?dex$B%a+|q1(oRm4EML~TeWJHR=MW=O!18|zP`R8TQ|1|fXv;tdgZ#l5-riq zY3KFIHJ`={hH0~ae6%7X^z9SB1Dn_q=iYj_cM-@Kk$cLz2bs}H3Z z&3tiXW$={j*+(X^CxXKJYFSr_^&KZ+kl~L`ExCMgW%2V(DbA|4$y)nfa!&J`uKgWk z{(?J~{@)JVbcHj}vw6cUzpy5dFFu@&ZQeT9YU;N+ORWNz-@0{z;~>c5AM<^zVlT1% zQuSPxm7QgBjGcjj;eoo*OrI;)u1t9n+HsTCe7|x^f;edRgK* zZ8OL<0g+j&Rx8IY;T7k$%hpoL%Fb4v>Lps01+qgcMr*28)aO4pn@j8hUl&$rLV2RghB7DQ8m_?b@~B?{jXkmZg_pu2{9n85DR7t$|b5YGv%-&~*06 zG!KwUu9X-59^w*exq9uITNJnz;m|0$DL!I$^M+TiUY&Tw4az|d6Gc|VN6c;lrJvBq zT5teqtXq{6I{S9fR!xr8E7x5V2c@`%Mczw;0)y{vt4mzV2l7?Q=Dbc&X|%v((@me0 zTN}DlR?9~QAL#oFvigEh?#U%lqAj7};jX)QUrK|-wzyf%?R&NAn(4Xu&rM#>X8W1@ z{t_s(7}f@cUfp%<=VzIg%n2X?2g|M73jf)#CQ3a4MePN-Ez1i3*~rGOb+iMS^Y+M| zv`}5XLz`x9%k}33iL_1ul}(vH?{@3@ZCkZ!RdgsQEi#Cl-t$J`<|1(BQcE@kmppI1 z)h2hAaGRIq1nvrr&4mgEmvWa+$T8#aUK&)@42r7@d8tM(J+>xU*Osu zu#pS)t~izUx$im8A)}Ym@@>Hme>%-?x$@+5cb{pe3xtJEwRZ&hx8a-GZ1u~h_A2>I zt^xVZYDUgHpVcQ7bXI$U?UN1An%b4K?WKWEx&SB!8Ds;^E`MR0;LDacv*g}c6_EQE z+&z^t>)f`wPs>B|y1}u;42r(1M`Zi$IS*~RxomnLNSTBC#gJoPCoAY&zhnrq>V?Lo zm-Fv^{Ly?xJKVh%EaCz3h_U^dU3CI2sh65Sg$IL{vsJ#pG{F{-5do5QdtSU|cbsuo z3B+9?V*gI~Tdcsevnik!4g*6-Pl(pn=Fr6ZtcjU_!C|w);C?>qw7ggRAoUA`Qa1hH zZ+zo>Sj$dbAy6hiHOcR<28Z|Z%fG(jH?MC ze#o*j{9!Fi*MOUy3yhY68jK7K4opk-?N`!ydJUWtw61K=J$Pwl$f>@GU@dF%KdtZB z;`S5F*;QgC`*O-Zh+#WItYlx7M1cd=A=TU6>JrS=1)w$qsL=;%{l-V}fr8%QsP|H( zxsxCP@i1s2moB(1yrN=dh>Mj9xB(opCuB)*?^8Wc`eEog-vtT4IIX4b;PlA(!M7hQ z04Lj~<4*A4x9_J{{}Vz9nG#&!pL+zmL~t=L=^4ydsFnc^5c`}LR2EO-`cWG`s`gHk`Z29_t zcR^a0vh3fB_Ve1ww=GuKh6S~1zW-Ss-~YPJHt?Mh1H&yB0XBw`3~{^C_?_M!J;n2O ztiGelz_6uLfrsJ6hJRmwo%m66Y)jGfi4yN?{uS=|bg>$2>Q%6*U(eird@9!Ik&S6x z&Q5Ozh740j35E-azOz2L?)3JUV{ZR<1K6-AaCc8ux#xIInE6(hs|*Yx^F+Z>sM4eWE&*Kxz!5!x1Ck4b93iPh3Di<%V8G}A zZF;K5z_4KJrIjI@k1vTT@ToQ^Ikdy#@BQtfx&Myy+wHxXto8D}Fv9}PCIf~AhqE$r za=y(tCMI)PuEwg?%jWO59h1{d(?T`TgO1<96V`iUaV7y+{3qLKE| zgXT&cOrW ze5l_c9oj9|YE0+OvVHdM;(6DvFW!0w_!^b0e;f2ph=C#MY!@g(e^vIko{n{Tq+_{% ze=);?$3iWP46@hS_J-+{b9Qe2xJi5ZZWe}yFi^Kh_L|$?upZZ4W%}ikof|8@vnJ0~ zovvRl$-uByjf0uNYKyYjzg$qBcx--qAvhU>^TY+dxct{Ib|1O)RB!R4wVOlUOYC?T z2F??{;BdUQa+TFT(+^u-{M|h7sov70wckF+72dB?pSqiep}`Dn@x7+GyN+FOKHtY% zzp%1yVeaNfvp)Wi_v@FNYc(C5qrK10yLltxoe~2B*VB_9*B?neZzsavBOCTE$ZE^n z-)rUFbAHT@`1^b>xR^KyE`z>&doF*RJ-#;Vosrd&RIw^#lDpkVE@$7GPNI%ii7&1YR9X-ypY?v zb*rnT{)gb=XJY?IsHZtu_C_On#y z^6Kz|&w4v73LZFGX77D@Ogi~*>2>WFKO2_S{{4Er@QR`P@x%Q#pC)hAi`{i(sd&85 z?3_J?FS!@L+2c1oeyI)nI_8FH1^Gf3*7)1~G|}7r=hKaf%e{{;9A*G{yG1z|M;|eeOKMNcDXu>y3K#f3f~kSKf1(oa#x+*f**E& zzii&|>3#kA>N8t1FF%_9{qJTMQAUOdAx#DgJp1i`y8L;zeSas&lohL2YybTDe#h%` zH>zecetdA4fBK(04vD?<4feSn@2yPrnW)Xkpzx9<@c{pot5=U^F8^=&&Hh2dj1T9m zQ`e@RnzFL+#RBKYUyRRpNE)Y2*($c+Yt*iZ$KKrB+#SQoz~GsF-Q$7v`#rz&WGcT* zG%R|uqO$Hy(P>@rzhQ61_fC(ud-ndK@~)D%Qn9;AI(HU7Kei?Fa?-IL$&WYF=N|x@8{EL+C{1i3@URKcse>d3LhUk%E-*0RT#f+)~r`Qp6YM!iO<_s zxn}P-tBoHHac}(*Q~dl~@AmtZ>hmfdb?$iFXZ`4H`Rw>gv!o*(77q?EKbo~aUbtI# zTSoVJ*Pmx*8mrsQu-JHV<1Wdi`|nQs6j`-$Y0`lP#*YQY+pYd*9a!%bBFMnt`ShBH zLL0xl-0t^V-MgJO{H*@cvAEC1sLjsOL~rMZML)i-uebGAjBs&Lo7|Z?JyMNLt|Y+b z*Zcb86SCL!+SOK>|K3r!exDROkBxzv|G$cP=h&y*_pG-utkT_Ea_-~fep|h;$keGq zVJr*|LY#*b9v<8KD@(@W!-5$`saczk%hla@Q1Pi#J^6xS`>{pc|JEoxKcBXF<4d*K zNA{NA6<+@L<&_m{*PgBZb7N!j<9F5X^iJ$-ycAip@#v#xv-3J*%kDj8uitlNlJ~Kr z;xQ8JvK0w4wU`+cJnu+xa(=t_`~C3)_B=iM`+sS@FZ}!adw;OMooZN2;n77`gQBCQ zf4|vVzGmO8EW;lk4q8fol`lEKX!v14b5|I9fK9jFugwzOZ~242zT^Je-T9eZr;-n{iub&3kCDH-`+WGj zAO;486%6kTn_70hez!a6%nU=z+Z4R-6iR_4O?+d4KP&8uK5Q*x1-BSI>4tZccYqo7*>Q)~pxz_EsmwG1vVm zj-9%;EAQ?ux9OmP>8Q!CUcXL0*0Vmj>h710W5+;4TqW=BsAgrYIvpFeJ1{<8KECc} z=$Toj+LvaQl)SxUYE}Mj%8dHUZylG~uumZ(&8J7o7BqJF zbMoV?tX0W3Q>S>AkAF$$b#!!`HNUG*{j+Ahx>4M3oBaLm_l`Jk z{ku;-R=?lvKe>4Au2-uH-&{N{@Z_qcj}K@AJ_JMk}+8xv~KZ*eZR82?v($pE&MIJ z{rKwjd#^1z-XmkF<<=+j^=|$8z1N~PUhcC#x}J?k?5G*Iq5|ld;s|vv_gfM$P53kG2H+_o`0Q zc#|(Tzxv-#i`R2D*9&B9y|#M&UNQCgMP4ywKT{1WE40x-nen2#`C#x;nP3wv5zjf7bx$ua-sdFx8nD8&2H=XS%2NKXziT8e?FgoJWKKVv8&f(E-z}>tqDpO+3h@? zAbgl#T8912{{Q@WUvn}}{LQa9*eaHF)w28L@%5KM&4AtS_GzE9{C+3R`A|&S*;%sN z?-y3zsXP95A94)NgNYemv03f9$9D zAKmwNnRGuM>efHTt-ntqJf_l>N3J9yXY*Mz)>zlua`(?S^qsXeoFLF||FPoS#;d=+ zcJrFwSkQ8H3;$f}(qHfX_gB1JdZTRj{cV~ozxN%VU!%0`cHwXNKgYJ{f*N-g?^=YD zzT1A+@Zk7XJ6XM6Mt#nY<2U{vU{3nlwbgx-5M0)}!3|dnByi zY)OtOd^&Y4-@&>!hr0EE)5kz2;+?WA{$DYDG^@vwd4ea7EM zt>5p9-eCE^@bA}+ujO`|-h8}l?Xf;tY3uj9PM2>lDmA&k&u{<#gX|l>zyH?RE?>Fi z!SfZXS9dG-TWa}PJ$<59?W7tDDW!A2UOKIR+;8_A5r1CUs4c~J%J0{1e0`pna_AsiKCfC!oJR_=9A~;+Br%}*J8`>3WZ&+D|vUt5>y*Bv+--)V!x&tyzJP6 z!|dCumR>!r?0zh-`pvahxA~u6z5RZl@NfAI^?Sbm`>kpz-)dU<>3HFTM)qSz`0aIm z?Ubv2)M@c*#^PH~r|+Gp?0)n>^Z$SgSDEjdgOq*JT)yS!Eoo`#$D2;;_Xq#4iE7l! zz9k-CBlugs#Gyyhc-e~Qnr-LiS{?r_UnB7Q-R}H7KcCHZwY`3J`yHX<^9tr%RkRP% zJny(P#yy%x+Dzx$z4G~!_PFo)eXn}s`S;&C3m+fb`s(Ao^9@OtlzD^_-mKo4zcf0z z*VJp@ZU1V}VhD>*FYd_KWMyY3&t}};bu~QRRxG~eQGPYQ9^>M>D^zMSjQ6wV*!PwCI0E*CKLzBeGU5UG%%= zvukK+=@sAg-77CII~M);eplk*wxg5(|McIyJ$CQ+f4{*!y06abemmwX-rC;Q)@Jc| zjWMY4pRcgz+^y{6%Vy_Eoz~l&qqE}xQ{e5D!5|kc^O-3mU-O}kN7~K?)Q3!KUUFQn z-e%p7PoFGmK0IvQ)noSi)#~++J}C3|@7lFX?fCSlqLVkWRpRQh?^kzrl$19heKYt7Ub8YkgTC;V#|H&JEIKUho``Uipe!G7~|Kg)d-fXvj zTpRvQ+P40l@vhRBQY%BWmR-MklwH`qBRsy=RPN_>Wy91{SJdR~Q%_y7_|u^bYQ^W3 z?tMDJZ~3Di!hQMQ?tf)_ys~?{ce(cEpe_z*& z-DN7jU;EwF<;c(Hf0t%R&nq#R`bj3_ROyy$p!8P9E;r%x){noZ#n=73kyZ== zk1Z~>`Sam$<@v9m5;kx5JF(a6Hv4sF&9c((4uo6F0~-~9jm_wn@T9KpN0 zN>5kbag)xI`2D|b|BNpe-3#CE{eJBJ`k&S3^v?(iD!cV`WUt??$7lWJ!k*{%>vq3g zoL6;OUQd7DmrHy4bMxNipS_;DPfT`t$$8uVF`KRD=54=QR(RnbyUY7~dyD0_oU__^ z`rPg#S5{trbn&=cFSq_KgZKGQ^!NODbR(%d{#cjxnhUosald*J{Qt_6u4AcHU%Qg~ zEzQhs6)aw{a%JA9jr;$;&41kTxWE5-e2wC|z29#AI3Mi))b@I-c&vnV&h}cJJs#s{yW`9>CqEm|E~0TwPx#f{aU5=TX^5! zch-h4J{*3w^IFlb*Z0qzzsa)?6rxrS8h*UZ-+uZx_uRW>cTN3%J?=F8@^U#Sw`XrV ze!KSjUGcrsqwW3~6eL7@t(Snt_p#&h^+L`3@^^A1OcGwNef<6RKfPaHUtiBT-80$W z#&TZex0yR09OC};&g|z!_sNfMJnrkxUcYnMQERU%d*&`*0XEJL&wkvom6{ftc2g+q z(!M{h@BjaIa{k&~S@$je>pyp2AOC03&Ew01R=&8sJwK-GqiW%Kwb{qy{eLCjOZ|F1 z)_loP(Cm7bXw~;lL1i}+%Xw$h9`8u*@7??DM)ACDTJfNs>V#(gzWBed!V6zzE`Rn` zu;`qhY-qg%zq3}H7{k_^p51jcki*mNdmiH?6TWmU7dU?<7yz}>+-|ZS)8m7xCIjly=>q|Il|x`qAiH1lu#{+_+AulrxwL7S`5I=)wT-d?x+n0&vz zVt&M*wLWUXuh;L6TeJ6BRN?8|?Z@W(+uJ_ZIyKWc9n?@30QC}|tvu#$|5vBaM(h9n z|2byT>N4duZ+0G^XW6`4{`IA$-Z@*JPTTl1ZT8W--|xt#&ndm;zwgJhD&NfYMY#!^ zp6b_2s?V(m`m-nfyx7^xOTDK{Z1{R@O6J57(p<>+W&$D+eo&HYZ zcFpudYSQ^K*ZFtub5*?YeQD6j8;QT)K5qK_xxS$4O{aR&A?vgHpZkA2YyOtGe4do} zy#L$h--SU;r{wPT4nb#pU*jd<@$B;y^i*+f#Koe z{kH!i&V5www=gQZSGYVZH{HIzU#{?A{C_d#ZTEJa{FuA_uGzO+wf&Xzwui9sONpe< zt8?pi+VK8#+UAYl=T#rQnLc;w_Z_eQ72dV^K6U4lOWvREecJP4k$tyy{%+-OzyH3E zmT9VuH=ErXTXs+N-M-K3UW7KT|9D)sI47p;vui6X7~4mz8BoOb?e6e@4t6v zuiIz!K7CTR{@xv~(oGfi%wCQHY@+WrpSL@|TcmE|Q8DdA)3?{9veyWT|9gAr#l5{> zw?E{)QS~}4zrNz%&*xD#@mf>6?*IF?z3~0r??<#&uMrZwU(+F7^mXgTW3N_k-*qlO zG(7zH%jJJ9>r4|I&L!vVeS1yptMI}-_iDf2-II7mZui@3%YJ5Ot$KXs^7#(c|L_0r z`~CiJ-T&VeU*iAwb?fgixE7JzYj!qX=l7ef|ycgAwx1t;#Kyw_vp|NdHQl5jqru#qE`qP&8 ziaS*wt~u?U6d73=<~{M6b0W>ewmUh|{(s^5vG&nrw@v*nUk zuI5MftgKa!TORwJxG7S9YRbxwpH56+PDppU>yp`~7*` zS@>n5`_T*P?Z-~4&l5SVd%G@wZCvWq&__3t`!a($zOCK+{igc+A3MUM_i5jn@Vf1Z z?EVi;+(|p1PRssSbN1!U;?5l}nz*C4Zd$Wfvf@GG#`E`fI-jiE`X$KwsH=F)jB?S_ zqTw-u@wHQbKiAHL1WCrZx8?WdZCAe*f9|)pqq)zml*hfv7Zi8?uD@4z{HDljo14x?>VS%>gJrgFw|==)8Sd97b9K}FiQA9$pTEsebwRORY-xYM{e88MI}W;w z)Z7b-O71m%)Nz>me)xv``}+zX$^V~G{O9!geO>PVzIq%ye_Js0RB?dj^^0>rg(I)| zoe9M?4;a{PuaC?c;{O#rbv@!>ZqJ4cEE6 zI{e}@{cV%~S0r5w+xm9T<8zhy?YqA1QoMNKLco;baurDCH+gRFZ#%WvG-7++-ACoW z&)im%*9`@YcfQ|Wf9~V%_xrTp>$5;(iX}T^M)W(OQ}4e2{PORJ(`N2@3>va< zJRi;h8l`jS1RTI-*5dtpUvLh_V4qe;^*f!zTfv-Ecaj1t-RfD7vwXuTogetYa(C(LY2U+6uTS5$ zKlX&tOdp-8kHgwN3af2-Rp#fFzVWD7_tWX|cF%uErq7l1xBu+JsjW5t-QDNfr{3Ce zKY8i>`QZ}Jv;TVbnAX*t3$UDh_SpLEH<$T--FjsGHn|JWjy-s~;ksP4*k2jxb^9If z&0m;!xLtH_+qX54p5!yoSf^a|pO14MN9TwBFyp>&{{PSC<8IP9Gm8H_ogRPA^4VV= z4OT~qkR7jP&D!(W^PW`QVqWu}R`IwM8pZm1Jl@^ka_-FK?Q6G!hBQAt>3=*mJg!qb zUPjD$ex21kDJzq>iibxfY^zFY3<{I(#m-Pt5{oUlI4Ak6?X*u`OM^C^_OpI2vwrpJ z?!Djds{7eJol^1pZn;-P4uy22ynE_W zea@YiI<31s=AP)f)=T^A|IbNYzyD*^Im7qq4w@x<;<=eVr|ir7nZI?W-QINxyi2WT z)%^|AzIEsBuClY1*Dl=n7Fq!s%?OW^l-B2|HjJyvbg}vTX7gFLoSQjjVUd+jBeK_S zO?o;ttnX@g^k4SvZdbyd^Z7nMx3<6I&qA%ITmP2bK5pu~uGe$2+Ebfn$7bhuN$2m= zEW4k({l=&1(Z^=}{rx=F^p@aP%}e5Y^kP4~-(X#y_iz5|?e|aqZOv`wHOmO~UAysK z)$5~+`)$KEecpQY8Z(7B2;Kh&{_%va#iy7TArd3kQ#Ede#(A}{maQm?bvxT03+)@G-- zA~&amOtj0X|M_%!;d}f4lIHhof_+YWKDtZu>({TK0w09$|Gf$75P+K3IlEpiYt@@7 z^!noB>N&N~B0=5M+;2Cc^Y)tN?fiOe#(wvH34;WOH9Ot@N9=sBweia&@6sRozq<9O z{XQKYz2z(Sm)ZGG-*I1gExt56>3{dq`oK-aqKCS)*F??iBHPJ4E5P3DsofrjPp?wm+5^6jgJG@V8D zrh2)~zqj}C%=FoDUH{Knzd!P7wP=27NcA<<^Q+c=OZ)cbX5nqw?Zm!PSXz~GkKCpFggn%yxtXZ85ZkH?X9T_eZ zskfhHRu?HNJ$r2yfAW>a)16$24_jy5JG(8S>M5uGt9|RVGj-p(!rXiDNq?7By<*MZ zuV?l+Mznl4UQl6jx}D|3_Rt^oZG2mm6Rf{Ii_Sm#uKHcz6@i{po8NA`eeCb|f5v7x z$?sPRD!UztOrI|soo}r0?eE|Bk3ch#mc`FRR-AgWV*UDlP(VMgFr4-Kxn212S6{F1 zEY7U{_vCky-D17}Z5&fqL5njJGqYpM=Rf1Sce{J$<|wh8N_*z6gIxw54WeN&iqCJ% z&fh1we(%33&oY6edp@&FG}-uMB;N1)9@pI$ztDev#M=8=8?RjQcD=3_yV(2rxrwJz zl74N;G%US!<;SPf`pH*T1RB;H=~%ITy?)-uDR)8huKy*9V*h;K`TWuQ@c*{YS6!G^ zmG$C6Mb?W8FYfQJm#KeK*tvJ(`GL zs>|GebM3+DFRw(a-|h_0*?3fJiU*=dT8 z^%TG5$<1G{_kX<}tsf_6X(U(uXXB6Owf}R1>t{SX+K{ktds87e$#yU*7C{s^S|F^ ze>0!QE?eLrQ*~nD#kJAfD`)NYp02ksYJVLF8@`y}{P?1~eD7!dAJL#OxLnPdWja&6 zj=oyGR&4e9ZBa6YKRP6At3vjC`E>f@o6YBs)z7bA7g`)wa#Hojhj0`Q)p*RulLyV z$ViyqFA46cdHHn5$6wNqJ{)E{?xnrf#J||~!-M9+W0C1@&YZ8`uMmr?m4Hck5byXIiZKTPCPxDc=*#jp`E|;b{}p0{XYIeaoOu@YoGMC z{QRGGWoo|pF3{L!A`b0>dSeXKRVU*vt~_xXCUou~Tp zccxA|Yx(Wp5q_^QclXnxp#b)jRPsxZhsA9;bVAC)dN?>-RNo?z~s``|X_M zySqxekBY@^xmsNQb)(Z7pF{*tFnB4W840Jr8>J_oad@Lr@#M?(Y=brCGkSHR_7S+{(g2w;GC=C z`Fn2K{eKr8lh|tUeopbDWzu;ke!tHHO$tu-w+lRU%4%L*WmtyIw;#!>D;I9uX!!5% z`}*lmVp>1FKQ5!DpU4i!JNlmzkV(JG~cgpm(jgtQ@z*8>T6$&7QT1Na$DZSUln_8 zvQh${z0I&HKXrfm(!66mP4kPNotgRepY!)$uh+_7kE_kS$7}j;@&)~H-K*>K@6SmF zO@Hk9SM{-;(=hGK3<>*0r;F!Ladw;)ur)cH+_5J>KC+}KRPiz&}J5?!P`D5auGq*2Zxe{{xk8RZx zng101wB^4u#^G*+ z+4224e4ygNLH5(JL4l^<%jca96a6zMf8W=zJEiCEvd%Z3|4n4ezZ**Sr)y6i*`f3$ zeAnZ1)?8NiK?}U5hR2G6CI%g!_jcTDE)P*YB4DWz37u^p{EJ?NYo~`+o1Dv-dAt5V#&!oqO)1tN7o@HCrBaojrH?V!ZXI zm(aPks3eDZ*JtmKFD|Y5c{SYC_CIJGw#WEb(8lt)|DNB-xZL|_&gXNz zpyqL0<*D)XR@K(l&MCgP zlXd>~5YQCk^S@8`WaQ-NochCW|H;E<-gB|TwcqcVuUfr&_T1%*_mypNaj)c?6|8yv zqR{O>S+nQt|MKTixBjC^-ujxae(LZ4^l3-hiLD!-HmrTTBDt@x@bR&&KQ@8}+J##j zo!)MJKF=`W^_~5?Jsmq2K5S$|Nq#+_y4Hg^t!*l zp33Zgey^JAn(#BwAlVP$&+B<|x_|CEJH0pu)VW+MWTKnbEBfn6+*Lur!p~=0e=?Q6 zd^-KuXZ<}Fo>j)xd^}q5W#h7PSsA;UikO<0s;s|n&YiIQV%2=Ry^B|^`mp_7*sQzd zx0ONTw{sqg$JGShsrc;6YJDHHU;c7udf>~$3KdryNN4ek1C_nyK z?e}}?V$nGl#m-*87-t=|c&|OXZYXFBruN${>wN8=!~GVE9%!$1+w&zzrut8zZ=dal z1I&dt9yTZ6+L8(GgLr|ejcpH_xQ~fWkCpTOcmMxW+jpQr!G>nO9_4;ZE44j;%L21z zn&n2tRNYM7cy`|P;X6BvA8)&zf7){2J*(GSGyg65ar3-b=i@$0wfBagVkf5J zqN{xb@5lc)cE8`C(Pzi^;QnH7L6@$ekTnY$7A3roP1ZMD7Lg=mI%|>Vl^M%6W>+Qk z1}1m!Ju2lL^5$4uM}vYwSV))1%JTQ}`{w9`@33B1bpQP4A2#ncZQfjMZfyPi_Fc)+ zr_Y}!f1ITHBc}aeo^wU{o9d_Q>JM}${Mr5Z*rQF8mglSv{e0xc_hYN}_y=cOo1~t( z-)NhaAKieC8U7`uX`4{Xh0v zQt%}=bD~Syx$DQ-_pkr4_e_EW!<#!hg=2S>9-WeTSwM2--0<6%E?wSO_Sfpm%j@Fz z|9;r(W&fw@`@7zs#m^633$uTm^CJ55hG!o>eG2;V{ptSyeW}`E8DD;OA5F@+xr;Tw zPo`1bf8Lbm2B)7qe%#B(E2Z)0ch}VYj~^^__WB+e5YTYtN=UB!tROxTkoT)2EL&xpEt3pUd&(_ix+2-CS*-z2i$WZZX{>*YDRfzj>3>`)PuQO2o(C z@44PzVRks~Cu@3ZyQP##!GueaDvjd)ZM{|1Q!d?nF4Ec2ap3m*JzBV&lv;b} zkkcOfLME}g?H-Ty4rI-Ptp)fbQ};@wjZZr2neX)T%YA}>eTmClcC9Sq)QtVir6E&3 zYn-03{rG~sySupl&zm)?Yr9+DflW_Oo60Hd+pt04wRzrwXk~Ye+N{0#^X*<--MswJ z{?AozF24>rNC+;h+glZ}Kd*M?dQY+2n@YKVeRenzrS~UKc4(;j^&QJzq__D&znEL z|3?c;&b>{N&24-KRdxHjmv#O7JGKAuq`7l@zpMKlFgH$D`1$Ux(RcNU9tH32RPxj( zTTIi7R{Q+@*VotCHES3Qs;;asdi{PE?`y+?6A3alB_3-TZ@yPiPkyx}Gh&0s#~Ch; zj*b~O_q3k+ZBl;i+O-ISe8#M+YgU%*-u(Pr;)4l}74?r;{uKY%a7li~`FW|2PHbHK z2=2+Ewy(?3`7h>Z!(~v9on$Npms@~HV#s9CnvA25rDf@f*F0Kz3pPc;R z+6lqbYq!ng>Sh1_`WpPZ!guZ4fYz0@>|G&KJ_k&nJXyHz-$VDMf0sStG-czFYk6y3 zrl76uy|h+bOzhF0pWG6LSt|SfywYBJeHt6D)PviS#)?9nQ{GL!Zme{P{iuGg@WjZE zUq2q4WgqtN^!oi;pEc(unJ-#Yp#19Sln-HHVH}*CjsXb@t9FI8E?%rGBP$!IqUYpS z#%HwIXkv}JjD)eqbb~baTOVgS)I(K#!vtL(M-dKL$uGPMWG2z`BON;V+6oT z^-5pdA8)@U@2b?-*H@c^pPt&Vb))OK&oWDvEP3E|h4;5AzT0#ZON)c(kOSpQrfkn(ov%&G)x}-pY7Xtrw zmv}CuyorQa)Ob?ZFizohJIlA7H$-&2m$L{Bw z;4?q2ajyUJu6M%)gDWdz+4VwW64JBV_x!O*Nl#a{w3IZ@zjx$cGrNGabadLkyu7?0 zKilO4mwHV#+Wz!wPsf+Wt#dk-+_`h-!)^WjNoQ}_8&;o_*?LJ#OzhF4quo*SmE;(* zuB~XSEPlSQbaj`d+6Gt-C5{q_&p)oNNKHIpzEnI0g(?;^_Z1Zq! z-n|!g6eh2U{i}X#&-Znw)@#M@EDBwGUG?yxLmLVXGEM&7`25|wHu-)38I|4pgDl)VFXY*_nKNhJ z*iyMUEbYa&4+Y0xOUzVcl+^#`}6i++~ynYEYIiG zFV#BtcKM7@fi)3-tG;fic^R~n`S_{H6F>SqRk*R*IsRzR`t%oH^1imq*JMnRJ$-8G zT!Zp&GIQDZo}HW5d~a`6W^Vo6T_p!Msd}4QJ=^l7WNW?29@{DtwVv>QEsUDiLB9Q8 ztSiOF@kaCX&IEBk+DYon5nUP>(}54U-+SIcMPTa9jL z!Ezzw|G&Q*KYhRdRcy}c=fA({|8#{B^_x*g8J^Am)WxTn!w;X+CAGR>c)PL>!>N__!&iMOwyVd-X0|yT> z+SmSPo@J7`=5kGm;+9Bbo!C7tujfx(y;^&ker((IcK++H>KGTK_siYbmFYe6vH#TT z)8lIz*YEowBqsL8Ys&Qf`|Ztg?<|@8akt$Z3qfx&eaEY-LbvYAug$u)Mf2MF*yW!h zroEbFk;wEfVrNkHb?M+7>r+Wt_ZyW&pW2vQ-C8XE=H^!EwNYC07Dh?`+VhEP+n=qR zjEt-7Im4vZr@JiCUh~#v$%Ls>McH^H8vg$N2J+;Em%`jfe|>w~eOB81;dfDO0ijDS z&wtKr3e$~Fdi`wei+jF54}4zr>C>k}uk6DTZ%tXbVdKT~XJ*I6#YOC{(rx3BS~LC6 zmX*=h*WK8XDE#W$%EeRvetmb9ySn_nWBLbfAAn-&F^AeySaZlZ~5P!c2wkc-=-P2$`^RJTJrl|T^TE# z9k%x1nf$Z^XMK13uf4h^klFtK2j#k758cZ+wvYr{p(J-NSTx3*<2p1%8BXiSVj?kf`> z*QQ2FA%SnJI*HXI5#bm-8B=dVmH>K`)k$=P(s?k>}k zIlsch+S>Zdo14PU?L3aJr>%YRZ^P*`AvV%;7Vj+LO5!rXDInE-o$)-s~*4sC#7bZ+D63 z!x;&oF)Y#!4S_>^;5aF=uDziz`bv-`U?QZ7p_r zna|aunJ;`k-Q8{R?Y-d~n?j-G=jR3fczomBIX>O!Ee@O0&R*D=tZtHXBjEkliy@#i ze5rha4=4?biitgna$z}i_;BIZTcI(3-rFyo{B_5!U5hFsB$}F=E-ow0W?^N0sT*+m zwWQ!wappvqC8j%fR#yCZVz|j@^MvWs+wa_o>2OhsxE*nLUyy3Z%12z`*R?im+h+D< zVVFi`<s#HsTI1ZIs59W70+ItJRjYzBE%UK9Q^UgN#T^#bY**c z`LJoz3Q9_vmM?F=*eA%$5E&U+F=bNInlnC6o;`Ea5j=eE8Xq6uw}SHW_U>-))*prL zPS@API{$ZMe){k29&G8XvQv5sN)m_N`6o`B)pqAjOhi=FfrA$X`}+DmeED$Y zXGO;=gQwe^C4+zQOIVSW<_7Z(?os=}|YLR;%s z2ToqkEhs1$c=Wh~grK0{L`F{)A)DG?AyiyG>-+zA@BaSo7Wr+W6awOi+@ zgPd>pNCIM4(Amqu5AO?2p7h~qc)XIne*EgnV@HoaUM+cF<4^T*K3M??i4|9Ez|Iqe zI?w3M)$0!)JXrAI{qJw@kN4!KE0~*yYyZ6K=X0Q4zP97c8K2hMdyLa~T$Cn;eNqMm zM;T9xprD}OOV6*bt{S|2+&?w%^YvxEGYkrqf7VTWv;$O`A4NoH@0#onP+3rK#E$wZB9T`Ogh{DKSkit|`ve zGFnAYP;jO=+aXXw;dyXs>S_toG!Y}Cc`t3>&ooX;coMDrWu87LkQWyA7=YZ(%)y!2 zbhUns+t*iDzs!1nCSQUD6fB>QLgKB_gqQQ+G~eh8yF#_+K7ab`SzBrSx}zrqd740m z{Cu=}A}Cd`O`AWzf4^D&A%FY7EnB{ntbPCg?Zw50b#E$m?B1POdmp4`SxY0>LgkNN zUIypf`67O8ZG8KbDaW7Qn%>;Zd{5$^6&tS%M}2+0uB;-+?960^o{o-=6DMry|H&*r zH|OBa;`G8tM>vlhJ-&L%x-wn+l2>;)b)&bqWMpWp+Ogxs4-ar?f(8s+TwL6IlqM>e znu_wv+d6r9am}-@@4NGSr$8seZm+2c`T6|YSA{-&`<7W;Jl$Dd4`f{+#5z#8b(~>J z?^OW>4hU~P01gRI8WEhy3JF<|suMZ}0&XCWfpA(Q#B(4GM%<7T1=2AwG6C!hkcN&k zOpurcX-E+RHOoNCm6Vi5tq>dysE&@&6y@SV_k59%`hrWr~o*jFzMZ$gPWde3zQm5-Me?M;`!Ua z3@M?c7l)OUj5Kq+S4y02s(X8Pzx?U&HB;aqvRBlgpBA&h7lk_x~|pdipK*cG8Ilj#^8%Zr*xy%}nDBRd1tQ z+}#h~J}s?$ze;%CJh@#~F-nWLpytJD`Oo*4e%ZODx6y#v`pfyml9yLFd!--_BY%#;vTZaDr{64?m1n0_&2~LbmjP^PjA?6W&>h^Q({3@l~$Ezp0C7k^9 zR6|F{qr3a~-rwIRPMyl?&FyVrabt1S*HbN$@^=c_*3x|6zHxl`?!Gq4^t8>n7cV51EM2N- ztIT{YEUaMF8*3r|Eu#DSefsaMtnGMB!(($?Gi z&7QyZ*~;~0rv>iMUzVFv`Qo)r@78&%x@%{5-A>Cs74f@i*_HL0Iyx>nZ**1e?ri?j z!xPcrvLa@uQP#CJox7s;wMlHsdpUdIxlpBv3WkQ97dIMuczd@mU8-tx=dPf@gZ`{} z^SmzG)z9me4h-B;{atTU@usE6U%!8U{$?z1L!$xnNqr56v$ISMD=skP+}-B9tM29} z(F_?87Hezky)y10SA27BZ)6tN`^VntvZ%ni{y*D```h(zZOdG{A<%PIF}wHlwG;HL zcUwIEtT}&WiOkHIku$98?Y!g;&0fF1?|{SAG?AOTa@qA__vysS*<>gja+&v(j;n|J8#s>+H5@%#6^xVBaM&0FovDd*44-Cby86O(B-PfqT|y|vQ6 z_FR(g>*LdUZ~y0u*Is%1X~U*1Q~uf8Dl^x=zuUe4`#bltvTb+X zcCS}#X6J3{?ta$j8hd5!re8JF^SgBWS$lSx$)=EpGB9=vZa~~7rQS^^SyglMoE$F5YLhg z502_gJlwXg>#@4uqmPf(85*WcIeuePskGakugm;CpFex{=qFL_kLM>UYvszz$~M1v zA@SzlZbr5GKNEde*%{Wqx>~5M=U0&EC27hfC-*M(o&BRE~lT*$2!~7Pdzk0gTS#0Y5uyF7H%@=6C`1GA^8#V~2`?Wnjao3^7~m?StEWP*Lrie-eGC-sWWE|Ejt^%vHJY|9~qBawq#!qdsn8Zsc9s;@Y0jN zwiXs1@3t+q56;hjdf#zlSCIdci|#)!w5&T7;`zxg|AFi6jRhCWcYJ@)cC3)^Za=;H(tqY7|6_Oc$k+dpd@1=Uf02mxzBZXZ&kgMUePG^_dDm<0pOVP!r(S(t zx@`H>%3hsrt6DebZOX2$u0KjY3dz_Ng=F6PEUvGl^vNo%?(fzTjwLNEE@$T2%YT=* z37Pfn(o^k@J%!Adm-{+rY+j}%t3B2KXocA&7Euu~1_rIrO^0uk-xvLp`}&)#$F5@c z^vd+Kw4_&G^h4fNOc#-rZT7dD-L+#!#mxPY(b1|6gzF|>adkxncqKL>^|ey&yuNDXO`yP+9SIE&$be{}oi=d12S z>dYH!*LlaV8Jv*D>GxuL>)ZDjs?!@T)c~^b#^0i|# zmhZcz>s(j=YTLx83)g=(xmLAG?_2JZ)f~BHl`lShzBEPiYqnPCCijXTnrD8Lh0S!_ zFsZ1h$e{cm)0?2jo6Sq^UQ&0S|N4>Y=~FySqSgOw#P6S**?i@SiOT)G-Tupcbd5Q} zboBM*Ka1(;ls8NaIjnw&XUUVvMr)(CIdnfuw5Wfm)F3WCRrU0=#CvaUM(qy{2?%JA z+?;m0WS*_for`;;%~^h!JBW&li-?FQ>DtPICTAWlcAq$FmfBr2V`E|C^z+Bg+y7Dc ztmTohIjza>{nU=^7gts;zLYG~ebl1=Uox67v6B8T1^za-~+{mz;Ge?H?wRPE>hRF|?FFAeOf6kE(^ZOyIedb#f25q>r(%F4x zZb|Gi(av3!!Owm$G5vY?_-${~A*MUK%jI|O)R(`hr=@l1&QI;9;%0aw>*efsoi!lxgG=jK_q*Za>AuyLyWaU#%!m(#IYwcPA~#NMc9$2~tT{@&Qw zSg<-uG%ReINBuXRjfUGloPSuKqIaQtx?Xeq+NclT^A}u7U#Ks-ah}NK@Shi27M==m zbF+GOX1;#KsU4Xf98p_y7~|#TZ```I@5j7+^#?aT3LCB0S`)cjEHpOu;?83C#ixVk zzn!*lpMB}=6Q3>}uaqjb4Q2mrCc69VwJCb`>pvMRt@8~E68d**i)VrG_QC>#TU+v2 zJ&ln}X*tOKZ&F*^g@qey9IXVsE z`OCh%x+v^ByY0Z;v%Hq)=YvLRcYlAAXU_ZuwiaOGzPqe@DlX-}{q?n@yMOw=eVM7L zt@G~gRx~jY$qQYrWN$CO{n4Wj-|y|+QT=|ONp4=A-oHP^y371$uew$^>6gpTonCB< z71mb1?KPh`bEax++^5^?S42KeZFrvO#dU1IePBW3oIe-cUtC%``O@Dyi%g?OkMq5! zKR-LO_rU^(*4yi&HnZI>e(^;5&-}&mQbw!t-Jb#}2_gJsd{NlxKyc-Md#q7*{ zQmfC%`0vMy=FSgaKTe#ztiq@3{xluIDY_FqTHcH6IW)6<6`gl|-rnksHAlT>epQ;t z@%Y%j_ItL~CwL>CK6#RGa?{fv-+yo({AIYtMR@RE_D;Wnj>P8vFKMmKM zXH(fVF~5JJ-fj!)$LFusA2{VDvHyDMOuc0leRIX>+|k{`k1RLG?YGgZ)ounPw-QTyKB+uASB^HM`m0b|%E$Hd|}> z@$biiqM}K&-E_o~pRcox*qYXxP@9n8tTRJ<{~od1drGCRt&7%=eRq91|FM1F`!1QN zPW|Uo{q02`zuKPl1;4u@{JTJPz^FW2)VPk&$T1*-C_{FB!%f3AJCE_{ z`_GxP?nT@Z%-7dH^W#}|Md*69&)e6m$vHDiySjK`%B}o;|AO8XuvJ$6jQH~RyODqB zx?i=d>=&*Z?vu(?Syfr_p!eZ=&TD`7Wr@zSJ$)rgPM^*Bu5QHle>*l-B>%|vO4r%A zb?d>|`Fr{TmEAb5wYSfoRBgWdi9-F$my$as&sp6L)%=XysDnI=E@-mG#8e;N?Z!dOx`1N`l=e7Gg z1Y2hp$<6oo@|yHBE^1pwU*+a>&722~;=Pr(&DL(rILLI6VYW~wi+A{%3Fq8a^_{ny z*<-i2TC*nW^u2p>lkNX;^ftG=fB(PwQOlWa*REYN@-LWcx%ij1QTqA0!aC*e?s%$k zEbBLlot787`@w4cWvBnH^ZIvSchI6a%=&eEzP-Neo;l&h-MhT;b^mrgh?z8L(uW5N z|G2N|m$6lg$h&635^VoFBr#o(K}Sc&pyC2UkGy%<20J4oujT7AR$kj&^oud_<7$9@i8@$(^BAQ@iKm-9@cj%?Ss(AHTV|*m~dGkG%`(fB&h}Gt0ZR z#9*%BRoz(QX~m@l1qbfj-28;?V1u~7Mx9lrk&d^|w16}B?#UIW)vhk^@sEy{uK9A% z<;KlhT-V(1hS+>$%VcLxbX!ute_xZ=+?g{qJLXKke(mjT*8W%9axY7*|MG5W(XWHe zYzxYAAL^L5^T|)Uxh{2OxbXV;aJwDfT7?d-6H83YxVWjc(2=+q8JUQL}dWMrZ4r$(O@th8?+nT>A0xzNys@wcoxBewdTl*ekViO8f5J(pKfK zIMmhESyq~E=>Hd*C-3iPyeDhyw&C54jgOnc#dzj|+Ca%a{$0sbHeGuDv&k`d z8)%!^i&vj7wHR(moV8)gmLtzEFI(g#Dn4}^KUYqRVSc~R8ta-TD-LCMY`mgdYcQ=? z*0#uH=H~ugyLT^ijhJ!f*F@!eO}lr`zO=>9&oASyn?<10CE1_G!IQoj2&B2JS-bY* zzaNE7rR;pNmofy-U7BZm`bekn!=}>weIMJRes9>YVM3+v$2U8Rjl@4pQ1fLu9lky` zc*pskp7bW`&V^@ZEz0!hD2db&JAFniGU(+^w^^B)(|WgTDQRivwk~_W@9(x#y!s#h zTL&?>^mn+sa_{%9{JF>YS?<>5s`)Z9I&ao)OHj*pIBR+??L=J21Ln++5HSnMpH>Y^k#O+U70X?Ok6c475|BhmSbs!V^D zuX`fc>GI-|=MSy2NdMwj-mdG_8{VC6SL<2m!~5ob{KFs4U0+_@uc=i1&|%S> zwfAkl-prFc{C&Bf^h(XzdCLv21($BfUp!~!_M5jBtUm88eC$G7=A!!hb}J$mw?$=E zeSf3*dCSF<1veQsLo?OZO`Du!&pU3?gh8pS&EbQ#c1{)?mIHZ;Dc5?b}F}qoDRvgP$W?xrgvDX5Pswk)?uh$e3 z5^566-`A+WyuL5hTkP@gR&JL1{tkg>k7M`lIu`uw+uOfg2|ph#{Xb#)^z{kZivIlk zGmk|}W@l$t?BG1EH=$fSKt*VwclyIAx0Z)g*lzlwJ>~9GpVMp48|nHl^(xD_7V`D| zsngyTlVAR0X8-u)WH4(q_sU-;tsW{)yz%j%U_IQ%7x?o=*VPZAWp|9O%=qXrU8~BL z@k_9sN#YBmt9z@>w|?HTVS~f^xI^k|{{4PGDe%e4_hqLi+@HS-F^<$#EB#c+6?)QW2P{9WJKx z`{&i5pD&Bt*%RedkISjvO;9+)(JN;t#K))q-b7VJCF%XXzfW(ar%d^vDdTIseBL}c zqvRPj8m32AZ`~?7%QRap_T1UCt}!ul?);72^XF5$(_w~s3+wQ+AM@@H^2t z`C%$snRmbOMZa@*MQW#IR=&ErcJ;N%e7RnCeZ9_~IIui;`J*p0H@kg~YH4oXn-F<3 z`{b__zOP3_PPMC@3SL%ITXSXC@A#mT*&GaaI=X@?oZaSEO6|HE6kZ8x2YWaNeYNr3 zJ8x5duvu~5=F*>)l3n|Lo7&xr%d!uQ(b;k&U!9?2kD%)1c(ZA{mhvAfTK6vRRD8D1 z$xB{0#8yq+R?;x%v*fEep*Lqw*tc_6*ufVQl|S5`wDeNx>udQAufx_(Ij6A5Cn;!A z!q5A{>Hz^OZXP{#Dd+~r)H%J2BO*30vnYMFrNmOnC@4*!dSgTnw|LyWw;6KZigGq? zxDXKY=l|U=pzfWD+M;dq3w)-`m=SSMM_V^)OT)G)az2~$?(X8+rZfMD%ERCHzrMPD zxguUnOpN2h_vv+c3*Xm+F5$eKnl=;xKC$W32{`{3zu(D!1(7o}! zl9KYpkb{@2Jv}`=d}@B~Y%$5y`F^*mcKXXpt5y{jGRKwlRegKW*WCVZ;=1ZTKRBPA zi*L{hjk&PNmD_}i!{P0%x(^>eUOXwA-09ME=#bLPa7mH;^uB!C4lZudM{=e>{NlR?%lqym$MZB73Cvkdb*s3M> zR?kqqnU#4b>k=>9p`MWbcXtbZoCthr;kmQ2GGb?zD5%qL@t>Tn&_1JyQ>L^mQF+UA zX!`8w+MCxEZuoHS$5id`RJqK3rP_W57iv8wPtTmy!qKb}zAk1mXN#)~7yF(ZsYP?I zD={i8y`rrq_ih%e!qv0O_xNwAtgK|LxOu`p?4w~VxA$E;nOj?n(=!!#82skjEjAD+ zdvzxAVA0EuvRyBC`%F(;ol<7*dTifsz96}!9BE#xaeJ|S65ee zFF4@F!N=tkkg&k5{2*w0W~uk|!k3>!@6;E_`_EstXvGQ+F)^_X+t;&{mzQ7p@YR*~ zz7z*n&XQ{uhQCtuzPj9h>MZBNYRh{u zQCX`L1kyky%bAxkCk-SxjDy6)#476VMAVr4eCi{<{QR7wNB`?7>U?>+c=M`ziI<-E zZCs_Jo6>*q?p@xxx~&r?OyGEMR9nf?@;ocE%(OWh4<9`mX}~?L{OhX^-##7M`};d1 zgZRJQ4F{WBnm5Po`eU?r?OI-@Kc@S+gQH#=@@cKKG+4as=Z)L9wQmHOE|q6IU;A%Q z%F(skBD{&SD*_cbaH@4NXo8{irs#vsf$)7(pcXkN2N}Dg*koh@m$Ij5B7ZjZ@Y_2vxC~~{&&faqQ z*Von`UwQe{@nqrdqbE+CatjOFwxy3L!0PR8#hKo=7eRe*#Zyz9E%&GY4!ZyO^PNr1 zuDi}%4tN{pnk_7H@i?eot;_w}>{jZj)Pq-Mcu9xd%k~hRuGQoa@iMz(=M~)pd(KVe zXtC{}f%_E)i z+U{qGm%1lL=o~xyBEuy6SCQKZZgKr-H@59Ob9bYd?yThF=VBQeq|Nh`jE#l;{Pfvm z&YU^p%{MfdUIl3&2BdnW z1nzskv*e!8lv!b)ql5M7pQwB5)^!yfdMoET>86g&)5GiujQ@{<^C74D#X*k`dI&c zU8lcAd$QMdE%S8(Mf1y|BVS)%a)`*vlFGYVW!bQA4`cJ}wiXZOM4?WWaOHK2V`pDu zXjn1Zob`6wG_Dm>!e5@()(?HPuyocsjYeN-~~fxMAMx+F*cRIM83bf z>zwk0cjm_Ao=(fFlaqFVI!GxqPw77YK4;oAwTNw-HLKU~#Xev8zHIfPZJbLbU)l67 zowus1R{E~t)=ddoK5Ka|e>FWa=hZaJx!RI!%!zL2E?#7O-z(YtvwPp{fQ*RBCBmt7Lsy(z4f_HRh=*QJ${^@{C?kG38RV$ z3GzuBCHDW>7I7i6q;zf5dApx12OS$z<($1vCI2b@Ves$P9#`)4C9%&!{GVKO1C5`Z zzVi5Zzo{4do*k7zHOwm`QlD>{|K&>Qyk9xndH()=*}ZYj@`bNfTHV-wkv~|2d)a}A zSKF+<6!IEQha|?tKZ})wZf(m|mWYVa5lg=L>FERy6|MbJFJEitSWKE!Qa}C3sZ(5u z3m0B`+S1~Z$z1>O(&>X-%+jV!!7E=*ZxnxAH??N!r$0xzFS(!9pXw36*^RfND(m^x zNl8oX*S8#TS^I8(L~ju9ueY~3pWcdpvo^XZRbT%pv-9i8bJyxxZF{c(YMmW@D)jis z-93`M>Z)w(-dx(b`I6xWp1@^aPo6v}xc?eH&zQo`aL3cn&Fj=@>p-Q69Hm*;FILp=y0Fl>`rxOP!ONHa=eMto z+L8Oa%P@AFOZ7hVN}0OMwc2|1)N8*@g>1rS z*Unqvd=)eWJbmSj=8-7Qm-x?@GV-t87Txym-T&26W%(xM8FnIbajmpXL46m-N)O{|MWLJ864yf#JG!TCH_-$*Vb2}G! z$mr7L%c4sJvhGCuc$E-x#kW^)*Goys8@qDZlai8B-$k7`ZyvFsMpuc+&~W34lP4#x z{BBEpR z!-to?*41qdxP9Kgj9pb?l~1;l(nJN-r-pj*JDXy6e^2<`7n`+oef)ko85tRt*Yj+v z)gsQF5ZK1L&(1DO{`pJe^s9cslOoPJJh&Bb@pY%&sdhD<*kvk0oPKk7^sAjM5BYO4 zzgC^^XO;rbZu`z%j(82uZhc(=Vm^&4w*9hZJyMm=*Eh+LP>9%`dfRMkf8zIdwh^1l zbk*w3Sl93UDAp(UH~i(dyu8rB-QP|(99w#Ndg0Sop)WVB&KAA0Dl|CpSC*VyllxEo zm^~fZg8Jugo;%0)?;r0IRb6p=`C{f@mTzjrkJ{+T21>(?B*_4Re?u||#V(v_Omyw7jS zO4a=HyV!Jj>prDsvD`l0iv zxt!N9<*ru#eE+*&MEA-n9!_4J?er!m*D&u*MDJyOIg5Y|d;TAA-1=_Hk)ubGug}}R z^t7d=<%f@7^^9XrKhuwo_3^Ci+50=buNBl^=r}clZ+mLD!OQ>2Ny&xZ-ki4XUwC%b zsy|gLcCqowC`8y5zmxg)?)LhkUyI%UyB_&E-G6;#RMeu-)6h*qJ#1fJYkPimdKoTm?0sg^)is%yjV_z>3g!iW+Inh3z|G@rTbDZj zE;G7(OFwoW)9tc1I-l7u&D{L_gZD~#xAk9MwXO<{P2H9&C8T70?&dMy*&CCd$~R>; zKdqcGsY!qTyvFG5k62zG?~z)1sluWyV6z+VK?(ln=i&uy-0rQ(R3<2lu|0;cwF|6tmB<%-E0y^qX$Bl7ar-TJM!R_VHM?G%1riA6pqi+`Po)QR{a zyJ^#=sd?q-{U|EPk$kU~~GZbhdqSCp4Vj|0Br2T8W`Y>f^LSCT**tpT7N^IccBLcIA|cu+)5~ zW6$PZTwM6^QGM3`9U`4BKYlFc|M+l;=cVg*T-@9rAD`d)6cV^o{xd868dT9y`XCd|!5P(7vy)uQ%`AyH}xsbx#G4jmCzFO(FWMKg=8E zuGKC2{3+$%HH#e^=ZM@&OiXM%DPP~yuU@b8V@>$_pTg>Xb6oz{)e1;RaFm;ycep6o zoIc|c6Jx_CZ`l;Qyw%^LvSP>MuMgL2o_XEODJ&o^ufHSX{k_lT=jK_r*VX=Bl<6TH zvObLW+O=yZPM&m3N)kFZ$GW}t_jm4PQ`s8yVy!Y|bgoWc7i;C6eoa$LOQ>Brx>J*sAT|{&W4A?v6TTp=LH7mxRS_m-;qD=p1Wq=P&&Chc)N^#^7h? zK5ht)pL%nD|90_NZ7m#WkN$lB!D&QDy9@J)7{XeFA_4Rd%8U_MCS$}r)_BtPKW0bJ-`8MNf=)~8Z z>rS_;@dPgOTJ`K@XM4XKBZJ>uyXF%oq+eWLuYbsC_QBJqxwn~_U3&jBrNV+w=9l|3 z_Dio1w=c|#y~=*%syirQfE#gk=PygVUb*YW_KToerDv|@wnSd$KZ2#kQVa$E4!Q0z zue15}^=-FUV&aEyAKTXU@^0E(JYm9&4q(^bX;Ryui zRTFSt-5|kX?3kAqYFKn+cErADHYfL@jgF5W*HNCpWu^}wJ?a6CgGz2r=;4tcyF~65QL|w4vZ$OvvXiA=Yc#+pV9SowxLoFsErvEodq!V@2YHgbNM- ze$?C&xpCu0#+11EF|n%^w#{7f6i~W@P*qVNt&?;ZpY`Bje2< zo}3KcDVwIPt=&`oK9=XregB95R)?={TffYI`tQR_Hf#|1E@yLK@f4An=aMd~`F?oY zlOJ%>@9+72=e74pJyadh)XjTxM#0v-xgmH}i|3Rr$LWWw#pt{!aYl zF2Bl_VXNKeEAG2fPrUb^|D|%?u?TjNuk^=jvny(MRGB9>h(G?m zvKTGc9ttO_ow{^MNcdRqVfEl;SyT3ft)2Db>2vvw+28Nq*jXJu^YMa+=;(#T$NefE ze|=bVyh+3RrDg%+0?(Bj4^PQdQm?(NrkEw)z6>;y6<`04v-;n??%3+G>6VLU?A>cy z_5D?6qI3I!d-vj=)~u?maIyQQ3R?@1@b8W#XbwB)-X_-X@-{lgzLzHm?D_etz$9bA z-;HZaRu(V!`|cL%ovbVGM*w;?a^u4;~VYll3zg^Dl{Ry9^>874DQ5EXEu&h+O zN5;@8F@5)v28Mdj-0qr~tzOSG&sHcV`Tiuy=F<`2P+#%h|2{^jujLi)bg4-GQDDNE*JGM}-79`-$dUW|8Qpp% z7G9j(_-h@g{+X%{E=mkse(qfA^dhC~)925HZ-12@Id(+p=RMn$^t6MQE(v|><6H6U zW#_KaR|*;i0WTlFf3{@70*33#%AmEcyT89veEq-qzqOU+!PQZwS60XKA8d4#vb`BH z$wkRACdOt_-aVJ3Bq5`DsS5h~^54EqeGqn)cWd_Vg@pwM=~9yphn(6Hp>yo*ZO)F4 zo+F3b`6o`B)^_KP&5n@5w$;1hFYVx+E=D^xH3f;P`h(U)8|m~3(tIaOgyb&<&?4)s>#KSdo7udk zzrMCMTJf_A$N`6ikTzn01e9VQLpCN2$W|N3mV!%1-nOvJu`Cw*{_g(q%U41oBBKr- zJ}leVE48qAdEbT&33KLmbaZ&cA4xLo>grl@T4^FjSlF@e#hbqrMnyy%xOC|fXv4rS zwNvM(dhpZ=xVWsU`l7*V|NoctI#(BsJ88eKo!zi`>($4Bp!MuCw{L!aF8SM?%1cid z9B?=@-}-igyUKm&!k3pt=jHBxJlOIbyn`YCnD`=fr6ABk>G{6DWh^Z%+w4TZfu>~S z$kQS?(euQ)bI0aXewJWSUc{xTuFmf2nl$%WVs+6o|&7^}MIQ<6eYM^9W{+`NRF=gx_V$*}iyXiZqZ|CiI!w@JzQiIEYFJ#S^sS1)S2IkK7X1}VEyp_&lIKo3j9;wXf0f|T086K)u#3R{eH&^gu0J{ z*5S{!E}t-UE-!m^HOr6Ri^JB=%6k7A-|GKchRf4a6!i4uzQ4Qg9u_91qpS1qK|=ql ztE(4pn=c;|yE;Qx-(mOsiB>$JYFbLgKXtywhFvx`5|EW`-m=AHNqWkGTc^1Erp|p3 zdsq7FtE;VR*Y<{ex)^TFGv&YWmGs|B-ft7Q5N{nXC?X=FV5KJ3FK6rIcFg$6)29b7 zo@6}dH#P9|dH#KN_pElWyWiD)_-zZzlI7_K4jp1TH&uIaTCdcK;N@mHIa`ADc~6Gi zDsjFN7<(!FrcubJAVJzIO< zxSRU>FU_29fBtCi3XMB^tHp0x-n>+H=Kg*8dGl8J-de;h`mkK{r95+@=#jZkQr_Iy z$^G!*@)R~P{gt!Y*?)a~-JKV^`_R3(zc&}ZQ&CTTe(tV?q})0ad4GQXlK0nmYvW$> zy1TPa{Vreki|5>KvK zKN}~c;@IXfLH5XsyZL8tREJCr$_<>Y6=C<9=VT^4gU~mqc=}bWUFG_xRM+>`4VRPBx#v zo9DO8u+HCiXN&f9{m|cu;vWr!s=vRT-co6kaPQ8}4VyQI{)}0I3|JJ^MsZ({$LDOZs%HMW1 zGP7kY6?Xd-`Psl|($C)?h1Dm_n4&UyUG{Xp7q^yrw?4mKHhZ1stX=Nj-rgJQ4zn#; zp6c?|%>(<^y-*`XsxT!hj&O1l+^naIkRoXWw3C+QuixBQKxNkUxLvtp#tZuWpIC>*eWr^q_Nl;lm`2u5Rxq za`CIfe0k)}c=lGcNL=0g@mFsFXm$O=^jo_^wR@z^#n$QR`PAg)$$gWz=?Gqae!+?r z9(lLK&Ndt7y^*M>c(G3SM8rMs&csE12Fl?vF+H~R?~XoPTwiGQFVu@`+y7tEegBJ@ zHm99y*gt=L*t*YFs;u>YeyabotCI;{?&GxE>`vS^V`JkP?a}RgZv$guno3_^fBb6e z>pABZzOYf6$YEXf?oj;kzVI3Up1r-jqxQSrGQW8(d9m7c4b#*`xHjhgUT;zUkZJkj zi85P2_gIi-sFT z<)VXvnl_vc7byG5WhY}NqU_%D;Lp>r*>5*2I~{Nvlt7lAFWaZ3p{I9j{rkV>0rIft6vG9<|Cp%?^j(-0Gv$nqe@aL(wt0yBvW#vzcU*8Sq zSQU!}tNS1NfA9SX&Gj)Wf3L~Bq~eh&6}$E2)TJ-0uN*nTqIh@L>Yx2 z!p>~`htwC_wM||6%6?Pv!nM^~d#?WfuTlE*RA|nPFOx6z`7)e1apK7N=Si_3YVd}fv{`^S%*TFbA7NER-AZ?#Z2ENt3~OFM;ym!C`56zeYh$MoBE zUwFU3&f{TMH-)%_mwvta`udE|XKnoECS3X^Z_(0gpZlz2&AM9;KV8vvj@{;8mCapx z;aoUt{ymP3B|p8+>3_PE8NN2Q{c`%bRi$rd%!oKM^LuWqtmsqDR;M+Q-);G1?N(hg zEj<}=t0edCV&5hv&_*w{yu-_UPnmd|DT~zwxPd zn3IZ7p;cV``D16Jw}su{410D~T5;OCh{m2C9~JxRw)Okw1t+RU%sg~Rsb+gsuh;hl ztG?Vl_UhN%?hO834&$JsM^z(sC9x_gFP>RZTwGl9;ot9!Yg;(y%$alG`R9pK=l1S6 z-e36d5Nk?GidUbmrsly-qW2Rox5+!U|PI+6RB0t4TaR@lhh+ET~AHfmc- zcQ?1rnX?n8&u>@n^yJuGBk4a+#pw9|o#pat)~qquP;Wo=-~5Y)h8*0x&m8&r^XH+n zS4EGi9c%7r#iH2uXEo&SGY15Eh&j{Wwk+j%|II%eLk)D@?{dB*21)VuX_)uZim zty8TMPA}_XWn(+Eu`GAStXT@$>gpUCpgV(PQ|J-%+W@N<1 zEYZ)4ZrWH#2FVAyC@8 zzgXG5rp3Day|>-|D_2b3+}SEUS=~2e*82I|bDbR>8&&S?C{(Vo$gx=dfAYFl)AqfS zjop$jDLL~;*+Zu%&z>251l4GFRto?5`{zN#ZZnr8!%LSh3rdQ%c2EB|wI(ewae87_ zmeTtxZ0|jjl-9-XSLD2XXxR z_2u2tFH*m%%;NS`aP~iX#K4f2w(N!ECFZlU*$%a$#BadEG7)V3VX^n|M>C8^CO%#)&HC(g=vU9`hLGW z`Q9DNIiHqu)o$OotM0kdt)tpPS~I8k@LW3=yZ`i;mhIV>*@TbPH{RNsebP5LB&5Z* z`un337x&Nn(ZEo@=4am0J0{j;ZzoyaJAYpM@-m;W8-@Yf)Xw`yZ&NTg_ZK?<_~VDa zv#w4mWqD#*_lRX%?*Gtt_oKGvG#1Y9o4PYEtZdtvMGLyl9e(`LAn}hl*YhvpA|eT= zujTIek}n}_pZ7+BN6NzC*^f_8re1YdwmWj+V6%wciKvK(7H80&<;G^8n&W-42Ib$v zi!NuZ>bbJ?wG|`7$@BA)4^5w}lBliiEn~MK-m~k}Op{WnNt5o?ddeBrNZ85!6ny?A zdi(#TdcQeSTCB_eF>GGuKi$&rdg{)1?ec{$FYTZ7;RxsBi_63P^Zsk@`CGd4eS@RV z9r@j5T7Qg|t=}b8_gQS(+JxI%KE~Iy?b}78Gv=&*JHy@wByKlL?zpwA$o1OO!3T1C?Km0^r zT`T6jzlzYq_51sikFSgMsYzI1AGUtV|G$g@arJj&VhxIqmHenUoxj;dN$}s_??z_- z{}^xn*1fcq)hz#B%dT^?;%EFku<-DWzsKb~cf`-PllXr$ea_|AkAJShV%G&pUydc=#Wy3&h?ut40m^*T4xv*dn!mS_xjb} z|NkCu0qw@BtNo>Mcjd*CCj~$6|Jk-Po|TC)Zr>z(S%>hq8(z7N zqT){aMh`*ZoBl1FEB*;%!};gQ9~Lmqut>BKmY0;|J$QM!*7JjxH#1&a7q@o9;ze&} z&9$y?5IsH3$a)uOg6H|Yy;||Xw|kcQUcYMl>gmf)!^Q4~h0^uEIx7WrCr_N%nY;hb zp(C{)e_Bj+OPc=i%ayphMlIFu(Qj|h-Tghq>Y!WyFA3p&KVlNqB^a)(NNk^Zd70$V zevX)uH#Zo$pVzN0F+bBMdn@_Z6-}Qzv(26E?5qw?l&ZCt&dtf$Q1sJi=iGz?w*!0Q z&(6@?EGGY9o8Q`qZ6ObDrHF|=n_-q}q@#NybK^zBE_02bcEzn5cU3%By5%mL==S2k zL*+B?lz6495+D80x6prM^XTxyj5|97h0CA5y2`cw@vBEok;Z8U&YbDFTzcnj%*U_c zn`i7e-v78T{OH$$J9lFY3;$H??A@$&@BNL&%SkJ0?BoyI%N#pmTREv?kIm87(K1$t zriHeDdwU_eb)s1_J8#2u@!i39Z+?C*Dx>QioEjqNyi)kqx4PqfXU@5Urv296nZlBq zcX#LEHLZ_cJ!)d8x1afVm3O4qW!G3=|McYIG$P)c+2c4eAn!bqh+09zEha$6#LZ-nVx*x1T9l*U{0g_4MGGGa|+N z|4Er*`}}_C<40om{LnYOJ$v2h>Jo?lbsStgQ(7)xx&+#*KJ)Rm zzn{1-J6>D%wfe=yz1Gidrd~_~N8;?awWQ>pI>)sry#?>|JPSC zzR@?oxbck#OXc;SId_(8z3pOR@SSZk@#f5TcOu{MnltpsnRfj=>KEJ0&iABd&HnZJ zXU^PUPpsPYNB^#+`Gw1sZRUJlFEUF@IhALnUq*DV zRM`uSsmHs;pYs2nUgr5~$2{BW6E%VB{8BZ2#Y?XqoAvjrm9=(v@hyGzp5y=Q{~uU2 z^|WE;BbJ@}8(yuF4Re_aij)+N+=bh2{an>_{Bh##^RqvGe&##Fs!|A)?7zM`C9k+Z zqjtLAn>Ho?$&*7*9X{~yujShI@Hmg}c?IRgsgDk=iwP{)@=nrw_PW>AQ_eq6{`F<$ zhE1EM9GSbjfN}f#J<^uNPhXj)J5`B_+5wLBH$3knR} z>TQHRKd)_G8*TRZx9RGc``ukOTrXT3?*Dde!S8Rc&bH*=-`jlXkP@r=<~3_{E-tEk zy8Xf0$8U5l@6b+8OJhrSS6B19sGrF%XOnR404V+a3_9u>pkUo&Yi#VDwlTlbB-BmR zaEjGJ?Yp~5QxAo&kDYA2bn%{^9-lkAirs~teg64l{v6j&tD_^QT?~yaEnIoL#ec3{ z^Oh|otnQn4{5iCIbySIpVBuew%k z&fK|cgMPico4UL!yyg7!#p(WKUyjVR?pm(+a@NKzFMsWDe{E&``1D8N89O#(AR?US75+&6j=ZXO@ipc`rZTyO{P{&DKa);efo{*Vm_Q!zAnN<14Dn0xah$ z8Wbaq)cyUE}S=y*P?&JmaU2F1MB|oJ!Le- zEG+zfa%WzE`;3X5J!$Q!+w)gPEsi~Q?HXwQ@bCY-B{8XS|CAQrJSud1d;amtAKOjp z>*H_S+9$mb)PHYb$@_du+B|E?#JKYE@~hWpZkSk=AtEY%+SYH^nk%^qudftNi&TH0 z+WxlP6c)gajEpOym-nf}#Kbg7n;)LKY-i0=F5{ftvAeewiBDRemm297Ub=Pf75({< zH*fyPIwupeyUtnp_1hO{MUhSA@ngqkaZbPgbiLBMygaSmMVjj)FE8`4(6W*`dQ>%Q zuJ>h7y>Z?4*3QrDFD~qxt1@Te#LoD#KW*`Kzj-5{TJit-`m#ApH)_RH_2d=NQ+Jhb zxv}r4N3UDn%4g{e47vBJ{oii+_2lW(qj$<Q4XpfLjr91XG3XHR~ z7k5c`&AlLMH@|atKxyLrENF1_v%)Vh1N_L(z2s-@%Mzpw7>w5bjX4Gs%tvMRN<9^&f1 z7$O;ZB;ZwxUhRkd{}ZpjvsYQXXHjy}#6NF#-cfwpFMr&4{_f42C!bk=CUsSEB-5_d zs~HUbeLg?olNIatC1n%NoH=vorEz-UuQQPh`Q?QY6V6f zpZVZr@SVNY{N?ZO9`By6KVjay#!HuiKK!hSh>ixG*!=bG-N5^M?V6aFL!!9-XKmiR z`Bvu78oO85R-WFoB|SAo%Ef&KDBJIGfBQB&;n$Uw5nEDLp1JSi<6}_$jAv%-^N@x8 zyOy4=cAx!rcFEt;RSAKmsY{k8OL0f5S|^81+c&>Av~l5}SuOMeNC7hUquu9>mDtW)G;JHTZ*2A+Foc^|Q*Ou1Mqnn@We>gtR_Kefhr=2cJ zPo6$i*4LNs?DU*eQ7UGrpB#L0+qtM!Ypaz_dZs%hXI}nV+rKU6qRiT;EeGE2ej^nl z&nMm1HdV%R$?087`>Wk&b8+4Hl^WP7=rV1pM|9}R-}_c`^(^gGJ=O~Hb%f5=eZAA< zR?XVS=bvS1HIeOk@9Wt%@7w{FoQ zrIl^3A6QYYfhLQ{qyeAlF;p6O5bNpF4-$Eb=Cf9%XYms3r+pC@BJ#KV4J`>+>w)TGWwn^J_2 zrFOrV5up>cDJ0FXApiZbjH{be@7%qUketoD(Sv7UK*yFZC7=@)Cr%7Bdi{8%SH#I` zRb%7HoYAwSkNq+|c4^t`-*UF4&vcTKMvG3HHtoa5k8S<^+g0?;&H1OVk2!d+_V-NLGeSc19vnFt z3_6{tm=7tTAM;TWN_^};d#3o$sI6H^-_}HC2#G`_{+co+WR7+HyiESkiL+*{3bT5U z`#bnsv&&4WZ*7KBhazs3)ZSZse%}5A`POAxe}4B%n?G94Yk%n6Ilr}^vv=pc{C)4@ zvMAH+%r$XKmZxVZd53b@N^75wxD}BUlksQO#KQ9Q{9i|wsH}}yzAxnQrzf6COV5da z|6wRxR(SFMqiwU4{?6oJY5To8J~iaI)y0*?>S{G#UzMJ$VwIGf$+5rE`_uNQtyzm) z3pQN(ESVko>`BO3{d~|s(B0MQX8E@``hR_$xqq%rZPc?0WUuO&eG{BCdGgF1N4doc zswT3ZGGokK_U)^%(7Y9Mza2e2T|-wl_0g*<7tefIbjoO&S#13GjLb~Ux*HoBXZl%W zJ@Mdqao=Ca&)fU>`Pc3sa-R!zjx-yL~=CuDy*e>VNzwv&bkY=-%I;?xjb#`y2-F>({Ps`%cj?m{;52M!0%`(eW;uIGZedtzU!SLYK*X%PME9DgL zit25ObBj;SOgr?<`|84{FJHFplwP{b!r}(FLm1=br4d4>gY7`&NyW%~aHhWe@E zn)S2R{PT{v^Z59g72ctD_Llc^R##SrWleYVHJbK(@xFH#54-VeW;cnK{p31yNN;s1-2b{?eYp28t@}Gw&)ey|o3Ft%vuP6IuQ-g2e4CnPd^mi< zBW-v3x_5ue<>UQkwh7AjA1Ysc-JrXX+2QiCH&(nC4L4?e-#351z^N8yrauYk>8r2p z3aOc9*bho_^xw%|D%hGEoR26@j8~S7q)fUW&H5-!u0x^_$Wy13*+YooS> zSj)$BKG7-C?cZo4|Fy7RO~vNmJp1onhiv5dFE96NoH9sMk>FYwVIDEMX&=k@APdDH}Rc{Af48{3&X?(Y7+qGsOy z|8{H--j;0%UmrVN^5w&z^?JrkYz%d`cX~ga$bCM3-;s~?eg=iMyGp|gwiFf>mp1O- zFE3pF;X~ro^Tls&6u!B&SK2tezL(#<&ne@@(k|hb0j2AO-|xNN_0prOtIO@iQ|&X? zUYwn6>b!TCsJ_AK^_$j2t`-yStN1bD^VXKuRtx#6g^!rOzR4^yI#&11QcNeRDZcJ@ z_J^T~3V|3xoi-n?Cz?WT^?-v*ava`(<$d1b`~bFDnd{{}`}|7|M*R@%te zRCL^oX#t&}tZZe~*7-aBIN#J$?KWyb->cY;f9>me`g6tW>Ma{KaNPgDqfxV6P@XT@ zEr^xv*W&v7c9RMm9U0AX?ku_H5t(~U*Lg?zmZgc#`ZH4*`DE=DeX9I-XM22b6f6~d*318Q7t+(v zXqdfw^|4ROHLvdUi-?L?kUd?`=gzFs`^FF7Dc+G^_6xL(t+un%b58x zyCa4xr-$loiQLZf@ZQB`|Nj0qdiYq~@4+^%%m4KMN-z7iC9E{$S=`n3RsV9Xu!3s$ zkDwOrm;K+ZPvz|X4LaVg=F566`G42*Tap)Fao%5ke%^}M-P6u&JlouSaoN{upF8*d zvTyi%{r(KyoTrsjCpG=#7JvNlafMplof(E~o0qk#ZLM1`I?Ky zU82G$rWbigN9pz!PvIXG)!Lp*<*)AbD|xx5;@0B1b7iBpKe7vTmruR9qfptx<88~< zZ@=Gv49Q|l$Yke}JM?gIy{7H4fEhDpC@hH%S9^EpX!niJ&+l>FJ`OsCb3>uBu=t%d zE6;>@I+VZNp!Q-@?W$9`5BL85zOm+MxrawZ)0#CoEp2g!COthpQ~zq4-U0gt&gV~` zCZE2xR@85^ppEabJwLf8Oj|ZHup2ZP|7z=NmDzn7pG+(zKR-J^eWsg9+Lw&pC(g5G zYg^ydRaO>0erj*cG(oObqe4(@T(y-F6+LTXUST7b<};V6xVU&`^4c{zsn^o)eEprL zqPlY5hh5uVO>-A65ozsX$tzr%6%&B=i?t3%~i zecBut4o>sVKfBHyQTX_?=FA*B*~{tYlB9mj-CgG%aU=E1`|IqWbD)Y!So)7U`{n69 zdMsSHGxwv+m}@KCnzOcTzJoSbKv|J?XkU!ZIw^Y_;`*Ut~O2Om6h z=1f39K*JIh#&zxOkDsgzJ|lLS;lfgH^^z-xLfD)SJpO1Ap_4~(FF1zLAGbh&7vhzJk3{hd@ zmFPIYQ1AJCnup4v)8Xq2K0niyvHUgtOvZ+Xhuco>ZPUB`@YJQ$-yu_P9}-qiasPAl zsI8mN8)X(&wiBL-6?bA{FW6W}e1CU;`jOaQ<~;iGdk>uulvmO)5J*c)W4L!u+S8M% zC2m*C<@9qNaVB@}#(;WlQP*M3MWZh)a)6?5vU_O0I zDX59|a`W>PD=9lELz!Nw%=E-$`S-^*Y+rwHOQCiB{oem_HVy#^3SC{@0^;KQ_4W2W z5_-4IBo2QL6#t$9D!BfCP!=}Nc_CnucgG`fUsDs)#r6L3GWLZ|la`m-|7rM|eZ8P+ zTNb2IW)>VATw_|ymUix6RFIylt82vGGTC!;Y}@DAIz4#)x;tuX7E{IU)9F4rI(~C( zI$z9)I9VCBJ*##0_WW$y{Zsdbm#)>amo7aiaVsLpW`*(@kDa@BCOvG*-&k?d=$Uwv zdS~a4#KUTS&o^w_c5Hj`bFEl~3kMI%ot~xx&NDNA<}JK1Wl9KWhWy;m+`Fqp)%@q2 z_*s$s>R!K=mXgW01+Q)O zPM>;yY5%4-*SGWQ#qT|&V-yt<(sJ0n@6m^ei@h$_eY|Ng$Ex<&1M5RFGH(p)@0o*o z0LEGhMn+N-C+5F*wYH9qh=@>7SD&8geEN6Jo#kHE7O>9Hs#{{uL{G>k27OrOaNKg` z9DVh^<7;ll8-Fj%d84cov4v&XvSlkCKWUkCDQL-(Wk%MIm>T-Go7+i$*GxM{Y z)!#S{KK@bRnO+c9W>)rpBm3_E54Ih<_y6B_J2xKrb=S7;G%z zp8VnYy;=$DXOp=uzgh$yOKWxOl}h@yW@g0JG+p8U3QA1;N=jNj@87>~-+$TJ@vCj3j!FEis0NK$K8#vF?^Nd6wQDy%xLx_;#=f~?Mav?u?({3kQ2+gt zh3(hst<53}es9{c!QlAz&-)s8&(6yBt}&{b5;eE>*Q4jpyG>Vz9b7u^&spxG;?EPN zP1D;heCEm(5#fD5WSD<{U;V*qR~Doh5t_pty}im`?cB9%$6hR3er0vEIQO%&lW+fw z3JPj^t{?xX)T`@Ecg^Rtvl~i2Dn&#_t*U)%e#m@=X|k17`9FuJTbO@;KYS)LIMrv>F4GpKU(HLmx;T(>%Vm1XoF?G`%`E95ZqL7MNzii0&XX3oykOy8tcz5bPRXpPycSsS-( zJn{iF1fP9phoD*R55dK5eNRjl9k_K%3bbtHS+8_R)z4M0-}HoPhbJ7{vXU!aXQ?Sa z-?3j?vkl%|-Z<&uqpOb1Y;retJY?^YvYd1?H9*kVIJl+cb=%t6^-iz9N4->NpA{JU zx@C`kyY24pE3R0U#!f4pJ9lH**Q_ruuWml1|BqLyBH`#JRS7efvc_cR=YjWSqw8+9 zbP6ByURJDe`0>XJ3u~?a?D?twz}pHee>qx4T-|mQe`I= zG=BK{_2Hc5YL1OYZ{PotuU}JO?h$)cxAv~}t}CltxpVIR5w2=$IdJ5N%gc>?eBZ!M z*i|v{)ZFx`OFKa|-mT4n@}L^8tv6g{%CDPE5^EnlO0wzcae1@Y!lwG4Oy$m<3=GlM z);q4O?LKy|_o9jcM_Aa@->zOdV#;=Qj28_JJ-mbztktDkTU|G7+t!qv>t0b=xhQk8 zT2Xn_>b$P5t`83$Iv=s^a{l!B`HAyqn>#x>*W~5~Z1PrKE_=v#W0Vv&Uw}tQm*y-II%p zo0lOZ!s36PZR&6SuqF=`r%#*HE580R?P_V=uxVS{^yTWy`@R|-`&47Ht@?_9*P0uQQZkDppCB;=NH}2n=1g((vi4eyM+^nrnJTIZ zK_TU_)gik@5aI_8#g++KjcBs6iBQKoaVRc{0tXyOAIO9tU2qV?{IF6C93dbXka;28 zR|MT)908|Qtgkqf5k_5QD#d4Q!m9T?0!|!;prw>cmoA-T(0{ynrKYV>M`G~udtFD9 zK2+G`rmsD<;L|0&msV$sP^>N zhVCsPK2xi-D}ISYZ_jlv@zIHijs19YdGZAti-_<@Q>&1;U4@UXXy)Ahw_4?n@)GN1 zKEHzcEkSX&N^X{vCpdIe?d|2c#q}MJ9QK$pWr~A>K*GsQq8@eMeC|gYdxXS+{I}8z z8VpyxeBLN8S-RA?P*qiRNA2@<^NLb#tk?qzlAx*3kXt2c7ynNxT&?C;lnVb;aZt#v z68gpF47Tj({rmEuRjhNCE>*p?C2#F=8A&rOeQ?;SZi%o{Y!OI0aBiM`|K#O<-iO|o zzi3cwW`Akue(e0ELrkEC*15a81*N6A!^OjEj9w*QS^0R)`!$j(TKex^)Ty=zIPu6s zqJT|DTU(lw(_iHwgMGd2vt_SV1Rs|yPOo43K1YIAOFs{$+P7B)0HTD01kKlZu_^k;_j~o;-Q7XvGeJ zuxVi{VpoevRhTvGo;~~6sclAILi4pJO`Y3&9qfHcEJUG95W)>y(xz=Huh@;LQ^jd;9n+YlGc0Z<*(}baeF{+nj!WLi_~% zpFOp;wWYgWFWz?Ad;0wLeWH*h|L5cPIK;)t`S|)gc<`Wsjo0SFjzHz!yW1mg-t6f2 zpAd7rC7(%JI{V7%aQ?V?^HzkeUgowgc$wCfVkZv8W8f^hgiE;7g=238XT7X7U!%i< z4?DKyMkT*^aPY&&k8BJxW);=j#Oy4SRrjAaspa?Ax6Ng_w;fc39{y6Ap$Q0#aSv3#Y3bud%4nm}Q!~DopN_b>%CQ zbuoL@IPH6SQvTKbIl`%;rh0P8>sw2Oca^;idiZm`n)>7Q`}-b#nyM`zCZ=Vxu5YvP zuJYGyc6+N2Uc1)zyWWBMOJIKVwwy-AW;QKfWwGwUx4(F0em|FYaX+qMbMDF&k+-+E z9-VNo`N7kdD~sYzy;Ee^QKu|Z{q0?F1mD`|t%r6LCO>@j=+Kep&z>dzKiCXf(AU+~ z^<-J@MH`97$NC!E-H*<_)D{xA%gSE-*1mXOUmunKez=#JuehryCM(-~*uDSJwYSy+ z-AB3lKY#t|_hJtY8`xOoc=LCLL$v?eqUMcZ3R`+ z-kinTIuFQ(vyWw`FwnOT0VYAFaBWr;r65_ z9fDrgTu<&gBQ342T047tzOvFM#c4V*9Ssci3=T<2LSgHoTE+F_HGQkU->Y?Tb4|Q= zXJ^LEMLRDg^RC=eQdqZcOX>b;8-M+uxMKSHn4@jJ_L_ea85oR=j6Qz8mfO+Map23! z;83ZPT6mVsmjrnlLj(T8|2gbV9EwuYr>GqGBDvY3RBcN6j}w7wem``Nh>8k%^=tpT z8w-onZ_GA#(uv(SsaSnR$*s`r>kq%o+&t%UOKa@0?c8FaH#pU5=ZfB6dkD0u?A&6z zr_Y~1zTMhwQQkCl`s~@=qT1n!@BcAJosjgt|21r4`1<(dbLO8dN_TnOu74n4_HRq% z(~{ZSbJlJsUT_9%&qgLm$(f*%FTU1x`Jr=-My;)`Kk~jx+0_3GdTOJ!=UPttixK0a}dTZTWfM(>t7DC`-mopMlcbk&25Q22LC+ zlR%;N_E77Ivu9Huy?v8&ac8jlkKaEJZY;~~IFhtv`Eq3=EiQ5WzuiquObq$f9X`Ik zPv*{={9=YgOKWV}qd$LY9zJ{3^=ML(P5nP6r-g5(?73g|?#SNX-)CAxM@yHyzat*y=T=Dxr7&nxA7LzisX zA_5v0dp$)&?cUwHvb9xTThg1^R=kan25pG*^gY`9`r!@{v12}$t?Cs;&NerHv^y@? zEv_GTXz>mUhWzDEzwx|me0H|^;gc5~P3HL@H1zn6_sP3wWzACYjf=Ab-RAeBh2`Xw z@ZjKJ(4m{U(c4;*-`>*D(mM3`N5!AwM=bMf>lHn2u`kYjc%EX=!QD`k4a<7%Xnw22CLA$M1Ez@$|IOWoLPt8t?`c|MziT>jPtA zdXAo+cDf`5-}>-B9TR5H?p8fLJ^ApjuXC>R8ADRSj*nd}UTXh^oj44wx~J(JoxA({ zj2-)GtCFvr=ub#iu3x)+&YYM(yNcPJPOq&DjSEOn2wNMY_dWl(|C|Hc-tIs3H+uCn zT~K$lpu9Nw(dJE?A137MbGo}9Pxy8xe@3#^mi+dU@qR6H=gz%T-0hvH#fF+ zck=UmIsR&@_S0pI_xiMESX3H)E@EY1{`LLv2|;BMKUEQlFjs=k;{u z%orJq5{cdaZzywqe|?$#@%|q@#lK{Cmpue6Y__nskN25v6#1-JGkDv#OXy3PO?R4j z-v7GI-J{%R=9i^s3Ll#1C*I`RX4m`wk@1(eccpFQ{NL>i4!*qM&+hj#`dIn-`Ezb= zX$+1#wPV+ggpZ3_3s#1QKg$Olw7so}RY`eq>c6mQWfu?qELy%=R7@=K?f3hS-G2D0 z)g9NrEvl!Jr}1=Y_xZ&}TGjitvi+k?_>ZlTG#1GdDt!9N6ttzoxaiEOQ$oAT--TGY z2E|E#yx75SSn@$(#_ZGgQx5=du=NSm4HMeP)gsZ!;U;g^0LarEi;9@1L7|`)1HS zVIBs(mbjEdy0h4m&%IeMQr5)CF#r7V2ae1Jg@-EC?2L@0nwI;EF0(HCBR|t`gTCE= zp85U1LtdU<)ZWe>wmxRzR6m7WK@Jv+U)K%Q*7?5v{^9PYR4(g-4cleoKx?3HU0wa~ z!H0L7g}RUasQg`a?(*6lMoX%+-~OxrZ}_lJ)_Otwd^;}dScU`81+y<*1UOhKesm?<- zxZ+^tx-GGBzkb<#S(|*EFT&z~^iu1kphb|Em-{6?y0=I0(Yd?3xh~uI`c2DJ-Z#fU zPT9R?#Rg%Xis*LG3i4w;a%Yc#?!8{BIq6u`c}~R^33E^fV}jO`6Bifz>ya*%@^&cQ22}pMOeNr}-@XY*ckcT4s)%}N!Vm8@XGw6Xl(4A7Wn_Xmc&;z|I2E=pwrUSKub>bcZnJFQQyrSUwxQidruhwJjjO@&CTPRmKl*m%m@I zVS~rPi>nN$RITpl_O?~4dG$qd$IWy_z83(!KbrU1!a`0V zp&jd)m-H;W6771+yEo$GsdLA|i=REX^;J4*cGUAHD{6LySE>bBr>>e3wkz3#`L}xJ z?mb^VR=$`#eY$w@`@%&1tC=A&Av)hJUYa>wl{YwbW#wa?>-Yp02O$lYZvw908|} z!qpWU8J##3-4uV`G*)}_^ySJ2C%P(4zXVz5=8DDz>=5ccs-dabI#Y7{@o9^`&k;W# zZ}9Nf*SlBGO%8X~pJ`;S;>lDdI|q58V&47A?JvG{PuEYmrWDi;ayw`SM|p|$xjDA# zo!-8_hfjsB4&1zq`PP=aUIu&nipt7EXV3a7FYa5jCS>-$sClhd4n5el3>p=FetuK! z+85=`S8)^)-X|i~_DJaG+%!=`!$j+wr{9~c?l8O#?xXdBhEbMuc}$$u^=QelDf^Ai z^}X6(6RB}Cvq$^j<>fo7zstS5x4U0lKVHGsmU-#Yr4K&;1dTyXo-F)o_wL2}s%u$T z*$U$R*sAx(N*_CT(DAK})zz^5HKmTb?5?a0ULN$kxUi7%!#ZW1sgFyxbV+#a4Nd#= ze7@q-Qm%KNZzE>RoY{Ig{T%4*Y6gbl;$oA$I~y#f(N|9+g2P|{}!}lO%k-&N51;o zgI8N$7yZ{0>YOlrdjFn1H7aUqo{x6wtOI06GNc64}#J!JlFVnvI9(<-xHVh$XNp)C<-*7YlEh1Tzt zsqL9nAt2az)O)&i&B{=>Glgfxi;KBM#HV{4QdL#;>I+-9BVwb#!&LOZOQa z3(E(szP!-zPr_t@eT$PKOVe@>A&v<%rnJns5uu`DGx6n&-p3MYL=jR*WA2`U>zczfiUQkew>ci*f;}0yZtKIrZ z*W=ke#^wBdeSIg+oS6jLGVvg=^DN_%>%yxdJHK8%WqhrQd(T^*FPKZ#CQkkP?*G&Y zA6V4=<{g@Fu(@QGyYnKjt4;g*`lNP$2MwqtC&g&D2{~~Dp16Crm(xBpamf@DU)>pJ zTyx$itEj6R7j}#5Jh;Ni#&GVOU&gg9lFO5AZER)~q@<{9_whP;{=9q4o#d^TUUhxx zo8doCCG1sAVgJql>$|=8dd*$mv+-KA>zg+@7k7vI=iJ*8xNP#*CoeBootpaaQd#B2 z=L=`-w!ZDg!P0hjr$2{cO9mID+eR%<%OH0so<4uPowNP^u9eH@fQDpuxq`;vf?Qcx zHz}`Jv}n=9i4#|Ts+_mKqOqg>RqvD__p≦j;4L;DRMd*Vo;DP!h9Q%{L+KTV80x zojW!%)@3nEvpKoBH@-i>IQ3G-B#(1U*FTx$-kQSce*DNPTdg;LS_9N%1Rk(kTSsp_ zr+Rk6>$MR&ZeCtm@9ysJ-`_8LeB$Ez)l=@>-fftZlQUz-oH;VSX%`n{?B3J!@$-YK z{jZvRqy=RchaFD{D>LJhwd->4e-scEwQA)X&>(J+T7w_T@pomYiG^r(O37M+T!c$d+}xS|CL(~HqF$G-v4!@^6GUU z4?X-G@V)LTyLq_ykKex)t*qRHKnt&YW?48c{VZc$Cd1Az&-kHiav$gX`aaMxc_!;y z1e`k5Lht4$w+ICBetmy`IwxrD==S$_p3eDqX@4RI_wF?>b2Ohmd2^)Y{k`4oO-y-n z6C)#UMr^O!>vdh)D#hT;*|VyN6Fpj5yQe>J+wm#W@z5csKU!eQ4x4Xl!zjLK=TGEpj{u}BJv!ywMYV=TMNXEDXTFbJs71U?P zvX(^~WsS{7LD(9bY3nY1eRZYq*z#n%#78Zytr7b^S?fe?5_xEz?-@7ERY?$(u()sz- z+A+#{#>U+CId@JRVKvXzGB#bWb+N2c^6>M(nZHBjqxN6t@@;OKvBUKBzT>SI0$4Tg zd3p&YJe;Jep;dK#nn~^@7Q1`*yn-aRReyh<{PWcN2@^iBL`L4^;N9DzdV0FCJsW85 zqYgY-v`PSJp~j_&At50xSF^7_Jae=7#Z6_Fx_$d5t#rxEeA&_2d$e=1x}dDEwx$2; zu(buBzva$-a`Ws}*0ascpoNc~cb3*4{_yFlc8|`^#I!WF2f4>Xf+jI6oUZrq z%S_`*=VZ#w!&U67&;6WLTlL*(l7qs_8(PKB-`U>T`Md03sonhbAD&h{`|{Fgw?U2=6L2&=8(u$rXi@n}q^tYp^!<9VRtuAl^GW@;mnzyT zYmor%^12DVwJs3gU#w)9alnCv?T5Eju#1vl+`g*T+2;A6VS^Mmd0u(7-#dn==^Zr>$O#yxj+^KVW%I>Wr4(a89I zuFr%?le*&TZy&Uj2MvTj=@bqkmQ1;f6o16Q| zlP5-tlTU%x!d!ji8g=_=>WlgAsqe#U3(Cq4O>*Tn%>U<H|S!+OxE%Q!{J6zPfg_sq*uacP z-Mbs}-b(#g{qvJ;hC_Xg@%QYsT+>{GD^;&y%T3~9ch;Xjd)7HBYS$e<@!;TKpC6Bk z!NZ7^#x967)7-z^d|&)#sdZmpt(W@x)ZQ)2OY0uT{R792v7I}2j)RNGWwM&1R6N68 zBO~L@1+UNLa!g|JIDf*yv5qn4ZO+3tZ+Z?KU@+n2X=-gPb5{>dIejhHqVm-il|3aN zm9}Kat@--8%S8!vnn?Ki_{AO(9NO906_r(9*Umq3BDn0M>i)wE0k7A3s2rNC-U&Ld zaCP|l2{UJMF5Do%XZkkq^g=Z$)0~d9v$IahK8%pf+`WhA=jRJY{;mS;C93%FLGh8? zQN^D>i=RAycJRm%mTTM0Rzxr718G@s;DA>2@%W`n6s)zm<-Wc?9Mmg#95e+B?xb@l zX3hBimdU2#M}W}14gac5vaSR`CZ0JITS8i{f#%JFa-TkXrg=v)Xy&6wNj6>G$&X@U zLgJ%A-89g`g6J)75}?_8)kldc@9ynx2Q3w>sbLCR7tyxN(NSxz@}FnA9NgThiTe8f z5z*1vR;!^?xx9-7K@e}%BfTP;F*xTEr z&MHG@eqF4=y&I3Mmo_@HtNqc?Ui^Y#CI-~WB)4&mi~$yaA>_3-u%pYiVL>TuAU$Q-NMwoZAo z6oahm>y}R41L}&j2soLz>#$WEVwyPP{PUOA`k=Pcxs=q@+6Z*x25l|jo{A~SsP_)I>#951+xwpr4RR>Oz-mb zfds(U$+Ks7+yA@MJ$bp`>M85|-^cw(xuOvf9i6F}4h>yjZC%mE?`r#9a*~o3z25_} zyh>Ppego*3u&N)tPo6$KZF}tGNkQ3LTb(^T%6IJE`O=~tqIbe6Elpk4^$P1 z`*p53#POgmlGB!DOO~+I7#nxuCEV&w zZ`A#7Z{7R-)w$MyMa~;|ooth19!_Zv(<+ZYYst#M@ZrHRk894H%nS?+4-WQT-285D z{BKzX1_p+Lu)Y0j+6CAc7#I#TzkV6{-7v{kh=GBj!QJ%Oi5JSR|H^|@JrI0*`?{6q z9f$#eZ*O1E<}elnYf66g*r0`1I1!}GX4zkX8CN|(Ou1XLubz09U5{r_ikx$}&#V8_0@Dxtjf-*>Tp^-d9wGQe*BzIw0l!AbX9 z3|>zJ>A17{(!KoX_w5_5t#M}p1zUO9eX*aNof}fb4};_%%=?ph`QvxRHUGYE0_(rC z>DTP7C!X*tuGu>8-tR~`kdqmfU#s@d-v2&wKX0OEkjzJ*xQ0>9z*_la#^uM2F`>0Sx;ZQeBr<$83n;kpx=U~~_g#y=(7ijZ3x z*f!{l4fN<=(nMWoEyGJt%E9thY#0Eqeb#;98ac+P5$GLFP4_w|M68 zZ{cF+h)HL<5B~(|oO547`SYflm*q8@Exm?8S${8qG&4NN_tK4*JMk-s!+TO{WYBC; zPmtnsi?>ZnwS4FBZ=pWON6SujsepvluOB~Q;;a5MR-H4kQvzhsfy`cEw+&BP6xV#6 z7j%akWaI-Aub;QJyX-67Brr|IJMt1#v^y$0^3?Txs-M3l;%`LfOYU)Px!7#KeI`dpq;+!Hz1rbTuA;_TCz?$<%KSJZsASw8oJ-i?KuTQ;af zdYue9wX@C^B*UMksk(ID`_mHV#STqMiJZ3CP7V}v#{;r#f44o1bdK00oxVB=9C`Z# zv(MHv&ilNz_RW`j#(Vd~d@9(pio5+V3{|ZQ@h2KRi;@x#`=sch4S+1^ghN_HMcMspw(p3FmOm#A^M^Q=(p* z&IcKFfb~k0ewD<3+i>1QPouNNUYghIK;g}h9^`e>~E$9867)uUfzCF)Y^4_WkAO5OX!(c8JYJ==i1qp4Jq5Tt*XwikKca; zlr1agV_@@uo6PoF-!KjEZo%Z9y~vo=jpO^*4k3Xn081uv** zSoigw@%iFgvTGdoJ%8tPBkr~Bd42t#A0KP_-(J2(<}xS`T67z_dFe(@D|)-U=H%VB z4SVaascyI5RJ-fYpn*--vs!{CU%oE0f-)nJYe90V)U&oRdg4XS^n7 z-SF17gyZ(>+LV{O6}~-wsX6 zpH-WER?UBQZdi68NMS|J-u^3Lm!rJ1-`+aEvnyZp5Z~MX%k?8S-Obr_H)r$ByyO6| zGLht-Ew_TAeg7`|`1-CPF&t>gBSGM_N)m}qgkT37dF`RU*e0Kig?_2Kezj}B5d4WT9 z$vqpTC3AF_PEomeSG2k}dG=Se?CnQEiHZAl?UJwci?5gO{a(tW_(u4i+~nx>;gRdh z5_7gjrS6SO-y6l90;&h6f3>^h?q5ImgVf&r|88!%zOiM4{)^fr>E@AMmZdTma0*6h+y)7t31 z@kpC$r|mY0-EJFO6W%B3cg8OM;cb!>a8O8E>jtB0(*hCE#-+Ni5B>Y+&~tI_O|#wB zo4;4~)NwpNvr~Wi+?~evcRru9C;yqA7C!?614G7>StccnAXb1pOCpF?X;R=}U|?u) z5oiI4PvB@W00|2@3a~K*^nd!K^hqh~pSr&Or%zHl6c`#^f!rpYvT)_jl}>(80)X#k9PIk>SeLPgDOt3oZB^ey{xhlH1VjdsU9^AOG5){?_cT3jj&QOq>4w?%X8%JA3+F)(dXS65J*4*T@1& zRwkeR?Ut$kS>E0KRP_hnf|k32)3z5K{QbVX!lYb`fq}uJZK}2Zx+w0we|E>KYm0lj z2uz#4z3ArpPoG2s<(?kW2l?XSr%#_2*_>Lur{-w+|NV{JtJHg~IDWs6e|4%Rm;sbf zKE$uyG->MO=TiUAI`ZWW`uNFtNDXS33{X7{d=S`Ti+kkeg>eb&Xr2(LZPQ(&^ET zGo%lKqJ5K7T-=kGu*uPoR_V`P=AGs*FfH8{lrbBQsm;FDaDE;*(=xo80HzU{ z_p5wMBsa+K4QwYmUfFYOwpIZd!aG55rW7a08??-8PH&qx?AgOJ1(ePhGE)?qR@DlG z#l`*B0y#lpE{{vVR_;S72_W8+j$5pWX|7BR3=9*Lb*6y=9U~_P{8c!^^b@Rl!7KJe zu@j&WQ(&jaBZ^=b`KN+Rb$C0){g;k*t-!SD(@#c$L>8QT;`&SH^c4>f2V4R&FgPrp zm{+s}63lMOcb|AbVij6QEhzLfv=4$5V~-~#)upgHM(k2O3evA&9xBkXG&%?r8w^F0 zS55>8;wWvUmdfXIYJ!Ws1%balPMZKJgr(NY-x0gEWYK+49&2!W$iBVRbma?kQ1~v` zXlM#f(`eC+2x45Dy0g_hmfU@IqZpqe1H z|5Jxr;zUr&Wsusv2hJ8cfEviSlI17qT?`BjyEavPd=#-E!EuUi{JjfHpS1kB8rHqY z%=O};%I-EjR)z(B9ETVh+){t_NPhhHTmIM-|Np|?({yrQ6cq)1es(tL@7HVnc6+N` zm-o$;+9ku#&~x&4+Pg)c+Vq$h7HpfQtKB>C|Mz;sx0_$`#(FK@^zYZ}qx+h__x$;D zReF~QLqn8s3nPPN{>e+K9}hV9AGscXKKDhC)Y87Uw~s5f%gFeKi?=Z{>^z(Flfl7H zTl=?}T-B3&rwvvn+2`g|Jh`~vv_z7DVXGPkGegm>+4=qb`uqQ^T6j9+i{1aEv_0Sd z{pO8jV{ljt^1z&L$99-Y?`kqS}8XBW02^|sP zkmQ7x>|mKi>4`b0d0{$r`t!c~{v>A>CQ#`7exw7Kfgm zc5!F%@-{tYh6Tr15*Zx)ZtwaZ#vALDl(YM6Lz^BW!-6n~@TU0r8Ta?aI#0j&V(sOf z!C&59-o5ZN1H%eYkeQdmqIK=tWGWKY?0hB#%E(tY*8a9A_#Y3+fYZL8z2o|nHt-|wxHT)lo@mGg8ahJfrQ1BL~GGtFwN_WZr} z<447*DQ$YH%X2qa=@Xv0x3_hM=|+R? zlvD?o=n8^3D!8H3&IQ#EL$G;1>TGBNq<>Fp!u<=Z3|FRV{+}uI`_1nBQ{ST9?#S5x zzIp!DMkR*2oJUJM3lB81FUk2HHMeqS&AH;8-#R*Ozu#e-x8vinDQ_R&ud<$HmK)VC z%Ba#0tB=ZC7$pOvqNL($zlNTfXREz$mbLjby;vz#@9A!n)qEF4CVtk)2@}Zey5;u# z+}uU6yURBIdbQfT55-|xGHg>MRvU$bCYePZ?cy<+O~N`ho6 zuLOSl_xpW%PK?6tDO0B&t^Iy?`li~Cla78oALxHQ*_DAorB{Jx#g$2_-bqI~1Pfmz zwjW!)es5U%@tGgawMZ1bP&7hG-+sQt=j&0lI78(M>iHcJT&F4 ztaVwBns1HxWE0=nVgI%*-mqYUoE9U4!b+Az2e07ezTK1k?JSqonyq!~kFS2abG{uYMX@zn=5TwzpCj z*WaJ^@!ReErEfN;{$C49T?~`l1lU4ed_Hf#K8$1AV?OI6=j*?HzESbGcX9D^zrc_y z&wg9ig{_GYJbIKn>Dro`hN-8fR6N}p{&;5kyv|LVHf>4nlm4C-Q*qI?@Z|^Z#S0c> z=Kl9^5VLstWb&gEi~HAo_<4W*{b?I->+Lpk2xVYUX;t9)(b>u^e(YuXyuhUbZzeRi zADN)&yvV&@PV=`(<|UO|TQa3{Z*A%AHNR)^?N;`BkV%gpy36p`=0v$zwZlf{PgbP!RGIM%JtPQCfV24G-|Uj zEHD&qVf?>%&mNm~dw#w8@!>H4Pyfa9eSH&^<^6A`-_G6Ex&PnOc~b2O_E(ns-{0}M@AhKv>3W&JV{6}D z-I#Q=D@vaKgj{QD>&0EA*@_Yj3}4*@*lP0sHT^97YI=Ri+s$9E{eApu^}4=oxz|tJ zDBNBCT5fuLS>>(L1NUk^udR4GHQcDohk=1%lDhy~&HIV&@|`n{)0gGEzp^rzNBY}y ztDA50KgaETG{fr}9{zo-1!!N9s~kQ^6t$3cv5}-m75#=2>vgJ1x z`elO>oJ`q?#LV9|_GLbEuYo$wk5jLEC`{9jm+QCv7jetZUA8i0?-iqr3k!C9`}I0# zoBj7Un?LSO?q5AUs&2)O9TwAcB4w5?z3=wqRF{pU!@9X_J%Z$xRx1djI}?UB6*N_8*)V*mH|E>?HjUEKV)86v=_awPRPM_@$qr;pBB!K7v1ImF7bDCynG{N^4X--y4!nn zx8E`P_4V!aiwhPT?#~NRkv>=H`?Too%z(H!xyknbEbdjkUMpdq7qjR0z1@c8@9xb1 zl6`+)ZO*2T$1ZNq-~ZzB^75Q*FViN@kKZpZx%uTRRujJ_1BJKJuRA(wzu#OwPb)HW z_uFm0k}a+-K65Nqp0nGs_xr!!h41&)_on~*y58&ex!LCW^QvC0ta!C@xsphN6ywNZ|~o2S@wBTH=nmv&;6ad{a)C6#~a7x{revK+bE{~o?QRm z{g~Yaz36Q^Z#SN^`1_@&WTH+a6b>>Ru<)l|zG7VqNOjlA$ zdfaQ))y!{YQFc3bd&b2@u4}WUjMIGX6g=+LynTHC*RrY3w=Cn&c~;Baum8Sx{vF+^ z+~+@@xBIR0Ztwej6*W&D2Zn`B+xGs>&f?@ZH#QoUy}8lR@#22{YKu=Di<2H~yZ!I{ z{J&4@|68}kTkSbyxNhgKS97=yJv;N$NUrY5!-^LV+mkOYYR&wu7ab-gtk%=dDSYhs z+wwbdcXyZeALh5$`6jogTtrOl+OBEGe(VaIm}B+)>eSO)(+_P*U26EPb>qha%=|}M z%GE+{)t{SVX_$U)j>PXn+=7A||NVM>T#=o>)AswF&F9|lJ9R8u?1Dw4GEawie3fQu zbX{HDm-UbNYwfq)T(q93JwbG)VX|9H_1{v%iubjTK*jCT)6>&8 z1W83zR#yJW{<1&mgI#m-iwg@w|2YIs?3}E2v{gJ_gq`2gVqW#Xof`W3=M$EeX5ZYD zdjG$b_`JvW>wf3nsXcGI@&3QxN0s~Sf-*V6CKf)v*K=R?|89%FXN;4+@xQyJ6E~xZ z_e2b+w)nBX{*Udqd*$z@8x`25ml|?eecQzJ&H4R^W_sW7@&-7==*Grk{oU{48rl-&QaO8#rM;=)#6F>XM zJyU``vp^~GV|%cF@596G#~&T-Ha5$PjS_8ndZ@VOU=wTMt(VJ>nqH5aJh9NdUrx4N zwyvV)!$EdI!N5HV+vnd`RXv?_yVFLro*T+RQVMcwb)_m3s_FO8QsJ_+^w zhMdUEnDW10L2-IbE9BQg|K)X3`>p?#7yjinzoN0k|EMW<2FEftr$fHJ8`I8c)&Bmn za=ugDg5=|Ug-=Dpm*t#);|WDLpzha(95{ya1Oi0JfK zxwTQL-_>|dPn-JeNO8@*J^7EO1p9Y?e0=|$L+XFi>Thc-e%(lZ{OxvLH|yu;=_PM| zg+xV3IqSnWxy6pipSRYJ zt9g0UO7ef7_4|(X&(HNPd_FgP^;S3Kn9U7s%Ak0*Dvi4Jjko&Sn)yz33ikH)W%qNp zTiKuc!6^(%&nq`uFZ@^aK0bN(Tef3n%-dFelsIqyzvj=wE5WP3&S+{{c5$Qg@`$KS zCU2X**?)Vrdi}Ad)8pk1xAAV~j^&HmRgyWUFzjyKf{3S2r^okwK4)*gZr`g_5w%~h zzW!5T`t{rG{G;>#+32jE|5#O3wea5sZX>y-wVN_79zAZNo|$E8e6RBTT?xxiom*xLxVZfJd$RsW10!?N z`n})0Zs-4gyS@MGwRro~-=X2LGr#@evHkxizw|){doLQxBfm4 z>uWPMCO_Ku`(3wkzm3u4`ko%E&u^}rpPy6F=k9W+?zn8|zT)Hu2O2m2J-@wQ&bA8F zk4yUc=Z}V7oWSSj`W^ktYlP0*eD-OzW(ZdoIIr5;+Pd-cIqTzQ(fPvJYxjn2(bVc% z#_F4Va?(=6>}zL!d|2H7=;d-FN~Q&ThzU&WuV+0W>% z_5IIN{f#e|%|4p9`(4!Hs@Tm9Z7QI|YO4KLdSBVwTUUcsZzjIq%XWO@aXIO`yGp%p zrazxs);HPD#`0KCrJdgHN1wKoNBLBwJMH=V?Z=Dz`>Uk+rcBZ4?$+O_^0wr}wYAa5 zJ=N!l{C>MTUPMeRxNLdP zG~MWBZ!WJ6U;pB&_Sa=>M~`wp@;}_RH0OTucUzyp6AS$9eyX_LDJs5YSN&$A`<$v% znin@FAAMNXEvCE3`S&+a+rr|@1?R{2e!uUP&flZ?c7}4Eq@eZNEx{#kZ*4uc_4@Xl z%073O9{K-ecj}J6o%-!|-tM=LrcADvm(Jf)c*?GsjkoJ@pQYKo%I|Y`d|W1-d}oLG z>RA7E85j4s&MA1rx$(Z;?`1WzH}{0Ezfn3p_HoO7S^58ep4&g}(q7+l)H`Us@Rp2= zhjx5gwffPo*XxSib66pTuQ|(!qIigq_Nrp7ZwpH?M8Wy?rFd z_U^ve-8QCJMzVrF~wPm*c_Mb~?K0IV! z`8xN$-M^ymwuL7qC~7)ykk7uf#PiLz*Xs(e&nP1u&tl$hMhcpy4!B=?;~%w-;;YjuQ+dO z_9@oCzj7s&9Vi6@9pw4Hw-_%$}Y9{)xQ1& zlI$O^-G0wYde!si&yPUy#&Z~EJ<*SlutNeO~VysY}oyZ=?aK7QeI+p@Qx|I9GFdMh#W zXqRZ={o0lHBgDkSj&;m-JJKed7xC1vent9u-p5S~UuM^RyZNeq!}3HCaq;8#|Nr|w z7$@C+f z$L9;MvR;jzU}bM_&u9B&!j4a$v{!xIk+c2qH|rz4*W=~qT8IC?wdEk2^pOr}cbD&Z zcQ1e2{dt}BqCI=|w27M8L58MYMQmGRqPPFir!BSX_B`s6TD$kwvK78DW;GQ#Q_}X{ zsD8g&Kke+S$ft&}n;UWzIGS0swY9q^O`0_2t>=tg*A`WFOB6otxKXjVH_PT&pY=P5 z+TY*2Z`!4wo3o|--rpPQ^L;u&`7ZT$;c=PS-+VJe-+bwwd+FMrL*4oni)SdS`OTSP z)?!(5V&PT3pt_6;3mm}-?6$amq|E!h|Lb~>ug|{uL#Dr@;={uBOWWS>eqUGkBe6X^ z`;7eU+V6KCZ?O-_-`tzCHLt()vH$d#nANel*Q2t}?kM^3Vaxe;^ZPa0c0Uxp-reCj z30&{4U$=aIrIniBtSOuR-bn82om+lu=ds7zb9cMVDZf{#dHeLKQ%P4=q_47>mn}Ad zmnCsR0;tV*>swRPD&L)_Q`gC{gH@P|6&VPA%IlETo)xGEQm;b+cE2;Zzc5Tn!`mOc1zV+Mx+i~sq z3hkReWaiuae7wba=~m4w;pKlHPI+&>cSUdf|6kWHE?eQd_IPH-^gk~rW!x_7jp_## zZWf=mzZ5?$_xH_v6{E7OI}Fq|M_)&cI_Oyy}y^-bxD6B z?0@9b)6=U>rosG_dit{e)00QqH{@);zwdWy%AB*8bY$cM_r~6yrWY$^yQ|#)XTI;U z%8-=FzL(b58*P>fmd&u}7Ss2-z3v6p+ zFE3k~WB+r>VCPcQv27Xye_UOnPvKei)+@gy5H}DpKe^W==-y+`wuTtoLhBD z-pDHM_&3={4S)GNe#=)ZIP}f3_}P&sCnqOwK5KURMPacgc=TcKE;rlBRbEN2udRJ7 z-prQzCSq?@uH4$_?S4CR4q3n77rfNhHU^w^n1x=a+uznpP8Jmvb#-*S9IH#{-gf>KU#15 zHthd#)bHXl-&e7*lUFR0ZeFtat=a8mJZ4HtYJPKOyim}Ye!f!gdYtUhqenm9DPHOP zbuT-A-!$Fmv^N#4t*jd_`&l19F|j}V#=mpB-yfUM9K8PQ)-F)ekovzzy+I@_JLs=$ z=OxeY54UdF@`(RD@5)VgKd;(#kDYh*ru=RBJHJjll2FoOd&HO=Zp9KZ2-%Z%L`(W71+uQw5ZQFid zE`F&YG*nJZD9N8RJ$#d#^pz`Yuh+|i(%((H!b?jmeohHadUa*x*YFVKsh!U&QfCLK z{M1|WD?7HoxN_anwtN%=rHG5X1ZV7 zcON=*=*11guT1Atu2tCvv9rq8ehHj1Wy%$(pKfRU&v@jndHY&y`Q4t}9UqER;R zjRk>)Iy!L@r^DB*_^|OPx7d~9tyiWVtmf_8sJ}-b`FNl2&E;#>=)BwaeBO@V^Qsr+ z->=*F+0WW_{=L1)&AetlyOpJ8nr2^HGbML+{ypvF?%%;X*WKN*h7Tp}@t>{d(7vBVOVyrLV8;{l~TN((dT4=i=_i zzulBP^<-6y-Se9v)tQ-@w^lZTTJ+3(HVfjielA?KPrmRhlhiB)9-%dvm%ljP`1AAg ztCd2llAfKJ`SHYkxn6g<%8(yN{Yze4FwEQibeqNFHO9$@T2|>s$!z?@e0fFS;-o7p z0tE#@OD810bUSXmyNx;dwC?tPoF+@UG6s*Mb{^MHzMacHt8Wq`x453y&1-8aKUb}3X=?gXK5>fP>R;_utJJ2SuQa>5Z;grd z`ODj{-ch`5%AKJhcDlXg^)A2ZQ*yh-bbFS1PrsII`scZZ^+6^}YUzBt@}WM1{V$k!j|{k*>a(Uagh`QP#%R!jUmazaBha$2L-WKioQbN=zE zcMF};L`B4w7q}cUajlN7P}yDN05#4`o`ktTi(W>`J;3# zKL2mksy6vqrrBw83NCqqhMYrI)+Z(=etESu^2>{jd224OEZ&lFQ;CavwyR^JqshtB zzdipi_4aAK80A9g=}yt3X-wEq8bdrW?9s{|W z4+ky&|M|T5yVzdih+Ly5p&xAiEc_%Q9UWkPO8Ia5H?M!YRy2as(eEy|A5jlyv0hPk zlu(JeUV6>*wq5eE=S>^fHdK6kWbt}Vu{Q6)sO@>O?J_nhY&;SIpwVBG^~bKPnk3{H zAyo4AmZ_h`zZQ#cGm?`Z9qIgdOgjIF_y2$2zjO14Ute-^^5YGM`TL8{TblDp8ZEh0 z(EcA(yNjKTKJrMlTRW$mJ@0SSE|tGO-DnS|8F*DehudM|M=bR_bW?2-k9ufr^#pa;6TRZWx2MYu6m&C z7Pq&`b$#64M=uul_x=3*{OA$S$&VNF+xL{;t5rYNTWy@`5IoUaf49jry+|Q<`PvfM zu)9A*wrYA+&Jz!P{3p0tbt+5$>huTBw*R%k2`cX9#zeWW9o%QYJmL0F>?GD6 zj_-Ka_Bwg**K6If<##r&JDqD{Rq|p+QS+o$?ylE6XQf2%vH08m;@aA%tHG)#C!T(8 zGdoLvP0HR)tw($F(=)H@C`{Iw#?N_uZ}j(!`+8r)E+-$ekw1F$>+gp-x6{dV*RJ8xa-aToU>|g>FR5s z(qzip`15~v-OI|Sduy!bUF@ZIZ+i`{R1lQh0`ztkyh%Jk{S z+2!kIY^v?n-L~RV(~~&!ReHhC_b8?$znz`8$@A1U(3Hvb`15OzXKiZE77GZyS-F+* z)zt<@=0&BiuWbKf|Mg0+VfD8)RV$y)&VP1{TYuk#O?zv1mrbpka3*zXuIRlP|KITH z)_?tCU03`2?e?!Bp5H7}PAF!UD@dEaI}2(Y$!VX8othi)sf@SWZE@8ypP53&X=glc z?mKx*Iy_Tmy>#gGmBsf2Hf{XYYwj!C;_9;J`@P*DV+zkQX(ey0QHa`_BU;TbC-ePo zeSPa&&=A&tX8vQ6%a{Le(-n^U_gy>l`te(t%jYWD@Bg^3q}Dh;?$$Rm*PGV4D%VBL zw0&;x(>Q%iByv-VXH4;1Q_b7#dDaHW+)UykCcS&>cBbE{`kgDfO+Rjv#j~^X#bs}8 zKY!w*)aI|(qV;cyZ0-EX{Ve>(zdN7LA5(O0yHXr_Gxy>mS4sKLXT6s7fYY!Ti=#?U;h7Q zQ_$sQzRAZOn;&(myM^5VO)45bwGU4E`!#6&|KQl-=XH}eZj?Gy`~AN7?)Uquj~$EN zS5x`t^Zfrlx6?2Ct`f_6a_hBQXzFLn^**2$=<9D0=4SUY7SEWG6nj-XzRD0Z`djtw z&W3r~t7l}3P4M;UWr56dc>O-Mam^Z?JgLIqx%&j`A08Edbl4=jV9ox2zc&7S7JcRB z$IXtHo4!OZs<(W;x<~f)`tSctlao!^ve#}6yY;Pe^5y(T0kZ4&{K{H;{KWb5{k`U1 zd*klS&fgpPI{8mPx7f;ZjqZ+&sFNaw|FSReSue@;|Gw14*JjeQ!|8ez@Be;Jet782 z-N>(>_Q&^?U-pr{UDz(W>QAfly1jWJp=R?xpL$aC_Ugpx)5U+k+Z}()Zu^}o@40*P zSLbN9%Y&k+Q-SBly@~EJGq=@VF+RWKui1LDXXodOUyrHI1x==bjg7)wKZSe${~j{G+$;-v6un>;FeozrDhE z>T$oloUppznG+kA`OTG5{{OzSr|0T~cRN1!_4EWsMM;(4t@XcUclG8>bMbidRa(*K zD?>rv+j#oiZWl+#%TwN-xBVYu^E2et+!ficKy8=3-|wos^-6`VJ-#!I@um}K!W%R* zwYbkpD|i0G>3sdm=hs;+J{}7iN7(b?(G0uVs#A8-IU5|`Tx!TSd+nXN{S#=Sv*u^& z+jm^E4H9eS)PB1;^;>jc+~*CeHW>WfWqI`IO-tS4)pgO!a%LMQyYV&HDW=W#xsBKRrEtx$eQuoXckyrJkO))y^+yOU6YdKD!?e zw$!%88JIjfyZY{wW1wXVKb_mJW%c9~ez*Oe^5j><@BZ&whgZ3&_3JsCAFuy@SNimH{qn`3#;G07_^+`)yn0M%8$>VP_*!! zd{kIa(A(rSlk&tbb#!R{|LNa*e4Tgn*ZW$zzdHn#AFW=$Z{5WkOP4M!{L6d&cr(9k z$l~MSDW~hA-L9{T4c^vY^=#&j-|u!W-m_;<*zupYlk2-V-}`vn-1m5aY?f)A&|Bk* z`x!Skg`NV>d$)?m#yoD_-`(B)cuw(oU+bmX*Z+L{^Ev5?@%bx1KKk4JOu19$ezZG% z{ioaa|ENW6_4@lgXktwD-4%T~w$DQ+p57XMe1f9$rF)4{F)=dga|)dH1fRa%1oF|F zjmIBtG4}gE-?#VOuGi}<-hR2f>WlHaS*$7CjuId2ySlm_U9#t2Z&I@B(<$x8{LAM` z1uyqod$AC-f<=Gtmmrz4ABi9Dd_KSQZS{!>iXS)6|GUQR_({{BKYwog{@`Hd@1EL+ ztroA}Y)<|*$1+sz`{wg@-Jl8Bb3Y&N+*on)k(O=R%S*G^6J@PRJZ}H{pv<5C^xD(t z@As{uO#Jt*JF(^bvZFu6=g7y`+is6~>^IlS)X)0wmmR<7eF@H4wR*vVOqu#S?=OAZ z`L6BtSInrWDVq^5H>2Lf2#KYv)wo zlfV2ey87+br2ov{)|bWZ{I)Al_GZ<&)k@Q|*Y|-Y-p|?np0lMEG+B3CwmQb<#|3B8 zUEk{de!a8f!J_U*i@f#L6{Noh6|!B^i>pZd zQ?%Z8wXN@y(^)LJ_ScqrU*A&S79Llr`mg5Y2d?rEP>s?1zG>y!MT-_$JZNCP^sVyg z)bK~!-T#=m^-4|scKGU}qur0UUXSkwO*h6>^MegOe0ANH*XwqJ=D0j>KL^dAF!S4K z$W_1DsP#7K``hjJk7cjlFXk>^UBa`!q~g{-XFe;7sxL1B*UpN3`JkDvPgm7cEor!O`$j z=fuqVdE$C85}>6_?sBCmcPg*Xo!VD@O)}ke_9C;Z>(oKTsP^r1m8DOL-iB^{eQx)W zgY2?Xww-^Z+MWDk>EXvOlKVTS$Jg!jYP|90=H^H5s^4|i)^E)}H8)Q=Y+tzbs}o;d zpQ(#qoh>$jRqFey%MQJ7_x*miG2`N*9Y6f1hur$U@wi;~ak*-pPoF<84qty3)SB)M z(~Um%YPEUqQdRHdlao|G{(Nqn^yrA^)hOvzpz-BZ+UwSo%!*CEyzcI;kH07TulsWL zPI!E+toi+#;yX2;&k71&+?sv;#f62nplKJ&&FR;xY-dVdy(9Rlor{}0=|Z3N5&L;H zMyc~BD$DnS@V~#?yGpIr3NKB)e{6dExz2v|dLd9wmoZB5=RQh0$Rbh{Z3i-mlyYJ z&0b&Cz7|z{_Qd&kTQU7Ok2J2(&NE%7em%}SO9>Y3pvFP^oI1A}!{W3(e?Fbg z{Ovcxz^>2!V@m`mPyc>f-obnAzQVPr?6Vpg8XcD|U5eOJQFvyCo$|ff_j4u8*L|8R zv%BoA)ZupC)g{x9g+j;1f~+1iFfVfL7Bl>EXklnoaYR^{n6O%p|LzSrp?)PZu%sTPT26&isAzLd!nw*O!-><}yDv%9h_TOglSAaw~gZq(B9OaCI;`DBy7y@@nkp=TXadNs80m}L5rocSh|MW?QBTy>-7^V!FHivLSg zR#uwIDT~LOUpm=ZJkLw-dYp7?Yir@r)al1}*8fSKTDNcCuUD@t-fTRcReEM!?CxV{ zmEByX>&346YH?j>!NQqRoJ+PIm#aP!TYgXU^*4|G4Rva7x1Zlv_}SOo^?2XhS8r$B zRI|6Y*W34Ekym-ds+G3i?-=X-{rurZQujU0-#T%dEYi-bsM_!?Ir{ti_{UrC8g0xD z$(5-%z_{`JgT1d)-k7=Of+pq8{@7I>owKjb=g*g~xB1?0SaW0k z;?&dAKtrR;-~PYoE}UJn=4x29?m5fXZ!+$$`&It+YT5A>w@!gZ`Oe$hf4luYTvE1t z@jTnd=d9oN)cxJolXiAiYRQ|9sq#Mmiq6L;_1k_s@#Ds7(EQ)W1GV4X_t!;VyJ`o6koj>7&2w9{H@iCf}c-)p4@Nyt>bpyUfspz#USm5 zkB&(%j@`Z0*eGt@zPvvXdUHR^pMHAFcxmP5XNB)}K0g*39w++t_V)FYlX)y(JlOH~ z+U-Tr+w-9ez*JhVt#v}b{o_F`rG3mUXb91f3Ul;Pqwz#gDlU8(*Rs6_N@z{{ptP{DpxgWPY?(eUDw^QBh z*Sk69+8SqEX4-GO7L|Prv~pzo-KyxN+#AD>tIf_4GLI>*jj2336_k@wa$^2vuU@;Y z>-YP;_Ix%U4n*}{-W&aW$G2J8kD5NWyM2Ck);J{ga76Xm|7?=X+wYpmReg9Eb-#4$ zvsu~4RK??ErpH!Af>!+GdjFB%`D@ol=bdHe>NTckpI@?P&z>8(*JB@VbeHcH_O~%i z&R)y+Vt?tMr|+sC?fHDJd(omrJw2cWb1c~{j8`{-W(Ggl^Y;t;TNuuh{#?`Z@A`|1 z?|aKv+xji{oBK$-ne8ZOUBrQFx35&lu2MO1`gC_}**#UZJZpnvJ(9xxcHbhVUQg84 z$dKCoepmII`Ui}new;T-Ci`AqCvQ>)9zG6S`|iT+C;xBme!oFu-Cq6&_m`Rn&I)qT z5piUFqx(%P*;B{xn2B#srupAzYUW43%$reld9j*QvdOj^)vh9MxI6?`nsrTKowjXH z{f|v=a+1q$-i^HR{&{7MT>1>-^i!7U=l-QV^9d387x9t3F8-r**x#Sa&mCMMZEDi- zJ1a%m+S>ZeEKBaiZhgm|>CWC*_t&cVSo*7LTeZ{9%;>aMyU$nupW)#Bm@|J;j(5A6H&>V>ALBE(h<(rA+FAYyORn9?V_5rnhI!W6+j)F( zarY`7Z9HyReojWlqJ-o2_T0l4e^fAEf7p6*`~AL?lhu{Y)UM^2Yge9CQu3Z8BJO!~ z|64zowYR>$HlI+a$y`~v^Tg@X&Y7N?OQwphSiQD+_HOArckeuW_ppzlzMiF=&n+N8 zpsBg}tdU&b+8tG2xh74TJaO{e=0Dou0by}$Gkw^^)6*+TKR5*xq_?!TDQan5%CdXU z$Dq1Y)uQ&5Ns!($1$}+~piEX78JP#K9yR&>`}acTj%1>(lc1bj;?#o|+uGQkJb9vE zsmeNiv)CBc5&|6u&N+5)aJzeWbX+Yt^7_@Q zf|o&Rn~FD0m_EBb`}+EYPEn0rr@U_5yuC1XcUi{!mz?Lz=DiTQ#G1G;an16u1u;>5 z+~Rr)%8!MLHf;_J3aeVZZugD@o9C)GF)<4Y2{o-);j#9yR$5wG(y!QC^SgfjTt45h zN&@|Srv{9IgIQr=2%C@U!`WgR{@*M9led^x$dXTGIcDk&)` zWgl^n5EK*)ln#xJZI0c&wf=AEgNA=H!R;L#9XVXgi7qZKE=pQ@dQM46iz2VpK6p?U zv%fC(^?mm{W`}fs3JD4dMryMi0@>;k6d2eT9#<>sZ~t58+`P;GxE33pTKe?IzjpZ& zJ>!B04wIjGBDqD#F*jHD-tPysGPYGBL7A5Gs$OZz*w0ItRC@YpQO)PC<|j^^xUlQY zkHW_n*G8L9e&X)p;&LU*K)?-TMj|gS?~iA<^EXs}PCL41(j_6AZ%2|N{$9_za`md@ z-gmopS=D@gyFFs-FaNoxZGRm2>-O9ctlbc*J^R|agO^fIUwL-@>eYvPzu!N8`Mh1T zar$|QJ@-yWMpisLD*o}azWwW%ykA=~U);uB zL>woo1YVK)XIUA1P<$lihZ$z||a5lOq1x7DhvxY}}(xeU9-}Q3t?AUm7`AMtN zHyu~&|FPQJ-xqt!3<`E=@K59@dwZ`{Jgz42{nOf-8UayJ*7ba{3F;f2Q$t1d(qrAK zs&?IbT~Jtf(BJ+~L*3tB(wk3$VrH!zG=^?&F6WP{ep?z65;ntDKRsQ&=HJcd61G`e zZhi*E@}@8uWl+NLPu-K0EFsYmUmtr)0h9!8+Smz#0$0Uorcc{f zX|sfvn^Jd_y`(~)!MlRx-!^YYn$4=vfeSvXJHj%hou ze4nCon}UVK4X0>tP-Im>~JvUh(=^bRp2{ni#K^jJ_0F^Ludlm<1B2X-dby-Ui;v#ZQCbw%nyYD=6uDu|+}-8LKR?|Uz5MuC@6koA{T(}8 zU6$zY1Lb%hR*_`K9>D^XJ`rGhJNPvfU2KIZWr;o8 zA)O_Q7BK~_4EeBr;lhPSU$0%WN@Pv&&yO)mO4(DVO>2DgDCyvyUAwI2*cFE@(N$8) zs=YBSNO>BolG5LgS3S5ZpY0S^nCiv)d0s`0pj*Gx)kRHP*`oFlSXk+qoJ;Cj5 zpkfo$MtPg8;G@DVW}`AAZgZI~7Z;byEh%tWtE9AOTYsa$L>^hA5Cgr4(o){K|9|-f zw?j2{tjK+w@Kb5!^y`Ta4}bnRKRm8AMvt9AWsb*@lfla`?2ota&iBuZ)YMB)dw6PV z_KFn~4&6H^mzS6K;r$g(MMcFApI#+=%-xh`G?OPXGV;Xf)9yRB$b9`;w4-{*;^y?~ zlGoRG=USDvxF}^-+FiYR;^et~Q~h^}m~J&KC@pN9K3#lQONnDZg2J0OXN1r1tNN;C zq?fvA!v=w`U%!6%@S$P*c5x-8Ll^ID-W&PJMAdtG=FXVDFFia@o<3W+Xp>Ohx^*1< z{O;5B4xY_RuZm*x^70CZieq!HX5X>>v%`XVhF#_F`O?#ui{(e>=IUNDHY!-WfZ^%V zrz_U2Y}?&#ZDV_D=3bddr|5O+(=_Cd39R-x`Lrlz*PPBbYjUPcn|jbMiT!-pTLGCn zlCitXS|?9_+25}Ec}vJ{)nh-6xAo?5dcR%1^;)p=#{A1=w{wysv*S0Ie$9RbYA|0? zee&$t!YzAv%7i#?Rc>)En4VB#{L$3q%&yeTq_^45&dfzcMHA;u?3;8c=*I1vhp%53 z7krrb;>O0s=eC4~8ZBA2OzHnA(U7n(t!?HuHa+p>qKwRmN-Ni{buB0`Smrys$#=Gy z_A~w1Z_-t+t_P1EJ*sqj;;dO+zO%PKxU%wcMn=YkT`>_667OczShw-WE!i4)^6cru zmr_rQUY<8^Ud6wg>0fT~tqkc>jj!W;>N~@@+Du9L>+f05mif*ue0C@D=$9`mgD-B+ zUlW(fJ8}B_cHQW0igy1bQm$T&n*RF5^Y)XI^N+s>T>RkKv#b=m+k*1)>y72@?d^MH zjin~5`8Dj`z5Cwle)~GmKw6lO|GruwHeMMHh8+cpoU5;|ajmM_b?wXF-(L^k-JHHK zdiy%5|8@WVu&%kkBhc{e!)J}+aTV8A@O{bO|F>_=9GRnE)<_y(*j=u__VnycKH8Vd z&O9lyj@QH=!Z-cDa(NX=wI5K0ZDPn+%0z z{`1?`DJq`LTfFMdotT^(U-nlPioH2b=u zxp{c!}{$ga6sNxyjf5q#8+1`@fCpH^0n@4hd;lzwe*e%FN8OdePzG?K>8K?68*VpK1K=(A~}HFTXzCzHOVB zcG#LD=k8X2xuv!;r0c7+S<>%svK2WO7fV=`bR2ui#l?Nq%4wC!-@W1MHF{64lDquu zoa5qcLH;HiU49z0?L0Nb$oIJPj;m!gf6s2;QT2A#xi6xkqBk~`N`HHEx81d0@5qNl z=e0)usn7DZOLdn1>&aA(J|y&;Ga}x0Ye;m~>so2wsNzV0#}$&NgGzTVjrnKqQ1k3e zWX<=#{2IEKYlN2uJ~mBxzmK`%(MNZ~iVF(OpN!M*X01CP9u#!xjp-)Kwl9)LbKGCO ze*N*Y{{E!@jm=h<=h>8UojiH6;_1`rBF+k_>CY2RPLF?dYwK&P%kylj`NZ|(j&Ps1 zZNG6tV(+%8QOj~|q;GOvy?Tv_Atp9K)?e}Z_-}i0b z^yN#*o_#-ZQ&zcrWjt{4qToiuLtV2c6$P&UI?uA&FZW)ju=-c8>c78A9R+k06c`x) z{i|Af)jc(p_1^yv%6p~bQqA-39I$@BuYdFNE8qQt?cUcW#MlL8TH3{bQvDaV|K5Ww zyeTX{!k^p`x$M%VOCP@NelL0D=CqS3KYq>5XZ4ScPM$X{Yx@zK z`nGKobrVzh=k8#t6#S^T^kJ%G~T|kQy2~HR99J za5mZMjjyMvcJ5uj|Ie;9Hx(ilYu#M?sp@kY=cmt~H~u)geHL$%>8f?>4vNRu-hITN z{IcD@rPJl7=gdZC_67C->ntiii8MruPmQ0hclgouc;laQ7u~uQRrBTK^Q^h)@$vCJ zver@$7bd>Au+TOu`*lE6RM(X&CNdTk0_NUcBB#BUKK=1z^Z5@Cf4^V7mrF=mTKUD7 zdHV|(mEGkl87dl!6MWFX(^(!}`p_u}~b5kJ^}96ouGQ*^56iF4;1?_6Ab;?yZIo&9BR zt#<6#k@QM-GViVPEiEoF9$rB{?5u1_e|{8leE8n(Zp}Ys`c!3IUD@jI@0}wfcPhO7 zZvU_4#EE$yK70^3v;Xb3hZa)xK8CeVP6VErYkYixk!<;w6$w>G3chYid1tiNH!Di& z(W92z;&O6*3l1<`xpwu@tEt&d?%Q6!e!cO@>GfCk@kxt_w0H`uDX6GO+`D&g#k!S_ ziHV9rLVgcCV&*&$eD#-|Psz$k>Tt=On=w1HM9;1KW06_&#ZJpe=-$111qB=2Gb1ha zQezJ7WBz?r@4|ka*fu@ISOGb)W!E=un6fRxUn+7{jfC?WqtLLhw)6Xc1bvuNSW;rb z#`~gw!2$;hOUwIK=Ob@gl&JW<4Q&lw9e()qX>MirSNqsHCoWgLt-JBu{DrwG-jPZ6 zYj@6*YO0;R?QWX%={d(&t40OyS2H&ke|>Ge_?;tf@2(bSYp2h9i5$R{r&u_ zQbIk>?`X-ry-oYxJElC_m*20?GCi@UCbDpDaY4a>9fpf9ZqJXesIFeTY#ZCm>3Ye> z*UjBg^mLWdS|7E;^Xvb$iqEURw&1PGVNhFk=P3z=&+=6Q&(FsP#3%#@={@@J(4t4m z^w5%@|F(wxt^I#AGYQ|@p&8F zh<*L1Zuq93o9F86+k~8Em*Zz7%ahLDuTTE`Y;D(1Q&ZC)AD_p6_%=H~q zz-C{DVpCJom1+H*eaE(}3@)%yWVHXkNhD}x$j9wdwf{S~R7f0ha{hYn{IR}%7o~$u zKlu|6{V2?0TwV9~SJJP!!5d3n7RlHNEuRq|7}&_n&X@G+ie}T(#lOEawzsz@-R|n@ znlNwT!tbj^T#p{zF=5J@8F}wtt}M(kD4w2~JEi`?*SFH$?C)kTFI(qz+Dr7meeEwE zz4&uNe`^2zVK4lBq%-TQ@{Z#4FTK4-*F+kB_&G_R#eUlL{2ME_Hcy!~YgO6x;u8-X zD@q<7{_r6~{S33i`?$avX1QG3^6vIcT^*+R@7je64WaexjzxF3KK;6{^82HGmEX0N zndjVTxmv$A(8qtC3FqhM-17@emx7b)q8f?AcT&Bk@4s$(cP}pw&ws(xyPwG zhPMrpkI43h|JlEIzWltZPlZRdi%umaFEXsX74qhOJ;Ukxctws0|Gr#4&%w`q)pARZ zD!4Utaj~1^mFLFW&TEueUy@+q=HNJ>{lAj)-@mym_5B?D$7cj8e|-7;&}{Bg{u5YP zSROo`9v4y_YN=x)ve>=IVP_DtMy>|nrD+f4~}@8+3$KNt6&Gk2~*`njAlv#rAo?Ct)|IJW!dspdaZ zr%hATw~v2bHrKj7?qfZFe_4|}|8oDimu80PO@I96=CUt-etsPM=4bED12szTZ3;EW ze{;jI;@{77lQNO1+aLa`{A^IY>_bi5o(jQCDY^OQ&z=pn)(0ikN7v)8-Z)@B$wNiL zsKVf0S8eL^D`fVD-n(xvBffmw zn#GHi-FW2nW|aTg@o&BRD!VlMq$eB}797dnr)gY1D`{LM5?A$+wfDK#&u*_%Ph}X| z_+*<-PF8!#BlP>%j|cblZS-$UzjG%hX8*dMg0Gp``MH-RCoTH;#@K&#so2z;H*Y51 z+M-!eaj@p#pD9zi(`sFB2jp&@XR-;@@-dyVa>4|?isx(1P1%-A`7C4k$!yQJTlK8* zsgpy)li%LjzgElNdt3Cif`4Cfm7@;@{mxwb^@_lo+bgoYbGK>E05y1|ZW$!Au(Cb6 zTYm4F1WR^GdU|`|<71EZum9tIVgK4mCt1u>Ln4Fk8kuL`3^z9~-}CX;>MX|%Ztvc` ztN682JuyFj{WtUQaPvJMZ`E(@yZ-#mo0jA9(H!FG=?DLGuWZ|2D+AyIu->(`pz{AHedOQ#~F{KNyt85V_2_g*gdo!zu9wl#j|&E<(XlNta1=3X{= zatZ&s+D}(rF5B|=SJHuoWnaW6O$v+*U1^$IR>rsF(z1j^pOP(6&Pi){Xa5tFS)X@z z*Q19&`CtCcy1ypU_`>4d1qDAUmWH!#eJU&<(6D@71yf&NU)57#5s{Ace_!E zv#R&*!kily6svf@= zYkTX%gTLR4pRq3a(eYp^>qb!jIFi=FrmQM`Be&=Il==ntuNH`dt3Q zGwJoo4-a#j+zXxLq4ML=XaA2s)8!v;bQe#0XIp$><>Y79;j=tcgnEJ`&#&LP+){Vx zT0|Tz^V#S8`iJwa9$9NP$HvB{%2m0o5tUJ!?rv)PobDl=spI`_x#_iF=MDLbqqFlj z`yPxrep=$%g*M6LPj4p++==|YL2s2>kM#0yTLS+Cer4EfdR4c0^R(L1f`S0=^}gTb zVp%Vjm6cWP|8-~W>{st)R!&nr86v^4*=TQ-Ytj<0#eZL4N^Ls$wYTu0lhCWzuSG8h z22SMQ;<_@?>GU^OPWfg%P0dhg4HF#`o^^V9T`xb2>n+$8_W9fDdoy2N)#kEQuIAEP zlV0NTHdNlX|J`Nx?|d&_9%@xN*x&WwL4u2G=D#`X^)6nlHTXVn_s93*^NvqCZ+CR} z`#q{Zs)HsO%x9>tUu-|K`uCB}rk9t~{TJ`r<#zg#Q(awMR-;<1jI8X#*UB=x9WKW@ zbhxmYYhepY!HPdcSN{tc@7Z*R`^16QAALbU>Id`kSE$}$cw|Jj_ zu!o9J3E!)pjmgIoj>VS0+MC;JwYuaE&&wOLgQM50H>93wH$0*joP4~`%);N=+PY`H zL7c(+FEfq9CN5ukTi5VBxRDl-WxsaoyjR_|(syq;&Au!2%qH%b&~K@fp2FngQgeGQk2;(1rWo3lrPhrl$8!We0MJ- zFDv`?gsDsKSA-w?BM^L!n;~lpi*@^|JDi=?Rcme@Sog|8c-3nLo#0qZ{vo4e`noW{Z3rE`||Sqzi-n#IX4v-T`+aAQ1fzgYkQ!r z{g<8NxLS7SotTFSv)b+`8oT)Qec1Db44PIE_D8J$|WyPuc+A9m}CB$sAXpUKRfjvT+{AZ)o&7i>Wm0a z$^GU2!L#fx9#S~@vsnBJQ=;d|Lmv-rVGZk9_^YdPBcq4&=ggPFxs3n*1=LN5x_|u3 z+c#%_7rb~eQCXzX;K8-)%3J5IPu5!R+9zY^^tfo6-sM##wRe4I|Kzu8I3&$#vHFu& zzNe?=w>LLe|8Utcd9v`X^7nl!PRx5DD%!eYg~#G|O;4XaefVbPW{cu)GV9`Yx6L-s zU$k$ZTv=IJL1}60`t|%)?5qompP%dKdc(=i{`Yw2MwRH5>eKY(k8Mbq`RS|izPnpD zZ+3Ry?{{MVB@;QHOi$0vjRwWfL8<=a=X4+GOs!{k&R+}g-nG2@*iu$jmT~`{u&V0Pu1Zx^bJj+K?3K~e61;zVJxWkG<8|}q&4&-$pFiHe ze($;&CYK1s53p?8@2ssI>9NkH--oE;MH`e=##L zd2nLlvg=B7=ghfK-|$O3g5mV^%;18eqC=9_-;$8B0?)Jv)BepnP7^*67@|z88)O{mwl5b&KVj+cUzl z^|;siW@jFbs^WclVPCU?z_KddjZ=5A-nh1JlEsZ*Q5)ag-Tkod`;SLoFle zwb@#TdU~`+jw{6SAU8&Fnc`^ZSGf|mYq9xaO~^*_;2@n1(Pl9FU=!7eM;ol+}{vrICsjNH5@H> z_e3^%&-7(}q0N3`)+KjsCeS(-i}_P}7B=Ve`pud(OD!U-wBh8mAltZSzlz#duU_r> zIk49B*wLdqU0)k7eYl-Bl;seE!oM4aTODS+%AUA=WsPI#Oo`N6Q*3N)4NFhS&aisQ zcOu2;$+M@5=IY`%EiFB~{f|FA9hoJ&W6Ktknm;d>S7d*b?n>CP>B<(9nlC5SvzSZT zzrASO_cuvUM1sS-yxio3bU>`GbKpncn7vi3nkU64&Yr$}n_YII_tzy8EkP{?o#3lg zHV2oUK08V1;1;{&(iztN-rJ*dxB3RCUaO1pw!JF;+w9rpTc@0|FW$OkP#o`^voi1I zrG1kuBsew~f%-Nt8reTQy?$TgS?--L{B69_T@TL9efVHWyuz8|$Jv*9&F7iswN&kX zSm?rq3kymM9jCqtJ6!zjP2`>O_c06yTDiqVPJ5~dZS_CMynUb2%O_8k>|ieWcE-|G z;f+(!q=cIpQw>i>ojQHmyI@aOSC`DNA3lB)v|+k?sfH`$*!-6dZr*!QIx{LK zXUzf|8Gnx>hxzpzx<9Ywo*1JizDMllLg(r)*FHv;8=l&-bH|Py3OXhti3@$1OTCu{ z$=FKu@4vp*Ju~uhUEIDot+Bhyl7D^4Y$`qRwCK-|%lb{{7KOL-Rs4$o@3cN{;@Lds z#6-n!Z><|jrOjp}^!uEi_Nr5D8EEEiw~wfpsN__>9i^X_xIATdwYHu2#iV@Rw4Cin z?CPf_>HgLXvo&S;Z8q(q)G4Rz1l`ix0%`l(ZUo%jw6s>WFyjA;juu5{Hf}bt>8GDY zY^$-9l9GC`;`t3GM@Pq|%&YqBGn<>6n;&$}fAdD>=;Ykx=S^z2DjRK5x3RIg0xsj! zcD?l6IC;6BmYk`5@wYWebp_AQsa0=XGV#^NQzuVe+>~;<-6^acHVgDz*J@TzAKi`dL>eCO|r4EF(`b*QuFKN z@htIwb9aAVp*w%xyuLqwY7Xw1{{Qo&xVf$mt}QruN`B1-wQV8(Us5xE8noR=)zUUT z{bI}Yb+OL1wR;oh*ex7-<%=^vfbj@pf=1*I(ye;9ro6WT_u_)&3b+>PAc_LNx zHS6r)7Q>HX2yFa?ZCVgGaCgg|bk0X=SeRuWV zI&zF7zIOMFD#6myQj5}EniH<>&yQdG^7k>by`Lh&!urmfIjy0kb!e(~xaep0FYogY z>F!hA(*7Y-^yz`Qil8>)?AfbJ*K~X^c*yWy-G8o;mOR6W)90NN6Bi~$DNS4uy?veA z`tvev{PJ2e?8@Hkc=Z3H*MIhghlg8EuM%4A6CL&Y+q{ZD8(o_!TU%SR%4IKy>V2@S z{$}#y&-2Kas{^)$`SUEyhXjZ6XCbfCUbEu^nvK02%NSnVGIja*W#tS|pGfHUpGdFl z8~(-M4w155wkG#l$LtliS6$Li<(Rk2q~()u9m9)jYghj=J<|4Sn(kZe&gRAqVM+!D z494$v1slBoK2&oITU7C>kM7IAgJ0It=>Tf+4ek_?gqsq|5BZaGC}@J3}zms#ko``Kz@A*H|P+X_1$ zhKTUHS()?K@BDIY%la#3h62~ReCArQ{`)sq@Gt2vunwf{#f{haMQD`syQuXWiQku%cfX*~yTXXllbl}XqZElJw7Y#Cen z`MIt^MMkHlST!zo@69TUO`4jS{N(BL$19i5Kgup&*K88*&^#XU!T6{_+!?J zSK(o@Z(7!So?f+zC#t^4t7}2t%foT0(s^Ri+x&lJz5aSc=;>jJq$!%A(&jlP6*6m$ z)6XlKnuZ$W|Ja}y1|Hzgwy2+$uo670#PKcHXR+>-)@uv4ZcCIl%W;aFndsj-*Q!+N z<;#~%m9y3xfPvVdhDPQqcIm69)j8N7{eM|MRY7s% z%g{+TW@PM*=Qq6)GWGG)0wqD~@^{y){~l~^pE%{pmoKyS?zLs(lUcCs&Xf+t)hQoV9*Q&WGud>;Sx-H&^FBAe#d z{c|eu)8?f3S!^dGJN zd-i|9g9iuGE>jWf(%vPU$t(KTWA$@chRp`i$ZRFdE&q3Qo@g0N4|6l z`e^SDTWKS)egb{@7BVhZbD?cg+3Qe=Im6aA)V{2YdertNTCd zxRm_F(D34ikKe9kgHo>Z&D*z=-$*CA` zHO0mMV2P_M>omRSYj0l9+gVvz@qO=iR(Y)p;Ry>qn6}O~_uf$Zn{VsW6r-89Y@D|~ zg%lTtr>3YK7Z&<(_4@qw|Ud%kKcB`=ib-H!SMauUiWONjjzJIf7cva zl7IRwN2mXOf4)hfl@I>?F8K9DvbjFSOGU`$On(!QVXn`dU8U)Ku1@;?EN&%;<>S{hedcOFuuq8UHUZS3SMG*qwjJu3el=5eL>D zKd^XFRhH*f6&o87y>sU#godyFyVgJdb1m<&bLaT{?LJz>)&Au@xba`|)%hLW)?Ftj zt1D_53EA1%P4H0Bm_F@sQJUB{d5ezZ3T-~Jl)b;F`(up>Lywf@p%)1&m-a}R3QgBf zXJmNw`Zep^S%F^b{mk6g80Ge?3|{u&!9nMy-3MNq51l_&6VA^=027*eisy7pOC7Y%n?$Ntf|of@0X=suUvRzyJ7FP0I@Z( z**S-m4jrC2YZ@DaMdc@vdDRc^&#GpEw6yH#?mm96_V(t=hzsYmaR^9_wLQGF6W!3|NriTE&KNEt9Uwf`iFbf z@?2I9pfwLiyT!jowYw-Coa}G6?)z#rK0dw|*Ui}q-5;}lu6A{OS;~F}w5nm_#w^(l z6DH_2HC{ifsG%XC|M$0R&7YIYo2)-X-n{waU;F$oQSGZ&OUKpxvz*&(v@QRA=k>T+ z$@lxdH$GSwkeH|#wkD!ev??$Ef8E~=A11bcjft{xX5+mUQ5QRB?nVFO;V!0vi+!XQ z*H-)g`F-^H$BXLoIp-O9dhYC)G9~)<%ZCpc)z#HKmIgUi27f!i{9Rcq==1W!;&wLj z>-Fn`FP!x7_Xiyx!o$wa{^RGbMeFv-f!a#4>o>?Ptaxzn_l6&5w|~8-uCA_rW|pP! z>1qGfX4Jp?!+P*XtDxXA$>ZyFuM2xm;ZKg(<)b;{$GRZHdVY9!Lmn&>cOuLKpQot6J|PNL`Pty>chxAQxvoS%2&$N9Az<(CF&URxL2 zzBT*$%eis$vpXb8S1+x#OTN7QX<5sWqv6WYD?1+_=Vn`I?h?@-u;=%;XpRrx%`Mh~ z0b91TKVK}>UW$?QLpU>MetE;Ooz7#!adN_OU^O6@A78aD2 z8dlUMP037dX>Wi0cDoq2UDZM#t*MK4?1)Hizj^Q=Blk1=mX+l`*LMB$n``xOsd)T_ zABUH$TgMl^KGxaMu`w#$aGAgSpYQwsH+FA+c)ae?5l#u?T|fJ!XLv=gQ-7u>e@tMp zkLjvOCqG=7?4R(Y<2H|<_0ztS6`wvH=aFl;HK{Uc(Osd>erLIVBh1ux^&h;QxJJ%) z*W<_h_6PdrT5l}9{Vi?3#Bzl zdIpfTvqE>{&rbAE0WH;gH`h8mJ3TtGqQU~CWKG1*ptqVnp`dZfp55;b9pQWon#VbG zNNMir?A!Z}i`jN{ba1SR-p|O&%9?e$V#n-n!dG*5&YQ8jM&j_L)K!6@siJe{%mD@S zg82LUBDVh0KbqZrtK}=l(L2@e1Erf!M}6MnvRn1q&&?)~36bOt`Io_U|K@Ag+B{W+ z?$}m~{rd8*HMIWU(u&Za*&8+(oZ0F898D`JHEVKImM?kmtM|3W&PcAvQd6rf-(A}IWH0QE zHvjVS^6eLIbu=}Pp1iz#!t}}Ak7k<(hDNfM^Oyhl^;1!6llmg1#Sh-(?Ao1Nv{UA1 z___zjdZoKINeKxt>96NgJMA0_O}Pf?GjHuHUjAU}%fiRUk}e){7rFfP>({R9eV^7n zS-fcx)3`E6+#iwLxSAzCQ zP26GOCIQ|-A}A`j0j;bq^z7(Z_>`KPBJI(qYFQ?x5++t_U(VgCo4RpT|5EncMb@tO4c?j5eP za_{dHK0W>ax*2ljc{*acH7-YVm6W_U?-Q^UoG4~#xijL=HR~0tR*6&xLsp=#5Cv_* zi)uY}imT?|QE{Fo!NA!ek)fQGd+)5Nw6L^1c=F`QHI<-9h_q%q)UhJeqQrvl`np*0 zGtxF00`GPeTQxN`1?aDL{x?Fl}Z2SKW^C|w~*ttVAjuG&^9Y2rA1+&Jx-gd zN=r*moIELdX7}rJ)>E4jTwGjqH<$mfdvkBEyP<8)2?3w^cD^7#`bLCzu2>36r>nz* zqO@jA^HAa7d#7{hntgkAV1E=xofDPXM>rW+GIs-ZSKm-pBmGrE#4Q$SI%Ev@*$@`@9wUJpdD#H zFU?!COUm-*&F!Bwr!QKzjcuKt-iJ@0oTg9Ea z3d+g#>BTnj#$CUx%X3+uPgO_w3y(ASl@PZQfhoZD*IJF5NL_W~=t~ zbqg0caaCJa@7THX;QnCsmX?+Sr&l+h{KVu_-NU08HZ!9;=V?ULt~Jx9O;xhhWmZ*H z)zH;%Uc8t2&h1Kt3-%0mcbB(s-aOg!)5Z{Mo-KbQqBhlTDv9QZST{GH8&tN=o7gDL z%BrES>t5<>ddK$8!RuPZ1r^4%*E zoSk|3=!(V9QdVwK4ZFKBiyOBW?@g~}X=hpNzWtq=_3~-!%6WNtPnj52pUxj2AMeuA zzA*WCpVj5C(32Bp&FTW}?~ROHnQ{Ek;lp44WprC^X}!NRrIM#*t6=5N${U+fr5`=+ zcMOYNTe`Eau5O0S&$1plQ?9(cwtCxFVRpnWyx$qq2U=|QcGp)8Jw34{oLoGICY`sx zm~G2Y@X$#pY<*<+moFu2Z(rOWZx5>Pc9p(f^?loFFJIrI%g#m@yt6z0_`@>JBRQ$gC-DFwquZtALYyBC6`wzN`0(KerJ`b@59{yO>d)Bz;v#6m@cOJ{cfMx-ZR@qDf7p~1 zwKML8v)=T_cfZ>UoT>i!GyUPii++zkT?+`4mXZRkxVydWy-QZss%uYWWMm8~E;#ti zx8sd;-ct8|mdg9KCVIl`+1b5EQ*8|ZBg*$A-e=GWP~ea%IKuU`E1 ztE%SvVSWw0eJf{(i%NFxPCtLCI$BCf>ceII{f};K&F-qSyLYeR(Z}Nn`T6T-r1PeF zui2H{`OQ~v`r`)+58v38Yh6@ayj9P<-~hv&%I796t!+#@N_9=yi?4^WFZ~n~5z)ab z{r})WXZFD8=;ei#>-l62l8?pCFsO@Jy~|8ZMJ?&SxKZS|;M%9%Q`QJGC$5dj&DFiO=CAbsoO_F| ze=_Id`f&Tb_J-Qyet%xCR2LAG%bQli#l`jE`mC)tcIC3mMStnIXTQzc%Zo*PyJ9o@ z;%(db?*DslEfc(pL29$y&X~Tb^=l4Y%e_6@xBk-=%{g|(Y~6CP9fpf%?{CnWd@?2C z-)*ip_5}{>pI*Lv`D196)wb5whbz_Pf_MK|VRY3nOS5=dXVW34t$uy0p8d<~d3SfW zqVeZV3!G<9n9#8?`MAWMbw3s#XSppQBeTYoBW>lc(xom=DgjovVY;u+v?uWRMV{Q zi(R>PE$L|2)Ehgi`{Pb~FAV}s9)ivsNbZ(9dSRjSEZ@a1Wf&dOo~449>aP-ca{;uk zEqYtt;dy(1Z+LOBRl+W3McnOG`pN4}_g1;S^hsW6ws)ydtoz%yZw<@7MC|z-ce!`f zlP4lBE-nhY{PXvIx>5f@;oIBW`ZK;?dt}byXy9-MTGEs)UceAv`<2&7FE*>}<`H4_ z2^Ei6mif2n)>8FoYlH7z|oO<7Y@ zvfqB&i3RQ4M|PN9yMF!g^Z2@>|CrfJm)Tan5}7o4^2bxB^%tg}pU2Sf=8cTb&rjYl zyUSwJZ*5LL|M1b#?uv&yp9@G!Uv0l^4OuPrzWJO{44fchOFKa-ujcoYE-yRl_B7LT z?NVR!aM`z4wS_J(^A$Yv`{D8V0g;gx-&ApTcYXN%zMkXR**S&cO3Kx*w#H7=h)%jD z>%Ar4(sJjI_p9??h_VEKJ8wVxRGmfQlTgFrhc4l?mc1t{Qjf)`>y5)tO+bF<=yw=Rd(~M z1q+YlCF}m3-F>Frzh!IC)~%&Ko@`e2@Z6~}!!`c0_9&cHf`F(dU}2AZazJ|bu+4tr!;>vHr3@VEOcl6eCY6D zK@o|DTf3rS_7?d*U%a7LNJywqQPa~ zuC70luf~HGY+G&5e!1!CidCyZe7?W9Cu^L3=0f&-ozQJZR#{KWxSw}V=U}yb4a3Ti z8TSq!W>$8;)7H^Z09t>)a3SN-qenrbZqDtGMV{;Ez0;5hnRh2!chjcL6DLeqF{7-w z`1p;Div>k*3eS6M8>qPU$k*4`1hE-o)1b~`}W`nSd{ zH*(i3tuLNf>Dkr2zSJ_`xdf3dybEJut|KRQ0-pR9O&5~O4^LKvEy*;4@ z`_s?QtN4A^++A$u4_akfy?%Qmw@jmT!m5uf4Hn~ohCf3jLmwx%xr-rId(~Ipp?EZ-5 zv;2;Hxn+KH7j4^PGg}1%+_czU%v&`?)8cAc&it)Xd^`rku zm%X{ObcUSeBQu+?PlU5hNB)Ya`+fJjMa_?nq+btNKO1H)de=AGXlG1c_4{fEgZJ(4 z|1IBYtQHn&Tlh%D?r%+J!o5E~`5%4j6yC}g6dw`Na(;S^;)?}r?Cg&>``cZb)vtOh zF<92wd#nGnGu}OA_oPx%Vh&~J>xB7i&wt-JzwSqzJJ-T1S3-2^UdtZbqu9*;@M0@} zw(NUzJ9DKRlV-ue_%HnVGlV^v5SAF8)#a zGUy;bw|IJb&99foUu3j3&P3ZaV85cg%5Yu(u?;S=XHT62T?gCv>({dD&;S2Eb-JUs z^V*Johut52c>8}}u#dH+<-^7N_byl6IieALEuj3&&3&~$KB`+3KUB(%)Y?K z3O7&5MHdwiTLKKV}l zhXwa;N5sZ9JGZw!O+7Q?V%F)Kr#4Do~iMYs%n6{3N*&lwb=Dy0NwQm0BZMXA|p4Q*55pi+rx_xr{|NWYM?zxF+bmrx= zUwho#TprBJEa(2T@6W63gX|YydwHM!@V5LA|7`v{_3Qm?H?B8My}PL`{dmaR+aDjR zPiacH{BB-Xq_KQ}Gz)XXx3{++U#u+7edNtz$i^qr@ciH3o?}-H*!d(Hb{5NtJ-K@A z>cbzM!dc%o{Mmi+@L}Q4@s*yb0z4USul_ia+^==^C_BTucXBiSf9lS9u9kiMoM`d$ zGi|dEZMbnp=kD@l7mm!j6;WLCOzCp6!Wp);k-Pmi?DBYiZem5jGv-C=W%G`TUJ#Z>tV&mAbHB-tEd(PRg;c%Jk0vrfc2x3v=F1UV7Upc-!Z14r-GX zofADyI&V(vTDM)zRptzhAvxA^-fn z{Vazo)-N4_Ze>ZNC@aIRvbRl) z%q`lN-`?2gy*$}xwpr+h-nskKdgS%1ZvWU3v112Ed`s8q$8q72k)2m+f3sEwzu)D( ze3R$WpdLwEuL;wqO;h_7&6OOh?7L>A-;Ai=-`*MqEbOViTJk%5OZoZurY{Aehs9-H zMrj$j$A10tL12mYDQ%bczb~wr`Q!cd_=Jal!VP{OjMUoCXc}(4rcVzXA*Neemt{SF z+v=ipkp2Ds_V3em4$Wy#Prh|G_~ORJujH6seUrEGuxJl*OkC)fDq)_sX2s7Bx4b+h zyEa@1aGaMEyIBR4tN!+QEe$#|+nW7dZkW)Wo!R1jvetV3@9hg1*!kopEw8QF^YMc- zf99KmtNS!xPcyZ#UY2!#UChp=FC`DVx{cq>TzA=ag4fa+hRM5Lyj^?o%I;+^O#GK5 z1#DX2@b&MOFS{?^ycxMNHc(y5D(K~&So?a*QPcCzr31OD>g9*G?0$b}|NMXA)ATC&^Y{E)_2Bu-mxn&Lu&}@0 zEAsBeL}k{O$?AOz_w92$d(G)xUfzp&IX{HlMyoNu!hwh1v%X9H%;4-O|$4 zJ$y0w_>;_)AzjgITJ_bhGp>KKD!zL4fxyG|$!l+KTNshj;C#ls=2=#I=*6#6vo?c< ztujuP-J9p3BGl5}s;ru-q2|9U_W9q#hYz!6#xk8{m@vu6<$1B!(jXpr!Z+;Y- zM$ewVcFW6Y6>iontPc-HZf2>x-tG|=67pbn{yyP9Irr{Ze)xJdKO@lVl)&8Y7nkNm ze!6Lx`g_?8V_ii>#+rRKX~-0XJ75F7hC$16t-+~0!M(Ml~q(p z!}`644DNSy%y#*{;Y)~wQ*{0j&&O+*_L^S5zcEFQr{(619-YMPZ~oQ(UUf6b*x%pZ zXPyaX?eA}n5fLjcweRO?6%G9L{k8h8-`f}c_+e2|buU9kT6%WDzdbt&-v(Zs+bdLh z{dw!RjdF0=G^~Qd;N+7e^}Q)da%&hZD#)Qn713W zcEvdtZ}Xp)$L)Lb++|)lE?d3Z>pm^_jmVhcw>RU~t7}`k73R*I+3KdfGk)8pWznxB z_rBd0ZMdM`zH--=H9YtKZ;%1ur@2k+$!@()=jCj_Xie6=qT4)AR(Mdl$55fn{IZGi*eDhV{TJ#NB+7iA+ey+BPBX0{o#GZTWv1emVPns zIaBfaW2Coq_Bv2n-ooFcwtCWh{W%fA)AQR)E|wj&Vd&`V4BEW3ENG=jVd2K6bswhd z#fM2nukYHw{|8%yuzmd3$>FP&8+YhEtmN`8c<<}$n!Ned^o3@AT)kDHQ@`EgJhsd2 zR)qIl1M!t1U4n;$K0H3J{iJet**mu`C;yGx%HG}5^;o`QhKhW_p6trGJ6~mGWN@_c zdLR7u*7`~1(W6HrejRlG@b#?I zs+*T~JkPvs>?W^x@Sw#tHQllqla@^lDN!snihX{3b$IJ_Eqi`Z}%t*B#e|4B}&18)kmL z-@a(|^#Z3v){~ny73JLCCVP8Z?)2%JT3TG71UqR;%aSE7YwsJ)S}hyqdObVi+_#gL zau;geuB@IGAJ8Ct-2cIk&dEDUej0gsdtbbBhi7F7S9y6k3mcn)jSkPlhYvlxd>S@y z{;~6e2rJvm|7$#!29NwPG{_LTqzV_xWhZ&$kpvG zM#jb)tIodv@csMoCAZa+B2EQt)pnn`TGouMc$ZMCf zuU=(^goi&q)M`_?&u;RJ_~#GbEv!}My(6mTwr;iYJsFd>4O7kTUOJ!AFL(FiW_SLj zmOI|fu;H9*?JiYPSA0#^+s1lXNVNKz__uey)GyyDxncd@O<#)B`E!=`s@^{2Fr#3eL>CZC_bSmwBd%vL`hS*r*Ej@vt{&6oMi z)Zr*HH8DvzANMe8;&#n7d{?I}j`J=qE-E_o#B;KNjw);Qw|}jN-TM@@wWA-~B&w>a z{`|Izv@wH3cs{tvc1K6~e_#AJi?-%m7h7us5sYRPuri(X{ru%`1&!#7tY(+`n> z7TbN^Ca8Sg1o4}fg8+Ogv`D)tId9uMlYs7WW{yM*O<@-Ip-_Be*Ki77{ zRI_P0+{}q)$IhPh-LR?EF#Jiz>AQFDu6Q2!X4mUy%j&Z+x-$`-fLeKfUf3%tngT zU2ERt?Acwh@lwhI!;2SR++59m$jSNP!^`7Gk?DPsoOf+V`5?!T^Blji{%IV33U_G zW0mVPd-}hBy_TPulPw}3ps+(dms#oCk-*n2n>QN=wecKXWt#n@vijRQQI2WW7}wGt`@d#)v81LYJY#cz3OU{=$UhKt^0MOw6yPZ*fu4#N&OjP2U2US zQBL=xSvfgQb#?o0?JRnfl+5~4*}eZ&sT_lbhK@sE;6xkUi5@)jM6S*{a+G8G8^3H} zk&WtoG3riD%@?w*^x7A(KAVT#Ds$!p@%S7yI_qoNb;yf?3S z&XkCkSyPTZdi=O|XR(~%6H!r7&95c~;nq1k&vNF=EY;nTYROgqM_onb#hq_bpA>)k zyo;O?J|+8pK3;0<=Y1Ze}7rZ7kpjU+unMa$l4En-qwri|Jv4lYFT)6qcw`(^*lYBzP!9F>2*J# zv+&dV$v?gq>nD6uF8+A1U0zxD?S==>V|R1y-+JoQxnq^Ki{D$9zZF~}EcEE%)2BJhMP6Q|+&QwgWj?>%#MCCA3c*+x7lqEh*jfC1;wYwYeezH{e}!FR!j)A{57f0vHgUFQ4IAZq5W zyvScS4VNx)NnF3}%o(4bdsgh)QSwsg(q-eGP@TCQwPCuA@7)gH^pf`8*4k(wEi70l ztfZ{OQmGyGXVvGze|I)8I=r5=kDX7>rSs5?e-9q?HOUz;Z1{70e#yI?1us9P=G@v6 zIl(;VMZnzC*=L=codx9O^-uh+eQPzhfAhohzCSXLa_upySCp%&&?|d?FMExWRO{mF zopF1s4qg82)}Uf+EWGmfH|}X}@9(XZwko?~cW}+pbxY^ZpRX{t?$?$V#aFLhPkz4c zuGQ4@LR?(jA8!c%Z{L1DvgLh!M4za3_^Utcd%HImSQZ@(-Eamelg->5azlH|x@}?0 z|N5t=Ja`|xoJZ^M`|P^wm3?y_tNSTwYkN;9KYf;&N2^`SkL!F@X6KG=hr{mmKdWkdz`R^zUUS5Z?-c=ICgQ%Pnzbn}^6=(lt-03jTE5&H z!uqQ|zFu|pnC1kIUv{gf9VlP?5LScoO4--VQK)@UAZ3<+Ppj(x-QC~0_H8UIDssBN zuXf6|*%pO+6#jl+862_I>yOHO)2*fv+uj75nBJWcVWObGQ2YCf~*&e&YL>H9VV-M0pD6)#h5jLPNge*fV<$Z}$vg2O^RdHX^kQ`1Lw7p6}SPq?W* zUoxicQx{jw*RS=i^$nW3x`)H#|GQ6^erK(=Rq3mgf=H1{jW4s#TF!1hcFZmC_pMXE zFU~ptB7b!l=d+$yS5^w=g-6t|Ff8+%+r=kqb>i~!Oa95thuT98eImE7d3e)ssbR7^ z_a$lb{9_xFAGQB||5rQoed5|*22UclvQ*cb&uU(~Wn+r91jlB_?RRVfGW%xzul=oi zZS8;O*QfsnL`m)Y)&F6sebJACAHRQV=H9lol&t;rMeNDnZB?fGe*a@XD70-=%-%BI z{QX-w(u-S*weFZdmRmjZ^5Gd(-`};ai)}f))GqFuX4%_o_nOu8_2u8|M5)Yh*_J(B zucNo`;)dy|7FBa4YHllRwg3DntN)(uQU0qNk8JJf>T2pg#XOxk)MCR zkJ$c?zxQ?ox4OFe5*}Hd6Sudf^M|ebd)b_Dh$Ha_;Q#%-p?em(^06 z=t}!puO-i(IU};iTt$fU+1W~#b?er7-QKl(cjCP{?W~pd|MxIeR_^lOlecPDs_yx| zl{|7L9El4Lah{xB_e1d8+v_%WLewTF{{AKlnojeHv{7xdSv@V`{Cl_Jji73_{h8$4 zlUkljgKVtw_2Q~h_bq7r|8e>JiL-X`Cm-u^3QAI9Vq#L5=n)VZ+F88w`Nrbwc`_Cn zbJ!IP3f zeVlMBG3V~C&<#gSE=ajZSX}twEV-u9Md{$4oy8yibnBnq{nXsl^xq=&AN)SFeO9+wT`>zjSFs>T9!u?3&@>;b&?d*meJrOR^}M+tJhEkW<1_bZ%bY zuSl;`0#oZBWGB7Le);NES7Gw;N6SUEpHwbgnp*L3=}!sUDiOAC@B1%o2-sm^y?DzO zk)6-aJ?ytPKh@q_QBiT|W@HyvtL5f3XMYqv-cbEr&hh-Z(CljuO48WWdZgQr9I2=* zSiN*9Yxuet(D6VU^Zv?v?LDaGKX1t=nP)leys78Dot$^uDb)7gxjDAoZ|2A>wJci` znvuaVY4YU4O=q7xsQ&MD^r?0@=&pMOO+!IFJw1k~`MrDg)V#U3Tm1I+{OR=F8euOo;6GTD)mf@rKIJVkxQV zr~5DO4%cs1GZH_2A^qx|H$U%Y_-(szY|`5Vg)?rgt*wu4*4sC`cHbASaW43Gh_&Y5 z(eOom58u6OO#kh9|LaG3w}$L15CzP-E3y;;60 z;K{XZng#{}`g=a;+^hL4dyxI{nKM2qX=z=*i~rn$tp%`Zb5T0Dxc{8#$qD?)gWju3>kaV+Co`O#nXj#l?k|0PE&I;*M)r3{x9Q$qYbWsR z@#Efl`_KA&c2{&R2zPLEQ!_G(n(wNwufJp0u0^X>d0lARR(ikodlpXttik;4mRQ*J zD=W^dzgoCX!F%@K2R?f?B`kbkdG6%NgSX%7G;Q8&+{DCu@yeZ^MT?XUcI{vgkd|%! z{ce6ED|h_m*LRfLmOjYI)8muLkrfJw3v3kKzvf6+d|215|I?!Lj!m)l`M&Vl)vKbx z?{+ZXulYS!;s2BS%L_iem;P*h^!RbDcU%X`?)5LLbDRGEhw-{?Ge6krnD9(izq{`1 zjPm=oqV9ciQ{PuVbdsz4n=6`j$2j)&zGo|$$HJX8!#>_>{Mgk3&SnjIOm?jlXZrxqeO*w92ui_0_gVSHEPIC!fgOo_YU* z*O8+~A8rj7SFniq`iM0&G*m-VGfo2wO_xC??#AWr3TUDiRZU~;Y`@H4UgY4j7VZGRWJ=xdSY1U47e{ZdHT+K(z9b1bp z|Gu-ew6x;Q#mYrt*F#P6-bmP3mG@nGBznv&>j?*stWm`8wk%L~y=Ghp${`fqv^wxFL9>06n zD5%_)_-RS!hl1}HcH~COHZ^T1IH-MN_N*?`?7HJmPls=LH+jySo|WakjyXNay@~r@ zF7vDSK6m?u#K&rXK0aq#`#EIC4vXXqYnuzM&kgo5bDyATku^8q>+y#lrX;e-UcPgE zlXHMTTz#%$*t$QW(c9l&uvmW8*Sz%5-|zRj^X~3ib@y0QDHs3oNk_XkBtO?%6ZzTN z>$J&wE!Bx07xu@;`^-1<&1LWvE#7+gSi-q)C-2=lWSH!xsBh0-{p}ws!-sEq{pxb{ zGIsau#Pnvqd-UkhhLn#=e>T)u27P~feaG7M>-p9EXSGaJZgbX}x@g6Uh{xY%UAcDU z(ABG={kB&8d#k=3@z<`K$e$jpZf3=HdD;E7Cj0wVdZ-AUseF=nZ(W_2$l2@5eS7c6Rr6B!5cz`930a?XKr*G$kH` z+BntbQB9yW&RrGNqoGD`XHV44$jLeKvWMr%9Lwfzas89_J(ZP}iaVU$U5>jbY8rCB zd)HR0tUCGRgxS@6kvDIGPMmg4WtDm*{oviZK8E^w7Z&I1b+R8-XzGz~pN^5sI!^6vHI z@BbS&PtHt-wf{_=$Gp6}ylMQAdOIRIX1&U?u(UjU{I;~&2}} zSFT<^boelHqod=CNi#Z@=y`@2-rQk0FVuU(*5~J>Kqc3;_C^CGC0QBUDxU6p(MtaP zvbJ3OHU<0JY&$w+CT~k%owzSzdq>9!fjP=O9UknrMV{G7+T7UoY`Fqxd9qSb3h2U! z&X9-*jR;;%H8r-069vU|pv&lAHi68ZSQq(owt{WloNuA5ogE->qRK$P%|+$VI@{`k z4;K_GtqcqVYJY#(m;jOP@CZLQO^-ovqUp&~r<~5s-0bo08t>cN+ubW&ErWu;C*J*K z&vN^2{e2z_>&=|1U}tPn{UhS;a>WgFBznZZ#m91geS6vb@9(dfD?z8NgBG~!$Vhp* zENMPBSNY?M#lM$PV~6)FXzRCgFF8JtA6JL$2%s2?xQN3N`63P!D-Pbg#HygA^!oCpOHI$7rB#A<4cwf$ zo@Z0uuPf0reb_o(l3p#k$s4DCIcUw{pp_zietzKSocQdt`h)aKfvb^GKh#q|~}SRgQUYG_7APQ&im(trN^ z>8Z=*O^x=VSV(XHa>xWK;RozI^>FPvm`@bF>g zgR<62N=i(1b^F{b&zF7+IN#ZE!VHwzQjSMOMQx})ANOZxqVlKDpReX!-|jDer|vh) zkz+>~80O49x?k>_yiJF0^tMx%lim8A_V25`cbCmjzZ>}n*K{`_^FzH{xYSy?&vHu26j&v(p> zoOvoYCT5Od#fJo+c_r3N%uEanyUX4mduLny^!6RYOd-&c{cy=!w>G6}f0MV-@Skrt zSMkTsV`paw0_ z(cj-+wvPF5UymN?6c&&a zTv!~r&fb}!Ktq>TyFPa5H>)r2u5y3BTg~s}$7sutQapZuh#ds_iQD< zpWVSe*D90WEBf+Rqw61!8hriy>Ww|1>+AmqE-pTy|0 z3mnbJ$vMJruXFs_+S@L<@u8uuSF`JmAM2fM@O)ysVZj52x#!AXg;?4B{9?S7af9^J ztV7#!Z%_Oct|eDnqWA0T+wMh=k`BJNE&5R~_uSfZTNf!U<-gn&@^_E-bd}!UCT3*Gl%DDXiJ(^L0<$^KbtC zS89LrKRCU9-?bk{85pKaoBFW+eogn6FPCRnKNp-^wdvZ`s}FC#uRCxqcDGCJ{K=D> z`-_S;D4L1&pPjvUtKSVLTXiL+;|V_v`CVL6N-8UVf(8c`HF4&yjovOdzvi3et*zPV z7k<`9?2CD>5RscJE2bZ*WyPU(WBWQj`MNzkx3}er@Ac1mWw+<&H|wb8gs$h6^)K6R z?El|zE_KV2S+lbC{QS0iQFB6WXlUr8zf0vGZNIwOH^4~I`+9Wgy12bvt?TzHYQ0#L z@pabyk5{k%zgW5d|DW&DYY#TQ&Uzg+f9|DAMj~QjNe2&wZ)Ia&w|ag40e1P?9`EV; zuVdUweQNjW6x!qlKuL@Lg$M5mqA;$Z0WeQZ`CTH^?N@qd!Y~! zZE0y)k$N!u#97k8{H)YC(Z>81J0y{USpG!KvZmySn)4$LA^9zEH z_;z&nUX3_*SyD3M+skyX!*zT1>@oPU&C$c7qkaB-`B}4P75qFUDq~s1(|+mFliRib zo=$&p@2pvsn2DKL;>Bw3i8E(vo|x{T^5XJt^Qy0J8XrtZ*s*KJqFu|R#Pyyimfp9U zV_)yM;qUtW>zZcIwm#M`n>?u~YS+D0m+#!^St?)Gl6`$0=cmJm4jE(};c#&&Y1+Tv z{*|;8XfnXLo$vAbD+*&JSPxbsl+@P)nAModgh z0ny>zbBxnBCLVSZ5f?xGedW4!$Mm(smA>Dx{Q3Fmn>Rg)&g~1*&(Hht{kyw!GIP=S zd54$j&My4;NcHDF(Bk%=&*MLQ+5gY~{p*ssE7wm~eb=r!cYgt6JKx=mY8xAyiIa?2 zJUcl*eEaBD8p;b=fOMty_tdubd0zItYooU(Us)k2b^hXw8y)51``3${;NszN@j4}N z$``AnU%f0r~5-_;i^?a-P3grTIcUot$Jq=z3#b-OUi9fpXC+% ze__FiXDib$Cdt^>IZZIHy5e!i_N!k-#fo{aS8m!QWUuo-(BOG!w5MlhgvEc+srI*b zR2uL5`>lGa{p*{X+274BjdKB z-iFHUUb>XE{@+f))AheRC(NHQqaj@UO!!Xz3%5SMnVCLcxMl}a!^Y&}57uc0U*S_d zb^bhP>HInogzW@N_p0kx zD&#*q^V_iMiHC=Z(A494T6)KRd)o`Jh*_1sYEkXJFB&@SwUd(*Xz!Pj#g4_7&aYa% z`s2Od-V-NIT=`}5>)&?&-xzDPufBTS95l|Z^!7ud<3Dxz`W0nKh1omfp6!rtGx$<@ z^~$`m_w#y=%gl@Bt9o~QK4)F-%OtuCYh57S_c}tyS1_B-QCF_>;3H(nsKl( z1g#ViR_i(3yg7~Qld+M}#Q1;(W&3+)n`yEhl&g49XH#&0uavz`*{ds@+~RwhB!pQS zeN^r3BlYBJnx9ce6j+|7X!H%h|WK79YK1x%uHTgDED)-rpCtb%DyjQhS}; z2L~7{-rYZ+5u;i9pn-9Q_47o>xZGITzWEjl)B0a`r*quyXiqzPBsO^23f?BhwWS%a zu2>hI-;&w%=kIU+7bY&3!d_bn3f?qhJJiwf=EN@hYuuM?tG^vsa$CLYUj4BznH~Mz z#yeyZ7cQJ(TD}4-bu5s^^=!sVouPZxk?$~~~GP!?oto2uUfwd=RZGFvh*xuR6>BEgZl?8=`f?Mk&A~fdJ z{3&$2ck@onoB)YKSsK|Zx38KqWeV4&&i_7F*7`a)FtG9N5{-*{J8{aC4ngI%*CGy( z^_~makk@-2uwOlU)#ImE<^KNS6n8kGAF$tPdBn1Panp9mPZJRkXt>FLPH3yvs{@S8 z0-)JHZ~L{oY*`w%W?$#N)xr4pcj6O|v(B2gXBi~QC@HsU7rwiYIL|P8Ex3%Z0M`~f zik@;^y4<>Y^4T5fyN=Bh>RJ+{nRaGIA1imf@d};G%X~#;bwCF_KluASpkkxI%}7g) z^(!2X_pPdCUvazs!-D9ElP4>m*VfPp*_rDWCU#0&>q(}%y80dC+FdV-865%w1k`%u z`|pR%tou~qJZ0)sZQob*|Mwb~M7i=om!kf9e4tUfTmH?BecZOyUktn~*RH&`>e0)G ziXP!p!dKi3y6L<*ZIz7Oir&qejoEl!=x5zt@xnvKswSCFb7hED)w|W_=2|D8zqkL% z%TuScc%!?MU%gK4{GFH?{C*abzP|p&+xLq;I~=S@WMy4-`|zn#UQ6EHUSF_ocZt^Q z5Ury#E-wD?Q#}6U=S!C^eRyz&eM{ZU#M7Y0TaGlSD}9smXj}j%C+7@nk;Mnoy{q^wde3sBQ zo_)U0YtQJ~+QwdZtg2!mVO#aW{NR7o6`#8{PODn&SI}XgvAguPnaK1h9k;@L`aMDy zEne)(Zg)$YN4~FP2j|<{tL204Oj~|v!{sW`?uZwsu3SGY^!@Opn3y>ixBJV_{TBE~ zY2hZP(&~y=Ay%_y&wl!H$r6{A*49@s$3Ro^C6SRkFD0?9x={pbCfz>f0BS9q$h)k} z#ZdK1@(V+Q-QKF#d-Fp|(l_(VehGM?T2!m*==%I~i}2m=FV@AcU$$U@LQCta`N^lH zQZ&{mT;CsWfAO%d=+WcH4_^L!to`J%V`_8k_3PvmeAg_!x9al#`5TUVRl2f1)2|R^ z=a)6Qd12Q9hK~m$S8g`gu{d`{M6_3<;>?Gy)o1>yihNWT5#-{sm3BW)g~`oxl&S3?@?UzE4$}0`${4w@bO=_pCNkFlBrcZl;3g_TV>^;%7R77i@w-R z3(<0oiO~Tq6h6PZE8pdht!{q#=vC;$&C}=4@BdTt*heKkJU)HOV*x?Inc%UTvPIkcejHppclPXi z$BT>;;+AexHo@mszk?ZQq>Nsu@iz-nV1N7U$&T$u@VdTv?NteO7Ar7ip&yy{@l} zR%;He=t|nK@uE`0SZl#L4xmR&hDFf3?m?c$cUfdGlsP`Nt&330w?Gixywp9M0d; z+IHyhW#LU?lCNIB4u}cr@}91z^teRr6E~O3{NslY%bJ>+S2>1+hQIuqxMR~IuitKB zPu{)LTfyJ9ZpyL<^*eWNNtW!9KE82n)$6x!dp|xtmh@-GM$iqJb&iamK7T4y)aSox zX$czL2}&@twwCU`SIxg(Z$|#cd();Ry?TB0_d@%l>F?K?$GQ9XY+(i6)C*c&Ehu=C z(>~sQ%JlFPmqSB;v1fUCd-VpY1V%+geRvxFUy$YCA1q7ABDSXWUdwH^E(5Q5s(pD$ zwSQq_D8_-hOR{nBW=yC$2~T|9SP+rmI!lTiAq>l9L3a zg_X~*Ml5I3Sij?A^<3+6x#(>?CBSeyIGpXIDmkd=|ix$tq_=Brh!`=(D9ck7dB{4S;+#ATCr zZ`WC;rJLfG?TgzZ|Ejf>^LEFdn%8{qgarj9xxqPI$tucXiR#-EfqVN)|2*Mz?pBWK zb81ipEq%9ke^tV>@!;eiM=Bhv&d0A@aXIqywGK1U)S@qwz4+OD-r5+ zd0xGwZ|$|{+?tv_hUMp!oAxYPq$DCL9=*cl+Sx1DyT3a}#>}2q%rK$sNk^-flZ#7A z9BBOYX6F)@ME+H0&iG83Htl829PjCRing))=LP**u|h+9iD)%PXW@r{Su5V|Dt*Z$ zK3#e}jO`E=O@k|S!lKl48*Ate-Y-i8@(suy4Tn{u-f5NZiolK|S!-q{f zSA&|+GmYP0e`&FQT~zL!rp$*rqWijDWo4J%`d{M4_Rp@=>&mvcxHyTL+X*?h_r=cJ z{^@$ChmVJYlT*{Rzo|x&pdOCM?2Y1`lMi`yELDBfnf1fSY7;`eR=2Ruh(uj9di2f`{whfnd#~2cdB0NTIp_h@aT<-M|6^FSh3;P zubWzbFMR(wi*w;Z#g6`d_pq>OHt)Z0eGS_4VkMh?c>e4Uzju`~FqD_`pQ(CK$0KKR zVnwQ|l9G|y@4wkS9VZxjC9R_-+}lxU462i={_m|{s$^O^e`EL3K!<<^h1x$yJg;2o z;BK1=Sp@X5WS{4D|Ay78SKHjZbg8NQUTn{nEr+GPuU@_W`1SvP<;&jPT6*~>&(nu5 z6+NEMIqR65ym&>ex}S``$N$<_B4KNV?$2JkY#ZC@X|-L;mPvCv>{+umBpuaX^nHJUqQ8NoH3N(0mGbJOSFcmKzaO6P{Hl;zpS-$9 zKAx3QoSB*J9}ju!Kc2Yr^M{+y<2l4c6qJ;HgU*AQC@X1`A#lj4Raim)?+4{Kx9c4q z*BQ+OFF{D3U!QpD(aI?j`foZzV`F>&*M9E3rfBw)m9^sW+3oi<7q4bu;P>)$aSRCv z3R-meXH!#?!Q*)^oA&JbRizX8i}7CM7KwI#dB>mjhfSlSq6%JKQq8%whxPoQ-~&uM+u%9D3@Y4M)jtiEht+_nOH zp2|4gh2`(#UffdkobdhQCjX7u-}Bb~e)ja~t6!Eb(jtf)n3@$KS0Vy?N7fTz+E zPnbSmpFbzI{Lc?g8T)%y4|j!Vh5ml{Yh&f-0=4TltKE*dxF5c~+g9t=nba?j&ufF` zEIquuT%4Vi&&@gO>f|J|%xB)3E&r7_rz@L(pQDhlBk{4CjF)wfVY1ue>LT-!Hy0T7 z^z>G&UF#SZXUDfp_Sm(x(HC!M{P|%1W1FLdMM1;GdiU&g+aDkAJ^b!&HH&R$*xJbE z%QGcs805(a2|s>%aLTl4Vlg|5Sl#<%j_&$eukqDxmQCfPz|(2HKDB$-{H>GtwP)6B z#B!y@t5$J2Wc%+vzyAl9b@|(aD<&!n$cuB^+uJj&)qeKux%i`iD5-5ZchxuqcJA7h z^o;p?`>FHv zX6Sp({qdvX%#QS3H<=O{41OP+S&@3s>0tZuIdf$8{5_{+VQsCfVIbgp_N<1MR+EpK z@Ed8wA`;Sowl;cwk#wk|0chz|<&VTKFD~BAX$0|nc0T5-`TVxL z>Cfc)`G-#K&p*>ECNIBwhjzoYtDoZPURLh;`0TcZ_U?@aj)8%Kbw3g<>jWbE?(MBg z{N~L6DyDAZnyvSK{it|+|NI~B_j+-l9S@at-~}>9j9bpxK7aM9Ytb7Y;Boe>n8{{41L`>N}&u_k6fxTu@kQ7BReU`9{K2(zzTn+xXJ**(azEd%lcnMB zQ(_WVU#bY|x6eJFx*|~7J>kWKgSX5>l#v#(+^YYxW8;tO!Twy&!i-t7*KRK?EUb8Y zm6e0<-HK1oVT(^n3K5G>)HG+C8h!n`>D%wb7oW2@H(oTXc)T@SP)KIY=Y8+q$$|DA z8*Zqt7oKuv&#y19mQH#8@@40Y85!JD+B!OXT5Ul?5+Ud1Y&VpgO!~7e%M?^X7oO9V zm(RarSZUb>BP0jPt$jQwePRg_OD;R9(>|C`N>mVtxNTy z$CoTo+4J*Rwnh0n8^3vfq@U~0ad&l9RT1Lcv-kGm;N=A+Z*PejUc5NLL*>)oSyHXn zgI}fWdOr=c*3jmY!K25IH)eg6irHP}n<=gD|5PCf+k%sM=9ZR{!S81^-H`Zv_Gj|i zuiJtvEI@9OwJuLQJL`U6)Urxb(3M61Kz9jl$;@Il`*!Ba_0zN7w;Rq2_uhfFLdCJ) zIutZz^x~T1j@RcjKYagg9IWY^eP%}BiPPr~&)Zwim@$|CQ|EE{_Wtett=?`fF2__f zHP=nbyx-H&krSDks_HlAhje=J`9&|H3}3yKVf(sR0SSqWL-$>* zv)69d)z!7A|HtH)p7P+-Rc#GzUH8~p+nU-v4`09TUU6>j#kJAlQ*C8rC$3yS-Sj?x zvd#Kw7cN|A_;Pu9q1tmDF8x>+-%!&fetsW5d~s-Bz}L~$J)Ay1BUUsoL5yANQYkU}f-f(9)I9@s*OX zyH#G6^c;5YTd;0l+`PV?o`&|_?Hjwjz*GBf$K(=0^W1#$eusCJzMeR{nvY?_qv!D^ zekazgSh$dJb=ZHs6R)qYUmtkd1FT`$LC{>j<&;Kdc8*Jy>E|Epe!oxL)MeAsrL6b$ z{|o;7`SX*Fy1F`#tj&=dMBR;b!t8hw1#Y{fiinCY+_p{3FG#(js%k;<@jea?jtwOrK`SXb zPB?&*1X$lh=Ly@&c$7iQ5!5Jy2Dm2-a-5RVrua?L|5Ff)Lf%Y&a?D_#2XP!`w;N=j681bAo$6uT}iWGt&8Dkz&CHX3vu;W!FeIi;kebm;(x zqQ+t7M5CDxmm&m@a42dFdOxP|w|J@uoj6k)1dR%%O?pC|H~llef#S0HXT2|6T+8Tl z`P4_mtaxd<%5o@Wj?;W-gr9ilu_j|%#cIx$$jh#ZF!LU7Sa!}oOc;^aja0!o9<1qv zVnnGz&tX+q=FDl|dc0_jl|Y(rvIk7e!#KPDDM%SuM@L7;iHIC+0X4>yYqAlLvQ$Z_ zh+~_?;*Dz^X7Egi`W_GrvwOFC^BJ{dlWn3L%xh|vXhL(?#J`grk|rBU&E{^=oXB7l z{ifR;l8{_dlv9i(*VH(A1m@Tas4*`Q;@sT@)g(BxWABl;9D9Mb`ghGszS?KUFPjW? z&~)ELqa>iFo-MmrYobR^(NiXvGrT9CWaxBZ;(W7MJR7X)|$-GMRrhdA& z_yL&|BL*P{CQX$GHc3$Dy9jywP|>EucIb*g zh}_Aq@0!hO|1P(EK7YRPi>2Ibhj{t1(V|(kDGH2ASHHQ=qex2|60n?`VDNNt45^s&=5BgJ$kU(Z52{az%}VHP{c|;eQF>9*dsQt% zwQq4k(t(22ovKp1J2!4$AyIw(hH$h?FKa+o0;{%CnP&Ht)bD>2zHEJSMsIg;+4Gp| z(_Q8npWn%U*zf1t;&kcc3;h@QJ2t<3ZI7)!%P6ZB-0tG>q zL=acSX&XqLil^D+&JruxiCq~P89h6TUoXBWcaMQVRgr_4L8CDz)NIwJ(21V^3mof` zlS|LcGgg0gW@hlRQw$7~oCVkz0#deKHJ!LN>sNBP*3_<9uU?%<+hkaL?M%iN8y8kAP7TlFuk{6ysxzvYW}?RvWU1Or2crK1FcL*vq*l`FCw z<2S^BoawccD?*TgK@g;;Y4yr=dBGE=dM#bFY}v8~QAP#QDzsy8xDAT6sD(FpKYgAX4pMLptiVYV zrrtj(hvg<>=ABZWH{3tWDd2U5^UkZBAA7h${+_UEHZ=2PXnpn;;<8{ z-{JJu{r<%a3~zm^Goen_1?zA_@GsZZZ@mc$dynP86aAJe&-HRocB%P%(^7P0h*r>l zYqfp<|1&b&QkZ?x<+@(%saQ6K3GT_s$tHE5>-YWs-`m?Ocu}IaS8!#=jN3N^dU<&- zUbygMzaf{Wz%{m)C0dtOmMppS@_%dmeU|u_TN1b#7#Mym%ojiIGLO~p{`)^SFIrjR3-a_OZ3usy42?Sxmp!7lRe$l=Jw`< znq8_YXJlYtczegcY2&eDE9M)kKQlYiyR*18>ApHgcSnhu?9CFjO*eCvTsFJJ!oa{_ zwXQ@<^y<~Cf`S(>To5RJ^*Z_8ot+mGmPQmcZz!>noq5LmVYu55Q0@#_P+}!(`k(vg zGcyyH+C$D8U04%WhG?x?y=vd<-yj7OL}r#)8QteT3Uc+$;%6?&$wg%geOv^l`7KwP zy|!yrj#<#JI*{u)r+Y3}p6ustHoMpI>({_|dvz%(Eqj60FBEhp`?+t^k`BGOs%SbW zKrXziss0{Q8X9_L<$U3<#jmuhuAl7UIdo}eNyy)PR&XJ4_P3h%%C29(e$B8=_jCOw zxO&ABjoBw%wyo0IG}C9NH^{yh6E@wO59aAtF3 z02PY?3O9Y!HqG?8lKv|B+MAoA7en?ZvnQ_1pZ4}@NT~aZMt%kchJb>bIc7#PbFN%J z-x;|%efsV>W-m85MyO5hob~FJ$MVZh^*|x9VA0Yb!O+mqi6>K%uC0lb-L|lAQJA(d@GNRGRYa zlgH-#x@lPbZBEhj%Sp0o9IMx^y~-mGD#+)0ELB>ydX@5Auj6MTH=m02>)!HPL1(U? zdv0#-lHgqrL8a#w^P4$lR_R8D#m~-UWIW${_*UuipQ~1_dU0pvWC4&Z3uL{Q2VLA5 zynMyVy!*OqZ$0hW5TYfz)zoxip|%PG1A{|*U}&i5%Mz=!b8{r$ZtShw9W6NRWXhuA z<$g{EAXoBfOg`!I{M=mS$$8})gMV`!+H^CgWYyZqV@IcvG$waN{y3t za~@i?dex$B%a+|q1(oRm4EML~TeWJHR=MW=O!18|zP`R8TQ|1|fXv;tdgZ#l5-riq zY3KFIHJ`={hH0~ae6%7X^z9SB1Dn_q=iYj_cM-@Kk$cLz2bs}H3Z z&3tiXW$={j*+(X^CxXKJYFSr_^&KZ+kl~L`ExCMgW%2V(DbA|4$y)nfa!&J`uKgWk z{(?J~{@)JVbcHj}vw6cUzpy5dFFu@&ZQeT9YU;N+ORWNz-@0{z;~>c5AM<^zVlT1% zQuSPxm7QgBjGcjj;eoo*OrI;)u1t9n+HsTCe7|x^f;edRgK* zZ8OL<0g+j&Rx8IY;T7k$%hpoL%Fb4v>Lps01+qgcMr*28)aO4pn@j8hUl&$rLV2RghB7DQ8m_?b@~B?{jXkmZg_pu2{9n85DR7t$|b5YGv%-&~*06 zG!KwUu9X-59^w*exq9uITNJnz;m|0$DL!I$^M+TiUY&Tw4az|d6Gc|VN6c;lrJvBq zT5teqtXq{6I{S9fR!xr8E7x5V2c@`%Mczw;0)y{vt4mzV2l7?Q=Dbc&X|%v((@me0 zTN}DlR?9~QAL#oFvigEh?#U%lqAj7};jX)QUrK|-wzyf%?R&NAn(4Xu&rM#>X8W1@ z{t_s(7}f@cUfp%<=VzIg%n2X?2g|M73jf)#CQ3a4MePN-Ez1i3*~rGOb+iMS^Y+M| zv`}5XLz`x9%k}33iL_1ul}(vH?{@3@ZCkZ!RdgsQEi#Cl-t$J`<|1(BQcE@kmppI1 z)h2hAaGRIq1nvrr&4mgEmvWa+$T8#aUK&)@42r7@d8tM(J+>xU*Osu zu#pS)t~izUx$im8A)}Ym@@>Hme>%-?x$@+5cb{pe3xtJEwRZ&hx8a-GZ1u~h_A2>I zt^xVZYDUgHpVcQ7bXI$U?UN1An%b4K?WKWEx&SB!8Ds;^E`MR0;LDacv*g}c6_EQE z+&z^t>)f`wPs>B|y1}u;42r(1M`Zi$IS*~RxomnLNSTBC#gJoPCoAY&zhnrq>V?Lo zm-Fv^{Ly?xJKVh%EaCz3h_U^dU3CI2sh65Sg$IL{vsJ#pG{F{-5do5QdtSU|cbsuo z3B+9?V*gI~Tdcsevnik!4g*6-Pl(pn=Fr6ZtcjU_!C|w);C?>qw7ggRAoUA`Qa1hH zZ+zo>Sj$dbAy6hiHOcR<28Z|Z%fG(jH?MC ze#o*j{9!Fi*MOUy3yhY68jK7K4opk-?N`!ydJUWtw61K=J$Pwl$f>@GU@dF%KdtZB z;`S5F*;QgC`*O-Zh+#WItYlx7M1cd=A=TU6>JrS=1)w$qsL=;%{l-V}fr8%QsP|H( zxsxCP@i1s2moB(1yrN=dh>Mj9xB(opCuB)*?^8Wc`eEog-vtT4IIX4b;PlA(!M7hQ z04Lj~<4*A4x9_J{{}Vz9nG#&!pL+zmL~t=L=^4ydsFnc^5c`}LR2EO-`cWG`s`gHk`Z29_t zcR^a0vh3fB_Ve1ww=GuKh6S~1zW-Ss-~YPJHt?Mh1H&yB0XBw`3~{^C_?_M!J;n2O ztiGelz_6uLfrsJ6hJRmwo%m66Y)jGfi4yN?{uS=|bg>$2>Q%6*U(eird@9!Ik&S6x z&Q5Ozh740j35E-azOz2L?)3JUV{ZR<1K6-AaCc8ux#xIInE6(hs|*Yx^F+Z>sM4eWE&*Kxz!5!x1Ck4b93iPh3Di<%V8G}A zZF;K5z_4KJrIjI@k1vTT@ToQ^Ikdy#@BQtfx&Myy+wHxXto8D}Fv9}PCIf~AhqE$r za=y(tCMI)PuEwg?%jWO59h1{d(?T`TgO1<96V`iUaV7y+{3qLKE| zgXT&cOrW ze5l_c9oj9|YE0+OvVHdM;(6DvFW!0w_!^b0e;f2ph=C#MY!@g(e^vIko{n{Tq+_{% ze=);?$3iWP46@hS_J-+{b9Qe2xJi5ZZWe}yFi^Kh_L|$?upZZ4W%}ikof|8@vnJ0~ zovvRl$-uByjf0uNYKyYjzg$qBcx--qAvhU>^TY+dxct{Ib|1O)RB!R4wVOlUOYC?T z2F??{;BdUQa+TFT(+^u-{M|h7sov70wckF+72dB?pSqiep}`Dn@x7+GyN+FOKHtY% zzp%1yVeaNfvp)Wi_v@FNYc(C5qrK10yLltxoe~2B*VB_9*B?neZzsavBOCTE$ZE^n z-)rUFbAHT@`1^b>xR^KyE`z>&doF*RJ-#;Vosrd&RIw^#lDpkVE@$7GPNI%ii7&1YR9X-ypY?v zb*rnT{)gb=XJY?IsHZtu_C_On#y z^6Kz|&w4v73LZFGX77D@Ogi~*>2>WFKO2_S{{4Er@QR`P@x%Q#pC)hAi`{i(sd&85 z?3_J?FS!@L+2c1oeyI)nI_8FH1^Gf3*7)1~G|}7r=hKaf%e{{;9A*G{yG1z|M;|eeOKMNcDXu>y3K#f3f~kSKf1(oa#x+*f**E& zzii&|>3#kA>N8t1FF%_9{qJTMQAUOdAx#DgJp1i`y8L;zeSas&lohL2YybTDe#h%` zH>zecetdA4fBK(04vD?<4feSn@2yPrnW)Xkpzx9<@c{pot5=U^F8^=&&Hh2dj1T9m zQ`e@RnzFL+#RBKYUyRRpNE)Y2*($c+Yt*iZ$KKrB+#SQoz~GsF-Q$7v`#rz&WGcT* zG%R|uqO$Hy(P>@rzhQ61_fC(ud-ndK@~)D%Qn9;AI(HU7Kei?Fa?-IL$&WYF=N|x@8{EL+C{1i3@URKcse>d3LhUk%E-*0RT#f+)~r`Qp6YM!iO<_s zxn}P-tBoHHac}(*Q~dl~@AmtZ>hmfdb?$iFXZ`4H`Rw>gv!o*(77q?EKbo~aUbtI# zTSoVJ*Pmx*8mrsQu-JHV<1Wdi`|nQs6j`-$Y0`lP#*YQY+pYd*9a!%bBFMnt`ShBH zLL0xl-0t^V-MgJO{H*@cvAEC1sLjsOL~rMZML)i-uebGAjBs&Lo7|Z?JyMNLt|Y+b z*Zcb86SCL!+SOK>|K3r!exDROkBxzv|G$cP=h&y*_pG-utkT_Ea_-~fep|h;$keGq zVJr*|LY#*b9v<8KD@(@W!-5$`saczk%hla@Q1Pi#J^6xS`>{pc|JEoxKcBXF<4d*K zNA{NA6<+@L<&_m{*PgBZb7N!j<9F5X^iJ$-ycAip@#v#xv-3J*%kDj8uitlNlJ~Kr z;xQ8JvK0w4wU`+cJnu+xa(=t_`~C3)_B=iM`+sS@FZ}!adw;OMooZN2;n77`gQBCQ zf4|vVzGmO8EW;lk4q8fol`lEKX!v14b5|I9fK9jFugwzOZ~242zT^Je-T9eZr;-n{iub&3kCDH-`+WGj zAO;486%6kTn_70hez!a6%nU=z+Z4R-6iR_4O?+d4KP&8uK5Q*x1-BSI>4tZccYqo7*>Q)~pxz_EsmwG1vVm zj-9%;EAQ?ux9OmP>8Q!CUcXL0*0Vmj>h710W5+;4TqW=BsAgrYIvpFeJ1{<8KECc} z=$Toj+LvaQl)SxUYE}Mj%8dHUZylG~uumZ(&8J7o7BqJF zbMoV?tX0W3Q>S>AkAF$$b#!!`HNUG*{j+Ahx>4M3oBaLm_l`Jk z{ku;-R=?lvKe>4Au2-uH-&{N{@Z_qcj}K@AJ_JMk}+8xv~KZ*eZR82?v($pE&MIJ z{rKwjd#^1z-XmkF<<=+j^=|$8z1N~PUhcC#x}J?k?5G*Iq5|ld;s|vv_gfM$P53kG2H+_o`0Q zc#|(Tzxv-#i`R2D*9&B9y|#M&UNQCgMP4ywKT{1WE40x-nen2#`C#x;nP3wv5zjf7bx$ua-sdFx8nD8&2H=XS%2NKXziT8e?FgoJWKKVv8&f(E-z}>tqDpO+3h@? zAbgl#T8912{{Q@WUvn}}{LQa9*eaHF)w28L@%5KM&4AtS_GzE9{C+3R`A|&S*;%sN z?-y3zsXP95A94)NgNYemv03f9$9D zAKmwNnRGuM>efHTt-ntqJf_l>N3J9yXY*Mz)>zlua`(?S^qsXeoFLF||FPoS#;d=+ zcJrFwSkQ8H3;$f}(qHfX_gB1JdZTRj{cV~ozxN%VU!%0`cHwXNKgYJ{f*N-g?^=YD zzT1A+@Zk7XJ6XM6Mt#nY<2U{vU{3nlwbgx-5M0)}!3|dnByi zY)OtOd^&Y4-@&>!hr0EE)5kz2;+?WA{$DYDG^@vwd4ea7EM zt>5p9-eCE^@bA}+ujO`|-h8}l?Xf;tY3uj9PM2>lDmA&k&u{<#gX|l>zyH?RE?>Fi z!SfZXS9dG-TWa}PJ$<59?W7tDDW!A2UOKIR+;8_A5r1CUs4c~J%J0{1e0`pna_AsiKCfC!oJR_=9A~;+Br%}*J8`>3WZ&+D|vUt5>y*Bv+--)V!x&tyzJP6 z!|dCumR>!r?0zh-`pvahxA~u6z5RZl@NfAI^?Sbm`>kpz-)dU<>3HFTM)qSz`0aIm z?Ubv2)M@c*#^PH~r|+Gp?0)n>^Z$SgSDEjdgOq*JT)yS!Eoo`#$D2;;_Xq#4iE7l! zz9k-CBlugs#Gyyhc-e~Qnr-LiS{?r_UnB7Q-R}H7KcCHZwY`3J`yHX<^9tr%RkRP% zJny(P#yy%x+Dzx$z4G~!_PFo)eXn}s`S;&C3m+fb`s(Ao^9@OtlzD^_-mKo4zcf0z z*VJp@ZU1V}VhD>*FYd_KWMyY3&t}};bu~QRRxG~eQGPYQ9^>M>D^zMSjQ6wV*!PwCI0E*CKLzBeGU5UG%%= zvukK+=@sAg-77CII~M);eplk*wxg5(|McIyJ$CQ+f4{*!y06abemmwX-rC;Q)@Jc| zjWMY4pRcgz+^y{6%Vy_Eoz~l&qqE}xQ{e5D!5|kc^O-3mU-O}kN7~K?)Q3!KUUFQn z-e%p7PoFGmK0IvQ)noSi)#~++J}C3|@7lFX?fCSlqLVkWRpRQh?^kzrl$19heKYt7Ub8YkgTC;V#|H&JEIKUho``Uipe!G7~|Kg)d-fXvj zTpRvQ+P40l@vhRBQY%BWmR-MklwH`qBRsy=RPN_>Wy91{SJdR~Q%_y7_|u^bYQ^W3 z?tMDJZ~3Di!hQMQ?tf)_ys~?{ce(cEpe_z*& z-DN7jU;EwF<;c(Hf0t%R&nq#R`bj3_ROyy$p!8P9E;r%x){noZ#n=73kyZ== zk1Z~>`Sam$<@v9m5;kx5JF(a6Hv4sF&9c((4uo6F0~-~9jm_wn@T9KpN0 zN>5kbag)xI`2D|b|BNpe-3#CE{eJBJ`k&S3^v?(iD!cV`WUt??$7lWJ!k*{%>vq3g zoL6;OUQd7DmrHy4bMxNipS_;DPfT`t$$8uVF`KRD=54=QR(RnbyUY7~dyD0_oU__^ z`rPg#S5{trbn&=cFSq_KgZKGQ^!NODbR(%d{#cjxnhUosald*J{Qt_6u4AcHU%Qg~ zEzQhs6)aw{a%JA9jr;$;&41kTxWE5-e2wC|z29#AI3Mi))b@I-c&vnV&h}cJJs#s{yW`9>CqEm|E~0TwPx#f{aU5=TX^5! zch-h4J{*3w^IFlb*Z0qzzsa)?6rxrS8h*UZ-+uZx_uRW>cTN3%J?=F8@^U#Sw`XrV ze!KSjUGcrsqwW3~6eL7@t(Snt_p#&h^+L`3@^^A1OcGwNef<6RKfPaHUtiBT-80$W z#&TZex0yR09OC};&g|z!_sNfMJnrkxUcYnMQERU%d*&`*0XEJL&wkvom6{ftc2g+q z(!M{h@BjaIa{k&~S@$je>pyp2AOC03&Ew01R=&8sJwK-GqiW%Kwb{qy{eLCjOZ|F1 z)_loP(Cm7bXw~;lL1i}+%Xw$h9`8u*@7??DM)ACDTJfNs>V#(gzWBed!V6zzE`Rn` zu;`qhY-qg%zq3}H7{k_^p51jcki*mNdmiH?6TWmU7dU?<7yz}>+-|ZS)8m7xCIjly=>q|Il|x`qAiH1lu#{+_+AulrxwL7S`5I=)wT-d?x+n0&vz zVt&M*wLWUXuh;L6TeJ6BRN?8|?Z@W(+uJ_ZIyKWc9n?@30QC}|tvu#$|5vBaM(h9n z|2byT>N4duZ+0G^XW6`4{`IA$-Z@*JPTTl1ZT8W--|xt#&ndm;zwgJhD&NfYMY#!^ zp6b_2s?V(m`m-nfyx7^xOTDK{Z1{R@O6J57(p<>+W&$D+eo&HYZ zcFpudYSQ^K*ZFtub5*?YeQD6j8;QT)K5qK_xxS$4O{aR&A?vgHpZkA2YyOtGe4do} zy#L$h--SU;r{wPT4nb#pU*jd<@$B;y^i*+f#Koe z{kH!i&V5www=gQZSGYVZH{HIzU#{?A{C_d#ZTEJa{FuA_uGzO+wf&Xzwui9sONpe< zt8?pi+VK8#+UAYl=T#rQnLc;w_Z_eQ72dV^K6U4lOWvREecJP4k$tyy{%+-OzyH3E zmT9VuH=ErXTXs+N-M-K3UW7KT|9D)sI47p;vui6X7~4mz8BoOb?e6e@4t6v zuiIz!K7CTR{@xv~(oGfi%wCQHY@+WrpSL@|TcmE|Q8DdA)3?{9veyWT|9gAr#l5{> zw?E{)QS~}4zrNz%&*xD#@mf>6?*IF?z3~0r??<#&uMrZwU(+F7^mXgTW3N_k-*qlO zG(7zH%jJJ9>r4|I&L!vVeS1yptMI}-_iDf2-II7mZui@3%YJ5Ot$KXs^7#(c|L_0r z`~CiJ-T&VeU*iAwb?fgixE7JzYj!qX=l7ef|ycgAwx1t;#Kyw_vp|NdHQl5jqru#qE`qP&8 ziaS*wt~u?U6d73=<~{M6b0W>ewmUh|{(s^5vG&nrw@v*nUk zuI5MftgKa!TORwJxG7S9YRbxwpH56+PDppU>yp`~7*` zS@>n5`_T*P?Z-~4&l5SVd%G@wZCvWq&__3t`!a($zOCK+{igc+A3MUM_i5jn@Vf1Z z?EVi;+(|p1PRssSbN1!U;?5l}nz*C4Zd$Wfvf@GG#`E`fI-jiE`X$KwsH=F)jB?S_ zqTw-u@wHQbKiAHL1WCrZx8?WdZCAe*f9|)pqq)zml*hfv7Zi8?uD@4z{HDljo14x?>VS%>gJrgFw|==)8Sd97b9K}FiQA9$pTEsebwRORY-xYM{e88MI}W;w z)Z7b-O71m%)Nz>me)xv``}+zX$^V~G{O9!geO>PVzIq%ye_Js0RB?dj^^0>rg(I)| zoe9M?4;a{PuaC?c;{O#rbv@!>ZqJ4cEE6 zI{e}@{cV%~S0r5w+xm9T<8zhy?YqA1QoMNKLco;baurDCH+gRFZ#%WvG-7++-ACoW z&)im%*9`@YcfQ|Wf9~V%_xrTp>$5;(iX}T^M)W(OQ}4e2{PORJ(`N2@3>va< zJRi;h8l`jS1RTI-*5dtpUvLh_V4qe;^*f!zTfv-Ecaj1t-RfD7vwXuTogetYa(C(LY2U+6uTS5$ zKlX&tOdp-8kHgwN3af2-Rp#fFzVWD7_tWX|cF%uErq7l1xBu+JsjW5t-QDNfr{3Ce zKY8i>`QZ}Jv;TVbnAX*t3$UDh_SpLEH<$T--FjsGHn|JWjy-s~;ksP4*k2jxb^9If z&0m;!xLtH_+qX54p5!yoSf^a|pO14MN9TwBFyp>&{{PSC<8IP9Gm8H_ogRPA^4VV= z4OT~qkR7jP&D!(W^PW`QVqWu}R`IwM8pZm1Jl@^ka_-FK?Q6G!hBQAt>3=*mJg!qb zUPjD$ex21kDJzq>iibxfY^zFY3<{I(#m-Pt5{oUlI4Ak6?X*u`OM^C^_OpI2vwrpJ z?!Djds{7eJol^1pZn;-P4uy22ynE_W zea@YiI<31s=AP)f)=T^A|IbNYzyD*^Im7qq4w@x<;<=eVr|ir7nZI?W-QINxyi2WT z)%^|AzIEsBuClY1*Dl=n7Fq!s%?OW^l-B2|HjJyvbg}vTX7gFLoSQjjVUd+jBeK_S zO?o;ttnX@g^k4SvZdbyd^Z7nMx3<6I&qA%ITmP2bK5pu~uGe$2+Ebfn$7bhuN$2m= zEW4k({l=&1(Z^=}{rx=F^p@aP%}e5Y^kP4~-(X#y_iz5|?e|aqZOv`wHOmO~UAysK z)$5~+`)$KEecpQY8Z(7B2;Kh&{_%va#iy7TArd3kQ#Ede#(A}{maQm?bvxT03+)@G-- zA~&amOtj0X|M_%!;d}f4lIHhof_+YWKDtZu>({TK0w09$|Gf$75P+K3IlEpiYt@@7 z^!noB>N&N~B0=5M+;2Cc^Y)tN?fiOe#(wvH34;WOH9Ot@N9=sBweia&@6sRozq<9O z{XQKYz2z(Sm)ZGG-*I1gExt56>3{dq`oK-aqKCS)*F??iBHPJ4E5P3DsofrjPp?wm+5^6jgJG@V8D zrh2)~zqj}C%=FoDUH{Knzd!P7wP=27NcA<<^Q+c=OZ)cbX5nqw?Zm!PSXz~GkKCpFggn%yxtXZ85ZkH?X9T_eZ zskfhHRu?HNJ$r2yfAW>a)16$24_jy5JG(8S>M5uGt9|RVGj-p(!rXiDNq?7By<*MZ zuV?l+Mznl4UQl6jx}D|3_Rt^oZG2mm6Rf{Ii_Sm#uKHcz6@i{po8NA`eeCb|f5v7x z$?sPRD!UztOrI|soo}r0?eE|Bk3ch#mc`FRR-AgWV*UDlP(VMgFr4-Kxn212S6{F1 zEY7U{_vCky-D17}Z5&fqL5njJGqYpM=Rf1Sce{J$<|wh8N_*z6gIxw54WeN&iqCJ% z&fh1we(%33&oY6edp@&FG}-uMB;N1)9@pI$ztDev#M=8=8?RjQcD=3_yV(2rxrwJz zl74N;G%US!<;SPf`pH*T1RB;H=~%ITy?)-uDR)8huKy*9V*h;K`TWuQ@c*{YS6!G^ zmG$C6Mb?W8FYfQJm#KeK*tvJ(`GL zs>|GebM3+DFRw(a-|h_0*?3fJiU*=dT8 z^%TG5$<1G{_kX<}tsf_6X(U(uXXB6Owf}R1>t{SX+K{ktds87e$#yU*7C{s^S|F^ ze>0!QE?eLrQ*~nD#kJAfD`)NYp02ksYJVLF8@`y}{P?1~eD7!dAJL#OxLnPdWja&6 zj=oyGR&4e9ZBa6YKRP6At3vjC`E>f@o6YBs)z7bA7g`)wa#Hojhj0`Q)p*RulLyV z$ViyqFA46cdHHn5$6wNqJ{)E{?xnrf#J||~!-M9+W0C1@&YZ8`uMmr?m4Hck5byXIiZKTPCPxDc=*#jp`E|;b{}p0{XYIeaoOu@YoGMC z{QRGGWoo|pF3{L!A`b0>dSeXKRVU*vt~_xXCUou~Tp zccxA|Yx(Wp5q_^QclXnxp#b)jRPsxZhsA9;bVAC)dN?>-RNo?z~s``|X_M zySqxekBY@^xmsNQb)(Z7pF{*tFnB4W840Jr8>J_oad@Lr@#M?(Y=brCGkSHR_7S+{(g2w;GC=C z`Fn2K{eKr8lh|tUeopbDWzu;ke!tHHO$tu-w+lRU%4%L*WmtyIw;#!>D;I9uX!!5% z`}*lmVp>1FKQ5!DpU4i!JNlmzkV(JG~cgpm(jgtQ@z*8>T6$&7QT1Na$DZSUln_8 zvQh${z0I&HKXrfm(!66mP4kPNotgRepY!)$uh+_7kE_kS$7}j;@&)~H-K*>K@6SmF zO@Hk9SM{-;(=hGK3<>*0r;F!Ladw;)ur)cH+_5J>KC+}KRPiz&}J5?!P`D5auGq*2Zxe{{xk8RZx zng101wB^4u#^G*+ z+4224e4ygNLH5(JL4l^<%jca96a6zMf8W=zJEiCEvd%Z3|4n4ezZ**Sr)y6i*`f3$ zeAnZ1)?8NiK?}U5hR2G6CI%g!_jcTDE)P*YB4DWz37u^p{EJ?NYo~`+o1Dv-dAt5V#&!oqO)1tN7o@HCrBaojrH?V!ZXI zm(aPks3eDZ*JtmKFD|Y5c{SYC_CIJGw#WEb(8lt)|DNB-xZL|_&gXNz zpyqL0<*D)XR@K(l&MCgP zlXd>~5YQCk^S@8`WaQ-NochCW|H;E<-gB|TwcqcVuUfr&_T1%*_mypNaj)c?6|8yv zqR{O>S+nQt|MKTixBjC^-ujxae(LZ4^l3-hiLD!-HmrTTBDt@x@bR&&KQ@8}+J##j zo!)MJKF=`W^_~5?Jsmq2K5S$|Nq#+_y4Hg^t!*l zp33Zgey^JAn(#BwAlVP$&+B<|x_|CEJH0pu)VW+MWTKnbEBfn6+*Lur!p~=0e=?Q6 zd^-KuXZ<}Fo>j)xd^}q5W#h7PSsA;UikO<0s;s|n&YiIQV%2=Ry^B|^`mp_7*sQzd zx0ONTw{sqg$JGShsrc;6YJDHHU;c7udf>~$3KdryNN4ek1C_nyK z?e}}?V$nGl#m-*87-t=|c&|OXZYXFBruN${>wN8=!~GVE9%!$1+w&zzrut8zZ=dal z1I&dt9yTZ6+L8(GgLr|ejcpH_xQ~fWkCpTOcmMxW+jpQr!G>nO9_4;ZE44j;%L21z zn&n2tRNYM7cy`|P;X6BvA8)&zf7){2J*(GSGyg65ar3-b=i@$0wfBagVkf5J zqN{xb@5lc)cE8`C(Pzi^;QnH7L6@$ekTnY$7A3roP1ZMD7Lg=mI%|>Vl^M%6W>+Qk z1}1m!Ju2lL^5$4uM}vYwSV))1%JTQ}`{w9`@33B1bpQP4A2#ncZQfjMZfyPi_Fc)+ zr_Y}!f1ITHBc}aeo^wU{o9d_Q>JM}${Mr5Z*rQF8mglSv{e0xc_hYN}_y=cOo1~t( z-)NhaAKieC8U7`uX`4{Xh0v zQt%}=bD~Syx$DQ-_pkr4_e_EW!<#!hg=2S>9-WeTSwM2--0<6%E?wSO_Sfpm%j@Fz z|9;r(W&fw@`@7zs#m^633$uTm^CJ55hG!o>eG2;V{ptSyeW}`E8DD;OA5F@+xr;Tw zPo`1bf8Lbm2B)7qe%#B(E2Z)0ch}VYj~^^__WB+e5YTYtN=UB!tROxTkoT)2EL&xpEt3pUd&(_ix+2-CS*-z2i$WZZX{>*YDRfzj>3>`)PuQO2o(C z@44PzVRks~Cu@3ZyQP##!GueaDvjd)ZM{|1Q!d?nF4Ec2ap3m*JzBV&lv;b} zkkcOfLME}g?H-Ty4rI-Ptp)fbQ};@wjZZr2neX)T%YA}>eTmClcC9Sq)QtVir6E&3 zYn-03{rG~sySupl&zm)?Yr9+DflW_Oo60Hd+pt04wRzrwXk~Ye+N{0#^X*<--MswJ z{?AozF24>rNC+;h+glZ}Kd*M?dQY+2n@YKVeRenzrS~UKc4(;j^&QJzq__D&znEL z|3?c;&b>{N&24-KRdxHjmv#O7JGKAuq`7l@zpMKlFgH$D`1$Ux(RcNU9tH32RPxj( zTTIi7R{Q+@*VotCHES3Qs;;asdi{PE?`y+?6A3alB_3-TZ@yPiPkyx}Gh&0s#~Ch; zj*b~O_q3k+ZBl;i+O-ISe8#M+YgU%*-u(Pr;)4l}74?r;{uKY%a7li~`FW|2PHbHK z2=2+Ewy(?3`7h>Z!(~v9on$Npms@~HV#s9CnvA25rDf@f*F0Kz3pPc;R z+6lqbYq!ng>Sh1_`WpPZ!guZ4fYz0@>|G&KJ_k&nJXyHz-$VDMf0sStG-czFYk6y3 zrl76uy|h+bOzhF0pWG6LSt|SfywYBJeHt6D)PviS#)?9nQ{GL!Zme{P{iuGg@WjZE zUq2q4WgqtN^!oi;pEc(unJ-#Yp#19Sln-HHVH}*CjsXb@t9FI8E?%rGBP$!IqUYpS z#%HwIXkv}JjD)eqbb~baTOVgS)I(K#!vtL(M-dKL$uGPMWG2z`BON;V+6oT z^-5pdA8)@U@2b?-*H@c^pPt&Vb))OK&oWDvEP3E|h4;5AzT0#ZON)c(kOSpQrfkn(ov%&G)x}-pY7Xtrw zmv}CuyorQa)Ob?ZFizohJIlA7H$-&2m$L{Bw z;4?q2ajyUJu6M%)gDWdz+4VwW64JBV_x!O*Nl#a{w3IZ@zjx$cGrNGabadLkyu7?0 zKilO4mwHV#+Wz!wPsf+Wt#dk-+_`h-!)^WjNoQ}_8&;o_*?LJ#OzhF4quo*SmE;(* zuB~XSEPlSQbaj`d+6Gt-C5{q_&p)oNNKHIpzEnI0g(?;^_Z1Zq! z-n|!g6eh2U{i}X#&-Znw)@#M@EDBwGUG?yxLmLVXGEM&7`25|wHu-)38I|4pgDl)VFXY*_nKNhJ z*iyMUEbYa&4+Y0xOUzVcl+^#`}6i++~ynYEYIiG zFV#BtcKM7@fi)3-tG;fic^R~n`S_{H6F>SqRk*R*IsRzR`t%oH^1imq*JMnRJ$-8G zT!Zp&GIQDZo}HW5d~a`6W^Vo6T_p!Msd}4QJ=^l7WNW?29@{DtwVv>QEsUDiLB9Q8 ztSiOF@kaCX&IEBk+DYon5nUP>(}54U-+SIcMPTa9jL z!Ezzw|G&Q*KYhRdRcy}c=fA({|8#{B^_x*g8J^Am)WxTn!w;X+CAGR>c)PL>!>N__!&iMOwyVd-X0|yT> z+SmSPo@J7`=5kGm;+9Bbo!C7tujfx(y;^&ker((IcK++H>KGTK_siYbmFYe6vH#TT z)8lIz*YEowBqsL8Ys&Qf`|Ztg?<|@8akt$Z3qfx&eaEY-LbvYAug$u)Mf2MF*yW!h zroEbFk;wEfVrNkHb?M+7>r+Wt_ZyW&pW2vQ-C8XE=H^!EwNYC07Dh?`+VhEP+n=qR zjEt-7Im4vZr@JiCUh~#v$%Ls>McH^H8vg$N2J+;Em%`jfe|>w~eOB81;dfDO0ijDS z&wtKr3e$~Fdi`wei+jF54}4zr>C>k}uk6DTZ%tXbVdKT~XJ*I6#YOC{(rx3BS~LC6 zmX*=h*WK8XDE#W$%EeRvetmb9ySn_nWBLbfAAn-&F^AeySaZlZ~5P!c2wkc-=-P2$`^RJTJrl|T^TE# z9k%x1nf$Z^XMK13uf4h^klFtK2j#k758cZ+wvYr{p(J-NSTx3*<2p1%8BXiSVj?kf`> z*QQ2FA%SnJI*HXI5#bm-8B=dVmH>K`)k$=P(s?k>}k zIlsch+S>Zdo14PU?L3aJr>%YRZ^P*`AvV%;7Vj+LO5!rXDInE-o$)-s~*4sC#7bZ+D63 z!x;&oF)Y#!4S_>^;5aF=uDziz`bv-`U?QZ7p_r zna|aunJ;`k-Q8{R?Y-d~n?j-G=jR3fczomBIX>O!Ee@O0&R*D=tZtHXBjEkliy@#i ze5rha4=4?biitgna$z}i_;BIZTcI(3-rFyo{B_5!U5hFsB$}F=E-ow0W?^N0sT*+m zwWQ!wappvqC8j%fR#yCZVz|j@^MvWs+wa_o>2OhsxE*nLUyy3Z%12z`*R?im+h+D< zVVFi`<s#HsTI1ZIs59W70+ItJRjYzBE%UK9Q^UgN#T^#bY**c z`LJoz3Q9_vmM?F=*eA%$5E&U+F=bNInlnC6o;`Ea5j=eE8Xq6uw}SHW_U>-))*prL zPS@API{$ZMe){k29&G8XvQv5sN)m_N`6o`B)pqAjOhi=FfrA$X`}+DmeED$Y zXGO;=gQwe^C4+zQOIVSW<_7Z(?os=}|YLR;%s z2ToqkEhs1$c=Wh~grK0{L`F{)A)DG?AyiyG>-+zA@BaSo7Wr+W6awOi+@ zgPd>pNCIM4(Amqu5AO?2p7h~qc)XIne*EgnV@HoaUM+cF<4^T*K3M??i4|9Ez|Iqe zI?w3M)$0!)JXrAI{qJw@kN4!KE0~*yYyZ6K=X0Q4zP97c8K2hMdyLa~T$Cn;eNqMm zM;T9xprD}OOV6*bt{S|2+&?w%^YvxEGYkrqf7VTWv;$O`A4NoH@0#onP+3rK#E$wZB9T`Ogh{DKSkit|`ve zGFnAYP;jO=+aXXw;dyXs>S_toG!Y}Cc`t3>&ooX;coMDrWu87LkQWyA7=YZ(%)y!2 zbhUns+t*iDzs!1nCSQUD6fB>QLgKB_gqQQ+G~eh8yF#_+K7ab`SzBrSx}zrqd740m z{Cu=}A}Cd`O`AWzf4^D&A%FY7EnB{ntbPCg?Zw50b#E$m?B1POdmp4`SxY0>LgkNN zUIypf`67O8ZG8KbDaW7Qn%>;Zd{5$^6&tS%M}2+0uB;-+?960^o{o-=6DMry|H&*r zH|OBa;`G8tM>vlhJ-&L%x-wn+l2>;)b)&bqWMpWp+Ogxs4-ar?f(8s+TwL6IlqM>e znu_wv+d6r9am}-@@4NGSr$8seZm+2c`T6|YSA{-&`<7W;Jl$Dd4`f{+#5z#8b(~>J z?^OW>4hU~P01gRI8WEhy3JF<|suMZ}0&XCWfpA(Q#B(4GM%<7T1=2AwG6C!hkcN&k zOpurcX-E+RHOoNCm6Vi5tq>dysE&@&6y@SV_k59%`hrWr~o*jFzMZ$gPWde3zQm5-Me?M;`!Ua z3@M?c7l)OUj5Kq+S4y02s(X8Pzx?U&HB;aqvRBlgpBA&h7lk_x~|pdipK*cG8Ilj#^8%Zr*xy%}nDBRd1tQ z+}#h~J}s?$ze;%CJh@#~F-nWLpytJD`Oo*4e%ZODx6y#v`pfyml9yLFd!--_BY%#;vTZaDr{64?m1n0_&2~LbmjP^PjA?6W&>h^Q({3@l~$Ezp0C7k^9 zR6|F{qr3a~-rwIRPMyl?&FyVrabt1S*HbN$@^=c_*3x|6zHxl`?!Gq4^t8>n7cV51EM2N- ztIT{YEUaMF8*3r|Eu#DSefsaMtnGMB!(($?Gi z&7QyZ*~;~0rv>iMUzVFv`Qo)r@78&%x@%{5-A>Cs74f@i*_HL0Iyx>nZ**1e?ri?j z!xPcrvLa@uQP#CJox7s;wMlHsdpUdIxlpBv3WkQ97dIMuczd@mU8-tx=dPf@gZ`{} z^SmzG)z9me4h-B;{atTU@usE6U%!8U{$?z1L!$xnNqr56v$ISMD=skP+}-B9tM29} z(F_?87Hezky)y10SA27BZ)6tN`^VntvZ%ni{y*D```h(zZOdG{A<%PIF}wHlwG;HL zcUwIEtT}&WiOkHIku$98?Y!g;&0fF1?|{SAG?AOTa@qA__vysS*<>gja+&v(j;n|J8#s>+H5@%#6^xVBaM&0FovDd*44-Cby86O(B-PfqT|y|vQ6 z_FR(g>*LdUZ~y0u*Is%1X~U*1Q~uf8Dl^x=zuUe4`#bltvTb+X zcCS}#X6J3{?ta$j8hd5!re8JF^SgBWS$lSx$)=EpGB9=vZa~~7rQS^^SyglMoE$F5YLhg z502_gJlwXg>#@4uqmPf(85*WcIeuePskGakugm;CpFex{=qFL_kLM>UYvszz$~M1v zA@SzlZbr5GKNEde*%{Wqx>~5M=U0&EC27hfC-*M(o&BRE~lT*$2!~7Pdzk0gTS#0Y5uyF7H%@=6C`1GA^8#V~2`?Wnjao3^7~m?StEWP*Lrie-eGC-sWWE|Ejt^%vHJY|9~qBawq#!qdsn8Zsc9s;@Y0jN zwiXs1@3t+q56;hjdf#zlSCIdci|#)!w5&T7;`zxg|AFi6jRhCWcYJ@)cC3)^Za=;H(tqY7|6_Oc$k+dpd@1=Uf02mxzBZXZ&kgMUePG^_dDm<0pOVP!r(S(t zx@`H>%3hsrt6DebZOX2$u0KjY3dz_Ng=F6PEUvGl^vNo%?(fzTjwLNEE@$T2%YT=* z37Pfn(o^k@J%!Adm-{+rY+j}%t3B2KXocA&7Euu~1_rIrO^0uk-xvLp`}&)#$F5@c z^vd+Kw4_&G^h4fNOc#-rZT7dD-L+#!#mxPY(b1|6gzF|>adkxncqKL>^|ey&yuNDXO`yP+9SIE&$be{}oi=d12S z>dYH!*LlaV8Jv*D>GxuL>)ZDjs?!@T)c~^b#^0i|# zmhZcz>s(j=YTLx83)g=(xmLAG?_2JZ)f~BHl`lShzBEPiYqnPCCijXTnrD8Lh0S!_ zFsZ1h$e{cm)0?2jo6Sq^UQ&0S|N4>Y=~FySqSgOw#P6S**?i@SiOT)G-Tupcbd5Q} zboBM*Ka1(;ls8NaIjnw&XUUVvMr)(CIdnfuw5Wfm)F3WCRrU0=#CvaUM(qy{2?%JA z+?;m0WS*_for`;;%~^h!JBW&li-?FQ>DtPICTAWlcAq$FmfBr2V`E|C^z+Bg+y7Dc ztmTohIjza>{nU=^7gts;zLYG~ebl1=Uox67v6B8T1^za-~+{mz;Ge?H?wRPE>hRF|?FFAeOf6kE(^ZOyIedb#f25q>r(%F4x zZb|Gi(av3!!Owm$G5vY?_-${~A*MUK%jI|O)R(`hr=@l1&QI;9;%0aw>*efsoi!lxgG=jK_q*Za>AuyLyWaU#%!m(#IYwcPA~#NMc9$2~tT{@&Qw zSg<-uG%ReINBuXRjfUGloPSuKqIaQtx?Xeq+NclT^A}u7U#Ks-ah}NK@Shi27M==m zbF+GOX1;#KsU4Xf98p_y7~|#TZ```I@5j7+^#?aT3LCB0S`)cjEHpOu;?83C#ixVk zzn!*lpMB}=6Q3>}uaqjb4Q2mrCc69VwJCb`>pvMRt@8~E68d**i)VrG_QC>#TU+v2 zJ&ln}X*tOKZ&F*^g@qey9IXVsE z`OCh%x+v^ByY0Z;v%Hq)=YvLRcYlAAXU_ZuwiaOGzPqe@DlX-}{q?n@yMOw=eVM7L zt@G~gRx~jY$qQYrWN$CO{n4Wj-|y|+QT=|ONp4=A-oHP^y371$uew$^>6gpTonCB< z71mb1?KPh`bEax++^5^?S42KeZFrvO#dU1IePBW3oIe-cUtC%``O@Dyi%g?OkMq5! zKR-LO_rU^(*4yi&HnZI>e(^;5&-}&mQbw!t-Jb#}2_gJsd{NlxKyc-Md#q7*{ zQmfC%`0vMy=FSgaKTe#ztiq@3{xluIDY_FqTHcH6IW)6<6`gl|-rnksHAlT>epQ;t z@%Y%j_ItL~CwL>CK6#RGa?{fv-+yo({AIYtMR@RE_D;Wnj>P8vFKMmKM zXH(fVF~5JJ-fj!)$LFusA2{VDvHyDMOuc0leRIX>+|k{`k1RLG?YGgZ)ounPw-QTyKB+uASB^HM`m0b|%E$Hd|}> z@$biiqM}K&-E_o~pRcox*qYXxP@9n8tTRJ<{~od1drGCRt&7%=eRq91|FM1F`!1QN zPW|Uo{q02`zuKPl1;4u@{JTJPz^FW2)VPk&$T1*-C_{FB!%f3AJCE_{ z`_GxP?nT@Z%-7dH^W#}|Md*69&)e6m$vHDiySjK`%B}o;|AO8XuvJ$6jQH~RyODqB zx?i=d>=&*Z?vu(?Syfr_p!eZ=&TD`7Wr@zSJ$)rgPM^*Bu5QHle>*l-B>%|vO4r%A zb?d>|`Fr{TmEAb5wYSfoRBgWdi9-F$my$as&sp6L)%=XysDnI=E@-mG#8e;N?Z!dOx`1N`l=e7Gg z1Y2hp$<6oo@|yHBE^1pwU*+a>&722~;=Pr(&DL(rILLI6VYW~wi+A{%3Fq8a^_{ny z*<-i2TC*nW^u2p>lkNX;^ftG=fB(PwQOlWa*REYN@-LWcx%ij1QTqA0!aC*e?s%$k zEbBLlot787`@w4cWvBnH^ZIvSchI6a%=&eEzP-Neo;l&h-MhT;b^mrgh?z8L(uW5N z|G2N|m$6lg$h&635^VoFBr#o(K}Sc&pyC2UkGy%<20J4oujT7AR$kj&^oud_<7$9@i8@$(^BAQ@iKm-9@cj%?Ss(AHTV|*m~dGkG%`(fB&h}Gt0ZR z#9*%BRoz(QX~m@l1qbfj-28;?V1u~7Mx9lrk&d^|w16}B?#UIW)vhk^@sEy{uK9A% z<;KlhT-V(1hS+>$%VcLxbX!ute_xZ=+?g{qJLXKke(mjT*8W%9axY7*|MG5W(XWHe zYzxYAAL^L5^T|)Uxh{2OxbXV;aJwDfT7?d-6H83YxVWjc(2=+q8JUQL}dWMrZ4r$(O@th8?+nT>A0xzNys@wcoxBewdTl*ekViO8f5J(pKfK zIMmhESyq~E=>Hd*C-3iPyeDhyw&C54jgOnc#dzj|+Ca%a{$0sbHeGuDv&k`d z8)%!^i&vj7wHR(moV8)gmLtzEFI(g#Dn4}^KUYqRVSc~R8ta-TD-LCMY`mgdYcQ=? z*0#uH=H~ugyLT^ijhJ!f*F@!eO}lr`zO=>9&oASyn?<10CE1_G!IQoj2&B2JS-bY* zzaNE7rR;pNmofy-U7BZm`bekn!=}>weIMJRes9>YVM3+v$2U8Rjl@4pQ1fLu9lky` zc*pskp7bW`&V^@ZEz0!hD2db&JAFniGU(+^w^^B)(|WgTDQRivwk~_W@9(x#y!s#h zTL&?>^mn+sa_{%9{JF>YS?<>5s`)Z9I&ao)OHj*pIBR+??L=J21Ln++5HSnMpH>Y^k#O+U70X?Ok6c475|BhmSbs!V^D zuX`fc>GI-|=MSy2NdMwj-mdG_8{VC6SL<2m!~5ob{KFs4U0+_@uc=i1&|%S> zwfAkl-prFc{C&Bf^h(XzdCLv21($BfUp!~!_M5jBtUm88eC$G7=A!!hb}J$mw?$=E zeSf3*dCSF<1veQsLo?OZO`Du!&pU3?gh8pS&EbQ#c1{)?mIHZ;Dc5?b}F}qoDRvgP$W?xrgvDX5Pswk)?uh$e3 z5^566-`A+WyuL5hTkP@gR&JL1{tkg>k7M`lIu`uw+uOfg2|ph#{Xb#)^z{kZivIlk zGmk|}W@l$t?BG1EH=$fSKt*VwclyIAx0Z)g*lzlwJ>~9GpVMp48|nHl^(xD_7V`D| zsngyTlVAR0X8-u)WH4(q_sU-;tsW{)yz%j%U_IQ%7x?o=*VPZAWp|9O%=qXrU8~BL z@k_9sN#YBmt9z@>w|?HTVS~f^xI^k|{{4PGDe%e4_hqLi+@HS-F^<$#EB#c+6?)QW2P{9WJKx z`{&i5pD&Bt*%RedkISjvO;9+)(JN;t#K))q-b7VJCF%XXzfW(ar%d^vDdTIseBL}c zqvRPj8m32AZ`~?7%QRap_T1UCt}!ul?);72^XF5$(_w~s3+wQ+AM@@H^2t z`C%$snRmbOMZa@*MQW#IR=&ErcJ;N%e7RnCeZ9_~IIui;`J*p0H@kg~YH4oXn-F<3 z`{b__zOP3_PPMC@3SL%ITXSXC@A#mT*&GaaI=X@?oZaSEO6|HE6kZ8x2YWaNeYNr3 zJ8x5duvu~5=F*>)l3n|Lo7&xr%d!uQ(b;k&U!9?2kD%)1c(ZA{mhvAfTK6vRRD8D1 z$xB{0#8yq+R?;x%v*fEep*Lqw*tc_6*ufVQl|S5`wDeNx>udQAufx_(Ij6A5Cn;!A z!q5A{>Hz^OZXP{#Dd+~r)H%J2BO*30vnYMFrNmOnC@4*!dSgTnw|LyWw;6KZigGq? zxDXKY=l|U=pzfWD+M;dq3w)-`m=SSMM_V^)OT)G)az2~$?(X8+rZfMD%ERCHzrMPD zxguUnOpN2h_vv+c3*Xm+F5$eKnl=;xKC$W32{`{3zu(D!1(7o}! zl9KYpkb{@2Jv}`=d}@B~Y%$5y`F^*mcKXXpt5y{jGRKwlRegKW*WCVZ;=1ZTKRBPA zi*L{hjk&PNmD_}i!{P0%x(^>eUOXwA-09ME=#bLPa7mH;^uB!C4lZudM{=e>{NlR?%lqym$MZB73Cvkdb*s3M> zR?kqqnU#4b>k=>9p`MWbcXtbZoCthr;kmQ2GGb?zD5%qL@t>Tn&_1JyQ>L^mQF+UA zX!`8w+MCxEZuoHS$5id`RJqK3rP_W57iv8wPtTmy!qKb}zAk1mXN#)~7yF(ZsYP?I zD={i8y`rrq_ih%e!qv0O_xNwAtgK|LxOu`p?4w~VxA$E;nOj?n(=!!#82skjEjAD+ zdvzxAVA0EuvRyBC`%F(;ol<7*dTifsz96}!9BE#xaeJ|S65ee zFF4@F!N=tkkg&k5{2*w0W~uk|!k3>!@6;E_`_EstXvGQ+F)^_X+t;&{mzQ7p@YR*~ zz7z*n&XQ{uhQCtuzPj9h>MZBNYRh{u zQCX`L1kyky%bAxkCk-SxjDy6)#476VMAVr4eCi{<{QR7wNB`?7>U?>+c=M`ziI<-E zZCs_Jo6>*q?p@xxx~&r?OyGEMR9nf?@;ocE%(OWh4<9`mX}~?L{OhX^-##7M`};d1 zgZRJQ4F{WBnm5Po`eU?r?OI-@Kc@S+gQH#=@@cKKG+4as=Z)L9wQmHOE|q6IU;A%Q z%F(skBD{&SD*_cbaH@4NXo8{irs#vsf$)7(pcXkN2N}Dg*koh@m$Ij5B7ZjZ@Y_2vxC~~{&&faqQ z*Von`UwQe{@nqrdqbE+CatjOFwxy3L!0PR8#hKo=7eRe*#Zyz9E%&GY4!ZyO^PNr1 zuDi}%4tN{pnk_7H@i?eot;_w}>{jZj)Pq-Mcu9xd%k~hRuGQoa@iMz(=M~)pd(KVe zXtC{}f%_E)i z+U{qGm%1lL=o~xyBEuy6SCQKZZgKr-H@59Ob9bYd?yThF=VBQeq|Nh`jE#l;{Pfvm z&YU^p%{MfdUIl3&2BdnW z1nzskv*e!8lv!b)ql5M7pQwB5)^!yfdMoET>86g&)5GiujQ@{<^C74D#X*k`dI&c zU8lcAd$QMdE%S8(Mf1y|BVS)%a)`*vlFGYVW!bQA4`cJ}wiXZOM4?WWaOHK2V`pDu zXjn1Zob`6wG_Dm>!e5@()(?HPuyocsjYeN-~~fxMAMx+F*cRIM83bf z>zwk0cjm_Ao=(fFlaqFVI!GxqPw77YK4;oAwTNw-HLKU~#Xev8zHIfPZJbLbU)l67 zowus1R{E~t)=ddoK5Ka|e>FWa=hZaJx!RI!%!zL2E?#7O-z(YtvwPp{fQ*RBCBmt7Lsy(z4f_HRh=*QJ${^@{C?kG38RV$ z3GzuBCHDW>7I7i6q;zf5dApx12OS$z<($1vCI2b@Ves$P9#`)4C9%&!{GVKO1C5`Z zzVi5Zzo{4do*k7zHOwm`QlD>{|K&>Qyk9xndH()=*}ZYj@`bNfTHV-wkv~|2d)a}A zSKF+<6!IEQha|?tKZ})wZf(m|mWYVa5lg=L>FERy6|MbJFJEitSWKE!Qa}C3sZ(5u z3m0B`+S1~Z$z1>O(&>X-%+jV!!7E=*ZxnxAH??N!r$0xzFS(!9pXw36*^RfND(m^x zNl8oX*S8#TS^I8(L~ju9ueY~3pWcdpvo^XZRbT%pv-9i8bJyxxZF{c(YMmW@D)jis z-93`M>Z)w(-dx(b`I6xWp1@^aPo6v}xc?eH&zQo`aL3cn&Fj=@>p-Q69Hm*;FILp=y0Fl>`rxOP!ONHa=eMto z+L8Oa%P@AFOZ7hVN}0OMwc2|1)N8*@g>1rS z*Unqvd=)eWJbmSj=8-7Qm-x?@GV-t87Txym-T&26W%(xM8FnIbajmpXL46m-N)O{|MWLJ864yf#JG!TCH_-$*Vb2}G! z$mr7L%c4sJvhGCuc$E-x#kW^)*Goys8@qDZlai8B-$k7`ZyvFsMpuc+&~W34lP4#x z{BBEpR z!-to?*41qdxP9Kgj9pb?l~1;l(nJN-r-pj*JDXy6e^2<`7n`+oef)ko85tRt*Yj+v z)gsQF5ZK1L&(1DO{`pJe^s9cslOoPJJh&Bb@pY%&sdhD<*kvk0oPKk7^sAjM5BYO4 zzgC^^XO;rbZu`z%j(82uZhc(=Vm^&4w*9hZJyMm=*Eh+LP>9%`dfRMkf8zIdwh^1l zbk*w3Sl93UDAp(UH~i(dyu8rB-QP|(99w#Ndg0Sop)WVB&KAA0Dl|CpSC*VyllxEo zm^~fZg8Jugo;%0)?;r0IRb6p=`C{f@mTzjrkJ{+T21>(?B*_4Re?u||#V(v_Omyw7jS zO4a=HyV!Jj>prDsvD`l0iv zxt!N9<*ru#eE+*&MEA-n9!_4J?er!m*D&u*MDJyOIg5Y|d;TAA-1=_Hk)ubGug}}R z^t7d=<%f@7^^9XrKhuwo_3^Ci+50=buNBl^=r}clZ+mLD!OQ>2Ny&xZ-ki4XUwC%b zsy|gLcCqowC`8y5zmxg)?)LhkUyI%UyB_&E-G6;#RMeu-)6h*qJ#1fJYkPimdKoTm?0sg^)is%yjV_z>3g!iW+Inh3z|G@rTbDZj zE;G7(OFwoW)9tc1I-l7u&D{L_gZD~#xAk9MwXO<{P2H9&C8T70?&dMy*&CCd$~R>; zKdqcGsY!qTyvFG5k62zG?~z)1sluWyV6z+VK?(ln=i&uy-0rQ(R3<2lu|0;cwF|6tmB<%-E0y^qX$Bl7ar-TJM!R_VHM?G%1riA6pqi+`Po)QR{a zyJ^#=sd?q-{U|EPk$kU~~GZbhdqSCp4Vj|0Br2T8W`Y>f^LSCT**tpT7N^IccBLcIA|cu+)5~ zW6$PZTwM6^QGM3`9U`4BKYlFc|M+l;=cVg*T-@9rAD`d)6cV^o{xd868dT9y`XCd|!5P(7vy)uQ%`AyH}xsbx#G4jmCzFO(FWMKg=8E zuGKC2{3+$%HH#e^=ZM@&OiXM%DPP~yuU@b8V@>$_pTg>Xb6oz{)e1;RaFm;ycep6o zoIc|c6Jx_CZ`l;Qyw%^LvSP>MuMgL2o_XEODJ&o^ufHSX{k_lT=jK_r*VX=Bl<6TH zvObLW+O=yZPM&m3N)kFZ$GW}t_jm4PQ`s8yVy!Y|bgoWc7i;C6eoa$LOQ>Brx>J*sAT|{&W4A?v6TTp=LH7mxRS_m-;qD=p1Wq=P&&Chc)N^#^7h? zK5ht)pL%nD|90_NZ7m#WkN$lB!D&QDy9@J)7{XeFA_4Rd%8U_MCS$}r)_BtPKW0bJ-`8MNf=)~8Z z>rS_;@dPgOTJ`K@XM4XKBZJ>uyXF%oq+eWLuYbsC_QBJqxwn~_U3&jBrNV+w=9l|3 z_Dio1w=c|#y~=*%syirQfE#gk=PygVUb*YW_KToerDv|@wnSd$KZ2#kQVa$E4!Q0z zue15}^=-FUV&aEyAKTXU@^0E(JYm9&4q(^bX;Ryui zRTFSt-5|kX?3kAqYFKn+cErADHYfL@jgF5W*HNCpWu^}wJ?a6CgGz2r=;4tcyF~65QL|w4vZ$OvvXiA=Yc#+pV9SowxLoFsErvEodq!V@2YHgbNM- ze$?C&xpCu0#+11EF|n%^w#{7f6i~W@P*qVNt&?;ZpY`Bje2< zo}3KcDVwIPt=&`oK9=XregB95R)?={TffYI`tQR_Hf#|1E@yLK@f4An=aMd~`F?oY zlOJ%>@9+72=e74pJyadh)XjTxM#0v-xgmH}i|3Rr$LWWw#pt{!aYl zF2Bl_VXNKeEAG2fPrUb^|D|%?u?TjNuk^=jvny(MRGB9>h(G?m zvKTGc9ttO_ow{^MNcdRqVfEl;SyT3ft)2Db>2vvw+28Nq*jXJu^YMa+=;(#T$NefE ze|=bVyh+3RrDg%+0?(Bj4^PQdQm?(NrkEw)z6>;y6<`04v-;n??%3+G>6VLU?A>cy z_5D?6qI3I!d-vj=)~u?maIyQQ3R?@1@b8W#XbwB)-X_-X@-{lgzLzHm?D_etz$9bA z-;HZaRu(V!`|cL%ovbVGM*w;?a^u4;~VYll3zg^Dl{Ry9^>874DQ5EXEu&h+O zN5;@8F@5)v28Mdj-0qr~tzOSG&sHcV`Tiuy=F<`2P+#%h|2{^jujLi)bg4-GQDDNE*JGM}-79`-$dUW|8Qpp% z7G9j(_-h@g{+X%{E=mkse(qfA^dhC~)925HZ-12@Id(+p=RMn$^t6MQE(v|><6H6U zW#_KaR|*;i0WTlFf3{@70*33#%AmEcyT89veEq-qzqOU+!PQZwS60XKA8d4#vb`BH z$wkRACdOt_-aVJ3Bq5`DsS5h~^54EqeGqn)cWd_Vg@pwM=~9yphn(6Hp>yo*ZO)F4 zo+F3b`6o`B)^_KP&5n@5w$;1hFYVx+E=D^xH3f;P`h(U)8|m~3(tIaOgyb&<&?4)s>#KSdo7udk zzrMCMTJf_A$N`6ikTzn01e9VQLpCN2$W|N3mV!%1-nOvJu`Cw*{_g(q%U41oBBKr- zJ}leVE48qAdEbT&33KLmbaZ&cA4xLo>grl@T4^FjSlF@e#hbqrMnyy%xOC|fXv4rS zwNvM(dhpZ=xVWsU`l7*V|NoctI#(BsJ88eKo!zi`>($4Bp!MuCw{L!aF8SM?%1cid z9B?=@-}-igyUKm&!k3pt=jHBxJlOIbyn`YCnD`=fr6ABk>G{6DWh^Z%+w4TZfu>~S z$kQS?(euQ)bI0aXewJWSUc{xTuFmf2nl$%WVs+6o|&7^}MIQ<6eYM^9W{+`NRF=gx_V$*}iyXiZqZ|CiI!w@JzQiIEYFJ#S^sS1)S2IkK7X1}VEyp_&lIKo3j9;wXf0f|T086K)u#3R{eH&^gu0J{ z*5S{!E}t-UE-!m^HOr6Ri^JB=%6k7A-|GKchRf4a6!i4uzQ4Qg9u_91qpS1qK|=ql ztE(4pn=c;|yE;Qx-(mOsiB>$JYFbLgKXtywhFvx`5|EW`-m=AHNqWkGTc^1Erp|p3 zdsq7FtE;VR*Y<{ex)^TFGv&YWmGs|B-ft7Q5N{nXC?X=FV5KJ3FK6rIcFg$6)29b7 zo@6}dH#P9|dH#KN_pElWyWiD)_-zZzlI7_K4jp1TH&uIaTCdcK;N@mHIa`ADc~6Gi zDsjFN7<(!FrcubJAVJzIO< zxSRU>FU_29fBtCi3XMB^tHp0x-n>+H=Kg*8dGl8J-de;h`mkK{r95+@=#jZkQr_Iy z$^G!*@)R~P{gt!Y*?)a~-JKV^`_R3(zc&}ZQ&CTTe(tV?q})0ad4GQXlK0nmYvW$> zy1TPa{Vreki|5>KvK zKN}~c;@IXfLH5XsyZL8tREJCr$_<>Y6=C<9=VT^4gU~mqc=}bWUFG_xRM+>`4VRPBx#v zo9DO8u+HCiXN&f9{m|cu;vWr!s=vRT-co6kaPQ8}4VyQI{)}0I3|JJ^MsZ({$LDOZs%HMW1 zGP7kY6?Xd-`Psl|($C)?h1Dm_n4&UyUG{Xp7q^yrw?4mKHhZ1stX=Nj-rgJQ4zn#; zp6c?|%>(<^y-*`XsxT!hj&O1l+^naIkRoXWw3C+QuixBQKxNkUxLvtp#tZuWpIC>*eWr^q_Nl;lm`2u5Rxq za`CIfe0k)}c=lGcNL=0g@mFsFXm$O=^jo_^wR@z^#n$QR`PAg)$$gWz=?Gqae!+?r z9(lLK&Ndt7y^*M>c(G3SM8rMs&csE12Fl?vF+H~R?~XoPTwiGQFVu@`+y7tEegBJ@ zHm99y*gt=L*t*YFs;u>YeyabotCI;{?&GxE>`vS^V`JkP?a}RgZv$guno3_^fBb6e z>pABZzOYf6$YEXf?oj;kzVI3Up1r-jqxQSrGQW8(d9m7c4b#*`xHjhgUT;zUkZJkj zi85P2_gIi-sFT z<)VXvnl_vc7byG5WhY}NqU_%D;Lp>r*>5*2I~{Nvlt7lAFWaZ3p{I9j{rkV>0rIft6vG9<|Cp%?^j(-0Gv$nqe@aL(wt0yBvW#vzcU*8Sq zSQU!}tNS1NfA9SX&Gj)Wf3L~Bq~eh&6}$E2)TJ-0uN*nTqIh@L>Yx2 z!p>~`htwC_wM||6%6?Pv!nM^~d#?WfuTlE*RA|nPFOx6z`7)e1apK7N=Si_3YVd}fv{`^S%*TFbA7NER-AZ?#Z2ENt3~OFM;ym!C`56zeYh$MoBE zUwFU3&f{TMH-)%_mwvta`udE|XKnoECS3X^Z_(0gpZlz2&AM9;KV8vvj@{;8mCapx z;aoUt{ymP3B|p8+>3_PE8NN2Q{c`%bRi$rd%!oKM^LuWqtmsqDR;M+Q-);G1?N(hg zEj<}=t0edCV&5hv&_*w{yu-_UPnmd|DT~zwxPd zn3IZ7p;cV``D16Jw}su{410D~T5;OCh{m2C9~JxRw)Okw1t+RU%sg~Rsb+gsuh;hl ztG?Vl_UhN%?hO834&$JsM^z(sC9x_gFP>RZTwGl9;ot9!Yg;(y%$alG`R9pK=l1S6 z-e36d5Nk?GidUbmrsly-qW2Rox5+!U|PI+6RB0t4TaR@lhh+ET~AHfmc- zcQ?1rnX?n8&u>@n^yJuGBk4a+#pw9|o#pat)~qquP;Wo=-~5Y)h8*0x&m8&r^XH+n zS4EGi9c%7r#iH2uXEo&SGY15Eh&j{Wwk+j%|II%eLk)D@?{dB*21)VuX_)uZim zty8TMPA}_XWn(+Eu`GAStXT@$>gpUCpgV(PQ|J-%+W@N<1 zEYZ)4ZrWH#2FVAyC@8 zzgXG5rp3Day|>-|D_2b3+}SEUS=~2e*82I|bDbR>8&&S?C{(Vo$gx=dfAYFl)AqfS zjop$jDLL~;*+Zu%&z>251l4GFRto?5`{zN#ZZnr8!%LSh3rdQ%c2EB|wI(ewae87_ zmeTtxZ0|jjl-9-XSLD2XXxR z_2u2tFH*m%%;NS`aP~iX#K4f2w(N!ECFZlU*$%a$#BadEG7)V3VX^n|M>C8^CO%#)&HC(g=vU9`hLGW z`Q9DNIiHqu)o$OotM0kdt)tpPS~I8k@LW3=yZ`i;mhIV>*@TbPH{RNsebP5LB&5Z* z`un337x&Nn(ZEo@=4am0J0{j;ZzoyaJAYpM@-m;W8-@Yf)Xw`yZ&NTg_ZK?<_~VDa zv#w4mWqD#*_lRX%?*Gtt_oKGvG#1Y9o4PYEtZdtvMGLyl9e(`LAn}hl*YhvpA|eT= zujTIek}n}_pZ7+BN6NzC*^f_8re1YdwmWj+V6%wciKvK(7H80&<;G^8n&W-42Ib$v zi!NuZ>bbJ?wG|`7$@BA)4^5w}lBliiEn~MK-m~k}Op{WnNt5o?ddeBrNZ85!6ny?A zdi(#TdcQeSTCB_eF>GGuKi$&rdg{)1?ec{$FYTZ7;RxsBi_63P^Zsk@`CGd4eS@RV z9r@j5T7Qg|t=}b8_gQS(+JxI%KE~Iy?b}78Gv=&*JHy@wByKlL?zpwA$o1OO!3T1C?Km0^r zT`T6jzlzYq_51sikFSgMsYzI1AGUtV|G$g@arJj&VhxIqmHenUoxj;dN$}s_??z_- z{}^xn*1fcq)hz#B%dT^?;%EFku<-DWzsKb~cf`-PllXr$ea_|AkAJShV%G&pUydc=#Wy3&h?ut40m^*T4xv*dn!mS_xjb} z|NkCu0qw@BtNo>Mcjd*CCj~$6|Jk-Po|TC)Zr>z(S%>hq8(z7N zqT){aMh`*ZoBl1FEB*;%!};gQ9~Lmqut>BKmY0;|J$QM!*7JjxH#1&a7q@o9;ze&} z&9$y?5IsH3$a)uOg6H|Yy;||Xw|kcQUcYMl>gmf)!^Q4~h0^uEIx7WrCr_N%nY;hb zp(C{)e_Bj+OPc=i%ayphMlIFu(Qj|h-Tghq>Y!WyFA3p&KVlNqB^a)(NNk^Zd70$V zevX)uH#Zo$pVzN0F+bBMdn@_Z6-}Qzv(26E?5qw?l&ZCt&dtf$Q1sJi=iGz?w*!0Q z&(6@?EGGY9o8Q`qZ6ObDrHF|=n_-q}q@#NybK^zBE_02bcEzn5cU3%By5%mL==S2k zL*+B?lz6495+D80x6prM^XTxyj5|97h0CA5y2`cw@vBEok;Z8U&YbDFTzcnj%*U_c zn`i7e-v78T{OH$$J9lFY3;$H??A@$&@BNL&%SkJ0?BoyI%N#pmTREv?kIm87(K1$t zriHeDdwU_eb)s1_J8#2u@!i39Z+?C*Dx>QioEjqNyi)kqx4PqfXU@5Urv296nZlBq zcX#LEHLZ_cJ!)d8x1afVm3O4qW!G3=|McYIG$P)c+2c4eAn!bqh+09zEha$6#LZ-nVx*x1T9l*U{0g_4MGGGa|+N z|4Er*`}}_C<40om{LnYOJ$v2h>Jo?lbsStgQ(7)xx&+#*KJ)Rm zzn{1-J6>D%wfe=yz1Gidrd~_~N8;?awWQ>pI>)sry#?>|JPSC zzR@?oxbck#OXc;SId_(8z3pOR@SSZk@#f5TcOu{MnltpsnRfj=>KEJ0&iABd&HnZJ zXU^PUPpsPYNB^#+`Gw1sZRUJlFEUF@IhALnUq*DV zRM`uSsmHs;pYs2nUgr5~$2{BW6E%VB{8BZ2#Y?XqoAvjrm9=(v@hyGzp5y=Q{~uU2 z^|WE;BbJ@}8(yuF4Re_aij)+N+=bh2{an>_{Bh##^RqvGe&##Fs!|A)?7zM`C9k+Z zqjtLAn>Ho?$&*7*9X{~yujShI@Hmg}c?IRgsgDk=iwP{)@=nrw_PW>AQ_eq6{`F<$ zhE1EM9GSbjfN}f#J<^uNPhXj)J5`B_+5wLBH$3knR} z>TQHRKd)_G8*TRZx9RGc``ukOTrXT3?*Dde!S8Rc&bH*=-`jlXkP@r=<~3_{E-tEk zy8Xf0$8U5l@6b+8OJhrSS6B19sGrF%XOnR404V+a3_9u>pkUo&Yi#VDwlTlbB-BmR zaEjGJ?Yp~5QxAo&kDYA2bn%{^9-lkAirs~teg64l{v6j&tD_^QT?~yaEnIoL#ec3{ z^Oh|otnQn4{5iCIbySIpVBuew%k z&fK|cgMPico4UL!yyg7!#p(WKUyjVR?pm(+a@NKzFMsWDe{E&``1D8N89O#(AR?US75+&6j=ZXO@ipc`rZTyO{P{&DKa);efo{*Vm_Q!zAnN<14Dn0xah$ z8Wbaq)cyUE}S=y*P?&JmaU2F1MB|oJ!Le- zEG+zfa%WzE`;3X5J!$Q!+w)gPEsi~Q?HXwQ@bCY-B{8XS|CAQrJSud1d;amtAKOjp z>*H_S+9$mb)PHYb$@_du+B|E?#JKYE@~hWpZkSk=AtEY%+SYH^nk%^qudftNi&TH0 z+WxlP6c)gajEpOym-nf}#Kbg7n;)LKY-i0=F5{ftvAeewiBDRemm297Ub=Pf75({< zH*fyPIwupeyUtnp_1hO{MUhSA@ngqkaZbPgbiLBMygaSmMVjj)FE8`4(6W*`dQ>%Q zuJ>h7y>Z?4*3QrDFD~qxt1@Te#LoD#KW*`Kzj-5{TJit-`m#ApH)_RH_2d=NQ+Jhb zxv}r4N3UDn%4g{e47vBJ{oii+_2lW(qj$<Q4XpfLjr91XG3XHR~ z7k5c`&AlLMH@|atKxyLrENF1_v%)Vh1N_L(z2s-@%Mzpw7>w5bjX4Gs%tvMRN<9^&f1 z7$O;ZB;ZwxUhRkd{}ZpjvsYQXXHjy}#6NF#-cfwpFMr&4{_f42C!bk=CUsSEB-5_d zs~HUbeLg?olNIatC1n%NoH=vorEz-UuQQPh`Q?QY6V6f zpZVZr@SVNY{N?ZO9`By6KVjay#!HuiKK!hSh>ixG*!=bG-N5^M?V6aFL!!9-XKmiR z`Bvu78oO85R-WFoB|SAo%Ef&KDBJIGfBQB&;n$Uw5nEDLp1JSi<6}_$jAv%-^N@x8 zyOy4=cAx!rcFEt;RSAKmsY{k8OL0f5S|^81+c&>Av~l5}SuOMeNC7hUquu9>mDtW)G;JHTZ*2A+Foc^|Q*Ou1Mqnn@We>gtR_Kefhr=2cJ zPo6$i*4LNs?DU*eQ7UGrpB#L0+qtM!Ypaz_dZs%hXI}nV+rKU6qRiT;EeGE2ej^nl z&nMm1HdV%R$?087`>Wk&b8+4Hl^WP7=rV1pM|9}R-}_c`^(^gGJ=O~Hb%f5=eZAA< zR?XVS=bvS1HIeOk@9Wt%@7w{FoQ zrIl^3A6QYYfhLQ{qyeAlF;p6O5bNpF4-$Eb=Cf9%XYms3r+pC@BJ#KV4J`>+>w)TGWwn^J_2 zrFOrV5up>cDJ0FXApiZbjH{be@7%qUketoD(Sv7UK*yFZC7=@)Cr%7Bdi{8%SH#I` zRb%7HoYAwSkNq+|c4^t`-*UF4&vcTKMvG3HHtoa5k8S<^+g0?;&H1OVk2!d+_V-NLGeSc19vnFt z3_6{tm=7tTAM;TWN_^};d#3o$sI6H^-_}HC2#G`_{+co+WR7+HyiESkiL+*{3bT5U z`#bnsv&&4WZ*7KBhazs3)ZSZse%}5A`POAxe}4B%n?G94Yk%n6Ilr}^vv=pc{C)4@ zvMAH+%r$XKmZxVZd53b@N^75wxD}BUlksQO#KQ9Q{9i|wsH}}yzAxnQrzf6COV5da z|6wRxR(SFMqiwU4{?6oJY5To8J~iaI)y0*?>S{G#UzMJ$VwIGf$+5rE`_uNQtyzm) z3pQN(ESVko>`BO3{d~|s(B0MQX8E@``hR_$xqq%rZPc?0WUuO&eG{BCdGgF1N4doc zswT3ZGGokK_U)^%(7Y9Mza2e2T|-wl_0g*<7tefIbjoO&S#13GjLb~Ux*HoBXZl%W zJ@Mdqao=Ca&)fU>`Pc3sa-R!zjx-yL~=CuDy*e>VNzwv&bkY=-%I;?xjb#`y2-F>({Ps`%cj?m{;52M!0%`(eW;uIGZedtzU!SLYK*X%PME9DgL zit25ObBj;SOgr?<`|84{FJHFplwP{b!r}(FLm1=br4d4>gY7`&NyW%~aHhWe@E zn)S2R{PT{v^Z59g72ctD_Llc^R##SrWleYVHJbK(@xFH#54-VeW;cnK{p31yNN;s1-2b{?eYp28t@}Gw&)ey|o3Ft%vuP6IuQ-g2e4CnPd^mi< zBW-v3x_5ue<>UQkwh7AjA1Ysc-JrXX+2QiCH&(nC4L4?e-#351z^N8yrauYk>8r2p z3aOc9*bho_^xw%|D%hGEoR26@j8~S7q)fUW&H5-!u0x^_$Wy13*+YooS> zSj)$BKG7-C?cZo4|Fy7RO~vNmJp1onhiv5dFE96NoH9sMk>FYwVIDEMX&=k@APdDH}Rc{Af48{3&X?(Y7+qGsOy z|8{H--j;0%UmrVN^5w&z^?JrkYz%d`cX~ga$bCM3-;s~?eg=iMyGp|gwiFf>mp1O- zFE3pF;X~ro^Tls&6u!B&SK2tezL(#<&ne@@(k|hb0j2AO-|xNN_0prOtIO@iQ|&X? zUYwn6>b!TCsJ_AK^_$j2t`-yStN1bD^VXKuRtx#6g^!rOzR4^yI#&11QcNeRDZcJ@ z_J^T~3V|3xoi-n?Cz?WT^?-v*ava`(<$d1b`~bFDnd{{}`}|7|M*R@%te zRCL^oX#t&}tZZe~*7-aBIN#J$?KWyb->cY;f9>me`g6tW>Ma{KaNPgDqfxV6P@XT@ zEr^xv*W&v7c9RMm9U0AX?ku_H5t(~U*Lg?zmZgc#`ZH4*`DE=DeX9I-XM22b6f6~d*318Q7t+(v zXqdfw^|4ROHLvdUi-?L?kUd?`=gzFs`^FF7Dc+G^_6xL(t+un%b58x zyCa4xr-$loiQLZf@ZQB`|Nj0qdiYq~@4+^%%m4KMN-z7iC9E{$S=`n3RsV9Xu!3s$ zkDwOrm;K+ZPvz|X4LaVg=F566`G42*Tap)Fao%5ke%^}M-P6u&JlouSaoN{upF8*d zvTyi%{r(KyoTrsjCpG=#7JvNlafMplof(E~o0qk#ZLM1`I?Ky zU82G$rWbigN9pz!PvIXG)!Lp*<*)AbD|xx5;@0B1b7iBpKe7vTmruR9qfptx<88~< zZ@=Gv49Q|l$Yke}JM?gIy{7H4fEhDpC@hH%S9^EpX!niJ&+l>FJ`OsCb3>uBu=t%d zE6;>@I+VZNp!Q-@?W$9`5BL85zOm+MxrawZ)0#CoEp2g!COthpQ~zq4-U0gt&gV~` zCZE2xR@85^ppEabJwLf8Oj|ZHup2ZP|7z=NmDzn7pG+(zKR-J^eWsg9+Lw&pC(g5G zYg^ydRaO>0erj*cG(oObqe4(@T(y-F6+LTXUST7b<};V6xVU&`^4c{zsn^o)eEprL zqPlY5hh5uVO>-A65ozsX$tzr%6%&B=i?t3%~i zecBut4o>sVKfBHyQTX_?=FA*B*~{tYlB9mj-CgG%aU=E1`|IqWbD)Y!So)7U`{n69 zdMsSHGxwv+m}@KCnzOcTzJoSbKv|J?XkU!ZIw^Y_;`*Ut~O2Om6h z=1f39K*JIh#&zxOkDsgzJ|lLS;lfgH^^z-xLfD)SJpO1Ap_4~(FF1zLAGbh&7vhzJk3{hd@ zmFPIYQ1AJCnup4v)8Xq2K0niyvHUgtOvZ+Xhuco>ZPUB`@YJQ$-yu_P9}-qiasPAl zsI8mN8)X(&wiBL-6?bA{FW6W}e1CU;`jOaQ<~;iGdk>uulvmO)5J*c)W4L!u+S8M% zC2m*C<@9qNaVB@}#(;WlQP*M3MWZh)a)6?5vU_O0I zDX59|a`W>PD=9lELz!Nw%=E-$`S-^*Y+rwHOQCiB{oem_HVy#^3SC{@0^;KQ_4W2W z5_-4IBo2QL6#t$9D!BfCP!=}Nc_CnucgG`fUsDs)#r6L3GWLZ|la`m-|7rM|eZ8P+ zTNb2IW)>VATw_|ymUix6RFIylt82vGGTC!;Y}@DAIz4#)x;tuX7E{IU)9F4rI(~C( zI$z9)I9VCBJ*##0_WW$y{Zsdbm#)>amo7aiaVsLpW`*(@kDa@BCOvG*-&k?d=$Uwv zdS~a4#KUTS&o^w_c5Hj`bFEl~3kMI%ot~xx&NDNA<}JK1Wl9KWhWy;m+`Fqp)%@q2 z_*s$s>R!K=mXgW01+Q)O zPM>;yY5%4-*SGWQ#qT|&V-yt<(sJ0n@6m^ei@h$_eY|Ng$Ex<&1M5RFGH(p)@0o*o z0LEGhMn+N-C+5F*wYH9qh=@>7SD&8geEN6Jo#kHE7O>9Hs#{{uL{G>k27OrOaNKg` z9DVh^<7;ll8-Fj%d84cov4v&XvSlkCKWUkCDQL-(Wk%MIm>T-Go7+i$*GxM{Y z)!#S{KK@bRnO+c9W>)rpBm3_E54Ih<_y6B_J2xKrb=S7;G%z zp8VnYy;=$DXOp=uzgh$yOKWxOl}h@yW@g0JG+p8U3QA1;N=jNj@87>~-+$TJ@vCj3j!FEis0NK$K8#vF?^Nd6wQDy%xLx_;#=f~?Mav?u?({3kQ2+gt zh3(hst<53}es9{c!QlAz&-)s8&(6yBt}&{b5;eE>*Q4jpyG>Vz9b7u^&spxG;?EPN zP1D;heCEm(5#fD5WSD<{U;V*qR~Doh5t_pty}im`?cB9%$6hR3er0vEIQO%&lW+fw z3JPj^t{?xX)T`@Ecg^Rtvl~i2Dn&#_t*U)%e#m@=X|k17`9FuJTbO@;KYS)LIMrv>F4GpKU(HLmx;T(>%Vm1XoF?G`%`E95ZqL7MNzii0&XX3oykOy8tcz5bPRXpPycSsS-( zJn{iF1fP9phoD*R55dK5eNRjl9k_K%3bbtHS+8_R)z4M0-}HoPhbJ7{vXU!aXQ?Sa z-?3j?vkl%|-Z<&uqpOb1Y;retJY?^YvYd1?H9*kVIJl+cb=%t6^-iz9N4->NpA{JU zx@C`kyY24pE3R0U#!f4pJ9lH**Q_ruuWml1|BqLyBH`#JRS7efvc_cR=YjWSqw8+9 zbP6ByURJDe`0>XJ3u~?a?D?twz}pHee>qx4T-|mQe`I= zG=BK{_2Hc5YL1OYZ{PotuU}JO?h$)cxAv~}t}CltxpVIR5w2=$IdJ5N%gc>?eBZ!M z*i|v{)ZFx`OFKa|-mT4n@}L^8tv6g{%CDPE5^EnlO0wzcae1@Y!lwG4Oy$m<3=GlM z);q4O?LKy|_o9jcM_Aa@->zOdV#;=Qj28_JJ-mbztktDkTU|G7+t!qv>t0b=xhQk8 zT2Xn_>b$P5t`83$Iv=s^a{l!B`HAyqn>#x>*W~5~Z1PrKE_=v#W0Vv&Uw}tQm*y-II%p zo0lOZ!s36PZR&6SuqF=`r%#*HE580R?P_V=uxVS{^yTWy`@R|-`&47Ht@?_9*P0uQQZkDppCB;=NH}2n=1g((vi4eyM+^nrnJTIZ zK_TU_)gik@5aI_8#g++KjcBs6iBQKoaVRc{0tXyOAIO9tU2qV?{IF6C93dbXka;28 zR|MT)908|Qtgkqf5k_5QD#d4Q!m9T?0!|!;prw>cmoA-T(0{ynrKYV>M`G~udtFD9 zK2+G`rmsD<;L|0&msV$sP^>N zhVCsPK2xi-D}ISYZ_jlv@zIHijs19YdGZAti-_<@Q>&1;U4@UXXy)Ahw_4?n@)GN1 zKEHzcEkSX&N^X{vCpdIe?d|2c#q}MJ9QK$pWr~A>K*GsQq8@eMeC|gYdxXS+{I}8z z8VpyxeBLN8S-RA?P*qiRNA2@<^NLb#tk?qzlAx*3kXt2c7ynNxT&?C;lnVb;aZt#v z68gpF47Tj({rmEuRjhNCE>*p?C2#F=8A&rOeQ?;SZi%o{Y!OI0aBiM`|K#O<-iO|o zzi3cwW`Akue(e0ELrkEC*15a81*N6A!^OjEj9w*QS^0R)`!$j(TKex^)Ty=zIPu6s zqJT|DTU(lw(_iHwgMGd2vt_SV1Rs|yPOo43K1YIAOFs{$+P7B)0HTD01kKlZu_^k;_j~o;-Q7XvGeJ zuxVi{VpoevRhTvGo;~~6sclAILi4pJO`Y3&9qfHcEJUG95W)>y(xz=Huh@;LQ^jd;9n+YlGc0Z<*(}baeF{+nj!WLi_~% zpFOp;wWYgWFWz?Ad;0wLeWH*h|L5cPIK;)t`S|)gc<`Wsjo0SFjzHz!yW1mg-t6f2 zpAd7rC7(%JI{V7%aQ?V?^HzkeUgowgc$wCfVkZv8W8f^hgiE;7g=238XT7X7U!%i< z4?DKyMkT*^aPY&&k8BJxW);=j#Oy4SRrjAaspa?Ax6Ng_w;fc39{y6Ap$Q0#aSv3#Y3bud%4nm}Q!~DopN_b>%CQ zbuoL@IPH6SQvTKbIl`%;rh0P8>sw2Oca^;idiZm`n)>7Q`}-b#nyM`zCZ=Vxu5YvP zuJYGyc6+N2Uc1)zyWWBMOJIKVwwy-AW;QKfWwGwUx4(F0em|FYaX+qMbMDF&k+-+E z9-VNo`N7kdD~sYzy;Ee^QKu|Z{q0?F1mD`|t%r6LCO>@j=+Kep&z>dzKiCXf(AU+~ z^<-J@MH`97$NC!E-H*<_)D{xA%gSE-*1mXOUmunKez=#JuehryCM(-~*uDSJwYSy+ z-AB3lKY#t|_hJtY8`xOoc=LCLL$v?eqUMcZ3R`+ z-kinTIuFQ(vyWw`FwnOT0VYAFaBWr;r65_ z9fDrgTu<&gBQ342T047tzOvFM#c4V*9Ssci3=T<2LSgHoTE+F_HGQkU->Y?Tb4|Q= zXJ^LEMLRDg^RC=eQdqZcOX>b;8-M+uxMKSHn4@jJ_L_ea85oR=j6Qz8mfO+Map23! z;83ZPT6mVsmjrnlLj(T8|2gbV9EwuYr>GqGBDvY3RBcN6j}w7wem``Nh>8k%^=tpT z8w-onZ_GA#(uv(SsaSnR$*s`r>kq%o+&t%UOKa@0?c8FaH#pU5=ZfB6dkD0u?A&6z zr_Y~1zTMhwQQkCl`s~@=qT1n!@BcAJosjgt|21r4`1<(dbLO8dN_TnOu74n4_HRq% z(~{ZSbJlJsUT_9%&qgLm$(f*%FTU1x`Jr=-My;)`Kk~jx+0_3GdTOJ!=UPttixK0a}dTZTWfM(>t7DC`-mopMlcbk&25Q22LC+ zlR%;N_E77Ivu9Huy?v8&ac8jlkKaEJZY;~~IFhtv`Eq3=EiQ5WzuiquObq$f9X`Ik zPv*{={9=YgOKWV}qd$LY9zJ{3^=ML(P5nP6r-g5(?73g|?#SNX-)CAxM@yHyzat*y=T=Dxr7&nxA7LzisX zA_5v0dp$)&?cUwHvb9xTThg1^R=kan25pG*^gY`9`r!@{v12}$t?Cs;&NerHv^y@? zEv_GTXz>mUhWzDEzwx|me0H|^;gc5~P3HL@H1zn6_sP3wWzACYjf=Ab-RAeBh2`Xw z@ZjKJ(4m{U(c4;*-`>*D(mM3`N5!AwM=bMf>lHn2u`kYjc%EX=!QD`k4a<7%Xnw22CLA$M1Ez@$|IOWoLPt8t?`c|MziT>jPtA zdXAo+cDf`5-}>-B9TR5H?p8fLJ^ApjuXC>R8ADRSj*nd}UTXh^oj44wx~J(JoxA({ zj2-)GtCFvr=ub#iu3x)+&YYM(yNcPJPOq&DjSEOn2wNMY_dWl(|C|Hc-tIs3H+uCn zT~K$lpu9Nw(dJE?A137MbGo}9Pxy8xe@3#^mi+dU@qR6H=gz%T-0hvH#fF+ zck=UmIsR&@_S0pI_xiMESX3H)E@EY1{`LLv2|;BMKUEQlFjs=k;{u z%orJq5{cdaZzywqe|?$#@%|q@#lK{Cmpue6Y__nskN25v6#1-JGkDv#OXy3PO?R4j z-v7GI-J{%R=9i^s3Ll#1C*I`RX4m`wk@1(eccpFQ{NL>i4!*qM&+hj#`dIn-`Ezb= zX$+1#wPV+ggpZ3_3s#1QKg$Olw7so}RY`eq>c6mQWfu?qELy%=R7@=K?f3hS-G2D0 z)g9NrEvl!Jr}1=Y_xZ&}TGjitvi+k?_>ZlTG#1GdDt!9N6ttzoxaiEOQ$oAT--TGY z2E|E#yx75SSn@$(#_ZGgQx5=du=NSm4HMeP)gsZ!;U;g^0LarEi;9@1L7|`)1HS zVIBs(mbjEdy0h4m&%IeMQr5)CF#r7V2ae1Jg@-EC?2L@0nwI;EF0(HCBR|t`gTCE= zp85U1LtdU<)ZWe>wmxRzR6m7WK@Jv+U)K%Q*7?5v{^9PYR4(g-4cleoKx?3HU0wa~ z!H0L7g}RUasQg`a?(*6lMoX%+-~OxrZ}_lJ)_Otwd^;}dScU`81+y<*1UOhKesm?<- zxZ+^tx-GGBzkb<#S(|*EFT&z~^iu1kphb|Em-{6?y0=I0(Yd?3xh~uI`c2DJ-Z#fU zPT9R?#Rg%Xis*LG3i4w;a%Yc#?!8{BIq6u`c}~R^33E^fV}jO`6Bifz>ya*%@^&cQ22}pMOeNr}-@XY*ckcT4s)%}N!Vm8@XGw6Xl(4A7Wn_Xmc&;z|I2E=pwrUSKub>bcZnJFQQyrSUwxQidruhwJjjO@&CTPRmKl*m%m@I zVS~rPi>nN$RITpl_O?~4dG$qd$IWy_z83(!KbrU1!a`0V zp&jd)m-H;W6771+yEo$GsdLA|i=REX^;J4*cGUAHD{6LySE>bBr>>e3wkz3#`L}xJ z?mb^VR=$`#eY$w@`@%&1tC=A&Av)hJUYa>wl{YwbW#wa?>-Yp02O$lYZvw908|} z!qpWU8J##3-4uV`G*)}_^ySJ2C%P(4zXVz5=8DDz>=5ccs-dabI#Y7{@o9^`&k;W# zZ}9Nf*SlBGO%8X~pJ`;S;>lDdI|q58V&47A?JvG{PuEYmrWDi;ayw`SM|p|$xjDA# zo!-8_hfjsB4&1zq`PP=aUIu&nipt7EXV3a7FYa5jCS>-$sClhd4n5el3>p=FetuK! z+85=`S8)^)-X|i~_DJaG+%!=`!$j+wr{9~c?l8O#?xXdBhEbMuc}$$u^=QelDf^Ai z^}X6(6RB}Cvq$^j<>fo7zstS5x4U0lKVHGsmU-#Yr4K&;1dTyXo-F)o_wL2}s%u$T z*$U$R*sAx(N*_CT(DAK})zz^5HKmTb?5?a0ULN$kxUi7%!#ZW1sgFyxbV+#a4Nd#= ze7@q-Qm%KNZzE>RoY{Ig{T%4*Y6gbl;$oA$I~y#f(N|9+g2P|{}!}lO%k-&N51;o zgI8N$7yZ{0>YOlrdjFn1H7aUqo{x6wtOI06GNc64}#J!JlFVnvI9(<-xHVh$XNp)C<-*7YlEh1Tzt zsqL9nAt2az)O)&i&B{=>Glgfxi;KBM#HV{4QdL#;>I+-9BVwb#!&LOZOQa z3(E(szP!-zPr_t@eT$PKOVe@>A&v<%rnJns5uu`DGx6n&-p3MYL=jR*WA2`U>zczfiUQkew>ci*f;}0yZtKIrZ z*W=ke#^wBdeSIg+oS6jLGVvg=^DN_%>%yxdJHK8%WqhrQd(T^*FPKZ#CQkkP?*G&Y zA6V4=<{g@Fu(@QGyYnKjt4;g*`lNP$2MwqtC&g&D2{~~Dp16Crm(xBpamf@DU)>pJ zTyx$itEj6R7j}#5Jh;Ni#&GVOU&gg9lFO5AZER)~q@<{9_whP;{=9q4o#d^TUUhxx zo8doCCG1sAVgJql>$|=8dd*$mv+-KA>zg+@7k7vI=iJ*8xNP#*CoeBootpaaQd#B2 z=L=`-w!ZDg!P0hjr$2{cO9mID+eR%<%OH0so<4uPowNP^u9eH@fQDpuxq`;vf?Qcx zHz}`Jv}n=9i4#|Ts+_mKqOqg>RqvD__p≦j;4L;DRMd*Vo;DP!h9Q%{L+KTV80x zojW!%)@3nEvpKoBH@-i>IQ3G-B#(1U*FTx$-kQSce*DNPTdg;LS_9N%1Rk(kTSsp_ zr+Rk6>$MR&ZeCtm@9ysJ-`_8LeB$Ez)l=@>-fftZlQUz-oH;VSX%`n{?B3J!@$-YK z{jZvRqy=RchaFD{D>LJhwd->4e-scEwQA)X&>(J+T7w_T@pomYiG^r(O37M+T!c$d+}xS|CL(~HqF$G-v4!@^6GUU z4?X-G@V)LTyLq_ykKex)t*qRHKnt&YW?48c{VZc$Cd1Az&-kHiav$gX`aaMxc_!;y z1e`k5Lht4$w+ICBetmy`IwxrD==S$_p3eDqX@4RI_wF?>b2Ohmd2^)Y{k`4oO-y-n z6C)#UMr^O!>vdh)D#hT;*|VyN6Fpj5yQe>J+wm#W@z5csKU!eQ4x4Xl!zjLK=TGEpj{u}BJv!ywMYV=TMNXEDXTFbJs71U?P zvX(^~WsS{7LD(9bY3nY1eRZYq*z#n%#78Zytr7b^S?fe?5_xEz?-@7ERY?$(u()sz- z+A+#{#>U+CId@JRVKvXzGB#bWb+N2c^6>M(nZHBjqxN6t@@;OKvBUKBzT>SI0$4Tg zd3p&YJe;Jep;dK#nn~^@7Q1`*yn-aRReyh<{PWcN2@^iBL`L4^;N9DzdV0FCJsW85 zqYgY-v`PSJp~j_&At50xSF^7_Jae=7#Z6_Fx_$d5t#rxEeA&_2d$e=1x}dDEwx$2; zu(buBzva$-a`Ws}*0ascpoNc~cb3*4{_yFlc8|`^#I!WF2f4>Xf+jI6oUZrq z%S_`*=VZ#w!&U67&;6WLTlL*(l7qs_8(PKB-`U>T`Md03sonhbAD&h{`|{Fgw?U2=6L2&=8(u$rXi@n}q^tYp^!<9VRtuAl^GW@;mnzyT zYmor%^12DVwJs3gU#w)9alnCv?T5Eju#1vl+`g*T+2;A6VS^Mmd0u(7-#dn==^Zr>$O#yxj+^KVW%I>Wr4(a89I zuFr%?le*&TZy&Uj2MvTj=@bqkmQ1;f6o16Q| zlP5-tlTU%x!d!ji8g=_=>WlgAsqe#U3(Cq4O>*Tn%>U<H|S!+OxE%Q!{J6zPfg_sq*uacP z-Mbs}-b(#g{qvJ;hC_Xg@%QYsT+>{GD^;&y%T3~9ch;Xjd)7HBYS$e<@!;TKpC6Bk z!NZ7^#x967)7-z^d|&)#sdZmpt(W@x)ZQ)2OY0uT{R792v7I}2j)RNGWwM&1R6N68 zBO~L@1+UNLa!g|JIDf*yv5qn4ZO+3tZ+Z?KU@+n2X=-gPb5{>dIejhHqVm-il|3aN zm9}Kat@--8%S8!vnn?Ki_{AO(9NO906_r(9*Umq3BDn0M>i)wE0k7A3s2rNC-U&Ld zaCP|l2{UJMF5Do%XZkkq^g=Z$)0~d9v$IahK8%pf+`WhA=jRJY{;mS;C93%FLGh8? zQN^D>i=RAycJRm%mTTM0Rzxr718G@s;DA>2@%W`n6s)zm<-Wc?9Mmg#95e+B?xb@l zX3hBimdU2#M}W}14gac5vaSR`CZ0JITS8i{f#%JFa-TkXrg=v)Xy&6wNj6>G$&X@U zLgJ%A-89g`g6J)75}?_8)kldc@9ynx2Q3w>sbLCR7tyxN(NSxz@}FnA9NgThiTe8f z5z*1vR;!^?xx9-7K@e}%BfTP;F*xTEr z&MHG@eqF4=y&I3Mmo_@HtNqc?Ui^Y#CI-~WB)4&mi~$yaA>_3-u%pYiVL>TuAU$Q-NMwoZAo z6oahm>y}R41L}&j2soLz>#$WEVwyPP{PUOA`k=Pcxs=q@+6Z*x25l|jo{A~SsP_)I>#951+xwpr4RR>Oz-mb zfds(U$+Ks7+yA@MJ$bp`>M85|-^cw(xuOvf9i6F}4h>yjZC%mE?`r#9a*~o3z25_} zyh>Ppego*3u&N)tPo6$KZF}tGNkQ3LTb(^T%6IJE`O=~tqIbe6Elpk4^$P1 z`*p53#POgmlGB!DOO~+I7#nxuCEV&w zZ`A#7Z{7R-)w$MyMa~;|ooth19!_Zv(<+ZYYst#M@ZrHRk894H%nS?+4-WQT-285D z{BKzX1_p+Lu)Y0j+6CAc7#I#TzkV6{-7v{kh=GBj!QJ%Oi5JSR|H^|@JrI0*`?{6q z9f$#eZ*O1E<}elnYf66g*r0`1I1!}GX4zkX8CN|(Ou1XLubz09U5{r_ikx$}&#V8_0@Dxtjf-*>Tp^-d9wGQe*BzIw0l!AbX9 z3|>zJ>A17{(!KoX_w5_5t#M}p1zUO9eX*aNof}fb4};_%%=?ph`QvxRHUGYE0_(rC z>DTP7C!X*tuGu>8-tR~`kdqmfU#s@d-v2&wKX0OEkjzJ*xQ0>9z*_la#^uM2F`>0Sx;ZQeBr<$83n;kpx=U~~_g#y=(7ijZ3x z*f!{l4fN<=(nMWoEyGJt%E9thY#0Eqeb#;98ac+P5$GLFP4_w|M68 zZ{cF+h)HL<5B~(|oO547`SYflm*q8@Exm?8S${8qG&4NN_tK4*JMk-s!+TO{WYBC; zPmtnsi?>ZnwS4FBZ=pWON6SujsepvluOB~Q;;a5MR-H4kQvzhsfy`cEw+&BP6xV#6 z7j%akWaI-Aub;QJyX-67Brr|IJMt1#v^y$0^3?Txs-M3l;%`LfOYU)Px!7#KeI`dpq;+!Hz1rbTuA;_TCz?$<%KSJZsASw8oJ-i?KuTQ;af zdYue9wX@C^B*UMksk(ID`_mHV#STqMiJZ3CP7V}v#{;r#f44o1bdK00oxVB=9C`Z# zv(MHv&ilNz_RW`j#(Vd~d@9(pio5+V3{|ZQ@h2KRi;@x#`=sch4S+1^ghN_HMcMspw(p3FmOm#A^M^Q=(p* z&IcKFfb~k0ewD<3+i>1QPouNNUYghIK;g}h9^`e>~E$9867)uUfzCF)Y^4_WkAO5OX!(c8JYJ==i1qp4Jq5Tt*XwikKca; zlr1agV_@@uo6PoF-!KjEZo%Z9y~vo=jpO^*4k3Xn081uv** zSoigw@%iFgvTGdoJ%8tPBkr~Bd42t#A0KP_-(J2(<}xS`T67z_dFe(@D|)-U=H%VB z4SVaascyI5RJ-fYpn*--vs!{CU%oE0f-)nJYe90V)U&oRdg4XS^n7 z-SF17gyZ(>+LV{O6}~-wsX6 zpH-WER?UBQZdi68NMS|J-u^3Lm!rJ1-`+aEvnyZp5Z~MX%k?8S-Obr_H)r$ByyO6| zGLht-Ew_TAeg7`|`1-CPF&t>gBSGM_N)m}qgkT37dF`RU*e0Kig?_2Kezj}B5d4WT9 z$vqpTC3AF_PEomeSG2k}dG=Se?CnQEiHZAl?UJwci?5gO{a(tW_(u4i+~nx>;gRdh z5_7gjrS6SO-y6l90;&h6f3>^h?q5ImgVf&r|88!%zOiM4{)^fr>E@ diff --git a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml index 7fa586c626be..f19c3c762d9d 100644 --- a/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml +++ b/libs/WindowManager/Shell/res/layout/bubble_bar_stack_education.xml @@ -16,40 +16,42 @@ --> diff --git a/libs/WindowManager/Shell/res/values/dimen.xml b/libs/WindowManager/Shell/res/values/dimen.xml index df1e2248872b..d02c77e831aa 100644 --- a/libs/WindowManager/Shell/res/values/dimen.xml +++ b/libs/WindowManager/Shell/res/values/dimen.xml @@ -240,8 +240,14 @@ 300dp 32dp - - 16dp + + 24dp + + 32dp + + 16dp + + 32dp 12dp @@ -250,6 +256,8 @@ 2dp 24dp + + 2dp 36dp diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt index fd110a276826..9b3054e9ee13 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/bubbles/BubblePopupViewExt.kt @@ -27,7 +27,7 @@ fun BubblePopupView.setup() { val attrs = context.obtainStyledAttributes( intArrayOf( - com.android.internal.R.attr.materialColorSurface, + com.android.internal.R.attr.materialColorSurfaceContainer, android.R.attr.dialogCornerRadius ) ) -- GitLab From dde12eb09fb0375f549c0ac43f40ff9b562dc95a Mon Sep 17 00:00:00 2001 From: Peter Kalauskas Date: Wed, 23 Oct 2024 15:03:13 -0700 Subject: [PATCH 344/459] Replace launch and async with traced variants Test: Capture trace, look for coroutine names Flag: com.android.systemui.coroutine_tracing Bug: 289353932 Change-Id: Ia42e60640d27b6ce19d85a640b0a69a251e66217 --- .../src/com/android/keyguard/ClockEventController.kt | 2 +- .../repository/AccessibilityQsShortcutsRepository.kt | 6 +++--- .../accessibility/extradim/ExtraDimDialogDelegate.kt | 2 +- .../systemui/ambient/touch/BouncerSwipeTouchHandler.kt | 2 +- .../systemui/ambient/touch/ShadeTouchHandler.kt | 2 +- .../data/repository/AuthenticationRepository.kt | 2 +- .../domain/interactor/AuthenticationInteractor.kt | 4 ++-- .../back/domain/interactor/BackActionInteractor.kt | 2 +- .../biometrics/UdfpsAnimationViewController.kt | 2 +- .../systemui/biometrics/UdfpsControllerOverlay.kt | 2 +- .../domain/interactor/LogContextInteractor.kt | 2 +- .../biometrics/ui/binder/BiometricViewBinder.kt | 2 +- .../biometrics/ui/binder/BiometricViewSizeBinder.kt | 2 +- .../ui/binder/CredentialPasswordViewBinder.kt | 2 +- .../ui/binder/CredentialPatternViewBinder.kt | 2 +- .../biometrics/ui/binder/CredentialViewBinder.kt | 2 +- .../biometrics/ui/binder/PromptIconViewBinder.kt | 2 +- .../biometrics/ui/binder/SideFpsOverlayViewBinder.kt | 2 +- .../biometrics/ui/binder/UdfpsTouchOverlayBinder.kt | 2 +- .../biometrics/ui/viewmodel/PromptViewModel.kt | 2 +- .../bluetooth/qsdialog/AudioSharingDialogDelegate.kt | 2 +- .../bluetooth/qsdialog/AudioSharingDialogViewModel.kt | 2 +- .../bluetooth/qsdialog/BluetoothTileDialogViewModel.kt | 4 ++-- .../bouncer/domain/interactor/BouncerInteractor.kt | 2 +- .../domain/interactor/BouncerMessageAuditLogger.kt | 2 +- .../domain/interactor/PrimaryBouncerInteractor.kt | 2 +- .../bouncer/domain/interactor/SimBouncerInteractor.kt | 6 +++--- .../systemui/bouncer/log/BouncerLoggerStartable.kt | 2 +- .../bouncer/ui/binder/BouncerMessageViewBinder.kt | 2 +- .../bouncer/ui/binder/ComposeBouncerViewBinder.kt | 2 +- .../bouncer/ui/binder/KeyguardBouncerViewBinder.kt | 2 +- .../bouncer/ui/viewmodel/BouncerContainerViewModel.kt | 2 +- .../bouncer/ui/viewmodel/BouncerMessageViewModel.kt | 2 +- .../ui/viewmodel/BouncerSceneContentViewModel.kt | 2 +- .../bouncer/ui/viewmodel/PasswordBouncerViewModel.kt | 2 +- .../bouncer/ui/viewmodel/PatternBouncerViewModel.kt | 2 +- .../bouncer/ui/viewmodel/PinBouncerViewModel.kt | 2 +- .../data/repository/ScreenBrightnessRepository.kt | 4 ++-- .../systemui/brightness/ui/compose/BrightnessSlider.kt | 2 +- .../systemui/clipboardoverlay/ClipboardImageLoader.kt | 2 +- .../communal/CommunalOngoingContentStartable.kt | 2 +- .../systemui/communal/CommunalSceneStartable.kt | 2 +- .../systemui/communal/data/db/CommunalWidgetDao.kt | 2 +- .../data/repository/CommunalSceneRepository.kt | 2 +- .../data/repository/CommunalWidgetRepository.kt | 2 +- .../interactor/CommunalSceneTransitionInteractor.kt | 2 +- .../domain/interactor/CommunalTutorialInteractor.kt | 2 +- .../domain/interactor/WidgetTrampolineInteractor.kt | 2 +- .../ui/binder/CommunalTutorialIndicatorViewBinder.kt | 2 +- .../communal/ui/viewmodel/CommunalViewModel.kt | 2 +- .../systemui/communal/widgets/CommunalAppWidgetHost.kt | 2 +- .../systemui/communal/widgets/CommunalWidgetHost.kt | 2 +- .../systemui/communal/widgets/EditWidgetsActivity.kt | 2 +- .../data/repository/DeviceEntryFaceAuthRepository.kt | 2 +- .../domain/interactor/DeviceEntryInteractor.kt | 2 +- .../interactor/FaceHelpMessageDeferralInteractor.kt | 2 +- .../interactor/OccludingAppDeviceEntryInteractor.kt | 2 +- .../deviceentry/ui/binder/LiftToRunFaceAuthBinder.kt | 2 +- .../display/data/repository/DisplayScopeRepository.kt | 2 +- .../repository/DisplayWindowPropertiesRepository.kt | 6 ++---- .../display/data/repository/PerDisplayStore.kt | 4 ++-- .../display/ui/viewmodel/ConnectingDisplayViewModel.kt | 6 +++--- .../dreams/DreamOverlayAnimationsController.kt | 2 +- .../dreams/homecontrols/HomeControlsDreamService.kt | 2 +- .../dreams/homecontrols/HomeControlsDreamStartable.kt | 2 +- .../domain/interactor/ContextualEducationInteractor.kt | 2 +- .../domain/interactor/KeyboardTouchpadEduInteractor.kt | 2 +- .../education/ui/view/ContextualEduUiCoordinator.kt | 2 +- .../com/android/systemui/flags/ConditionalRestarter.kt | 4 ++-- .../systemui/haptics/slider/SeekbarHapticPlugin.kt | 2 +- .../systemui/haptics/slider/SliderStateTracker.kt | 2 +- .../android/systemui/haptics/slider/SliderTracker.kt | 2 +- .../tutorial/ui/TutorialNotificationCoordinator.kt | 2 +- .../ui/view/KeyboardTouchpadTutorialActivity.kt | 2 +- .../ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt | 2 +- .../backlight/ui/KeyboardBacklightDialogCoordinator.kt | 2 +- .../binder/KeyboardDockingIndicationViewBinder.kt | 2 +- .../ui/viewmodel/KeyboardDockingIndicationViewModel.kt | 2 +- .../data/repository/ShortcutHelperStateRepository.kt | 2 +- .../domain/interactor/ShortcutHelperStateInteractor.kt | 2 +- .../keyboard/shortcut/ui/composable/Surfaces.kt | 2 +- .../stickykeys/ui/StickyKeysIndicatorCoordinator.kt | 2 +- .../com/android/systemui/keyguard/ResourceTrimmer.kt | 4 ++-- .../KeyguardQuickAffordanceLegacySettingSyncer.kt | 2 +- ...eyguardQuickAffordanceRemoteUserSelectionManager.kt | 2 +- .../data/quickaffordance/MuteQuickAffordanceConfig.kt | 4 ++-- .../MuteQuickAffordanceCoreStartable.kt | 4 ++-- .../keyguard/data/repository/KeyguardRepository.kt | 2 +- .../FromAlternateBouncerTransitionInteractor.kt | 2 +- .../interactor/FromDozingTransitionInteractor.kt | 2 +- .../interactor/FromDreamingTransitionInteractor.kt | 2 +- .../FromGlanceableHubTransitionInteractor.kt | 2 +- .../domain/interactor/FromGoneTransitionInteractor.kt | 2 +- .../interactor/FromLockscreenTransitionInteractor.kt | 4 ++-- .../interactor/FromOccludedTransitionInteractor.kt | 2 +- .../FromPrimaryBouncerTransitionInteractor.kt | 2 +- .../domain/interactor/KeyguardBlueprintInteractor.kt | 2 +- .../domain/interactor/KeyguardDismissInteractor.kt | 2 +- .../domain/interactor/KeyguardEnabledInteractor.kt | 2 +- .../interactor/KeyguardStateCallbackInteractor.kt | 2 +- .../interactor/KeyguardTouchHandlingInteractor.kt | 2 +- .../domain/interactor/KeyguardTransitionAuditLogger.kt | 2 +- .../interactor/KeyguardTransitionBootInteractor.kt | 2 +- .../domain/interactor/KeyguardTransitionInteractor.kt | 2 +- .../interactor/KeyguardWakeDirectlyToGoneInteractor.kt | 2 +- .../domain/interactor/LightRevealScrimInteractor.kt | 2 +- .../interactor/StatusBarDisableFlagsInteractor.kt | 2 +- .../keyguard/domain/interactor/TransitionInteractor.kt | 2 +- .../keyguard/domain/interactor/TrustInteractor.kt | 2 +- .../LockscreenSceneTransitionInteractor.kt | 2 +- .../ui/binder/AccessibilityActionsViewBinder.kt | 2 +- .../keyguard/ui/binder/DeviceEntryIconViewBinder.kt | 2 +- .../ui/binder/InWindowLauncherAnimationViewBinder.kt | 2 +- .../keyguard/ui/binder/KeyguardClockViewBinder.kt | 2 +- .../keyguard/ui/binder/KeyguardDismissActionBinder.kt | 2 +- .../keyguard/ui/binder/KeyguardDismissBinder.kt | 2 +- .../ui/binder/KeyguardQuickAffordanceViewBinder.kt | 2 +- .../keyguard/ui/binder/KeyguardRootViewBinder.kt | 2 +- .../keyguard/ui/binder/LightRevealScrimViewBinder.kt | 2 +- .../keyguard/ui/binder/SideFpsProgressBarViewBinder.kt | 2 +- .../keyguard/ui/preview/KeyguardPreviewRenderer.kt | 2 +- .../ui/preview/KeyguardRemotePreviewManager.kt | 4 ++-- .../ui/viewmodel/LockscreenContentViewModel.kt | 2 +- .../ui/viewmodel/SideFpsProgressBarViewModel.kt | 2 +- .../src/com/android/systemui/lifecycle/Hydrator.kt | 2 +- .../android/systemui/lifecycle/RepeatWhenAttached.kt | 4 ++-- .../com/android/systemui/lifecycle/SysUiViewModel.kt | 2 +- .../systemui/log/echo/LogcatEchoTrackerDebug.kt | 8 ++++---- .../domain/pipeline/LegacyMediaDataManagerImpl.kt | 2 +- .../media/controls/domain/pipeline/MediaDataLoader.kt | 2 +- .../controls/domain/pipeline/MediaDataProcessor.kt | 2 +- .../media/controls/ui/binder/MediaControlViewBinder.kt | 2 +- .../ui/binder/MediaRecommendationsViewBinder.kt | 2 +- .../controls/ui/controller/MediaCarouselController.kt | 2 +- .../controls/ui/controller/MediaHierarchyManager.kt | 2 +- .../MediaProjectionAppSelectorController.kt | 4 ++-- .../appselector/view/RecentTaskViewHolder.kt | 2 +- .../ui/TaskSwitcherNotificationCoordinator.kt | 2 +- .../navigationbar/gestural/domain/GestureInteractor.kt | 2 +- .../NotificationsShadeOverlayContentViewModel.kt | 2 +- .../com/android/systemui/people/PeopleSpaceActivity.kt | 2 +- .../src/com/android/systemui/qs/QSHostAdapter.kt | 2 +- .../systemui/qs/composefragment/QSFragmentCompose.kt | 2 +- .../viewmodel/QSFragmentComposeViewModel.kt | 2 +- .../qs/footer/ui/viewmodel/FooterActionsViewModel.kt | 2 +- .../android/systemui/qs/panels/ui/compose/PagerDots.kt | 2 +- .../qs/panels/ui/compose/infinitegrid/EditTile.kt | 2 +- .../systemui/qs/panels/ui/compose/infinitegrid/Tile.kt | 2 +- .../pipeline/data/repository/UserAutoAddRepository.kt | 4 ++-- .../pipeline/data/repository/UserTileSpecRepository.kt | 4 ++-- .../domain/interactor/AccessibilityTilesInteractor.kt | 4 ++-- .../qs/pipeline/domain/interactor/AutoAddInteractor.kt | 2 +- .../domain/interactor/CurrentTilesInteractor.kt | 6 +++--- .../interactor/RestoreReconciliationInteractor.kt | 4 ++-- .../src/com/android/systemui/qs/tiles/ModesTile.kt | 2 +- .../com/android/systemui/qs/tiles/TileJavaAdapter.kt | 2 +- .../qs/tiles/base/viewmodel/QSTileViewModelImpl.kt | 2 +- .../repository/CustomTilePackageUpdatesRepository.kt | 2 +- .../domain/interactor/CustomTileDataInteractor.kt | 2 +- .../custom/domain/interactor/CustomTileInteractor.kt | 2 +- .../domain/interactor/CustomTileServiceInteractor.kt | 2 +- .../interactor/LocationTileUserActionInteractor.kt | 2 +- .../tiles/impl/saver/domain/DataSaverDialogDelegate.kt | 2 +- .../qs/tiles/viewmodel/QSTileViewModelAdapter.kt | 2 +- .../android/systemui/qs/ui/adapter/QSSceneAdapter.kt | 2 +- .../ui/viewmodel/QuickSettingsSceneContentViewModel.kt | 2 +- .../QuickSettingsShadeOverlayContentViewModel.kt | 2 +- .../interactor/WindowRootViewVisibilityInteractor.kt | 2 +- .../domain/startable/KeyguardStateCallbackStartable.kt | 4 ++-- .../scene/domain/startable/SceneContainerStartable.kt | 2 +- .../systemui/scene/domain/startable/ScrimStartable.kt | 2 +- .../scene/domain/startable/StatusBarStartable.kt | 4 ++-- .../scene/ui/viewmodel/SceneContainerViewModel.kt | 2 +- .../systemui/screenshot/AnnouncementResolver.kt | 2 +- .../systemui/screenshot/MessageContainerController.kt | 2 +- .../systemui/screenshot/ScreenshotSoundController.kt | 2 +- .../systemui/screenshot/TakeScreenshotExecutor.kt | 2 +- .../screenshot/ui/binder/ScreenshotShelfViewBinder.kt | 2 +- .../security/data/repository/SecurityRepository.kt | 2 +- .../com/android/systemui/settings/UserTrackerImpl.kt | 10 +++++----- .../systemui/shade/GlanceableHubContainerController.kt | 2 +- .../shade/NotificationsQSContainerController.kt | 2 +- .../android/systemui/shade/ShadeControllerSceneImpl.kt | 2 +- .../domain/interactor/ShadeLockscreenInteractorImpl.kt | 2 +- .../systemui/shade/domain/startable/ShadeStartable.kt | 2 +- .../shade/ui/viewmodel/ShadeHeaderViewModel.kt | 2 +- .../com/android/systemui/slice/SliceViewManagerExt.kt | 2 +- .../smartspace/ui/binder/SmartspaceViewBinder.kt | 2 +- .../domain/interactor/MediaProjectionChipInteractor.kt | 2 +- .../domain/interactor/ScreenRecordChipInteractor.kt | 2 +- .../chips/ui/viewmodel/ChipTransitionHelper.kt | 2 +- .../statusbar/core/MultiDisplayStatusBarStarter.kt | 2 +- .../systemui/statusbar/core/StatusBarOrchestrator.kt | 2 +- .../statusbar/events/PrivacyDotViewController.kt | 2 +- .../events/SystemStatusAnimationSchedulerImpl.kt | 2 +- .../notification/NotificationWakeUpCoordinator.kt | 2 +- .../coordinator/LockScreenMinimalismCoordinator.kt | 2 +- .../coordinator/OriginalUnseenKeyguardCoordinator.kt | 2 +- .../coordinator/SensitiveContentCoordinator.kt | 2 +- .../data/NotificationSettingsRepositoryModule.kt | 2 +- .../emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt | 2 +- .../footer/ui/viewbinder/FooterViewBinder.kt | 2 +- .../statusbar/notification/icon/IconManager.kt | 2 +- ...tificationIconContainerAlwaysOnDisplayViewBinder.kt | 2 +- .../NotificationIconContainerStatusBarViewBinder.kt | 2 +- .../viewbinder/NotificationIconContainerViewBinder.kt | 2 +- .../notification/row/BigPictureIconManager.kt | 2 +- .../ui/viewbinder/ActivatableNotificationViewBinder.kt | 2 +- .../row/ui/viewbinder/NotificationViewFlipperBinder.kt | 2 +- .../shelf/ui/viewbinder/NotificationShelfViewBinder.kt | 2 +- .../stack/ui/view/NotificationStatsLoggerImpl.kt | 2 +- .../stack/ui/viewbinder/HideNotificationsBinder.kt | 2 +- .../stack/ui/viewbinder/NotificationListViewBinder.kt | 2 +- .../ui/viewbinder/SharedNotificationContainerBinder.kt | 2 +- .../ui/viewmodel/NotificationsPlaceholderViewModel.kt | 2 +- .../ui/viewbinder/HeadsUpNotificationViewBinder.kt | 2 +- .../statusbar/phone/KeyguardBypassController.kt | 2 +- .../phone/StatusBarHideIconsForBouncerManager.kt | 2 +- .../statusbar/phone/StatusOverlayHoverListener.kt | 2 +- .../statusbar/phone/SystemUIBottomSheetDialog.kt | 2 +- .../phone/ongoingcall/OngoingCallController.kt | 2 +- .../data/repository/CarrierConfigCoreStartable.kt | 2 +- .../repository/demo/DemoMobileConnectionsRepository.kt | 2 +- .../statusbar/pipeline/mobile/ui/MobileUiAdapter.kt | 2 +- .../pipeline/mobile/ui/binder/MobileIconBinder.kt | 2 +- .../pipeline/mobile/ui/binder/MobileIconsBinder.kt | 2 +- .../pipeline/mobile/ui/binder/ShadeCarrierBinder.kt | 2 +- .../mobile/ui/viewmodel/MobileIconsViewModel.kt | 2 +- .../data/demo/DemoDeviceBasedSatelliteRepository.kt | 2 +- .../data/prod/DeviceBasedSatelliteRepositoryImpl.kt | 2 +- .../ui/binder/DeviceBasedSatelliteIconBinder.kt | 2 +- .../shared/ui/binder/HomeStatusBarViewBinder.kt | 2 +- .../pipeline/shared/ui/binder/InternetTileBinder.kt | 2 +- .../pipeline/shared/ui/composable/StatusBarRoot.kt | 2 +- .../shared/ui/view/SingleBindableStatusBarIconView.kt | 2 +- .../wifi/data/repository/demo/DemoWifiRepository.kt | 2 +- .../statusbar/pipeline/wifi/ui/WifiUiAdapter.kt | 2 +- .../pipeline/wifi/ui/binder/WifiViewBinder.kt | 2 +- .../statusbar/policy/ZenModesCleanupStartable.kt | 2 +- .../statusbar/policy/bluetooth/BluetoothRepository.kt | 2 +- .../statusbar/ui/binder/KeyguardStatusBarViewBinder.kt | 2 +- .../domain/interactor/TouchpadGesturesInteractor.kt | 2 +- .../systemui/unfold/DisplaySwitchLatencyTracker.kt | 4 ++-- .../systemui/unfold/FoldLightRevealOverlayAnimation.kt | 6 +++--- .../systemui/unfold/FullscreenLightRevealAnimation.kt | 4 ++-- .../com/android/systemui/unfold/UnfoldTraceLogger.kt | 2 +- .../systemui/user/data/repository/UserRepository.kt | 2 +- .../user/data/repository/UserSwitcherRepository.kt | 2 +- .../user/domain/interactor/GuestUserInteractor.kt | 2 +- .../user/domain/interactor/RefreshUsersScheduler.kt | 8 ++++---- .../user/domain/interactor/UserSwitcherInteractor.kt | 2 +- .../user/ui/binder/StatusBarUserChipViewBinder.kt | 2 +- .../systemui/user/ui/binder/UserSwitcherViewBinder.kt | 2 +- .../user/ui/dialog/UserSwitcherDialogCoordinator.kt | 2 +- .../src/com/android/systemui/util/kotlin/Flow.kt | 4 ++-- .../com/android/systemui/util/kotlin/JavaAdapter.kt | 2 +- .../src/com/android/systemui/util/kotlin/Parallel.kt | 2 +- .../src/com/android/systemui/util/kotlin/Suspend.kt | 2 +- .../android/systemui/util/settings/SettingsProxy.kt | 2 +- .../systemui/util/settings/UserSettingsProxy.kt | 2 +- .../android/systemui/volume/VolumeControllerAdapter.kt | 2 +- .../systemui/volume/dialog/VolumeDialogPlugin.kt | 2 +- .../volume/domain/interactor/AudioSharingInteractor.kt | 2 +- .../domain/startable/AudioModeLoggerStartable.kt | 2 +- .../captioning/ui/viewmodel/CaptioningViewModel.kt | 2 +- .../domain/interactor/MediaControllerInteractor.kt | 2 +- .../spatial/ui/viewmodel/SpatialAudioViewModel.kt | 2 +- .../slider/ui/viewmodel/AudioStreamSliderViewModel.kt | 2 +- .../slider/ui/viewmodel/CastVolumeSliderViewModel.kt | 2 +- .../ui/viewmodel/AudioVolumeComponentViewModel.kt | 2 +- .../controller/WalletContextualLocationsService.kt | 4 ++-- .../WalletContextualSuggestionsController.kt | 2 +- .../wallpapers/data/repository/WallpaperRepository.kt | 2 +- 273 files changed, 316 insertions(+), 318 deletions(-) diff --git a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt index e5cf7cf0eeb8..b72f90e893d9 100644 --- a/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt +++ b/packages/SystemUI/src/com/android/keyguard/ClockEventController.kt @@ -80,7 +80,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Controller for a Clock provided by the registry and used on the keyguard. Instantiated by diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepository.kt b/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepository.kt index 63791f9228c0..2d790f533965 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepository.kt @@ -36,7 +36,7 @@ import com.android.systemui.qs.tiles.ReduceBrightColorsTile import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Deferred -import kotlinx.coroutines.async +import com.android.app.tracing.coroutines.asyncTraced as async import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.withContext @@ -127,7 +127,7 @@ constructor( private suspend fun getAccessibilityTileServices(context: Context): Set = coroutineScope { val a11yServiceTileServices: Deferred> = - async(backgroundDispatcher) { + async(context = backgroundDispatcher) { manager.installedAccessibilityServiceList .mapNotNull { val packageName = it.resolveInfo.serviceInfo.packageName @@ -143,7 +143,7 @@ constructor( } val a11yShortcutInfoTileServices: Deferred> = - async(backgroundDispatcher) { + async(context = backgroundDispatcher) { manager .getInstalledAccessibilityShortcutListAsUser(context, context.userId) .mapNotNull { diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogDelegate.kt index fcb12068207e..ed5baa308ee1 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/accessibility/extradim/ExtraDimDialogDelegate.kt @@ -31,7 +31,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Dialog for removing Extra Dim shortcuts. */ diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt index a55f9ffd1c5a..7b3d337306b4 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/BouncerSwipeTouchHandler.kt @@ -54,7 +54,7 @@ import kotlin.math.hypot import kotlin.math.max import kotlin.math.min import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Monitor for tracking touches on the DreamOverlay to bring up the bouncer. */ class BouncerSwipeTouchHandler diff --git a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt index 3cf94ba558fe..05a10092695b 100644 --- a/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt +++ b/packages/SystemUI/src/com/android/systemui/ambient/touch/ShadeTouchHandler.kt @@ -38,7 +38,7 @@ import javax.inject.Named import javax.inject.Provider import kotlin.math.abs import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * [ShadeTouchHandler] is responsible for handling swipe down gestures over dream to bring down the diff --git a/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt b/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt index 732a90d2c01d..c9c4fd594adc 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/data/repository/AuthenticationRepository.kt @@ -57,7 +57,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Defines interface for classes that can access authentication-related application state. */ diff --git a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt index 3080e1978b2a..67579fd7f696 100644 --- a/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/authentication/domain/interactor/AuthenticationInteractor.kt @@ -49,7 +49,7 @@ import kotlinx.coroutines.flow.asSharedFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Hosts application business logic related to user authentication. @@ -320,7 +320,7 @@ constructor( } private suspend fun initiateGarbageCollection(delay: Duration) { - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { delay(delay) System.gc() System.runFinalization() diff --git a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt index 23045a336a5d..232b62985ad0 100644 --- a/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/back/domain/interactor/BackActionInteractor.kt @@ -35,7 +35,7 @@ import com.android.systemui.statusbar.StatusBarState import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Handles requests to go back either from a button or gesture. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt index c3e781800f9f..21569c13fab4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsAnimationViewController.kt @@ -32,7 +32,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialogManager import com.android.systemui.util.ViewController import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import java.io.PrintWriter /** diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt index a1efc196dbee..2593cebb14d0 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsControllerOverlay.kt @@ -73,7 +73,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val TAG = "UdfpsControllerOverlay" diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt index 8c64b76af393..6c9be81ccaac 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/domain/interactor/LogContextInteractor.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.shareIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Aggregates UI/device state that is not directly related to biometrics, but is often useful for diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt index e7e8d8f80cda..2df5f16698b4 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewBinder.kt @@ -64,7 +64,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val TAG = "BiometricViewBinder" diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt index 18446f02778a..02c378417f3d 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/BiometricViewSizeBinder.kt @@ -50,7 +50,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.res.R import kotlin.math.abs import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Helper for [BiometricViewBinder] to handle resize transitions. */ object BiometricViewSizeBinder { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt index 4ed786be99c9..e7a68ac2cfb9 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPasswordViewBinder.kt @@ -21,7 +21,7 @@ import com.android.systemui.res.R import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Sub-binder for the [CredentialPasswordView]. */ object CredentialPasswordViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPatternViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPatternViewBinder.kt index eff698705042..29a189391054 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPatternViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialPatternViewBinder.kt @@ -9,7 +9,7 @@ import com.android.systemui.biometrics.ui.CredentialPatternView import com.android.systemui.biometrics.ui.CredentialView import com.android.systemui.biometrics.ui.viewmodel.CredentialViewModel import com.android.systemui.lifecycle.repeatWhenAttached -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Sub-binder for the [CredentialPatternView]. */ object CredentialPatternViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt index 49f4b05e2cd9..3ea91f05827c 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/CredentialViewBinder.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val ANIMATE_CREDENTIAL_INITIAL_DURATION_MS = 150 diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt index eab3b26e9b68..f6cf3d57a609 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/PromptIconViewBinder.kt @@ -32,7 +32,7 @@ import com.android.systemui.util.kotlin.Quad import com.android.systemui.util.kotlin.Utils.Companion.toQuint import com.android.systemui.util.kotlin.sample import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val TAG = "PromptIconViewBinder" diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt index 9578da4238ee..8fe5ded939e2 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/binder/SideFpsOverlayViewBinder.kt @@ -51,7 +51,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds the side fingerprint sensor indicator view to [SideFpsOverlayViewModel]. */ @OptIn(ExperimentalCoroutinesApi::class) 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 a105d663424c..8763e5ccabe9 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 @@ -25,7 +25,7 @@ import com.android.systemui.biometrics.ui.view.UdfpsTouchOverlay import com.android.systemui.biometrics.ui.viewmodel.UdfpsTouchOverlayViewModel import com.android.systemui.lifecycle.repeatWhenAttached import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @ExperimentalCoroutinesApi object UdfpsTouchOverlayBinder { diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt index 168ba11309cc..0ac9405d0d8c 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/ui/viewmodel/PromptViewModel.kt @@ -72,7 +72,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** ViewModel for BiometricPrompt. */ class PromptViewModel diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegate.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegate.kt index 3ac942b769f4..c3df88e72de8 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegate.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegate.kt @@ -28,7 +28,7 @@ import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class AudioSharingDialogDelegate @AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogViewModel.kt index dc970aea7c41..9779db1a11ea 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogViewModel.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch sealed class AudioSharingDialogState { data object Hide : AudioSharingDialogState() diff --git a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt index 5c35c52a4327..b255a4f55220 100644 --- a/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModel.kt @@ -56,7 +56,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** ViewModel for Bluetooth Dialog after clicking on the Bluetooth QS tile. */ @@ -94,7 +94,7 @@ constructor( cancelJob() job = - coroutineScope.launch(mainDispatcher) { + coroutineScope.launch(context = mainDispatcher) { var updateDeviceItemJob: Job? var updateDialogUiJob: Job? = null val dialogDelegate = createBluetoothTileDialog() diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt index 45e39caf6cff..92fcf39b41ad 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerInteractor.kt @@ -38,7 +38,7 @@ import com.android.systemui.scene.domain.interactor.SceneBackInteractor import com.android.systemui.scene.shared.model.Scenes import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.async +import com.android.app.tracing.coroutines.asyncTraced as async import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageAuditLogger.kt index aecfe1d2c9ad..355ce6a3798f 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/BouncerMessageAuditLogger.kt @@ -23,7 +23,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Application import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private val TAG = BouncerMessageAuditLogger::class.simpleName!! diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt index 6d6cd45eaa58..61cd7c7049f4 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/PrimaryBouncerInteractor.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Encapsulates business logic for interacting with the lock-screen primary (pin/pattern/password) diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt index ed931bd4e66a..1aaf4fb9f296 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/domain/interactor/SimBouncerInteractor.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Handles domain layer logic for locked sim cards. */ @@ -125,7 +125,7 @@ constructor( // memory. Do it asynchronously with a 5-sec delay to avoid making the keyguard // dismiss animation janky. - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { delay(5000) System.gc() System.runFinalization() @@ -151,7 +151,7 @@ constructor( PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE_UNAUDITED, UserHandle.SYSTEM ) - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { if (euiccManager != null) { euiccManager.switchToSubscription( INVALID_SUBSCRIPTION_ID, diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/log/BouncerLoggerStartable.kt b/packages/SystemUI/src/com/android/systemui/bouncer/log/BouncerLoggerStartable.kt index 87ec2549d1c2..fa57ab967f31 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/log/BouncerLoggerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/log/BouncerLoggerStartable.kt @@ -28,7 +28,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Startable that logs the flows that bouncer depends on. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerMessageViewBinder.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerMessageViewBinder.kt index b8e6ad6956fe..0c36d0af7027 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerMessageViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/BouncerMessageViewBinder.kt @@ -29,7 +29,7 @@ import com.android.systemui.bouncer.shared.model.Message import com.android.systemui.bouncer.ui.BouncerMessageView import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.log.BouncerLogger -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object BouncerMessageViewBinder { @JvmStatic diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt index 80c4291d2873..2dce28409b57 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/ComposeBouncerViewBinder.kt @@ -20,7 +20,7 @@ import com.android.systemui.util.kotlin.sample import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.awaitCancellation -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** View binder responsible for binding the compose version of the bouncer. */ object ComposeBouncerViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt index b76520b4ada1..71eda0c19e6f 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/binder/KeyguardBouncerViewBinder.kt @@ -38,7 +38,7 @@ import com.android.systemui.plugins.ActivityStarter import com.android.systemui.user.domain.interactor.SelectedUserInteractor import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds the bouncer container to its view model. */ object KeyguardBouncerViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerContainerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerContainerViewModel.kt index 615cb5bb51c8..39a4f7021fde 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerContainerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerContainerViewModel.kt @@ -24,7 +24,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class BouncerContainerViewModel @AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt index c383b8d5f95c..a6874b00ebfa 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerMessageViewModel.kt @@ -61,7 +61,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Holds UI state for the 2-line status message shown on the bouncer. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt index 67d312e17069..0d7be8c9c9af 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/BouncerSceneContentViewModel.kt @@ -47,7 +47,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Models UI state for the content of the bouncer scene. */ class BouncerSceneContentViewModel diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt index b8c6ab3783d5..c0ea9ff598d1 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PasswordBouncerViewModel.kt @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Holds UI state and handles user input for the password bouncer UI. */ class PasswordBouncerViewModel diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt index 158f102ccdb3..633ce958eda7 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PatternBouncerViewModel.kt @@ -37,7 +37,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Holds UI state and handles user input for the pattern bouncer UI. */ class PatternBouncerViewModel diff --git a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt index 5c8a9a692baf..5baec1e025e8 100644 --- a/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/bouncer/ui/viewmodel/PinBouncerViewModel.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.receiveAsFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Holds UI state and handles user input for the PIN code bouncer UI. */ class PinBouncerViewModel diff --git a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt index 37d1887730b9..06d391704870 100644 --- a/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/brightness/data/repository/ScreenBrightnessRepository.kt @@ -46,7 +46,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** @@ -96,7 +96,7 @@ constructor( ) init { - applicationScope.launch(backgroundContext) { + applicationScope.launch(context = backgroundContext) { for (call in apiQueue) { val bounds = getMinMaxLinearBrightness() val value = call.value.clamp(bounds.first, bounds.second).floatValue diff --git a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt index 470807985006..8639ee51b3f5 100644 --- a/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt +++ b/packages/SystemUI/src/com/android/systemui/brightness/ui/compose/BrightnessSlider.kt @@ -47,7 +47,7 @@ import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig import com.android.systemui.haptics.slider.compose.ui.SliderHapticsViewModel import com.android.systemui.lifecycle.rememberViewModel import com.android.systemui.utils.PolicyRestriction -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @Composable private fun BrightnessSlider( diff --git a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardImageLoader.kt b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardImageLoader.kt index e83a825a0072..8814a1298e44 100644 --- a/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardImageLoader.kt +++ b/packages/SystemUI/src/com/android/systemui/clipboardoverlay/ClipboardImageLoader.kt @@ -28,7 +28,7 @@ import java.util.function.Consumer import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeoutOrNull diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalOngoingContentStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalOngoingContentStartable.kt index b1b02cec871d..48a6d9de380c 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/CommunalOngoingContentStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalOngoingContentStartable.kt @@ -25,7 +25,7 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Background import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class CommunalOngoingContentStartable diff --git a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt index 8510915d55af..4f9443efd857 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/CommunalSceneStartable.kt @@ -62,7 +62,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt index 02bf9dbab373..258480e7fef5 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/data/db/CommunalWidgetDao.kt @@ -39,7 +39,7 @@ import javax.inject.Named import javax.inject.Provider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Callback that will be invoked when the Room database is created. Then the database will be diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSceneRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSceneRepository.kt index 260dcbad6201..415fd4e2fe6a 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSceneRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalSceneRepository.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates the state of communal mode. */ interface CommunalSceneRepository { diff --git a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt index 0e9428970a13..e164587ce02d 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/data/repository/CommunalWidgetRepository.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates the state of widgets for communal mode. */ interface CommunalWidgetRepository { diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt index 905eda14e2d5..7b8c19c67d9b 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * This class listens to [SceneTransitionLayout] transitions and manages keyguard transition diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt index 2b7db148582d..6fa066306287 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalTutorialInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformWhile -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates business-logic related to communal tutorial state. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/WidgetTrampolineInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/WidgetTrampolineInteractor.kt index f7cd2ab89140..f49394ad37bb 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/WidgetTrampolineInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/WidgetTrampolineInteractor.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.TimeoutCancellationException import kotlinx.coroutines.delay import kotlinx.coroutines.flow.takeWhile -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt index 0120b5c87f0a..9c754ea5f962 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/binder/CommunalTutorialIndicatorViewBinder.kt @@ -24,7 +24,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.communal.ui.viewmodel.CommunalTutorialIndicatorViewModel import com.android.systemui.lifecycle.repeatWhenAttached import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** View binder for communal tutorial indicator shown on keyguard. */ object CommunalTutorialIndicatorViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt index 53109ac69fa9..7990450f6ac8 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/ui/viewmodel/CommunalViewModel.kt @@ -72,7 +72,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** The default view model used for showing the communal hub. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHost.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHost.kt index b46698ed87f2..4f9ed2f7dbf8 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHost.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalAppWidgetHost.kt @@ -25,7 +25,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.flow.asSharedFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Communal app widget host that creates a [CommunalAppWidgetHostView]. */ class CommunalAppWidgetHost( diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetHost.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetHost.kt index 42107c1e9769..0b8d9775675f 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetHost.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/CommunalWidgetHost.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Widget host that interacts with AppWidget service and host to bind and provide info for widgets diff --git a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt index 8c14d63c0e84..ca4bbc0ae3bd 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/widgets/EditWidgetsActivity.kt @@ -52,7 +52,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.settings.UserTracker import javax.inject.Inject import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** An Activity for editing the widgets that appear in hub mode. */ class EditWidgetsActivity diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt index 37c6e17de148..514242b41eb1 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/data/repository/DeviceEntryFaceAuthRepository.kt @@ -87,7 +87,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt index dbd7f0739f6c..1a5654144b65 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/DeviceEntryInteractor.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Hosts application business logic related to device entry. diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractor.kt index 88daa5de8816..e81164b94d7c 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/FaceHelpMessageDeferralInteractor.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.flatMapLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * FaceHelpMessageDeferral business logic. Processes face acquired and face help authentication diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt index f90f02aad892..a20556ca7e02 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/domain/interactor/OccludingAppDeviceEntryInteractor.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Business logic for handling authentication events when an app is occluding the lockscreen. */ @ExperimentalCoroutinesApi diff --git a/packages/SystemUI/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinder.kt b/packages/SystemUI/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinder.kt index 1fd7d009cee4..720a4fb2a5ab 100644 --- a/packages/SystemUI/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/deviceentry/ui/binder/LiftToRunFaceAuthBinder.kt @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Triggers face auth and active unlock on lift when the device is showing the lock screen or 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 e3fce0007f26..f4d256a5b2ba 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 @@ -27,7 +27,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.cancel -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Provides per display instances of [CoroutineScope]. These will remain active as long as the diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt index 88d3a28669df..7253621237f6 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/DisplayWindowPropertiesRepository.kt @@ -32,7 +32,7 @@ import java.io.PrintWriter import javax.inject.Inject import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Provides per display instances of [DisplayWindowProperties]. */ interface DisplayWindowPropertiesRepository { @@ -76,9 +76,7 @@ constructor( } override fun start() { - backgroundApplicationScope.launch( - CoroutineName("DisplayWindowPropertiesRepositoryImpl#start") - ) { + backgroundApplicationScope.launch("DisplayWindowPropertiesRepositoryImpl#start") { displayRepository.displayRemovalEvent.collect { removedDisplayId -> properties.row(removedDisplayId).clear() } diff --git a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt index 2c4345556f15..ecddef6ee843 100644 --- a/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt +++ b/packages/SystemUI/src/com/android/systemui/display/data/repository/PerDisplayStore.kt @@ -23,7 +23,7 @@ import java.io.PrintWriter import java.util.concurrent.ConcurrentHashMap import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Provides per display instances of [T]. */ interface PerDisplayStore { @@ -80,7 +80,7 @@ abstract class PerDisplayStoreImpl( override fun start() { val instanceType = instanceClass.simpleName - backgroundApplicationScope.launch(CoroutineName("PerDisplayStore#<$instanceType>start")) { + backgroundApplicationScope.launch("PerDisplayStore#<$instanceType>start") { displayRepository.displayRemovalEvent.collect { removedDisplayId -> val removedInstance = perDisplayInstances.remove(removedDisplayId) removedInstance?.let { onDisplayRemovalAction(it) } diff --git a/packages/SystemUI/src/com/android/systemui/display/ui/viewmodel/ConnectingDisplayViewModel.kt b/packages/SystemUI/src/com/android/systemui/display/ui/viewmodel/ConnectingDisplayViewModel.kt index 62720a5b1377..7ba15a6cfd7d 100644 --- a/packages/SystemUI/src/com/android/systemui/display/ui/viewmodel/ConnectingDisplayViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/display/ui/viewmodel/ConnectingDisplayViewModel.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Shows/hides a dialog to allow the user to decide whether to use the external display for @@ -93,11 +93,11 @@ constructor( bottomSheetFactory .createDialog( onStartMirroringClickListener = { - scope.launch(bgDispatcher) { pendingDisplay.enable() } + scope.launch(context = bgDispatcher) { pendingDisplay.enable() } dismissDialog() }, onCancelMirroring = { - scope.launch(bgDispatcher) { pendingDisplay.ignore() } + scope.launch(context = bgDispatcher) { pendingDisplay.ignore() } dismissDialog() }, navbarBottomInsetsProvider = { Utils.getNavbarInsets(context).bottom }, diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt index 905174519245..694502484b36 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayAnimationsController.kt @@ -45,7 +45,7 @@ import com.android.systemui.statusbar.CrossFadeHelper import javax.inject.Inject import javax.inject.Named import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Controller for dream overlay animations. */ @DreamOverlayScope 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 724f1c5323cf..6b14ebf31d84 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamService.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob import kotlinx.coroutines.cancel import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class HomeControlsDreamService @Inject diff --git a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamStartable.kt b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamStartable.kt index 14525269eb6b..03f58aca9fc6 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/dreams/homecontrols/HomeControlsDreamStartable.kt @@ -25,7 +25,7 @@ import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dreams.homecontrols.domain.interactor.HomeControlsComponentInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class HomeControlsDreamStartable @Inject diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt index c88b36495ac2..d5876f211e57 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/ContextualEducationInteractor.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Allows updating education data (e.g. signal count, shortcut time) for different gesture types. diff --git a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt index 00da5b1e01ce..7242770e72e5 100644 --- a/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/education/domain/interactor/KeyboardTouchpadEduInteractor.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.merge -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Allow listening to new contextual education triggered */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt index 1996efa14d7c..6baffdda4bb3 100644 --- a/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/education/ui/view/ContextualEduUiCoordinator.kt @@ -37,7 +37,7 @@ import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutoria import com.android.systemui.res.R import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * A class to show contextual education on UI based on the edu produced from diff --git a/packages/SystemUI/src/com/android/systemui/flags/ConditionalRestarter.kt b/packages/SystemUI/src/com/android/systemui/flags/ConditionalRestarter.kt index 906896fb920e..f54067a12ab6 100644 --- a/packages/SystemUI/src/com/android/systemui/flags/ConditionalRestarter.kt +++ b/packages/SystemUI/src/com/android/systemui/flags/ConditionalRestarter.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.transformLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Restarts the process after all passed in [Condition]s are true. */ class ConditionalRestarter @@ -60,7 +60,7 @@ constructor( private fun scheduleRestart(reason: String = "") { pendingReason = if (reason.isEmpty()) pendingReason else reason - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { combine(conditions.map { condition -> condition.canRestartNow }) { it.all { it } } // Once all conditions are met, delay. .transformLatest { allConditionsMet -> diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt index cc77f68a801e..f6d7e1562291 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt @@ -26,7 +26,7 @@ import com.google.android.msdl.domain.MSDLPlayer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * A plugin added to a manager of a [android.widget.SeekBar] that adds dynamic haptic feedback. diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt index 14cf4110272f..eef71072f178 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt @@ -22,7 +22,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Slider tracker attached to a slider. diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderTracker.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderTracker.kt index 002b5aa743ba..af08f40d3dfc 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderTracker.kt @@ -19,7 +19,7 @@ package com.android.systemui.haptics.slider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.cancel -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Tracker component for a slider. diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt index f2afaee1870b..4c459256b052 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/TutorialNotificationCoordinator.kt @@ -40,7 +40,7 @@ import com.android.systemui.inputdevice.tutorial.ui.view.KeyboardTouchpadTutoria import com.android.systemui.res.R import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** When the scheduler is due, show a notification to launch tutorial */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt index 29febd32e925..fa494150cbbf 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/view/KeyboardTouchpadTutorialActivity.kt @@ -40,7 +40,7 @@ import com.android.systemui.inputdevice.tutorial.ui.viewmodel.Screen.BACK_GESTUR import com.android.systemui.inputdevice.tutorial.ui.viewmodel.Screen.HOME_GESTURE import java.util.Optional import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Activity for out of the box experience for keyboard and touchpad. Note that it's possible that diff --git a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt index 5cf19677a98e..896bdc068154 100644 --- a/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/inputdevice/tutorial/ui/viewmodel/KeyboardTouchpadTutorialViewModel.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.runningFold -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class KeyboardTouchpadTutorialViewModel( private val gesturesInteractor: Optional, diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/KeyboardBacklightDialogCoordinator.kt b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/KeyboardBacklightDialogCoordinator.kt index 1f421fae2517..2501d8a33865 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/KeyboardBacklightDialogCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/backlight/ui/KeyboardBacklightDialogCoordinator.kt @@ -25,7 +25,7 @@ import com.android.systemui.keyboard.backlight.ui.viewmodel.BacklightDialogConte import com.android.systemui.keyboard.backlight.ui.viewmodel.BacklightDialogViewModel import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private fun defaultCreateDialog(context: Context): (Int, Int) -> KeyboardBacklightDialog { return { currentLevel: Int, maxLevel: Int -> diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/docking/binder/KeyboardDockingIndicationViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyboard/docking/binder/KeyboardDockingIndicationViewBinder.kt index b859cdc5dee5..c2974a8d5429 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/docking/binder/KeyboardDockingIndicationViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/docking/binder/KeyboardDockingIndicationViewBinder.kt @@ -29,7 +29,7 @@ import com.android.systemui.surfaceeffects.PaintDrawCallback import com.android.systemui.surfaceeffects.glowboxeffect.GlowBoxEffect import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class KeyboardDockingIndicationViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt index 2578b785056d..f0b2b86d67a0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/docking/ui/viewmodel/KeyboardDockingIndicationViewModel.kt @@ -29,7 +29,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class KeyboardDockingIndicationViewModel diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperStateRepository.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperStateRepository.kt index 82df95d482c2..aa6b61b6215d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperStateRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/data/repository/ShortcutHelperStateRepository.kt @@ -36,7 +36,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperStateInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperStateInteractor.kt index 299628ee19f6..cea3b6442feb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperStateInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/domain/interactor/ShortcutHelperStateInteractor.kt @@ -27,7 +27,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class ShortcutHelperStateInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt index e49ce6062be3..f64d59a26893 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/shortcut/ui/composable/Surfaces.kt @@ -61,7 +61,7 @@ import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.android.compose.modifiers.thenIf -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * A selectable surface with no default focus/hover indications. diff --git a/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinator.kt b/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinator.kt index 78c4e77cad74..3aca9bdb7ebc 100644 --- a/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinator.kt @@ -23,7 +23,7 @@ import com.android.systemui.keyboard.stickykeys.StickyKeysLogger import com.android.systemui.keyboard.stickykeys.ui.viewmodel.StickyKeysIndicatorViewModel import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class StickyKeysIndicatorCoordinator diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt index b9e513586298..b3027edb5f0a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ResourceTrimmer.kt @@ -31,7 +31,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Releases cached resources on allocated by keyguard. @@ -52,7 +52,7 @@ constructor( override fun start() { Log.d(LOG_TAG, "Resource trimmer registered.") - applicationScope.launch(bgDispatcher) { + applicationScope.launch(context = bgDispatcher) { keyguardTransitionInteractor .isFinishedIn(scene = Scenes.Gone, stateWithoutSceneContainer = GONE) .filter { isOnGone -> isOnGone } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncer.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncer.kt index 72747f68bbbd..c1384e7629a9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncer.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceLegacySettingSyncer.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManager.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManager.kt index e6bab4c7edcf..8be11a4691be 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManager.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/KeyguardQuickAffordanceRemoteUserSelectionManager.kt @@ -37,7 +37,7 @@ import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Manages and provides access to the current "selections" of keyguard quick affordances, answering diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt index a145214e5161..6c1bdad98251 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceConfig.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext @SysUISingleton @@ -103,7 +103,7 @@ constructor( override fun onTriggered( expandable: Expandable? ): KeyguardQuickAffordanceConfig.OnTriggeredResult { - coroutineScope.launch(backgroundDispatcher) { + coroutineScope.launch(context = backgroundDispatcher) { val newRingerMode: Int val currentRingerMode = audioManager.ringerModeInternal if (currentRingerMode == AudioManager.RINGER_MODE_SILENT) { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartable.kt index 7dbe945c1c6f..8e1ba4137947 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartable.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import javax.inject.Inject /** @@ -71,7 +71,7 @@ class MuteQuickAffordanceCoreStartable @Inject constructor( } private fun updateLastNonSilentRingerMode(lastRingerMode: Int) { - coroutineScope.launch(backgroundDispatcher) { + coroutineScope.launch(context = backgroundDispatcher) { if (AudioManager.RINGER_MODE_SILENT != lastRingerMode) { userFileManager.getSharedPreferences( MuteQuickAffordanceConfig.MUTE_QUICK_AFFORDANCE_PREFS_FILE_NAME, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 9e99a879be41..bbaa9eb85d4a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -64,7 +64,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Defines interface for classes that encapsulate application state for the keyguard. */ interface KeyguardRepository { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt index e4b0f6ea69a9..c755c4b02feb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromAlternateBouncerTransitionInteractor.kt @@ -46,7 +46,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromAlternateBouncerTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt index 0c2d5778079b..6ac0a3f8443f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromDozingTransitionInteractor.kt @@ -41,7 +41,7 @@ import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromDozingTransitionInteractor 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 7b757657b1d9..1e672e23970b 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 @@ -48,7 +48,7 @@ import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton 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 a6f0db5a86aa..3565b612a3c9 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 @@ -48,7 +48,7 @@ import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext @OptIn(FlowPreview::class) 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 a4a215f6eeef..bc2ed71f156c 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 @@ -38,7 +38,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromGoneTransitionInteractor 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 e84db062a5f5..a7dde34e3026 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 @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromLockscreenTransitionInteractor @@ -358,7 +358,7 @@ constructor( if (!communalSettingsInteractor.isCommunalFlagEnabled()) { return } - scope.launch(mainDispatcher) { + scope.launch(context = mainDispatcher) { glanceableHubTransitions.listenForGlanceableHubTransition( transitionOwnerName = TAG, fromState = KeyguardState.LOCKSCREEN, diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt index 840bc0fb5f99..a9011513d797 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromOccludedTransitionInteractor.kt @@ -38,7 +38,7 @@ import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromOccludedTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt index 0ecf7816e9b7..402c152070a2 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/FromPrimaryBouncerTransitionInteractor.kt @@ -45,7 +45,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class FromPrimaryBouncerTransitionInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt index 6932eb51e141..6385b3cffbd4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardBlueprintInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class KeyguardBlueprintInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractor.kt index 9b9bdd1bde9b..2d7da38535b1 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Encapsulates business logic for requesting the keyguard to dismiss/finish/done. */ diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt index ad1a32e70a5b..5f08aa320c95 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Logic around the keyguard being enabled/disabled, per [KeyguardService]. If the keyguard is not diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardStateCallbackInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardStateCallbackInteractor.kt index 6fe4ff5122d0..373f5a1aef23 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardStateCallbackInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardStateCallbackInteractor.kt @@ -34,7 +34,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt index 505c749d9e44..b2031d300a82 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTouchHandlingInteractor.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Business logic for use-cases related to top-level touch handling in the lock screen. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt index cf9d60fff2c6..0dae17c594c8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionAuditLogger.kt @@ -29,7 +29,7 @@ import com.android.systemui.statusbar.notification.stack.ui.viewmodel.SharedNoti import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.debounce -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private val TAG = KeyguardTransitionAuditLogger::class.simpleName!! diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt index 89f636d4a270..cddeaaf27fb9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Handles initialization of the KeyguardTransitionRepository on boot. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt index a0000f3c66fd..b815f1988e7e 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionInteractor.kt @@ -59,7 +59,7 @@ import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates business-logic related to the keyguard transitions. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt index 9b8d9ea11edf..9c98a96ea908 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardWakeDirectlyToGoneInteractor.kt @@ -52,7 +52,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Logic related to the ability to wake directly to GONE from asleep (AOD/DOZING), without going diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt index 34173a9f44ea..6d9c6a666f56 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/LightRevealScrimInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class LightRevealScrimInteractor diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt index 43aab355d6d1..73e80ff1d02b 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/StatusBarDisableFlagsInteractor.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index ba12e9356ed7..249982d710a7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Each TransitionInteractor is responsible for determining under which conditions to notify diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TrustInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TrustInteractor.kt index 73248bbec6ca..69a870ed3267 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TrustInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TrustInteractor.kt @@ -22,7 +22,7 @@ import com.android.systemui.keyguard.data.repository.TrustRepository import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates any state relevant to trust agents and trust grants. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt index f3bb8293851f..5524b20aa8f8 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt @@ -38,7 +38,7 @@ import java.util.UUID import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * This class listens to scene framework scene transitions and manages keyguard transition framework diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AccessibilityActionsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AccessibilityActionsViewBinder.kt index 8f5a6a1f22e7..824e0228adca 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AccessibilityActionsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/AccessibilityActionsViewBinder.kt @@ -26,7 +26,7 @@ import com.android.systemui.keyguard.ui.viewmodel.AccessibilityActionsViewModel import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.res.R import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** View binder for accessibility actions placeholder on keyguard. */ object AccessibilityActionsViewBinder { 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 6c104a0a2470..be4bc2305922 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 @@ -42,7 +42,7 @@ import com.android.systemui.util.kotlin.DisposableHandles import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @ExperimentalCoroutinesApi object DeviceEntryIconViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherAnimationViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherAnimationViewBinder.kt index 56a6e9b127f6..9040eac55e7d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherAnimationViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/InWindowLauncherAnimationViewBinder.kt @@ -19,7 +19,7 @@ package com.android.systemui.keyguard.ui.binder import com.android.systemui.keyguard.ui.view.InWindowLauncherUnlockAnimationManager import com.android.systemui.keyguard.ui.viewmodel.InWindowLauncherAnimationViewModel import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Binds the [InWindowLauncherUnlockAnimationManager] "view", which manages the lifecycle and state diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt index 5f76f643b2fe..7292ddaf43a7 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardClockViewBinder.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object KeyguardClockViewBinder { private val TAG = KeyguardClockViewBinder::class.simpleName!! diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt index 69cb6a92137f..87befc052a15 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissActionBinder.kt @@ -27,7 +27,7 @@ import dagger.Lazy import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Runs actions on keyguard dismissal. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt index b55f813a1f84..a1ca604330df 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/KeyguardDismissBinder.kt @@ -27,7 +27,7 @@ import com.android.systemui.log.core.LogLevel import com.android.systemui.user.domain.interactor.SelectedUserInteractor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Handles keyguard dismissal requests. */ @SysUISingleton 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 cfd6481234ed..191e08b0de77 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 @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** This is only for a SINGLE Quick affordance */ @SysUISingleton 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 89bca0c6a373..f121aabe795a 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 @@ -95,7 +95,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Bind occludingAppDeviceEntryMessageViewModel to run whenever the keyguard view is attached. */ @OptIn(ExperimentalCoroutinesApi::class) 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 741cc02ffb6b..97fa3f19a82e 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 @@ -26,7 +26,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.shared.Flags.ambientAod import com.android.systemui.statusbar.LightRevealScrim import com.android.systemui.wallpapers.ui.viewmodel.WallpaperViewModel -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object LightRevealScrimViewBinder { @JvmStatic diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt index 76edda3c334b..98fe9c3e1c80 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/binder/SideFpsProgressBarViewBinder.kt @@ -34,7 +34,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val sfpsProgressBarCommand = "sfps-progress-bar" 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 08d35a72ab12..5f6ea3a322ba 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 @@ -104,7 +104,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.Job import kotlinx.coroutines.cancel import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.json.JSONException 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 9355200daec7..f228e26f92f7 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 @@ -44,7 +44,7 @@ import com.android.systemui.util.kotlin.logD import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class KeyguardRemotePreviewManager @@ -214,7 +214,7 @@ class PreviewLifecycleObserver( this.onDestroy = null val hostToken = rendererToDestroy.hostToken hostToken?.unlinkToDeath(this, 0) - scope.launch(mainDispatcher) { rendererToDestroy.destroy() } + scope.launch(context = mainDispatcher) { rendererToDestroy.destroy() } rendererToDestroy.id } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt index 75b1b0402630..850e943d17eb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/LockscreenContentViewModel.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class LockscreenContentViewModel @AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt index c5909ed24c50..da96f3fd1f9c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/SideFpsProgressBarViewModel.kt @@ -59,7 +59,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @ExperimentalCoroutinesApi @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt index 7c02f28c0696..881228d597b0 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/Hydrator.kt @@ -25,7 +25,7 @@ import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Keeps snapshot/Compose [State]s up-to-date. diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt index a86bfb18fb70..559e1d96c6d8 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/RepeatWhenAttached.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.emptyFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Runs the given [block] every time the [View] becomes attached (or immediately after calling this @@ -117,7 +117,7 @@ private fun createLifecycleOwnerAndRun( onCreate() // TODO(b/370595466): Refactor to support installing CoroutineTracingContext on the // top-level CoroutineScope used as the lifecycleScope - lifecycleScope.launch(coroutineContext) { block(view) } + lifecycleScope.launch(context = coroutineContext) { block(view) } } } diff --git a/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt b/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt index 508b04eee91a..a81b3e297bf0 100644 --- a/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/lifecycle/SysUiViewModel.kt @@ -22,7 +22,7 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.remember import com.android.app.tracing.coroutines.traceCoroutine import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Returns a remembered view-model of the type [T]. If the returned instance is also an diff --git a/packages/SystemUI/src/com/android/systemui/log/echo/LogcatEchoTrackerDebug.kt b/packages/SystemUI/src/com/android/systemui/log/echo/LogcatEchoTrackerDebug.kt index ee58b1465316..21808b691cd0 100644 --- a/packages/SystemUI/src/com/android/systemui/log/echo/LogcatEchoTrackerDebug.kt +++ b/packages/SystemUI/src/com/android/systemui/log/echo/LogcatEchoTrackerDebug.kt @@ -27,7 +27,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * A version of [LogcatEchoTracker] that supports fine-grained echoing of log messages to logcat, @@ -108,7 +108,7 @@ constructor( } fun setEchoLevel(type: EchoOverrideType, name: String, level: LogLevel?) { - applicationScope.launch(sequentialBgDispatcher) { + applicationScope.launch(context = sequentialBgDispatcher) { val newBufferOverrides = bufferOverrides.toMutableMap() val newTagOverrides = tagOverrides.toMutableMap() @@ -132,7 +132,7 @@ constructor( } fun clearAllOverrides() { - applicationScope.launch(sequentialBgDispatcher) { + applicationScope.launch(context = sequentialBgDispatcher) { bufferOverrides = emptyMap() tagOverrides = emptyMap() @@ -142,7 +142,7 @@ constructor( } private fun loadEchoOverrides() { - applicationScope.launch(sequentialBgDispatcher) { + applicationScope.launch(context = sequentialBgDispatcher) { val overrideSetting = globalSettings.getString(OVERRIDE_SETTING_PATH) ?: return@launch val overrideList = settingFormat.parseOverrides(overrideSetting) diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt index 4528b047375a..2191f379e812 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/LegacyMediaDataManagerImpl.kt @@ -103,7 +103,7 @@ import java.util.concurrent.Executor import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext // URI fields to try loading album art from diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt index 7b8703dfbe4f..591a9cccdadd 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataLoader.kt @@ -67,7 +67,7 @@ import kotlin.coroutines.coroutineContext import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.async +import com.android.app.tracing.coroutines.asyncTraced as async import kotlinx.coroutines.cancel import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt index affc7b741b2a..3821f3d8c111 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/domain/pipeline/MediaDataProcessor.kt @@ -111,7 +111,7 @@ import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext // URI fields to try loading album art from diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt index 7a6de5c07b43..a6e1582d4e0c 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaControlViewBinder.kt @@ -64,7 +64,7 @@ import com.android.systemui.surfaceeffects.ripple.RippleAnimationConfig import com.android.systemui.surfaceeffects.ripple.RippleShader import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "MediaControlViewBinder" diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaRecommendationsViewBinder.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaRecommendationsViewBinder.kt index 8a04799d3f94..4877d18de7ab 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaRecommendationsViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/binder/MediaRecommendationsViewBinder.kt @@ -58,7 +58,7 @@ import com.android.systemui.util.animation.TransitionLayout import kotlin.math.min import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "MediaRecommendationsViewBinder" diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt index 72650ea89dcb..43c20117b6e0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaCarouselController.kt @@ -115,7 +115,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "MediaCarouselController" diff --git a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt index 745ab12c27d6..c32bd403d2e8 100644 --- a/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt +++ b/packages/SystemUI/src/com/android/systemui/media/controls/ui/controller/MediaHierarchyManager.kt @@ -68,7 +68,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.mapLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private val TAG: String = MediaHierarchyManager::class.java.simpleName diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt index 575e1986a23f..a05808e0ef0a 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/MediaProjectionAppSelectorController.kt @@ -27,10 +27,10 @@ import com.android.systemui.shared.recents.model.ThumbnailData import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred -import kotlinx.coroutines.async +import com.android.app.tracing.coroutines.asyncTraced as async import kotlinx.coroutines.cancel import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @MediaProjectionAppSelectorScope class MediaProjectionAppSelectorController diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt index 3b84d2c53a2b..9aa988e351d1 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/appselector/view/RecentTaskViewHolder.kt @@ -33,7 +33,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class RecentTaskViewHolder @AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/TaskSwitcherNotificationCoordinator.kt b/packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/TaskSwitcherNotificationCoordinator.kt index dab7439f0f0c..fa3ee6f0ba2d 100644 --- a/packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/TaskSwitcherNotificationCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/mediaprojection/taskswitcher/ui/TaskSwitcherNotificationCoordinator.kt @@ -35,7 +35,7 @@ import com.android.systemui.res.R import com.android.systemui.util.NotificationChannels import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Coordinator responsible for showing/hiding the task switcher notification. */ @SysUISingleton 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 ba746cda480e..774a0669fe2d 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 @@ -36,7 +36,7 @@ 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 com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt index 0e5404164ba1..7178d095d230 100644 --- a/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/notifications/ui/viewmodel/NotificationsShadeOverlayContentViewModel.kt @@ -28,7 +28,7 @@ import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Models UI state used to render the content of the notifications shade overlay. diff --git a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt index 954e94af1c1a..2f7e9160e281 100644 --- a/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt +++ b/packages/SystemUI/src/com/android/systemui/people/PeopleSpaceActivity.kt @@ -29,7 +29,7 @@ import com.android.compose.theme.PlatformTheme import com.android.systemui.people.ui.compose.PeopleScreen import com.android.systemui.people.ui.viewmodel.PeopleViewModel import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** People Tile Widget configuration activity that shows the user their conversation tiles. */ class PeopleSpaceActivity diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt index 4323b3199d57..8b0694219630 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/QSHostAdapter.kt @@ -31,7 +31,7 @@ import com.android.systemui.qs.pipeline.shared.TileSpec import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Adapter to determine what real class to use for classes that depend on [QSHost]. 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 4071b135dfaf..e4738a23b73b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -131,7 +131,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SuppressLint("ValidFragment") class QSFragmentCompose diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt index e21485b3e85a..d571dd04e024 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt @@ -65,7 +65,7 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @OptIn(ExperimentalCoroutinesApi::class) class QSFragmentComposeViewModel diff --git a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt index b0d4fa26225e..564bc78a3f98 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/footer/ui/viewmodel/FooterActionsViewModel.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.isActive -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val TAG = "FooterActionsViewModel" diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt index 0dedfe125d6f..91f1477d5325 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/PagerDots.kt @@ -45,7 +45,7 @@ import androidx.compose.ui.unit.LayoutDirection import androidx.compose.ui.unit.dp import kotlin.math.absoluteValue import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import platform.test.motion.compose.values.MotionTestValueKey import platform.test.motion.compose.values.motionTestValues diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt index b581c8bf953f..28812807ca8d 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/EditTile.kt @@ -137,7 +137,7 @@ import com.android.systemui.qs.shared.model.groupAndSort import com.android.systemui.res.R import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object TileType diff --git a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt index 5f28fe427707..4104e53cfcb0 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/panels/ui/compose/infinitegrid/Tile.kt @@ -78,7 +78,7 @@ import com.android.systemui.qs.tileimpl.QSTileImpl import com.android.systemui.res.R import java.util.function.Supplier import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private const val TEST_TAG_SMALL = "qs_tile_small" private const val TEST_TAG_LARGE = "qs_tile_large" diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt index 9fcb0db0c88d..f41507f86f7f 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserAutoAddRepository.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.scan import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** @@ -70,7 +70,7 @@ constructor( } private fun startFlowCollections(autoAdded: StateFlow>) { - applicationScope.launch(bgDispatcher) { + applicationScope.launch(context = bgDispatcher) { launch { autoAdded.collect { store(it) } } launch { // As Settings is not the source of truth, once we started tracking tiles for a diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt index b0ae1e1abf21..64da853484ff 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/data/repository/UserTileSpecRepository.kt @@ -23,7 +23,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.scan import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** @@ -84,7 +84,7 @@ constructor( } private fun startFlowCollections(tiles: StateFlow>) { - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { launch { tiles.collect { storeTiles(userId, it) } } launch { // As Settings is not the source of truth, once we started tracking tiles for a diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AccessibilityTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AccessibilityTilesInteractor.kt index 88784bf79ce6..56c3e0e648bf 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AccessibilityTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AccessibilityTilesInteractor.kt @@ -30,7 +30,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Observe the tiles in the QS Panel and perform accessibility related actions */ @SysUISingleton @@ -55,7 +55,7 @@ constructor( } private fun startObservingTiles(currentTilesInteractor: CurrentTilesInteractor) { - scope.launch(backgroundDispatcher) { + scope.launch(context = backgroundDispatcher) { currentTilesInteractor.currentTiles .sample(currentTilesInteractor.userContext) { currentTiles, userContext -> Data(currentTiles.map(TileModel::spec), userContext) diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt index 187b4445637b..b11868ac5334 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/AutoAddInteractor.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.take -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Collects the signals coming from all registered [AutoAddable] and adds/removes tiles accordingly. diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt index 10097d6eef7e..2bb6bba51dbd 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/CurrentTilesInteractor.kt @@ -63,7 +63,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** @@ -207,7 +207,7 @@ constructor( } } - launch(backgroundDispatcher) { + launch(context = backgroundDispatcher) { userAndTiles.collectLatest { val newUser = it.userId val newTileList = it.tiles @@ -289,7 +289,7 @@ constructor( } override fun addTile(spec: TileSpec, position: Int) { - scope.launch(backgroundDispatcher) { + scope.launch(context = backgroundDispatcher) { // Block until the list is not empty currentTiles.filter { it.isNotEmpty() }.first() tileSpecRepository.addTile(userRepository.getSelectedUserInfo().id, spec, position) diff --git a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractor.kt index a5be14ec3776..180e0feea2ab 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/pipeline/domain/interactor/RestoreReconciliationInteractor.kt @@ -15,7 +15,7 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.flatMapConcat import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.take -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Interactor in charge of triggering reconciliation after QS Secure Settings are restored. For a @@ -42,7 +42,7 @@ constructor( @OptIn(ExperimentalCoroutinesApi::class) fun start() { - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { qsSettingsRestoredRepository.restoreData .flatMapConcat { data -> autoAddRepository.autoAddedTiles(data.userId).take(1).map { tiles -> diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt index cf2db6c66ce7..1c9cb3d99480 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/ModesTile.kt @@ -48,7 +48,7 @@ import com.android.systemui.qs.tiles.viewmodel.QSTileConfigProvider import com.android.systemui.qs.tiles.viewmodel.QSTileState import com.android.systemui.res.R import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.runBlocking class ModesTile diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/TileJavaAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/TileJavaAdapter.kt index a2430ad45274..28167b3fa076 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/TileJavaAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/TileJavaAdapter.kt @@ -25,7 +25,7 @@ import java.util.function.Consumer import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Utility for binding tiles to kotlin flows. Similar to [JavaAdapter] and usable for QS tiles. We diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt index d8c5af289048..87f542e6ab39 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/base/viewmodel/QSTileViewModelImpl.kt @@ -61,7 +61,7 @@ import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.shareIn import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTilePackageUpdatesRepository.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTilePackageUpdatesRepository.kt index 92b0f3aa604d..0ebd6f2b4ac3 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTilePackageUpdatesRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/data/repository/CustomTilePackageUpdatesRepository.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion import kotlinx.coroutines.flow.shareIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch interface CustomTilePackageUpdatesRepository { diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileDataInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileDataInteractor.kt index 1b3e58524815..8f870d468997 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileDataInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileDataInteractor.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.shareIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @QSTileScope @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractor.kt index 3e507cda4805..6f1cb3cc2675 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileInteractor.kt @@ -34,7 +34,7 @@ import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileServiceInteractor.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileServiceInteractor.kt index 79e903c7bce9..ccc84c091b1b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileServiceInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/impl/custom/domain/interactor/CustomTileServiceInteractor.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.channels.produce import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Communicates with [TileService] via [TileServiceManager] and [IQSTileService]. This interactor is 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 14115444fe49..d46bcfc3b947 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 @@ -32,7 +32,7 @@ import com.android.systemui.statusbar.policy.LocationController import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Handles location tile clicks. */ 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 f03c7521931c..671943c5baff 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 @@ -27,7 +27,7 @@ import com.android.systemui.statusbar.phone.SystemUIDialog import com.android.systemui.statusbar.policy.DataSaverController import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class DataSaverDialogDelegate( private val sysuiDialogFactory: SystemUIDialog.Factory, diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt index 8077c67bbba6..f89745f49cc8 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/viewmodel/QSTileViewModelAdapter.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.takeWhile -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch // TODO(b/http://b/299909989): Use QSTileViewModel directly after the rollout class QSTileViewModelAdapter diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt index ac6ebe7c87d3..6d5bf328d00b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/adapter/QSSceneAdapter.kt @@ -57,7 +57,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext // TODO(307945185) Split View concerns into a ViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneContentViewModel.kt index f77386dbe91b..06d3e4a9ad0e 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsSceneContentViewModel.kt @@ -34,7 +34,7 @@ import java.util.concurrent.atomic.AtomicBoolean import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Models UI state needed for rendering the content of the quick settings scene. diff --git a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt index afb9a788ec24..bed857496f0b 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/ui/viewmodel/QuickSettingsShadeOverlayContentViewModel.kt @@ -27,7 +27,7 @@ import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Models UI state used to render the content of the quick settings shade overlay. diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt index e477efe0808e..ba789a01d285 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/interactor/WindowRootViewVisibilityInteractor.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.flow.flatMapConcat import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Business logic about the visibility of various parts of the window root view. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/KeyguardStateCallbackStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/KeyguardStateCallbackStartable.kt index 6d1c1a7b5bfe..7939404251d1 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/KeyguardStateCallbackStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/KeyguardStateCallbackStartable.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** Keeps all [IKeyguardStateCallback]s hydrated with the latest state. */ @@ -76,7 +76,7 @@ constructor( callbacks.add(callback) - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { callback.onShowingStateChanged( !deviceEntryInteractor.isDeviceEntered.value, selectedUserInteractor.getSelectedUserId(), diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt index 286cac10fa05..5229acc5f876 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/SceneContainerStartable.kt @@ -102,7 +102,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Hooks up business logic that manipulates the state of the [SceneInteractor] for the system UI diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/ScrimStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/ScrimStartable.kt index e352bfe938f6..55033f09e263 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/ScrimStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/ScrimStartable.kt @@ -52,7 +52,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class ScrimStartable diff --git a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/StatusBarStartable.kt b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/StatusBarStartable.kt index d7413687eeae..1d8dc4f661da 100644 --- a/packages/SystemUI/src/com/android/systemui/scene/domain/startable/StatusBarStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/scene/domain/startable/StatusBarStartable.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext @SysUISingleton @@ -160,7 +160,7 @@ constructor( } override fun onBootCompleted() { - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { try { statusBarService.disableForUser( StatusBarManager.DISABLE_NONE, 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 47254775618c..82f65cf55211 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 @@ -48,7 +48,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Models UI state for the scene container. */ class SceneContainerViewModel diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/AnnouncementResolver.kt b/packages/SystemUI/src/com/android/systemui/screenshot/AnnouncementResolver.kt index 746f0f348431..d7aad31050d7 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/AnnouncementResolver.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/AnnouncementResolver.kt @@ -23,7 +23,7 @@ import com.android.systemui.screenshot.resources.Messages import java.util.function.Consumer import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Logic for determining the announcement that a screenshot has been taken (for accessibility). */ class AnnouncementResolver diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt index 56afb79c40d4..28bff51dc041 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/MessageContainerController.kt @@ -14,7 +14,7 @@ import com.android.systemui.res.R import com.android.systemui.screenshot.message.ProfileMessageController import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * MessageContainerController controls the display of content in the screenshot message container. diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt index 7aeec47241cb..f243c2711bfc 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundController.kt @@ -27,7 +27,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Deferred import kotlinx.coroutines.TimeoutCancellationException -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext import kotlinx.coroutines.withTimeout diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt index a7557463b12f..6cdaf2938983 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/TakeScreenshotExecutor.kt @@ -37,7 +37,7 @@ import java.util.function.Consumer import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch interface TakeScreenshotExecutor { suspend fun executeScreenshots( diff --git a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt index 0fefa0b7757a..68ff094b62f7 100644 --- a/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/screenshot/ui/binder/ScreenshotShelfViewBinder.kt @@ -42,7 +42,7 @@ import com.android.systemui.screenshot.ui.viewmodel.ScreenshotViewModel import com.android.systemui.util.children import javax.inject.Inject import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class ScreenshotShelfViewBinder @Inject diff --git a/packages/SystemUI/src/com/android/systemui/security/data/repository/SecurityRepository.kt b/packages/SystemUI/src/com/android/systemui/security/data/repository/SecurityRepository.kt index 8f4402eaa406..7e967f436ecb 100644 --- a/packages/SystemUI/src/com/android/systemui/security/data/repository/SecurityRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/security/data/repository/SecurityRepository.kt @@ -26,7 +26,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch interface SecurityRepository { /** The current [SecurityModel]. */ diff --git a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt index 1863e12187cd..fc4db0877dbe 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/settings/UserTrackerImpl.kt @@ -49,7 +49,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.sync.Mutex /** @@ -204,7 +204,7 @@ internal constructor( if (isBackgroundUserSwitchEnabled) { userSwitchingJob?.cancel() userSwitchingJob = - appScope.launch(backgroundContext) { + appScope.launch(context = backgroundContext) { handleUserSwitchingCoroutines(newUserId) { reply?.sendResult(null) } } } else { @@ -218,7 +218,7 @@ internal constructor( if (isBackgroundUserSwitchEnabled) { afterUserSwitchingJob?.cancel() afterUserSwitchingJob = - appScope.launch(backgroundContext) { + appScope.launch(context = backgroundContext) { handleUserSwitchComplete(newUserId) } } else { @@ -260,10 +260,10 @@ internal constructor( for (callbackDataItem in synchronized(callbacks) { callbacks.toList() }) { val callback: UserTracker.Callback = callbackDataItem.callback.get() ?: continue - launch(callbackDataItem.executor.asCoroutineDispatcher()) { + launch(context = callbackDataItem.executor.asCoroutineDispatcher()) { val mutex = Mutex(true) val thresholdLogJob = - launch(backgroundContext) { + launch(context = backgroundContext) { delay(USER_CHANGE_THRESHOLD) Log.e(TAG, "Failed to finish $callback in time") } diff --git a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt index 52cb8d6df7e1..49ceba834dd4 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/GlanceableHubContainerController.kt @@ -70,7 +70,7 @@ import java.util.function.Consumer import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Controller that's responsible for the glanceable hub container view and its touch handling. diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt index 348b6bab1617..437d32d53b60 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationsQSContainerController.kt @@ -49,7 +49,7 @@ import dagger.Lazy import java.util.function.Consumer import javax.inject.Inject import kotlin.reflect.KMutableProperty0 -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @VisibleForTesting internal const val INSET_DEBOUNCE_MILLIS = 500L diff --git a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt index 6c99282bdcdd..49fa80c02d21 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ShadeControllerSceneImpl.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.delay import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt index ea76ac4b0f83..50b5607f1955 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/interactor/ShadeLockscreenInteractorImpl.kt @@ -28,7 +28,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext class ShadeLockscreenInteractorImpl diff --git a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt index 330f53fc3701..6c44c7315fb9 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/domain/startable/ShadeStartable.kt @@ -41,7 +41,7 @@ import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class ShadeStartable diff --git a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt index bd4ed5b45dc7..5be5ccce7c98 100644 --- a/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/shade/ui/viewmodel/ShadeHeaderViewModel.kt @@ -47,7 +47,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Models UI state for the shade header. */ class ShadeHeaderViewModel diff --git a/packages/SystemUI/src/com/android/systemui/slice/SliceViewManagerExt.kt b/packages/SystemUI/src/com/android/systemui/slice/SliceViewManagerExt.kt index dd7942503211..e6d865150d9d 100644 --- a/packages/SystemUI/src/com/android/systemui/slice/SliceViewManagerExt.kt +++ b/packages/SystemUI/src/com/android/systemui/slice/SliceViewManagerExt.kt @@ -22,7 +22,7 @@ import androidx.slice.SliceViewManager import com.android.systemui.common.coroutine.ConflatedCallbackFlow import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Returns updating [Slice] for a [sliceUri]. It's null when there is no slice available for the diff --git a/packages/SystemUI/src/com/android/systemui/smartspace/ui/binder/SmartspaceViewBinder.kt b/packages/SystemUI/src/com/android/systemui/smartspace/ui/binder/SmartspaceViewBinder.kt index 6c3d7dfc1e4f..59a0e8205123 100644 --- a/packages/SystemUI/src/com/android/systemui/smartspace/ui/binder/SmartspaceViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/smartspace/ui/binder/SmartspaceViewBinder.kt @@ -22,7 +22,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.plugins.BcSmartspaceDataPlugin.SmartspaceView import com.android.systemui.smartspace.ui.viewmodel.SmartspaceViewModel -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds the view and view-model for the smartspace. */ object SmartspaceViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractor.kt index c5f78d2e6dd4..8abe1d329a63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/mediaprojection/domain/interactor/MediaProjectionChipInteractor.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Interactor for media projection events, used to show chips in the status bar for share-to-app and diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/screenrecord/domain/interactor/ScreenRecordChipInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/screenrecord/domain/interactor/ScreenRecordChipInteractor.kt index 28a8385e5f77..9c53cc13f702 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/screenrecord/domain/interactor/ScreenRecordChipInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/screenrecord/domain/interactor/ScreenRecordChipInteractor.kt @@ -32,7 +32,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Interactor for the screen recording chip shown in the status bar. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelper.kt b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelper.kt index 92e72c29519a..c8507093649b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelper.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/chips/ui/viewmodel/ChipTransitionHelper.kt @@ -29,7 +29,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * A class that can help [OngoingActivityChipViewModel] instances with various transition states. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt index b64a577ef77e..e1159220e366 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/MultiDisplayStatusBarStarter.kt @@ -29,7 +29,7 @@ import com.android.systemui.util.kotlin.pairwiseBy import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Responsible for creating and starting the status bar components for each display. Also does it diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt index 5e59745cad29..9619607e5926 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/core/StatusBarOrchestrator.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChangedBy import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Class responsible for managing the lifecycle and state of the status bar. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt index 2506c95ad800..8a2e9392f274 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/PrivacyDotViewController.kt @@ -52,7 +52,7 @@ import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import java.util.concurrent.Executor import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Understands how to keep the persistent privacy dot in the corner of the screen in diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt index 5ff44233bb41..6c7b50a0d155 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/events/SystemStatusAnimationSchedulerImpl.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.first -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withTimeout /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt index 22c537cb93f4..ea515e0c2cf1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationWakeUpCoordinator.kt @@ -49,7 +49,7 @@ import javax.inject.Inject import kotlin.math.max import kotlin.math.min import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class NotificationWakeUpCoordinator diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt index 4e63b920a73d..2fded34a56a0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/LockScreenMinimalismCoordinator.kt @@ -50,7 +50,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * If the setting is enabled, this will track seen notifications and ensure that they only show in diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt index cf1329c6b564..366704e27b9b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/OriginalUnseenKeyguardCoordinator.kt @@ -52,7 +52,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.yield /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt index 1e0e597ad3e8..ef7b1c3d562e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/collection/coordinator/SensitiveContentCoordinator.kt @@ -46,7 +46,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.mapNotNull -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @Module(includes = [PrivateSensitiveContentCoordinatorModule::class]) interface SensitiveContentCoordinatorModule diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationSettingsRepositoryModule.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationSettingsRepositoryModule.kt index d36412cf193e..7d374b051b76 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationSettingsRepositoryModule.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/data/NotificationSettingsRepositoryModule.kt @@ -32,7 +32,7 @@ import dagger.multibindings.ClassKey import dagger.multibindings.IntoMap import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @Module(includes = [SecureSettingsRepositoryModule::class, SystemSettingsRepositoryModule::class]) object NotificationSettingsRepositoryModule { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt index 7f1b04358546..9c5f9a44ad0e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/emptyshade/ui/viewbinder/EmptyShadeViewBinder.kt @@ -21,7 +21,7 @@ import com.android.systemui.statusbar.notification.NotificationActivityStarter import com.android.systemui.statusbar.notification.emptyshade.ui.view.EmptyShadeView import com.android.systemui.statusbar.notification.emptyshade.ui.viewmodel.EmptyShadeViewModel import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object EmptyShadeViewBinder { suspend fun bind( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt index 22bec5a43230..2ec7f532d8c3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt @@ -28,7 +28,7 @@ import com.android.systemui.util.ui.stopAnimating import com.android.systemui.util.ui.value import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [FooterView] to its [view model][FooterViewModel]. */ object FooterViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt index dc6ab4126337..db804835f260 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/IconManager.kt @@ -44,7 +44,7 @@ import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerAlwaysOnDisplayViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerAlwaysOnDisplayViewBinder.kt index 38489f928146..663588c8f8c8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerAlwaysOnDisplayViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerAlwaysOnDisplayViewBinder.kt @@ -30,7 +30,7 @@ import com.android.systemui.statusbar.phone.ScreenOffAnimationController import com.android.systemui.statusbar.ui.SystemBarUtilsState import javax.inject.Inject import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [NotificationIconContainer] to a [NotificationIconContainerAlwaysOnDisplayViewModel]. */ class NotificationIconContainerAlwaysOnDisplayViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerStatusBarViewBinder.kt index 3599f1f51966..f0f529e2c615 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerStatusBarViewBinder.kt @@ -27,7 +27,7 @@ import com.android.systemui.statusbar.phone.NotificationIconContainer import com.android.systemui.statusbar.ui.SystemBarUtilsState import javax.inject.Inject import kotlinx.coroutines.DisposableHandle -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [NotificationIconContainer] to a [NotificationIconContainerStatusBarViewModel]. */ class NotificationIconContainerStatusBarViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt index c8d6abe18ac3..063fe45cd199 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconContainerViewBinder.kt @@ -54,7 +54,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a view-model to a [NotificationIconContainer]. */ object NotificationIconContainerViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/BigPictureIconManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/BigPictureIconManager.kt index 614719aed53d..068f23d4284c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/BigPictureIconManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/BigPictureIconManager.kt @@ -44,7 +44,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext private const val TAG = "BigPicImageLoader" diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ActivatableNotificationViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ActivatableNotificationViewBinder.kt index 2527af87728e..f0b5c3667962 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ActivatableNotificationViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/ActivatableNotificationViewBinder.kt @@ -28,7 +28,7 @@ import com.android.systemui.plugins.FalsingManager import com.android.systemui.statusbar.notification.row.ActivatableNotificationView import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModel import kotlinx.coroutines.awaitCancellation -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds an [ActivatableNotificationView] to its [view model][ActivatableNotificationViewModel]. */ object ActivatableNotificationViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/NotificationViewFlipperBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/NotificationViewFlipperBinder.kt index b42b2b29d944..d7a50a00586a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/NotificationViewFlipperBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ui/viewbinder/NotificationViewFlipperBinder.kt @@ -22,7 +22,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.notification.row.ui.viewmodel.NotificationViewFlipperViewModel import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [NotificationViewFlipper] to its [view model][NotificationViewFlipperViewModel]. */ object NotificationViewFlipperBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt index 15dc1157aa69..0352a304a5c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/shelf/ui/viewbinder/NotificationShelfViewBinder.kt @@ -24,7 +24,7 @@ import com.android.systemui.statusbar.notification.row.ui.viewbinder.Activatable import com.android.systemui.statusbar.notification.shelf.ui.viewmodel.NotificationShelfViewModel import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [NotificationShelf] to its [view model][NotificationShelfViewModel]. */ object NotificationShelfViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerImpl.kt index 534e5c3fda87..53749ff24394 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerImpl.kt @@ -34,7 +34,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext @VisibleForTesting const val UNKNOWN_RANK = -1 diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/HideNotificationsBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/HideNotificationsBinder.kt index c2bc9ba83293..55a2813ab9e7 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/HideNotificationsBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/HideNotificationsBinder.kt @@ -22,7 +22,7 @@ import com.android.systemui.statusbar.notification.stack.ui.viewmodel.Notificati import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.SharingStarted.Companion.Lazily import kotlinx.coroutines.flow.shareIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Binds a [NotificationStackScrollLayoutController] to its [view model][NotificationListViewModel]. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt index ebae235f88d6..787ff024a4d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt @@ -69,7 +69,7 @@ import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a [NotificationStackScrollLayout] to its [view model][NotificationListViewModel]. */ class NotificationListViewBinder diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index b22143f03b44..54b5ca37c43e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -35,7 +35,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.DisposableHandle import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds the shared notification container to its view-model. */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt index a8ce47cf2dd3..49cd7cb4fb8d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/NotificationsPlaceholderViewModel.kt @@ -40,7 +40,7 @@ import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * ViewModel used by the Notification placeholders inside the scene container to update the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt index e2e5c5970ff5..feb74098f071 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ui/viewbinder/HeadsUpNotificationViewBinder.kt @@ -27,7 +27,7 @@ import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class HeadsUpNotificationViewBinder @Inject 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 a34ac2e11c2e..3242149eed92 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBypassController.kt @@ -47,7 +47,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @SysUISingleton class KeyguardBypassController @Inject constructor( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHideIconsForBouncerManager.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHideIconsForBouncerManager.kt index fa6d2797a37e..98da5b19976d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHideIconsForBouncerManager.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarHideIconsForBouncerManager.kt @@ -11,7 +11,7 @@ import com.android.systemui.statusbar.CommandQueue import com.android.systemui.statusbar.window.StatusBarWindowStateController import com.android.systemui.util.concurrency.DelayableExecutor import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import java.io.PrintWriter import javax.inject.Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt index c40822d71952..c341bd3466ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusOverlayHoverListener.kt @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class StatusOverlayHoverListenerFactory @Inject diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt index 31c213434abf..7d36873db10d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/SystemUIBottomSheetDialog.kt @@ -42,7 +42,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** A dialog shown as a bottom sheet. */ class SystemUIBottomSheetDialog diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index 3cf8c3f48409..aac2cd1755d0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -58,7 +58,7 @@ import java.io.PrintWriter import java.util.concurrent.Executor import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** A controller to handle the ongoing call chip in the collapsed status bar. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigCoreStartable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigCoreStartable.kt index af58999d9ddf..428d16a1a175 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigCoreStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigCoreStartable.kt @@ -20,7 +20,7 @@ import com.android.systemui.CoreStartable import com.android.systemui.dagger.qualifiers.Application import javax.inject.Inject import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Core startable which configures the [CarrierConfigRepository] to listen for updates for the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt index 3a79f3fb3573..bb9310f5369a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/demo/DemoMobileConnectionsRepository.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** This repository vends out data based on demo mode commands */ @OptIn(ExperimentalCoroutinesApi::class) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt index 5a49f8eb8f3b..30cc2c5da994 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt @@ -27,7 +27,7 @@ import java.io.PrintWriter import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * This class is intended to provide a context to collect on the diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt index 5f08afdee74a..31d349eb4cca 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconBinder.kt @@ -48,7 +48,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarViewBin import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch private data class Colors( @ColorInt val tint: Int, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt index fc0ba131c457..f24f7d0bd339 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/MobileIconsBinder.kt @@ -23,7 +23,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.phone.ui.IconManager import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object MobileIconsBinder { /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/ShadeCarrierBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/ShadeCarrierBinder.kt index 081e1015e26e..5c80fda72373 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/ShadeCarrierBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/binder/ShadeCarrierBinder.kt @@ -22,7 +22,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.ShadeCarrierGroupMobileIconViewModel import com.android.systemui.util.AutoMarqueeTextView -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object ShadeCarrierBinder { /** Binds the view to the view-model, continuing to update the former based on the latter */ 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 694a5e529ec4..2efbfbbf78c8 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 @@ -41,7 +41,7 @@ import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * View model for describing the system's current mobile cellular connections. The result is a list diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/demo/DemoDeviceBasedSatelliteRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/demo/DemoDeviceBasedSatelliteRepository.kt index 6ad295e82645..d557bbf306a6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/demo/DemoDeviceBasedSatelliteRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/demo/DemoDeviceBasedSatelliteRepository.kt @@ -24,7 +24,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** A satellite repository that represents the latest satellite values sent via demo mode. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt index 470abe63b568..7686338fd9eb 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImpl.kt @@ -66,7 +66,7 @@ import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/binder/DeviceBasedSatelliteIconBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/binder/DeviceBasedSatelliteIconBinder.kt index 59ac5f29b66c..fd9037e182b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/binder/DeviceBasedSatelliteIconBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/satellite/ui/binder/DeviceBasedSatelliteIconBinder.kt @@ -23,7 +23,7 @@ import com.android.systemui.common.ui.binder.IconViewBinder import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModel import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewBinding import com.android.systemui.statusbar.pipeline.shared.ui.view.SingleBindableStatusBarIconView -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch object DeviceBasedSatelliteIconBinder { fun bind( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt index 8d7b57db4125..11d73397ca22 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/HomeStatusBarViewBinder.kt @@ -36,7 +36,7 @@ import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.VisibilityModel import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Interface to assist with binding the [CollapsedStatusBarFragment] to [HomeStatusBarViewModel]. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/InternetTileBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/InternetTileBinder.kt index 189dc40d275f..79757ca429d6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/InternetTileBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/binder/InternetTileBinder.kt @@ -22,7 +22,7 @@ import androidx.lifecycle.repeatOnLifecycle import com.android.systemui.statusbar.pipeline.shared.ui.model.InternetTileModel import java.util.function.Consumer import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Binds an [InternetTileModel] flow to a consumer for the internet tile to apply to its qs state diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt index a21cc22ad03f..4684f61e13a2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/composable/StatusBarRoot.kt @@ -43,7 +43,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarVie import com.android.systemui.statusbar.pipeline.shared.ui.binder.StatusBarVisibilityChangeListener import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Factory to simplify the dependency management for [StatusBarRoot] */ class StatusBarRootFactory diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarIconView.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarIconView.kt index c663c37fec98..90a2e2047d16 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarIconView.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ui/view/SingleBindableStatusBarIconView.kt @@ -36,7 +36,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarV import com.android.systemui.statusbar.pipeline.shared.ui.binder.ModernStatusBarViewVisibilityHelper import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Simple single-icon view that is bound to bindable_status_bar_icon.xml */ class SingleBindableStatusBarIconView( diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/demo/DemoWifiRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/demo/DemoWifiRepository.kt index f4bb1a34b05f..5d879ddc4ddd 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/demo/DemoWifiRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/data/repository/demo/DemoWifiRepository.kt @@ -29,7 +29,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Demo-able wifi repository to support SystemUI demo mode commands. */ class DemoWifiRepository diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt index 2800c9404c4b..64447fd72557 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/WifiUiAdapter.kt @@ -28,7 +28,7 @@ import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWi import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.LocationBasedWifiViewModel.Companion.viewModelForLocation import com.android.systemui.statusbar.pipeline.wifi.ui.viewmodel.WifiViewModel import javax.inject.Inject -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * This class serves as a bridge between the old UI classes and the new data pipeline. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt index 95124905e576..fd93c6bd09b8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/wifi/ui/binder/WifiViewBinder.kt @@ -39,7 +39,7 @@ import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.awaitCancellation import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Binds a wifi icon in the status bar to its view-model. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModesCleanupStartable.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModesCleanupStartable.kt index 32b476b07d90..b966cb17ad17 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModesCleanupStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ZenModesCleanupStartable.kt @@ -24,7 +24,7 @@ import com.android.systemui.modes.shared.ModesUi import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/bluetooth/BluetoothRepository.kt b/packages/SystemUI/src/com/android/systemui/statusbar/policy/bluetooth/BluetoothRepository.kt index 96717c7542d5..5c1a4279ea90 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/bluetooth/BluetoothRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/bluetooth/BluetoothRepository.kt @@ -24,7 +24,7 @@ import com.android.systemui.dagger.qualifiers.Background import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt index 6988e211855b..39ec676ed5cc 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/ui/binder/KeyguardStatusBarViewBinder.kt @@ -23,7 +23,7 @@ import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.phone.KeyguardStatusBarView import com.android.systemui.statusbar.ui.viewmodel.KeyguardStatusBarViewModel import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds [KeyguardStatusBarViewModel] to [KeyguardStatusBarView]. */ object KeyguardStatusBarViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/domain/interactor/TouchpadGesturesInteractor.kt b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/domain/interactor/TouchpadGesturesInteractor.kt index 80ea925eabc7..9dafba139bf7 100644 --- a/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/domain/interactor/TouchpadGesturesInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/touchpad/tutorial/domain/interactor/TouchpadGesturesInteractor.kt @@ -21,7 +21,7 @@ import com.android.systemui.model.SysUiState import com.android.systemui.settings.DisplayTracker import com.android.systemui.shared.system.QuickStepContract import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class TouchpadGesturesInteractor( private val sysUiState: SysUiState, diff --git a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt index d4686e28ce5f..dccd5900963c 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/DisplaySwitchLatencyTracker.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withTimeout /** @@ -86,7 +86,7 @@ constructor( if (!isDeviceFoldable(context.resources, deviceStateManager)) { return } - applicationScope.launch(backgroundDispatcher) { + applicationScope.launch(context = backgroundDispatcher) { deviceStateRepository.state .pairwise() .filter { diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt index c5e98a1f1c02..ecc2f18c7bcd 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/FoldLightRevealOverlayAnimation.kt @@ -54,7 +54,7 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withTimeout @@ -95,7 +95,7 @@ constructor( ) controller.init() - applicationScope.launch(bgDispatcher) { + applicationScope.launch(context = bgDispatcher) { powerInteractor.screenPowerState.collect { if (it == ScreenPowerState.SCREEN_ON) { readyCallback = null @@ -103,7 +103,7 @@ constructor( } } - applicationScope.launch(bgDispatcher) { + applicationScope.launch(context = bgDispatcher) { deviceStateRepository.state .map { it == DeviceStateRepository.DeviceState.FOLDED } .distinctUntilChanged() diff --git a/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt b/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt index a92137766c49..7705205e83e2 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/FullscreenLightRevealAnimation.kt @@ -51,7 +51,7 @@ import java.util.concurrent.Executor import java.util.function.Consumer import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.asCoroutineDispatcher -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch interface FullscreenLightRevealAnimation { fun init() @@ -106,7 +106,7 @@ constructor( rotationChangeProvider.addCallback(rotationWatcher) buildSurface { builder -> - applicationScope.launch(executor.asCoroutineDispatcher()) { + applicationScope.launch(context = executor.asCoroutineDispatcher()) { val overlayContainer = builder.build() SurfaceControl.Transaction() diff --git a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt index a6224dcec13f..65970978b4ec 100644 --- a/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/unfold/UnfoldTraceLogger.kt @@ -29,7 +29,7 @@ import com.android.systemui.util.Utils.isDeviceFoldable import javax.inject.Inject import kotlin.coroutines.CoroutineContext import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.plus /** diff --git a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt index 7bf9efa78142..493aa8c11b18 100644 --- a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserRepository.kt @@ -53,7 +53,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext diff --git a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserSwitcherRepository.kt b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserSwitcherRepository.kt index 1238789389ee..a7983605eac9 100644 --- a/packages/SystemUI/src/com/android/systemui/user/data/repository/UserSwitcherRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/user/data/repository/UserSwitcherRepository.kt @@ -40,7 +40,7 @@ import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext interface UserSwitcherRepository { diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt index 0a1724c189c8..9b9eb0778dd2 100644 --- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/GuestUserInteractor.kt @@ -41,7 +41,7 @@ import com.android.systemui.user.domain.model.ShowDialogRequestModel import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/RefreshUsersScheduler.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/RefreshUsersScheduler.kt index 8f36821a955e..b0eb0fba7dd9 100644 --- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/RefreshUsersScheduler.kt +++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/RefreshUsersScheduler.kt @@ -26,7 +26,7 @@ import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.delay -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Encapsulates logic for pausing, unpausing, and scheduling a delayed job. */ @SysUISingleton @@ -41,7 +41,7 @@ constructor( private var isPaused = false fun pause() { - applicationScope.launch(mainDispatcher) { + applicationScope.launch(context = mainDispatcher) { isPaused = true scheduledUnpauseJob?.cancel() scheduledUnpauseJob = @@ -53,14 +53,14 @@ constructor( } fun unpauseAndRefresh() { - applicationScope.launch(mainDispatcher) { + applicationScope.launch(context = mainDispatcher) { isPaused = false refreshIfNotPaused() } } fun refreshIfNotPaused() { - applicationScope.launch(mainDispatcher) { + applicationScope.launch(context = mainDispatcher) { if (isPaused) { return@launch } diff --git a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt index 516cb46ec6ee..3662c78efb16 100644 --- a/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/user/domain/interactor/UserSwitcherInteractor.kt @@ -81,7 +81,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/binder/StatusBarUserChipViewBinder.kt b/packages/SystemUI/src/com/android/systemui/user/ui/binder/StatusBarUserChipViewBinder.kt index 8e40f68e27e9..bd230cdac221 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/binder/StatusBarUserChipViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/binder/StatusBarUserChipViewBinder.kt @@ -27,7 +27,7 @@ import com.android.systemui.statusbar.phone.userswitcher.StatusBarUserSwitcherCo import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel import kotlinx.coroutines.InternalCoroutinesApi import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @OptIn(InternalCoroutinesApi::class) object StatusBarUserChipViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt index c57870291055..edf00e9c80bb 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/binder/UserSwitcherViewBinder.kt @@ -44,7 +44,7 @@ import com.android.systemui.user.ui.viewmodel.UserActionViewModel import com.android.systemui.user.ui.viewmodel.UserSwitcherViewModel import com.android.systemui.util.children import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Binds a user switcher to its view-model. */ object UserSwitcherViewBinder { diff --git a/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitcherDialogCoordinator.kt b/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitcherDialogCoordinator.kt index 2d41f32efbe7..102fcc0c59f2 100644 --- a/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitcherDialogCoordinator.kt +++ b/packages/SystemUI/src/com/android/systemui/user/ui/dialog/UserSwitcherDialogCoordinator.kt @@ -41,7 +41,7 @@ import javax.inject.Inject import javax.inject.Provider import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.filterNotNull -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Coordinates dialogs for user switcher logic. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/Flow.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/Flow.kt index bb907cc0055e..7e7527ea4be3 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/Flow.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/Flow.kt @@ -33,7 +33,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Returns a new [Flow] that combines the two most recent emissions from [this] using [transform]. @@ -168,7 +168,7 @@ fun Flow.sample(other: Flow, transform: suspend (A, B) -> C): Fl coroutineScope { val noVal = Any() val sampledRef = AtomicReference(noVal) - val job = launch(Dispatchers.Unconfined) { other.collect { sampledRef.set(it) } } + val job = launch(context = Dispatchers.Unconfined) { other.collect { sampledRef.set(it) } } collect { val sampled = sampledRef.get() if (sampled != noVal) { diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt index 7f90242fee2e..315912406b6d 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/JavaAdapter.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** A class allowing Java classes to collect on Kotlin flows. */ @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/Parallel.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/Parallel.kt index a47a2d67070f..0b77e8f0c552 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/Parallel.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/Parallel.kt @@ -16,7 +16,7 @@ package com.android.systemui.util.kotlin import kotlinx.coroutines.CoroutineStart -import kotlinx.coroutines.async +import com.android.app.tracing.coroutines.asyncTraced as async import kotlinx.coroutines.awaitAll import kotlinx.coroutines.coroutineScope diff --git a/packages/SystemUI/src/com/android/systemui/util/kotlin/Suspend.kt b/packages/SystemUI/src/com/android/systemui/util/kotlin/Suspend.kt index 2e551f1e1bee..991c73e2d7fd 100644 --- a/packages/SystemUI/src/com/android/systemui/util/kotlin/Suspend.kt +++ b/packages/SystemUI/src/com/android/systemui/util/kotlin/Suspend.kt @@ -18,7 +18,7 @@ package com.android.systemui.util.kotlin import kotlinx.coroutines.CompletableDeferred import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Runs the given [blocks] in parallel, returning the result of the first one to complete, and 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 ea8709f7d65c..5d0b0d55e1f6 100644 --- a/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt +++ b/packages/SystemUI/src/com/android/systemui/util/settings/SettingsProxy.kt @@ -26,7 +26,7 @@ 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 +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** 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 c5deca214e28..4b03df6b0070 100644 --- a/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt +++ b/packages/SystemUI/src/com/android/systemui/util/settings/UserSettingsProxy.kt @@ -29,7 +29,7 @@ import com.android.systemui.util.settings.SettingsProxy.Companion.parseFloatOrTh import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrThrow import com.android.systemui.util.settings.SettingsProxy.Companion.parseLongOrUseDefault import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeControllerAdapter.kt b/packages/SystemUI/src/com/android/systemui/volume/VolumeControllerAdapter.kt index e8367315c3c9..f56c0b98dde4 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeControllerAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeControllerAdapter.kt @@ -23,7 +23,7 @@ import com.android.systemui.dagger.qualifiers.Application import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * This class is a bridge between diff --git a/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt index 4b7a9782cc6b..1a198067c572 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/dialog/VolumeDialogPlugin.kt @@ -23,7 +23,7 @@ import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class VolumeDialogPlugin @Inject diff --git a/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioSharingInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioSharingInteractor.kt index 9aed8ab8f2e2..293be94638db 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioSharingInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/domain/interactor/AudioSharingInteractor.kt @@ -38,7 +38,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext interface AudioSharingInteractor { diff --git a/packages/SystemUI/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartable.kt b/packages/SystemUI/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartable.kt index 12447577e945..5c5011057db6 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartable.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/domain/startable/AudioModeLoggerStartable.kt @@ -24,7 +24,7 @@ import com.android.systemui.volume.panel.ui.VolumePanelUiEvent import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.distinctUntilChanged -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Logger for audio mode */ @VolumePanelScope diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/ui/viewmodel/CaptioningViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/ui/viewmodel/CaptioningViewModel.kt index 9e708433dfbf..b946ea8f79e9 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/ui/viewmodel/CaptioningViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/captioning/ui/viewmodel/CaptioningViewModel.kt @@ -30,7 +30,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Volume Panel captioning UI model. */ @VolumePanelScope diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaControllerInteractor.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaControllerInteractor.kt index a714f8078db7..dacd6c78b034 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaControllerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaControllerInteractor.kt @@ -30,7 +30,7 @@ import javax.inject.Inject import kotlinx.coroutines.channels.ProducerScope import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch interface MediaControllerInteractor { diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt index 324579d1ee04..7ebc76dc2b95 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/spatial/ui/viewmodel/SpatialAudioViewModel.kt @@ -35,7 +35,7 @@ import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @VolumePanelScope class SpatialAudioViewModel diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt index 2aa1ac99a400..1f44451f0cb4 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/AudioStreamSliderViewModel.kt @@ -48,7 +48,7 @@ import kotlinx.coroutines.flow.filterNotNull import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** Models a particular slider state. */ class AudioStreamSliderViewModel diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt index 10714d1f41af..bb849cb1333e 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/slider/ui/viewmodel/CastVolumeSliderViewModel.kt @@ -31,7 +31,7 @@ import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.mapNotNull import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch class CastVolumeSliderViewModel @AssistedInject diff --git a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt index 45732deb9aa6..96afbc1feaaf 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/volume/panel/component/volume/ui/viewmodel/AudioVolumeComponentViewModel.kt @@ -45,7 +45,7 @@ import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Controls the behaviour of the whole audio diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt index 09b1f45f179b..e3e08e8de6c8 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualLocationsService.kt @@ -14,7 +14,7 @@ import com.android.systemui.flags.Flags import javax.inject.Inject import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch /** * Serves as an intermediary between QuickAccessWalletService and ContextualCardManager (in PCC). @@ -44,7 +44,7 @@ constructor( override fun onBind(intent: Intent): IBinder { super.onBind(intent) if (registerNewWalletCardInBackground()) { - scope.launch(backgroundDispatcher) { + scope.launch(context = backgroundDispatcher) { controller.allWalletCards.collect { cards -> val cardsSize = cards.size Log.i(TAG, "Number of cards registered $cardsSize") diff --git a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt index eb4ff1722dcc..af84e4eaf0c5 100644 --- a/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt +++ b/packages/SystemUI/src/com/android/systemui/wallet/controller/WalletContextualSuggestionsController.kt @@ -43,7 +43,7 @@ import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.update -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch @OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt index efdd98d5498a..0f6e96066cd3 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt @@ -51,7 +51,7 @@ import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.onStart import kotlinx.coroutines.flow.stateIn -import kotlinx.coroutines.launch +import com.android.app.tracing.coroutines.launchTraced as launch import kotlinx.coroutines.withContext /** A repository storing information about the current wallpaper. */ -- GitLab From 7351dd7183db247f5fd8ab14bc798f3107d4bdd2 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Wed, 23 Oct 2024 15:19:20 -0700 Subject: [PATCH 345/459] Put PIC nonces in shared memory PropertyInvalidatedCache (PIC) has used system properties to exchange cache nonces between server and client. System properties have become a performance bottleneck, so this changes PIC to use shared memory for the nonces instead. BYPASS_LARGE_CHANGE_WARNING Flag: android.app.pic_uses_shared_memory Bug: 360897450 Test: atest * FrameworksCoreTests:PropertyInvalidatedCacheTests * FrameworksCoreTests:IpcDataCacheTest * CtsOsTestCases:IpcDataCacheTest * ApplicationSharedMemoryTest32 Change-Id: I23ffa5f24a745f5f2425ff390fc131f6ddc2b8f4 --- .../android/app/PropertyInvalidatedCache.java | 484 +++++++++++++++++- core/java/android/app/performance.aconfig | 11 + .../internal/os/ApplicationSharedMemory.java | 31 ++ core/jni/Android.bp | 1 + core/jni/AndroidRuntime.cpp | 2 + .../android_app_PropertyInvalidatedCache.cpp | 119 +++++ .../android_app_PropertyInvalidatedCache.h | 146 ++++++ ...id_internal_os_ApplicationSharedMemory.cpp | 24 +- .../app/PropertyInvalidatedCacheTests.java | 63 +++ 9 files changed, 862 insertions(+), 19 deletions(-) create mode 100644 core/java/android/app/performance.aconfig create mode 100644 core/jni/android_app_PropertyInvalidatedCache.cpp create mode 100644 core/jni/android_app_PropertyInvalidatedCache.h diff --git a/core/java/android/app/PropertyInvalidatedCache.java b/core/java/android/app/PropertyInvalidatedCache.java index c93a6dd8969e..bc9e709420f1 100644 --- a/core/java/android/app/PropertyInvalidatedCache.java +++ b/core/java/android/app/PropertyInvalidatedCache.java @@ -30,16 +30,23 @@ import android.os.ParcelFileDescriptor; import android.os.Process; import android.os.SystemClock; import android.os.SystemProperties; +import android.util.ArrayMap; import android.util.Log; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; +import com.android.internal.os.ApplicationSharedMemory; import com.android.internal.os.BackgroundThread; +import dalvik.annotation.optimization.CriticalNative; +import dalvik.annotation.optimization.FastNative; + import java.io.ByteArrayOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashMap; @@ -203,19 +210,14 @@ public class PropertyInvalidatedCache { }; /** - * Verify that the property name conforms to the standard. Log a warning if this is not true. - * Note that this is done once in the cache constructor; it does not have to be very fast. + * Verify that the property name conforms to the standard and throw if this is not true. Note + * that this is done only once for a given property name; it does not have to be very fast. */ - private void validateCacheKey(String name) { - if (Build.IS_USER) { - // Do not bother checking keys in user builds. The keys will have been tested in - // eng/userdebug builds already. - return; - } + private static void throwIfInvalidCacheKey(String name) { for (int i = 0; i < sValidKeyPrefix.length; i++) { if (name.startsWith(sValidKeyPrefix[i])) return; } - Log.w(TAG, "invalid cache name: " + name); + throw new IllegalArgumentException("invalid cache name: " + name); } /** @@ -234,7 +236,8 @@ public class PropertyInvalidatedCache { * reserved values cause the cache to be skipped. */ // This is the initial value of all cache keys. It is changed when a cache is invalidated. - private static final int NONCE_UNSET = 0; + @VisibleForTesting + static final int NONCE_UNSET = 0; // This value is used in two ways. First, it is used internally to indicate that the cache is // disabled for the current query. Secondly, it is used to globally disable the cache across // the entire system. Once a cache is disabled, there is no way to enable it again. The @@ -684,6 +687,77 @@ public class PropertyInvalidatedCache { } } + /** + * Manage nonces that are stored in shared memory. + */ + private static final class NonceSharedMem extends NonceHandler { + // The shared memory. + private volatile NonceStore mStore; + + // The index of the nonce in shared memory. + private volatile int mHandle = NonceStore.INVALID_NONCE_INDEX; + + // True if the string has been stored, ever. + private volatile boolean mRecorded = false; + + // A short name that is saved in shared memory. This is the portion of the property name + // that follows the prefix. + private final String mShortName; + + NonceSharedMem(@NonNull String name, @Nullable String prefix) { + super(name); + if ((prefix != null) && name.startsWith(prefix)) { + mShortName = name.substring(prefix.length()); + } else { + mShortName = name; + } + } + + // Fetch the nonce from shared memory. If the shared memory is not available, return + // UNSET. If the shared memory is available but the nonce name is not known (it may not + // have been invalidated by the server yet), return UNSET. + @Override + long getNonceInternal() { + if (mHandle == NonceStore.INVALID_NONCE_INDEX) { + if (mStore == null) { + mStore = NonceStore.getInstance(); + if (mStore == null) { + return NONCE_UNSET; + } + } + mHandle = mStore.getHandleForName(mShortName); + if (mHandle == NonceStore.INVALID_NONCE_INDEX) { + return NONCE_UNSET; + } + } + return mStore.getNonce(mHandle); + } + + // Set the nonce in shared mmory. If the shared memory is not available, throw an + // exception. Otherwise, if the nonce name has never been recorded, record it now and + // fetch the handle for the name. If the handle cannot be created, throw an exception. + @Override + void setNonceInternal(long value) { + if (mHandle == NonceStore.INVALID_NONCE_INDEX || !mRecorded) { + if (mStore == null) { + mStore = NonceStore.getInstance(); + if (mStore == null) { + throw new IllegalStateException("setNonce: shared memory not ready"); + } + } + // Always store the name before fetching the handle. storeName() is idempotent + // but does take a little time, so this code calls it just once. + mStore.storeName(mShortName); + mRecorded = true; + mHandle = mStore.getHandleForName(mShortName); + if (mHandle == NonceStore.INVALID_NONCE_INDEX) { + throw new IllegalStateException("setNonce: shared memory store failed"); + } + } + mStore.setNonce(mHandle, value); + } + } + /** * SystemProperties and shared storage are protected and cannot be written by random * processes. So, for testing purposes, the NonceLocal handler stores the nonce locally. The @@ -712,6 +786,7 @@ public class PropertyInvalidatedCache { * Complete key prefixes. */ private static final String PREFIX_TEST = CACHE_KEY_PREFIX + "." + MODULE_TEST + "."; + private static final String PREFIX_SYSTEM = CACHE_KEY_PREFIX + "." + MODULE_SYSTEM + "."; /** * A static list of nonce handlers, indexed by name. NonceHandlers can be safely shared by @@ -722,16 +797,32 @@ public class PropertyInvalidatedCache { private static final ConcurrentHashMap sHandlers = new ConcurrentHashMap<>(); + // True if shared memory is flag-enabled, false otherwise. Read the flags exactly once. + private static final boolean sSharedMemoryAvailable = + com.android.internal.os.Flags.applicationSharedMemoryEnabled() + && android.app.Flags.picUsesSharedMemory(); + + // Return true if this cache can use shared memory for its nonce. Shared memory may be used + // if the module is the system. + private static boolean sharedMemoryOkay(@NonNull String name) { + return sSharedMemoryAvailable && name.startsWith(PREFIX_SYSTEM); + } + /** - * Return the proper nonce handler, based on the property name. + * Return the proper nonce handler, based on the property name. A handler is created if + * necessary. Before a handler is created, the name is checked, and an exception is thrown if + * the name is not valid. */ private static NonceHandler getNonceHandler(@NonNull String name) { NonceHandler h = sHandlers.get(name); if (h == null) { synchronized (sGlobalLock) { + throwIfInvalidCacheKey(name); h = sHandlers.get(name); if (h == null) { - if (name.startsWith(PREFIX_TEST)) { + if (sharedMemoryOkay(name)) { + h = new NonceSharedMem(name, PREFIX_SYSTEM); + } else if (name.startsWith(PREFIX_TEST)) { h = new NonceLocal(name); } else { h = new NonceSysprop(name); @@ -774,7 +865,6 @@ public class PropertyInvalidatedCache { public PropertyInvalidatedCache(int maxEntries, @NonNull String propertyName, @NonNull String cacheName) { mPropertyName = propertyName; - validateCacheKey(mPropertyName); mCacheName = cacheName; mNonce = getNonceHandler(mPropertyName); mMaxEntries = maxEntries; @@ -799,7 +889,6 @@ public class PropertyInvalidatedCache { public PropertyInvalidatedCache(int maxEntries, @NonNull String module, @NonNull String api, @NonNull String cacheName, @NonNull QueryHandler computer) { mPropertyName = createPropertyName(module, api); - validateCacheKey(mPropertyName); mCacheName = cacheName; mNonce = getNonceHandler(mPropertyName); mMaxEntries = maxEntries; @@ -1620,6 +1709,14 @@ public class PropertyInvalidatedCache { // then only that cache is reported. boolean detail = anyDetailed(args); + if (sSharedMemoryAvailable) { + pw.println(" SharedMemory: enabled"); + NonceStore.getInstance().dump(pw, " ", detail); + } else { + pw.println(" SharedMemory: disabled"); + } + pw.println(); + ArrayList activeCaches = getActiveCaches(); for (int i = 0; i < activeCaches.size(); i++) { PropertyInvalidatedCache currentCache = activeCaches.get(i); @@ -1654,4 +1751,363 @@ public class PropertyInvalidatedCache { Log.e(TAG, "Failed to dump PropertyInvalidatedCache instances"); } } + + /** + * Nonces in shared memory are supported by a string block that acts as a table of contents + * for nonce names, and an array of nonce values. There are two key design principles with + * respect to nonce maps: + * + * 1. It is always okay if a nonce value cannot be determined. If the nonce is UNSET, the + * cache is bypassed, which is always functionally correct. Clients do not take extraordinary + * measures to be current with the nonce map. Clients must be current with the nonce itself; + * this is achieved through the shared memory. + * + * 2. Once a name is mapped to a nonce index, the mapping is fixed for the lifetime of the + * system. It is only necessary to distinguish between the unmapped and mapped states. Once + * a client has mapped a nonce, that mapping is known to be good for the lifetime of the + * system. + * @hide + */ + @VisibleForTesting + public static class NonceStore { + + // A lock for the store. + private final Object mLock = new Object(); + + // The native pointer. This is not owned by this class. It is owned by + // ApplicationSharedMemory, and it disappears when the owning instance is closed. + private final long mPtr; + + // True if the memory is immutable. + private final boolean mMutable; + + // The maximum length of a string in the string block. The maximum length must fit in a + // byte, but a smaller value has been chosen to limit memory use. Because strings are + // run-length encoded, a string consumes at most MAX_STRING_LENGTH+1 bytes in the string + // block. + private static final int MAX_STRING_LENGTH = 63; + + // The raw byte block. Strings are stored as run-length encoded byte arrays. The first + // byte is the length of the following string. It is an axiom of the system that the + // string block is initially all zeros and that it is write-once memory: new strings are + // appended to existing strings, so there is never a need to revisit strings that have + // already been pulled from the string block. + @GuardedBy("mLock") + private final byte[] mStringBlock; + + // The expected hash code of the string block. If the hash over the string block equals + // this value, then the string block is valid. Otherwise, the block is not valid and + // should be re-read. An invalid block generally means that a client has read the shared + // memory while the server was still writing it. + @GuardedBy("mLock") + private int mBlockHash = 0; + + // The number of nonces that the native layer can hold. This is maintained for debug and + // logging. + private final int mMaxNonce; + + /** @hide */ + @VisibleForTesting + public NonceStore(long ptr, boolean mutable) { + mPtr = ptr; + mMutable = mutable; + mStringBlock = new byte[nativeGetMaxByte(ptr)]; + mMaxNonce = nativeGetMaxNonce(ptr); + refreshStringBlockLocked(); + } + + // The static lock for singleton acquisition. + private static Object sLock = new Object(); + + // NonceStore is supposed to be a singleton. + private static NonceStore sInstance; + + // Return the singleton instance. + static NonceStore getInstance() { + synchronized (sLock) { + if (sInstance == null) { + try { + ApplicationSharedMemory shmem = ApplicationSharedMemory.getInstance(); + sInstance = (shmem == null) + ? null + : new NonceStore(shmem.getSystemNonceBlock(), + shmem.isMutable()); + } catch (IllegalStateException e) { + // ApplicationSharedMemory.getInstance() throws if the shared memory is + // not yet mapped. Swallow the exception and leave sInstance null. + } + } + return sInstance; + } + } + + // The index value of an unmapped name. + public static final int INVALID_NONCE_INDEX = -1; + + // The highest string index extracted from the string block. -1 means no strings have + // been seen. This is used to skip strings that have already been processed, when the + // string block is updated. + @GuardedBy("mLock") + private int mHighestIndex = -1; + + // The number bytes of the string block that has been used. This is a statistics. + @GuardedBy("mLock") + private int mStringBytes = 0; + + // The number of partial reads on the string block. This is a statistic. + @GuardedBy("mLock") + private int mPartialReads = 0; + + // The number of times the string block was updated. This is a statistic. + @GuardedBy("mLock") + private int mStringUpdated = 0; + + // Map a string to a native index. + @GuardedBy("mLock") + private final ArrayMap mStringHandle = new ArrayMap<>(); + + // Update the string map from the current string block. The string block is not modified + // and the block hash is not checked. The function skips past strings that have already + // been read, and then processes any new strings. + @GuardedBy("mLock") + private void updateStringMapLocked() { + int index = 0; + int offset = 0; + while (offset < mStringBlock.length && mStringBlock[offset] != 0) { + if (index > mHighestIndex) { + // Only record the string if it has not been seen yet. + final String s = new String(mStringBlock, offset+1, mStringBlock[offset]); + mStringHandle.put(s, index); + mHighestIndex = index; + } + offset += mStringBlock[offset] + 1; + index++; + } + mStringBytes = offset; + } + + // Append a string to the string block and update the hash. This does not write the block + // to shared memory. + @GuardedBy("mLock") + private void appendStringToMapLocked(@NonNull String str) { + int offset = 0; + while (offset < mStringBlock.length && mStringBlock[offset] != 0) { + offset += mStringBlock[offset] + 1; + } + final byte[] strBytes = str.getBytes(); + + if (offset + strBytes.length >= mStringBlock.length) { + // Overflow. Do not add the string to the block; the string will remain undefined. + return; + } + + mStringBlock[offset] = (byte) strBytes.length; + offset++; + for (int i = 0; i < strBytes.length; i++, offset++) { + mStringBlock[offset] = strBytes[i]; + } + mBlockHash = Arrays.hashCode(mStringBlock); + } + + // Possibly update the string block. If the native shared memory has a new block hash, + // then read the new string block values from shared memory, as well as the new hash. + @GuardedBy("mLock") + private void refreshStringBlockLocked() { + if (mBlockHash == nativeGetByteBlockHash(mPtr)) { + // The fastest way to know that the shared memory string block has not changed. + return; + } + final int hash = nativeGetByteBlock(mPtr, mBlockHash, mStringBlock); + if (hash != Arrays.hashCode(mStringBlock)) { + // This is a partial read: ignore it. The next time someone needs this string + // the memory will be read again and should succeed. Set the local hash to + // zero to ensure that the next read attempt will actually read from shared + // memory. + mBlockHash = 0; + mPartialReads++; + return; + } + // The hash has changed. Update the strings from the byte block. + mStringUpdated++; + mBlockHash = hash; + updateStringMapLocked(); + } + + // Throw an exception if the string cannot be stored in the string block. + private static void throwIfBadString(@NonNull String s) { + if (s.length() == 0) { + throw new IllegalArgumentException("cannot store an empty string"); + } + if (s.length() > MAX_STRING_LENGTH) { + throw new IllegalArgumentException("cannot store a string longer than " + + MAX_STRING_LENGTH); + } + } + + // Throw an exception if the nonce handle is invalid. The handle is bad if it is out of + // range of allocated handles. Note that NONCE_HANDLE_INVALID will throw: this is + // important for setNonce(). + @GuardedBy("mLock") + private void throwIfBadHandle(int handle) { + if (handle < 0 || handle > mHighestIndex) { + throw new IllegalArgumentException("invalid nonce handle: " + handle); + } + } + + // Throw if the memory is immutable (the process does not have write permission). The + // exception mimics the permission-denied exception thrown when a process writes to an + // unauthorized system property. + private void throwIfImmutable() { + if (!mMutable) { + throw new RuntimeException("write permission denied"); + } + } + + // Add a string to the local copy of the block and write the block to shared memory. + // Return the index of the new string. If the string has already been recorded, the + // shared memory is not updated but the index of the existing string is returned. + public int storeName(@NonNull String str) { + synchronized (mLock) { + Integer handle = mStringHandle.get(str); + if (handle == null) { + throwIfImmutable(); + throwIfBadString(str); + appendStringToMapLocked(str); + nativeSetByteBlock(mPtr, mBlockHash, mStringBlock); + updateStringMapLocked(); + handle = mStringHandle.get(str); + } + return handle; + } + } + + // Retrieve the handle for a string. -1 is returned if the string is not found. + public int getHandleForName(@NonNull String str) { + synchronized (mLock) { + Integer handle = mStringHandle.get(str); + if (handle == null) { + refreshStringBlockLocked(); + handle = mStringHandle.get(str); + } + return (handle != null) ? handle : INVALID_NONCE_INDEX; + } + } + + // Thin wrapper around the native method. + public boolean setNonce(int handle, long value) { + synchronized (mLock) { + throwIfBadHandle(handle); + throwIfImmutable(); + return nativeSetNonce(mPtr, handle, value); + } + } + + public long getNonce(int handle) { + synchronized (mLock) { + throwIfBadHandle(handle); + return nativeGetNonce(mPtr, handle); + } + } + + /** + * Dump the nonce statistics + */ + public void dump(@NonNull PrintWriter pw, @NonNull String prefix, boolean detailed) { + synchronized (mLock) { + pw.println(formatSimple( + "%sStringsMapped: %d, BytesUsed: %d", + prefix, mHighestIndex, mStringBytes)); + pw.println(formatSimple( + "%sPartialReads: %d, StringUpdates: %d", + prefix, mPartialReads, mStringUpdated)); + + if (detailed) { + for (String s: mStringHandle.keySet()) { + int h = mStringHandle.get(s); + pw.println(formatSimple( + "%sHandle:%d Name:%s", prefix, h, s)); + } + } + } + } + } + + /** + * Return the maximum number of nonces supported in the native layer. + * + * @param mPtr the pointer to the native shared memory. + * @return the number of nonces supported by the shared memory. + */ + private static native int nativeGetMaxNonce(long mPtr); + + /** + * Return the maximum number of string bytes supported in the native layer. + * + * @param mPtr the pointer to the native shared memory. + * @return the number of string bytes supported by the shared memory. + */ + private static native int nativeGetMaxByte(long mPtr); + + /** + * Write the byte block and set the hash into shared memory. The method is relatively + * forgiving, in that any non-null byte array will be stored without error. The number of + * bytes will the lesser of the length of the block parameter and the size of the native + * array. The native layer performs no checks on either byte block or the hash. + * + * @param mPtr the pointer to the native shared memory. + * @param hash a value to be stored in the native block hash. + * @param block the byte array to be store. + */ + @FastNative + private static native void nativeSetByteBlock(long mPtr, int hash, @NonNull byte[] block); + + /** + * Retrieve the string block into the array and return the hash value. If the incoming hash + * value is the same as the hash in shared memory, the native function returns immediately + * without touching the block parameter. Note that a zero hash value will always cause shared + * memory to be read. The number of bytes read is the lesser of the length of the block + * parameter and the size of the native array. + * + * @param mPtr the pointer to the native shared memory. + * @param hash a value to be compared against the hash in the native layer. + * @param block an array to receive the bytes from the native layer. + * @return the hash from the native layer. + */ + @FastNative + private static native int nativeGetByteBlock(long mPtr, int hash, @NonNull byte[] block); + + /** + * Retrieve just the byte block hash from the native layer. The function is CriticalNative + * and thus very fast. + * + * @param mPtr the pointer to the native shared memory. + * @return the current native hash value. + */ + @CriticalNative + private static native int nativeGetByteBlockHash(long mPtr); + + /** + * Set a nonce at the specified index. The index is checked against the size of the native + * nonce array and the function returns true if the index is valid, and false. The function + * is CriticalNative and thus very fast. + * + * @param mPtr the pointer to the native shared memory. + * @param index the index of the nonce to set. + * @param value the value to set for the nonce. + * @return true if the index is inside the nonce array and false otherwise. + */ + @CriticalNative + private static native boolean nativeSetNonce(long mPtr, int index, long value); + + /** + * Get the nonce from the specified index. The index is checked against the size of the + * native nonce array; the function returns the nonce value if the index is valid, and 0 + * otherwise. The function is CriticalNative and thus very fast. + * + * @param mPtr the pointer to the native shared memory. + * @param index the index of the nonce to retrieve. + * @return the value of the specified nonce, of 0 if the index is out of bounds. + */ + @CriticalNative + private static native long nativeGetNonce(long mPtr, int index); } diff --git a/core/java/android/app/performance.aconfig b/core/java/android/app/performance.aconfig new file mode 100644 index 000000000000..7c6989e4f3e9 --- /dev/null +++ b/core/java/android/app/performance.aconfig @@ -0,0 +1,11 @@ +package: "android.app" +container: "system" + +flag { + namespace: "system_performance" + name: "pic_uses_shared_memory" + is_exported: true + is_fixed_read_only: true + description: "PropertyInvalidatedCache uses shared memory for nonces." + bug: "366552454" +} diff --git a/core/java/com/android/internal/os/ApplicationSharedMemory.java b/core/java/com/android/internal/os/ApplicationSharedMemory.java index 84f713edcc1a..e6ea29e483f1 100644 --- a/core/java/com/android/internal/os/ApplicationSharedMemory.java +++ b/core/java/com/android/internal/os/ApplicationSharedMemory.java @@ -21,6 +21,7 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import dalvik.annotation.optimization.CriticalNative; +import dalvik.annotation.optimization.FastNative; import libcore.io.IoUtils; @@ -293,4 +294,34 @@ public class ApplicationSharedMemory implements AutoCloseable { throw new IllegalStateException("Not mutable"); } } + + /** + * Return true if the memory has been mapped. This never throws. + */ + public boolean isMapped() { + return mPtr != 0; + } + + /** + * Return true if the memory is mapped and mutable. This never throws. Note that it returns + * false if the memory is not mapped. + */ + public boolean isMutable() { + return isMapped() && mMutable; + } + + /** + * Provide access to the nonce block needed by {@link PropertyInvalidatedCache}. This method + * returns 0 if the shared memory is not (yet) mapped. + */ + public long getSystemNonceBlock() { + return isMapped() ? nativeGetSystemNonceBlock(mPtr) : 0; + } + + /** + * Return a pointer to the system nonce cache in the shared memory region. The method is + * idempotent. + */ + @FastNative + private static native long nativeGetSystemNonceBlock(long ptr); } diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 816ace2310a5..eb07f7c125d0 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -249,6 +249,7 @@ cc_library_shared_for_libandroid_runtime { "android_backup_BackupDataOutput.cpp", "android_backup_FileBackupHelperBase.cpp", "android_backup_BackupHelperDispatcher.cpp", + "android_app_PropertyInvalidatedCache.cpp", "android_app_backup_FullBackup.cpp", "android_content_res_ApkAssets.cpp", "android_content_res_ObbScanner.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 76f66cd4ebc9..821861efd59b 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -177,6 +177,7 @@ extern int register_android_app_backup_FullBackup(JNIEnv *env); extern int register_android_app_Activity(JNIEnv *env); extern int register_android_app_ActivityThread(JNIEnv *env); extern int register_android_app_NativeActivity(JNIEnv *env); +extern int register_android_app_PropertyInvalidatedCache(JNIEnv* env); extern int register_android_media_RemoteDisplay(JNIEnv *env); extern int register_android_util_jar_StrictJarFile(JNIEnv* env); extern int register_android_view_InputChannel(JNIEnv* env); @@ -1659,6 +1660,7 @@ static const RegJNIRec gRegJNI[] = { REG_JNI(register_android_app_Activity), REG_JNI(register_android_app_ActivityThread), REG_JNI(register_android_app_NativeActivity), + REG_JNI(register_android_app_PropertyInvalidatedCache), REG_JNI(register_android_util_jar_StrictJarFile), REG_JNI(register_android_view_InputChannel), REG_JNI(register_android_view_InputEventReceiver), diff --git a/core/jni/android_app_PropertyInvalidatedCache.cpp b/core/jni/android_app_PropertyInvalidatedCache.cpp new file mode 100644 index 000000000000..ead66660a0a4 --- /dev/null +++ b/core/jni/android_app_PropertyInvalidatedCache.cpp @@ -0,0 +1,119 @@ +/* + * 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. + */ + +#define LOG_TAG "CacheNonce" + +#include +#include + +#include + +#include +#include +#include + +#include "core_jni_helpers.h" +#include "android_app_PropertyInvalidatedCache.h" + +namespace { + +using namespace android::app::PropertyInvalidatedCache; + +// Convert a jlong to a nonce block. This is a convenience function that should be inlined by +// the compiler. +inline SystemCacheNonce* sysCache(jlong ptr) { + return reinterpret_cast(ptr); +} + +// Return the number of nonces in the nonce block. +jint getMaxNonce(JNIEnv*, jclass, jlong ptr) { + return sysCache(ptr)->getMaxNonce(); +} + +// Return the number of string bytes in the nonce block. +jint getMaxByte(JNIEnv*, jclass, jlong ptr) { + return sysCache(ptr)->getMaxByte(); +} + +// Set the byte block. The first int is the hash to set and the second is the array to copy. +// This should be synchronized in the Java layer. +void setByteBlock(JNIEnv* env, jclass, jlong ptr, jint hash, jbyteArray val) { + ScopedByteArrayRO value(env, val); + if (value.get() == nullptr) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "null byte block"); + return; + } + sysCache(ptr)->setByteBlock(hash, value.get(), value.size()); +} + +// Fetch the byte block. If the incoming hash is the same as the local hash, the Java layer is +// presumed to have an up-to-date copy of the byte block; do not copy byte array. The local +// hash is returned. +jint getByteBlock(JNIEnv* env, jclass, jlong ptr, jint hash, jbyteArray val) { + if (sysCache(ptr)->getHash() == hash) { + return hash; + } + ScopedByteArrayRW value(env, val); + return sysCache(ptr)->getByteBlock(value.get(), value.size()); +} + +// Fetch the byte block hash. +// +// This is a CriticalNative method and therefore does not get the JNIEnv or jclass parameters. +jint getByteBlockHash(jlong ptr) { + return sysCache(ptr)->getHash(); +} + +// Get a nonce value. So that this method can be CriticalNative, it returns 0 if the value is +// out of range, rather than throwing an exception. This is a CriticalNative method and +// therefore does not get the JNIEnv or jclass parameters. +// +// This method is @CriticalNative and does not take a JNIEnv* or jclass argument. +jlong getNonce(jlong ptr, jint index) { + return sysCache(ptr)->getNonce(index); +} + +// Set a nonce value. So that this method can be CriticalNative, it returns a boolean: false if +// the index is out of range and true otherwise. Callers may test the returned boolean and +// generate an exception. +// +// This method is @CriticalNative and does not take a JNIEnv* or jclass argument. +jboolean setNonce(jlong ptr, jint index, jlong value) { + return sysCache(ptr)->setNonce(index, value); +} + +static const JNINativeMethod gMethods[] = { + {"nativeGetMaxNonce", "(J)I", (void*) getMaxNonce }, + {"nativeGetMaxByte", "(J)I", (void*) getMaxByte }, + {"nativeSetByteBlock", "(JI[B)V", (void*) setByteBlock }, + {"nativeGetByteBlock", "(JI[B)I", (void*) getByteBlock }, + {"nativeGetByteBlockHash", "(J)I", (void*) getByteBlockHash }, + {"nativeGetNonce", "(JI)J", (void*) getNonce }, + {"nativeSetNonce", "(JIJ)Z", (void*) setNonce }, +}; + +static const char* kClassName = "android/app/PropertyInvalidatedCache"; + +} // anonymous namespace + +namespace android { + +int register_android_app_PropertyInvalidatedCache(JNIEnv* env) { + RegisterMethodsOrDie(env, kClassName, gMethods, NELEM(gMethods)); + return JNI_OK; +} + +} // namespace android diff --git a/core/jni/android_app_PropertyInvalidatedCache.h b/core/jni/android_app_PropertyInvalidatedCache.h new file mode 100644 index 000000000000..eefa8fa88624 --- /dev/null +++ b/core/jni/android_app_PropertyInvalidatedCache.h @@ -0,0 +1,146 @@ +/* + * 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. + */ + +#include +#include + +#include + +namespace android { +namespace app { +namespace PropertyInvalidatedCache { + +/** + * A cache nonce block contains an array of std::atomic and an array of bytes. The + * byte array has an associated hash. This class provides methods to read and write the fields + * of the block but it does not interpret the fields. + * + * On initialization, all fields are set to zero. + * + * In general, methods do not report errors. This allows the methods to be used in + * CriticalNative JNI APIs. + * + * The template is parameterized by the number of nonces it supports and the number of bytes in + * the string block. + */ +template class CacheNonce { + + // The value of an unset field. + static const int UNSET = 0; + + // A convenient typedef. The jbyteArray element type is jbyte, which the compiler treats as + // signed char. + typedef signed char block_t; + + // The array of nonces + volatile std::atomic mNonce[maxNonce]; + + // The byte array. This is not atomic but it is guarded by the mByteHash. + volatile block_t mByteBlock[maxByte]; + + // The hash that validates the byte block + volatile std::atomic mByteHash; + + // Pad the class to a multiple of 8 bytes. + int32_t _pad; + + public: + + // The expected size of this instance. This is a compile-time constant and can be used in a + // static assertion. + static const int expectedSize = + maxNonce * sizeof(std::atomic) + + sizeof(std::atomic) + + maxByte * sizeof(block_t) + + sizeof(int32_t); + + // These provide run-time access to the sizing parameters. + int getMaxNonce() const { + return maxNonce; + } + + size_t getMaxByte() const { + return maxByte; + } + + // Construct and initialize the memory. + CacheNonce() { + for (int i = 0; i < maxNonce; i++) { + mNonce[i] = UNSET; + } + mByteHash = UNSET; + memset((void*) mByteBlock, UNSET, sizeof(mByteBlock)); + } + + // Fetch a nonce, returning UNSET if the index is out of range. This method specifically + // does not throw or generate an error if the index is out of range; this allows the method + // to be called in a CriticalNative JNI API. + int64_t getNonce(int index) const { + if (index < 0 || index >= maxNonce) { + return UNSET; + } else { + return mNonce[index]; + } + } + + // Set a nonce and return true. Return false if the index is out of range. This method + // specifically does not throw or generate an error if the index is out of range; this + // allows the method to be called in a CriticalNative JNI API. + bool setNonce(int index, int64_t value) { + if (index < 0 || index >= maxNonce) { + return false; + } else { + mNonce[index] = value; + return true; + } + } + + // Fetch just the byte-block hash + int32_t getHash() const { + return mByteHash; + } + + // Copy the byte block to the target and return the current hash. + int32_t getByteBlock(block_t* block, size_t len) const { + memcpy(block, (void*) mByteBlock, std::min(maxByte, len)); + return mByteHash; + } + + // Set the byte block and the hash. + void setByteBlock(int hash, const block_t* block, size_t len) { + memcpy((void*) mByteBlock, block, len = std::min(maxByte, len)); + mByteHash = hash; + } +}; + +/** + * Sizing parameters for the system_server PropertyInvalidatedCache support. A client can + * retrieve the values through the accessors in CacheNonce instances. + */ +static const int MAX_NONCE = 64; +static const int BYTE_BLOCK_SIZE = 8192; + +// The CacheNonce for system server holds 64 nonces with a string block of 8192 bytes. +typedef CacheNonce SystemCacheNonce; + +// The goal of this assertion is to ensure that the data structure is the same size across 32-bit +// and 64-bit systems. +static_assert(sizeof(SystemCacheNonce) == SystemCacheNonce::expectedSize, + "Unexpected SystemCacheNonce size"); + +} // namespace PropertyInvalidatedCache +} // namespace app +} // namespace android diff --git a/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp b/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp index 453e53974e0d..cc1687cd9ffb 100644 --- a/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp +++ b/core/jni/com_android_internal_os_ApplicationSharedMemory.cpp @@ -29,8 +29,12 @@ #include "core_jni_helpers.h" +#include "android_app_PropertyInvalidatedCache.h" + namespace { +using namespace android::app::PropertyInvalidatedCache; + // Atomics should be safe to use across processes if they are lock free. static_assert(std::atomic::is_always_lock_free == true, "atomic is not always lock free"); @@ -64,12 +68,15 @@ public: void setLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(int64_t offset) { latestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis = offset; } + + // The nonce storage for pic. The sizing is suitable for the system server module. + SystemCacheNonce systemPic; }; // Update the expected value when modifying the members of SharedMemory. // The goal of this assertion is to ensure that the data structure is the same size across 32-bit // and 64-bit systems. -static_assert(sizeof(SharedMemory) == 8, "Unexpected SharedMemory size"); +static_assert(sizeof(SharedMemory) == 8 + sizeof(SystemCacheNonce), "Unexpected SharedMemory size"); static jint nativeCreate(JNIEnv* env, jclass) { // Create anonymous shared memory region @@ -133,6 +140,12 @@ static jlong nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMilli return sharedMemory->getLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis(); } +// This is a FastNative method. It takes the usual JNIEnv* and jclass* arguments. +static jlong nativeGetSystemNonceBlock(JNIEnv*, jclass*, jlong ptr) { + SharedMemory* sharedMemory = reinterpret_cast(ptr); + return reinterpret_cast(&sharedMemory->systemPic); +} + static const JNINativeMethod gMethods[] = { {"nativeCreate", "()I", (void*)nativeCreate}, {"nativeMap", "(IZ)J", (void*)nativeMap}, @@ -143,16 +156,17 @@ static const JNINativeMethod gMethods[] = { (void*)nativeSetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis}, {"nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis", "(J)J", (void*)nativeGetLatestNetworkTimeUnixEpochMillisAtZeroElapsedRealtimeMillis}, + {"nativeGetSystemNonceBlock", "(J)J", (void*) nativeGetSystemNonceBlock}, }; -} // anonymous namespace - -namespace android { - static const char kApplicationSharedMemoryClassName[] = "com/android/internal/os/ApplicationSharedMemory"; static jclass gApplicationSharedMemoryClass; +} // anonymous namespace + +namespace android { + int register_com_android_internal_os_ApplicationSharedMemory(JNIEnv* env) { gApplicationSharedMemoryClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kApplicationSharedMemoryClassName)); diff --git a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java index dcea5b299829..65153f55295a 100644 --- a/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java +++ b/core/tests/coretests/src/android/app/PropertyInvalidatedCacheTests.java @@ -16,13 +16,23 @@ package android.app; +import static android.app.PropertyInvalidatedCache.NONCE_UNSET; +import static android.app.PropertyInvalidatedCache.NonceStore.INVALID_NONCE_INDEX; +import static com.android.internal.os.Flags.FLAG_APPLICATION_SHARED_MEMORY_ENABLED; + import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertNotSame; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import com.android.internal.os.ApplicationSharedMemory; + import android.platform.test.annotations.IgnoreUnderRavenwood; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.platform.test.ravenwood.RavenwoodRule; import androidx.test.filters.SmallTest; @@ -47,6 +57,9 @@ public class PropertyInvalidatedCacheTests { @Rule public final RavenwoodRule mRavenwood = new RavenwoodRule(); + public final CheckFlagsRule mCheckFlagsRule = + DeviceFlagsValueProvider.createCheckFlagsRule(); + // Configuration for creating caches private static final String MODULE = PropertyInvalidatedCache.MODULE_TEST; private static final String API = "testApi"; @@ -423,4 +436,54 @@ public class PropertyInvalidatedCacheTests { // Re-enable test mode (so that the cleanup for the test does not throw). PropertyInvalidatedCache.setTestMode(true); } + + // Verify the behavior of shared memory nonce storage. This does not directly test the cache + // storing nonces in shared memory. + @RequiresFlagsEnabled(FLAG_APPLICATION_SHARED_MEMORY_ENABLED) + @Test + public void testSharedMemoryStorage() { + // Fetch a shared memory instance for testing. + ApplicationSharedMemory shmem = ApplicationSharedMemory.create(); + + // Create a server-side store and a client-side store. The server's store is mutable and + // the client's store is not mutable. + PropertyInvalidatedCache.NonceStore server = + new PropertyInvalidatedCache.NonceStore(shmem.getSystemNonceBlock(), true); + PropertyInvalidatedCache.NonceStore client = + new PropertyInvalidatedCache.NonceStore(shmem.getSystemNonceBlock(), false); + + final String name1 = "name1"; + assertEquals(server.getHandleForName(name1), INVALID_NONCE_INDEX); + assertEquals(client.getHandleForName(name1), INVALID_NONCE_INDEX); + final int index1 = server.storeName(name1); + assertNotEquals(index1, INVALID_NONCE_INDEX); + assertEquals(server.getHandleForName(name1), index1); + assertEquals(client.getHandleForName(name1), index1); + assertEquals(server.storeName(name1), index1); + + assertEquals(server.getNonce(index1), NONCE_UNSET); + assertEquals(client.getNonce(index1), NONCE_UNSET); + final int value1 = 4; + server.setNonce(index1, value1); + assertEquals(server.getNonce(index1), value1); + assertEquals(client.getNonce(index1), value1); + final int value2 = 8; + server.setNonce(index1, value2); + assertEquals(server.getNonce(index1), value2); + assertEquals(client.getNonce(index1), value2); + + final String name2 = "name2"; + assertEquals(server.getHandleForName(name2), INVALID_NONCE_INDEX); + assertEquals(client.getHandleForName(name2), INVALID_NONCE_INDEX); + final int index2 = server.storeName(name2); + assertNotEquals(index2, INVALID_NONCE_INDEX); + assertEquals(server.getHandleForName(name2), index2); + assertEquals(client.getHandleForName(name2), index2); + assertEquals(server.storeName(name2), index2); + + // The names are different, so the indices must be different. + assertNotEquals(index1, index2); + + shmem.close(); + } } -- GitLab From 190fe97ac6d69be4d4b217ab2ff3a95e345dccde Mon Sep 17 00:00:00 2001 From: Yu-Ting Tseng Date: Wed, 23 Oct 2024 15:03:10 -0700 Subject: [PATCH 346/459] Fix AppThatUsesAppOps OWNERS Flag: EXEMPT only changing OWNERS Test: TH Bug: 327047060 Change-Id: Id9084bd71feed8d0485d3b1031f4dfce4ada72a4 Ignore-AOSP-First: the issue to be fixed only exists internally --- core/tests/coretests/AppThatUsesAppOps/OWNERS | 1 + core/tests/coretests/OWNERS | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 core/tests/coretests/AppThatUsesAppOps/OWNERS diff --git a/core/tests/coretests/AppThatUsesAppOps/OWNERS b/core/tests/coretests/AppThatUsesAppOps/OWNERS new file mode 100644 index 000000000000..d77457062c13 --- /dev/null +++ b/core/tests/coretests/AppThatUsesAppOps/OWNERS @@ -0,0 +1 @@ +file:/core/java/android/permission/OWNERS diff --git a/core/tests/coretests/OWNERS b/core/tests/coretests/OWNERS index 0bdf5d31fde6..eea694e56363 100644 --- a/core/tests/coretests/OWNERS +++ b/core/tests/coretests/OWNERS @@ -4,5 +4,5 @@ per-file BinderTest.java = file:platform/frameworks/native:/libs/binder/OWNERS per-file ParcelTest.java = file:platform/frameworks/native:/libs/binder/OWNERS per-file SurfaceControlRegistryTests.java = file:/services/core/java/com/android/server/wm/OWNERS per-file VintfObjectTest.java = file:platform/system/libvintf:/OWNERS -per-file AppOpsLoggingTest.kt,AppOpsLoggingTest.cpp,IAppOps*.aidl,AppThatUsesAppOps/* = file:/core/java/android/permission/OWNERS +per-file AppOpsLoggingTest.kt,AppOpsLoggingTest.cpp,IAppOps*.aidl = file:/core/java/android/permission/OWNERS per-file WallpaperDescriptionTest,WallpaperInstanceTest = file:/core/java/android/service/wallpaper/OWNERS -- GitLab From 30a43a512f7b3980347b1ea0ac020e6ab8c30645 Mon Sep 17 00:00:00 2001 From: Vlad Popa Date: Wed, 23 Oct 2024 22:29:34 +0000 Subject: [PATCH 347/459] Synchronize calls to mAbsoluteDeviceInfoMap Flag: EXEMPT bugfix Test: manual test Bug: 347423032 Bug: 375065861 (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:114f113db70159895edbfc9e131fa36974f015c8) Merged-In: Ib900153cec1f5800f4aa2a77151d5b4d96d2460c Change-Id: Ib900153cec1f5800f4aa2a77151d5b4d96d2460c --- .../android/server/audio/AudioService.java | 57 +++++++++++++------ 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index b0590fe70232..2d3b7f399fec 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -787,9 +787,11 @@ public class AudioService extends IAudioService.Stub AudioSystem.DEVICE_OUT_HDMI_EARC )); + private final Object mAbsoluteVolumeDeviceInfoMapLock = new Object(); // Devices where the framework sends a full scale audio signal, and controls the volume of // the external audio system separately. // For possible volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. + @GuardedBy("mAbsoluteVolumeDeviceInfoMapLock") Map mAbsoluteVolumeDeviceInfoMap = new ArrayMap<>(); /** @@ -3729,9 +3731,8 @@ public class AudioService extends IAudioService.Stub int oldIndex = mStreamStates[streamType].getIndex(device); // Check if the volume adjustment should be handled by an absolute volume controller instead - if (isAbsoluteVolumeDevice(device) - && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + if (isAbsoluteVolumeDevice(device) && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); if (info.mHandlesVolumeAdjustment) { dispatchAbsoluteVolumeAdjusted(streamType, info, oldIndex, direction, keyEventMode); @@ -3798,7 +3799,7 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(newIndex / 10); } else if (isAbsoluteVolumeDevice(device) && (flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); dispatchAbsoluteVolumeChanged(streamType, info, newIndex); } @@ -4801,7 +4802,7 @@ public class AudioService extends IAudioService.Stub mDeviceBroker.postSetAvrcpAbsoluteVolumeIndex(index / 10); } else if (isAbsoluteVolumeDevice(device) && ((flags & AudioManager.FLAG_ABSOLUTE_VOLUME) == 0)) { - AbsoluteVolumeDeviceInfo info = mAbsoluteVolumeDeviceInfoMap.get(device); + final AbsoluteVolumeDeviceInfo info = getAbsoluteVolumeDeviceInfo(device); dispatchAbsoluteVolumeChanged(streamType, info, index); } @@ -7603,7 +7604,8 @@ public class AudioService extends IAudioService.Stub if (register) { AbsoluteVolumeDeviceInfo info = new AbsoluteVolumeDeviceInfo( device, volumes, cb, handlesVolumeAdjustment, deviceVolumeBehavior); - AbsoluteVolumeDeviceInfo oldInfo = mAbsoluteVolumeDeviceInfoMap.get(deviceOut); + final AbsoluteVolumeDeviceInfo oldInfo = getAbsoluteVolumeDeviceInfo(deviceOut); + boolean volumeBehaviorChanged = (oldInfo == null) || (oldInfo.mDeviceVolumeBehavior != deviceVolumeBehavior); if (volumeBehaviorChanged) { @@ -7763,8 +7765,10 @@ public class AudioService extends IAudioService.Stub if (mAbsVolumeMultiModeCaseDevices.contains(audioSystemDeviceOut)) { return AudioManager.DEVICE_VOLUME_BEHAVIOR_ABSOLUTE_MULTI_MODE; } - if (mAbsoluteVolumeDeviceInfoMap.containsKey(audioSystemDeviceOut)) { - return mAbsoluteVolumeDeviceInfoMap.get(audioSystemDeviceOut).mDeviceVolumeBehavior; + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + if (mAbsoluteVolumeDeviceInfoMap.containsKey(audioSystemDeviceOut)) { + return mAbsoluteVolumeDeviceInfoMap.get(audioSystemDeviceOut).mDeviceVolumeBehavior; + } } if (isA2dpAbsoluteVolumeDevice(audioSystemDeviceOut) @@ -11806,10 +11810,12 @@ public class AudioService extends IAudioService.Stub } private Set getAbsoluteVolumeDevicesWithBehavior(int behavior) { - return mAbsoluteVolumeDeviceInfoMap.entrySet().stream() - .filter(entry -> entry.getValue().mDeviceVolumeBehavior == behavior) - .map(Map.Entry::getKey) - .collect(Collectors.toSet()); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.entrySet().stream() + .filter(entry -> entry.getValue().mDeviceVolumeBehavior == behavior) + .map(Map.Entry::getKey) + .collect(Collectors.toSet()); + } } private String dumpDeviceTypes(@NonNull Set deviceTypes) { @@ -14301,15 +14307,27 @@ public class AudioService extends IAudioService.Stub return mFullVolumeDevices.contains(deviceType); } + /** + * Returns the input device which uses absolute volume behavior, including its variants, + * or {@code null} if there is no mapping for the device type + */ + @Nullable + private AbsoluteVolumeDeviceInfo getAbsoluteVolumeDeviceInfo(int deviceType) { + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.get(deviceType); + } + } + /** * Returns whether the input device uses absolute volume behavior, including its variants. * For included volume behaviors, see {@link AudioManager.AbsoluteDeviceVolumeBehavior}. - * - * This is distinct from Bluetooth A2DP absolute volume behavior + *

    This is distinct from Bluetooth A2DP absolute volume behavior * ({@link #isA2dpAbsoluteVolumeDevice}). */ private boolean isAbsoluteVolumeDevice(int deviceType) { - return mAbsoluteVolumeDeviceInfoMap.containsKey(deviceType); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.containsKey(deviceType); + } } /** @@ -14421,7 +14439,9 @@ public class AudioService extends IAudioService.Stub + AudioDeviceVolumeManager.volumeBehaviorName(info.mDeviceVolumeBehavior) ); } - mAbsoluteVolumeDeviceInfoMap.put(audioSystemDeviceOut, info); + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + mAbsoluteVolumeDeviceInfoMap.put(audioSystemDeviceOut, info); + } } private AbsoluteVolumeDeviceInfo removeAudioSystemDeviceOutFromAbsVolumeDevices( @@ -14430,7 +14450,10 @@ public class AudioService extends IAudioService.Stub Log.d(TAG, "Removing DeviceType: 0x" + Integer.toHexString(audioSystemDeviceOut) + " from mAbsoluteVolumeDeviceInfoMap"); } - return mAbsoluteVolumeDeviceInfoMap.remove(audioSystemDeviceOut); + + synchronized (mAbsoluteVolumeDeviceInfoMapLock) { + return mAbsoluteVolumeDeviceInfoMap.remove(audioSystemDeviceOut); + } } //==================== -- GitLab From 00c2baf07a5435806e38376158e5c769188fa61a Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 23 Oct 2024 15:40:21 -0700 Subject: [PATCH 348/459] Add "smoke test" mode to run-ravenwood-tests.sh Now it supports -s to skip the sysui and ICU test.s Flag: EXEMPT host test change only Bug: 292141694 Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh -s Change-Id: I7429376b5812d0671e7d99c2b376703eb5345d76 --- ravenwood/scripts/run-ravenwood-tests.sh | 35 +++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/ravenwood/scripts/run-ravenwood-tests.sh b/ravenwood/scripts/run-ravenwood-tests.sh index 926c08f4e689..5d623e0b6c36 100755 --- a/ravenwood/scripts/run-ravenwood-tests.sh +++ b/ravenwood/scripts/run-ravenwood-tests.sh @@ -14,15 +14,42 @@ # limitations under the License. # Run all the ravenwood tests + hoststubgen unit tests. +# +# Options: +# +# -s: "Smoke" test -- skip slow tests (SysUI, ICU) + +smoke=0 +while getopts "s" opt; do +case "$opt" in + s) + smoke=1 + ;; + '?') + exit 1 + ;; +esac +done +shift $(($OPTIND - 1)) + +all_tests=(hoststubgentest tiny-framework-dump-test hoststubgen-invoke-test ravenwood-stats-checker) +all_tests+=( $(${0%/*}/list-ravenwood-tests.sh) ) -all_tests="hoststubgentest tiny-framework-dump-test hoststubgen-invoke-test ravenwood-stats-checker" +# Regex to identify slow tests, in PCRE +slow_tests_re='^(SystemUiRavenTests|CtsIcuTestCasesRavenwood)$' -# "echo" is to remove the newlines -all_tests="$all_tests $(echo $(${0%/*}/list-ravenwood-tests.sh) )" +if (( $smoke )) ; then + # Remove the slow tests. + all_tests=( $( + for t in "${all_tests[@]}"; do + echo $t | grep -vP "$slow_tests_re" + done + ) ) +fi run() { echo "Running: $*" "${@}" } -run ${ATEST:-atest} $all_tests +run ${ATEST:-atest} "${all_tests[@]}" -- GitLab From 40b392fbeaede4313de33313d7ab75ab55ecc602 Mon Sep 17 00:00:00 2001 From: yutingfang Date: Wed, 23 Oct 2024 14:23:48 -0700 Subject: [PATCH 349/459] Add an aconfig flag for AppOp mode caching Bug: 366013082 Test: presubmit Flag: android.permission.flags.appop_mode_caching_enabled Change-Id: I705a72ca67a5a5a1bbc94d9d7077aab83ff493ac --- core/java/android/permission/flags.aconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/permission/flags.aconfig b/core/java/android/permission/flags.aconfig index 25f3f968a187..1d654e1322c7 100644 --- a/core/java/android/permission/flags.aconfig +++ b/core/java/android/permission/flags.aconfig @@ -299,3 +299,11 @@ flag { description: "Allow host device permission dialogs (i.e., dialogs for non device-aware permissions) to be shown on virtual devices" bug: "371173672" } + +flag { + name: "appop_mode_caching_enabled" + is_fixed_read_only: true + namespace: "permissions" + description: "Enable AppOp mode caching in AppOpsManager" + bug: "366013082" +} -- GitLab From 3065a31d35833815b8e0b6f2dbddfaa91045d3cf Mon Sep 17 00:00:00 2001 From: Shreshta Manu Date: Wed, 23 Oct 2024 16:38:39 +0000 Subject: [PATCH 350/459] [Ranging] Hnadle non-existence of service-ranging.jar gracefully Bug: 374910637 Test: Tested manually Change-Id: Icaffdedbef6981038130021392fa6249ef7be693 --- services/java/com/android/server/SystemServer.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index b676fa2455b1..ebd44f4e0d25 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -2970,8 +2970,13 @@ public final class SystemServer implements Dumpable { || context.getPackageManager().hasSystemFeature( PackageManager.FEATURE_WIFI_RTT)) { t.traceBegin("RangingService"); - mSystemServiceManager.startServiceFromJar(RANGING_SERVICE_CLASS, - RANGING_APEX_SERVICE_JAR_PATH); + // TODO: b/375264320 - Remove after RELEASE_RANGING_STACK is ramped to next. + try { + mSystemServiceManager.startServiceFromJar(RANGING_SERVICE_CLASS, + RANGING_APEX_SERVICE_JAR_PATH); + } catch (Throwable e) { + Slog.d(TAG, "service-ranging.jar not found, not starting RangingService"); + } t.traceEnd(); } } -- GitLab From 096997f0d5b995b308359059b0a6b6c67ea126f2 Mon Sep 17 00:00:00 2001 From: Chris Antol Date: Wed, 23 Oct 2024 23:18:59 +0000 Subject: [PATCH 351/459] Add OWNERS file for android.service.settings tests Bug: 375075504 Change-Id: Ieda6d9de3cabc5ec836f771ace00a16ca6022360 Flag: EXEMPT Test: N/A --- core/tests/coretests/src/android/service/settings/OWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 core/tests/coretests/src/android/service/settings/OWNERS diff --git a/core/tests/coretests/src/android/service/settings/OWNERS b/core/tests/coretests/src/android/service/settings/OWNERS new file mode 100644 index 000000000000..abd8ab011b90 --- /dev/null +++ b/core/tests/coretests/src/android/service/settings/OWNERS @@ -0,0 +1 @@ +include platform/frameworks/base:/core/java/android/service/settings/OWNERS -- GitLab From e264714c023e4020ad63e8a79c180a5c23778915 Mon Sep 17 00:00:00 2001 From: Grant Menke Date: Wed, 23 Oct 2024 23:22:13 +0000 Subject: [PATCH 352/459] Ensure Conference/Connection are initialzed with valid number presentation. This CL ensures that all instances of Conference and Connection are initialized with a valid number presentation (PRESENTATION_UNKNOWN). Before, we were relying on a valid number presentation to be set at some point later on (which didnt happen in every edge case). Defaulting to presentation UNKNOWN ensures that every instance of Connection and Conference will have a valid number presentation. Bug: 306027715 Test: atest ImsConferenceTest#testDefaultNumberPresentationIsValid Flag: EXEMPT bugfix Change-Id: Ia092baedd69d53921e7166f925292e860ddf8d13 --- telecomm/java/android/telecom/Conference.java | 2 +- telecomm/java/android/telecom/Connection.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/telecomm/java/android/telecom/Conference.java b/telecomm/java/android/telecom/Conference.java index f8037175fb05..7adcd4675297 100644 --- a/telecomm/java/android/telecom/Conference.java +++ b/telecomm/java/android/telecom/Conference.java @@ -101,7 +101,7 @@ public abstract class Conference extends Conferenceable { private Set mPreviousExtraKeys; private final Object mExtrasLock = new Object(); private Uri mAddress; - private int mAddressPresentation; + private int mAddressPresentation = TelecomManager.PRESENTATION_UNKNOWN; private String mCallerDisplayName; private int mCallerDisplayNamePresentation; private int mCallDirection; diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index ad7d9870ca98..29d394201f39 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -2164,7 +2164,7 @@ public abstract class Connection extends Conferenceable { private CallAudioState mCallAudioState; private CallEndpoint mCallEndpoint; private Uri mAddress; - private int mAddressPresentation; + private int mAddressPresentation = TelecomManager.PRESENTATION_UNKNOWN; private String mCallerDisplayName; private int mCallerDisplayNamePresentation; private boolean mRingbackRequested = false; -- GitLab From d9a4bd002f860075bbf81f99f4f9a93e51c3379d Mon Sep 17 00:00:00 2001 From: Shunkai Yao Date: Wed, 23 Oct 2024 21:00:18 +0000 Subject: [PATCH 353/459] Use getParameter return value for the preset length as per documented by AudioEffect.getParameter return value Flag: EXEMPT bugfix Bug: 372771511 Test: atest CtsSecurityTestCases:android.security.cts.EffectBundleTest Change-Id: Ia14d57a7a8818f1b9c4a2884bb8da120658d8441 --- media/java/android/media/audiofx/Equalizer.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/media/java/android/media/audiofx/Equalizer.java b/media/java/android/media/audiofx/Equalizer.java index 7abada07181d..09863450a717 100644 --- a/media/java/android/media/audiofx/Equalizer.java +++ b/media/java/android/media/audiofx/Equalizer.java @@ -153,9 +153,8 @@ public class Equalizer extends AudioEffect { param[0] = PARAM_GET_PRESET_NAME; for (int i = 0; i < mNumPresets; i++) { param[1] = i; - checkStatus(getParameter(param, value)); - int length = 0; - while (value[length] != 0) length++; + final int length = getParameter(param, value); + checkStatus(length); try { mPresetNames[i] = new String(value, 0, length, "ISO-8859-1"); } catch (java.io.UnsupportedEncodingException e) { -- GitLab From 364038c0386c084f07ae1afe2e49482e981620d7 Mon Sep 17 00:00:00 2001 From: Makoto Onuki Date: Wed, 23 Oct 2024 16:14:01 -0700 Subject: [PATCH 354/459] Add flags for testing Ravenwood Flag: EXEMPT host test change only Bug: 311370221 Test: $ANDROID_BUILD_TOP/frameworks/base/ravenwood/scripts/run-ravenwood-tests.sh Change-Id: If701b62073afe61cd5c028330ed1ace57a609bdf --- .../com/android/internal/os/flags.aconfig | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/core/java/com/android/internal/os/flags.aconfig b/core/java/com/android/internal/os/flags.aconfig index c8d6810e274a..809c1a114ad3 100644 --- a/core/java/com/android/internal/os/flags.aconfig +++ b/core/java/com/android/internal/os/flags.aconfig @@ -1,6 +1,48 @@ package: "com.android.internal.os" container: "system" +flag { + namespace: "ravenwood" + name: "ravenwood_flag_rw_1" + description: "Ravenwood test RW flag 1" + bug: "311370221" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + namespace: "ravenwood" + name: "ravenwood_flag_rw_2" + description: "Ravenwood test RW flag 2" + bug: "311370221" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + namespace: "ravenwood" + name: "ravenwood_flag_ro_1" + description: "Ravenwood test RO flag 1" + is_fixed_read_only: true + bug: "311370221" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { + namespace: "ravenwood" + name: "ravenwood_flag_ro_2" + description: "Ravenwood test RO flag 2" + is_fixed_read_only: true + bug: "311370221" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "enable_apache_http_legacy_preload" namespace: "system_performance" -- GitLab From 12dcc650a078dfc9ca782da988dda712afcaff21 Mon Sep 17 00:00:00 2001 From: Sherry Zhou Date: Fri, 18 Oct 2024 23:25:39 +0000 Subject: [PATCH 355/459] Fix notification bottom sent from SysUI is inaccurate and refactor Bug: 374382849 Test: atest SharedNotificationContainerViewModelTest Flag: com.android.systemui.magic_portrait_wallpapers Change-Id: I97ca05d891cd0bc00a16778657306d5fd8912e23 --- ...haredNotificationContainerViewModelTest.kt | 69 +++++++++++++++++++ .../repository/FakeWallpaperRepository.kt | 5 -- .../data/repository/KeyguardRepository.kt | 15 ++++ .../domain/interactor/KeyguardInteractor.kt | 4 ++ .../stack/NotificationStackScrollLayout.java | 3 +- .../SharedNotificationContainerBinder.kt | 51 +++++++++++--- .../SharedNotificationContainerViewModel.kt | 30 ++++++++ .../repository/NoopWallpaperRepository.kt | 2 - .../data/repository/WallpaperRepository.kt | 14 +--- .../domain/interactor/WallpaperInteractor.kt | 4 -- .../data/repository/FakeKeyguardRepository.kt | 8 +++ 11 files changed, 169 insertions(+), 36 deletions(-) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt index 25670cb0bb0c..3827dfa533cb 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/ui/viewmodel/SharedNotificationContainerViewModelTest.kt @@ -1229,6 +1229,75 @@ class SharedNotificationContainerViewModelTest(flags: FlagsParameterization) : S assertThat(alpha).isEqualTo(1f) } + @Test + @DisableSceneContainer + fun notificationAbsoluteBottom() = + testScope.runTest { + var notificationCount = 2 + val calculateSpace = { _: Float, _: Boolean -> notificationCount } + val shelfHeight = 10F + val heightForNotification = 20F + val calculateHeight = { count: Int -> count * heightForNotification + shelfHeight } + val stackAbsoluteBottom by + collectLastValue( + underTest.getNotificationStackAbsoluteBottom( + calculateSpace, + calculateHeight, + shelfHeight, + ) + ) + advanceTimeBy(50L) + showLockscreen() + + shadeTestUtil.setSplitShade(false) + keyguardInteractor.setNotificationContainerBounds( + NotificationContainerBounds(top = 100F, bottom = 300F) + ) + configurationRepository.onAnyConfigurationChange() + + assertThat(stackAbsoluteBottom).isEqualTo(150F) + + // Also updates when directly requested (as it would from NotificationStackScrollLayout) + notificationCount = 3 + sharedNotificationContainerInteractor.notificationStackChanged() + advanceTimeBy(50L) + assertThat(stackAbsoluteBottom).isEqualTo(170F) + } + + @Test + @DisableSceneContainer + fun notificationAbsoluteBottom_maxNotificationIsZero_noShelfHeight() = + testScope.runTest { + var notificationCount = 2 + val calculateSpace = { _: Float, _: Boolean -> notificationCount } + val shelfHeight = 10F + val heightForNotification = 20F + val calculateHeight = { count: Int -> count * heightForNotification + shelfHeight } + val stackAbsoluteBottom by + collectLastValue( + underTest.getNotificationStackAbsoluteBottom( + calculateSpace, + calculateHeight, + shelfHeight, + ) + ) + advanceTimeBy(50L) + showLockscreen() + + shadeTestUtil.setSplitShade(false) + keyguardInteractor.setNotificationContainerBounds( + NotificationContainerBounds(top = 100F, bottom = 300F) + ) + configurationRepository.onAnyConfigurationChange() + + assertThat(stackAbsoluteBottom).isEqualTo(150F) + + notificationCount = 0 + sharedNotificationContainerInteractor.notificationStackChanged() + advanceTimeBy(50L) + assertThat(stackAbsoluteBottom).isEqualTo(100F) + } + private suspend fun TestScope.showLockscreen() { shadeTestUtil.setQsExpansion(0f) shadeTestUtil.setLockscreenShadeExpansion(0f) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt index 59676ce126da..111c232280c3 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/wallpapers/data/repository/FakeWallpaperRepository.kt @@ -25,9 +25,4 @@ class FakeWallpaperRepository : WallpaperRepository { override val wallpaperInfo = MutableStateFlow(null) override val wallpaperSupportsAmbientMode = MutableStateFlow(false) override var rootView: View? = null - private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) - - override fun setNotificationStackAbsoluteBottom(bottom: Float) { - _notificationStackAbsoluteBottom.value = bottom - } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt index 9e99a879be41..a6be5bc4ada0 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepository.kt @@ -269,6 +269,8 @@ interface KeyguardRepository { /** The top of shortcut in screen, used by wallpaper to find remaining space in lockscreen */ val shortcutAbsoluteTop: StateFlow + val notificationStackAbsoluteBottom: StateFlow + /** * Returns `true` if the keyguard is showing; `false` otherwise. * @@ -339,6 +341,12 @@ interface KeyguardRepository { fun isShowKeyguardWhenReenabled(): Boolean fun setShortcutAbsoluteTop(top: Float) + + /** + * Set bottom of notifications from notification stack, and Magic Portrait will layout base on + * this value + */ + fun setNotificationStackAbsoluteBottom(bottom: Float) } /** Encapsulates application state for the keyguard. */ @@ -635,6 +643,9 @@ constructor( private val _shortcutAbsoluteTop = MutableStateFlow(0F) override val shortcutAbsoluteTop = _shortcutAbsoluteTop.asStateFlow() + private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) + override val notificationStackAbsoluteBottom = _notificationStackAbsoluteBottom.asStateFlow() + init { val callback = object : KeyguardStateController.Callback { @@ -717,6 +728,10 @@ constructor( _shortcutAbsoluteTop.value = top } + override fun setNotificationStackAbsoluteBottom(bottom: Float) { + _notificationStackAbsoluteBottom.value = bottom + } + private fun dozeMachineStateToModel(state: DozeMachine.State): DozeStateModel { return when (state) { DozeMachine.State.UNINITIALIZED -> DozeStateModel.UNINITIALIZED diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt index 29c6d5aa5ea2..b24ca1a8d345 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardInteractor.kt @@ -545,6 +545,10 @@ constructor( repository.isKeyguardGoingAway.value = isGoingAway } + fun setNotificationStackAbsoluteBottom(bottom: Float) { + repository.setNotificationStackAbsoluteBottom(bottom) + } + companion object { private const val TAG = "KeyguardInteractor" } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java index 87b16efc64fc..1d4916c6cd82 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayout.java @@ -1200,7 +1200,6 @@ public class NotificationStackScrollLayout if (!SceneContainerFlag.isEnabled()) { setMaxLayoutHeight(getHeight()); updateContentHeight(); - mWallpaperInteractor.setNotificationStackAbsoluteBottom(mContentHeight); } clampScrollPosition(); requestChildrenUpdate(); @@ -1278,7 +1277,6 @@ public class NotificationStackScrollLayout if (mAmbientState.getStackTop() != stackTop) { mAmbientState.setStackTop(stackTop); onTopPaddingChanged(/* animate = */ isAddOrRemoveAnimationPending()); - mWallpaperInteractor.setNotificationStackAbsoluteBottom((int) stackTop); } } @@ -2648,6 +2646,7 @@ public class NotificationStackScrollLayout // The topPadding can be bigger than the regular padding when qs is expanded, in that // state the maxPanelHeight and the contentHeight should be bigger + mContentHeight = (int) (height + Math.max(getIntrinsicPadding(), getTopPadding()) + mBottomPadding); updateScrollability(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt index b22143f03b44..6f17455241ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/SharedNotificationContainerBinder.kt @@ -18,10 +18,12 @@ package com.android.systemui.statusbar.notification.stack.ui.viewbinder import androidx.lifecycle.Lifecycle import androidx.lifecycle.repeatOnLifecycle +import com.android.systemui.Flags import com.android.systemui.common.ui.view.onLayoutChanged import com.android.systemui.communal.domain.interactor.CommunalSettingsInteractor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main +import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor import com.android.systemui.keyguard.ui.viewmodel.ViewStateAccessor import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.scene.shared.flag.SceneContainerFlag @@ -48,8 +50,19 @@ constructor( private val notificationScrollViewBinder: NotificationScrollViewBinder, private val communalSettingsInteractor: CommunalSettingsInteractor, @Main private val mainImmediateDispatcher: CoroutineDispatcher, + val keyguardInteractor: KeyguardInteractor, ) { + private val calculateMaxNotifications: (Float, Boolean) -> Int = { space, extraShelfSpace -> + val shelfHeight = controller.getShelfHeight().toFloat() + notificationStackSizeCalculator.computeMaxKeyguardNotifications( + controller.view, + space, + if (extraShelfSpace) shelfHeight else 0f, + shelfHeight, + ) + } + fun bind( view: SharedNotificationContainer, viewModel: SharedNotificationContainerViewModel, @@ -107,17 +120,9 @@ constructor( } launch { - viewModel - .getMaxNotifications { space, extraShelfSpace -> - val shelfHeight = controller.getShelfHeight().toFloat() - notificationStackSizeCalculator.computeMaxKeyguardNotifications( - controller.getView(), - space, - if (extraShelfSpace) shelfHeight else 0f, - shelfHeight, - ) - } - .collect { controller.setMaxDisplayedNotifications(it) } + viewModel.getMaxNotifications(calculateMaxNotifications).collect { + controller.setMaxDisplayedNotifications(it) + } } if (!SceneContainerFlag.isEnabled) { @@ -136,6 +141,30 @@ constructor( } } + if (!SceneContainerFlag.isEnabled) { + if (Flags.magicPortraitWallpapers()) { + launch { + viewModel + .getNotificationStackAbsoluteBottom( + calculateMaxNotifications = calculateMaxNotifications, + calculateHeight = { maxNotifications -> + notificationStackSizeCalculator.computeHeight( + maxNotifs = maxNotifications, + shelfHeight = controller.getShelfHeight().toFloat(), + stack = controller.view, + ) + }, + controller.getShelfHeight().toFloat(), + ) + .collect { bottom -> + keyguardInteractor.setNotificationStackAbsoluteBottom( + bottom + ) + } + } + } + } + launch { viewModel.translationX.collect { x -> controller.translationX = x } } launch { 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 9515029962ea..99e5fdad85bd 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 @@ -672,6 +672,36 @@ constructor( .dumpWhileCollecting("maxNotifications") } + /** + * Wallpaper needs the absolute bottom of notification stack to avoid occlusion + * + * @param calculateMaxNotifications is required by getMaxNotifications as calculateSpace by + * calling computeMaxKeyguardNotifications in NotificationStackSizeCalculator + * @param calculateHeight is calling computeHeight in NotificationStackSizeCalculator The edge + * case is that when maxNotifications is 0, we won't take shelfHeight into account + */ + fun getNotificationStackAbsoluteBottom( + calculateMaxNotifications: (Float, Boolean) -> Int, + calculateHeight: (Int) -> Float, + shelfHeight: Float, + ): Flow { + SceneContainerFlag.assertInLegacyMode() + + return combine( + getMaxNotifications(calculateMaxNotifications).map { + val height = calculateHeight(it) + if (it == 0) { + height - shelfHeight + } else { + height + } + }, + bounds.map { it.top }, + ) { height, top -> + top + height + } + } + fun notificationStackChanged() { interactor.notificationStackChanged() } diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/NoopWallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/NoopWallpaperRepository.kt index 54953c9c2574..9055d18a9f55 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/NoopWallpaperRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/NoopWallpaperRepository.kt @@ -35,6 +35,4 @@ class NoopWallpaperRepository @Inject constructor() : WallpaperRepository { override val wallpaperInfo: StateFlow = MutableStateFlow(null).asStateFlow() override val wallpaperSupportsAmbientMode = MutableStateFlow(false).asStateFlow() override var rootView: View? = null - - override fun setNotificationStackAbsoluteBottom(bottom: Float) {} } diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt index efdd98d5498a..4373a10f7a7d 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/data/repository/WallpaperRepository.kt @@ -45,7 +45,6 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.map @@ -64,12 +63,6 @@ interface WallpaperRepository { /** Set rootView to get its windowToken afterwards */ var rootView: View? - - /** - * Set bottom of notifications from notification stack, and Magic Portrait will layout base on - * this value - */ - fun setNotificationStackAbsoluteBottom(bottom: Float) } @SysUISingleton @@ -106,7 +99,8 @@ constructor( .filter { it.selectionStatus == SelectionStatus.SELECTION_COMPLETE } /** The bottom of notification stack respect to the top of screen. */ - private val notificationStackAbsoluteBottom: MutableStateFlow = MutableStateFlow(0F) + private val notificationStackAbsoluteBottom: StateFlow = + keyguardRepository.notificationStackAbsoluteBottom /** The top of shortcut respect to the top of screen. */ private val shortcutAbsoluteTop: StateFlow = keyguardRepository.shortcutAbsoluteTop @@ -206,10 +200,6 @@ constructor( initialValue = false, ) - override fun setNotificationStackAbsoluteBottom(bottom: Float) { - notificationStackAbsoluteBottom.value = bottom - } - private suspend fun getWallpaper(selectedUser: SelectedUserModel): WallpaperInfo? { return withContext(bgDispatcher) { wallpaperManager.getWallpaperInfoForUser(selectedUser.userInfo.id) diff --git a/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperInteractor.kt b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperInteractor.kt index fe6977c367b5..88795cada716 100644 --- a/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/wallpapers/domain/interactor/WallpaperInteractor.kt @@ -21,10 +21,6 @@ import javax.inject.Inject import kotlinx.coroutines.flow.StateFlow class WallpaperInteractor @Inject constructor(val wallpaperRepository: WallpaperRepository) { - fun setNotificationStackAbsoluteBottom(bottom: Float) { - wallpaperRepository.setNotificationStackAbsoluteBottom(bottom) - } - val wallpaperSupportsAmbientMode: StateFlow = wallpaperRepository.wallpaperSupportsAmbientMode } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt index 08786495eca4..693ec7954d70 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardRepository.kt @@ -131,6 +131,10 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { override val shortcutAbsoluteTop: StateFlow get() = _shortcutAbsoluteTop.asStateFlow() + private val _notificationStackAbsoluteBottom = MutableStateFlow(0F) + override val notificationStackAbsoluteBottom: StateFlow + get() = _notificationStackAbsoluteBottom.asStateFlow() + private val _isKeyguardEnabled = MutableStateFlow(true) override val isKeyguardEnabled: StateFlow = _isKeyguardEnabled.asStateFlow() @@ -294,6 +298,10 @@ class FakeKeyguardRepository @Inject constructor() : KeyguardRepository { _shortcutAbsoluteTop.value = top } + override fun setNotificationStackAbsoluteBottom(bottom: Float) { + _notificationStackAbsoluteBottom.value = bottom + } + override fun setCanIgnoreAuthAndReturnToGone(canWake: Boolean) { _canIgnoreAuthAndReturnToGone.value = canWake } -- GitLab From 5af9275ce9e47f7798156e8fce4290f52dd25b67 Mon Sep 17 00:00:00 2001 From: Matthew Reynolds Date: Tue, 22 Oct 2024 21:20:53 +0000 Subject: [PATCH 356/459] More Robolectric Mass Migration Migrating files which only need runner changes. Bug: 369884473 Flag: TEST_ONLY Test: tested manually with atest Change-Id: Ib8220e090890756bf03ae26d05cc153d2cb8bc28 --- packages/SystemUI/Android.bp | 116 +++++++++--------- .../AudioSharingDialogDelegateTest.kt | 4 +- .../DeviceItemActionInteractorTest.kt | 4 +- .../dreams/DreamOverlayServiceTest.kt | 4 +- .../power/PowerNotificationWarningsTest.java | 0 .../DefaultScreenshotActionsProviderTest.kt | 0 .../ShadeCarrierGroupControllerTest.java | 0 .../commandline/CommandRegistryTest.kt | 0 .../NetworkControllerBaseTest.java | 2 + .../NetworkControllerDataTest.java | 0 .../NetworkControllerEthernetTest.java | 0 .../NetworkControllerWifiTest.java | 0 ...cationStackScrollLayoutControllerTest.java | 0 .../RotationLockControllerImplTest.java | 0 .../keyguard/KeyguardUpdateMonitorTest.java | 2 +- ...yQsShortcutsRepositoryImplForDeviceTest.kt | 2 +- .../com/android/systemui/utils/FieldSetter.kt | 44 +++++++ 17 files changed, 110 insertions(+), 68 deletions(-) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt (98%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt (98%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/power/PowerNotificationWarningsTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java (99%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java (100%) create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/utils/FieldSetter.kt diff --git a/packages/SystemUI/Android.bp b/packages/SystemUI/Android.bp index 5f90b39808f8..9265ceb1c052 100644 --- a/packages/SystemUI/Android.bp +++ b/packages/SystemUI/Android.bp @@ -106,6 +106,7 @@ filegroup { srcs: [ "tests/src/**/systemui/ExpandHelperTest.java", "tests/src/**/AAAPlusPlusVerifySysuiRequiredTestPropertiesTest.java", + "tests/src/**/systemui/accessibility/AccessibilityGestureTargetsObserverTest.java", "tests/src/**/systemui/accessibility/floatingmenu/AccessibilityFloatingMenuControllerTest.java", "tests/src/**/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java", "tests/src/**/systemui/screenshot/appclips/AppClipsActivityTest.java", @@ -269,6 +270,42 @@ filegroup { "tests/src/**/systemui/volume/VolumeDialogImplTest.java", "tests/src/**/systemui/wallet/controller/QuickAccessWalletControllerTest.java", "tests/src/**/systemui/wallet/ui/WalletScreenControllerTest.java", + "tests/src/**/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt", + "tests/src/**/systemui/biometrics/UdfpsControllerOverlayTest.kt", + // TODO(b/322324387): Fails to start due to missing ScreenshotActivity + "tests/src/**/systemui/bouncer/ui/composable/BouncerContentTest.kt", + "tests/src/**/systemui/bouncer/ui/composable/PatternBouncerTest.kt", + "tests/src/**/systemui/clipboardoverlay/ClipboardListenerTest.java", + "tests/src/**/systemui/communal/data/db/CommunalDatabaseMigrationsTest.kt", + "tests/src/**/systemui/communal/data/db/CommunalWidgetDaoTest.kt", + "tests/src/**/systemui/display/data/repository/DisplayWindowPropertiesRepositoryImplTest.kt", + "tests/src/**/systemui/keyboard/shortcut/ui/viewmodel/ShortcutHelperViewModelTest.kt", + "tests/src/**/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt", + "tests/src/**/systemui/lifecycle/ActivatableTest.kt", + "tests/src/**/systemui/lifecycle/HydratorTest.kt", + "tests/src/**/systemui/media/dialog/MediaSwitchingControllerTest.java", + "tests/src/**/systemui/qs/QSImplTest.java", + "tests/src/**/systemui/qs/panels/ui/compose/DragAndDropTest.kt", + "tests/src/**/systemui/qs/panels/ui/compose/ResizingTest.kt", + "tests/src/**/systemui/screenshot/ActionExecutorTest.kt", + "tests/src/**/systemui/screenshot/ScreenshotDetectionControllerTest.kt", + "tests/src/**/systemui/screenshot/TakeScreenshotServiceTest.kt", + "tests/src/**/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java", + "tests/src/**/systemui/accessibility/floatingmenu/PositionTest.java", + "tests/src/**/systemui/animation/TransitionAnimatorTest.kt", + "tests/src/**/systemui/screenshot/scroll/ScrollCaptureControllerTest.java", + "tests/src/**/systemui/lifecycle/SysuiViewModelTest.kt", + "tests/src/**/systemui/flags/FakeFeatureFlags.kt", + "tests/src/**/systemui/animation/TransitionAnimatorTest.kt", + "tests/src/**/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java", + "tests/src/**/systemui/statusbar/connectivity/NetworkControllerSignalTest.java", + "tests/src/**/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt", + "tests/src/**/systemui/statusbar/policy/RotationLockControllerImplTest.java", + "tests/src/**/systemui/statusbar/phone/ScrimControllerTest.java", + "tests/src/**/systemui/stylus/StylusUsiPowerStartableTest.kt", + "tests/src/**/systemui/toast/ToastUITest.java", + "tests/src/**/systemui/statusbar/policy/FlashlightControllerImplTest.kt", + "tests/src/**/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt", ], } @@ -276,42 +313,23 @@ filegroup { filegroup { name: "SystemUI-tests-broken-robofiles-compile", srcs: [ + "tests/src/**/keyguard/KeyguardUpdateMonitorTest.java", + "tests/src/**/systemui/statusbar/notification/icon/IconManagerTest.kt", + "tests/src/**/systemui/statusbar/KeyguardIndicationControllerTest.java", + "tests/src/**/systemui/doze/DozeScreenStateTest.java", + "tests/src/**/keyguard/CarrierTextManagerTest.java", + "tests/src/**/systemui/notetask/NoteTaskInitializerTest.kt", + "tests/src/**/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt", "tests/src/**/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt", - "tests/src/**/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt", - "tests/src/**/systemui/biometrics/AuthDialogPanelInteractionDetectorTest.kt", "tests/src/**/systemui/controls/management/ControlsFavoritingActivityTest.kt", "tests/src/**/systemui/controls/management/ControlsProviderSelectorActivityTest.kt", - "tests/src/**/systemui/controls/start/ControlsStartableTest.kt", - "tests/src/**/systemui/haptics/slider/SliderStateTrackerTest.kt", - "tests/src/**/systemui/keyboard/stickykeys/ui/StickyKeysIndicatorCoordinatorTest.kt", - "tests/src/**/systemui/keyboard/stickykeys/ui/viewmodel/StickyKeysIndicatorViewModelTest.kt", - "tests/src/**/systemui/keyguard/data/quickaffordance/MuteQuickAffordanceCoreStartableTest.kt", - "tests/src/**/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorParameterizedTest.kt", - "tests/src/**/systemui/keyguard/domain/interactor/KeyguardQuickAffordanceInteractorSceneContainerTest.kt", - "tests/src/**/systemui/keyguard/ResourceTrimmerTest.kt", - "tests/src/**/systemui/keyguard/ui/viewmodel/KeyguardBottomAreaViewModelTest.kt", "tests/src/**/systemui/keyguard/ui/viewmodel/KeyguardQuickAffordancesCombinedViewModelTest.kt", - "tests/src/**/systemui/media/controls/ui/controller/MediaHierarchyManagerTest.kt", - "tests/src/**/systemui/mediaprojection/taskswitcher/MediaProjectionTaskSwitcherCoreStartableTest.kt", + "tests/src/**/systemui/media/controls/domain/pipeline/MediaTimeoutListenerTest.kt", "tests/src/**/systemui/media/taptotransfer/receiver/FakeMediaTttChipControllerReceiver.kt", "tests/src/**/systemui/qs/tileimpl/QSTileViewImplTest.kt", - "tests/src/**/systemui/qs/tiles/DeviceControlsTileTest.kt", - "tests/src/**/systemui/screenshot/ActionExecutorTest.kt", - "tests/src/**/systemui/screenshot/ActionIntentCreatorTest.kt", - "tests/src/**/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt", - "tests/src/**/systemui/screenshot/TakeScreenshotServiceTest.kt", - "tests/src/**/systemui/statusbar/notification/collection/TargetSdkResolverTest.kt", - "tests/src/**/systemui/statusbar/notification/icon/IconManagerTest.kt", - "tests/src/**/systemui/statusbar/notification/row/BigPictureIconManagerTest.kt", - "tests/src/**/systemui/statusbar/notification/row/NotificationSettingsControllerTest.kt", - "tests/src/**/systemui/statusbar/notification/stack/ui/view/NotificationStatsLoggerTest.kt", - "tests/src/**/systemui/statusbar/pipeline/satellite/data/prod/DeviceBasedSatelliteRepositoryImplTest.kt", - "tests/src/**/systemui/statusbar/policy/FlashlightControllerImplTest.kt", - "tests/src/**/systemui/statusbar/policy/SensitiveNotificationProtectionControllerFlagDisabledTest.kt", - "tests/src/**/systemui/stylus/StylusUsiPowerStartableTest.kt", + "tests/src/**/systemui/statusbar/policy/BatteryStateNotifierTest.kt", "tests/src/**/systemui/temporarydisplay/TemporaryViewDisplayControllerTest.kt", "tests/src/**/keyguard/ClockEventControllerTest.kt", - "tests/src/**/systemui/animation/TransitionAnimatorTest.kt", "tests/src/**/systemui/bluetooth/qsdialog/BluetoothAutoOnRepositoryTest.kt", "tests/src/**/systemui/bluetooth/qsdialog/BluetoothStateInteractorTest.kt", "tests/src/**/systemui/bluetooth/qsdialog/BluetoothTileDialogDelegateTest.kt", @@ -319,9 +337,6 @@ filegroup { "tests/src/**/systemui/bluetooth/qsdialog/BluetoothTileDialogViewModelTest.kt", "tests/src/**/systemui/bluetooth/qsdialog/DeviceItemFactoryTest.kt", "tests/src/**/systemui/bluetooth/qsdialog/DeviceItemInteractorTest.kt", - // TODO(b/322324387): Fails to start due to missing ScreenshotActivity - "tests/src/**/systemui/bouncer/ui/composable/BouncerContentTest.kt", - "tests/src/**/systemui/bouncer/ui/composable/PatternBouncerTest.kt", "tests/src/**/systemui/broadcast/UserBroadcastDispatcherTest.kt", "tests/src/**/systemui/charging/WiredChargingRippleControllerTest.kt", "tests/src/**/systemui/clipboardoverlay/ClipboardModelTest.kt", @@ -348,8 +363,6 @@ filegroup { "tests/src/**/systemui/media/taptotransfer/sender/MediaTttSenderCoordinatorTest.kt", "tests/src/**/systemui/navigationbar/gestural/BackPanelControllerTest.kt", "tests/src/**/systemui/notetask/NoteTaskControllerTest.kt", - "tests/src/**/systemui/notetask/NoteTaskInitializerTest.kt", - "tests/src/**/systemui/power/domain/interactor/PowerInteractorTest.kt", "tests/src/**/systemui/privacy/AppOpsPrivacyItemMonitorTest.kt", "tests/src/**/systemui/privacy/PrivacyItemControllerTest.kt", "tests/src/**/systemui/qs/external/CustomTileStatePersisterTest.kt", @@ -376,7 +389,6 @@ filegroup { "tests/src/**/systemui/statusbar/LightRevealScrimTest.kt", "tests/src/**/systemui/statusbar/LockscreenShadeTransitionControllerTest.kt", "tests/src/**/systemui/statusbar/notification/collection/coordinator/DataStoreCoordinatorTest.kt", - "tests/src/**/systemui/statusbar/notification/collection/coordinator/KeyguardCoordinatorTest.kt", "tests/src/**/systemui/statusbar/notification/collection/coordinator/RowAppearanceCoordinatorTest.kt", "tests/src/**/systemui/statusbar/notification/collection/coordinator/ShadeEventCoordinatorTest.kt", "tests/src/**/systemui/statusbar/notification/collection/coordinator/StackCoordinatorTest.kt", @@ -406,8 +418,6 @@ filegroup { "tests/src/**/systemui/statusbar/SplitShadeLockScreenOverScrollerTest.kt", "tests/src/**/systemui/stylus/StylusUsiPowerUiTest.kt", "tests/src/**/systemui/temporarydisplay/chipbar/ChipbarCoordinatorTest.kt", - "tests/src/**/keyguard/KeyguardUpdateMonitorTest.java", - "tests/src/**/keyguard/CarrierTextManagerTest.java", "tests/src/**/systemui/ScreenDecorationsTest.java", "tests/src/**/systemui/temporarydisplay/chipbar/SwipeChipbarAwayGestureHandlerTest.kt", "tests/src/**/systemui/media/controls/domain/pipeline/MediaDataProcessorTest.kt", @@ -431,33 +441,17 @@ filegroup { "tests/src/**/systemui/statusbar/policy/BatteryControllerStartableTest.java", "tests/src/**/systemui/statusbar/policy/BatteryControllerTest.java", "tests/src/**/systemui/statusbar/policy/SensitiveNotificationProtectionControllerTest.kt", - "tests/src/**/systemui/statusbar/notification/NotificationSectionsFeatureManagerTest.kt", "tests/src/**/systemui/statusbar/pipeline/mobile/data/repository/CarrierConfigRepositoryTest.kt", "tests/src/**/systemui/statusbar/KeyboardShortcutsReceiverTest.java", "tests/src/**/systemui/wmshell/BubblesTest.java", - "tests/src/**/systemui/biometrics/AuthRippleControllerTest.kt", - "tests/src/**/keyguard/KeyguardAbsKeyInputViewControllerTest.java", - "tests/src/**/systemui/accessibility/floatingmenu/MenuAnimationControllerTest.java", - "tests/src/**/systemui/clipboardoverlay/ClipboardListenerTest.java", - "tests/src/**/systemui/doze/DozeScreenStateTest.java", - "tests/src/**/systemui/keyguard/WorkLockActivityControllerTest.java", - "tests/src/**/systemui/media/dialog/MediaSwitchingControllerTest.java", - "tests/src/**/systemui/navigationbar/views/NavigationBarTest.java", - "tests/src/**/systemui/power/PowerNotificationWarningsTest.java", - "tests/src/**/systemui/qs/QSFooterViewControllerTest.java", - "tests/src/**/systemui/qs/QSImplTest.java", - "tests/src/**/systemui/qs/tiles/QuickAccessWalletTileTest.java", - "tests/src/**/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerBaseTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerDataTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerSignalTest.java", - "tests/src/**/systemui/statusbar/connectivity/NetworkControllerWifiTest.java", - "tests/src/**/systemui/statusbar/KeyguardIndicationControllerTest.java", - "tests/src/**/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java", - "tests/src/**/systemui/statusbar/phone/ScrimControllerTest.java", - "tests/src/**/systemui/statusbar/policy/RotationLockControllerImplTest.java", - "tests/src/**/systemui/toast/ToastUITest.java", + "tests/src/**/systemui/power/PowerUITest.java", + "tests/src/**/systemui/qs/QSSecurityFooterTest.java", + "tests/src/**/systemui/qs/tileimpl/QSTileImplTest.java", + "tests/src/**/systemui/shared/plugins/PluginActionManagerTest.java", + "tests/src/**/systemui/statusbar/CommandQueueTest.java", + "tests/src/**/systemui/statusbar/connectivity/CallbackHandlerTest.java", + "tests/src/**/systemui/statusbar/policy/SecurityControllerTest.java", + "tests/src/**/systemui/shared/clocks/view/SimpleDigitalClockTextViewTest.kt", ], visibility: ["//visibility:private"], } @@ -885,6 +879,7 @@ android_robolectric_test { "android.test.base.impl", "android.test.mock.impl", "truth", + "androidx.test.ext.truth", ], upstream: true, @@ -922,6 +917,7 @@ android_robolectric_test { "android.test.base.impl", "android.test.mock.impl", "truth", + "androidx.test.ext.truth", ], upstream: true, diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt similarity index 98% rename from packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt index 25b85b514435..9f0c7e1ba660 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/AudioSharingDialogDelegateTest.kt @@ -16,7 +16,7 @@ package com.android.systemui.bluetooth.qsdialog -import android.testing.AndroidTestingRunner +import androidx.test.ext.junit.runners.AndroidJUnit4 import android.testing.TestableLooper import android.widget.Button import android.widget.TextView @@ -43,7 +43,7 @@ import org.mockito.kotlin.verify import org.mockito.kotlin.whenever @SmallTest -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @OptIn(ExperimentalCoroutinesApi::class) class AudioSharingDialogDelegateTest : SysuiTestCase() { diff --git a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt similarity index 98% rename from packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt index 9c427c6b085e..44f9720cb9e4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/bluetooth/qsdialog/DeviceItemActionInteractorTest.kt @@ -15,7 +15,7 @@ */ package com.android.systemui.bluetooth.qsdialog -import android.testing.AndroidTestingRunner +import androidx.test.ext.junit.runners.AndroidJUnit4 import android.testing.TestableLooper import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase @@ -37,7 +37,7 @@ import org.mockito.junit.MockitoRule import org.mockito.kotlin.whenever @SmallTest -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @OptIn(ExperimentalCoroutinesApi::class) class DeviceItemActionInteractorTest : SysuiTestCase() { diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt index f5d2d42902d8..8062358f670c 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/dreams/DreamOverlayServiceTest.kt @@ -96,7 +96,7 @@ import org.mockito.kotlin.firstValue import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.times -import org.mockito.kotlin.verifyZeroInteractions +import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.whenever @OptIn(ExperimentalCoroutinesApi::class) @@ -453,7 +453,7 @@ class DreamOverlayServiceTest : SysuiTestCase() { mMainExecutor.runAllReady() - verifyZeroInteractions(mTouchMonitor) + verifyNoMoreInteractions(mTouchMonitor) val captor = ArgumentCaptor.forClass(DreamOverlayStateController.Callback::class.java) verify(mStateController).addCallback(captor.capture()) diff --git a/packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/power/PowerNotificationWarningsTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/power/PowerNotificationWarningsTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/power/PowerNotificationWarningsTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/screenshot/DefaultScreenshotActionsProviderTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/shade/carrier/ShadeCarrierGroupControllerTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/commandline/CommandRegistryTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java similarity index 99% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java index b00f9e9f01d3..f502cabc21ec 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerBaseTest.java @@ -61,6 +61,7 @@ import android.testing.TestableResources; import android.util.Log; import androidx.test.InstrumentationRegistry; +import androidx.test.filters.SmallTest; import com.android.settingslib.R; import com.android.settingslib.graph.SignalDrawable; @@ -98,6 +99,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +@SmallTest public class NetworkControllerBaseTest extends SysuiTestCase { private static final String TAG = "NetworkControllerBaseTest"; protected static final int DEFAULT_LEVEL = 2; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerDataTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerEthernetTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/connectivity/NetworkControllerWifiTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/stack/NotificationStackScrollLayoutControllerTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/policy/RotationLockControllerImplTest.java diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java index 34ebba844926..b941fdef76b4 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardUpdateMonitorTest.java @@ -159,6 +159,7 @@ import com.android.systemui.telephony.TelephonyListenerManager; import com.android.systemui.user.domain.interactor.SelectedUserInteractor; import com.android.systemui.util.kotlin.JavaAdapter; import com.android.systemui.util.settings.GlobalSettings; +import com.android.systemui.utils.FieldSetter; import org.junit.After; import org.junit.Assert; @@ -172,7 +173,6 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.MockitoSession; -import org.mockito.internal.util.reflection.FieldSetter; import org.mockito.quality.Strictness; import java.util.ArrayList; diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt b/packages/SystemUI/tests/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt index 1d1329ac550c..4e0ebae6a902 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/data/repository/AccessibilityQsShortcutsRepositoryImplForDeviceTest.kt @@ -34,6 +34,7 @@ import com.android.systemui.qs.tiles.OneHandedModeTile import com.android.systemui.qs.tiles.ReduceBrightColorsTile import com.android.systemui.util.mockito.whenever import com.android.systemui.util.settings.FakeSettings +import com.android.systemui.utils.FieldSetter import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher @@ -46,7 +47,6 @@ import org.junit.Test import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito -import org.mockito.internal.util.reflection.FieldSetter import org.mockito.junit.MockitoJUnit import org.mockito.junit.MockitoRule diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/utils/FieldSetter.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/FieldSetter.kt new file mode 100644 index 000000000000..6e2d72256edc --- /dev/null +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/utils/FieldSetter.kt @@ -0,0 +1,44 @@ +/* + * 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.utils + +import java.lang.reflect.Field + +object FieldSetter { + @JvmStatic + fun setField(obj: Any, fieldName: String, value: Any?) { + try { + val field = obj.javaClass.getDeclaredField(fieldName) + field.isAccessible = true + field[obj] = value + } catch (e: NoSuchFieldException) { + throw RuntimeException("Failed to set $fieldName of obj", e) + } catch (e: IllegalAccessException) { + throw RuntimeException("Failed to set $fieldName of obj", e) + } + } + + @JvmStatic + fun setField(obj: Any?, fld: Field, value: Any?) { + try { + fld.setAccessible(true) + fld.set(obj, value) + } catch (e: IllegalAccessException) { + throw RuntimeException("Failed to set ${fld.getName()} of obj", e) + } + } +} -- GitLab From 10f8173bc0a35423d294fc0d1b6607b9c96086b3 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Wed, 23 Oct 2024 17:48:08 +0800 Subject: [PATCH 357/459] Do not ignore locked orientation by universal resizable The policy focuses on the orientation request that may trigger a change. The "lock" is like to keep current orientation, so it is excluded. Also fix some tests by using activity builder with test package (legacy target sdk). Bug: 357141415 Flag: com.android.window.flags.universal_resizable_by_default Test: SizeCompatTests Change-Id: Ibc3a4fbcab3132d00a22da4a37947d5a48f9c421 --- .../core/java/com/android/server/wm/ActivityRecord.java | 4 +++- .../wmtests/src/com/android/server/wm/SizeCompatTests.java | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 460de01a7d1d..da6784d04dda 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -8179,7 +8179,9 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A @ActivityInfo.ScreenOrientation protected int getOverrideOrientation() { int candidateOrientation = super.getOverrideOrientation(); - if (ActivityInfo.isFixedOrientation(candidateOrientation) && isUniversalResizeable()) { + if (candidateOrientation != ActivityInfo.SCREEN_ORIENTATION_LOCKED + && ActivityInfo.isFixedOrientation(candidateOrientation) + && isUniversalResizeable()) { candidateOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; } return mAppCompatController.getOrientationPolicy() diff --git a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java index c30f70ee2903..bbe5dcde615f 100644 --- a/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/SizeCompatTests.java @@ -2899,7 +2899,7 @@ public class SizeCompatTests extends WindowTestsBase { // Launch another portrait fixed app. spyOn(mTask); setBooted(display.mWmService.mAtmService); - final ActivityRecord newActivity = new ActivityBuilder(display.mWmService.mAtmService) + final ActivityRecord newActivity = getActivityBuilderWithoutTask() .setResizeMode(RESIZE_MODE_UNRESIZEABLE) .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) .setTask(mTask) @@ -2967,7 +2967,7 @@ public class SizeCompatTests extends WindowTestsBase { // Launch another portrait fixed app with max aspect ratio as 1.3. spyOn(mTask); setBooted(display.mWmService.mAtmService); - final ActivityRecord newActivity = new ActivityBuilder(display.mWmService.mAtmService) + final ActivityRecord newActivity = getActivityBuilderWithoutTask() .setResizeMode(RESIZE_MODE_UNRESIZEABLE) .setMaxAspectRatio(1.3f) .setScreenOrientation(SCREEN_ORIENTATION_PORTRAIT) @@ -4791,7 +4791,7 @@ public class SizeCompatTests extends WindowTestsBase { final float maxAspect = 1.8f; final float minAspect = 1.5f; prepareLimitedBounds(mActivity, maxAspect, minAspect, - ActivityInfo.SCREEN_ORIENTATION_LOCKED, true /* isUnresizable */); + ActivityInfo.SCREEN_ORIENTATION_NOSENSOR, true /* isUnresizable */); assertTrue(mActivity.isUniversalResizeable()); assertTrue(mActivity.isResizeable()); -- GitLab From 8b5e1e47f9a99a4a492b97111ce931304d3ac466 Mon Sep 17 00:00:00 2001 From: Matthew Reynolds Date: Wed, 23 Oct 2024 22:44:52 +0000 Subject: [PATCH 358/459] More Robolectric mass migration. Some of the tests were erroneously marked as failing at runtime under robolectric Bug: 375261325 Test: tested manually with atest Flag: TEST_ONLY Change-Id: I0f7ec928be778d1ee5f47be80b1e021efdb1bef2 --- .../src/com/android/keyguard/ActiveUnlockConfigTest.kt | 3 +++ .../keyguard/KeyguardClockAccessibilityDelegateTest.java | 5 ++++- .../src/com/android/systemui/DependencyTest.java | 0 .../src/com/android/systemui/ExpandHelperTest.java | 4 ++-- .../src/com/android/systemui/InitControllerTest.java | 4 ++-- .../floatingmenu/AccessibilityTargetAdapterTest.java | 0 .../systemui/accessibility/floatingmenu/MenuViewTest.java | 0 .../android/systemui/animation/AnimatorTestRuleOrderTest.kt | 0 .../com/android/systemui/broadcast/ActionReceiverTest.kt | 6 +++--- .../com/android/systemui/compose/ComposeInitializerTest.kt | 0 .../data/repository/KeyguardBlueprintRepositoryTest.kt | 0 .../data/repository/KeyguardTransitionRepositoryTest.kt | 0 .../LockscreenSceneTransitionInteractorTest.kt | 0 .../keyguard/ui/view/layout/sections/ClockSectionTest.kt | 0 .../ui/viewmodel/KeyguardSmartspaceViewModelTest.kt | 0 .../com/android/systemui/privacy/PrivacyConfigFlagsTest.kt | 0 .../src/com/android/systemui/privacy/PrivacyDialogV2Test.kt | 0 .../com/android/systemui/qs/FgsManagerControllerTest.java | 0 .../qs/external/TileRequestDialogEventLoggerTest.kt | 6 +++--- .../KeyguardIndicationControllerWithCoroutinesTest.kt | 0 .../notification/AssistantFeedbackControllerTest.java | 0 .../notification/footer/ui/view/FooterViewTest.java | 0 .../notification/row/NotificationContentInflaterTest.java | 0 23 files changed, 17 insertions(+), 11 deletions(-) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/keyguard/ActiveUnlockConfigTest.kt (99%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java (97%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/DependencyTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/ExpandHelperTest.java (97%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/InitControllerTest.java (96%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/animation/AnimatorTestRuleOrderTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/broadcast/ActionReceiverTest.kt (99%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/compose/ComposeInitializerTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModelTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/privacy/PrivacyConfigFlagsTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/privacy/PrivacyDialogV2Test.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/qs/FgsManagerControllerTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt (98%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/KeyguardIndicationControllerWithCoroutinesTest.kt (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java (100%) rename packages/SystemUI/{tests => multivalentTests}/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java (100%) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt b/packages/SystemUI/multivalentTests/src/com/android/keyguard/ActiveUnlockConfigTest.kt similarity index 99% rename from packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/keyguard/ActiveUnlockConfigTest.kt index 48f6cc4261a9..14d34d79512f 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/ActiveUnlockConfigTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/ActiveUnlockConfigTest.kt @@ -33,6 +33,7 @@ import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_UNLOCK_INTENT_WHEN_BIOM import android.provider.Settings.Secure.ACTIVE_UNLOCK_ON_WAKE import android.provider.Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_CONSIDERED_UNLOCK_INTENTS import android.provider.Settings.Secure.ACTIVE_UNLOCK_WAKEUPS_TO_FORCE_DISMISS_KEYGUARD +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager @@ -47,6 +48,7 @@ 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.ArgumentCaptor import org.mockito.Captor import org.mockito.Mock @@ -55,6 +57,7 @@ import org.mockito.Mockito.`when` import org.mockito.MockitoAnnotations @SmallTest +@RunWith(AndroidJUnit4::class) class ActiveUnlockConfigTest : SysuiTestCase() { private lateinit var secureSettings: FakeSettings @Mock private lateinit var contentResolver: ContentResolver diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java similarity index 97% rename from packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java rename to packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java index edf29c591af9..b937db6bd76d 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/keyguard/KeyguardClockAccessibilityDelegateTest.java @@ -25,6 +25,7 @@ import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.TextView; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; @@ -32,10 +33,12 @@ import com.android.systemui.res.R; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; import java.util.List; @SmallTest +@RunWith(AndroidJUnit4.class) public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase { private TextView mView; @@ -111,4 +114,4 @@ public class KeyguardClockAccessibilityDelegateTest extends SysuiTestCase { private boolean isEmpty(List texts) { return texts.stream().allMatch(TextUtils::isEmpty); } -} \ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/DependencyTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/DependencyTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/DependencyTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/ExpandHelperTest.java similarity index 97% rename from packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/ExpandHelperTest.java index ccdcee5e0318..1b072416faa6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/ExpandHelperTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/ExpandHelperTest.java @@ -21,12 +21,12 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import android.content.Context; -import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.testing.TestableLooper.RunWithLooper; import androidx.core.animation.ObjectAnimator; import androidx.test.annotation.UiThreadTest; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import com.android.keyguard.KeyguardUpdateMonitor; @@ -42,7 +42,7 @@ import org.junit.Test; import org.junit.runner.RunWith; @SmallTest -@RunWith(AndroidTestingRunner.class) +@RunWith(AndroidJUnit4.class) @RunWithLooper public class ExpandHelperTest extends SysuiTestCase { diff --git a/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/InitControllerTest.java similarity index 96% rename from packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/InitControllerTest.java index e0ca87c0223d..e0c7c7a6c16d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/InitControllerTest.java +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/InitControllerTest.java @@ -19,16 +19,16 @@ package com.android.systemui; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; -import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; +import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; import org.junit.Test; import org.junit.runner.RunWith; @SmallTest -@RunWith(AndroidTestingRunner.class) +@RunWith(AndroidJUnit4.class) @TestableLooper.RunWithLooper public class InitControllerTest extends SysuiTestCase { diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/AccessibilityTargetAdapterTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/accessibility/floatingmenu/MenuViewTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/AnimatorTestRuleOrderTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/animation/AnimatorTestRuleOrderTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/animation/AnimatorTestRuleOrderTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/animation/AnimatorTestRuleOrderTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/broadcast/ActionReceiverTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/broadcast/ActionReceiverTest.kt similarity index 99% rename from packages/SystemUI/tests/src/com/android/systemui/broadcast/ActionReceiverTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/broadcast/ActionReceiverTest.kt index b7ed27f7c71e..94d0dfeccbe1 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/broadcast/ActionReceiverTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/broadcast/ActionReceiverTest.kt @@ -21,8 +21,8 @@ import android.content.Context import android.content.Intent import android.content.IntentFilter import android.os.UserHandle +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest -import android.testing.AndroidTestingRunner import android.testing.TestableLooper import com.android.systemui.SysuiTestCase import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger @@ -51,7 +51,7 @@ import java.lang.IllegalArgumentException import java.lang.IllegalStateException import java.util.concurrent.Executor -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper @SmallTest class ActionReceiverTest : SysuiTestCase() { @@ -273,4 +273,4 @@ class ActionReceiverTest : SysuiTestCase() { fun testBroadcastWithWrongAction_throwsException() { actionReceiver.onReceive(mContext, Intent(ACTION2)) } -} \ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/compose/ComposeInitializerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/compose/ComposeInitializerTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/compose/ComposeInitializerTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/compose/ComposeInitializerTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardBlueprintRepositoryTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/data/repository/KeyguardTransitionRepositoryTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractorTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/view/layout/sections/ClockSectionTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModelTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModelTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModelTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/keyguard/ui/viewmodel/KeyguardSmartspaceViewModelTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyConfigFlagsTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/privacy/PrivacyConfigFlagsTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyConfigFlagsTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/privacy/PrivacyConfigFlagsTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogV2Test.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/privacy/PrivacyDialogV2Test.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/privacy/PrivacyDialogV2Test.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/privacy/PrivacyDialogV2Test.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/qs/FgsManagerControllerTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/qs/FgsManagerControllerTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt similarity index 98% rename from packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt index 64796f1a757a..12bd5afcd94d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/qs/external/TileRequestDialogEventLoggerTest.kt @@ -17,8 +17,8 @@ package com.android.systemui.qs.external import android.app.StatusBarManager -import android.testing.AndroidTestingRunner import android.testing.TestableLooper +import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.internal.logging.InstanceId import com.android.internal.logging.UiEventLogger @@ -31,7 +31,7 @@ import org.junit.Test import org.junit.runner.RunWith @SmallTest -@RunWith(AndroidTestingRunner::class) +@RunWith(AndroidJUnit4::class) @TestableLooper.RunWithLooper class TileRequestDialogEventLoggerTest : SysuiTestCase() { @@ -138,4 +138,4 @@ class TileRequestDialogEventLoggerTest : SysuiTestCase() { assertThat(packageName).isEqualTo(PACKAGE_NAME) assertThat(this.instanceId).isEqualTo(instanceId) } -} \ No newline at end of file +} diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerWithCoroutinesTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/KeyguardIndicationControllerWithCoroutinesTest.kt similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/KeyguardIndicationControllerWithCoroutinesTest.kt rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/KeyguardIndicationControllerWithCoroutinesTest.kt diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/AssistantFeedbackControllerTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterViewTest.java diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java b/packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java similarity index 100% rename from packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java rename to packages/SystemUI/multivalentTests/src/com/android/systemui/statusbar/notification/row/NotificationContentInflaterTest.java -- GitLab From 12883a2c3fdbb7f6b90e144643cdb45ba37fb7b6 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Wed, 23 Oct 2024 18:02:25 +0800 Subject: [PATCH 359/459] [Catalyst] Add NoOpKeyedObservable Bug: 332202168 Flag: EXEMPT library Test: N/A Change-Id: I1337ba9b74cdc8d0c803c988ad19d81f846f73dd --- .../settingslib/datastore/KeyedObserver.kt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt index ec903179f496..9cb0ebb995a8 100644 --- a/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt +++ b/packages/SettingsLib/DataStore/src/com/android/settingslib/datastore/KeyedObserver.kt @@ -199,3 +199,19 @@ open class KeyedDataObservable : KeyedObservable { } } } + +/** [KeyedObservable] with no-op implementations for all interfaces. */ +open class NoOpKeyedObservable : KeyedObservable { + + override fun addObserver(observer: KeyedObserver, executor: Executor) = true + + override fun addObserver(key: K, observer: KeyedObserver, executor: Executor) = true + + override fun removeObserver(observer: KeyedObserver) = true + + override fun removeObserver(key: K, observer: KeyedObserver) = true + + override fun notifyChange(reason: Int) {} + + override fun notifyChange(key: K, reason: Int) {} +} -- GitLab From ff50c0397a5b15ed6275762b93308c43f426edc4 Mon Sep 17 00:00:00 2001 From: Jacky Wang Date: Wed, 23 Oct 2024 18:06:49 +0800 Subject: [PATCH 360/459] [Catalyst] Enrich PreferenceLifecycleProvider Bug: 332202168 Flag: EXEMPT library Test: manual Change-Id: Ie5939918242420ac6d007bf4e09f82e15f0654f5 --- .../metadata/PreferenceStateProviders.kt | 66 ++++++++++++---- .../preference/PreferenceFragment.kt | 39 +++++++++- .../PreferenceScreenBindingHelper.kt | 76 +++++++++++++++---- 3 files changed, 152 insertions(+), 29 deletions(-) diff --git a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt index 98cba1cf098a..43d7dfa4a158 100644 --- a/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt +++ b/packages/SettingsLib/Metadata/src/com/android/settingslib/metadata/PreferenceStateProviders.kt @@ -17,6 +17,9 @@ package com.android.settingslib.metadata import android.content.Context +import android.content.ContextWrapper +import android.content.Intent +import android.os.Bundle /** * Interface to provide dynamic preference title. @@ -82,25 +85,62 @@ interface PreferenceRestrictionProvider { interface PreferenceLifecycleProvider { /** - * Called when preference is attached to UI. + * Callbacks of preference fragment `onCreate`. * - * Subclass could override this API to register runtime condition listeners, and invoke - * `onPreferenceStateChanged(this)` on the given [preferenceStateObserver] to update UI when - * internal state (e.g. availability, enabled state, title, summary) is changed. + * Invoke [PreferenceLifecycleContext.notifyPreferenceChange] to update UI when any internal + * state (e.g. availability, enabled state, title, summary) is changed. */ - fun onAttach(context: Context, preferenceStateObserver: PreferenceStateObserver) + fun onCreate(context: PreferenceLifecycleContext) {} /** - * Called when preference is detached from UI. + * Callbacks of preference fragment `onStart`. * - * Clean up and release resource. + * Invoke [PreferenceLifecycleContext.notifyPreferenceChange] to update UI when any internal + * state (e.g. availability, enabled state, title, summary) is changed. */ - fun onDetach(context: Context) + fun onStart(context: PreferenceLifecycleContext) {} - /** Observer of preference state. */ - interface PreferenceStateObserver { + /** + * Callbacks of preference fragment `onResume`. + * + * Invoke [PreferenceLifecycleContext.notifyPreferenceChange] to update UI when any internal + * state (e.g. availability, enabled state, title, summary) is changed. + */ + fun onResume(context: PreferenceLifecycleContext) {} + + /** Callbacks of preference fragment `onPause`. */ + fun onPause(context: PreferenceLifecycleContext) {} + + /** Callbacks of preference fragment `onStop`. */ + fun onStop(context: PreferenceLifecycleContext) {} - /** Callbacks when preference state is changed. */ - fun onPreferenceStateChanged(preference: PreferenceMetadata) - } + /** Callbacks of preference fragment `onDestroy`. */ + fun onDestroy(context: PreferenceLifecycleContext) {} + + /** + * Receives the result from a previous call of + * [PreferenceLifecycleContext.startActivityForResult]. + * + * @return true if the result is handled + */ + fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?): Boolean = false +} + +/** + * [Context] for preference lifecycle. + * + * A preference fragment is associated with a [PreferenceLifecycleContext] only. + */ +abstract class PreferenceLifecycleContext(context: Context) : ContextWrapper(context) { + + /** Notifies that preference state is changed and update preference widget UI. */ + abstract fun notifyPreferenceChange(preference: PreferenceMetadata) + + /** + * Starts activity for result, see [android.app.Activity.startActivityForResult]. + * + * This API can be invoked by any preference, the caller must ensure the request code is unique + * on the preference screen. + */ + abstract fun startActivityForResult(intent: Intent, requestCode: Int, options: Bundle?) } diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt index d501f4fd654d..21621a8b39e1 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceFragment.kt @@ -17,6 +17,7 @@ package com.android.settingslib.preference import android.content.Context +import android.content.Intent import android.os.Bundle import android.util.Log import androidx.annotation.XmlRes @@ -41,7 +42,7 @@ open class PreferenceFragment : createPreferenceScreen(PreferenceScreenFactory(this)) override fun createPreferenceScreen(factory: PreferenceScreenFactory): PreferenceScreen? { - preferenceScreenBindingHelper?.close() + preferenceScreenBindingHelper?.onDestroy() preferenceScreenBindingHelper = null val context = factory.context @@ -66,9 +67,11 @@ open class PreferenceFragment : bindRecursively(it, preferenceBindingFactory, preferenceHierarchy) } ?: return null } + preferenceScreenBindingHelper = PreferenceScreenBindingHelper( context, + this, preferenceBindingFactory, preferenceScreen, preferenceHierarchy, @@ -87,12 +90,44 @@ open class PreferenceFragment : override fun getPreferenceScreenBindingKey(context: Context): String? = arguments?.getString(EXTRA_BINDING_SCREEN_KEY) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + preferenceScreenBindingHelper?.onCreate() + } + + override fun onStart() { + super.onStart() + preferenceScreenBindingHelper?.onStart() + } + + override fun onResume() { + super.onResume() + preferenceScreenBindingHelper?.onResume() + } + + override fun onPause() { + preferenceScreenBindingHelper?.onPause() + super.onPause() + } + + override fun onStop() { + preferenceScreenBindingHelper?.onStop() + super.onStop() + } + override fun onDestroy() { - preferenceScreenBindingHelper?.close() + preferenceScreenBindingHelper?.onDestroy() preferenceScreenBindingHelper = null super.onDestroy() } + @Suppress("DEPRECATION") + @Deprecated("Deprecated in Java") + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + super.onActivityResult(requestCode, resultCode, data) + preferenceScreenBindingHelper?.onActivityResult(requestCode, resultCode, data) + } + protected fun getPreferenceKeysInHierarchy(): Set = preferenceScreenBindingHelper?.getPreferences()?.map { it.key }?.toSet() ?: setOf() diff --git a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt index efa1faf6c485..d99d470cc4c0 100644 --- a/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt +++ b/packages/SettingsLib/Preference/src/com/android/settingslib/preference/PreferenceScreenBindingHelper.kt @@ -17,6 +17,8 @@ package com.android.settingslib.preference import android.content.Context +import android.content.Intent +import android.os.Bundle import android.os.Handler import android.os.Looper import androidx.preference.Preference @@ -29,6 +31,7 @@ import com.android.settingslib.datastore.KeyedObservable import com.android.settingslib.datastore.KeyedObserver import com.android.settingslib.metadata.PersistentPreference import com.android.settingslib.metadata.PreferenceHierarchy +import com.android.settingslib.metadata.PreferenceLifecycleContext import com.android.settingslib.metadata.PreferenceLifecycleProvider import com.android.settingslib.metadata.PreferenceMetadata import com.android.settingslib.metadata.PreferenceScreenRegistry @@ -45,10 +48,11 @@ import java.util.concurrent.Executor */ class PreferenceScreenBindingHelper( context: Context, + fragment: PreferenceFragment, private val preferenceBindingFactory: PreferenceBindingFactory, private val preferenceScreen: PreferenceScreen, private val preferenceHierarchy: PreferenceHierarchy, -) : KeyedDataObservable(), AutoCloseable { +) : KeyedDataObservable() { private val handler = Handler(Looper.getMainLooper()) private val executor = @@ -58,8 +62,22 @@ class PreferenceScreenBindingHelper( } } + private val preferenceLifecycleContext = + object : PreferenceLifecycleContext(context) { + override fun notifyPreferenceChange(preference: PreferenceMetadata) = + notifyChange(preference.key, CHANGE_REASON_STATE) + + @Suppress("DEPRECATION") + override fun startActivityForResult( + intent: Intent, + requestCode: Int, + options: Bundle?, + ) = fragment.startActivityForResult(intent, requestCode, options) + } + private val preferences: ImmutableMap private val dependencies: ImmutableMultimap + private val lifecycleAwarePreferences: Array private val storages = mutableSetOf>() private val preferenceObserver: KeyedObserver @@ -71,16 +89,10 @@ class PreferenceScreenBindingHelper( } } - private val stateObserver = - object : PreferenceLifecycleProvider.PreferenceStateObserver { - override fun onPreferenceStateChanged(preference: PreferenceMetadata) { - notifyChange(preference.key, CHANGE_REASON_STATE) - } - } - init { val preferencesBuilder = ImmutableMap.builder() val dependenciesBuilder = ImmutableMultimap.builder() + val lifecycleAwarePreferences = mutableListOf() fun PreferenceMetadata.addDependency(dependency: PreferenceMetadata) { dependenciesBuilder.put(key, dependency.key) } @@ -88,7 +100,7 @@ class PreferenceScreenBindingHelper( fun PreferenceMetadata.add() { preferencesBuilder.put(key, this) dependencyOfEnabledState(context)?.addDependency(this) - if (this is PreferenceLifecycleProvider) onAttach(context, stateObserver) + if (this is PreferenceLifecycleProvider) lifecycleAwarePreferences.add(this) if (this is PersistentPreference<*>) storages.add(storage(context)) } @@ -106,6 +118,7 @@ class PreferenceScreenBindingHelper( preferenceHierarchy.addPreferences() this.preferences = preferencesBuilder.buildOrThrow() this.dependencies = dependenciesBuilder.build() + this.lifecycleAwarePreferences = lifecycleAwarePreferences.toTypedArray() preferenceObserver = KeyedObserver { key, reason -> onPreferenceChange(key, reason) } addObserver(preferenceObserver, executor) @@ -137,13 +150,48 @@ class PreferenceScreenBindingHelper( fun getPreferences() = preferenceHierarchy.getAllPreferences() - override fun close() { - removeObserver(preferenceObserver) - val context = preferenceScreen.context - for (preference in preferences.values) { - if (preference is PreferenceLifecycleProvider) preference.onDetach(context) + fun onCreate() { + for (preference in lifecycleAwarePreferences) { + preference.onCreate(preferenceLifecycleContext) + } + } + + fun onStart() { + for (preference in lifecycleAwarePreferences) { + preference.onStart(preferenceLifecycleContext) + } + } + + fun onResume() { + for (preference in lifecycleAwarePreferences) { + preference.onResume(preferenceLifecycleContext) + } + } + + fun onPause() { + for (preference in lifecycleAwarePreferences) { + preference.onPause(preferenceLifecycleContext) + } + } + + fun onStop() { + for (preference in lifecycleAwarePreferences) { + preference.onStop(preferenceLifecycleContext) } + } + + fun onDestroy() { + removeObserver(preferenceObserver) for (storage in storages) storage.removeObserver(storageObserver) + for (preference in lifecycleAwarePreferences) { + preference.onDestroy(preferenceLifecycleContext) + } + } + + fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + for (preference in lifecycleAwarePreferences) { + if (preference.onActivityResult(requestCode, resultCode, data)) break + } } companion object { -- GitLab From 8d4a96e45b0573ea7bb629c15b7fd5395012e9df Mon Sep 17 00:00:00 2001 From: Graciela Wissen Putri Date: Thu, 24 Oct 2024 03:44:20 +0000 Subject: [PATCH 361/459] [1/n] Add flag for VDM full-screen API Flag: com.android.window.flags.vdm_force_app_universal_resizable_api Bug: 372848702 Bug: 337894172 Test: m Change-Id: I586b0f517c3ec9876035ffb50b3a077931f443f6 --- .../flags/large_screen_experiences_app_compat.aconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig index 235ba3a41427..7ad14b0c9fe8 100644 --- a/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig +++ b/core/java/android/window/flags/large_screen_experiences_app_compat.aconfig @@ -142,4 +142,12 @@ flag { description: "Whether the declarative compat UI framework is enabled" bug: "270361630" is_fixed_read_only: true +} + +flag { + name: "vdm_force_app_universal_resizable_api" + namespace: "large_screen_experiences_app_compat" + description: "Whether the API for forcing apps to be universal resizable on virtual display is available" + bug: "372848702" + is_exported: true } \ No newline at end of file -- GitLab From 1b35f6422b1bfcac83b594e95761a856f2379b3c Mon Sep 17 00:00:00 2001 From: Zhenhua Deng Date: Mon, 21 Oct 2024 06:18:01 +0000 Subject: [PATCH 362/459] Improve the release of predict_back animaton leash Seems the predict_back nimation leash cant be released in time after gesture animation already finsihed, and it will keep for long time it may cause SurfaceFlinger memory loading high and layer count too much. Flag: EXEMPT bugfix Bug: 370247136 Test: repeatly open settings and gesture predict back to home launcher (cherry picked from https://partner-android-review.googlesource.com/q/commit:7c1a0cf0be835656dbc9897535b5ee55ba1ea33f) Merged-In: I51845842decf47a79da755418c61a227eae6474a Change-Id: I51845842decf47a79da755418c61a227eae6474a --- .../wm/shell/back/BackAnimationRunner.java | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java index 4988a9481d21..851472f7d4c1 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/back/BackAnimationRunner.java @@ -25,6 +25,7 @@ import android.util.Log; import android.view.IRemoteAnimationFinishedCallback; import android.view.IRemoteAnimationRunner; import android.view.RemoteAnimationTarget; +import android.view.SurfaceControl; import android.window.IBackAnimationRunner; import android.window.IOnBackInvokedCallback; @@ -32,6 +33,8 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.jank.Cuj.CujType; import com.android.wm.shell.common.InteractionJankMonitorUtils; +import java.lang.ref.WeakReference; + /** * Used to register the animation callback and runner, it will trigger result if gesture was finish * before it received IBackAnimationRunner#onAnimationStart, so the controller could continue @@ -80,22 +83,49 @@ public class BackAnimationRunner { return mCallback; } + private Runnable mFinishedCallback; + private RemoteAnimationTarget[] mApps; + private IRemoteAnimationFinishedCallback mRemoteCallback; + + private static class RemoteAnimationFinishedStub extends IRemoteAnimationFinishedCallback.Stub { + //the binder callback should not hold strong reference to it to avoid memory leak. + private WeakReference mRunnerRef; + + private RemoteAnimationFinishedStub(BackAnimationRunner runner) { + mRunnerRef = new WeakReference<>(runner); + } + + @Override + public void onAnimationFinished() { + BackAnimationRunner runner = mRunnerRef.get(); + if (runner == null) { + return; + } + if (runner.shouldMonitorCUJ(runner.mApps)) { + InteractionJankMonitorUtils.endTracing(runner.mCujType); + } + + runner.mFinishedCallback.run(); + for (int i = runner.mApps.length - 1; i >= 0; --i) { + SurfaceControl sc = runner.mApps[i].leash; + if (sc != null && sc.isValid()) { + sc.release(); + } + } + runner.mApps = null; + runner.mFinishedCallback = null; + } + } + /** * Called from {@link IBackAnimationRunner}, it will deliver these * {@link RemoteAnimationTarget}s to the corresponding runner. */ void startAnimation(RemoteAnimationTarget[] apps, RemoteAnimationTarget[] wallpapers, RemoteAnimationTarget[] nonApps, Runnable finishedCallback) { - final IRemoteAnimationFinishedCallback callback = - new IRemoteAnimationFinishedCallback.Stub() { - @Override - public void onAnimationFinished() { - if (shouldMonitorCUJ(apps)) { - InteractionJankMonitorUtils.endTracing(mCujType); - } - finishedCallback.run(); - } - }; + mFinishedCallback = finishedCallback; + mApps = apps; + if (mRemoteCallback == null) mRemoteCallback = new RemoteAnimationFinishedStub(this); mWaitingAnimation = false; if (shouldMonitorCUJ(apps)) { InteractionJankMonitorUtils.beginTracing( @@ -103,7 +133,7 @@ public class BackAnimationRunner { } try { getRunner().onAnimationStart(TRANSIT_OLD_UNSET, apps, wallpapers, - nonApps, callback); + nonApps, mRemoteCallback); } catch (RemoteException e) { Log.w(TAG, "Failed call onAnimationStart", e); } -- GitLab From f9e752d4fa5b9adacf2d8b83bc945310f0591649 Mon Sep 17 00:00:00 2001 From: Riddle Hsu Date: Thu, 24 Oct 2024 12:33:39 +0800 Subject: [PATCH 363/459] Report moved-to-top as the last launched activity When starting home while it has an embedded activity on top, the home activity will reorder to top by Task#moveTaskFragmentsToBottomIfNeeded Task > TaskFragment > embedded activity > HomeActivity Then the launched activity should be home instead of the embedded activity. Fix: 373284518 Flag: EXEMPT bugfix Test: ActivityStarterTests.testRecordActivityMovementBeforeDeliverToTop Test: Launch chrome from embedded minus one. Swipe up to return to home. The launch trace should end by home package instead if a long period until minus one activity is visible again. Change-Id: If93032a18d225469ca05affb1df525659f786586 --- .../core/java/com/android/server/wm/ActivityStarter.java | 5 ++++- .../src/com/android/server/wm/ActivityStarterTests.java | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 5d3ae54f0934..6bb149355ec3 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -2370,6 +2370,9 @@ class ActivityStarter { return START_SUCCESS; } + if (mMovedToTopActivity != null) { + targetTaskTop = mMovedToTopActivity; + } // The reusedActivity could be finishing, for example of starting an activity with // FLAG_ACTIVITY_CLEAR_TOP flag. In that case, use the top running activity in the // task instead. @@ -2608,7 +2611,7 @@ class ActivityStarter { mInTaskFragment = null; mAddingToTaskFragment = null; mAddingToTask = false; - + mMovedToTopActivity = null; mSourceRootTask = null; mTargetRootTask = null; diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java index d5f86b6feac8..b25b13f30e20 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStarterTests.java @@ -1625,16 +1625,18 @@ public class ActivityStarterTests extends WindowTestsBase { assertTrue(activityTop.isVisible()); assertTrue(activityTop.isVisibleRequested()); + final ActivityRecord[] outActivity = new ActivityRecord[1]; final ActivityStarter starter = prepareStarter(FLAG_ACTIVITY_REORDER_TO_FRONT | FLAG_ACTIVITY_NEW_TASK, false /* mockGetRootTask */); starter.mStartActivity = activityBot; task.inRecents = true; - starter.setInTask(task); + starter.setInTask(task).setOutActivity(outActivity); starter.getIntent().setComponent(activityBot.mActivityComponent); final int result = starter.setReason("testRecordActivityMovement").execute(); assertEquals(START_DELIVERED_TO_TOP, result); assertNotNull(starter.mMovedToTopActivity); + assertEquals(activityBot, outActivity[0]); final ActivityStarter starter2 = prepareStarter(FLAG_ACTIVITY_REORDER_TO_FRONT | FLAG_ACTIVITY_NEW_TASK, false /* mockGetRootTask */); -- GitLab From d291d3c5892ec824c8d6addc320b806dcddf84da Mon Sep 17 00:00:00 2001 From: Haofan Wang Date: Mon, 21 Oct 2024 14:41:21 -0700 Subject: [PATCH 364/459] Add permissions for media quality service - `android.permission.MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE for access global picture quality params - `android.permission.MANAGE_GLOBAL_SOUND_QUALITY_SERVICE for access global sound quality params Bug: 375312083 Test: m Flag: android.media.tv.flags.media_quality_fw Change-Id: Idb8bd23c4944c264660ae2da2f3ed895bea474f9 --- core/api/system-current.txt | 2 ++ core/res/AndroidManifest.xml | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/core/api/system-current.txt b/core/api/system-current.txt index 207f4b57e8bf..33e52bd0b400 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -209,6 +209,8 @@ package android { field public static final String MANAGE_FACTORY_RESET_PROTECTION = "android.permission.MANAGE_FACTORY_RESET_PROTECTION"; field public static final String MANAGE_GAME_ACTIVITY = "android.permission.MANAGE_GAME_ACTIVITY"; field public static final String MANAGE_GAME_MODE = "android.permission.MANAGE_GAME_MODE"; + field @FlaggedApi("android.media.tv.flags.media_quality_fw") public static final String MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE = "android.permission.MANAGE_GLOBAL_PICTURE_QUALITY_SERVICE"; + field @FlaggedApi("android.media.tv.flags.media_quality_fw") public static final String MANAGE_GLOBAL_SOUND_QUALITY_SERVICE = "android.permission.MANAGE_GLOBAL_SOUND_QUALITY_SERVICE"; field public static final String MANAGE_HOTWORD_DETECTION = "android.permission.MANAGE_HOTWORD_DETECTION"; field public static final String MANAGE_IPSEC_TUNNELS = "android.permission.MANAGE_IPSEC_TUNNELS"; field public static final String MANAGE_LOW_POWER_STANDBY = "android.permission.MANAGE_LOW_POWER_STANDBY"; diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index 6ab64768d9f0..4ec35cad6315 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -8475,6 +8475,27 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml index c494e8525e0f..0aa5ccf7a2b4 100644 --- a/packages/SystemUI/res/values/strings.xml +++ b/packages/SystemUI/res/values/strings.xml @@ -1463,6 +1463,12 @@ History + + Notification settings + + + Notification history + New diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml index 1ab9242438b9..ab45b9f1b5bc 100644 --- a/packages/SystemUI/res/values/styles.xml +++ b/packages/SystemUI/res/values/styles.xml @@ -785,6 +785,16 @@ 0dp + + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java index 5a616dfd1f63..e5ce25d5144e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/view/FooterView.java @@ -40,6 +40,7 @@ import android.widget.TextView; import androidx.annotation.NonNull; import com.android.settingslib.Utils; +import com.android.systemui.Flags; import com.android.systemui.res.R; import com.android.systemui.statusbar.notification.ColorUpdateLogger; import com.android.systemui.statusbar.notification.footer.shared.FooterViewRefactor; @@ -59,6 +60,9 @@ public class FooterView extends StackScrollerDecorView { private FooterViewButton mClearAllButton; private FooterViewButton mManageOrHistoryButton; + // The settings & history buttons replace the single manage/history button in the redesign + private FooterViewButton mSettingsButton; + private FooterViewButton mHistoryButton; private boolean mShouldBeHidden; private boolean mShowHistory; // String cache, for performance reasons. @@ -269,7 +273,12 @@ public class FooterView extends StackScrollerDecorView { } super.onFinishInflate(); mClearAllButton = (FooterViewButton) findSecondaryView(); - mManageOrHistoryButton = findViewById(R.id.manage_text); + if (Flags.notificationsRedesignFooterView()) { + mSettingsButton = findViewById(R.id.settings_button); + mHistoryButton = findViewById(R.id.history_button); + } else { + mManageOrHistoryButton = findViewById(R.id.manage_text); + } mSeenNotifsFooterTextView = findViewById(R.id.unlock_prompt_footer); if (!FooterViewRefactor.isEnabled()) { updateResources(); @@ -342,8 +351,10 @@ public class FooterView extends StackScrollerDecorView { updateClearAllButtonText(); updateClearAllButtonDescription(); - updateManageOrHistoryButtonText(); - updateManageOrHistoryButtonDescription(); + if (!Flags.notificationsRedesignFooterView()) { + updateManageOrHistoryButtonText(); + updateManageOrHistoryButtonDescription(); + } updateMessageString(); updateMessageIcon(); @@ -420,8 +431,16 @@ public class FooterView extends StackScrollerDecorView { } mClearAllButton.setBackground(clearAllBg); mClearAllButton.setTextColor(onSurface); - mManageOrHistoryButton.setBackground(manageBg); - mManageOrHistoryButton.setTextColor(onSurface); + if (Flags.notificationsRedesignFooterView()) { + mSettingsButton.setBackground(manageBg); + mSettingsButton.setCompoundDrawableTintList(ColorStateList.valueOf(onSurface)); + + mHistoryButton.setBackground(manageBg); + mHistoryButton.setCompoundDrawableTintList(ColorStateList.valueOf(onSurface)); + } else { + mManageOrHistoryButton.setBackground(manageBg); + mManageOrHistoryButton.setTextColor(onSurface); + } mSeenNotifsFooterTextView.setTextColor(onSurface); mSeenNotifsFooterTextView.setCompoundDrawableTintList(ColorStateList.valueOf(onSurface)); ColorUpdateLogger colorUpdateLogger = ColorUpdateLogger.getInstance(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt index 2ec7f532d8c3..ddd9cdd5e306 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/footer/ui/viewbinder/FooterViewBinder.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.notification.footer.ui.viewbinder import android.view.View import androidx.lifecycle.lifecycleScope +import com.android.systemui.Flags import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.statusbar.notification.NotificationActivityStarter import com.android.systemui.statusbar.notification.emptyshade.shared.ModesEmptyShadeFix @@ -63,14 +64,16 @@ object FooterViewBinder { notificationActivityStarter: NotificationActivityStarter, ) = coroutineScope { launch { bindClearAllButton(footer, viewModel, clearAllNotifications) } - launch { - bindManageOrHistoryButton( - footer, - viewModel, - launchNotificationSettings, - launchNotificationHistory, - notificationActivityStarter, - ) + if (!Flags.notificationsRedesignFooterView()) { + launch { + bindManageOrHistoryButton( + footer, + viewModel, + launchNotificationSettings, + launchNotificationHistory, + notificationActivityStarter, + ) + } } launch { bindMessage(footer, viewModel) } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt index 787ff024a4d6..fd19f1ff634e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/stack/ui/viewbinder/NotificationListViewBinder.kt @@ -22,6 +22,7 @@ import androidx.lifecycle.lifecycleScope import com.android.app.tracing.TraceUtils.traceAsync import com.android.internal.logging.MetricsLogger import com.android.internal.logging.nano.MetricsProto +import com.android.systemui.Flags import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.common.ui.view.setImportantForAccessibilityYesNo import com.android.systemui.dagger.qualifiers.Background @@ -145,7 +146,9 @@ constructor( // The footer needs to be re-inflated every time the theme or the font size changes. configuration .inflateLayout( - R.layout.status_bar_notification_footer, + if (Flags.notificationsRedesignFooterView()) + R.layout.status_bar_notification_footer_redesign + else R.layout.status_bar_notification_footer, parentView, attachToRoot = false, ) -- GitLab From e8d1338a01a7f1ce24622486ccfcd6930d653a04 Mon Sep 17 00:00:00 2001 From: Nan Wu Date: Wed, 23 Oct 2024 19:24:59 +0000 Subject: [PATCH 384/459] Fix check creator token 1. add creator token when sendIntentSender 2. copy creatorTokenInfo in fillin 3. Toward the end of the ActivityStarter.executeRequest, remove creatorToken only, not creatorTokenInfo. the collected keys need to be delievered to the client after the activity is started. 4. in collectExtraIntentKey method, remove the check of !isParceled because if the intent was an extra (as in nested embedded intents) this check causes the keys not collected. In the CL for nested intents I believe we can restore this check. Bug: 375073264 Test: ExternalSourcesTestAppOpAllowed#allowedSourceTestViaSession Flag: TEST_ONLY Change-Id: I5cd41f100619becaf82b392ffca71af5a4925418 --- core/java/android/content/Intent.java | 10 +++++++++- .../com/android/server/am/ActivityManagerService.java | 2 ++ .../java/com/android/server/wm/ActivityStarter.java | 2 +- .../android/server/wm/ActivityTaskManagerService.java | 1 - 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index e8cec70ef6a8..06754538b522 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -11672,6 +11672,7 @@ public class Intent implements Parcelable, Cloneable { Log.w(TAG, "Failure filling in extras", e); } } + mCreatorTokenInfo = other.mCreatorTokenInfo; if (mayHaveCopiedUris && mContentUserHint == UserHandle.USER_CURRENT && other.mContentUserHint != UserHandle.USER_CURRENT) { mContentUserHint = other.mContentUserHint; @@ -12224,6 +12225,13 @@ public class Intent implements Parcelable, Cloneable { mCreatorTokenInfo = null; } + /** @hide */ + public void removeCreatorToken() { + if (mCreatorTokenInfo != null) { + mCreatorTokenInfo.mCreatorToken = null; + } + } + /** @hide */ public @Nullable IBinder getCreatorToken() { return mCreatorTokenInfo == null ? null : mCreatorTokenInfo.mCreatorToken; @@ -12251,7 +12259,7 @@ public class Intent implements Parcelable, Cloneable { public void collectExtraIntentKeys() { if (!isPreventIntentRedirectEnabled()) return; - if (mExtras != null && !mExtras.isParcelled() && !mExtras.isEmpty()) { + if (mExtras != null && !mExtras.isEmpty()) { for (String key : mExtras.keySet()) { if (mExtras.get(key) instanceof Intent) { if (mCreatorTokenInfo == null) { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 6ba851423219..b473d88a4464 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -5550,6 +5550,8 @@ public class ActivityManagerService extends IActivityManager.Stub if (target instanceof PendingIntentRecord) { final PendingIntentRecord originalRecord = (PendingIntentRecord) target; + addCreatorToken(intent, originalRecord.getPackageName()); + // In multi-display scenarios, there can be background users who execute the // PendingIntent. In these scenarios, we don't want to use the foreground user as the // current user. diff --git a/services/core/java/com/android/server/wm/ActivityStarter.java b/services/core/java/com/android/server/wm/ActivityStarter.java index 2c4179fb6d88..e795b7b4a10b 100644 --- a/services/core/java/com/android/server/wm/ActivityStarter.java +++ b/services/core/java/com/android/server/wm/ActivityStarter.java @@ -1275,8 +1275,8 @@ class ActivityStarter { "Creator PermissionPolicyService.checkStartActivity Caused abortion.", intent, intentCreatorUid, intentCreatorPackage, callingUid, callingPackage); } - intent.removeCreatorTokenInfo(); } + intent.removeCreatorToken(); // Merge the two options bundles, while realCallerOptions takes precedence. ActivityOptions checkedOptions = options != null diff --git a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java index 111e74e9b590..25a1ea9579e7 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskManagerService.java +++ b/services/core/java/com/android/server/wm/ActivityTaskManagerService.java @@ -1228,7 +1228,6 @@ public class ActivityTaskManagerService extends IActivityTaskManager.Stub { String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) { - mAmInternal.addCreatorToken(intent, callingPackage); return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType, resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, UserHandle.getCallingUserId()); -- GitLab From 93678d42c554c3b6e179960e76f5d2b9f294f299 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Wed, 23 Oct 2024 19:44:10 +0000 Subject: [PATCH 385/459] Remove MutableStateFlow for transition current info When multiple threads are attempting to begin transitions, the MutableStateFlow can get stuck on a background thread while emitting the update the consumers. This leaves a small chance for other transitions to jump the queue, ones that are scheduled onto a more favorable thread. Avoid MutableStateFlow completely. There's no need, just use a volatile to store state. Fixes: 358533338 Test: atest KeyguardTransitionRepositoryTest Flag: com.android.systemui.transition_race_condition Change-Id: I1daf9d5074c966445a1ed54acc10fb91193d6c85 --- packages/SystemUI/aconfig/systemui.aconfig | 10 ++++ .../CommunalSceneTransitionInteractor.kt | 6 +-- .../KeyguardTransitionRepository.kt | 53 ++++++++++++++----- .../FromLockscreenTransitionInteractor.kt | 14 ++--- .../InternalKeyguardTransitionInteractor.kt | 17 +++--- .../KeyguardDismissTransitionInteractor.kt | 11 +++- .../interactor/KeyguardEnabledInteractor.kt | 19 +++---- .../interactor/KeyguardOcclusionInteractor.kt | 8 +-- .../KeyguardTransitionBootInteractor.kt | 2 +- .../domain/interactor/TransitionInteractor.kt | 19 +++---- ...owManagerLockscreenVisibilityInteractor.kt | 16 ++++-- .../LockscreenSceneTransitionInteractor.kt | 17 +++--- .../DozingToOccludedTransitionViewModel.kt | 11 +--- .../FakeKeyguardTransitionRepository.kt | 23 ++++++-- 14 files changed, 141 insertions(+), 85 deletions(-) diff --git a/packages/SystemUI/aconfig/systemui.aconfig b/packages/SystemUI/aconfig/systemui.aconfig index 227878975114..5cde32224de0 100644 --- a/packages/SystemUI/aconfig/systemui.aconfig +++ b/packages/SystemUI/aconfig/systemui.aconfig @@ -1545,6 +1545,16 @@ flag { bug: "362719719" } +flag { + name: "transition_race_condition" + namespace: "systemui" + description: "Thread-safe keyguard transitions" + bug: "358533338" + metadata { + purpose: PURPOSE_BUGFIX + } +} + flag { name: "media_projection_request_attribution_fix" namespace: "systemui" diff --git a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt index 7b8c19c67d9b..ec5540172be5 100644 --- a/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/communal/domain/interactor/CommunalSceneTransitionInteractor.kt @@ -73,7 +73,7 @@ constructor( private var progressJob: Job? = null private val currentToState: KeyguardState - get() = internalTransitionInteractor.currentTransitionInfoInternal.value.to + get() = internalTransitionInteractor.currentTransitionInfoInternal().to /** * The next keyguard state to trigger when exiting [CommunalScenes.Communal]. This is only used @@ -197,7 +197,7 @@ constructor( val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, - from = internalTransitionInteractor.currentTransitionInfoInternal.value.to, + from = internalTransitionInteractor.currentTransitionInfoInternal().to, to = state, animator = null, modeOnCanceled = TransitionModeOnCanceled.REVERSE, @@ -273,7 +273,7 @@ constructor( } private suspend fun startTransitionToGlanceableHub() { - val currentState = internalTransitionInteractor.currentTransitionInfoInternal.value.to + val currentState = internalTransitionInteractor.currentTransitionInfoInternal().to val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, 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 b7d0d453779f..3a5614fbc430 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 @@ -25,6 +25,7 @@ import android.os.Trace import android.util.Log import com.android.app.animation.Interpolators import com.android.app.tracing.coroutines.withContextTraced as withContext +import com.android.systemui.Flags.transitionRaceCondition import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.keyguard.shared.model.KeyguardState @@ -77,6 +78,8 @@ interface KeyguardTransitionRepository { /** The [TransitionInfo] of the most recent call to [startTransition]. */ val currentTransitionInfoInternal: StateFlow + /** The [TransitionInfo] of the most recent call to [startTransition]. */ + val currentTransitionInfo: TransitionInfo /** * Interactors that require information about changes between [KeyguardState]s will call this to @@ -132,7 +135,7 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR private var lastStep: TransitionStep = TransitionStep() private var lastAnimator: ValueAnimator? = null - private val _currentTransitionMutex = Mutex() + private val withContextMutex = Mutex() private val _currentTransitionInfo: MutableStateFlow = MutableStateFlow( TransitionInfo( @@ -144,6 +147,16 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR ) override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow() + @Volatile + override var currentTransitionInfo: TransitionInfo = + TransitionInfo( + ownerName = "", + from = KeyguardState.OFF, + to = KeyguardState.OFF, + animator = null, + ) + private set + /* * When manual control of the transition is requested, a unique [UUID] is used as the handle * to permit calls to [updateTransition] @@ -163,13 +176,17 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR } override suspend fun startTransition(info: TransitionInfo): UUID? { - _currentTransitionInfo.value = info + if (transitionRaceCondition()) { + currentTransitionInfo = info + } else { + _currentTransitionInfo.value = info + } Log.d(TAG, "(Internal) Setting current transition info: $info") // There is no fairness guarantee with 'withContext', which means that transitions could // be processed out of order. Use a Mutex to guarantee ordering. [updateTransition] // requires the same lock - _currentTransitionMutex.lock() + withContextMutex.lock() // Only used in a test environment if (forceDelayForRaceConditionTest) { delay(50L) @@ -177,7 +194,7 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR // Animators must be started on the main thread. return withContext("$TAG#startTransition", mainDispatcher) { - _currentTransitionMutex.unlock() + withContextMutex.unlock() if (lastStep.from == info.from && lastStep.to == info.to) { Log.i(TAG, "Duplicate call to start the transition, rejecting: $info") return@withContext null @@ -265,9 +282,9 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR // There is no fairness guarantee with 'withContext', which means that transitions could // be processed out of order. Use a Mutex to guarantee ordering. [startTransition] // requires the same lock - _currentTransitionMutex.lock() + withContextMutex.lock() withContext("$TAG#updateTransition", mainDispatcher) { - _currentTransitionMutex.unlock() + withContextMutex.unlock() updateTransitionInternal(transitionId, value, state) } @@ -302,13 +319,23 @@ constructor(@Main val mainDispatcher: CoroutineDispatcher) : KeyguardTransitionR // Tests runs on testDispatcher, which is not the main thread, causing the animator thread // check to fail if (testSetup) { - _currentTransitionInfo.value = - TransitionInfo( - ownerName = ownerName, - from = KeyguardState.OFF, - to = to, - animator = null, - ) + if (transitionRaceCondition()) { + currentTransitionInfo = + TransitionInfo( + ownerName = ownerName, + from = KeyguardState.OFF, + to = to, + animator = null, + ) + } else { + _currentTransitionInfo.value = + TransitionInfo( + ownerName = ownerName, + from = KeyguardState.OFF, + to = to, + animator = null, + ) + } emitTransition( TransitionStep( KeyguardState.OFF, 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 a7dde34e3026..8b75545fddc9 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 @@ -40,6 +40,7 @@ import com.android.systemui.scene.shared.flag.SceneContainerFlag import com.android.systemui.scene.shared.model.Scenes import com.android.systemui.shade.data.repository.ShadeRepository import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine +import com.android.systemui.util.kotlin.sample import java.util.UUID import javax.inject.Inject import kotlin.time.Duration.Companion.milliseconds @@ -132,11 +133,10 @@ constructor( scope.launch("$TAG#listenForLockscreenToDreaming") { keyguardInteractor.isAbleToDream .filterRelevantKeyguardState() - .sampleCombine( - internalTransitionInteractor.currentTransitionInfoInternal, - transitionInteractor.isFinishedIn(KeyguardState.LOCKSCREEN), - ) - .collect { (isAbleToDream, transitionInfo, isOnLockscreen) -> + .sample(transitionInteractor.isFinishedIn(KeyguardState.LOCKSCREEN), ::Pair) + .collect { (isAbleToDream, isOnLockscreen) -> + val transitionInfo = + internalTransitionInteractor.currentTransitionInfoInternal() val isTransitionInterruptible = transitionInfo.to == KeyguardState.LOCKSCREEN && !invalidFromStates.contains(transitionInfo.from) @@ -179,7 +179,6 @@ constructor( shadeRepository.legacyShadeExpansion .sampleCombine( transitionInteractor.startedKeyguardTransitionStep, - internalTransitionInteractor.currentTransitionInfoInternal, keyguardInteractor.statusBarState, keyguardInteractor.isKeyguardDismissible, keyguardInteractor.isKeyguardOccluded, @@ -188,11 +187,12 @@ constructor( ( shadeExpansion, startedStep, - currentTransitionInfo, statusBarState, isKeyguardUnlocked, isKeyguardOccluded) -> val id = transitionId + val currentTransitionInfo = + internalTransitionInteractor.currentTransitionInfoInternal() if (id != null) { if (startedStep.to == KeyguardState.PRIMARY_BOUNCER) { // An existing `id` means a transition is started, and calls to diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt index 2cc6afa2f407..05078346399a 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/InternalKeyguardTransitionInteractor.kt @@ -17,13 +17,13 @@ package com.android.systemui.keyguard.domain.interactor import android.annotation.FloatRange +import com.android.systemui.Flags.transitionRaceCondition import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.TransitionInfo import com.android.systemui.keyguard.shared.model.TransitionState import java.util.UUID import javax.inject.Inject -import kotlinx.coroutines.flow.StateFlow /** * This interactor provides direct access to [KeyguardTransitionRepository] internals and exposes @@ -32,9 +32,7 @@ import kotlinx.coroutines.flow.StateFlow @SysUISingleton class InternalKeyguardTransitionInteractor @Inject -constructor( - private val repository: KeyguardTransitionRepository, -) { +constructor(private val repository: KeyguardTransitionRepository) { /** * The [TransitionInfo] of the most recent call to @@ -58,14 +56,19 @@ constructor( * *will* be emitted, and therefore that it can safely request an AOD -> LOCKSCREEN transition * which will subsequently cancel GONE -> AOD. */ - internal val currentTransitionInfoInternal: StateFlow = - repository.currentTransitionInfoInternal + internal fun currentTransitionInfoInternal(): TransitionInfo { + return if (transitionRaceCondition()) { + repository.currentTransitionInfo + } else { + repository.currentTransitionInfoInternal.value + } + } suspend fun startTransition(info: TransitionInfo) = repository.startTransition(info) suspend fun updateTransition( transitionId: UUID, @FloatRange(from = 0.0, to = 1.0) value: Float, - state: TransitionState + state: TransitionState, ) = repository.updateTransition(transitionId, value, state) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt index c19bbbce3b4b..4793d95b121c 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardDismissTransitionInteractor.kt @@ -17,6 +17,7 @@ package com.android.systemui.keyguard.domain.interactor import android.util.Log +import com.android.systemui.Flags.transitionRaceCondition import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository import com.android.systemui.keyguard.shared.model.KeyguardState @@ -51,7 +52,13 @@ constructor( fun startDismissKeyguardTransition(reason: String = "") { if (SceneContainerFlag.isEnabled) return Log.d(TAG, "#startDismissKeyguardTransition(reason=$reason)") - when (val startedState = repository.currentTransitionInfoInternal.value.to) { + val startedState = + if (transitionRaceCondition()) { + repository.currentTransitionInfo.to + } else { + repository.currentTransitionInfoInternal.value.to + } + when (startedState) { LOCKSCREEN -> fromLockscreenTransitionInteractor.dismissKeyguard() PRIMARY_BOUNCER -> fromPrimaryBouncerTransitionInteractor.dismissPrimaryBouncer() ALTERNATE_BOUNCER -> fromAlternateBouncerTransitionInteractor.dismissAlternateBouncer() @@ -61,7 +68,7 @@ constructor( KeyguardState.GONE -> Log.i( TAG, - "Already transitioning to GONE; ignoring startDismissKeyguardTransition." + "Already transitioning to GONE; ignoring startDismissKeyguardTransition.", ) else -> Log.e(TAG, "We don't know how to dismiss keyguard from state $startedState.") } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt index 5f08aa320c95..631e44aca26d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardEnabledInteractor.kt @@ -22,7 +22,7 @@ import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.KeyguardRepository import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.scene.shared.flag.SceneContainerFlag -import com.android.systemui.util.kotlin.Utils.Companion.sample as sampleCombine +import com.android.systemui.util.kotlin.sample import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.Flow @@ -74,11 +74,9 @@ constructor( .onEach { SceneContainerFlag.assertInLegacyMode() } // Whenever the keyguard is disabled... .filter { enabled -> !enabled } - .sampleCombine( - internalTransitionInteractor.currentTransitionInfoInternal, - biometricSettingsRepository.isCurrentUserInLockdown, - ) - .map { (_, transitionInfo, inLockdown) -> + .sample(biometricSettingsRepository.isCurrentUserInLockdown, ::Pair) + .map { (_, inLockdown) -> + val transitionInfo = internalTransitionInteractor.currentTransitionInfoInternal() // ...we hide the keyguard, if it's showing and we're not in lockdown. In that case, // we want to remember that and re-show it when keyguard is enabled again. transitionInfo.to != KeyguardState.GONE && !inLockdown @@ -93,11 +91,10 @@ constructor( if (!SceneContainerFlag.isEnabled) { repository.isKeyguardEnabled .filter { enabled -> !enabled } - .sampleCombine( - biometricSettingsRepository.isCurrentUserInLockdown, - internalTransitionInteractor.currentTransitionInfoInternal, - ) - .collect { (_, inLockdown, currentTransitionInfo) -> + .sample(biometricSettingsRepository.isCurrentUserInLockdown, ::Pair) + .collect { (_, inLockdown) -> + val currentTransitionInfo = + internalTransitionInteractor.currentTransitionInfoInternal() if (currentTransitionInfo.to != KeyguardState.GONE && !inLockdown) { keyguardDismissTransitionInteractor.startDismissKeyguardTransition( "keyguard disabled" diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt index 7f1e881c0863..278a98f8b157 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardOcclusionInteractor.kt @@ -80,7 +80,7 @@ constructor( // *_BOUNCER -> LOCKSCREEN. return powerInteractor.detailedWakefulness.value.powerButtonLaunchGestureTriggered && KeyguardState.deviceIsAsleepInState( - internalTransitionInteractor.currentTransitionInfoInternal.value.to + internalTransitionInteractor.currentTransitionInfoInternal().to ) } @@ -100,13 +100,13 @@ constructor( scene = Scenes.Gone, stateWithoutSceneContainer = KeyguardState.GONE, ), - ::Pair + ::Pair, ) .map { (wakefulness, isOnGone) -> wakefulness.powerButtonLaunchGestureTriggered && !isOnGone }, // Emit false once that activity goes away. - isShowWhenLockedActivityOnTop.filter { !it }.map { false } + isShowWhenLockedActivityOnTop.filter { !it }.map { false }, ) .stateIn(applicationScope, SharingStarted.Eagerly, false) @@ -134,7 +134,7 @@ constructor( */ fun setWmNotifiedShowWhenLockedActivityOnTop( showWhenLockedActivityOnTop: Boolean, - taskInfo: RunningTaskInfo? = null + taskInfo: RunningTaskInfo? = null, ) { repository.setShowWhenLockedActivityInfo(showWhenLockedActivityOnTop, taskInfo) } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt index cddeaaf27fb9..b986d56e9a82 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/KeyguardTransitionBootInteractor.kt @@ -61,7 +61,7 @@ constructor( fun start() { scope.launch { - if (internalTransitionInteractor.currentTransitionInfoInternal.value.from != OFF) { + if (internalTransitionInteractor.currentTransitionInfoInternal().from != OFF) { Log.e( "KeyguardTransitionInteractor", "showLockscreenOnBoot emitted, but we've already " + diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt index 249982d710a7..abd7f90bbf22 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/TransitionInteractor.kt @@ -71,14 +71,14 @@ sealed class TransitionInteractor( ownerReason: String = "", ): UUID? { toState.checkValidState() - if (fromState != internalTransitionInteractor.currentTransitionInfoInternal.value.to) { + if (fromState != internalTransitionInteractor.currentTransitionInfoInternal().to) { Log.e( name, "Ignoring startTransition: This interactor asked to transition from " + "$fromState -> $toState, but we last transitioned to " + - "${internalTransitionInteractor.currentTransitionInfoInternal.value.to}, not" + + "${internalTransitionInteractor.currentTransitionInfoInternal().to}, not" + " $fromState. This should never happen - check currentTransitionInfoInternal" + - " or use filterRelevantKeyguardState before starting transitions." + " or use filterRelevantKeyguardState before starting transitions.", ) return null } @@ -149,7 +149,7 @@ sealed class TransitionInteractor( if (keyguardInteractor.isKeyguardDismissible.value) { startTransitionTo( KeyguardState.GONE, - ownerReason = "Power button gesture while keyguard is dismissible" + ownerReason = "Power button gesture while keyguard is dismissible", ) return true @@ -159,7 +159,7 @@ sealed class TransitionInteractor( // should transition to GONE. startTransitionTo( KeyguardState.GONE, - ownerReason = "Power button gesture on dismissable keyguard" + ownerReason = "Power button gesture on dismissable keyguard", ) return true @@ -190,16 +190,13 @@ sealed class TransitionInteractor( startTransitionTo( toState = keyguardInteractor.asleepKeyguardState.value, modeOnCanceled = modeOnCanceled, - ownerReason = "Sleep transition triggered" + ownerReason = "Sleep transition triggered", ) } } /** This signal may come in before the occlusion signal, and can provide a custom transition */ - fun listenForTransitionToCamera( - scope: CoroutineScope, - keyguardInteractor: KeyguardInteractor, - ) { + fun listenForTransitionToCamera(scope: CoroutineScope, keyguardInteractor: KeyguardInteractor) { if (!KeyguardWmStateRefactor.isEnabled) { scope.launch { keyguardInteractor.onCameraLaunchDetected.filterRelevantKeyguardState().collect { @@ -223,7 +220,7 @@ sealed class TransitionInteractor( * [startedKeyguardState] as it does not wait for the emission of the first STARTED step. */ fun inOrTransitioningToRelevantKeyguardState(): Boolean { - return internalTransitionInteractor.currentTransitionInfoInternal.value.to == fromState + return internalTransitionInteractor.currentTransitionInfoInternal().to == fromState } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt index a09cd7c12d42..a1f606740cd9 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/WindowManagerLockscreenVisibilityInteractor.kt @@ -19,6 +19,7 @@ package com.android.systemui.keyguard.domain.interactor import com.android.compose.animation.scene.ObservableTransitionState +import com.android.systemui.Flags.transitionRaceCondition import com.android.systemui.dagger.SysUISingleton import com.android.systemui.deviceentry.domain.interactor.DeviceEntryInteractor import com.android.systemui.keyguard.data.repository.KeyguardTransitionRepository @@ -65,7 +66,7 @@ constructor( combine( transitionInteractor.isFinishedIn( scene = Scenes.Gone, - stateWithoutSceneContainer = KeyguardState.GONE + stateWithoutSceneContainer = KeyguardState.GONE, ), wakeToGoneInteractor.canWakeDirectlyToGone, ) { isOnGone, canWakeDirectlyToGone -> @@ -197,11 +198,11 @@ constructor( combine( transitionInteractor.isInTransition( edge = Edge.create(to = Scenes.Gone), - edgeWithoutSceneContainer = Edge.create(to = KeyguardState.GONE) + edgeWithoutSceneContainer = Edge.create(to = KeyguardState.GONE), ), transitionInteractor.isFinishedIn( scene = Scenes.Gone, - stateWithoutSceneContainer = KeyguardState.GONE + stateWithoutSceneContainer = KeyguardState.GONE, ), surfaceBehindInteractor.isAnimatingSurface, notificationLaunchAnimationInteractor.isLaunchAnimationRunning, @@ -231,7 +232,7 @@ constructor( combine( transitionInteractor.currentKeyguardState, wakeToGoneInteractor.canWakeDirectlyToGone, - ::Pair + ::Pair, ) .sample(transitionInteractor.startedStepWithPrecedingStep, ::toTriple) .map { (currentState, canWakeDirectlyToGone, startedWithPrev) -> @@ -242,7 +243,12 @@ constructor( startedFromStep.transitionState == TransitionState.CANCELED && startedFromStep.from == KeyguardState.GONE - val transitionInfo = transitionRepository.currentTransitionInfoInternal.value + val transitionInfo = + if (transitionRaceCondition()) { + transitionRepository.currentTransitionInfo + } else { + transitionRepository.currentTransitionInfoInternal.value + } val wakingDirectlyToGone = deviceIsAsleepInState(transitionInfo.from) && transitionInfo.to == KeyguardState.GONE diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt index 5524b20aa8f8..aa44b6d46289 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/scenetransition/LockscreenSceneTransitionInteractor.kt @@ -106,7 +106,7 @@ constructor( private suspend fun handleIdle( prevTransition: ObservableTransitionState, - idle: ObservableTransitionState.Idle + idle: ObservableTransitionState.Idle, ) { if (currentTransitionId == null) return if (prevTransition !is ObservableTransitionState.Transition) return @@ -133,10 +133,10 @@ constructor( val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, - from = internalTransitionInteractor.currentTransitionInfoInternal.value.to, + from = internalTransitionInteractor.currentTransitionInfoInternal().to, to = state, animator = null, - modeOnCanceled = TransitionModeOnCanceled.REVERSE + modeOnCanceled = TransitionModeOnCanceled.REVERSE, ) currentTransitionId = internalTransitionInteractor.startTransition(newTransition) internalTransitionInteractor.updateTransition(currentTransitionId!!, 1f, FINISHED) @@ -152,8 +152,7 @@ constructor( private suspend fun handleTransition(transition: ObservableTransitionState.Transition) { if (transition.fromContent == Scenes.Lockscreen) { if (currentTransitionId != null) { - val currentToState = - internalTransitionInteractor.currentTransitionInfoInternal.value.to + val currentToState = internalTransitionInteractor.currentTransitionInfoInternal().to if (currentToState == UNDEFINED) { transitionKtfTo(transitionInteractor.startedKeyguardTransitionStep.value.from) } @@ -197,21 +196,21 @@ constructor( from = UNDEFINED, to = repository.nextLockscreenTargetState.value, animator = null, - modeOnCanceled = TransitionModeOnCanceled.RESET + modeOnCanceled = TransitionModeOnCanceled.RESET, ) repository.nextLockscreenTargetState.value = DEFAULT_STATE startTransition(newTransition) } private suspend fun startTransitionFromLockscreen() { - val currentState = internalTransitionInteractor.currentTransitionInfoInternal.value.to + val currentState = internalTransitionInteractor.currentTransitionInfoInternal().to val newTransition = TransitionInfo( ownerName = this::class.java.simpleName, from = currentState, to = UNDEFINED, animator = null, - modeOnCanceled = TransitionModeOnCanceled.RESET + modeOnCanceled = TransitionModeOnCanceled.RESET, ) startTransition(newTransition) } @@ -228,7 +227,7 @@ constructor( internalTransitionInteractor.updateTransition( currentTransitionId!!, progress.coerceIn(0f, 1f), - RUNNING + RUNNING, ) } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModel.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModel.kt index 12bcc7ecbab8..b15cacf077a4 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/viewmodel/DozingToOccludedTransitionViewModel.kt @@ -35,9 +35,7 @@ import kotlinx.coroutines.flow.Flow @SysUISingleton class DozingToOccludedTransitionViewModel @Inject -constructor( - animationFlow: KeyguardTransitionAnimationFlow, -) : DeviceEntryIconTransition { +constructor(animationFlow: KeyguardTransitionAnimationFlow) : DeviceEntryIconTransition { private val transitionAnimation = animationFlow.setup( duration = FromAodTransitionInteractor.TO_OCCLUDED_DURATION, @@ -56,11 +54,7 @@ constructor( var currentAlpha = 0f return transitionAnimation.sharedFlow( duration = 250.milliseconds, - startTime = if (lightRevealMigration()) { - 100.milliseconds // Wait for the light reveal to "hit" the LS elements. - } else { - 0.milliseconds - }, + startTime = 0.milliseconds, onStart = { if (lightRevealMigration()) { currentAlpha = viewState.alpha() @@ -69,7 +63,6 @@ constructor( } }, onStep = { MathUtils.lerp(currentAlpha, 0f, it) }, - onCancel = { 0f }, ) } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt index 70b4f79131a7..4976cc26068a 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeKeyguardTransitionRepository.kt @@ -18,6 +18,7 @@ package com.android.systemui.keyguard.data.repository import android.annotation.FloatRange +import com.android.systemui.Flags.transitionRaceCondition import com.android.systemui.dagger.SysUISingleton import com.android.systemui.keyguard.shared.model.KeyguardState import com.android.systemui.keyguard.shared.model.TransitionInfo @@ -88,6 +89,13 @@ class FakeKeyguardTransitionRepository( ) ) override var currentTransitionInfoInternal = _currentTransitionInfo.asStateFlow() + override var currentTransitionInfo = + TransitionInfo( + ownerName = "", + from = KeyguardState.OFF, + to = KeyguardState.LOCKSCREEN, + animator = null, + ) init { // Seed with a FINISHED transition in OFF, same as the real repository. @@ -261,8 +269,13 @@ class FakeKeyguardTransitionRepository( validateStep: Boolean = true, ) { if (step.transitionState == TransitionState.STARTED) { - _currentTransitionInfo.value = - TransitionInfo(from = step.from, to = step.to, animator = null, ownerName = "") + if (transitionRaceCondition()) { + currentTransitionInfo = + TransitionInfo(from = step.from, to = step.to, animator = null, ownerName = "") + } else { + _currentTransitionInfo.value = + TransitionInfo(from = step.from, to = step.to, animator = null, ownerName = "") + } } _transitions.replayCache.last().let { lastStep -> @@ -308,7 +321,11 @@ class FakeKeyguardTransitionRepository( } override suspend fun startTransition(info: TransitionInfo): UUID? { - _currentTransitionInfo.value = info + if (transitionRaceCondition()) { + currentTransitionInfo = info + } else { + _currentTransitionInfo.value = info + } if (sendTransitionStepsOnStartTransition) { sendTransitionSteps(from = info.from, to = info.to, testScope = testScope) -- GitLab From 2ed10bd0839797b1190846f31caaba295ebb32a9 Mon Sep 17 00:00:00 2001 From: Oluwarotimi Adesina Date: Thu, 24 Oct 2024 15:13:58 +0000 Subject: [PATCH 386/459] Update AppFunction Documentation Flag: android.app.appfunctions.flags.enable_app_function_manager Test: Existing CTS Bug: 375121362 Change-Id: I6c6c88215a6a4ae4c17f3cae120eb6dc2238cf57 --- .../app/appfunctions/AppFunctionManager.java | 17 +++++------ .../ExecuteAppFunctionRequest.java | 28 +++++++++++++++---- .../ExecuteAppFunctionResponse.java | 11 ++++---- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/core/java/android/app/appfunctions/AppFunctionManager.java b/core/java/android/app/appfunctions/AppFunctionManager.java index dca433696fe7..a82c6ba7479c 100644 --- a/core/java/android/app/appfunctions/AppFunctionManager.java +++ b/core/java/android/app/appfunctions/AppFunctionManager.java @@ -47,7 +47,6 @@ import java.util.function.Consumer; *

    App function is a specific piece of functionality that an app offers to the system. These * functionalities can be integrated into various system features. */ -// TODO(b/357551503): Implement get and set enabled app function APIs. @FlaggedApi(FLAG_ENABLE_APP_FUNCTION_MANAGER) @SystemService(Context.APP_FUNCTION_SERVICE) public final class AppFunctionManager { @@ -111,17 +110,19 @@ public final class AppFunctionManager { * @param request the request to execute the app function * @param executor the executor to run the callback * @param cancellationSignal the cancellation signal to cancel the execution. - * @param callback the callback to receive the function execution result. if the calling app - * does not own the app function or does not have {@code + * @param callback the callback to receive the function execution result. + *

    If the calling app does not own the app function or does not have {@code * android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED} or {@code * android.permission.EXECUTE_APP_FUNCTIONS}, the execution result will contain {@code * ExecuteAppFunctionResponse.RESULT_DENIED}. + *

    If the caller only has {@code android.permission.EXECUTE_APP_FUNCTIONS} but the + * function requires {@code android.permission.EXECUTE_APP_FUNCTIONS_TRUSTED}, the execution + * result will contain {@code ExecuteAppFunctionResponse.RESULT_DENIED} + *

    If the function requested for execution is disabled, then the execution result will + * contain {@code ExecuteAppFunctionResponse.RESULT_DISABLED} + *

    If the cancellation signal is issued, the operation is cancelled and no response is + * returned to the caller. */ - // TODO(b/357551503): Document the behavior when the cancellation signal is issued. - // TODO(b/360864791): Document that apps can opt-out from being executed by callers with - // EXECUTE_APP_FUNCTIONS and how a caller knows whether a function is opted out. - // TODO(b/357551503): Update documentation when get / set APIs are implemented that this will - // also return RESULT_DENIED if the app function is disabled. @RequiresPermission( anyOf = { Manifest.permission.EXECUTE_APP_FUNCTIONS_TRUSTED, diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionRequest.java b/core/java/android/app/appfunctions/ExecuteAppFunctionRequest.java index fe7fd8837624..4c5e8c130a73 100644 --- a/core/java/android/app/appfunctions/ExecuteAppFunctionRequest.java +++ b/core/java/android/app/appfunctions/ExecuteAppFunctionRequest.java @@ -50,12 +50,12 @@ public final class ExecuteAppFunctionRequest implements Parcelable { } }; - /** Returns the package name of the app that hosts the function. */ + /** Returns the package name of the app that hosts/owns the function. */ @NonNull private final String mTargetPackageName; /** - * Returns the unique string identifier of the app function to be executed. TODO(b/357551503): - * Document how callers can get the available function identifiers. + * The unique string identifier of the app function to be executed. This identifier is used to + * execute a specific app function. */ @NonNull private final String mFunctionIdentifier; @@ -69,8 +69,6 @@ public final class ExecuteAppFunctionRequest implements Parcelable { * *

    The document may have missing parameters. Developers are advised to implement defensive * handling measures. - * - *

    TODO(b/357551503): Document how function parameters can be obtained for function execution */ @NonNull private final GenericDocumentWrapper mParameters; @@ -91,7 +89,19 @@ public final class ExecuteAppFunctionRequest implements Parcelable { return mTargetPackageName; } - /** Returns the unique string identifier of the app function to be executed. */ + /** + * Returns the unique string identifier of the app function to be executed. + * + *

    When there is a package change or the device starts up, the metadata of available + * functions is indexed by AppSearch. AppSearch stores the indexed information as {@code + * AppFunctionStaticMetadata} document. + * + *

    The ID can be obtained by querying the {@code AppFunctionStaticMetadata} documents from + * AppSearch. + * + *

    If the {@code functionId} provided is invalid, the caller will get an invalid argument + * response. + */ @NonNull public String getFunctionIdentifier() { return mFunctionIdentifier; @@ -103,6 +113,12 @@ public final class ExecuteAppFunctionRequest implements Parcelable { * *

    The bundle may have missing parameters. Developers are advised to implement defensive * handling measures. + * + *

    Similar to {@link #getFunctionIdentifier()} the parameters required by a function can be + * obtained by querying AppSearch for the corresponding {@code AppFunctionStaticMetadata}. This + * metadata will contain enough information for the caller to resolve the required parameters + * either using information from the metadata itself or using the AppFunction SDK for function + * callers. */ @NonNull public GenericDocument getParameters() { diff --git a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java index a879b1ba6b5c..c907ef114286 100644 --- a/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java +++ b/core/java/android/app/appfunctions/ExecuteAppFunctionResponse.java @@ -79,14 +79,15 @@ public final class ExecuteAppFunctionResponse implements Parcelable { /** The caller does not have the permission to execute an app function. */ public static final int RESULT_DENIED = 1; - /** An unknown error occurred while processing the call in the AppFunctionService. */ - public static final int RESULT_APP_UNKNOWN_ERROR = 2; - /** - * An internal error occurred within AppFunctionManagerService. + * An unknown error occurred while processing the call in the AppFunctionService. * - *

    This error may be considered similar to {@link IllegalStateException} + *

    This error is thrown when the service is connected in the remote application but an + * unexpected error is thrown from the bound application. */ + public static final int RESULT_APP_UNKNOWN_ERROR = 2; + + /** An internal unexpected error coming from the system. */ public static final int RESULT_INTERNAL_ERROR = 3; /** -- GitLab From ac7a0d7748be0b7716ca42e065b5d3cee7741c8f Mon Sep 17 00:00:00 2001 From: Anton Potapov Date: Mon, 7 Oct 2024 17:36:35 +0100 Subject: [PATCH 387/459] Bind the new sliders to the state updates. This CL makes updates slider values from the state and updates the state when the slider value changes Flag: com.android.systemui.volume_redesign Test: manual on foldable. Adjust volume of different streams Bug: 369992924 Change-Id: I39da31fab1b5598722b16d051ca18d96e97d0bbd --- .../VolumeDialogSliderInteractorTest.kt | 90 +++++++++++++++++++ .../layout-land-television/volume_dialog.xml | 5 +- .../res/layout-land/volume_dialog.xml | 5 +- .../SystemUI/res/layout/volume_dialog.xml | 5 +- .../VolumeDialogCallbacksInteractor.kt | 4 +- .../VolumeDialogVisibilityInteractor.kt | 12 +-- .../VolumeDialogSliderInteractor.kt | 20 ++++- .../ui/VolumeDialogSliderViewBinder.kt | 57 +++++++++++- .../ui/VolumeDialogSlidersViewBinder.kt | 35 +++++++- .../viewmodel/VolumeDialogSliderViewModel.kt | 67 +++++++++++++- .../viewmodel/VolumeDialogSlidersViewModel.kt | 19 ++-- .../dialog/ui/binder/VolumeDialogBinder.kt | 13 +-- .../dialog/ui/utils/SuspendAnimators.kt | 33 ++++++- .../plugins/FakeVolumeDialogController.kt | 36 ++++---- .../VolumeDialogSliderInteractorKosmos.kt | 31 +++++++ .../model/VolumeDialogSliderTypeKosmos.kt | 23 +++++ 16 files changed, 399 insertions(+), 56 deletions(-) create mode 100644 packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/sliders/domain/interactor/VolumeDialogSliderInteractorTest.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/domain/interactor/VolumeDialogSliderInteractorKosmos.kt create mode 100644 packages/SystemUI/tests/utils/src/com/android/systemui/volume/dialog/sliders/domain/model/VolumeDialogSliderTypeKosmos.kt diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/sliders/domain/interactor/VolumeDialogSliderInteractorTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/sliders/domain/interactor/VolumeDialogSliderInteractorTest.kt new file mode 100644 index 000000000000..bfafdab003aa --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/volume/dialog/sliders/domain/interactor/VolumeDialogSliderInteractorTest.kt @@ -0,0 +1,90 @@ +/* + * 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.volume.dialog.sliders.domain.interactor + +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.coroutines.collectLastValue +import com.android.systemui.kosmos.testScope +import com.android.systemui.plugins.VolumeDialogController +import com.android.systemui.plugins.fakeVolumeDialogController +import com.android.systemui.testKosmos +import com.android.systemui.volume.dialog.sliders.domain.model.volumeDialogSliderType +import com.google.common.truth.Truth.assertThat +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.test.runCurrent +import kotlinx.coroutines.test.runTest +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith + +@OptIn(ExperimentalCoroutinesApi::class) +@SmallTest +@RunWith(AndroidJUnit4::class) +@TestableLooper.RunWithLooper +class VolumeDialogSliderInteractorTest : SysuiTestCase() { + + private val kosmos = testKosmos() + + private lateinit var underTest: VolumeDialogSliderInteractor + + @Before + fun setUp() { + underTest = kosmos.volumeDialogSliderInteractor + } + + @Test + fun settingStreamVolume_setsActiveStream() = + with(kosmos) { + testScope.runTest { + runCurrent() + // initialize the stream model + fakeVolumeDialogController.setStreamVolume(volumeDialogSliderType.audioStream, 0) + + val sliderModel by collectLastValue(underTest.slider) + underTest.setStreamVolume(1) + runCurrent() + + assertThat(sliderModel!!.isActive).isTrue() + } + } + + @Test + fun streamVolumeIs_minMaxAreEnforced() = + with(kosmos) { + testScope.runTest { + runCurrent() + fakeVolumeDialogController.updateState { + states.put( + volumeDialogSliderType.audioStream, + VolumeDialogController.StreamState().apply { + levelMin = 0 + level = 2 + levelMax = 1 + }, + ) + } + + val sliderModel by collectLastValue(underTest.slider) + runCurrent() + + assertThat(sliderModel!!.level).isEqualTo(1) + } + } +} diff --git a/packages/SystemUI/res/layout-land-television/volume_dialog.xml b/packages/SystemUI/res/layout-land-television/volume_dialog.xml index f77db956a493..4321fb04df52 100644 --- a/packages/SystemUI/res/layout-land-television/volume_dialog.xml +++ b/packages/SystemUI/res/layout-land-television/volume_dialog.xml @@ -36,6 +36,7 @@ android:showDividers="middle" /> - +